[音声認識] Webブラウザの音声認識APIを使う ~iPhoneの挙動~

作成:2021年12月18日  最終更新:2021年12月19日

下記記事についての補足です。

[音声認識] Webブラウザの音声認識APIを使う
https://mekiku.com/view.php?a=76

あの後いろいろと試した結果、iPhoneのSafariだとおかしな挙動になることが分かりました。

環境 iPhone 7 iOS 15.1および15.2(バージョンアップ前後で確認)
(ちなみにiPadでは再現しませんでした)

実験コード(お気軽にどうぞ。GitHub Pagesなのでコードも簡単に確認できます)
https://sksthrs.github.io/SpeechRecognitionTest/

問題点(問題点は既にフィードバックフォームからappleに報告済)
・SpeechRecognition.continuous プロパティをfalseにしても連続認識されてしまう
・SpeechRecognition.abort() メソッドを呼び出しても音声認識が止まらない
・SpeechRecognition.stop() メソッドを呼び出しても音声認識が止まらない
・音声認識結果が時々二重になる

【2021-12-19追記】
・SpeechRecognition.abort()やstop()メソッドで音声認識が止まらないのは、continuousプロパティがfalseの場合だけ。trueにすれば止められる。
・音声認識結果の全体または一部が時々二重になるのは回避できない模様。
・そもそもの音声認識精度が極めて低い。iPhoneのソフトウェアキーボードから音声入力した場合とは全く違う水準。
・音声認識精度の問題を別とすれば(別にしていいかはともかく)、continuousは常にtrueで運用することで「音声認識が停止できない」という決定的な不具合は回避できる(本記事の末尾に記載)。

具体例(先ほどのページでやった例+コメント)

iPhone音声認識のサンプルログ
UserAgent : Mozilla/5.0 (iPhone; CPU iPhone OS 15_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.2 Mobile/15E148 Safari/604.1

start recognizing: continuous = false ←連続認識しない設定
onstart
onaudiostart
onresult : event.resultIndex=0 event.results.length=1
event.results[0] isFinal=true results[0][0] transcript=音声認識のテストです音声認識のテストです confidence=0.9340000152587891 ←1回しか言ってないのに2回言ったことにされている
onend ←音声認識は終了したはず
onresult : event.resultIndex=0 event.results.length=1 ←また認識
event.results[0] isFinal=true results[0][0] transcript=これで終わったはずなんだけどこれで終わったはずなんだけど夜に終わらない confidence=0.9300000071525574 ←重複
abort recognizing ←abort()呼び出し
onresult : event.resultIndex=1 event.results.length=2 ←abort()したのに認識
event.results[0] isFinal=true results[0][0] transcript=これで終わったはずなんだけどこれで終わったはずなんだけど夜に終わらない confidence=0.9300000071525574
event.results[1] isFinal=true results[1][0] transcript=してみたんだけど多分これ confidence=0.9290000200271606
stop recognizing ←stop()呼び出し
onresult : event.resultIndex=2 event.results.length=3 ←stop()呼び出したのに認識
event.results[0] isFinal=true results[0][0] transcript=これで終わったはずなんだけどこれで終わったはずなんだけど夜に終わらない confidence=0.9300000071525574
event.results[1] isFinal=true results[1][0] transcript=してみたんだけど多分これ confidence=0.9290000200271606
event.results[2] isFinal=true results[2][0] transcript=さらに外やはり終わらないとやはり終わらない confidence=0.9229999780654907
onresult : event.resultIndex=3 event.results.length=4
event.results[0] isFinal=true results[0][0] transcript=これで終わったはずなんだけどこれで終わったはずなんだけど夜に終わらない confidence=0.9300000071525574
event.results[1] isFinal=true results[1][0] transcript=してみたんだけど多分これ confidence=0.9290000200271606
event.results[2] isFinal=true results[2][0] transcript=さらに外やはり終わらないとやはり終わらない confidence=0.9229999780654907
event.results[3] isFinal=true results[3][0] transcript=なぜかどれをやっても止まらないなぜかどれをやっても止まらない confidence=0.9200000166893005

以上が、iPhoneでの結果となります。

現状では、iPhoneのSafariの場合だけ、音声認識処理は特別な対応が必要と思われます。あと、iPhoneは音声認識させていると発熱がすごいので、止められないのは困りますね……。

【2021-12-19追記】
音声認識が止まらない不具合を回避するには、常に連続認識(continuous=true)で運用する必要があります。この辺を考慮した簡易的なSpeechRecognitionのラッパーを作ってみました。
https://github.com/sksthrs/mk-vchat/blob/main/src/speechRecognitionWrap.ts


◀(前記事)[音声認識] Webブラウザの音声認識APIを使う
▶(次記事)[音声認識] Webブラウザの音声認識APIを使う:ブラウザ間の差異など

(一覧)[2.技術情報 (tech)]