FC2ブログ

スマフォのアプリを作りたい(25):スマフォだけで動作する音声認識①

   プログラミング [2020/06/22]
音声とその音声をテキストにしてチャットするソフトを考えてます。
相手に送るのは、音声&テキストです。
それと、あるキーワードを話すと記録としてその話した内容をテキスト化して保存できるようにしたいと思ってます。

何に使うかと言えば、
例えば、お百姓仕事中にその時の作業内容とか、作物の状態とかをメモできるようにしたい。
でもたいていの場合、手は土とか燃料とか触るのでバッチイ状態。
なのでスマフォを直接触れるのは・・・。
手袋をしてたとしてもいちいち手袋をはずすのも面倒だし。

だから、入力開始も声で操作できたらきっと嬉しい。

ヘッドセットとスマフォの電池の持ちの問題もあるし、環境音とかの雑音の問題もあるでしょう。
そっちはオイオイ考えるとして、
直近問題なのがキーワードを認識する音声認識、あるいは公衆回線を必要としない音声認識。

残念ながらGoople Speechはクラウドサービスだから電波の届かない場所では使えません。
電池も相当食うでしょう。
長々と話して、それをテキストに変換するのは、音声を録音しておいて後でGoogle Speechを使う手はあります。
でも最初にアプリに何をしたいのかを伝えるときの命令(キーワード)を認識させるのは、「後で」と言うのはちょっと不便な気がする。
何かの拍子で雑音にも反応してたら使い物にはならないし。

前置き説明長いですね。
ともかくスマフォ単独で、短い言葉だけでもいいので、認識させることができないか?
タダで。


◆Juliusを味見
以前からちょいちょい調べてたのです。
Juliusという音声認識エンジンが有名みたいです。
参考:https://julius.osdn.jp/
京都大学とかIPA、奈良先端科学技術大学院、名古屋工業大学の研究チームがよってたかって作ったもので、OSSとして利用できるようにしてくれています。

AndroidやiOSでも動作させることができるとあります。
ピッタリじゃないですか。

さらに、実際にAndroid版として動作を確認した内容をMatsuiさんという方がGitHubにアップしてくれていました。
参考:https://github.com/tech-sketch/JuliusForAndroid


!!でも!!
上記のAndroid版環境は、Macでビルドしたもののようです。
そう書いてあります。

えー・・・
さるのタブレットはWindowsだし、Macは使ったことないので開発用途で使いこなすのにはハードル高過ぎです。
Windowsでやった事例は・・・

それっきりで、なんか見つからない。
同じ様な問い合わせをされた方へのアドバイスで、アップされたのが割と昔なので本家の新しい情報を見るべきとある。

・・・
まあそうですよね、まずは基本から。
本家のhttps://julius.osdn.jp/サイトを斜め読み。

チュートリアル文書と、JuliusBook(おそらく仕様書的なもの)がウンロードできる。
日本語で書かれてる。
なのでまずは、チュートリアル文書(hi200902-julius-チュートリアル.pdf)に従ってみます。

手っ取り早く使ってみることのできる「ディクテーションキット」と言うのがあるそうで、ダウンロードしてきた。
確か、圧縮ファイル(dictation-kit-4.5.zip)を解凍しただけだったように思う。
ソースコードもOS毎のバイナリ形式も含まれているみたいです。(あー神様仏様、感謝します。)

チュートリアルによると、Windows上で試すのなら「run_fast.bat」を実行すればいいとあるが、
展開されたフォルダ内に該当のバッチファイルはなく、代わりにrun_win_xxx.batというのが3つある。
違いは何?・・・

HOWTO.txtにこう書いてありました。
「GMM版はDNN版に比べて精度が下がりますが,その分処理は軽く,処理が高速なバージョンです.DNN版は高精度ですが,比較的処理が重くなります.また,dnnclient版では別途ソフトウェアをインストールする必要があります.」

じゃあ、軽そうなGMM版が単語認識にはよさそうですね。でもGMMって何のこと?
参考:https://www.gavo.t.u-tokyo.ac.jp/~mine/japanese/nlp+slp/HMM2DNN.pd

GMMは、Gaussian Mixture Modelの略で、DNNはDeep Neural Networkの略みたい。
HMMというのはHidden Markov Model(隠れマルコフモデル)のことだそうです。
意味はさっぱり分かりません。(おいおいね。)

run_win_gmm.batを実行してみます。
タブレットPCの内蔵マイクですが、さっぱりダメです。
反応はして、認識テキストの表示はしますが、ほとんど合ってません。

認識精度がいいと言っているDNN版(run_win_dnn.bat)を起動してみました。
認識精度が良くなった印象が全くなく、しかもまったりとしたレスポンスで。
途中、近い認識結果を出すのですが、最終的には全く言ったことと違う結果で完了します。


ディクテーションキット(dictation-kit-4.5.zip)をダウンロードしてきたページには、話ことばモデルキット(ssr-kit-v4.5.zip)というのもダウンロードできるようになっていたので、それもダウンロードしてみました。
解凍先のフォルダには、同じように実行用のバッチファイル(run.bat)があったので起動してみた。
・・・
認識処理中に出力されるメッセージの構成が変わった。
けど、ほとんど誤認識であることや、まーったりな性能は変わらずです。

原因としては、PCの性能不足、マイクの感度不足とかが考えられるのかもしれないが、それでも良くなさ過ぎ。

そもそも、用途に応じて、音響モデルとか言語モデルとかいうデータを用意するものらしい。
お試し版はそこいらも含まれていて動作するわけだが、そのモデルデータが一般的な認識に必要かつ十分なのかは、よくわからない。
つまり、それが合ってないとか、チープだと上手く認識できないということもあるでしょう。

でも、不安になってきました。
しかし、これ以上の環境(日本語ドキュメント、ソース付き)は手に入らない気がするので、チュートリアル他に従って進めてみます。


◆Juliusの単語認識
Juliusのチュートリアル文書の3,2節のタイトルが、「単語認識をやってみる」です。
何と好都合な。

まずは、単語と読みを記述したテキストファイルを作れとあります。
----teburarecword.txt-----------------------------
記録 きろく
連絡 れんらく
至急 しきゅう
メモ めも
チェック ちぇっく
体温 たいおん
脈拍 みゃくはく
血圧 けつあつ
口腔 こうくう
朝食 ちょーしょく
昼食 ちゅーしょく
入浴 にゅーよく
体操 たいそう
ゲーム げーむ
コメント こめんと
---------------------------------------------------

単語と読みの間を何で区切るかは書いてませんでしたが、たぶんタブ。

そのリストをyomi2voca.plというツールに食わせて、.dictというファイルに変換するんだそうです。

ですが、ディクテーションキットにも、話ことばモデルキットの中にも見当たりません。
本家サイト(https://julius.osdn.jp/)の右側に「QUICK DOWNLOAD」-「Release packages (GitHub)」というリンクがあって、それをクリックすると
https://github.com/julius-speech/julius/releases
に飛びます。そのページから、julius-4.5-win32bin.zipをダウンロードして解凍してみたら・・・
ありました。

.plなのでperlが必要ですよね。
Eclipseの環境に含まれるperlを使ってみます。

ここで、文字コードについてどっかのサイトでECUに変換するようなことが書いてあったのですが、
Julius4.5リリースノートにUTF-8に移行との記述があったので、先のテキストファイルをsakuraエディタで開いて、UTF-8でセーブしなおしました。

----コマンドプロンプト-----------------------------
C:\WINDOWS\system32>cd /d d:\appmake\julius_base\for_teburarec

d:\AppMake\julius_base\for_teburarec>D:\AppMake\Pleiades\xampp\perl\bin\perl D:\AppMake\julius_base\julius-4.5-win32bin\bin\yomi2voca.pl teburarecword.txt > teburarec.dict
---------------------------------------------------


こんな出力でした。
----teburarecword.dict----------------------------
記録 k i r o k u
連絡 r e N r a k u
至急 sh i ky u u
メモ m e m o
チェック ch e q k u
体温 t a i o N
脈拍 my a k u h a k u
血圧 k e ts u a ts u
口腔 k o u k u u
朝食 ch o: sh o k u
昼食 ch u: sh o k u
入浴 ny u: y o k u
体操 t a i s o u
ゲーム g e: m u
コメント k o m e N t o
---------------------------------------------------


次の手順は、これを使った単語認識をやってみます。

julius.exeを実行をシェル/コマンドプロンプトで起動させるようです。
そのときのコマンドスイッチ「-w」が、「.dict」ファイルを指定するオプションだそうです。
その後ろの「-h」と「-hlist」が音響モデルファイルを指定するオプションとのことです。
2つ?

チュートリアルの記述で「-h」で指定されている「hmmdefs_ptm_gid.binhmm」が、\dictation-kit-4.5\model\phone_mフォルダの下にはありませんでした。
同フォルダ下の拡張子が一緒のものが複数あった。
00readme.txtファイルに説明が書いてありましたが、難しくて意味が分かりません。
とりあえず「-mono-」と入っている方を選択。

----コマンドプロンプト-----------------------------
C:\WINDOWS\system32>cd /d d:\appmake\julius_base\for_teburarec

d:\AppMake\julius_base\for_teburarec>..\dictation-kit-4.5\bin\windows\julius.exe -w teburarecword.dict -h ..\dictation-kit-4.5\model\phone_m\jnas-mono-16mix-gid.binhmm -hlist ..\dictation-kit-4.5\model\phone_m\logicalTri -input mic ・・・①回目


Error: rdhmmlist: line 21428: physical HMM "r+e" not found
Error: rdhmmlist: line 21429: physical HMM "g+o" not found
Error: init_phmm: HMMList "..\dictation-kit-4.5\model\phone_m\logicalTri" read error
ERROR: m_fusion: failed to initialize AM
ERROR: Error in loading model

d:\AppMake\julius_base\for_teburarec>..\dictation-kit-4.5\bin\windows\julius.exe -w teburarecword.dict -h ..\dictation-kit-4.5\model\phone_m\jnas-mono-16mix-gid.binhmm -hlist ..\dictation-kit-4.5\model\phone_m\logicalTri-3k16-gid.bin -input mic ・・・②回目
STAT: jconf successfully finalized
STAT: *** loading AM00 _default
Stat: init_phmm: Reading in HMM definition
Stat: binhmm-header: variance inversed
Stat: read_binhmm: has inversed variances
Stat: read_binhmm: binary format HMM definition
Stat: read_binhmm: this HMM does not need multipath handling
Stat: init_phmm: defined HMMs: 43
Stat: init_phmm: loading binary hmmlist
Stat: load_hmmlist_bin: reading hmmlist
Stat: aptree_read: 42857 nodes (21428 branch + 21429 data)
Error: load_hmmlist_callback: no name "N+N" in hmmdefs!
Error: aptree_read: failed to load leaf data entity
Error: load_hmmlist_bin: failed to read hmmlist from binary file
Error: init_phmm: HMMList "..\dictation-kit-4.5\model\phone_m\logicalTri-3k16-gid.bin" read error
ERROR: m_fusion: failed to initialize AM
ERROR: Error in loading model

d:\AppMake\julius_base\for_teburarec>
---------------------------------------------------

①回目のオプションの内容では、何やら見つからないメッセージが大量に出て、logicalTriファイルがread errorと出ました。

②回目で、「-hlist」オプションをlogicalTri-3k16-gid.binに変えてみますが、read errorになりました。
どう組み合わせればいいの?

③回目、「-hlist」オプションを指定しないでやってみました。
動いた・・・感じなのですが、文字化けしてます。
----コマンドプロンプト-----------------------------
d:\AppMake\julius_base\for_teburarec>chcp 65001
Active code page: 65001

d:\AppMake\julius_base\for_teburarec>..\dictation-kit-4.5\bin\windows\julius.exe -w teburarecword.dict -h ..\dictation-kit-4.5\model\phone_m\jnas-mono-16mix-gid.binhmm -input mic ・・・④回目
STAT: jconf successfully finalized
STAT: *** loading AM00 _default
Stat: init_phmm: Reading in HMM definition
Stat: binhmm-header: variance inversed
Stat: read_binhmm: has inversed variances
Stat: read_binhmm: binary format HMM definition
Stat: read_binhmm: this HMM does not need multipath handling
Stat: init_phmm: defined HMMs: 43
Stat: init_phmm: logical names: 43
Stat: init_phmm: base phones: 43 used in logical
Stat: init_phmm: finished reading HMM definitions
STAT: *** AM00 _default loaded
STAT: *** loading LM00 _default
STAT: reading [teburarecword.dict]...
Stat: init_wordlist: reading in word list
Stat: init_wordlist: read 15 words
STAT: done
STAT: Gram #0 teburarecword registered
STAT: Gram #0 teburarecword: turn on active
STAT: grammar update completed
STAT: *** LM00 _default loaded



### read waveform input
Stat: adin_portaudio: audio cycle buffer length = 256000 bytes
Stat: adin_portaudio: sound capture devices:
1 [MME: Microsoft TEh }bp[ - Input]
2 [MME: }CN (Intel SST Audio Device ]
3 [MME: C (Yamaha NETDUETTO Driver]
7 [Windows DirectSound: vC} TEh Lv` hCo[]
8 [Windows DirectSound: }CN (Intel SST Audio Device (WDM))]
9 [Windows DirectSound: C (Yamaha NETDUETTO Driver (WDM))]
Stat: adin_portaudio: APIs: DirectSound MME
Stat: adin_portaudio: -- DirectSound selected
Stat: adin_portaudio: [Windows DirectSound: vC} TEh Lv` hCo[]
Stat: adin_portaudio: (you can specify device by "PORTAUDIO_DEV_NUM=number"
Stat: adin_portaudio: try to set default low latency from portaudio: 0 msec
Stat: adin_portaudio: latency was set to 0.000000 msec
<<< please speak >>>Warning: strip: sample 35-53 has zero value, stripped
Warning: strip: sample 227-247 has zero value, stripped
pass1_best: 昼食
pass1_best_wordseq: 昼食
pass1_best_phonemeseq: silB ch u: sh o k u silE
pass1_best_score: -4063.642578
sentence1: 昼食
wseq1: 昼食
phseq1: silB ch u: sh o k u silE
cmscore1: 0.876
score1: -4063.642578

pass1_best: 朝食
pass1_best_wordseq: 朝食
pass1_best_phonemeseq: silB ch o: sh o k u silE
pass1_best_score: -3411.676758
sentence1: 朝食
wseq1: 朝食
phseq1: silB ch o: sh o k u silE
cmscore1: 0.810
score1: -3411.676758

pass1_best: メモ
pass1_best_wordseq: メモ
pass1_best_phonemeseq: silB m e m o silE
pass1_best_score: -2383.275146
sentence1: メモ
wseq1: メモ
phseq1: silB m e m o silE
cmscore1: 0.979
score1: -2383.275146

pass1_best: チェック
pass1_best_wordseq: チェック
pass1_best_phonemeseq: silB ch e q k u silE
pass1_best_score: -2988.289795
sentence1: チェック
wseq1: チェック
phseq1: silB ch e q k u silE
cmscore1: 0.999
score1: -2988.289795

pass1_best: コメント
pass1_best_wordseq: コメント
pass1_best_phonemeseq: silB k o m e N t o silE
pass1_best_score: -3063.687012
sentence1: コメント
wseq1: コメント
phseq1: silB k o m e N t o silE
cmscore1: 0.632
score1: -3063.687012

pass1_best: 記録
pass1_best_wordseq: 記録
pass1_best_phonemeseq: silB k i r o k u silE
pass1_best_score: -3218.227539
sentence1: 記録
wseq1: 記録
phseq1: silB k i r o k u silE
cmscore1: 0.917
score1: -3218.227539

pass1_best: 至急
pass1_best_wordseq: 至急
pass1_best_phonemeseq: silB sh i ky u u silE
pass1_best_score: -2582.531006
sentence1: 至急
wseq1: 至急
phseq1: silB sh i ky u u silE
cmscore1: 0.919
score1: -2582.531006



---------------------------------------------------

4回目、一旦終了(Ctrl+C)して、コマンドプロンプトの文字コードをUTF-8に変更して
再実したら、上手く行きました。

まあ、当たり前なのでしょうけど、.dictに登録した単語の中から認識結果は選択されます。
なので、なんか適当に言っても、リスト内のどれかになります。
表示しているメッセージの中に「cmscore1:・・・」と出る数値があって、1.00に近いほど「自信アリ」な感じです。
外を通るバイク音に反応した認識結果の場合は、0.5以下だったりします。

この感じをスマフォに取り込みたいと思います。


◆Juliusの基礎
チュートリアル文書を読み続けると、「基礎講座」と出てきて、4章は「動作原理」となっています。
ただし、基礎の基礎ができていないさるに理解できるわけもなく。
モヤモヤしただけでした。
分からない単語が色々出てくるけど、それを調べると穴の奥に沈んで上がって来れなくなりそうなので流した。

4.1節に前の章で「」となった部分の解説がありました。
Julius起動時のパラメタの「-h」と「-hlist」の違いです。
「-h」は音響モデル(音響モデル自体がどういうものかも分かってないが・・・)、
「-hlist」はトライフォンモデル:前後の音素で変化するパターンをマッピングするもの・・・?
(「一」「二」とか「分」「秒」とかの読み方が変化するようなものを定義しているのかしら。)

いずれ、「-hlist」はキーワードとしての単語認識には必要なさそうな感じですね。

4章の最後の方に、「認識精度はモデルで決まる」とある。

5章には、Juliusのコマンドスイッチで指定するオプションは、jconfファイルで指定できると書いてあります。jconfファイル自体は「-C」スイッチで指定するらしい。

6章には、Juliusの使い方が書いてある。認識サーバとして、プラグインとして機能を拡張できること、認識ライブラリとしての利用など。
最後の「ライブラリJuliusLibの利用」が今回の使い方としてはよさげなのかな?
ライブラリと言っているのが、DLLのようなものを指しているのか、スタティックライブラリなのかよくわからなかった。

「パッケージにjulius-simple.cが同梱されている。」とあるが、julius-4.5-win32binには含まれていませんでした。
ただし、julius-4.5-win32bin\lib下には、libjulius.alibsent.aはありました。

dictation-kit-4.5\srcにはjulius-simple.cがありました。julius-4.5.zipに圧縮されていたので解凍します。
まあ、見た感じ.dll/.soをビルドするのではなく、.lib/.a(スタティックライブラリ)を使う環境の様です。

今回、Juliusの呼び出し元は、javaのコードです。

React NativeのJSから、AndroidのJavaと来て、Cのスタティックライブラリを使う・・・のかな?
しかも、Android移植をMacでやったサンプルがあるのみ。
ちょっと、さるには、高ーいハードルに感じられます。



かなり大変そうなんだけど、やるっきゃないかな。
この後話が長ーくなりそうなので、一旦切ります。

では、御機嫌よう。
m(__m)


追伸:
Juliusの単語認識を実行したら、音声入力待ち後に「Warning: strip: sample 37-52 has zero value, stripped」と頻繁にワーニングが出ることがありました。このワーニングが出てると認識率は極端に悪くなります。
原因はマイクのの入力レベルが低いとかだそうだ。
でも、レベルを上げると、周りの雑音にも反応してしまうし・・・実行時の外部環境に応じて調整が必要となると結構悩ましいですね。
では。
スポンサーサイト





コメントの投稿

非公開コメント

カレンダー
01 | 2024/02 | 03
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 - -
プロフィール

さるもすなる

Author:さるもすなる
さるです。別HPサイト「さるもすなる」から侵食してきました。 山菜/きのこ、それとタイトルにしたPPバンド籠のことをメインに徒然に・・・・暇を持て余したさるの手仕事:男手芸のブログってことで。

最新記事
最新コメント
月別アーカイブ
カテゴリ
天気予報

-天気予報コム- -FC2-
本家のHPのトップ
山菜や茸の話です
PPバンドの籠作品と作り方です
投稿をお待ちしております



PVアクセスランキング にほんブログ村 にほんブログ村 ハンドメイドブログへ



マニュアルのお申し込み



検索フォーム
リンク
RSSリンクの表示
ブロとも申請フォーム

この人とブロともになる

QRコード
QR