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で音声を喋らせるプログラムを紹介しました。
ちょっと駆け足で細かい説明ができなかったですが、また何か面白いプログラムをご紹介できれば良いな、と思います。
この記事が気に入ったらサポートをしてみませんか?