AndroidのChromeで音声認識をいろいろ。WindowsのChromeでうまくいくところが、Androidではうまくいかない。
音声認識を連続で行うためにcontinuousパラメータを設定。認識されるたびにresultが発火する。これをごにょごにょすれば目的は達成される。
しばらく音声入力がないと、認識は終了する。ここでendなどのイベントが発火する。必要ならもう一度認識を開始するようユーザーにうながすことになる。
問題はここからだ。
Androidではendが発火する前にresultが発火する(Windowsではそんなことはない)。でもって、resultので返ってくる値が、これまで認識された言葉がすべてつながった状態となっている。どういうことだよ。
自分のプログラムがおかしいのかと思い、似たような例がないか探してみた。あった。
ブラウザのみで音声認識とテキスト読み上げを実現する Web Speech API | CYOKODOG
勉強し始めの頃に何度も見たページだ。
ここにある「連続音節認識で文章の変換を行う」というサンプルを試してみる。
音声認識した結果をSpeech Synthesis API により読み上げてくれるサンプルだ。
Windowsでは意図したとおりの動作。こちらがしゃべった言葉を繰り返してくれる。やまびこみたいな感じだ。
「あいうえお」(こちらがしゃべる)→「あいうえお」(Chromeがしゃべる)
「かきくけこ」(こちらがしゃべる)→「かきくけこ」(Chromeがしゃべる)
(ここで待つ)
ある程度の時間音声入力がないと、停止ボタンが録音ボタンに変わり、認識は終了する。
しかし、Androidでは
「あいうえお」(こちらがしゃべる)→「あいうえお」(Chromeがしゃべる)
「かきくけこ」(こちらがしゃべる)→「かきくけこ」(Chromeがしゃべる)
(ここで待つ)
「あいうえおかきくけこ」(Chromeがしゃべる)
といった具合。
なんだこれ。バグか?
ほかの環境ではどうなんだろう? Macはどうだろう?
ちなみに待ち時間(認識を自動終了するまでの時間)は、Windowsで15~20秒、Androidで10秒ほど(ちゃんと計ってないけどだいたいこんくらい)。
これとは別に、PCでは起きなくてAndroidで起こること。Chromeがしゃべった言葉をChromeが音声認識してしゃべる、それを認識してまたしゃべる、という感じでえんえん繰り返してしまう。 ハウリング現象にも似た感じだ。スピーカーとマイクが近いというハードウェアの構成から仕方ないことだろう。これはスピーカーの音声をしぼるとか、ヘッドホンを使うとかで回避できる。上の問題はこれとはまったく違う話だ。だから、これは今回問題とはしない。
さて、どうしたものだろう。
resultで返ってくる値を保持して比べるとかすればいいのだろうか。いろんなイベントが発火するみたいなので、それをひととおりチェックしつつレスポンスをもう少し調べてから対策を考えようと思う。いろいろめんどくさい。ゴールは近いと思ってたんだけどなあ。
コメント