AIToday
音声・スピーチZenn AI/ML掲載日時: 2026年10月26日 13:00

Capacitor音声認識が1回おきに5msで失敗

LINEで送る
Capacitor音声認識が1回おきに5msで失敗

3つのポイント

  1. 何が起きたか

    Capacitor製Androidアプリで音声ボタンが1回おきに失敗し、5 msで「Didn't understand, please try again.」エラー。

  2. なぜ重要か

    認識器の破棄が交互の失敗を招き、修正にはpatch-packageでプラグイン自体にパッチを当てる必要があった。

わからないところ、AIに聞けます

質問と回答はこのページに公開されます。

こういう要約が、毎朝あなたのメールに届きます。

背景と解説

対象のアプリは自作の旅行英語シャドーイングツールで、ユーザーの音声を録音し、音声認識でテキスト化して模範文との一致度を採点する。PCではブラウザのWeb Speech APIを使っていたが、CapacitorでAndroidアプリとして包む際、AndroidのWebViewはwebkitSpeechRecognitionを存在するように見せかけながら実際には機能しない(Chromium issue 41172064)ため、常にネイティブのAndroid音声認識器を使う方針を選んだ。この判断が、ネイティブプラグイン層に潜んでいたバグの土台となった。

デバッグはClaude Codeが行い、まずプラグインのAndroidソースを読んで破棄・再生成のパターンを疑ったが、変更する前に実機をつないで計測した。adbでWebViewのデバッグポートに接続し、Capacitorのネイティブ呼び出しブリッジをラップして呼び出しごとの応答時間を記録し、同時にadb logcatで端末ログを取得した。ログでは、startの4 ms後にすでにエラーが送られ、続いてマイクが開いて5秒間聞き取り、「no speech detected」で終了していた。しかも同じ呼び出しでエラー通知が3回届いていた。プラグインのgetErrorText()は未知のエラーコードを既定の「Didn't understand, please try again.」に変換するため、修正前の版では正確なコードは見えなかった。

パッチは3点を変更する。SpeechRecognizerがなければ作成し、あれば前のセッションをcancel()するだけにした。onError()で呼び出し参照をnullにし、同じ呼び出しが二重に拒否されないようにした。onResults()でも同じく一度だけ確定させるようにした。なお、Androidの公式ドキュメントはSpeechRecognizerが不要になったら呼び出し側がdestroy()を呼ぶべきとしているが、このパッチは単に毎回のdestroy()をやめただけで、プラグインに他に呼び出す箇所はない。Windowsでのパッチ作業では、npx patch-packageが「Filename too long」エラーを出し、パッチを再生成する前にandroid/buildフォルダを削除して解決した。

よくある質問
1回おきの失敗の原因は何だったのか?
プラグインはstart()が呼ばれるたびにSpeechRecognizerのdestroy()を呼び、新しいものを作っていた。この破棄により、マイクが聞き取りを続ける中で新しい呼び出しに5 msでエラーが送られ、成功と失敗が交互に起きていた。
修正はどう適用されたのか?
@capacitor-community/speech-recognition 7.0.1へのpatch-packageのパッチとして適用された。SpeechRecognizerを1つ使い回し、前のセッションを破棄せずcancel()で止め、結果やエラーは1回の呼び出しにつき一度だけ返すようにした。
パッチ版は実機で実際に動いたのか?
動いた。パッチを当ててAPKを再ビルドすると、6回連続の押下すべてで3.6〜5.1秒聞き取ってから結果を返し、5 msでエラーを返す押下はなかった。
LINEで送る

あなたの仕事に関係するAIニュースを、毎朝お届けします。

業界と使っているAIツールを選ぶと、仕事に関係するニュースが毎朝届きます。

登録無料・Googleアカウントなら30秒・いつでも解除できますAITodayについて →

AIに質問

この記事についてわからないことをAIに質問できます。AIはこの記事・AIToday の過去記事・Wikipedia を読み、出典を付けて答えます。Q&Aはこのページに公開され、他の読者も読めます。

質問と回答はこのページに公開されます。

このようなAIの動きを、御社の業界・競合に合わせて毎日届ける法人プランもあります → 詳しく見る

関連記事

次の記事へBlockが会話AI「Dessa」発表