見出し画像

Google Homeから喋らせてみる

以前の投稿で紹介した自宅サーバーに実装しているGoogle Homeから音声を発声させる機能を紹介します。

この機能は、予定の一定時間前や、天気予報で雨になりそうなときなどに、Google Homeから自発的に発声させるために使用しています。

参考にした記事

実装の際に以下の記事を参考にしました。

Google Homeへの発声要求処理のコーディング

Google Homeからへ発声を要求するのに、castv2-clientを使用しました。

  const { Client, DefaultMediaReceiver } = require("castv2-client");

発声を要求する関数の内容は以下の通りです。ログ出力などは省きました。

async speak(text) {
  const that = this;
  const root = that.settings.ttsRoot;
  that.settings.addresses.forEach((address) => {
    const client = new Client();
    client.connect(address, () => {
      client.launch(DefaultMediaReceiver, (e, player) => {
        try {
          if (e) throw e;

          const media = {
            contentId: `${root}/tts/${encodeURIComponent(text)}`,
            contentType: "audio/mpeg",
            streamType: "BUFFERED", // or LIVE
          };
          player.on("status", (status) => {
            logger.debug(`[${address}] player '${player.session.displayName}': ${status.playerState}`);
          });
          player.load(media, { autoplay: true }, (e, status) => {
            try {
              if (e) throw e;
            } catch (e) {
              // ログ出力など
            }
          });
        } catch (e) {
          // ログ出力など
        }
      });
    });
  });
}

一部を抜粋しているので補足しますが、root (this.settings.ttsRoot) にはRaspberry Piで起動しているWebサーバーのURLが入っています。このシステムの場合 http://(自宅サーバーIP):(ポート)/tts/(喋らせたいテキスト) という形になっていますが、Google HomeがこのURLにアクセスし、返される音声データを発声します。

音声変換処理のコーディング

テキストを音声に変換には VoiceText Web API を使用しています。
使用するには登録して、APIキーを取得する必要があります。

const VoiceText = require("voicetext");

自宅サーバーのWebサーバー部分は express で実装しています。音声変換部分の処理だけ抜き出したものが以下です。

app.get("/tts/:text", (req, res) => {
  const voice = new VoiceText(that.settings.tts_apikey);
  voice
    .speaker(voice.SPEAKER.HIKARI)
    .format("mp3")
    .speak(req.params.text, function (e, buf) {
      try {
        if (e) throw e;

        res.set({
          "Content-Type": "audio/mpeg",
          "Content-Length": buf.length,
        });
        res.status(200);
        res.send(buf);
      } catch (e) {
        res.status(500);
        res.end();
      }
    });
});

補足すると、that.settings.tts_apikey には voicetext のAPIキーが入っています。
http://(IPアドレス):(ポート)/tts/(喋らせたいテキスト) にアクセスすると、VoiceText Web APIを呼び出し、返された音声データをそのまま返しているだけです。

さいごに

Google Homeで音声を喋らせるプログラムを紹介しました。
ちょっと駆け足で細かい説明ができなかったですが、また何か面白いプログラムをご紹介できれば良いな、と思います。

この記事が気に入ったらサポートをしてみませんか?