docomo API を使って RaspberryPi で音声認識してみたい。興味のきっかけはこのあたり。
手順はここのとおりに進める。
使う RaspberryPiはこれ。初代だからスペック低いけど、実験には充分だろう。
ーーー
$ lsusb
$ cat /proc/asound/modules
snd_usb_audio がマイクのことらしい。
$ vim /etc/modprobe.d/alsa-base.conf
/etc/modprobe.d/alsa-base.conf の記述内容
再起動
優先順位確認(というか1つしかないから優先も何もないが)
マイクの調整
録音テスト
録音までは完璧だ。
ーーー
今度は出力(音を出す)を試す。
ダメ。aplay -l にリストが出力されない。sudo して実行してみても、上みたいな変な文字化けになる。再起動してみる。
ダメ。再起動も変な文字化けになった。たぶん、一時的に何かおかしい。電源引っこ抜いて再起動する。
ーーー
再起動後。音声出力を無理やりやってみる。
$ aplay -Dhw:1,0 test.wav
赤文字のところがデバイスらしいけど、番号わからないから適当に。
$ aplay -Dhw:1,1 test.wav
ダメやね。音を出すのは諦めて次に行く。ダメなものは切り捨てて、どんどん試す。小さな成功を重ねる(Linuxでは重要なことと思ってる)。
ーーー
python で API キーを叩けるかテストする。まずはpythonのバージョンを見る。import requests するから、バージョンは2.7系じゃだめ。3でなきゃいけない。
$ python
あれ?ダメじゃん。前回記事で、pyenvをインストールして、バージョン3.5にしたはずなのに?
おかしい。~/.pyenv がカラのはずはないのだ。完全に何かおかしいな。もう一度強制再起動。
ーーー
再起動後。
$ cd ~/.pyenv
$ ls
やはりファイルはある。さっきカラだったのは、一時的なカーネルパニックか何かだろう。RaspberryPi1(電力弱い)やつにマイクなんかつけるから、一時的に電力不足だったのかも。
ーーー
pyenv の設定が消えているので、前回記事同様、profileに設定を入れる。参考は以下。
Raspberry PiでのPython 3.5環境構築 | MUDAなことをしよう。
サイトのとおり profile を書く。
記載した直後はpython3.5になるけど、再起動するとまた2.7に戻っちゃう。ほんとpythonめんどくさい。
ーーー
設定を ~/.bashrc にかけば、再起動しても設定が消えないはず。
再起動する。
$ sudo reboot
ーーー
再起動後。
python起動。3.5.1になってた。よかった。
ーーー
引き続き、import requestsして(冒頭サイトのとおり)雑談APIを試す。
簡単じゃないよ。「APIKEYを使って」ってあるけど、具体的にどこを書き換えればいいのか分かんない。サイト記載者は分かるのかもしれんけど、こっちゃ手探りだ。まずはコピペしてみるか。
>>> import requests
>>> import json
>>> url = "https://api.apigw.smt.docomo.ne.jp/dialogue/v1/dialogue?APIKEY={}".format(APIKEY)
エラーになった。青文字の部分を、docomoのサイトでゲットしたAPI KEYの文字列にしてみる。
ダメか。こうか。
ダメだ。
ーーー
何度か試してやっとうまくいった。
>>> url = "https://api.apigw.smt.docomo.ne.jp/dialogue/v1/dialogue?APIKEY={}".format("123b1234599998888a77777859777771354e626a4446636756694177777b6e744446667778888999999a31")
コツは 2つ。
① format の中身はダブルクオート""で囲むこと。
② 赤字の部分は自分がdocomoのサイトで取得したAPIキーを書く(赤字はダミー)。
ーーー
payload を入れてリクエストを投げてみる。こうなるはず。
ならなかった。エラーが返ってくる。なんで…
>>> print r
>>> print (r)
レスポンスには 200 が返ってきている。OKってことだから、リクエスト文字列(API KEYの文字列)は間違ってないはず…
ーーー
やっとうまくいった。この記述が嘘だった。
正しくは、printのあとをカッコ()で囲む。
>>> print (r.json()['utt'])
たしか、python はバージョン 3 になってから、print文が変わったと聞いた。上の嘘の記述を書いた人は、バージョン2.7に慣れた人なのかもしれない。いずれにしても、pythonに2.7と3が混在しているせいで、こういう手間が出るのはほんと困る。
ーーー
ここまでで、以下ができるようになった。
・話しかけたい内容(payload)を、docomo雑談APIに投げる。
・APIからの回答を print する。
話しかけまくって雑談してみる。
よし。雑談APIまではうまくいった。
ーーー
「なんでやねん」という音声が必要ってことか。録音する。
$ arecord -r 16000 -f S16_LE test.wav
録音が開始するので、マイクに向かって「なんでやねん」を発音してから、Ctrl + Cで録音を止める。
APIに投げて結果を見る。
おかしい。何も入ってこない。録音が悪かったのか?(発音が悪い?関西弁の抑揚が必要なのか?)。レスポンス結果を見てみる。
>>> print (r)
200だ。結果はOKで来てるみたい。よくわからないから、pyaudioのインストールに進む。
ーーー
このサイトを見ろとある。
raspberryPi と pyaudioで録音、音声波形処理 | 半端工作
pyaudioのインストール。
alsa-base.conf の書き換え。
1行目に #!/usr/bin/python を追記。
37行目のファイル名を test.wav に変更。
pyaudio さっきインストールしたじゃん。pyenvでインストールしなきゃいけないのか?
うまくいかないから録音(puaudio)は諦める。あとで試す。
ーーー
Aques Talk Pi をいれて、Piに喋らせる。
規約を下までスクロールしないと、「同意してDownload」が有効にならない。
iMacでダウンロードしたのを、scpでPiに送る。
Piにて解凍。
出力デバイス(イヤホン)を見つけられなくてエラーになってるぽいので再起動して見る。
ーーー
再起動後。
ダメだ。出力デバイスをApple製のイヤホンから、こないだ買ったスピーカー(イヤホンジャック接続)に変えてみる。
aplay -l を認識させないとはじまらない。