마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

stt(speech to text) 사용 중 실행 순서 관련 질문 드립니다.

0 추천

안녕하세요.

현재 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 메소드가 실행되면서 거의 쓰레드마냥 그 다음 문장도 동시에 실행되는게 문젠데 이걸 어떻게 하면 해결할 수 있을까요?

 

secondrun (120 포인트) 님이 2017년 8월 27일 질문

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...