Android OuttanceProgressListener总体上可以工作,但Start和onDone上的事件不';行不通
下面是SpeechSynthesizer.java文件,其中包含重写的OnOne和onStartAndroid OuttanceProgressListener总体上可以工作,但Start和onDone上的事件不';行不通,android,text-to-speech,Android,Text To Speech,下面是SpeechSynthesizer.java文件,其中包含重写的OnOne和onStart package ru.cadmean.speechforunityjava; import android.content.Context; import android.speech.tts.TextToSpeech; import android.speech.tts.UtteranceProgressListener; import android.util.Log; import jav
package ru.cadmean.speechforunityjava;
import android.content.Context;
import android.speech.tts.TextToSpeech;
import android.speech.tts.UtteranceProgressListener;
import android.util.Log;
import java.util.Locale;
public class SpeechSynthesizer {
private boolean isReady;
private String currentLanguage = "en-US";
private float currentRate = 1f;
private TextToSpeech tts;
public SpeechSynthesizer(Context context, SpeechSynthesizerDelegate delegate) {
tts = new TextToSpeech(context, status -> {
if (status != TextToSpeech.SUCCESS) {
Log.d("Speech", "Failed to initialize text to speech: " + status);
return;
}
tts.setLanguage(Locale.ENGLISH);
tts.setSpeechRate(currentRate);
tts.setOnUtteranceProgressListener(new UtteranceProgressListener() {
@Override
public void onStart(String utteranceId) {
delegate.onSpeakingStarted();
Log.d("Bruh", "speaking started2");
}
@Override
public void onDone(String utteranceId) {
delegate.onSpeakingFinished();
Log.d("Bruh", "speaking finished2");
}
@Override
public void onError(String utteranceId) {
delegate.onSpeakingCancelled();
Log.d("Bruh", "speaking Cancelled2");
}
});
isReady = true;
});
}
public boolean isReady() {
return isReady;
}
public void speakText(String text, String lang, float rate) {
if (!currentLanguage.equals(lang)) {
currentLanguage = lang;
tts.setLanguage(new Locale(lang));
}
if (currentRate != rate) {
currentRate = rate;
tts.setSpeechRate(rate);
}
Log.d("Speech", "Speaking: " + text);
tts.speak(text, TextToSpeech.QUEUE_FLUSH, null);
}
public boolean isSpeaking() {
return tts.isSpeaking();
}
public void stopSpeaking() {
Log.d("Speech", "Stopping");
tts.stop();
}
}
这是一个主文件,在这个文件中,超额订阅的代理可以工作,但不能工作
package ru.cadmean.speechforunityapp;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import ru.cadmean.speechforunityjava.SpeechSynthesizer;
import ru.cadmean.speechforunityjava.SpeechSynthesizerDelegate;
public class MainActivity extends AppCompatActivity {
private EditText editSpeechText;
private Button startButton;
private Button stopButton;
private SpeechSynthesizer speechSynthesizer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
speechSynthesizer = new SpeechSynthesizer(getApplicationContext(), new SpeechSynthesizerDelegate() {
@Override
public void onSpeakingStarted() {
Log.d("Bruh", "speaking started");
}
@Override
public void onSpeakingFinished() {
Log.d("Bruh", "speaking finished");
}
@Override
public void onSpeakingCancelled() {
Log.d("Bruh", "speaking cancelled");
}
});
editSpeechText = findViewById(R.id.editSpeechText);
startButton = findViewById(R.id.startButton);
stopButton = findViewById(R.id.stopButton);
startButton.setOnClickListener(v -> {
if (!speechSynthesizer.isReady()) {
Log.d("Bruh", "Not ready");
return;
}
speechSynthesizer.speakText(editSpeechText.getText().toString(), "ru-RU", 1f);
});
stopButton.setOnClickListener(v -> {
speechSynthesizer.stopSpeaking();
});
}
}
总的问题是,当我按start时,应用程序会说话,但OnOne或onStart事件不会触发。它不起作用的原因是,当您调用speak时,您将参数(特别是OuttanceID)设置为null 因此,在SpeechSynthesizer.speakText()中,添加以下内容:
// set params
// *** this method will work for devices API 19+ ***
String mostRecentUtteranceID = "blahblahblah";
HashMap<String, String> params = new HashMap<>();
params.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, mostRecentUtteranceID);
tts.speak(text, TextToSpeech.QUEUE_FLUSH, params);
//设置参数
//***此方法适用于设备API 19+***
字符串mostrecentutranceid=“blahblahblah”;
HashMap params=新的HashMap();
参数put(TextToSpeech.Engine.KEY_PARAM_outrance_ID,mostrecentoutranceid);
tts.speak(text,TextToSpeech.QUEUE_FLUSH,params);
“blahblah”只是一个快速的解决方法,以便您可以看到问题
如果要区分不同的话语,请为每个通话使用唯一的id。(请参阅)我很好奇我的答案是否有效。