안드로이드

(Android) 음성인식 (SpeechRecognize)

danune.dev 2022. 7. 6. 10:35

Android에서는 음성인식 모듈이 기본 탑재되어있습니다

 

별도의 외부 라이브러리를 사용하지 않아도 기본 API 를 이용해 음성인식을 구현할 수 있습니다 

 

1. manifest 수정

앱에서 음성인식을 사용하는 것을 알리기 위해 action을 정의해주어야 합니다

<manifest>
    <queries>
        <intent>
            <action android:name="android.speech.RecognitionService" />
        </intent>
    </queries>
</manifest>

 

2. 코드 구현

SpeechRecognize 를 이용해 음성인식을 구현합니다 

RecognitionListener를 달아 결과 및 에러를 수신하여 처리합니다

private fun speechRecognize(context: Context) {
    val intent = Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH)
    intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, context.packageName)
    intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.getDefault()) // 언어 설정
    intent.putExtra(RecognizerIntent.EXTRA_PARTIAL_RESULTS, true) // 음성인식 완료 전에 중간 결과를 받을 지 여부

    val recognizer = SpeechRecognizer.createSpeechRecognizer(context)

    recognizer.setRecognitionListener(object : RecognitionListener {
        override fun onReadyForSpeech(params: Bundle?) {
             // 음성(발화)인식 시작
        }

        override fun onBeginningOfSpeech() {
        }

        override fun onRmsChanged(rmsdB: Float) {
        }

        override fun onBufferReceived(buffer: ByteArray?) {
        }

        override fun onEndOfSpeech() {
            // 발화 종료
        }

        override fun onError(error: Int) {
            // 에러 처리 (SpeechRecognizer.ERROR_XXX)
            /*
                public static final int ERROR_AUDIO = 3;
            	public static final int ERROR_CLIENT = 5;
                public static final int ERROR_INSUFFICIENT_PERMISSIONS = 9;
                public static final int ERROR_LANGUAGE_NOT_SUPPORTED = 12;
                public static final int ERROR_LANGUAGE_UNAVAILABLE = 13;
                public static final int ERROR_NETWORK = 2;
                public static final int ERROR_NETWORK_TIMEOUT = 1;
                public static final int ERROR_NO_MATCH = 7;
                public static final int ERROR_RECOGNIZER_BUSY = 8;
                public static final int ERROR_SERVER = 4;
                public static final int ERROR_SERVER_DISCONNECTED = 11;
                public static final int ERROR_SPEECH_TIMEOUT = 6;
                public static final int ERROR_TOO_MANY_REQUESTS = 10;
            */
        }

        override fun onResults(bundle: Bundle?) {
            val results = bundle ?: return
            val texts =
                results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION) ?: return

            val result = texts.toArray().joinToString(" ") // 결과 문장
        }

        override fun onPartialResults(partialResults: Bundle?) {
            val results = partialResults ?: return
            val texts =
                results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION) ?: return
            if (texts.isEmpty()) return
            vaㅣ text = texts[texts.size - 1] // 마지막에 받은 단어
        }

        override fun onEvent(eventType: Int, params: Bundle?) {
        }
    })
    recognizer.startListening(intent)
}