2011-11-25 3 views
0

У меня проблема с TTS в Service. Он действует так, как будто хочет говорить, но он никогда этого не делает. Наблюдая за LogCat, он печатает «Полученный TTS: текст, который он должен говорить», и я регистрирую его, когда он инициализируется, и это показывает успех. Я попытался создать поток для него, который не помог. onUtteranceComplete никогда не запускается. Я даже сделал то время цикла, как это (только для тестирования):TextToSpeech в службе

while(mTTS.isSpeaking()) { 
     Log.d("", "speaking"); 
} 

... и он никогда не говорил

Я знаю TTS настроен правильно, потому что он работает в обычном Activity

Вот мой код.

import java.util.HashMap; 
import java.util.Locale; 

import android.app.Service; 
import android.content.Intent; 
import android.media.AudioManager; 
import android.os.IBinder; 
import android.speech.tts.TextToSpeech; 
import android.speech.tts.TextToSpeech.OnInitListener; 
import android.speech.tts.TextToSpeech.OnUtteranceCompletedListener; 
import android.util.Log; 

public class TTSService extends Service implements OnInitListener, OnUtteranceCompletedListener { 
TextToSpeech mTTS; 

    @Override 
    public void onCreate() { 
     Log.d("", "TTSService Created!"); 
     mTTS = new TextToSpeech(getApplicationContext(), this); 


     //I've tried it in a thread.... 
     /*new Thread(new Runnable() { 
      @Override 
      public void run() { 
       HashMap<String, String> myHashStream = new HashMap<String, String>(); 
       myHashStream.put(TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf(AudioManager.STREAM_NOTIFICATION)); 
       myHashStream.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "1"); 

       mTTS.setLanguage(Locale.US); 
       //mTTS.setOnUtteranceCompletedListener(this); 
       mTTS.speak("I'm saying some stuff to you!", TextToSpeech.QUEUE_FLUSH, myHashStream);   
      } 

     }).start();*/ 

     //I've tried it not in a thread... 
     HashMap<String, String> myHashStream = new HashMap<String, String>(); 
     myHashStream.put(TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf(AudioManager.STREAM_NOTIFICATION)); 
     myHashStream.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "1"); 

     mTTS.setLanguage(Locale.US); 
     mTTS.setOnUtteranceCompletedListener(this); 
     mTTS.speak("I'm saying some stuff to you!", TextToSpeech.QUEUE_FLUSH, myHashStream);  

    } 

    @Override 
    public IBinder onBind(Intent intent) { 

     return null; 
    } 

    @Override 
    public void onInit(int status) { 
     Log.d("", "TTSService onInit: " + String.valueOf(status)); 
     if(status == TextToSpeech.SUCCESS){ 
      Log.d("", "TTS Success"); 
     } 
    } 

    public void onUtteranceCompleted(String uttId) { 
     Log.d("", "done uttering"); 
     if(uttId == "1") { 
      mTTS.shutdown(); 
     } 

    } 

} 

Благодаря

+0

Мне не удалось заставить это работать самостоятельно. Теперь я передаю информацию из службы обратно в свою деятельность, если она активна. – Ifor

+1

... да. У меня нет активности, с которой я могу это передать. – bwoogie

ответ

3

Хорошо, я получил это понял, сейчас Случилось то, что он пытался говорить до того, как был инициализирован TTS. Поэтому в потоке я жду, когда вы не будете == 999. После того, как он или что-то еще, мы позаботимся о том, чтобы говорить. Возможно, это небезопасно, поставив его в цикл while, но ... Тем не менее он работает.

import java.util.HashMap; 
import java.util.Locale; 

import android.app.Service; 
import android.content.Intent; 
import android.media.AudioManager; 
import android.os.IBinder; 
import android.speech.tts.TextToSpeech; 
import android.speech.tts.TextToSpeech.OnInitListener; 
import android.speech.tts.TextToSpeech.OnUtteranceCompletedListener; 
import android.util.Log; 

public class TTSService extends Service implements OnInitListener, OnUtteranceCompletedListener { 
TextToSpeech mTTS; 
int ready = 999; 
    @Override 
    public void onCreate() { 

     Log.d("", "TTSService Created!"); 
     mTTS = new TextToSpeech(getApplicationContext(), this); 

     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       while(ready == 999) { 
        //wait 
       } 
       if(ready==1){ 
       HashMap<String, String> myHashStream = new HashMap<String, String>(); 
       myHashStream.put(TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf(AudioManager.STREAM_NOTIFICATION)); 
       myHashStream.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "1"); 

       mTTS.setLanguage(Locale.US); 
       //mTTS.setOnUtteranceCompletedListener(this); 
       mTTS.speak("I'm saying some stuff to you!", TextToSpeech.QUEUE_FLUSH, myHashStream); 

       } else { 
        Log.d("", "not ready"); 
        } 
      } 

     }).start(); 


     stopSelf(); 

    } 

    @Override 
    public IBinder onBind(Intent intent) { 

     return null; 
    } 

    @Override 
    public void onDestroy() { 
     mTTS.shutdown(); 
     super.onDestroy(); 
    } 
    @Override 
    public void onInit(int status) { 
     Log.d("", "TTSService onInit: " + String.valueOf(status)); 
     if (status == TextToSpeech.SUCCESS) 
     { 
      ready = 1; 

     } else { 
      ready = 0; 
      Log.d("", "failed to initialize"); 
     } 

    } 

    public void onUtteranceCompleted(String uttId) { 
     Log.d("", "done uttering"); 
     if(uttId == "1") { 
      mTTS.shutdown(); 
     } 

    } 


} 
2

Я только что была аналогичная проблема - это было связано с mTTS.speak вызывается перед тем TTS была инициирована onInit(). Я решать несколько иначе, помещая mTTS.speak() в отдельную функцию, а затем вызвать эту функцию из onInit if (TextToSpeech.Successful), поэтому играет речь после она инициирована и не ранее (от onStart() ЭСТ).

Смежные вопросы