销毁 Nuance 会话
Destroy Nuance session
我有一个 activity 创建一个 "Audio" class 并尝试使用 android Text to Speech API 来阅读一些文本。如果不支持该语言,它会尝试使用 MediaPlayer 从服务器播放自定义 mp3 文件。最后,如果 MediaPlayer 失败,它会使用 Nuance SpeechKit 来读取文本:
我的问题是当我销毁 activity 时,我也想 destroy/stop Nuance 音频,但我不确定如何关闭 Nuance 音频。
Activity class
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();
}
音频class
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
}
如果我正在使用 Text to Speech 或 MediaPlayer,并且如果我销毁 Activity,音频将立即销毁。但如果正在播放 Nuance,我似乎无法破坏音频。它一直在说话。
我进行了一些调试,正在调用 pause() 和 destroy() 方法。另外 nuance.getAudioPlayer 不为 null 并且正在播放 AudioPlayer。当我对他调用 stop() 方法时,我找不到他不停止的原因。
什么是 Nuance?
这是我第一次使用 Nuance,所以我对此不是很熟悉。基本上我认为它是 Android Text to Speech 的替代品。
为什么我的项目中有这个?
我的项目有 4 种主要语言,我需要有一个文本到语音功能来阅读一些文本。问题是,androidText to Speech 不支持 Nuance 支持的其中一些语言。
为什么 Nuance 是我最后的选择?
因为 Nuance 有成本。我尝试使用 android TTS 或 MediaPlayer。只有当这两个都失败时,我才使用 Nuance。读我的文字是不得已的办法!
快速浏览 nuance API shows that session.speakString(...)
returns a Transaction,Transaction
有 2 种您可能感兴趣的方法:
cancel()
- 取消交易。
stopRecording()
- 如果正在进行录音,则停止录音并完成交易。
看来 cancel()
是您所需要的。
根据更改日志,此问题自一年前就已知,但尚未修复(根据更改日志)。
在他们给你固定版本之前,对于临时解决方案,你可以执行以下操作:
将您的文本分成小块,而不是一次播放完整的文本(作为音频),将这些小文本块放入音频播放器中,这样您的音频就会在播放完当前块后停止而不是完整的文本。
因为根据下面给出的更改日志中的已知问题:
请注意这一行:
但是,如果有多个Audio排队等待播放,调用了stop(),则下一个Audio不会开始播放,队列会被清空。
希望对您有所帮助。
尝试将会话设置为 null 以查看垃圾收集器是否解决了问题。
我有一个 activity 创建一个 "Audio" class 并尝试使用 android Text to Speech API 来阅读一些文本。如果不支持该语言,它会尝试使用 MediaPlayer 从服务器播放自定义 mp3 文件。最后,如果 MediaPlayer 失败,它会使用 Nuance SpeechKit 来读取文本:
我的问题是当我销毁 activity 时,我也想 destroy/stop Nuance 音频,但我不确定如何关闭 Nuance 音频。
Activity class
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();
}
音频class
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
}
如果我正在使用 Text to Speech 或 MediaPlayer,并且如果我销毁 Activity,音频将立即销毁。但如果正在播放 Nuance,我似乎无法破坏音频。它一直在说话。
我进行了一些调试,正在调用 pause() 和 destroy() 方法。另外 nuance.getAudioPlayer 不为 null 并且正在播放 AudioPlayer。当我对他调用 stop() 方法时,我找不到他不停止的原因。
什么是 Nuance?
这是我第一次使用 Nuance,所以我对此不是很熟悉。基本上我认为它是 Android Text to Speech 的替代品。
为什么我的项目中有这个?
我的项目有 4 种主要语言,我需要有一个文本到语音功能来阅读一些文本。问题是,androidText to Speech 不支持 Nuance 支持的其中一些语言。
为什么 Nuance 是我最后的选择?
因为 Nuance 有成本。我尝试使用 android TTS 或 MediaPlayer。只有当这两个都失败时,我才使用 Nuance。读我的文字是不得已的办法!
快速浏览 nuance API shows that session.speakString(...)
returns a Transaction,Transaction
有 2 种您可能感兴趣的方法:
cancel()
- 取消交易。
stopRecording()
- 如果正在进行录音,则停止录音并完成交易。
看来 cancel()
是您所需要的。
根据更改日志,此问题自一年前就已知,但尚未修复(根据更改日志)。
在他们给你固定版本之前,对于临时解决方案,你可以执行以下操作:
将您的文本分成小块,而不是一次播放完整的文本(作为音频),将这些小文本块放入音频播放器中,这样您的音频就会在播放完当前块后停止而不是完整的文本。
因为根据下面给出的更改日志中的已知问题:
请注意这一行:
但是,如果有多个Audio排队等待播放,调用了stop(),则下一个Audio不会开始播放,队列会被清空。
希望对您有所帮助。
尝试将会话设置为 null 以查看垃圾收集器是否解决了问题。