Android Discours de Reconnaissance de la Parole: la répétition d'Appel de SpeechRecognizer.startListening() échoue sur JB 4.1.2

J'ai un service où je suis coups de pied hors de reconnaissance vocale auditeur à plusieurs reprises pour que je puisse avoir un ouvert de session pour l'utilisateur de parler. La classe s'occupe également de la question de Jelly Bean où un ERROR_SPEECH_TIMEOUT est levée si la voix est entendue dans les 5 secondes. Donc, fondamentalement, cela fonctionne. Cependant si j'ai appeler à plusieurs reprises de reconnaissance.startListening(recognizerIntent) , il échoue silencieusement, comme en témoigne le fait que onBeginningOfSpeech() n'est jamais appelée dans ce cas. Maintenant, SI je n'arrive pas à en parler à tous mes Jelly Bean délai gestionnaire de redémarrage de l'auditeur à chaque fois sans faute. Elle semble être la seule à échouer après onResults() est appelé, car la parole a ÉTÉ entendue. Après onResults() est appelée, de reconnaissance.startListening(recognizerIntent) est certainement appelé, mais comme je l'ai dit, rien ne se passe. Lorsqu'elle échoue, elle est aléatoire et il n'y a rien dans le Logcat pour indiquer ce qu'est la question. Je ne sais pas quoi d'autre pour essayer. Espérons que l'un de vous Android de reconnaissance de la Parole des experts là-bas a vu ça avant...

Minimum: 2.2
Cible: les Tests sur JB : Android 4.1.2


PLUS D'INFOS (11-01-13)
4.3 mise à Jour de mon HTC One a certainement répondu à cette question. Mon service de reconnaissance Vocale ci-dessous est maintenant fiable & précis. Je l'ai depuis au moins quelques minutes sans erreur. Comme pour 4.1.2, avant ma mise à jour 4.3, il semble avoir été mieux (Google n'a rien changer à leur fin?)...Je ne sais pas, mais c'est encore manquerait quelques paroles, et parfois sans erreur, il suffit d'arrêter d'écouter (onBeginningOfSpeech() n'est jamais appelée dans ce cas). Je suppose que je vais juste avoir à en avertir les utilisateurs sur Android 4.1.2 en ce qui concerne cette question parce que j'ai été aussi loin que je peux aller dans mon code.

PLUS D'INFOS (09-17-13)
Soi-disant, il y a une mise à jour Android (4.3) en venant de HTC à la fin du mois de septembre (http://www.ubergizmo.com/2013/09/htc-one-to-receive-android-4-3-jelly-bean-update-this-september/). Donc j'espère que ça va résoudre ce problème sur cet appareil. La question demeure cependant pour mes utilisateurs de l'application qui sont en cours d'exécution Android 4.1.2 et bloqué sur cette version pour un temps. Je ne sais toujours pas quoi faire dans ces cas, et j'espère que c'est la SEULE version d'Android avec ce problème. Est-il possible de savoir combien d'appareils sont en cours d'exécution 4.1.2??

PLUS D'INFOS (09-15-13)
Dans ce post ici: Google de reconnaissance vocale n'a pas commence sur Android 4.x. L'état auteur affirme qu'il est de voir cette question sur son HTC one. J'ai également un HTC one que je vois ce problème sur (Android 4.1.2) . Je me demande si c'est un cas unique pour le HTC one? (ou tout autre appareil fonctionnant sous Android 4.1.2) - je ne peux pas confirmer que c'est difficile de tester sur tous les derniers appareils fonctionnant JB. L'auteur affirme en outre que son Nexxus avec 4.2.2 fonctionne très bien. Quelqu'un peut-il me dire sur quel appareil ils voient ce problème?

PLUS D'INFOS (9-08-13)
Juste pour confirmer, il n'y a pas de problème avec mon code, j'ai aussi testé sur Android 2.3.3 et j'ai été en mesure d'appeler onResult() > startListening() 25 fois dans une rangée. Lorsque ciblant Android 4.1.2, je ne suis jamais en mesure d'obtenir au-delà de 3 ou 4 appels. Je ne peux pas croire que personne n'a rencontré ce problème?

public class VoiceRecogService extends Service
{
protected AudioManager mAudioManager; 
protected SpeechRecognizer mSpeechRecognizer;
protected Intent mSpeechRecognizerIntent;
protected RecognitionListener mSpeechRecognizerListner;
//protected final Messenger mServerMessenger = new Messenger(new IncomingHandler(this));
protected volatile boolean mIsListening;
protected volatile boolean mIsCountDownOn;
static final int MSG_RECOGNIZER_START_LISTENING = 1;
static final int MSG_RECOGNIZER_CANCEL = 2;
private int mBindFlag;
private Messenger mServiceMessenger;
private Context m_ctx;
private Handler mHandler = new Handler();
//private boolean m_bReadyForSpeechReceived = false;
@Override
public void onCreate()
{
super.onCreate();
m_ctx = this;
mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); 
//do not mute beep when speech listening first kicks off
Log.d("TESTING: SPEECH SERVICE: CALL START", "onCreate()"); 
startListening(false);
}
private void startListening(boolean bMuteSound){
Log.d("TESTING: SPEECH SERVICE: startListening()", mIsListening? "true":"false"); 
if (bMuteSound==true && Build.VERSION.SDK_INT >= 16)//Build.VERSION_CODES.JELLY_BEAN)
{
//turn off beep sound  
mAudioManager.setStreamMute(AudioManager.STREAM_SYSTEM, true);
}
if (!mIsListening)
{
//mSpeechRecognizer.startListening(mSpeechRecognizerIntent);
recognizeSpeechDirectly ();
mIsListening = true;
}
}
/////////////////////////////////////////////////////////////////////////
/**
* lazy initialize the speech recognizer
*/
private SpeechRecognizer getSpeechRecognizer()
{
if (mSpeechRecognizer == null)
{
mSpeechRecognizer = SpeechRecognizer.createSpeechRecognizer(m_ctx);
}
return mSpeechRecognizer;
}
private RecognitionListener getSpeechRecognizerListner()
{
if (mSpeechRecognizerListner == null)
{
mSpeechRecognizerListner = new SpeechRecognitionListener();
}
return mSpeechRecognizerListner;
}
private void recognizeSpeechDirectly()
{
Intent recognizerIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
recognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
//accept partial results if they come
recognizerIntent.putExtra(RecognizerIntent.EXTRA_PARTIAL_RESULTS, true);
recognizeSpeechDirectly(m_ctx,recognizerIntent, getSpeechRecognizerListner(), getSpeechRecognizer());
}
public static void recognizeSpeechDirectly(Context context, 
Intent recognizerIntent, 
RecognitionListener listener,
SpeechRecognizer recognizer)
{
//need to have a calling package for it to work
if (!recognizerIntent.hasExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE))
{
recognizerIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, "com.dummy");
}
recognizer.setRecognitionListener(listener);
recognizer.startListening(recognizerIntent);
}
////////////////////////////////////////////////////////////////////////////
public void stop()
{
if (getSpeechRecognizer() != null)
{
getSpeechRecognizer().stopListening();
getSpeechRecognizer().cancel();
getSpeechRecognizer().destroy();
mIsListening = false;
if (Build.VERSION.SDK_INT >= 16);//Build.VERSION_CODES.JELLY_BEAN)
mAudioManager.setStreamMute(AudioManager.STREAM_SYSTEM, false);
}
}
//Count down timer for Jelly Bean work around
protected CountDownTimer mNoSpeechCountDown = new CountDownTimer(5000, 5000)
{
@Override
public void onTick(long millisUntilFinished)
{
//TODO Auto-generated method stub
}
@Override
public void onFinish()
{
mIsCountDownOn = false;
Log.d("TESTING: SPEECH SERVICE: CALL START", "onFinish()"); 
startListening(true);
}
};
@Override
public void onDestroy()
{
super.onDestroy();
if (mIsCountDownOn)
{
mNoSpeechCountDown.cancel();
}
if (mSpeechRecognizer != null)
{
mSpeechRecognizer.destroy();
}
}
protected class SpeechRecognitionListener implements RecognitionListener
{
@Override
public void onReadyForSpeech(Bundle params)
{
if (Build.VERSION.SDK_INT >= 16)//Build.VERSION_CODES.JELLY_BEAN)
{
mIsCountDownOn = true;
mNoSpeechCountDown.start();
}
Log.d("TESTING: SPEECH SERVICE", "onReadyForSpeech"); 
}
@Override
public void onBeginningOfSpeech()
{
//speech input will be processed, so there is no need for count down anymore
if (mIsCountDownOn)
{
mIsCountDownOn = false;
mNoSpeechCountDown.cancel();
}               
}
@Override
public void onEndOfSpeech()
{
Log.d("TESTING: SPEECH SERVICE", "onEndOfSpeech"); 
}
@Override
public void onBufferReceived(byte[] buffer)
{
//Log.d("TESTING: SPEECH SERVICE", buffer + new String(new byte[] {0x63})); 
}
@Override
public void onError(int error)
{
if ((error == SpeechRecognizer.ERROR_NO_MATCH)
|| (error == SpeechRecognizer.ERROR_SPEECH_TIMEOUT)){
if (mIsCountDownOn)
{
mIsCountDownOn = false;
mNoSpeechCountDown.cancel();
}
mIsListening = false;
Log.d("TESTING: SPEECH SERVICE: CALL START", "onError()"); 
startListening(true);
}
}
@Override
public void onEvent(int eventType, Bundle params)
{
}
@Override
public void onPartialResults(Bundle partialResults)
{
}
@Override
public void onResults(Bundle results)
{
//String str = new String();
//Log.d(TAG, "onResults " + results);
ArrayList data = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
//if(data.size() >=1){
// //check for save it:
//}
for (int i = 0; i < data.size(); i++)
{
Log.d("TESTING: SPEECH SERVICE", (String)data.get(i));
}
//if no "save it" somewhere in there, then continue:
if (mIsCountDownOn)
{
mIsCountDownOn = false;
}
mIsListening = false;
Log.d("TESTING: SPEECH SERVICE: CALL START", "onResults()"); 
startListening(true);
}
@Override
public void onRmsChanged(float rmsdB)
{
}
}
@Override
public IBinder onBind(Intent arg0) {
//TODO Auto-generated method stub
return null;
}
}
  • n'IMPORTE qui ont des idées à ce sujet? complètement coincé ici...
  • J'ai un DROID RAZR HD en 4.1.2 et je suis en cours d'exécution dans exactement le même problème aujourd'hui.
InformationsquelleAutor Mike6679 | 2013-09-06