親子IoTワークショップ

マイコンとクラウドを使ってIoTとプログラミングを学ぼう

[ トップ | 開催予定・概要 | 2024-12開催 | お知らせ | Facebook ]

TTS(Text-To-Speech)を使って発話させる:Google TTS

ここでは、ラズパイにスピーカーを使って発話させます(喋らせます)。具体的には、文字(テキスト)を与えてその音声を作ってくれる(音声合成してくれる)サービスを使い、その音声をスピーカーで流します。そういうサービスを総称して「Text-To-Speech(TTS)」と呼びます。

まずは、「Bluetoothスピーカーを使う」を参考に、スピーカーをラズパイと接続して、スピーカーが使える状態になっていることを確認してください。

Google TTSを使う

ラズパイで使えるTTSサービス、TTSアプリにはいろいろあります。ここでは、簡単に使えて、話し言葉がまあまあ自然に聞こえるGoogle TTSを使うことにします。

まずはTerminalを開いて、以下のコマンドを(コピー・アンド・ペーストして)実行してください(VLCのコマンドについては「Bluetoothスピーカーを使う」を参照)。

vlc -I dummy "http://translate.google.com/translate_tts?ie=UTF-8&client=tw-ob&tl=en&q=hello" --play-and-exit

「Hello」という音声がスピーカーから流れます。発話させたいテキストは「q=hello」のように、「q=」の後に指定します。複数単語からなるフレーズや文章を流すには、単語と単語の間に「+」を挿入します(スペースではない)。以下のコマンドを実行すると、「Hi guys」という音声が流れます。

vlc -I dummy "http://translate.google.com/translate_tts?ie=UTF-8&client=tw-ob&tl=en&q=hi+guys" --play-and-exit

同様に、より長い文章を音声で流すことも可能です。

vlc -I dummy "http://translate.google.com/translate_tts?ie=UTF-8&client=tw-ob&tl=en&q=Humidity+is+low.+You+may+wanna+turn+on+a+humidifier." --play-and-exit

Google TTSは、日本語の音声合成もできます。以下のように、「q=」の後に日本語のテキストを指定し、これまで「tl=en」となっていた部分を「tl=ja」とします。

vlc -I dummy "http://translate.google.com/translate_tts?ie=UTF-8&client=tw-ob&tl=ja&q=こんにちは" --play-and-exit

このコマンドで、「こんにちは」という音声が流れます。漢字を含んだ文章を指定することも可能です。

vlc -I dummy "http://translate.google.com/translate_tts?ie=UTF-8&client=tw-ob&tl=ja&q=湿度が低くなっています。加湿器を使って下さい&tl=ja" --play-and-exit

Google TTSを使う現時点での制限は、発話させるテキストが英語で100文字まで、日本語で50文字までになっていることです。それ以上長いテキストを使うには、複数個に分割して、VLCコマンドを複数回実行する必要があります。

日本語を含むコマンドをTerminalで実行しようとするときに、コマンドのコピー・アンド・ペーストができない時があります。その場合にはここを参照してください。

プログラムを使って発話させる

上記のようなコマンドをPythonプログラムで実行するサンプルがgoogle-tts.pyです。上記のコマンドをsubprocess.run()に渡すだけです。subprocess.run()は、IoTワークショップ2日目にも使いました。プログラムを見比べてみてください。

ワークショップで作った湿温度センシングのプログラム(temp-humidity-loop.py)を改良して、TTSを使うようにしたのがtemp-humidity-loop-tts.pyです。湿度が40%未満の場合に、加湿器を使うようTTSを使って注意喚起します。

同じ要領で、モーションセンサーで人の動きを検知したら発話させる(あいさつさせる)、カメラで写真を撮る前に発話させる(例えば「はい、チーズ」と言わせる)など、さまざまな応用があり得ます。

なお、日本語を含むコマンドを実行しようとするときに、以下のようなエラーがでる場合があります。このエラーを回避する方法についてはここを参照してください。

UnicodeEncodeError: "latin-1' codec can't encode characters in position ....

自習プロジェクトの目次に戻る