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 ....