안녕하세요.
현재 tts, stt 를 활용해서 앱과 사용자가 소통하는, 예를 들면
앱이 먼저 저에게 tts 를 이용해
speakOut("무엇을 도와드릴까요?");
라고 물어봅니다. 그럼 저는 곧바로
promptSpeechInput(); //stt 하게 되는 부분
메소드를 통해 대답을 하게 되지요.
그리고 대답한 결괏값은 result 라는 변수에 저장되어서
그 다음 코드에서 if 문 등을 통해 값을 비교하게 됩나다.
그런데 문제는 제가 생각한대로 코드가 실행되지 않습니다 ㅠㅠ
구체적으로 설명드리자면
private void promptSpeechInput() {
Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.getDefault());
intent.putExtra(RecognizerIntent.EXTRA_PROMPT, getString(R.string.speech_prompt));
try {
startActivityForResult(intent, REQ_CODE_SPEECH_INPUT);
} catch (ActivityNotFoundException a) {
Toast.makeText(getApplicationContext(),
getString(R.string.speech_not_supported),
Toast.LENGTH_SHORT).show();
}
}
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case REQ_CODE_SPEECH_INPUT: {
if (resultCode == RESULT_OK && null != data) {
result = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
}
break;
}
}}
라고 하는 인터넷에서 stt 로 검색하면 흔히 접할 수 있는 예제 코드를 가지고 진행을 하고 있는데요.
문제는 제가 만약
=================================
speakOut("무엇을 도와드릴까요?");
promptSpeechInput();
String str = result.get(0); // 여기서 result 에는 stt 의 결과가 들어감.
if (str.equals("안녕")){
Log.d("debug", "안녕나옴");
}
else{
Log.d("debug", "안녕 안 나옴");
}
====================================
결과 : "안녕 안 나옴"
이라는 코드를 짰는데 막상 실행을 해보니 promptSpeechInput() 메소드가 실행되자마자 바로 그 다음 코드인
String str = result.get(0);
if (str.equals("안녕")){
Log.d("debug", "안녕나옴");
}
가 실행되버립니다
그래서 result 에는 미처 제가 음성으로 말한 결괏값이 들어가지 못하고 기존에 있던 값이 들어가게 돼서 결과적으로는 제가 말한 음성 값이 코드 순서대로 들어가지 못하게 됩니다.
결론은, 저는 stt 부분만 따로 메소드화 시켜서 필요할때마다 호출하고 결괏값은 클래스변수인 result 에만 담아서 사용하고 싶습니다. 그런데 그렇게 하자니 위에서 설명한 것처럼 실행순서가 순서대로 실행되지 않습니다. startActivityForResult 메소드가 실행되면서 거의 쓰레드마냥 그 다음 문장도 동시에 실행되는게 문젠데 이걸 어떻게 하면 해결할 수 있을까요?