ラピロにしゃべってもらう(2016年版:ラピロの音声合成)
ラピロが動きと表情を取り戻してくれたので、最後に声を取り戻してもらおうと思います。
まずはUSBオーディオデバイスを認識させます。最近のRaspbianでのUSBオーディオデバイスの認識は以前にやっているので手順は同じですが、今回は前とは異なるUSBオーディオデバイスを使っています。
ラピロの頭の中に入れ込もうと思ったら、こっちの方が少し小型で取り回しが良いので。ちなみに、USBオーディオデバイスをラピロの頭の中に入れ込むにはUSBの引き出し線を自作する必要がありますが、それについてはこちらをご参照ください。
こんな感じになります。電源周りの配線については別途解説がいる気がするので、それは最後に補足します。
USBオーディオデバイスを接続したら、認識されているどうかをチェックします。
$ cat /proc/asound/modules 0 snd_bcm2835 1 snd_usb_audio
USBオーディオが認識されたら、”/usr/share/alsa/alsa.conf”ファイルを以下のように編集します。
$ sudo vim /usr/share/alsa/alsa.conf ... defaults.ctl.card 1 defaults.pcm.card 1 ... $ sudo reboot
それぞれ値が0になっているのを1に変更します。これで再起動後に”$ aplay xxx.wav”で適当にファイルを再生すると、USBオーディオ〜アンプ経由でスピーカーから音声が再生されるハズです。
ちなみにアンプには上記の組み立て式ベビーアンプを使っています。多分探せばもっと高品質だったり小型だったりするものもあると思います。スピーカーは電子部品屋さんで適当に買ってきたものです。この辺りの接続についてはこちらをご参照ください。
さて、ラピロの口(位置的には耳ですが)はできたので、あとはどうやって喋ってもらうかです。
これについては、HOYAの提供してくれているVoiceText Web APIを利用させてもらいます。利用登録をすればAPIキーが発行されて、簡単な音声合成であれば無料で利用できます。Web APIなのでHTTPリクエストを発行できれば利用できるのですが、やっぱりライブラリを使う方が何かと便利です。
ということで、以下の手順でPython用ライブラリをインストールします。ちなみに、自分が初めてVoiceText Web APIを使った時はPython用がなくて、仕方なくNode.js用を使っていました。
$ sudo apt-get install python-pyaudio $ sudo pip install python-voicetext
ライブラリのインストールが済んだら、早速サンプルソースを作成します。
# -*- coding: utf-8 -*- from voicetext import VoiceText vt = VoiceText('API Key') vt.speaker('haruka').emotion('happiness',3).speak('おはようございます。')
たったこれだけ。素敵。なお、speakerとかemotionで設定できる値については、こちらの公式マニュアルを参照してください。
ではでは、早速実行してみましょう。
$ python voicetext_sample.py
かなり自然な音声に聞こえます。素晴らしい。
ちなみにこのライブラリでは、音声合成の結果を書き出すメソッド(to_wave)を用意してくれていますが、speakだけさせる時も、内部的には音声合成結果のファイルを出力してからそれを再生するという動きになっています。で、そのファイルは”/tmp”以下に、”voicetext_xxxxxxxx.wav”(xxxxの部分は合成する内容によって変わるハッシュ値)という名前で一時的に保存されています。なので、再利用したい音声があったら、一度speakさせた後にここに生成されているファイルを移動させるかコピーする方が簡単です。
さて、これで自分のラピロの基本要素(動き・表情・音声発話)を全てプログラムで制御できるようになりました。最後に、電源周りの配線についての補足です。
ラピロの頭の中の真ん中あたりに、ブレッドボードの切れ端のような棒が横断しています。実はこれ、外部から引っ張ってきている電源です。
こんな感じで、ラピロの体内(?)を通る形で、外のUSBハブから5V・500mAを取り出せるようにしています。ここから、ラピロの頭の中のUSBオーディオ、アンプ、LEDマトリックス×2個の電力を賄っています。Raspberry Pi本体からのUSB口から直接電力供給してもらっているのは、無線LAN子機のみです。
これは、Raspberry Pi本体からの供給電力をできるだけ小さくして安定動作させるための、ちょっとした小細工です。昔はこれにDCファンまで回していたので、本体からだけの電力供給だと確実にオーバーでしたが、上記のような周辺機器ぐらいなら、Raspberry Pi本体からの電力供給でもギリギリ賄えるかもしれません。何より、このやり方だとラピロはあまり長距離は移動できません。自分は割り切ってしまっていますが。
このあたりの改造に興味のある方は、こちらをご参照ください。
ディスカッション
コメント一覧
まだ、コメントがありません