2011-01-11 20 views
26

Estoy implementando una aplicación de respuesta de voz interactiva en Android. Me gustaría saber cómo determinar cuándo ha funcionado la función tts.speak() para que pueda llamar a mi función de reconocimiento de voz.¿Cómo saber cuándo termina el TTS?

+0

puede comprobar esta respuesta esto está funcionando para mí http://stackoverflow.com/a/17921775/1355195 – Sanath

Respuesta

35
public class TTSActivity extends Activity implements OnInitListener, OnUtteranceCompletedListener, ... { 
private TextToSpeech mTts; 
........... 
private void speak(String text) { 
    if(text != null) { 
     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_UTTERANCE_ID, "SOME MESSAGE"); 
     mTts.speak(text, TextToSpeech.QUEUE_FLUSH, myHashAlarm); 
    } 
} 
// Fired after TTS initialization 
public void onInit(int status) { 
    if(status == TextToSpeech.SUCCESS) { 
     mTts.setOnUtteranceCompletedListener(this); 
    } 
} 
// It's callback 
public void onUtteranceCompleted(String utteranceId) { 
    Log.i(TAG, utteranceId); //utteranceId == "SOME MESSAGE" 
    } 
........... 
} 

LeerA good tutorial

+0

una pregunta, ¿por qué no ser llamado el método onUtteranceCompleted()? Intento hacerlo y no puedo hacer que me despidan. Gracias. – Felipeap

+0

Este método se activa cuando termina la síntesis de sonido. Este es el método de devolución de llamada. Así que no necesita llamar a este método. Es un oyente – mysuperass

+0

He actualizado mi respuesta. Por favor, lea el tutorial – mysuperass

1

me di cuenta de que hay personas que tienen problemas en el uso de síntesis de voz para pedir que la solución a que

Cómo saber cuándo está terminado TTS? sin uso setOnUtteranceCompletedListener

public void isTTSSpeaking(){ 

    final Handler h =new Handler(); 

    Runnable r = new Runnable() { 

     public void run() { 

      if (!tts.isSpeaking()) { 
       onTTSSpeechFinished(); 
      } 

      h.postDelayed(this, 1000); 
     } 
    }; 

    h.postDelayed(r, 1000); 
} 
14

El setOnUtteranceCompletedListener está obsoleta desde nivel API 15. En lugar de ello, utilizar setOnUtteranceProgressListener.

He encontrado un fragmento de código (here) que hace que sea muy fácil para mí saber cuando se termine de texto a voz:

@Override 
public void onInit(int status) { 
    if (status == TextToSpeech.SUCCESS) { 
     myTTS.setOnUtteranceProgressListener(new UtteranceProgressListener() { 
      @Override 
      public void onDone(String utteranceId) { 
       // Log.d("MainActivity", "TTS finished"); 
      } 

      @Override 
      public void onError(String utteranceId) { 
      } 

      @Override 
      public void onStart(String utteranceId) { 
      } 
     }); 
    } else { 
     Log.e("MainActivity", "Initilization Failed!"); 
    } 
} 

http://www.codota.com/android/scenarios/52fcbd34da0ae25e0f855408/android.speech.tts.TextToSpeech?tag=dragonfly

-1

utilizar un SpeakableListener cuándo texto para hablar.

private volatile boolean finished; 

private SpeakableListener listener = new SpeakableListener() { 

    @Override 
    public void markerReached(SpeakableEvent arg0) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void speakableCancelled(SpeakableEvent arg0) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void speakableEnded(SpeakableEvent arg0) { 
     TestSpeaker.this.finished = true; 

    } 

    @Override 
    public void speakablePaused(SpeakableEvent arg0) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void speakableResumed(SpeakableEvent arg0) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void speakableStarted(SpeakableEvent arg0) { 
     TestSpeaker.this.finished = false; 

    } 

    @Override 
    public void topOfQueue(SpeakableEvent arg0) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void wordStarted(SpeakableEvent arg0) { 
     // TODO Auto-generated method stub 

    } 
}; 

/** Speak the following string. */ 
public void sayIt(String str) { 
    System.out.print(" " + str + " "); 
    /* The the synthesizer to speak. */ 
    synthesizer.speakPlainText(str, listener); 
+1

¿De qué estás hablando? ¿Qué SpeakableListener? –

+0

cómo usar SpeakableListener? –

+0

esto no está disponible en Android – shelll

0

Pruebe este código siguiente que muestra un brindis después de que se complete TTS. Reemplace la tostada con su propia acción.

public class MainActivity extends AppCompatActivity implements TextToSpeech.OnInitListener{ 


private boolean initialized; 
private String queuedText; 
private String TAG = "TTS"; 
private TextToSpeech tts; 




@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 



    tts = new TextToSpeech(this /* context */, this /* listener */); 
    tts.setOnUtteranceProgressListener(mProgressListener); 


    speak("hello world"); 

} 




public void speak(String text) { 

    if (!initialized) { 
     queuedText = text; 
     return; 
    } 
    queuedText = null; 

    setTtsListener(); // no longer creates a new UtteranceProgressListener each time 
    HashMap<String, String> map = new HashMap<String, String>(); 
    map.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "MessageId"); 
    tts.speak(text, TextToSpeech.QUEUE_ADD, map); 
} 


private void setTtsListener() { 

} 





@Override 
public void onInit(int status) { 
    if (status == TextToSpeech.SUCCESS) { 
     initialized = true; 
     tts.setLanguage(Locale.ENGLISH); 

     if (queuedText != null) { 
      speak(queuedText); 
     } 
    } 
} 



private abstract class runnable implements Runnable { 
} 




private UtteranceProgressListener mProgressListener = new UtteranceProgressListener() { 
    @Override 
    public void onStart(String utteranceId) { 
    } // Do nothing 

    @Override 
    public void onError(String utteranceId) { 
    } // Do nothing. 

    @Override 
    public void onDone(String utteranceId) { 

     new Thread() 
     { 
      public void run() 
      { 
       MainActivity.this.runOnUiThread(new runnable() 
       { 
        public void run() 
        { 

         Toast.makeText(getBaseContext(), "TTS Completed", Toast.LENGTH_SHORT).show(); 

        } 
       }); 
      } 
     }.start(); 

    } 
}; } 
Cuestiones relacionadas