音声入力の「speech_to_text」パッケージを導入していたアプリで、いつのまにか、Androidでは日本語で音声入力しても、英字で認識されてしまう事に気づきました。
iOSアプリでは日本語認識されたので、Androidだけの問題です。
直面した方は少ないかもしれませんが、AIへの質問では解消できず、Web上にも情報が少なかったので、簡単に解決した過程を共有します。
結論としては、ロケールの表記を「ja_JP」ではなく「ja-JP」にしたら、解消できました。
前提とする環境
- PC:MacBook Pro(Intel Core i5)
- OS:macOS Sonoma 14.5
- Flutter:3.19.6
- Android Studio:Koala 2024.1.1 Patch 1
- speech_to_text:6.6.2
発生した不具合(英字でしか表示されない)
例えば、「漢字」と発声しても、勝手に似た発音の英単語が表示されてしまう状況でした(具体的にどのように表示されたか、忘れてしまいましたが...)。
「あーあー」や「おーおー」などと発声しても、「ahah」や「ohoh」のように表示されます。
特段、ログにはエラーコードは表示されていません。
以前は、問題なく日本語で表示されたのですが。。。
「SpeechToText()」の「listen」メソッドの「localeId:」プロパティには、確かに「ja_JP」を設定しているので、間違いはないはずでした。
// クラス名、メソッド名、プロパティ名(変数名)について、筆者が作成したもの(名前変更可のもの) // の名前の末尾には、大文字のオー「O」をつけています // ※ライブラリ(パッケージ)で予め決められているもの(名前の変更不可のもの)と、 // 自分で作成したもの(名前の変更可のもの)の区別をしやすくするため // SpeechToText のインスタンス作成 SpeechToText speechToTextO = SpeechToText(); // 端末のロケールを取得 var systemLocaleO = await speechToTextO.systemLocale(); var currentLocaleIdO = systemLocaleO?.localeId ?? ""; // ↓このログは「言語 ja_JP」になっている事を確認済 debugPrint("言語 $currentLocaleIdO"); // 音声認識のメソッド await speechToTextO.listen( // ロケール設定(「ja_JP」が設定される) localeId: currentLocaleIdO, //・・・以下略・・・ );
AIへの相談結果(端末の音声認識設定、対応ロケールの確認)
Chat-GPT達(Chat-GPTやGemini等)に尋ねると、概ね下記2点を提案されました。
1つ目は、Android端末側の設定の問題というものです。
[設定] > [システム] > [言語と入力] > [音声入力] > [Google音声入力] を開き、「オフラインの音声認識」→「日本語」を有効にするというもの。
しかし、自分の端末では既に対応済でした。
2つ目は、「SpeechToText()」の「locales」メソッドを用い、「speech_to_text」が使えるロケール一覧に、「ja_JP」が存在するか確認せよ、というものです。
具体的には、以下のようにすれば確認できます。
SpeechToText speechToTextO = SpeechToText(); var localesO = await speechToTextO.locales(); for (var localeO in localesO) { debugPrint("使えるロケール: ${localeO.localeId} (${localeO.name})"); }
早速、確認して「localeId」をログ出力させると、やはり日本語については、
「使えるロケール: ja_JP (日本語 (日本))」
と表示され、間違いはなさそうでした。
ロケールの表記を微妙に修正したら解決
Web上には情報が少なく、その他にも実装上の不備がないか、試行錯誤していた中で、下記スレッドに辿り着きました。
現時点(2025年8月時点)で、本スレッド唯一の回答によると、「ja-JP」(「アンダーバー」ではなく「ハイフン」)に変更したら直ったとの事。
この回答に対して、現時点(2025年8月時点)では解決済マークはなく、usefulポイントもゼロ。。
ダメ元で試してみると、なんと、日本語認識が復活しました!
(ありがたい情報で大変助かりました!)
結果、Androidの場合だけ、「ja_JP」を「ja-JP」に変更して「localeId:」プロパティを設定するように修正しました。
SpeechToText speechToTextO = SpeechToText(); var systemLocaleO = await speechToTextO.systemLocale(); var currentLocaleIdO = systemLocaleO?.localeId ?? ""; debugPrint("言語 $currentLocaleIdO"); // ↓これを追加 // Androidの場合だけ実行 if (Platform.isAndroid) { if (currentLocaleIdO == "ja_JP") { currentLocaleIdO = "ja-JP"; debugPrint("Androidのため、localeId の表記を ja_JP から ja-JP に修正"); } } await speechToTextO.listen( // ロケール設定(「ja_JP」ではなく「ja-JP」が設定される) localeId: currentLocaleIdO, //・・・以下略・・・ );
ちなみに、下記情報によると、「ja_JP」と「ja-JP」は規格の違いのようです(これ以上は、まだ深堀って理解できていないです...)。
「speech_to_text」の最新バージョンでは解消されている可能性あり
iOSアプリの方でログを確認すると、
- 「systemLocale()」メソッドで取得した端末設定のロケール表記
- 「locales()」メソッドで確認できる「speech_to_text」の対応ロケール表記
いずれも、「ja-JP」(「アンダーバー」ではなく「ハイフン」)になっていました。
実は、Flutterのバージョンが古いせいで、現時点(2025年8月時点)最新の「speech_to_text: ^7.3.0」を導入できなかったのですが、1つ前の7.2.0の「Changelog」を見ると、「Address incorrect language tag format on Android」とあるので、単に最新版のパッケージを使っていれば、生じない問題なのかもしれません(最新のFlutterバージョン環境を用意できず、試せていませんが...)。
そのため、本記事の内容は、特殊な状況下でしか役立たないかもしれませんが、、、もし、どなたかのご参考になれば幸いです。
リリースしたアプリ(全てFlutterで開発)
個人アプリ開発で役立ったもの
おすすめの学習教材
\超初心者向けでオススメな元Udemyの講座/
\キャンペーン時を狙えば安価で網羅的な内容が学べる(日本語訳あり)/
\Gitの基礎について無料で学べる/
おすすめの学習書籍
\実用的。image_pickerに関してかなり助けられた/
\Dartの基礎文法を素早くインプットできる/
コメント