min117の日記

初期desireもち。趣味Mac,メインFedora,仕事xp。

RaspberryPi にマイクを接続 → docomo API を使った音声認識

docomo API を使って RaspberryPi で音声認識してみたい。興味のきっかけはこのあたり。

qiita.com

手順はここのとおりに進める。

qiita.com

使う RaspberryPiはこれ。初代だからスペック低いけど、実験には充分だろう。

f:id:min117:20161205004954p:plain

ーーー

$ lsusb

f:id:min117:20161204213934p:plain

$ cat /proc/asound/modules

f:id:min117:20161204213951p:plain

snd_usb_audio がマイクのことらしい。

f:id:min117:20161204213954p:plain

$ vim /etc/modprobe.d/alsa-base.conf

f:id:min117:20161204213957p:plain

/etc/modprobe.d/alsa-base.conf の記述内容

f:id:min117:20161204213959p:plain

再起動

f:id:min117:20161204214000p:plain

優先順位確認(というか1つしかないから優先も何もないが)

f:id:min117:20161204215655p:plain

マイクの調整

f:id:min117:20161204215658p:plain

録音テスト

f:id:min117:20161204215657p:plain

録音までは完璧だ。

ーーー

今度は出力(音を出す)を試す。

f:id:min117:20161204221113p:plain

ダメ。aplay -l にリストが出力されない。sudo して実行してみても、上みたいな変な文字化けになる。再起動してみる。

f:id:min117:20161204221118p:plain

ダメ。再起動も変な文字化けになった。たぶん、一時的に何かおかしい。電源引っこ抜いて再起動する。

ーーー

再起動後。音声出力を無理やりやってみる。

$ aplay -Dhw:1,0 test.wav

f:id:min117:20161204221119p:plain

赤文字のところがデバイスらしいけど、番号わからないから適当に。

aplay -Dhw:1,1 test.wav

f:id:min117:20161204221120p:plain

 ダメやね。音を出すのは諦めて次に行く。ダメなものは切り捨てて、どんどん試す。小さな成功を重ねる(Linuxでは重要なことと思ってる)。

ーーー

pythonAPI キーを叩けるかテストする。まずはpythonのバージョンを見る。import requests するから、バージョンは2.7系じゃだめ。3でなきゃいけない。

$ python

f:id:min117:20161204221122p:plain

あれ?ダメじゃん。前回記事で、pyenvをインストールして、バージョン3.5にしたはずなのに?

f:id:min117:20161204223847p:plain

f:id:min117:20161204223902p:plain

おかしい。~/.pyenv がカラのはずはないのだ。完全に何かおかしいな。もう一度強制再起動。

ーーー

再起動後。

$ cd ~/.pyenv

$ ls

f:id:min117:20161204224821p:plain

やはりファイルはある。さっきカラだったのは、一時的なカーネルパニックか何かだろう。RaspberryPi1(電力弱い)やつにマイクなんかつけるから、一時的に電力不足だったのかも。

ーーー

pyenv の設定が消えているので、前回記事同様、profileに設定を入れる。参考は以下。

Raspberry PiでのPython 3.5環境構築 | MUDAなことをしよう。

サイトのとおり profile を書く。

f:id:min117:20161204223921p:plain

記載した直後はpython3.5になるけど、再起動するとまた2.7に戻っちゃう。ほんとpythonめんどくさい。

ーーー

設定を ~/.bashrc にかけば、再起動しても設定が消えないはず。

f:id:min117:20161204230434p:plainf:id:min117:20161204230429p:plain

再起動する。

$ sudo reboot

ーーー

再起動後。

python起動。3.5.1になってた。よかった。

f:id:min117:20161204231401p:plain

ーーー

引き続き、import requestsして(冒頭サイトのとおり)雑談APIを試す。

f:id:min117:20161204230900p:plain

簡単じゃないよ。「APIKEYを使って」ってあるけど、具体的にどこを書き換えればいいのか分かんない。サイト記載者は分かるのかもしれんけど、こっちゃ手探りだ。まずはコピペしてみるか。

>>> import requests

>>> import json

>>> url = "https://api.apigw.smt.docomo.ne.jp/dialogue/v1/dialogue?APIKEY={}".format(APIKEY)

f:id:min117:20161204223950p:plain

エラーになった。青文字の部分を、docomoのサイトでゲットしたAPI KEYの文字列にしてみる。

f:id:min117:20161204224011p:plain

ダメか。こうか。

f:id:min117:20161204232205p:plain

ダメだ。

ーーー

何度か試してやっとうまくいった。

f:id:min117:20161205001106p:plain

>>>  url = "https://api.apigw.smt.docomo.ne.jp/dialogue/v1/dialogue?APIKEY={}".format("123b1234599998888a77777859777771354e626a4446636756694177777b6e744446667778888999999a31")

コツは 2つ。

① format の中身はダブルクオート""で囲むこと。

② 赤字の部分は自分がdocomoのサイトで取得したAPIキーを書く(赤字はダミー)。

ーーー

payload を入れてリクエストを投げてみる。こうなるはず。

f:id:min117:20161205001351p:plain

ならなかった。エラーが返ってくる。なんで…

f:id:min117:20161205001412p:plain

>>> print r

f:id:min117:20161205002233p:plain

>>> print (r)

f:id:min117:20161205002327p:plain

レスポンスには 200 が返ってきている。OKってことだから、リクエスト文字列(API KEYの文字列)は間違ってないはず…

ーーー

やっとうまくいった。この記述が嘘だった。

f:id:min117:20161205002625p:plain

正しくは、printのあとをカッコ()で囲む

>>> print (r.json()['utt'])

f:id:min117:20161205002706p:plain

たしか、python はバージョン 3 になってから、print文が変わったと聞いた。上の嘘の記述を書いた人は、バージョン2.7に慣れた人なのかもしれない。いずれにしても、pythonに2.7と3が混在しているせいで、こういう手間が出るのはほんと困る。

ーーー

ここまでで、以下ができるようになった。

話しかけたい内容(payload)を、docomo雑談APIに投げる。

APIからの回答を print する。

話しかけまくって雑談してみる。

f:id:min117:20161205003237p:plain

よし。雑談APIまではうまくいった。

ーーー

次は音声認識APIを試す。

f:id:min117:20161205003501p:plain

「なんでやねん」という音声が必要ってことか。録音する。

arecord -r 16000 -f S16_LE test.wav

録音が開始するので、マイクに向かって「なんでやねん」を発音してから、Ctrl + Cで録音を止める。

f:id:min117:20161205003750p:plain

APIに投げて結果を見る。

f:id:min117:20161205004300p:plain

おかしい。何も入ってこない。録音が悪かったのか?(発音が悪い?関西弁の抑揚が必要なのか?)。レスポンス結果を見てみる。

>>> print (r)

f:id:min117:20161205004527p:plain

200だ。結果はOKで来てるみたい。よくわからないから、pyaudioのインストールに進む。

ーーー

このサイトを見ろとある。

raspberryPi と pyaudioで録音、音声波形処理 | 半端工作

pyaudioのインストール。

f:id:min117:20161205010952p:plain

alsa-base.conf の書き換え。

f:id:min117:20161205011020p:plain

f:id:min117:20161205011023p:plain

f:id:min117:20161205011712p:plain

f:id:min117:20161205011024p:plain

1行目に #!/usr/bin/python を追記。

37行目のファイル名を test.wav に変更。

f:id:min117:20161205011924p:plain

f:id:min117:20161205011950p:plain

pyaudio さっきインストールしたじゃん。pyenvでインストールしなきゃいけないのか?

f:id:min117:20161205012325p:plain

f:id:min117:20161205012327p:plain

うまくいかないから録音(puaudio)は諦める。あとで試す。

ーーー

Aques Talk Pi をいれて、Piに喋らせる。

f:id:min117:20161205013115p:plain

規約を下までスクロールしないと、「同意してDownload」が有効にならない。

f:id:min117:20161205013123p:plain

iMacでダウンロードしたのを、scpでPiに送る。

f:id:min117:20161205013126p:plain

Piにて解凍。

f:id:min117:20161205013128p:plain

f:id:min117:20161205013132p:plain

f:id:min117:20161205013331p:plain

f:id:min117:20161205013332p:plain

f:id:min117:20161205013336p:plain

出力デバイス(イヤホン)を見つけられなくてエラーになってるぽいので再起動して見る。

ーーー

再起動後。

f:id:min117:20161205013645p:plain

ダメだ。出力デバイスをApple製のイヤホンから、こないだ買ったスピーカー(イヤホンジャック接続)に変えてみる。

f:id:min117:20161205015234p:plain

f:id:min117:20161205015048p:plain

aplay -l を認識させないとはじまらない。