2012-02-26 24 views
9

Estoy desarrollando una aplicación muy simple aquí. Es para mi hija de parálisis cerebral. Es solo un gran SÍ y NO botones, por lo que puede presionarlos cuando lo solicite.Android no reconoce el motor TTS

Bueno ... Estoy usando SVOX Classic TTS Engine.

Todo funcionaba sin problemas hasta que mi tableta se actualizó a ICS. Ahora, cada vez que ejecuto la aplicación, abre el Market pidiéndome que instale TTS. Pulso "volver" y luego, mi aplicación habla. Esto es MUY molesto.

Esto es lo que Google API dice:

* Una prueba con éxito estará marcado por un código de resultado CHECK_VOICE_DATA_PASS, que indica que este dispositivo está listo para hablar, después de la creación de nuestro objeto de síntesis de voz. De lo contrario, debemos informar al usuario de la instalación de los datos necesarios para que el dispositivo se convierta en una máquina parlante multilingüe. La descarga e instalación de los datos se realiza activando ACTION_INSTALL_TTS_DATA, que llevará al usuario a Android Market y le permitirá iniciar la descarga. La instalación de los datos se realizará automáticamente una vez que se complete la descarga. Este es un ejemplo de lo que su implementación de onActivityResult() se vería así: *

Aquí está mi código:

public class yesOunoActivity extends Activity implements OnInitListener{ 
ImageView yes; 
ImageView no; 
public TextToSpeech tts; 
private int MY_DATA_CHECK_CODE = 0; 

@Override 
public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    Intent checkIntent = new Intent(); 
    checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA); 
    startActivityForResult(checkIntent, MY_DATA_CHECK_CODE); 

    tts = new TextToSpeech(this, this); 

    setContentView(R.layout.yesorno); 

    yes = (ImageView) findViewById(R.id.yes); 
    no = (ImageView) findViewById(R.id.no); 


    yes.setClickable(true); 
    yes.setOnTouchListener(new OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent arg1) { 

      if (arg1.getAction() == android.view.MotionEvent.ACTION_DOWN) {        
       tts.speak("yes!", TextToSpeech.QUEUE_ADD, null); 
      } 
      return true; 
     } 
    }); 


    no.setClickable(true); 
    no.setOnTouchListener(new OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent arg1) { 

      if (arg1.getAction() == android.view.MotionEvent.ACTION_DOWN) {        

       //Intent myIntent = new Intent(v.getContext(), ParametrosActivity.class); 
       tts.speak("no!", TextToSpeech.QUEUE_ADD, null); 
      } 
      return true; 
    } 

    }); 


} 


@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == MY_DATA_CHECK_CODE) { 
     if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) { 
      // success, create the TTS instance 
      tts = new TextToSpeech(this, this); 
     } else { 
      // missing data, install it 
      //ATTENTION: BELOW THIS GIVES ME PROBLEMS SINCE IT OPENS MARKET 
      //AND I HAVE TO HIT THE BACK BUTTON, THEN, IT SPEAKS! 
      //BTW TTS ENGINE "IS" INSTALLED!! 
      Intent installIntent = new Intent(); 
      installIntent 
        .setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA); 
      startActivity(installIntent); 
     } 
    } 

} 

@Override 
public void onInit(int status) { 
    if (status == TextToSpeech.SUCCESS) { 
    } else if (status == TextToSpeech.ERROR) { 
    } 
} 

@Override 
public void onDestroy() { 
    if (tts != null) { 
     tts.stop(); 
     tts.shutdown(); 
    } 
    super.onDestroy(); 
    System.gc(); 
} 

    } 

Si quito la zona con "atención" más arriba (ya que estoy seguro de que tengo TTS instalado), funciona la primera vez que ejecuto la aplicación, si dejo la aplicación y la vuelvo a abrir, dice "ha fallado: no está vinculado al motor de tts"

Parece que no crea el objeto TTS ya que la aplicación aún está en la memoria.

Entonces, chicos ... ¿qué piensan ustedes que debería hacer?

Esto me está volviendo loco y realmente necesito comunicarle a mi hija a través de la tableta.

¡Cualquier ayuda es apreciada!

+0

@Carols Pereira - ¿Pudo resolver este problema?un usuario informó que están teniendo el mismo problema al que se enfrentó, pero cuando lo probamos en emulador funcionó bien para nosotros. ¿Pudo identificar la causa raíz de este problema? ¿Fue un error en svox? – aquero

Respuesta

0

Esto es lo que tengo en onActivityResult(...)

@Override 
protected void onActivityResult(
     int requestCode, int resultCode, Intent data) { 
    if (requestCode == MY_DATA_CHECK_CODE) { 
/* 
     if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) { 
      // success, create the TTS instance 
      mTts = new TextToSpeech(this, this); 
     } else { 
      // missing data, install it 
      Intent installIntent = new Intent(); 
      installIntent.setAction(
       TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA); 
      startActivity(installIntent); 
     } 
*/ 
     if (mTts==null) { 
      Intent installIntent = new Intent(); 
      installIntent.setAction(
       TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA); 
      startActivity(installIntent);       
     } 
     mTts = new TextToSpeech(this, this);     
    } 
} 

En lugar de utilizar if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) {...}, puedo comprobar si mTts ya ha sido creada. También deberá configurar mTts como static, como lo mencionaron jlquant y Rakesh en una publicación anterior, por lo que solo tendrá una instancia de este. Por ejemplo, private static TextToSpeech mTts.

Por lo tanto, a menos que "fuerce la detención" de la aplicación o deje de funcionar debido a un error, ya no llamará al startActivity(installIntent);, el molesto culpable que le pide que instale TTS siempre.

0

en mi aplicación También usé checkintent.setAction(...) para comprobar si los archivos tts necesarios están instalados (lo que funcionaba como un amuleto antes de actualizar a ICS). En ICS siempre devuelve que los archivos faltan. Así que ahora simplemente ignoro esta comprobación: estoy creando el objeto y se inicializa bien. Además, estaba usando dos instancias para dos idiomas diferentes. Esto también parece no funcionar más. Ahora cuando configuro el idioma para una de las instancias, la otra instancia del objeto se establece en el mismo idioma (se comporta como una instancia).

0

i fijo esto instalando ivona tener ambos motores Tts curar todos los problemas, a pesar de que estoy encontrando otras cuestiones, como no hay TTS por defecto se instala utilizando los dos juntos hace que uno no obra una gran solución, pero su arreglo s,

También no puedo encontrar la opción para permitir que mi teléfono instale aplicaciones que no sean de mercado, es decir, apk desde mi tarjeta SD

+1

Debe conectar su teléfono a la PC a través de un cable de depuración USB y luego en el tipo de línea de comando: adb install Erol

0

Tuve el mismo problema y lo resolví. Tal vez es un problema de tiempo en el límite, no estoy seguro, pero una simple acción antes de hablar me ayudó. De todos modos lo hice:

mTts = new TextToSpeech(this, this);

String engine = mTts.getDefaultEngine();

mTts = new TextToSpeech(this, this,engine);

Log.d("","...something here...");

Luego, cuando llegué a mi botón de hablar, habla. Debería ver su estado de variable en el método OnInit. Tal vez un separate thread puede ayudar a hablar en la aplicación.

Por cierto, si está seguro de que TTS está instalado, puede quitar el bloque Intent checkIntent = new Intent(); para verificar.

Definitivamente espero que esto te ayude.

1

Tuve este problema en mi aplicación también: TTS funciona en 2.3, pero cuando probé 4.0, tenía los mismos síntomas que tu problema (que acabo de encontrar ahora mientras busco una solución). El motor funcionaría si cerrara la aplicación a través de Configuraciones y lo iniciara de nuevo, pero simplemente "retrocediera" y regresara haciendo que el motor TTS en ICS no se vincule.

Intenté configurar el objeto TTS (mTts) en nulo después de ejecutar mTts.shutdown(). Cuando comencé la aplicación nuevamente después de dar marcha atrás, recibí un error nulo en mi línea mTts.speak().

Al menos para ICS, algo no está dejando ir el motor TTS. Mi solución (por ahora) es que he hecho mis TTS objeto estático:

// in Activity 
private static TextToSpeech mTts; 
. 
. 
. 
// in onCreate() 
mTts = new TextToSpeech(this, this); 
. 
. 
. 
// in onDestroy() 
if (mTts != null) { 
    mTts.stop(); 
    mTts.shutdown(); 
    mTts = null; 
} 

que ya sólo se estaba utilizando un objeto TTS para la aplicación, así que no creo que haya demasiados inconvenientes para Este enfoque.

-1

de pan de jengibre permitió ajuste del TTS por defecto en la entrada de voz & de salida/default TTS sólo

jengibre permite TTS 'preferidos' en la lengua y de entrada/salida de texto a voz.

por lo que se prefiere tts en lugar de predeterminado, lo que significa que no es tan claro como para qué se usa.

El valor predeterminado con anulaciones de aplicaciones donde se indica es una mejor opción, creo.

Cuestiones relacionadas