본문 바로가기

APP DEVELOPER/Android 안드로이드

안드로이드 - 구글음성인식 활용, 클래스 하나로 쉽게 구현하기

구글 음성인식이 요즘 상당히 정확하다, 웬만하면 다 제대로 알아듣고, 띄어쓰기까지 제대로 해준다.

네트워크가 될때 되는건지, 휴대폰 혼자만으로도 되는건지 궁금해졌다.

1. 음성녹음 RECORD_AUDIO 런타임퍼미션 기능이 있어야함

2. 구글 음성인식 Intent를 전역변수로 넣어줌

3. RecognitionListener를 달아줘야함, 해당 리스너에 모든 내용이 있음.

     mRecognizer.setRecognitionListener( new RecognitionListener()
     {
        @Override
         public void onResults(Bundle results)
         {   }

     });

4. SpeachRecognizer에 startListening으로 시작해줘야함

5. mRecognizer.startListening ( );

 

실제로 이런 화면이 나오지는 않는다.

그냥 인식하는 비프음 정도만 나온다.

 

        //<uses-permission android:name="android.permission.RECORD_AUDIO"/>
        //전역변수 Intent i;
        //전역변수 SpeechRecognizer mRecognizer;

        //==================== 구글음성인식 ==================
        i = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
        i.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, getPackageName());
        i.putExtra(RecognizerIntent.EXTRA_LANGUAGE, "ko-KR");
        mRecognizer = SpeechRecognizer.createSpeechRecognizer(getApplicationContext());

        mRecognizer.setRecognitionListener(new RecognitionListener()
        {
            @Override
            public void onRmsChanged(float rmsdB)
            {
            }
            @Override
            public void onResults(Bundle results)
            {
                String key= "";
                key = SpeechRecognizer.RESULTS_RECOGNITION;
                ArrayList<String> mResult = results.getStringArrayList(key);
                String[] rs = new String[mResult.size()];
                mResult.toArray(rs);
                Log.v("DEBUG","정상결과 : " + rs[0]);
            }
            @Override
            public void onReadyForSpeech(Bundle params)
            {
            }
            @Override
            public void onPartialResults(Bundle partialResults)
            {
            }
            @Override
            public void onEvent(int eventType, Bundle params)
            {
            }
            @Override
            public void onError(int error)
            {
                Log.v("DEBUG","에러입니다.");
            }
            @Override
            public void onEndOfSpeech()
            {
            }
            @Override
            public void onBufferReceived(byte[] buffer)
            {
            }
            @Override
            public void onBeginningOfSpeech()
            {
                Log.v("DEBUG","말해주세요.");
            }
        });


        Button button1 = (Button) findViewById(R.id.button1) ;
        button1.setOnClickListener(new Button.OnClickListener()
        {
            @Override
            public void onClick(View view)
            {
                if(checkSelfPermission(Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED )
                {
                    requestPermissions(new String[]{Manifest.permission.RECORD_AUDIO}, 1);
                    return;
                }
                try
                {
                    mRecognizer.startListening(i);
                }
                catch(SecurityException e)
                {
                    e.printStackTrace();
                }

            }
        });
        
        
        
        
        
/*
* 음성인식/출력 객체가 남아있다면 실행을 중지하고 메모리에서 제거
*/

@Override
public void onDestroy() {
    super.onDestroy();
    if(tts != null){
        tts.stop();
        tts.shutdown();
        tts = null;
    }
 
    if(mRecognizer!=null){
        mRecognizer.destroy();
        mRecognizer.cancel();
        mRecognizer = null;
    }
}