Flutter:「speech_to_text」で日本語音声が英字で認識されてしまう

※当サイトは、アフィリエイト広告を利用しています

エラー対応記録

音声入力の「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の基礎文法を素早くインプットできる/


Dart入門 - Dartの要点をつかむためのクイックツアー

コメント

タイトルとURLをコピーしました