言葉が通じないときの人工知能

ほぼ、雑談に近いが、Google Cloud APIで、ストリーミングとして言語解析する時、APIに今から喋ることは英語だと伝えて(設定して)、日本語を話した。すると、APIは、必死でその日本語の音声を英語として解釈、解析しようとする。当然、英語にはできない。それでも、なんとかその発音に近い英語の文章を返してくる。まさにこれだ、これが実に人工知能なのだ。とても面白い。人間が、理解できない外国語に出会った時にやっていることを再現しているようだ。

エコーロボット(echo robot)の考察

人間的知能の最もプリミティブな形態は、音を言葉に変えることだと思う。たとえば、見知らぬ外国語は言葉ではなく単なる音でしかない。しかし、それが言葉に変わった時、すべての人間的知能の基礎ができる。言葉は、まさにロゴスなのだ。
この間、Googoleのcloud apiのストリーミングの音声解析をやってきたが、結局それは、知能なのだ。非常に単純で、簡単なことをやっているように思われるかもしれないが、そこにこそ人工知能の基礎がある。音を連続的に言葉に変えること、それは素晴らしいことだと思う。確かに、その言葉を意味化することはできていない。しかし、決定的に重要な一歩だと思う。
そこで、エコーロボットというのを考えてみる。いや、実際に作ってみようと思う。人が話しかけた言葉を、そのまま鸚鵡返しに、自分で繰り返すのだ。音声を単にロボットの発音に変換するのではない。一旦、「言葉」してから、ロボットの音声としてそれを発するのだ。赤ちゃんが、お母さんの言葉を真似しながら、言葉を覚えていくことに似ている。マネができれば、その意味を少し理解して返せば、ごく簡単な人間的応答ができてしまうはずだ。お笑いで言えば、いつかそれがボケにつながる。
エコーロボットは、人工知能型ロボットの最も初歩的なもので、プログラミングで言えば、"Hello World" に対応するものだ。
そのための技術としては、まず、ロボットの音声データをストリーミングで受け取る必要がある。これは、ALAudioDeviceでできることがわかった。それを、GoogleのCloud APIに送って、これまたストリーミングで言葉化する。返ってきた言葉を、ロボットに送り込んでALTextSpeechで発生させる。
プログラミングのツボはだいたいわかったので、数日中にはできると思う。
 
 

ロボットのマイクを利用して音声ストリーミング認識

ここまでくると、次の課題は、NAOのマイクから入ってくる音声をGoogleのクラウドAPIに送って、ストリーミングで認識、テキストデータ化させることである。
これについては、Pepperで色々試された結果がウェッブにあるので、それを学んでなんとか二つを接合させれないかと考えている。
http://www.baku-dreameater.net/archives/9331
とか、
http://qiita.com/hanzo/items/bb89d021e170133b9d41
とかがとても参考になりそうです。
それができれば、ロボットが聞いた言葉をパソコン経由でGoogleにストリーミング送信し、返ってきたデータをパソコン上で解析して、結論をロボットに送り込んで喋らせれば良い。

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によって、ロボットのパフォーマンスのほとんどの制御がスマホからできることになったが、スマホのアプリは一切いらない。単に、インターネットブラウザがあれば良い。