0

Я пытаюсь создать приложение, которое обеспечивает направление для людей с нарушением зрения. Приложение предоставит инструкции (используя TTS) и получит пользовательские команды (используя STT). Вот код для моего MainActivityAndroid STT onResult не срабатывает после TTS onUtteranceCompleted

//InteractionCompletedEvent is my custom event for callback 
public class MainActivity extends Activity implements InteractionCompletedEvent,TextToSpeech.OnUtteranceCompletedListener 
{ 

TTS tts; 
STT stt; 
Handler mHandler; 
int flag; 
boolean answer = false; 

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    stopService(new Intent(MainActivity.this,StartServices.class)); 
    mHandler = new Handler(); 

    try 
    { 
     stt = new STT(this,this); 
     tts = new TTS(this,this,this); 
     mHandler.postDelayed(new Runnable() { 
     public void run() 
     { 
      tts.Speak("Welcome to my application"); 
     }}, 1000); 
    } 
    catch(Exception e) 
    { 

    } 
} 

//event button clicked on "Save Place" 
public void savePlaceOnClick(View v) 
{ 
    flag = 1; 
    answer = true; 
    tts.Speak("Do you want to save this place ?"); 
} 

//event button clicked on "Start Navigation" 
public void navigationOnClick(View v) 
{ 
    flag = 2; 
    answer = true; 
    tts.Speak("Do you want to go to some place ?"); 
} 

//Callback from my STT.java 
public void onListeningCompleted() { 
    tts.Speak("on listening completed ?"); 
    if(stt.matching("yes")) 
    { 
     if(flag == 1) 
     { 
      tts.Speak("Let's save this place !"); 
     } 
     else if(flag == 2) 
     { 
      tts.Speak("Let's find place !"); 
     } 
    } 
    else if(stt.matching("no")) 
    { 
     tts.Speak("action canceled"); 
    } 
    else 
    { 
     tts.Speak("Please repeat your answer"); 
    } 
} 

public void onUtteranceCompleted(String utteranceId) { 
    if(answer) 
    { 
     try{ 
      answer = false; 

      stt.start(); 
     } 
     catch(Exception e) 
     { 
     } 
    } 
} 
} 

Моего STT.java

public class STT implements RecognitionListener{ 

SpeechRecognizer speech; 
ArrayList<String> data = null; 
Intent intent; 
InteractionCompletedEvent event; 
private boolean dataReady; 

public STT(Context con,InteractionCompletedEvent event) 
{ 
    this.event = event; 
    speech = SpeechRecognizer.createSpeechRecognizer(con); 
    speech.setRecognitionListener(this); 
    intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); 
    intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); 
    intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE,con.getPackageName()); 
    intent.putExtra(RecognizerIntent.EXTRA_SPEECH_INPUT_COMPLETE_SILENCE_LENGTH_MILLIS,2000); 
} 

public void start() 
{ 
    data = null; 
    final ToneGenerator tg = new ToneGenerator(AudioManager.STREAM_NOTIFICATION, 100); 
    tg.startTone(ToneGenerator.TONE_PROP_BEEP); 
    speech.startListening(intent); 
} 

public void stop() 
{ 
    speech.stopListening(); 
} 


public ArrayList<String> getresult() 
{ 
    return data; 
} 

public void onResults(Bundle hasil) { 
    data = hasil.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION); 
    final ToneGenerator tg = new ToneGenerator(AudioManager.STREAM_NOTIFICATION, 100); 
    tg.startTone(ToneGenerator.TONE_PROP_BEEP2); 
    event.onListeningCompleted(); 
} 

public boolean resultAvailable() { 
    if(data == null) { 
     return false; 
    } 
    else { 
     return true; 
    } 
} 
public boolean matching(String match) 
{ 
    for(int i = 0; i< data.size() ; i++) 
    { 
     if(data.get(i).equalsIgnoreCase(match)) 
     { 
      return true; 
     } 
    } 
    return false; 
} 
} 

и моего TTS.java

public class TTS implements TextToSpeech.OnInitListener{ 
private TextToSpeech tts; 
Context c; 
InteractionCompletedEvent event; 
HashMap<String, String> myHashAlarm; 
OnUtteranceCompletedListener ouct; 

public TTS(Context context, InteractionCompletedEvent event,OnUtteranceCompletedListener ouct) 
{ 
    c = context; 
    tts = new TextToSpeech(c, this); 
    this.event = event; 
    this.ouct = ouct; 
} 

public void Speak(String words) 
{ 
    Intent intent = new Intent(); 
    intent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA); 

    myHashAlarm = new HashMap<String, String>(); 
    myHashAlarm.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "utteranceId"); 
    tts.speak(words, TextToSpeech.QUEUE_FLUSH, myHashAlarm); 
} 

@Override 
public void onInit(int initStatus) { 
    if (initStatus == TextToSpeech.SUCCESS) 
    { 
     if(tts.isLanguageAvailable(Locale.US)==TextToSpeech.LANG_AVAILABLE) 
      tts.setLanguage(Locale.US); 

     tts.setOnUtteranceCompletedListener(ouct); 
    } 
    else 
    { 
    } 
} 

public void stop() 
{ 
    tts.stop(); 
} 
} 

Без onUtteranceCompletedListener, он работал просто отлично (STT onResult уволен). Но после того, как onUtteranceCompleted, я не могу получить STT onResult.

Примечание: Я использую onUtteranceCompletedListener (устаревшее), потому что мое тестирование устройства на уровне API 10 (Android 2.3.3)

Edit: TTS onUtteranceCompleted обжигают просто отлично, проблема только что STT onResult выиграл 't получить увольнение независимо от того, что

ответ

0

Хорошо, так что я думаю, что я нашел эту проблему, я отлаживается приложение на Jellybean (4.2.2) и приложение разбился, я попытался изменить устаревший интерфейс (onUtteranceCompletedListener) в onUtteranceProgressListener (работает только на API левов 15+), и она работала очень хорошо, так вот мой вывод:

Эта проблема может быть вызвана устаревшей интерфейс, возможно, ошибка, что может быть причиной устаревания этого интерфейса

0

ответ ложный, и вы никогда не устанавливаете его в true в любом из кода, поэтому sst никогда не запускается. Таким образом, для начала распознавания речи нет.

public void onUtteranceCompleted(String utteranceId) { 
if(answer) 
{ 
     **// this if block is never reached.** 

     try{ 
     answer = false; 

     stt.start(); 
    } 
    catch(Exception e) 
    { 
    } 
} 

}

+0

Я передал utteranc eId на моем TTS.java, внутри public void Speak (String words) перед вызовом tts.speak («anystring», TextToSpeech.QUEUE_FLUSH, myHashAlarm) – Yohan

+0

Что делает onListeningCompleted()? Ожидание да или нет? –

+0

информирует MainActivity, что STT закончил (STT onResult уволен) – Yohan

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

  • Нет связанных вопросов^_^