2010-06-12 5 views
2

J'ai essayé ce qui suit sur l'émulateur mais le démarrage de l'application provoque une erreur d'exécution. quelqu'un pourrait m'aider s'il vous plaît à ce sujet. Heres' le code i essayéune application Text to speech de base ne fonctionnait pas

package com.example.TextSpeaker; 

import java.util.Locale; 
import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.speech.tts.TextToSpeech; 
import android.speech.tts.TextToSpeech.OnInitListener; 

public class TextSpeaker extends Activity { 
/** Called when the activity is first created. */ 
int MY_DATA_CHECK_CODE = 0; 
private TextToSpeech mtts; 
String test1="hello world"; 
String test2="hi i am working fine"; 
    @Override 

    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    Intent myintent = new Intent(); 
    myintent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA); 
    startActivityForResult(myintent, MY_DATA_CHECK_CODE); 
} 
    protected void onActivityResult(int requestcode,int resultcode,Intent data) 
    { 
     if(requestcode == MY_DATA_CHECK_CODE) 
     { 
      if(resultcode==TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) 
      { 
       // success so create the TTS engine 
       mtts = new TextToSpeech(this,(OnInitListener) this); 
       mtts.setLanguage(Locale.ENGLISH); 
       mtts.speak(test1, TextToSpeech.QUEUE_FLUSH, null); 
       mtts.speak(test2, TextToSpeech.QUEUE_FLUSH, null); 
      } 
      else 
      { 
       //install the Engine 
       Intent install = new Intent(); 
       install.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA); 
       startActivity(install); 
      } 
     } 

    } 


} 
+1

Quelle est l'erreur d'exécution? – Chris

+0

l'erreur est: l'application TextSpeaker s'est arrêté de manière inattendue – pranay

+0

la trace de la pile est http://pastebin.com/0asLcb5p – pranay

Répondre

0

Je suis tombé par hasard sur cette question plus d'un an après avoir été affiché, mais je vais aller de l'avant et répondre de toute façon, dans l'espoir pure que ça va aider tout le monde d'autre qui finit ici dans le futur.

J'écris ceci contre 2.1, des excuses si vous travaillez avec < 2.1 (aucune balise sur la question)

Il y a quelques choses que je peux repérer immédiatement que vous pouvez donner un peu de chagrin.

Tout d'abord, les éléments suivants:

mtts.speak(test1, TextToSpeech.QUEUE_FLUSH, null); 
mtts.speak(test2, TextToSpeech.QUEUE_FLUSH, null); 

Si je comprends bien TextToSpeech API, en utilisant QUEUE_FLUSH va débusquer tout thats actuellement parlées, il est donc possible que la deuxième ligne est en cours d'exécution avant la première a effectivement parlé, et vous expérimenterez ce que vous avez dit plus haut, que seul le dernier est parlé.

Idéalement, vous ne voulez qu'une seule de ces lignes là, si l'utilisateur place une chaîne différente, il vous suffit de la passer et de la laisser sortir.

Ensuite, vous devriez investir dans un override onDestroy, ici vous pouvez arrêter l'objet mtts, cela empêche votre application de monopoliser l'utilisation du moteur TTS, c'est toujours agréable de libérer des ressources quand vous avez fini avec eux, vous ne laissez pas un ResultSet ouvert maintenant, vous?

@Override 
    public void onDestroy 
      () { 
     // Don't forget to shutdown! 
     if (mTts != null) { 
      mTts.stop(); 
      mTts.shutdown(); 
     } 

     super.onDestroy(); 
    } 

En outre, comme vous le dites, cela ne fera que parler anglais, en raison de la ligne que vous utilisez:

mtts.setLanguage(Locale.ENGLISH); 

facile à corriger, simplement définir un lieu différent. Peut-être avoir quelques boutons et définir les paramètres régionaux en conséquence. Je crois que le moteur Google TTS ne supporte actuellement que l'anglais, le français, l'allemand, l'italien et l'espagnol, mais les moteurs TTS tiers peuvent offrir plus.

Si tout le reste échoue, j'ai écrit un tutorial here qui pourrait être utile.

Bonne chance!