2016-12-30 15 views
4

"Audio"クラスを作成し、アンドロイドのText to Speech APIを使用してテキストを読み取ろうとするアクティビティがあります。言語がサポートされていない場合、MediaPlayerを使用してサーバーからカスタムmp3ファイルを再生しようとします。 MediaPlayerのに失敗した場合は最後に、テキストを読むためにニュアンスSpeechKitを使用しています。ニュアンスセッションを破棄する

fluxogram

私の問題は、私は活性を破壊したとき、私は破壊/あまりにもニュアンスの音声を停止したいと私はどのようにわからないです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のにテキストを使用している場合は、私は私の活動を破壊した場合、音声がすぐに破壊されます。しかし、ニュアンスが演奏されているなら、私はオーディオを破壊するようには思えません。ただ話し続けるだけです。

私はいくつかのデバッグを行い、pause()メソッドとdestroy()メソッドが呼び出されています。また、nuance.getAudioPlayerはnullではなく、再生中のAudioPlayerです。私は彼にstop()メソッドを呼び出すと、彼が止まらない理由を見つけることができません。


ニュアンスとは何ですか?

ニュアンスを使用しているのはこれが初めてのことです。これはこれに熟練していません。基本的に私はそれをAndroid Text to Speechの代替品のように見ています。私は私のプロジェクトでこれを持っているのはなぜ

Nuance Developers

私のプロジェクトには4つの主要言語があり、テキストを読むにはテキスト読み上げ機能が必要です。問題は、AndroidのText to Speechが、Nuanceがサポートしているこれらの言語の一部をサポートしていないことです。

なぜニュアンスが最後の選択肢ですか?

ニュアンスにはコストがかかります。私はアンドロイドTTSまたはMediaPlayerを使用しようとします。それらの2つが失敗した場合にのみ、私はNuanceを使用します。それは私のテキストを読む最後の手段です! - トランザクションをキャンセル

cancel()

+0

少し時間があるなら、私は 'ニュアンス'について聞いて嬉しいです。あなたが使っているものは何ですか?それはどのように役立ちますか?私は見当もつかない -__- 。それについて聞くのが大好きです:)あなたも+1を得ることができるかもしれません –

+0

私は今答えることができるいくつかの質問で編集しました!希望が助けてくれる!ありがとう! – Ravers

+0

あなたが問題の状態にあってもそれが本当に感謝してくれてありがとうございます+1 –

答えて

1

変更ログごとに、この問題は1年前から知られており、まだ変更されていません(変更ログごとに)。

は小さなチャンクにテキストを解除し、代わりに一度に(オーディオとして)完全なテキストを再生する、にこれらの小さなテキストチャンクをキューに入れられ:一時的な解決のために

は、彼らはあなたが次の操作を行うことができ、固定解除を与えたまであなたがオーディオが完全なテキストの代わりに現在のチャンクを終了した後に停止するようにします。理由は以下に示す変更ログの既知の問題につきとして

enter image description here

この行に注意してください:複数のオーディオ再生のためにキューに入れられ、停止された場合(ただし、

を)されます呼び出されると、次のAudioは再生を開始せず、キューはクリアされます。

これがあなたに役立つことを願っています。

+0

私はこのaproachに関することは一度もありません。これは今のところもっと良い解決策だと思います。 1年に1度のバグがまだ解決されていないのは残念です! – Ravers

0

nuance APIで簡単に見にsession.speakString(...)Transactionを返し、Transactionはあなたのために関心があるかもしれない2つのメソッドを持っていることを示しています。
stopRecording() - 録音を停止し、進行中の録音がある場合はトランザクションを完了します。

cancel()のように見えます。

+0

お返事ありがとうございます!しかし残念ながら、私はすでに取引でcancel()とstopRecording()の両方を試していますが、どちらもうまくいきませんでした。 – Ravers

+0

あなたは 'session.getAudioPlayer()。stop()'を試しましたか? docs:https://developer.nuance.com/public/Help/DragonMobileSDKReference_Android/Audio-playback.html#freeing-resources –

+0

はい、私はしました。それも運がない。 – Ravers

0

セッションをnullに設定して、ガベージコレクタが問題を解決しているかどうかを確認してください。

関連する問題