편집 기록

편집 기록
  • 프로필 알 수 없는 사용자님의 편집
    날짜2018.06.21

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


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

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

    대답 후 임의로 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으로 왜 안가지는지 뭐가 문제인지 아시는분 꼭좀 알려주세요...

    감사합니다.