2016-12-30 10 views
4

У меня есть активность, которая создает класс «Аудио» и пытается использовать андроид Text to Speech API для чтения некоторого текста. Если язык не поддерживается, он пытается использовать MediaPlayer для воспроизведения пользовательского mp3-файла с сервера. Наконец, если MediaPlayer не удается, он использует Nuance SpeechKit читать текст:Уничтожить сеанс Nuance

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 
} 

Если я использую текст в речь или MediaPlayer, и если я разрушаю свою активность, звук немедленно уничтожается. Но я не могу уничтожить звук, если играет Нюанс. Он просто продолжает говорить.

Выполнены некоторые отладки и вызывается методы pause() и destroy(). Также nuance.getAudioPlayer не является нулевым и является проигрывателем AudioPlayer. Я не могу найти причину, по которой он не останавливается, когда я вызываю метод stop() на него.


Что такое нюанс?

Это мой первый раз, когда я использую Nuance, поэтому я не настолько опытен с этим. В основном я рассматриваю это как альтернативу Android Text to Speech.

Nuance Developers

Почему я это на мой проект?

В моем проекте есть 4 основных языка, и мне нужно иметь текстовую функцию для чтения текста. Проблема в том, что андроид Text to Speech не поддерживает некоторые из этих языков, поддерживаемых Nuance.

Почему Нюанс мой последний вариант?

Поскольку у Nuance есть издержки. Я пытаюсь использовать android TTS или MediaPlayer. Только если эти два неудачных, я использую Nuance. Последнее средство, чтобы прочитать мой текст!

+0

Если у вас есть небольшое время, я буду рад услышать о «Нюансе». Для чего вы это используете и как это полезно? Я понятия не имею -__- . Хочется услышать об этом :) может быть, вы можете получить +1 слишком –

+0

Я отредактировал некоторые вопросы, на которые я могу ответить сейчас! Надеюсь, это поможет! Благодаря! – Ravers

+0

круто спасибо за ваше время за то, что действительно цените его, даже если вы находитесь в состоянии проблемы +1 –

ответ

1

Согласно журналу изменений эта проблема известна с года назад и еще не установлена ​​(в соответствии с изменением).

Для временного решения, пока они не дали вам фиксированный релиз вы можете сделать следующее:

Разбейте текст на небольшие куски, и вместо того, чтобы играть полный текст (как аудио) сразу, Queued эти небольшие текстовые куски в аудио-плеер, так что звук будет прекращен после завершения воспроизведения текущего фрагмента вместо полного текста.

потому, что в соответствии с известной проблемой в журнале изменений приведены ниже:

enter image description here

Обратите внимание эту строку:

Однако, если несколько Audios в очередь для воспроизведения и остановки() является , затем следующее аудио не начнет воспроизведение, и очередь будет очищена.

Я надеюсь, что это поможет вам.

+0

Я никогда не об этом вопросе, и я думаю, что это лучшее решение на данный момент. Все еще сосет, что ошибка в течение года еще не решена! – Ravers

0

Быстрый взгляд на nuance API показывает, что session.speakString(...) возвращает Transaction и Transaction имеет 2 методы, которые могут представлять интерес для Вас:

cancel() - отменить сделку.
stopRecording() - Прекратите запись звука и завершите транзакцию, если есть текущая запись.

Похоже, cancel() - это то, что вам нужно.

+0

Спасибо за ответ! Но, к сожалению, я уже пробовал отменять() и stopRecording() в транзакции, и никто из них не работал. – Ravers

+0

Вы пробовали: 'session.getAudioPlayer(). Stop()'? как указано в документах: https://developer.nuance.com/public/Help/DragonMobileSDKReference_Android/Audio-playback.html#freeing-resources –

+0

Да, я это сделал. Не повезло и с этим. – Ravers

0

Попробуйте установить сеанс равным нулю, чтобы узнать, разрешает ли сборщик мусора проблему.