我需要在同一个应用程序中执行STT和TTS。 STT按预期工作。 TTS部分工作到正确读出文本的程度。但是,麦克风拾取TTS读取的文本,然后再次执行STT。
所以,我们有一个循环,TTS一次又一次地重复声音,即使用户说了一次。
为了避免这个问题,我尝试从UtteranceProgressListener执行麦克风的静音/取消静音。整个功能在服务中定义。
我在" onCreate()
"中有以下代码服务方法。
@Override
public void onCreate() {
super.onCreate();
context = getApplicationContext();
VoiceRecognitionListener.getInstance().setListener(this); // Here we set the current listener
// TTS initialization
tts = new TextToSpeech(this, this);
UtteranceProgressListener upListener = new UtteranceProgressListener()
{
public void enableMic(String s)
{
if(s.contains(UTTERANCE_ID)) {
AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
// Unmute the microphone
Toast.makeText(context, "Unmuting the mic", Toast.LENGTH_LONG).show();
audioManager.setMicrophoneMute(false);
}
return;
}
public void disableMic(String s)
{
if(s.equals(UTTERANCE_ID)) {
AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
// Unmute the microphone
Toast.makeText(context, "Muting the mic", Toast.LENGTH_LONG).show();
audioManager.setMicrophoneMute(true);
}
return;
}
@Override
public void onStart(String s) {
disableMic(s);
}
@Override
public void onDone(String s) {
enableMic(s);
}
@Override
public void onStop(String s, boolean i) {
enableMic(s);
}
@Override
public void onError(String s) {
enableMic(s);
}
@Override
public void onError(String s, int e) {
enableMic(s);
}
@Override
public void onBeginSynthesis(String s, int sampleRateInHz, int audioFormat, int channelCount)
{
disableMic(s);
}
};
tts.setOnUtteranceProgressListener(upListener);
}
以下方法调用TTS发言方法。
public int speakOut(String text, String utteranceId)
{
int rc = 0; // Return code
try
{
Bundle params = new Bundle();
params.putString(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, utteranceId);
rc = tts.speak(text, TextToSpeech.QUEUE_FLUSH, params, utteranceId);
}
catch(RuntimeException r) {
Toast.makeText(context, r.getMessage(), Toast.LENGTH_LONG).show();
}
return rc;
}
请帮助您提出建议。如果需要,我可以提供更多细节。