消灭Nuance会话

时间:2016-12-30 15:21:38

标签: java android audio destroy nuance

我有一个创建“Audio”类的活动,并尝试使用android Text to Speech API来读取一些文本。如果不支持该语言,它会尝试使用MediaPlayer从服务器播放自定义mp3文件。最后,如果MediaPlayer失败,它会使用Nuance SpeechKit来读取文本:

fluxogram

我的问题是当我销毁活动时,我想破坏/停止Nuance音频,我不知道如何关闭Nuance音频。

活动类

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
}

如果我正在使用Text to Speech或MediaPlayer,并且如果我销毁我的Activity,音频会立即被销毁。但是,如果Nuance正在播放,我似乎无法破坏音频。它只是在说话。

我做了一些调试,并调用了pause()和destroy()方法。此外,nuance.getAudioPlayer不为null并且是正在播放的AudioPlayer。当我在他身上调用方法stop()时,我无法找到他没有停止的原因。

什么是Nuance?

这是我第一次使用Nuance,所以我对此并不熟悉。基本上我认为它是Android Text to Speech的替代品。

Nuance Developers

为什么我的项目有这个?

我的项目有4种主要语言,我需要一个文本到语音功能来阅读一些文本。问题是,android Text to Speech不支持Nuance支持的其中一些语言。

为什么Nuance是我的最后一个选择?

因为Nuance有成本。我尝试使用android TTS或MediaPlayer。只有当这两个失败时,我才会使用Nuance。阅读我的文字是最后的手段!

3 个答案:

答案 0 :(得分:1)

根据更改日志,此问题自一年前就已知并且尚未修复(根据更改日志)。

对于临时解决方案,直到他们为您提供固定释放,您可以执行以下操作:

将文本分成小块,而不是一次播放完整的文本(如音频),将这些小文本块排队到音频播放器中,以便在完成播放当前块而非完整文本后音频将停止

因为根据下面给出的更改日志中的已知问题:

enter image description here

请注意这一行:

但是,如果多个Audios排队等待播放并且调用了stop(),则下一个音频将不会开始播放,队列将被清除。

我希望这会对你有所帮助。

答案 1 :(得分:0)

快速查看nuance API表示session.speakString(...)返回Transaction,而Transaction有2种方法可能会对您感兴趣:

cancel() - 取消交易 stopRecording() - 如果正在进行录制,请停止录制音频并完成交易。

看起来cancel()就是您所需要的。

答案 2 :(得分:0)

尝试将session设置为null以查看垃圾收集器是否解决了问题。