Googleのspeech recognitionのストリーミング版の試み

Googleのspeech recognitionのストリーミング版を試した。そのすごさにおどろかされた。
まず、それをやった手続きをいかに記録しておく。基本的に、
https://github.com/GoogleCloudPlatform/python-docs-samples/tree/master/speech/grpc
解説されていることをそのままやったのだが。しかし、手間はかかるし、混乱する。
以下、MACの場合を想定している。
(1)先の、スタティックな音声ファイルの認識で書いたように、Google Cloud Platformへの登録手続きは済ませておかなければならない。
(2)Google Cloud SDKをインストールする。
https://cloud.google.com/sdk/
から、自分の環境に適合したのものをインストールする。
./install.sh
で開始される。OSに合ったクイックスタートページをチェックしておく。
gcloud initをやると、色々聞かれてくるので、答える。プロジェクトの選択が大事。
gcloud infoなどのコマンドを試し確認しておく。
PATHの設定変更なども自動でするので、その後、
source ~/.bash_profile
は、やっておくこと。
(3)権限ファイルがまた必要になるので、先の音声ファイルの時にもやった、権限ファイルの位置を示す次のコマンドを先にやっておいた。ガイドでは後でやるようになっているが、この辺りは自信はない。ただ、私は先にやっておいた。しかしこれはやらなくても良い感じだ。
export GOOGLE_APPLICATION_CREDENTIALS=/path/to/service_account.json
(4)以下のコマンドで権限(authentication)の設定をする。
gcloud beta auth application-default login
このgcloudをじっこうすると、まず、gcloud Beta Commandsなどのコンポーネントがインストールされていないので、先にそれをやりますねというメッセージが出て、それを完了した時点で、あらためて上記のコマンドを自動で再起動しているようだ。
(5)途中、プラットフォームへのペジが開いて、ログインを求められるので、それを実行すると、権限ファイルが自動的に "default location"に保存されるようだ。
Credentials saved to file: [/Users/xxxxx/.config/gcloud/application_default_credentials.json]
というわけだ。
(6)PortAudioのインストール:brewがインストールされていれば
brew install portaudio
をやる。インストールされていなければ、インストールする。ただ、最後の実行段階で、audio系のエラーが出たので、結局、
pip install --global-option='build_ext' \
--global-option='-I/usr/local/include' \
--global-option='-L/usr/local/lib' \
pyaudio
をその後実行したら、エラーが出なくなった。クイックスタートのページでは、インストールの時点でエラーが出たらとなっていたが、その段階ではエラーがでなかった。
(9)virtualenvをインストールする。これがごちゃごちゃして、めどうだったが、そのウェッブサイトによれば、
$ [sudo] pip install virtualenv
でインストールできるようだ。sudoをつけて、root権限でインストールした方が良いと思う。
(10)virtualenvの実行と設定:以下のコマンドを実行する。
$ virtualenv env
$ source env/bin/activate
(11)サンプルを実行するための依存ファイルをインストールする。そのために、サイトに置かれているrequirements.txtの内容をコピーして、その名前のファイルとして、ローカルに作成しておく。そして、以下のコマンドを実行する。
$ sudo pip install -r requirements.txt
(12)pythonの実行ファイルのコピーと変更
サイトのtranscribe_streaming.pyをコピーして、ローカルのフォルダのファイルにする。コピーの際、インデントなどが崩れるとエラーになるので気をつけること。
唯一変更すべきところは、
language_code='en-US', # a BCP-47 language tag
の箇所を、
language_code='ja-JP', # a BCP-47 language tag
に変更する。変更しないと、こちらで喋ったことを全て、英語で返してくる。日本語として解釈するために必要な変更だ。
(12)ストリーミングによる認識、テキスト化の実行
$ python transcribe_streaming.py
を実行する。
パソコンのマイクに向かって、喋ると、ほとんどリアルタイムで、翻訳を返してくる!!!

Google Cloud Platform のSpeech Recgnitionで日本語音声ファイルをテキスト化

Google Cloud Platform の提供するSpeech Recgnition機能の初歩的なものがなんとか動かせたので、記録のためにここに記載しておく。
実際やってみて、googleの人工知能、すごかったという感じです。
基本的に、
https://cloud.google.com/speech/docs/rest-tutorial
にある、「REST API 音声認識チュートリアル」のPythonプログラムを動かして、手元にある日本語の音声データをテキスト化しただけなのですが、これまで色々失敗してきたのでできたときは感激でした。
まず、結果をお示ししましょう。ユニコード化されて送られてきたんですが、返された日本語テキストは次のようなものです。
「私は鷲田豊明と申します今日はお切りについて皆さんにちょっとお話したいと思うんですがロボットに大喜利をやらせると本当にかん可能でしょうか難しいんじゃないかなと思っていますでも挑戦してみますよ」
まちがっているのは、最初の方の大喜利とすべきところを「お切り」としてしまっているところ、ただの「可能」を「かん可能」としてしまっているところくらいですね。あとは、噛みながら話したのですが、ほぼ完璧に日本語テキスト化しています。
やるべきところを記載しておきます。基本的に上記のページに書いてあることなのですが、私なりの表現にすることによって、別な見方が提供されわかりやすくなるんじゃないかと思います。
基本、MAC用の話である。
(1)Google Cloud Platformに登録する。きちんと支払い情報も入れておく。60日の間に¥34,542.00分の利用権利もタダで与えられる。有料化されても、それほど高いものでもない。
(2)プロジェクトを作成する。
(3)認証情報を作成のところで「サービスアカウントキー」を選択すると、認証情報を組み込んだファイルがダウのロードされるので、それを確認する。あとで、プロジェクトIDとキーファイルが必要になる。
(4)pythonでやるので、当然pythonが入っていなければならない。他にも、Node.jsでもできるようだが試していない。pipもインストールされている必要がある。
(5)チュートリアルに書かれていないのだが、python用のgoogle-api-clientが必要なので以下のようにしてインストールしておく。
$ sudo pip install --upgrade google-api-python-client
(6)音声ファイルを用意する。rawが使われている。私は、iPhoneで録音し(MacBookでもできるのだが、iPhone7plusの方がいいような気がしたので)、それをiTunesを使ってwavファイルに変換し、最後にsoxを使ってrawファイルに変換した。rawへの変換は、
$ sox testrec.wav testrec.raw
(7)認証関係の設定をする。まず、先ほど作成したサービスアカウントキーファイルのありかを環境変数に記録する。
$ export GOOGLE_APPLICATION_CREDENTIALS=/path/to/service_account_file.json
pathの部分を自分のパス、最後の、service_account_file.jsonの部分は自分がつけたファイル名にする。
$ export GCLOUD_PROJECT=your-project-id
プロジェクトIDは、自分のコンソールで確認できる。一連の数字ではなく、名前である。
(8)チュートリアルにあるpythonプログラムを、テキストファイルでテキストファイルにする。基本的に変えなくて良いが、1箇所だけ言語設定のところを次のようにかえる。
'languageCode': 'en-US',  # a BCP-47 language tag

'languageCode': 'ja-JP',  # a BCP-47 language tag
にする。つまり、英語を日本語にするのだ。
(9)実行。
$ python tutorial.py testrec.raw
とする。すると、数十秒かかるが、次のような結果のJSONファイルが帰ってくる。
{"results": [{"alternatives": [{"confidence": 0.8346436, "transcript": "\u79c1\u306f\u9df2\u7530\u8c4a\u660e\・・・中略・・・\u6226\u3057\u3066\u307f\u307e\u3059\u3088"}]}]}
83%の正確さの結果だ。このユニコードを適当なサイトを利用して日本語に変換する。私は、
http://www.kwonline.org/u_esc_seq.php
を使わせていただいた。そして、上記の結果が得られたのだ。

ldtexeの廃止

一連の動作及び発話を記述したコマンドリストファイルをロードし、対話の中の与えられたタイミングで実行する ldtexeを廃止する。同じコマンド ldexeがあるので不要だ。両方可能にしようかと思ったが、逆に混乱するので。
ldtexeは、ロボットの対話でコマンドリストを作り上げていくモードとトピックファイル中に埋め込むモードで、ロード&実行関数を区別していたのだが、区別が不要になって、意味がなくなっていた。

iBotNaoのスマホからの制御にアプリ不要

誤解されるといけないから書いておく。iBotNaoによって、ロボットのパフォーマンスのほとんどの制御がスマホからできることになったが、スマホのアプリは一切いらない。単に、インターネットブラウザがあれば良い。

iBotNaoがほぼ完成!!スマホとロボットで全てができる!!

iBotNaoは、ロボットの内臓ウェッブサーバー上に、ibotシステムを動かして、ibotシステムがもともと持っていたロボット制御システムを全て外部のウェッブクライアントから可能にするシステムだ。
したがって、すべて、スマホで管理できる。パソコンは不要だ。iBotのc++で作成した組み込みライブラリのほとんどの機能がスマホから使えるようになった。
最後まで手がかかった、ローカルからロボットへのテキスト、サウンドファイルの転送が、htmlのcgiでできるようになったので、完成と言える出来栄えになった。
外で、ロボットのパフォーマンスを見せるときも、ノートパソコンは要らないのだ。スマホにテザリングの機能があればwifiルータもいらない。ただ、wifiは、何かとトラブルがらみなのであったほうがいい。
iBotNaoでできることの概略を書いておく。
(1)スクリプトの作成、編集、転送など。スクリプトとは、ibotコマンドを書き込める対話用のtopicスクリプト、ロボットの行動や発声を一連のコマンドとして管理できるスクリプト、また、その中で制御可能なサウンドファイル(mp3,wav)も転送管理できる。
(2)対話の制御。ibotの最大の特徴は、全て対話でロボットを制御(行動も対話も)できることだ。どのトピックファイルを使って対話を開始するか、対話の開始と停止、ロボットへ対話への強制入力なども可能である。
(3)ステータス管理。ロボットの停止、休息、覚醒、強制発話、ビップ音制御、ASR認識値制御、音声レベル制御、ロボットの全体的状態表示など。
(4)動作と発話の直接制御。前進後退などの前後左右ななめなどの動き、回転、などを画面のタッチでコントロールできる。同時に発話も、リストに沿って適宜送り出すこともできる。自動制御のコントロール。
(5)複数のロボット同士のコミュニケーション機能である、テレパシー機能の制御。
これまでは、ロボットをライブの舞台にあげるときに、ロボット自身がちゃんと動くかだけではなく、ノートパソコンが不調になったら、ibotのシステム起動ができず、どうしようもなかったのだが、これで、スマホさえ持っていれば、パソコンが壊れても大丈夫だ。不安が減少した。

NAOのnginxでC++のcgiを動かす手続き

NAOの内蔵ウェッブサーバーのnginxでC++で作成した実行ファイルをCGIとして動かす手続きが理解できたので、メモがわりに書いておく。
(1)ヴァーチャルなNAOであるopen-naoにlibfcgiの一連のツールをインストールする。(open-naoについては、aldebaranのサイトにインストールに仕方があるので省略)私は、libfcgi-master.zipをとってきて、
./configure
make
sudo make install
で、インストールしたが、他にもfastcgi++-2.1.tar.bz2なんかでもできそうだがやっていない。
(2)spawn-fcgi-1.6.4.tar.gzを取ってきて、
./configure
make
する。私は、ubuntuの32ビット版の方でやってしまったが、open-naoの方でもできると思う。インストールしなくてもよい。
srcフォルダにspawn-fcgiができているので、そのまま、open-naoに持ってきた。open-naoで作ったら当然、そのままでいい。
このspawnは、c++で作成した実行ファイルを、nginxからのリクエストに応じて、実行させるための媒体のようなものだ。
(3)open-nao上で実行ファイルを作成する。(32ビット版だからといって、ubuntuで作ると、libcのバージョン違いで失敗してしまった)
この辺りのことは、
http://chriswu.me/blog/writing-hello-world-in-fcgi-with-c-plus-plus/
に決定的に依存している。このページがなかったら、nginxでfastcgiを動かすイメージが、全く湧かなかったと思う。とても優れたページだ。
そこにサンプルがあるから、open-nao上で、nanoエディタで作成してコンパイルすると良い。なにしろ、open-naoには、開発環境が一通り揃っているし、ロボットと同じ実行環境が約束されている。なお、open-naoとPCとのファイルの転送は、psftpを使う必要がある。
(4)つぎに、naoのnginxの設定ファイルをいじる。設定ファイルは、/etc/nginxの中の、nginx.confに書かれている。(万が一のため、オリジナルのnginx.confをnginx.conf.orgなどにコピーしておく)
設定ファイルのなかに、次の行を加える。
location ~ \.cgi$ {
fastcgi_pass 127.0.0.1:8000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
この意味は、cgiという拡張子がついたファイルへのアクセスは、ローカルの8000版ポートで待機している実行ファイルを起動させることにする、というものだ。
(5)ロボット内でnginxを再起動する。
/etc/init.d/nginx restart
でよい。エラーがなければ問題ない。
(6)次に、(1)で作成したライブラリの/usr/local/lib以下にある、libfcgiで始まるファイルを全部zipなどでアーカイブして、nao本体に送り込む。そして、/usr/local/lib以下に同じように解凍する。その際、シンボリックリンクが壊れているので、もとの、open-naoの/usr/local/lib以下でのシンボリックをそのまま再現する。
(7)c++で作成したcgiの実行ファイル、例えば、foobar.cgiを
spawn-fcgi -p 8000 -n foobar.cgi
と立ち上げる。
(8)ロボットの外から、アクセスすれば、foobar.cgiが実行される。たとえば、上記のサイトにあるように、curlを使えば、

> curl -d "Chris" http://localhost/foobar
<html>
  <head>
    <title>Hello, world!</title>
  </head>
  <body>
    <h1>Hello Chris from /foobar !</h1>
  </body>
</html>

という感じで出力される。

ロボット植え込みiBotは、ほぼできた

途中、ロボットのウェッブサーバーをapache2にしようかという迷いがあったが、結局、originalのnginxを使った。これからは、本番は、スマホだけで全て処理できる。
こちらに何か支障があれば、今まで通りノートブックのサーバー上のiBotでもコントロールできるので、セキュリティが高まった。
ロボット植え込みiBotの弱点は、パソコンからのファイル転送をftpなどに頼らなければならないところだ。これも、nginx用のfcgiを使えるようになればなんとかなるので、しばらくそれに取り組みたい。
それが終わったら、 クラウドの人工知能機能を利用する段取りに入りたい。

apache2のcgiから、naoqiのロボット制御モジュールを呼び出す

ALTextToSpeechを呼び出して「こんにちわ、サリーです」とロボットに言わせる単純な、cgiをC++で作った。NAO(名前がサリー)に組み込んだ、apache2のcgiとして、外部のpcからアクセスすると、ちゃんとロボットは喋った。
qimessaging.jsの代わりに、qimessaging.cgiをC++で作れることはほぼ間違いがない。ALbrokerを使えば、汎用性の高いcgiにすることができるはずだ。
急いで作ろう。