- Amazonは海外で音声インターフェイスデバイス「Amazon Echo」を発売していますが、その基本システムが音声ガイダンスシステム「Alexa」です。iPhoneのSiriや、MicroSoftのコルタナに相当します。
- Alexaは音声だけで時間や天気やニュースを聞いたり、分からない単語や今日の予定を調べたり、タイマーやアラームをセットしたり、スマート家電を操作したりなど便利なのですが、残念ながらまだ日本語に対応していません。そこでここでは、日本語で話しかけると英語でAlexaに指示をだしてくれるロボットを作ります。
- 映画「ギャラクシー・クエスト」でシガニー・ウィーバーが演じていた「船長の指示をコンピュータに問い合わせる係」みたいなロボットです。
スマート電灯の操作
Raspberry PiでAlexaを動かす。
- 日本ではまだAmazon Echoは発売されていませんし、海外で販売しているEchoは日本の技適(技術基準適合認定)を通過していないので、輸入することもできません。しかしAmazonはRaspberry PiでEchoを作る(つまりAlexaを動かす)方法をgithubで説明してくれています。説明は英語ですが、がんばって指示通りにやってみてください。
- 手順を日本語で解説してくださっているかたがたもいらっしゃいますが、Amazon側で何度かアップデートしているので記述が古いかもしれません。2016年夏以降の記事を読んだほうがよいと思います。例えばここ。
- 私だけかもしれませんが、最後の手順「ターミナル3を開いてwake word engineを実行」でkitt_aiを起動しようとしたとき、以下のようなエラーが表示されてしまいました。
1 2 3 4 5 6 7 8 9 10 |
ALSA lib pcm_dmix.c:1022:(snd_pcm_dmix_open) unable to open slave Expression 'paInvalidSampleRate' failed in 'src/hostapi/alsa/pa_linux_alsa.c', line: 2043 Expression 'PaAlsaStreamComponent_InitialConfigure( &self->capture, inParams, self->primeBuffers, hwParamsCapture, &realSr )' failed in 'src/hostapi/alsa/pa_linux_alsa.c', line: 2714 Expression 'PaAlsaStream_Configure( stream, inputParameters, outputParameters, sampleRate, framesPerBuffer, &inputLatency, &outputLatency, &hostBufferSizeMode )' failed in 'src/hostapi/alsa/pa_linux_alsa.c', line: 2838 ERROR:Failed to open PortAudio stream.Invalid sample rate ERROR:KittAiSnowboyWakeWordEngine: Initialization error:Failed to open PortAudio stream. ERROR:WakeWordAgent: exception in constructor: Failed to open PortAudio stream. ERROR:main: Exception happened: Failed to open PortAudio stream. INFO:Shutting down Wake Word Agent |
- これと同じ症状がでてしまった場合は、ラズパイのミニジャックに接続されているスピーカーと、USB端子に接続されているマイクの、カード番号とデバイス番号を調べたうえで、ホームディレクトリにある隠しファイル「.asoundrc」を書き換える必要があります。具体的には以下の手順になります。
1.ミニジャックに接続されているスピーカーのカード番号とデバイス番号を調べる。
- コマンドラインから「aplay -l」と打ち込むと、例えば下記のように表示されます。(「-l」はエルの小文字)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
**** List of PLAYBACK Hardware Devices **** card 1: ALSA [bcm2835 ALSA], device 0: bcm2835 ALSA [bcm2835 ALSA] Subdevices: 8/8 Subdevice #0: subdevice #0 Subdevice #1: subdevice #1 Subdevice #2: subdevice #2 Subdevice #3: subdevice #3 Subdevice #4: subdevice #4 Subdevice #5: subdevice #5 Subdevice #6: subdevice #6 Subdevice #7: subdevice #7 card 1: ALSA [bcm2835 ALSA], device 1: bcm2835 ALSA [bcm2835 IEC958/HDMI] Subdevices: 1/1 Subdevice #0: subdevice #0 |
- 環境によって違う結果が表示されますが、上記の例ですとミニジャックに接続されたスピーカーのカード番号は1、デバイス番号は0です。デバイス番号1にも何やら接続されているように見えますが、よく見ると「HDMI」という記述があるので、これはHDMI端子からの音声出力であることがわかります。ちなみに「bcm2835」という記述がいっぱいありますが、これはラズパイの心臓部ユニットの名前です。
2.USB端子に接続されたマイクのカード番号とデバイス番号を調べる。
- コマンドラインから「arecord -l」と打ち込むと、例えば下記のように表示されます。(「-l」はエルの小文字)
1 2 3 4 5 |
**** List of CAPTURE Hardware Devices **** card 0: Device [USB PnP Audio Device], device 0: USB Audio [USB Audio] Subdevices: 1/1 Subdevice #0: subdevice #0 |
- 環境によって違う結果が表示されますが、上記の例ですとUSB端子に接続されたマイクのカード番号は0、デバイス番号は0です。
3./home/pi にある隠しファイル「.asoundrc」を編集する。
- まずはエディターで.asoundrcを開きましょう。
1 2 3 |
$ cd $ sudo nano .asoundrc |
- 初期状態では例えば以下のような感じかもしれません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
pcm.!default { type asym playback.pcm { type plug slave.pcm "hw:0,0" } capture.pcm { type plug slave.pcm "hw:1,0" } } pcm.!default { type hw card 1 } ctl.!default { type hw card 1 } |
- 上記の例ですとplaybackのhwが0.0、captureのhwが1.0になってますから、つまり実情と合っていません。そこで以下のように書き換えます。
1 2 3 4 5 6 7 8 9 10 11 12 |
pcm.!default { type asym playback.pcm { type plug slave.pcm "hw:1,0" } capture.pcm { type plug slave.pcm "hw:0,0" } } |
- 私の場合はこれでkitt_aiを起動することができました。他に解決方法がありましたら、教えていただけると助かります。
筐体を作る
- ラズパイとスピーカーとマイクが収まるような手頃なケースを見つけてください。持ち運びが楽になります。私の場合は100円ショップで買った鉛筆立てを2個使いました。
- 残念ながらAlexaは日本でのサービスが始まっていないので、Prime Musicで音楽を楽しむことはできません。試しにAmazon.comのPrime会員になってみましたが駄目でした。
日本語の音声コマンドを聞いたらAlexaに英語で指示を出すロボットを作る
- プログラムは基本的に「Juliusで音声認識してみる」のサンプルプログラム2と同じです。
- csvファイル(bezeDialog.csv)で呼びかけに対する返答を記述するわけですが、上記のサンプルでは日本語で書かれている返答を、Alexaが理解できる英語に書き換えて、英語で音声合成するだけです。
- 例えば以下のようなcsvファイルを作ってみました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
点灯,Turn on the living light! 消灯,Turn off the living light! 時間,What time is it in Tokyo? 天気,What's the weather in Tokyo? おはよう,Good Morning. こんにちは,Good Afternoon. こんばんは,Good Night. 感謝,Thank You! 元気,How are you? タイマー,Set the timer for 3 minutes 停止,Stop the timer 不一致,well |
- ラズパイ用の英語の音声合成プログラムは色々あるようですが、今回は「flite」を使ってみました。あまり音質は良くないのですが、複数の声種を切り替えることができます。
- まずfliteをインストールします。
1 2 |
sudo apt-get install flite |
- コマンドラインで下記のように打ち込むことで簡単に実行できます。セリフを文字列で指定する場合は「-t」オプションを使います。
1 2 |
flite -t ”Hello World!” |
- fliteは複数の声種を使うことができます。使用可能な声種は「-lv」オプションで確かめることができます。
- 私が試したところ、Alexaにとっては比較的「kal16」が聞き取りやすかったようです。
- パイソンプログラムの中からは、以下のように実行します。
1 2 |
subprocess.call('flite -voice "kal16" -t "Alexa"', shell=True) |
時間
天気
タイマー
元気?
おはよう
用語解説
Alexa Voice Service(AVS)
- Alexaの音声認識エンジンです。デバイス上で録音した音声をHTTPベースでやりとりします。
npm
- node.jsのpackageを管理すためのパッケージマネージャ。Node JSで使用する拡張モジュールをインストールする際に使用します。
Maven
- Apache Software Foundationが開発した、Javaベースのオープンソース製プロジェクト管理ツール。ビルドツールとしての側面もあります。
snowboy
- KITT.AIが提供しているWake Word(Hot Word)ライブラリです。呼びかけると起動するプログラムを作ることができます。
- Snowboy Hotword DetectionをRaspberry Piで動かす