Как заставить SpeechSynthesis.speak(String) заблокировать?
public boolean playing=false;
private void prepareTTSEngine() {
try {
synthesis = SpeechSynthesis.getInstance(this);
synthesis.setSpeechSynthesisEvent(new SpeechSynthesisEvent() {
public void onPlaySuccessful() {
Log.i(TAG, "onPlaySuccessful");
playing=true;
}
public void onPlayStopped() {
Log.i(TAG, "onPlayStopped");
playing=false;
}
public void onPlayFailed(Exception e) {
Log.e(TAG, "onPlayFailed");
e.printStackTrace();
playing=false;
}
public void onPlayStart() {
Log.i(TAG, "onPlayStart");
//playing=true;
}
@Override
public void onPlayCanceled() {
Log.i(TAG, "onPlayCanceled");
playing=false;
}
});
//synthesis.setVoiceType("usenglishfemale1"); // All the values available to you can be found in the developer portal under your account
} catch (InvalidApiKeyException e) {
Log.e(TAG, "Invalid API key\n" + e.getStackTrace());
Toast.makeText(_context, "ERROR: Invalid API key", Toast.LENGTH_LONG).show();
}
}
prepareTTSEngine();
String speech= MapLocationOverlay.mSelectedMapLocation.getShortDesc();
synthesis.setVoiceType("usenglishfemale");
BreakIterator iterator = BreakIterator.getSentenceInstance(Locale.US);
iterator.setText(speech);
int start = iterator.first();
for (int end = iterator.next();end != BreakIterator.DONE; start = end, end = iterator.next()) {
if(speech !=null && speech.substring(start,end).compareTo("")!=0)
{
String sentence_next=speech.substring(start,end);
//set ready flag to true (so isReady returns true)
while(playing==true)
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
synthesis.speak(sentence_next);
} catch (BusyException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoNetworkException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
enter code here
}
}
}
I'm using [the iSpeech library's
SpeechSynthesisclass](http://www.ispeech.org/androidsdkdoc/com/ispeech/SpeechSynthesis.html). When I call the
говоритьmethod in a
цикл for, пропуская одно предложение за раз, все предложения начинаются одновременно. Я думаю, это потому, что метод неблокирующий. Это не с открытым исходным кодом, поэтому я не вижу, как это работает. Как я могу сделать так, чтобы он не начинал одно предложение, пока не будет закончено предыдущее предложение?
1 ответ
Обычно с такими библиотеками код не ждет, пока звук перестанет играть (по уважительным причинам).
Из документации вашей библиотеки кажется, что вы должны слушать SpeechSynthesisEvent
с PLAY_SUCCESSFUL
перед прочтением следующего предложения.
Если это соответствует вашим потребностям javax.speech.synthesis
имеет довольно простой механизм для ожидания, пока речь не закончится, проверьте его: http://java.sun.com/products/java-media/speech/forDevelopers/jsapi-guide/Synthesis.html