我有一个 Activity ,该 Activity 创建一个“Audio”类,并尝试使用android Text to Speech API读取一些文本。如果不支持该语言,它将尝试使用MediaPlayer从服务器播放自定义mp3文件。最后,如果MediaPlayer失败,它将使用Nuance SpeechKit读取文本:
我的问题是当我销毁 Activity 时,我也想销毁/停止Nuance音频,而且我不确定如何关闭Nuance音频。
Activity 类别
private Audio audio;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.my_layout);
audio = new Audio(this).play("my text to read");
}
@Override
protected void onPause() {
audio.pause();
super.onPause();
}
@Override
protected void onDestroy() {
audio.destroy();
super.onDestroy();
}
音频类
private TextToSpeech tts;
private MediaPlayer player;
private Session session;
public void play(String text) {
// check if supported
if (supported) tts.speak(text, TextToSpeech.QUEUE_FLUSH, null);
else mediaPlayer(text);
}
private void mediaPlayer(String text) {
// make some queries on server to find the file url
if (queryFoundFile) {
player = new MediaPlayer();
player.setDataSource(myFileUrl);
player.setAudioStreamType(3);
player.prepare();
player.start();
} else nuancePlayer(text);
}
private void nuancePlayer(String text) {
Transaction.Options options = new Transaction.Options();
options.setLanguage(new Language("eng-USA"));
session = Session.Factory.session(activity, myServer, appKey);
session.speakString(text, options, new Transaction.Listener() {
@Override
public void onError(Transaction transaction, String s, TransactionException e) {
e.printStackTrace()
}
});
// it reaches here and nuance plays the audio
}
// these are the methods I call when the activity is paused or destroyed
public void pause() {
if (tts != null) tts.stop();
if (player != null) player.stop();
if (nuance != null) nuance.getAudioPlayer().stop(); // don't work
}
public void destroy() {
if (tts != null) tts.shutdown();
if (player != null) player.release();
if (nuance != null) nuance.getAudioPlayer().stop(); // don't work
}
如果我使用的是文字转语音或MediaPlayer,并且销毁了Activity,则音频将立即销毁。但是如果Nuance正在播放,我似乎无法销毁音频。它一直在说话。
我做了一些调试,然后调用了pause()和destroy()方法。 nuance.getAudioPlayer也不为空,并且正在播放AudioPlayer。当我对他调用stop()方法时,我找不到他不停止的原因。
什么是Nuance?
这是我第一次使用Nuance,所以我对此没有经验。基本上,我认为它是Android Text to Speech的替代方案。
Nuance Developers
为什么在我的项目中有这个?
我的项目有4种主要语言,我需要具有文本转语音功能才能阅读一些文本。问题是,Android Text to Speech不支持Nuance支持的某些语言。
为什么Nuance是我的最后选择?
因为Nuance有成本。我尝试使用android TTS或MediaPlayer。仅当这两个失败时,我才使用Nuance。这是阅读我的文字的最后选择!
最佳答案
根据更改日志,此问题自一年前就已知,并且尚未解决(根据更改日志)。
对于临时解决方案,直到他们给您固定版本,您可以执行以下操作:
将文本分成小块,而不是立即播放完整文本(作为音频),而是将这些小文本块排入音频播放器,以便在播放完当前块而不是完整文本后停止播放音频。
因为按照下面给出的更改日志中的已知问题:
请注意这一行:
但是,如果将多个音频排队等待播放并调用stop(),则下一个音频将不会开始播放,并且将清除队列。
我希望这能帮到您。