Android 呼び出し TTS エンジンのプロセスと問題のレコード
序文
背景としては、Huaweiタブレットに関連する中国語音声プロンプトを提供できるAPPを導入する必要があるためで、HuaweiシステムはHongmeng 3.0であり、Android API 12に対応しています。
Android は TTS エンジンを呼び出します
TTS エンジンを呼び出す前に、デバイスに関連するテキスト読み上げエンジンがインストールされているかどうか、および中国語をサポートしているかどうかを確認する必要があります。確認方法は、「設定 -> アクセシビリティ -> アクセシビリティ -> テキスト読み上げ」です。 .Hongmeng システムはこのパスです。または、下の図に示すように、設定で音声合成項目を直接検索し、情報ボタンをクリックしてエンジン言語の選択などを構成することもできます。音声ブロードキャストが成功せず、Huawei のエンジンが動作していないのではないかとずっと疑っていましたが、Google のエンジンをインストールしたところ、問題が解決した後、Huawei の音声エンジンも可能であることがわかりました。サポートされている音声エンジンがない場合は、他の国内の音声エンジンをインストールすることもできますが、課金するかどうかはわかりません。
特定の呼び出しコードは次のように比較的単純です。onInit
メソッドを書き換えます。
mTextToSpeech = new TextToSpeech(this, new TextToSpeech.OnInitListener() {
@Override
public void onInit(int status) {
if (status == SUCCESS) {
if (mTextToSpeech.getEngines().size() <= 0) {
Toast.makeText(MainActivity.this, "Please install the voice engine", Toast.LENGTH_SHORT).show();
Log.i("tts_engine", "未安装TTS引擎");
return;
}
//The default language is Chinese
int result = mTextToSpeech.setLanguage(Locale.CHINA);
if (result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED) {
Toast.makeText(MainActivity.this, "Chinese is not supported", Toast.LENGTH_SHORT).show();
//Set to English when Chinese is not supported
mTextToSpeech.setLanguage(Locale.US);
}
else {
ttsInitFlag = 1;
// mTextToSpeech.speak(SPEED_LIMIT_MSG, TextToSpeech.QUEUE_FLUSH, null, null);
}
} else {
Log.e(TAG, "onInit: TextToSpeech initialization failed");
}
}
});
電話で話す:
mTextToSpeech.setPitch(1.0f);//方法用来控制音调
mTextToSpeech.setSpeechRate(0.8f);//用来控制语速
// 播放语音提示
if (ttsInitFlag == 1){
int code = mTextToSpeech.speak(SPEED_LIMIT_MSG, TextToSpeech.QUEUE_ADD, null, null);
Log.i("tts_speak", "Speak Result" + code);
}
onDestory に TTS の破棄を追加します。
if (null != mTextToSpeech){
mTextToSpeech.stop();
mTextToSpeech.shutdown();
mTextToSpeech = null;
}
TTS 関連の関数の具体的な説明については、API を検索して表示できます。
問題記録
音声ブロードキャストが失敗した場合は、同じ文のままです。ログを読んで問題を見つける方法を学ばなければなりません。そうでないと、音声ブロードキャストを直接検索して失敗し、急いで医者に行くことになり、時間を無駄にする可能性があります。 (これは前にもやったので、忘れずに覚えておいてください)。AS の LogCat で TextToSpeech 関連のログを検索すると、Speak メソッドを呼び出すときに「発話に失敗しました: TTS エンジンにバインドされていません」または「発話に失敗しました: TTS エンジンの接続が完全にセットアップされていません」というメッセージが表示されることがわかりました。この問題は通常、TextToSpeech サービスの開始に失敗したか、初期化が完了していないことが原因で発生するため、TTS サービスが完全に開始された後に Speak メソッドを呼び出す必要があります。インターネット上では、Speak 関数を OnInit で呼び出す必要があると言っている人がたくさんいました。音声ブロードキャストを呼び出すときは、OnInit の外部で呼び出す必要があります。OnInit で呼び出すと言われる理由は、setLanguage() が non-LANG_MISSING_DATA または LANG_NOT_SUPPORTED を返すことが TTS サービスの初期化完了の兆候であるためです。 setLanguage の後に追加するだけです 音声ブロードキャストを呼び出すときに、現在の TTS サービスが初期化されているかどうかを判断します これは上記のコードに反映されています ある意味、これは実際にはバグではなく、呼び出しのタイミングです問題は、APP が実行中に音声をブロードキャストしない限り (もちろん、この方法で音声ブロードキャスト機能をテストしたため、音声はありませんでした。) インターネット上に追加のメモがあります
。 AndroidManifest.xml に追加します。
<manifest
...
<queries>
<intent>
<action android:name="android.intent.action.TTS_SERVICE" />
</intent>
</queries>
...
</manifest>
Android API 11に対応しているようで、私のはAPI 12です。これは使用しなかったので、これも記録します。