Android用アプリ(覚えてねこ!)で音声認識にSpeechRecognizerを使用しているのですが、音声認識結果が突然英語でしか返ってこなくなってしまいました。
mRecognizer = SpeechRecognizer.createSpeechRecognizer(mainActivity);
mRecognizer.setRecognitionListener(new VncRecognitionListener());
intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, mainActivity.getPackageName());
// 言語を日本語に設定
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.JAPAN.toString());
intent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 100);
intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "音声を入力");
mRecognizer.startListening(intent);
通常日本語の設定は、ロケールはLocale.JAPAN.toString()で設定します。通常その値は”ja-JP”が入っているはずです。
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.JAPAN.toString());
Locale.JAPAN
(日本のロケール)は、通常日本語の音声認識を行うために設定されます。しかし、実際にはデバイスのOSや設定に依存するため、時として動作が変わることがあるようです。妻が使用していたOPPOのAndroid 14では、最初は正常に動作していたものの、(おそらく)OSのアップデート後に Locale.JAPAN
が予期していない”ja"
という値に変わってしまったのだと思います。その結果、"ja-JP"
(日本語・日本)を指定しなければならないのに、”ja"
を設定してしまったのです。
“ja"
という予期しない設定の場合、音声認識のエンジンは、おそらくデフォルトの設定である英語の認識結果が返されたのだと、推測しています。
解決するためには、以下のように“ja-JP"
を明示的に設定すれば、正しい日本語での音声認識結果が得られるようになります。
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, "ja-JP");
まさか、Locale.JAPANの値がデバイス依存だとは思いもしませんでした。設定する側と使う側が同じ値を使えるからこそ意味を持つ定義なのに、これではLocale.JAPANの存在意義がわからなくなります。そんな定数、今後も使うのが怖いですよねぇ。
補足
最近私が嵌まっている沸かせる温調ボトル。電源コードは本体にしまえるし、日本製なので変換用のアダプタも必要ありません。便利ですよ~。
これ、何に使うかというと、私は熱燗飲むために使っています。とっくりを入れた時の高さが丁度いいんですね。
沸かせる温度は4種類ありますが、基本的には95℃で沸かせば、とっくりの中の日本酒は60℃くらいになります。程よい少し熱めの熱燗が楽しめます。注いでもボトルに戻せば温かさはキープされますし、もう一杯飲みたいときや、冷めたときは、温め直せばOKです。週末、基本、部屋でテレビを見ながら机の上に置いて楽しんでいますが、300Whなので、そのくらいの性能を持ったモバイルバッテリーで利用できます。車中泊で使うのもありですね。これ、超おすすめですよ~。
コメント