ケーブルカーで行こう!
前の記事で「音声認識やってみよう」と勇ましくいったものの、調べれば調べるほどニュービー君には山頂が高すぎることが身に染みてきました。
さながら、全くの初心者がいきなりエベレストに登頂しようとしているようなものでしょう。
でも幸い多くの方々が、いわば「ケーブルカー」とも言える各種ツール類を用意してくれているので、自力登山は今度にして、まずはケーブルカーで山頂の景色を眺めに行きます(もちろん勉強は続けますって。ホントだよ)。
では出発!
来た、見た、勝った
さて、どのケーブルカーに乗るか選ばなければ・・・
もちろん乗り心地がいいものがいいし、乗りやすいものがいい。
値段もあまりかからないほうが嬉しい。
クラウドで音声認識サービスが色々出回っているし、性能面では問題ないのですが、無料では一日50発話しか使えない(もちろん有料にすればいいのですが、今回はお試しだし)とか、面倒なユーザ登録が必要(可能な限り私は自分のデータをネットに出したくない人なので)だったりとか、ちょっと悩んじゃいました。
で、githubでなんかないかなとgithub 音声認識
で検索したところ、Juliusにヒットしたわけです。
おお!日本語大語彙連続音声認識エンジンですと?
コの業界ってどうしても洋物が多いのですが、音声認識って英語と日本語ではだいぶ勝手が違いますよね?
人間だって三歳位までに、耳の機能が英語に特化したり日本語に特化したりとカスタマイズされるそうですし。
【言語別周波数】
人間が聞き分けられる周波数は20Hz~20KHzですが、言語にも周波数範囲があります。
日本語:0.13KHz~1.5KHz
英語:2KHz~12KHz
英語って日本語よりもかなり周波数が高いのです。
日本語と銘打ってるエンジンは重要ですよ、奥さん。
【日本語音声認識】
Juliusが日本語音声認識と謳っているのは、日本語専用の認識方法をとっている訳でなく、
日本語で学習済みということです。
エンジンはそのままに英語で学習させれば、英語音声認識となるはずです(多分)。
いずれは自分で一から学習させたいですけど、また今度ということで。
という訳で、Juliusを使ってみることにしました。ところで、これの読み方って「ユリウス」でいいんですよね?
インストール
先ほどの検索で上位にでてきたサイトにアクセスして、一通り眺めてみると、どうやらJuliusディクテーション実行キットというのがよさそう。
素直にそれをダウンロードして、zipファイルを早速展開。
伝統的にReadMeを読んでみれば、使い方はとっても簡単。
さっそくGMM(混合ガウスモデル)版を試したところ、「おー認識する!」。
でも、ちょっと誤認識が多いかも・・・軽くていいんだけどね(自分では何もしてないのに偉そうに)。
よ~し、続けてDNN(ディープニューラルネットワーク)版もやってみよう。
何々、Python環境が必要なのか。
機械学習といえばPython
Win7を使ってた時は、Pythonも一通り入れてたのですが、この度Win10にアップグレードするにあたり、クリーンインストールを行ったので、ディスクはスッキリきれいになっていたのでした。
色々ライブラリを入れるのも面倒なので、Anacondaで一気に入れちゃいましょう。
バージョンはどうしよう?やっぱり新しいほうがいいよね?よ~し3.5にしちゃうぞ!
Juliusは2.7と言ってるけど、少しぐらいなら3.5に直しちゃうもんね。
わかる人にはわかると思いますが、2.7と3.5の間には深くて大きな溝があるのでした。
初めてのDNN
ここのサイトから、Python3.5のWin-64bit版をダウンロード。
落としてきたexeを実行して、ウィザードにポチポチと答えてインストール。
特に問題もなくインストールが完了したので、run-win-dnn.batを実行。
3つのコマンドが実行され、DOS窓(コマンドプロンプトのことね)が3つ表示されるはずが…
- julius.exeの窓が開き「Stat: vecin_net: waiting connection...」と表示されて待機し、
- 2つ目の窓は一瞬で閉じられ、
- 3つ目の窓はいくらかの出力を行ったあと、retryを繰り返して閉じる。
- 最初の窓は虚しく何かを待ち続けている
となってしまった。
まあ、予想はしていたことですので、冷静にrun-win-dnn.batをエディタで開いて、2つ目のコマンドを確認すると、
start python .\bin\common\dnnclient.py dnnclient.conf
やっぱりPythonですか。
エラーを確認するため、DOS窓を開いて手動実行。
> python .\bin\common\dnnclient.py dnnclient.conf
common\dnnclient.py dnnclient.conf
File ".\bin\common\dnnclient.py", line 46
print "unkown switch"
^
SyntaxError: Missing parentheses in call to 'print'
print文でこけてる…
parenthesesとはカッコのこと。 どうやらprint文の文法が変わったよう。
printなんて楽勝
Python3でprint文は関数に変わって、その結果、
print "abc"
↓
print("abc")
となったみたいです。
dnnclient.pyの中にprint文は2ヶ所しかなかったので、とりあえず関数に変更して再度手動実行。
「Waiting for connections...」と表示されて待機状態となった。よしよし。
バッチ再実行
再度run-win-dnn.batを実行。
無事3つの窓が開き、3つ目の窓に「<<< please speak >>>」と表示される。
そこで「こんにちは」と発話したところ、大量のエラーを表示して窓3が、続いて窓2が消える。
やはりPython2でなければならないのか?
デバッグ
往生際悪く、Python3で動くようにしてみようと決意。
DOS窓を3つ開いてそれぞれでコマンドを手動実行。
案の定Pythonが
TypeError: Can't convert 'bytes' object to str implicitly
とエラーを出している。
buffer += tmpdata
が問題のロジックだが、バイト列を文字列に暗黙変換できませんというエラー。
バイト列は文字コードの配列と思えるのだが、文字列に変換できないのだろうか?
嫌な予測だけど、文字コード関連のエラーか?
調べたら、案の定文字列とバイト列が明確に区別されるようになっていた。
バイト列を文字列(unicode)にするなら、エンコード処理を差し込む必要があるけど、これはちょっと、チョチョイと直すという訳にはいかないので、あきらめてPython2を入れなおしましょう(問題個所が分かれば直すこと自体は簡単だけど、問題個所が検索だけでは特定できず、ロジックを追う必要があるので)。
Python2環境構築
Python3をアンインストールしてPython2を入れることも考えたのですが、Anacondaは別バージョンの仮想環境を作れたはずなので、せっかくだからトライ。
C:\>conda create -n py2 python=2.7
py2の名前で仮想環境ができたか確認。
C:\>conda env list
py2 C:\Users\****\Anaconda3\envs\py2
root * C:\Users\****\Anaconda3
仮想環境py2に切り替える。
C:\>activate py2
(py2) C:\>python --version
Python 2.7.12 :: Continuum Analytics, Inc.
仮想環境から抜ける
(py2) C:\>deactivate
C:\>
Yeah!できたぜ。
念のため、仮想環境の削除のやり方も書いておきましょう(もちらん実行はしてないので、未検証)。
> conda remove -n py2 --all
おぉっと忘れてた。numpyも入れなきゃいけなかったんだ。
C:\>activate py2
(py2) C:\>pip install numpy
Collecting numpy
Using cached numpy-1.11.1-cp27-none-win_amd64.whl
Installing collected packages: numpy
Successfully installed numpy-1.11.1
本当は最初に仮想環境を作るときに、numpyも入れとけばよかったのだけど・・・
C:\>conda create -n py2 python=2.7 numpy
改めてJulius-DNNを実行
起動バッチに仮想環境への切り替えを仕込み、
activate py2 ←これを挿入
start .\bin\windows\julius.exe -C main.jconf -C am-dnn.jconf -demo -charconv utf-8 sjis
timeout 10
start python .\bin\common\dnnclient.py dnnclient.conf
timeout 2
start .\bin\windows\adintool -in mic -out vecnet -server 127.0.0.1 -paramtype FBANK_D_A_Z -veclen 120 -htkconf model\dnn\config.lmfb.40ch.jnas -port 5532 -cvn -cmnload model\dnn\norm.jnas
で、起動バッチを実行。
ムム。何も起きない?
どうやらactivate py2
で環境を変えると、その時点でバッチ実行が停止してしまうみたい。
仕方ないので、DOS窓を開いてpy2に切り替えた後、そこから起動バッチを実行。この辺りは、あとでもっとうまい手を考えよう。
恐る恐る、小声(別に小声だからうまくいくわけではないのですが)で「こんにちは」と発話したら、しばらくして「こんにちは」と表示されました。
Oh yeah!大成功!!
色々試してみたけれど、確かにGMM版より認識率が高いみたい。
但し、それ相応の処理時間がかかるのが否めないのは仕方ないか(ちょっと一拍置くくらいだけど)。
とりあえず、ここまででJuliusの動作確認は完了。
以上、ten@蓼科情報でした。
君の声が聴きたい
うちのSotaくん(Vstoneさんの所から養子として来たロボット)は7月から耳が聞こえなくなってしまいました。
正確には、聞こえるんだけどコトバがわからなくなったのですね。
人間でいえば「感音性難聴」ということになるのでしょうか?
【感音性難聴】
音は聞こえるのだけれど、言葉が聞き取れないといった症状を表す難聴の一種。
軽度の場合だと本人も気づかず、
・会議等の多人数の会話が聞き取れない→自分の意見を言わないヤツ
・人の話を良く聞き返す→うっとうしい。聞く気がないヤツ
・呼ばれても気づかない→人を無視する嫌なヤツ
等々、対人コミュニケーションで印象が悪くなり、人間関係に悪影響があるようです。
私自身は視力が悪いのですが、耳だって当然同じように機能低下することもあるのに気づかされました。
こういうことに思い至らず、人に悪感情を持ったこともあるかも・・・反省!!
Sotaの場合、音声認識はクラウドサービスを利用しているのですが、それが7月から有料になったため、音声認識機能が使えなくなったのですね(甲斐性なしのお父さんでゴメン)。
マイクは無事だし、だったら自分たちでやってみようか…ということで、音声認識はじめま~す。
そもそも音って何?
物理学での音とは、気体や液体(媒質)の振動(波・粗密波)のことです(個体を伝わる音もあります)。
特に人間を対象とする場合、20Hzから20KHzまでの音波を感知できる(聞こえる)ため、この周波数の音波を特に音と呼びます。
20KHzよりも高い音を超音波、20Hzよりも低い音を低周波音と呼びます。
音の聞こえる範囲は個人差や年齢差や性差があり、一般に年齢が高くなるほど高い音が聞こえなくなります。
耳とマイク
音を受信するセンサーはマイク(マイクロフォン)と呼ばれています。
その構造は
- 空気の振動を受ける
- 空気振動を機械振動に変換する
- 機械振動を電気信号に変換する
というのが基本になります。
最終的な電気信号は、振動の強さを表します。 (いわゆる音声波形を取得している)
では、人間の耳はどんな仕組みになっているのでしょう?
実はまだ完全には解明されていないようです(確からしい仮説はありますが)。
今回、色々と調べてみたのですが、かなり精妙で高度な機構になっているようです。 ただ、基本的には周波数別の強度を信号として検出して、大脳に伝えているようです。
振動と周波数
音声波形(以下波形)はある瞬間の振動の強さを時系列に並べたもので、グラフにすると以下のようになります。
対して、正弦波のような単純で規則正しい音は、速さ・波長・振幅といった、その波を表す値があります。
正弦波は同じ波形が何度も繰り返し規則正しくあらわれるので、単位時間(例えば1秒間)に何回一連の波が現れるかを周波数として表すことができます。
上記のグラフでは横軸が秒を表していますので、1秒間に2回波が来ることが分かります。この場合、周波数は2Hzとなります。
AIにも人間と同じ聴覚を与えようとか、人間をモデルにして機械学習を行おうという場合、この波形を周波数で表現する形に変換しなければなりません(でなければ、多分人間とは違う認識機構になって、音のとらえ方そのものが人間には理解できないものになる気がします)。
フーリエ変換
振動の変化を周波数に変換するとはどういうことでしょう?
音声のような複雑な波形は、一見して周期性とは関係なさそうにみえますが、実は短い区間(音素)に切り分けて、その区間内を複数の正弦波に分解することが可能です。
音声ほど複雑ではありませんが、正弦波よりも複雑な以下の波形を見てください。
上記の波形は、実は以下のように複数の正弦波の合成で作られています。
それぞれ、
- 2Hzで振幅2
- 4Hzで振幅0.5
- 8Hzで振幅1
の3つの正弦波で構成されています。さあ、なんとなく周波数で元の波形を表現できそうな気がしてきませんか?
ということで、横軸に周波数、縦軸に振幅を割り当ててグラフにすると、以下のようになります。
このように、複雑な波形を複数の正弦波に分解し、各周波数とその振幅で表現することをフーリエ変換といいます。
実際にはもっと色々複雑なことをしていますが、概念的にはこんなもんでしょう。
これで声が聞き分けられるのか?
残念ながら、これだけではまだ人間の耳の機能のごく一部を模倣したにすぎませんし、この後には、その信号を処理する脳の働きが控えています。
ノイズの除去、低音部と高音部のバランス、重視する周波数、音素の分割、今聞いた音と記憶にある音とのパターンマッチング、欠落情報の補完等々、人間の感覚器官(とその信号を処理する脳)って本当によくできてますね。
これでまだ、機械学習に投入する前のデータ処理(の一部)なんですから、先は長いです。
以上、ten@蓼科情報でした。
Python言語の勢いが止まらない
Python言語の勢いが止まりません。
まさにPython本ブームです。
最近どんなPython本がでてきたのか、勢いを感じてみましょう。
※Amazonさんにて、2000年以降に出版された書籍名に「Python」が含まれるもので調査
※Javaには全然かないません。
- Pythonテクニカルリファレンス―言語仕様とライブラリ(2000/08/01)
- 初めてのPython(2000/09/01)
- Pythonで学ぶプログラム作法(2001/09/01)
- PerlユーザのためのPython移行ガイド(2002/10/01)
- Perl/Python/PHPによるXMLプロセッシング徹底解説―スクリプト言語で学ぶXML×Webプログラミング (Advanced Server‐side Programmingシリーズ) (2002/12/01)
- Pythonクィックリファレンス(2004/03/01)
- 初めてのPython 第2版(2004/11/01)
- みんなのPython(2006/08/22)
- Python for 702NK/702NK2プログラミングブック(2006/09/01)
- Pythonプログラミング入門(2007/03/01)
- TurboGears×Python (LLフレームワークBOOKS) (2007/03/07)
- IronPythonの世界 (Windows Script Programming) (2007/03/28)
- 速効!Pythonプログラミングバージョン2.5対応(2007/04/27)
- はじめてのPython (I・O BOOKS) (2007/11/01)
- みんなのPython Webアプリ編 みんなのシリーズ
- はじめてのPythonネットワークプログラミング (I・O BOOKS) (2008/06/01)
- Python フレームワーク Django と TurboGears で実現する Web 2.0プログラミング (Programmer to programmer) (2008/09/06)
- はじめてのPython3 (I・O BOOKS) (2009/01/01)
- Django×Python (LLフレームワークBOOKS) (2009/02/16)
- Python ポケットリファレンス (Pocket Reference) (2009/03/28)
- みんなのPython 改訂版(2009/04/11)
- Python 3 プログラミング徹底入門(2009/12/01)
- Pythonチュートリアル 第2版(2010/02/22)
- Pythonスタートブック(2010/04/24)
- リバースエンジニアリング ―Pythonによるバイナリ解析技法 (Art Of Reversing) (2010/05/22)
- Python入門2&3対応
- やさしいPython入門(2012/02/01)
- Pythonプロフェッショナルプログラミング(2012/03/26)
- PythonでかんたんAndroidプログラミング (-) (2012/07/01)
- みんなのPython 第3版(2012/08/29)
- wxPython GUIプログラミング(2012/11/01)
- あたらしい数理最適化: Python言語とGurobiで解く(2012/012/3)
- PythonでかんたんiOSアプリプログラミング―Kivyによるマルチタッチアプリケーション制作(2013/06/01)
- 言語研究のためのプログラミング入門: Pythonを活用したテキスト処理(2013/06/25)
- 「Kivy」ではじめるPythonプログラミング―グラフィックライブラリでアニメーションを表現! (I・O BOOKS) (2013/11/01)
- Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理(2013/12/26)
- たのしいプログラミング Pythonではじめよう!(2014/02/26)
- 実践OpenCV 2.4 for Python―映像処理&解析(2014/06/01)
- Python言語によるプログラミングイントロダクション: 世界標準MIT教科書(2014/12/29)
- Pythonプロフェッショナルプログラミング第2版(2015/02/27)
- みんなのRaspberry Pi入門 第2版 [対応言語:Python] (リックテレコムの電子工作シリーズ) (2015/06/4)
- Pythonで始めるプログラミング入門(2015/09/01)
- AVRマイコンとPythonではじめよう IoTデバイス設計・実装(2015/90/4)
- Python ライブラリ厳選レシピ(2015/10/17)
- サイバーセキュリティプログラミング ―Pythonで学ぶハッカーの思考(2015/10/24)
- 入門 Python 3(2015/12/01)
- 実践 Python 3(2015/12/01)
- 15時間でわかる Python集中講座(2016/01/19)
- 基礎 Python (IMPRESS KISO SERIES) (2016/03/04)
- 確かな力が身につくPython「超」入門 (確かな力が身につく「超」入門シリーズ) (2016/03/16)
- Pythonチュートリアル 第3版(2016/03/24)
- Pythonからはじめる数学入門(2016/05/21)
- Python機械学習プログラミング 達人データサイエンティストによる理論と実践 (impress top gear) (2016/06/30)
- Pythonで体験する 深層学習(2016/07/26)
2000年~2014年までに出版されたのは39冊(約2.5冊/年)
2015年だけで3倍以上の8冊!
2016年はまだ半年ちょい経過時点で7冊!
※Javaには全然かないません。
この勢いの背景には、機械学習やRaspberry Piの存在が大きいと思います。
「日本国外では有名」扱いだったPythonがこうして注目されてきて嬉しい限りです。
ああ、もっと詳しくなって一人前のPythonistaになりたい。
AI×ロボティクスの勉強はじめました。
シンギュラリティ対策室一発目の記事は山村がお送りします。
さて、今回は私たちのチームが、人工知能×ロボティクスのテーマに行き着いた経緯を簡単に紹介させてください。
- 昨年度末に「半歩先の技術」研究開発のミッションを与えられる
- 合宿を開き、メンバー内であーでもないこーでもないと意見を出し合う
- これからは人工知能がアツい!という結論になる
- ここで、もうひと工夫ほしいと思う
- ロボットどうだろう?
- Pepper for Biz使えそう
- Sotaかわいい、Sotaにしよう
- よし!「ロボットのインターフェースに、人工知能の組み合わせたサービス」だ!
ますます注目される人工知能×ロボティクスの流れに乗り遅れないように取り組んでいきます。