안드로이드 음성인식 OnUtteranceProgress Listener 관련 질문입니다...

조회수 1933회

제가 안드로이드 음성인식을 독학하고 있는데...

버튼을 누르고 질문을 하면 어플이 해당 질문에 대한 답변 후 다시 자동으로 질문을 받게끔 구현해보고 싶어서요...

대답 후 임의로 3초정도 delay 준 후 다시 질문을 받게끔 처음에 구현해 보니...

대답이 길어지면 대답 도중 음성인식이 시작되 버려서 꼬이더라구요...

그래서 대답이 끝날때 까지 기다리는 방법을 찾던 도중

OnUtteranceProgressListener라는게 있다해서 써보려하는데요...

구글 뒤져서 코드는 다 작성해서 에러는 없는데 이게 대답 후에 OnUtteranceProgressListener로 안넘어가지는것 같아서 부분 코드 올려서 여쭤봅니다...

private TextToSpeech tts; //맨 윗부분에 tts 선언해주고...

tts = new TextToSpeech(this, onTTSInitListener);//리스너 등록하고...

==================================================================

private TextToSpeech.OnInitListener onTTSInitListener = new TextToSpeech.OnInitListener(){ @Override public void onInit(int status){ boolean isInit = status == TextToSpeech.SUCCESS ? true : false; if(isInit){ Log.d("TTS", "init 성공"); tts.setOnUtteranceProgressListener(new UtteranceProgressListener() { @Override public void onStart(String utteranceId) {

                }

                @Override
                public void onDone(String utteranceId) {
                    Log.d("TTS", "complete");
                    repeat();

                }

                @Override
                public void onError(String utteranceId) {

                }
            });
        }
        else {
            Log.d("TTS", "init 실패");
        }

    }
};

===================================================================

이부분이 일단 음성출력이 되는걸 어플이 인식 후 onDone에서 제가 다시 음성인식 시작 함수를 만들어 놓은 repeat()으로 넘어가야 하는 부분이구요...

일단 여기로 지금 안넘어가지고 있는게 문제입니다..

====================================================================

public void onResults(Bundle results) { HashMap localSpeech = new HashMap(); localSpeech.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID,"unique_id"); tts.setLanguage(Locale.KOREA); tts.setSpeechRate(1); Log.i(LOG_TAG, "onResults"); mResult = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION); String[] result = new String[mResult.size()]; mResult.toArray(result); mSelectString = mResult.get(0);

    if (mSelectString.contains("그만") && mSelectString.contains("미니")) {
        returnedText.setText("대답 : 음성인식을 종료합니다");
        mSpeakString = "음성인식을 종료합니다.";
        tts.speak(mSpeakString, TextToSpeech.QUEUE_FLUSH, null);
        bt.setImageResource(R.drawable.mic1);

    } else {
        if (mSelectString.contains("이름")) {
            mSpeakString = "내 이름은 미니야";
            returnedText.setText("질문 : " + mSelectString + "\n" + "대답 : " + mSpeakString);
            bt.setImageResource(R.drawable.mic3);
            tts.speak(mSpeakString, TextToSpeech.QUEUE_FLUSH, localSpeech);
        } else if (mSelectString.contains("나이") || (mSelectString.contains("몇") && mSelectString.contains("살"))) {
            String[] myArrayOfStrings = {"3살이야", "안알려줌", "몰라몰라"};
            mSpeakString = (myArrayOfStrings[new Random().nextInt(myArrayOfStrings.length)]);
            returnedText.setText("질문 : " + mSelectString + "\n" + "대답 : " + mSpeakString);
            bt.setImageResource(R.drawable.mic3);
            tts.speak(mSpeakString, TextToSpeech.QUEUE_FLUSH, localSpeech);
        } else if (mSelectString.contains("안녕")) {
            mSpeakString = "만나서 반가워";
            returnedText.setText("질문 : " + mSelectString + "\n" + "대답 : " + mSpeakString);
            bt.setImageResource(R.drawable.mic3);
            tts.speak(mSpeakString, TextToSpeech.QUEUE_FLUSH, localSpeech);
        } else if (mSelectString.contains("현재")&& mSelectString.contains("시간") || mSelectString.contains("몇") && mSelectString.contains("시") || mSelectString.contains("몇") && mSelectString.contains("일") || mSelectString.contains("날짜")){
            Calendar now = Calendar.getInstance();
            mSpeakString = "" + now.get(Calendar.YEAR) + "년" + (now.get(Calendar.MONTH) + 1) + "월" + now.get(Calendar.DAY_OF_MONTH) + "일" + " " + now.get(Calendar.HOUR_OF_DAY) + "시" + now.get(Calendar.MINUTE) + "분 입니다.";
            returnedText.setText("질문 : " + mSelectString + "\n" + "대답 : " + mSpeakString);
            bt.setImageResource(R.drawable.mic3);
            tts.speak(mSpeakString, TextToSpeech.QUEUE_FLUSH, localSpeech);
        } else {
            mSpeakString = "다시 버튼을 누르고 말해주세요";
            returnedText.setText("질문 : " + mSelectString + "\n" + "대답 : " + mSpeakString);
            bt.setImageResource(R.drawable.mic4);
            tts.speak(mSpeakString, TextToSpeech.QUEUE_FLUSH, localSpeech);
        }
    }
}

=================================================================

아래 음성인식 후 텍스트 뽑아서 특정 키워드 인식하면 해당 대답하게끔 만들었는데요...

위 OnUtteranceProgressListener로 보내려면 HashMap이라는거 써야한다고 해서

구글 보면서 하나하나 따라 써본거구요...

speak 후에 끝부분 null 안쓰고 저렇게 localSpeech로 UtteranceID적으면 보내지는거로 이해했는데 아니였나봐요;;;

혼자 구글 뒤져가며 해보는데 기초가 부족하다보니 많이 막히네요 ㅠㅠ

저기서 speak 후에 위 onDone으로 왜 안가지는지 뭐가 문제인지 아시는분 꼭좀 알려주세요...

감사합니다.

  • (•́ ✖ •̀)
    알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)