2015-12-28 1 views
1

Так что я пишу приложение, которое создает WAV-файл какого-либо устного текста через TextToSpeech. Я подтвердил, что файл успешно созданAndroid: Воспроизведение WAV, созданное TTS

Когда я затем попытаться воспроизвести его, то приложение падает с

FATAL ИСКЛЮЧЕНИЕ: главный процесса: com.burfdevelopment.lejostoandroid, PID: 6539 java.lang .IllegalStateException на android.media.MediaPlayer._setDataSource (нативный метод) на android.media.MediaPlayer.setDataSource (MediaPlayer.java:1133) на android.media.MediaPlayer.setDataSource (MediaPlayer.java:1118) на android.media.MediaPlayer.setDataSource (MediaPlayer.java:1097) в android.media.MediaPlayer.setDataSource (MediaPlayer.java:1046) на com.burfdevelopment.lejostoandroid.MainActivity.speakWords (MainActivity.java:351) на com.burfdevelopment.lejostoandroid.MainActivity.onInit (MainActivity.java:436) на android.speech.tts.TextToSpeech.dispatchOnInit (TextToSpeech.java:814) на android.speech.tts.TextToSpeech.-wrap4 (TextToSpeech.java) at android.speech.tts.TextToSpeech $ Connection $ SetupConnectionAsyncTask.onPostExecute (TextToSpee ch.java:2174) на android.speech.tts.TextToSpeech $ Подключение $ SetupConnectionAsyncTask.onPostExecute (TextToSpeech.java:2168) в android.os.AsyncTask.finish (AsyncTask.java:651) в android.os .AsyncTask.-wrap1 (AsyncTask.java) на android.os.AsyncTask $ InternalHandler.handleMessage (AsyncTask.java:668) в android.os.Handler.dispatchMessage (Handler.java:102) в android.os .Looper.loop (Looper.java:148) на android.app.ActivityThread.main (ActivityThread.java:5417) на java.lang.reflect.Method.invoke (собственный метод) на com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:726) в com.android.internal.os.ZygoteInit.main (ZygoteInit.java:616)

Код

private void speakWords(String speech) { 
     //implement TTS here 
     if (speech != null && speech.length() > 0) { 

      // 
      HashMap<String, String> myHashAlarm = new HashMap<String, String>(); 
      myHashAlarm.put(TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf(AudioManager.STREAM_ALARM)); 
      myHashAlarm.put(TextToSpeech.Engine.KEY_PARAM_VOLUME, "1"); 
      myHashAlarm.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "SOME MESSAGE"); 

      String root = Environment.getExternalStorageDirectory().toString(); 

      soundFilename = root + "/simon.wav"; 
      soundFile = new File(soundFilename); 
      if (soundFile.exists()) 
       soundFile.delete(); 

      if(myTTS.synthesizeToFile(speech, myHashAlarm, soundFilename)== TextToSpeech.SUCCESS) { 

       try { 
        mMediaPlayer.setDataSource(soundFilename); 
        mMediaPlayer.prepare(); 
        mMediaPlayer.start(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
      else { 
       Toast.makeText(getBaseContext(),"Oops! Sound file not created",Toast.LENGTH_SHORT).show(); 
      } 

     } 
    } 

Я могу воспроизвести файл на реальном устройстве через FileManager. Я попытался воспроизвести его позже, я попробовал просто сыграть в файл. Линия источника данных - это место, где он сбой.

mMediaPlayer.setDataSource (soundFilename);

ответ

2

Попробуйте использовать следующий код.

// Make sure you are writing access permission in Manifest. 
soundFilename = Environment.getExternalStorageDirectory() + "/simon.wav"; 

mMediaPlayer = new MediaPlayer(); 
mMediaPlayer.setDataSource(soundFilename); 

mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() 
{ 
    @Override 
    public void onPrepared(MediaPlayer mp) 
    { 
     mMediaPlayer.start(); 
    } 
}); 
mMediaPlayer.prepareAsync(); 
+0

Что я сделал неправильно? – Burf2000

+1

'mMediaPlayer.start();' выбрал исключение. Средства массовой информации не были подготовлены при вызове 'start()'. Вы должны вызвать 'start()' в 'onPrepared()' с помощью прослушивателя. –