
何が起きたか
Capacitor製Androidアプリで音声ボタンが1回おきに失敗し、5 msで「Didn't understand, please try again.」エラー。
なぜ重要か
認識器の破棄が交互の失敗を招き、修正にはpatch-packageでプラグイン自体にパッチを当てる必要があった。
こういう要約が、毎朝あなたのメールに届きます。
対象のアプリは自作の旅行英語シャドーイングツールで、ユーザーの音声を録音し、音声認識でテキスト化して模範文との一致度を採点する。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フォルダを削除して解決した。
業界と使っているAIツールを選ぶと、仕事に関係するニュースが毎朝届きます。
登録無料・Googleアカウントなら30秒・いつでも解除できますAITodayについて →
この記事についてわからないことをAIに質問できます。AIはこの記事・AIToday の過去記事・Wikipedia を読み、出典を付けて答えます。Q&Aはこのページに公開され、他の読者も読めます。
このようなAIの動きを、御社の業界・競合に合わせて毎日届ける法人プランもあります → 詳しく見る
Kretaは、8MP広角カメラ搭載イヤホン「ARES」を10月28日11:00にMakuakeで公開すると発表した

EntravisionはJosé 97.5 FM「Al Aire y Sin Permiso」のAIコーホストCoyotecを2025年9月の週末デビューから平日プライムタイムに拡大し、8月時点でカリフォルニア、ネバダ…

EleutherAIのピアノMIDI生成モデルAriaをWindows 11でローカル実行する手順が公開され、VRAM 8GBのNVIDIA RTX 4060で動作確認された

Blockが人間の会話音声のみで訓練しテキストを一切使わない世界初のAI「Dessa」を発表

趣味の人物が90秒のJ-POP mp3をClaude Codeに与えたところ、テンポは一発で的中し、調性推定はFメジャー/Dマイナーで67.5%、MetaのDemucsで分離後、サビに約10小節続く半音転調を検出した

Qiitaの記事が、オープンソースの音楽生成モデルACE-Stepをローカルマシンにインストールして実行する方法を解説
