본문 바로가기
Android/Kotlin

Android SpeechRecognizer 를 이용해 음성 인식 구현하기

by wannagohome97 2024. 2. 29.

Android 에서 지원하는 음성 인식 기능인 SpeechRecognizer

Android 에는 SpeechRecognizer 라는 class 로 마이크에 입력되는 음성을 Text 로 변환해주는 Class 가 지원됩니다.

 

 

SpeechRecognizer  |  Android Developers

 

developer.android.com

 

해당 클래스를 이용하면 음성을 이용한 검색 / 채팅과 같은 기능 을 구현할 수 있습니다.

 

Source Code

기본적으로 마이크를 통해 Audio 를 입력해야 하기 때문에 Permission 설정을 먼저 요청합니다.

fun requestPermission(context: Context) {
    if (ContextCompat.checkSelfPermission(context, Manifest.permission.RECORD_AUDIO)
        != PackageManager.PERMISSION_GRANTED
    ) {
        ActivityCompat.requestPermissions(
            context as Activity,
            arrayOf(Manifest.permission.RECORD_AUDIO), 0)
    }
}

 

저의 경우 Compose 환경에서 구현했던 코드이고 , 전역 함수로 설정하고자 하여 Context 를 파라미터로 받아서 function 을 구현했습니다.

 

그리고 SpeechRecognizer 객체를 생성해줍니다.

val recognizer = SpeechRecognizer.createSpeechRecognizer(context)

 

그리고 recognizer 에 이벤트 (recognizer 가 실행 / 종료 되는 것 부터 시작해서 음성을 수신하거나 Text 로 인식되는 등의) 를 수신할 수 있는 Listener 도 구현해줍니다.

 

각 메서드 별 기능은 주석으로 설명해두었습니다.

    recognizer.setRecognitionListener(object : RecognitionListener{
        override fun onReadyForSpeech(params: Bundle?) {

        }

        override fun onBeginningOfSpeech() {
        // recognizer 의 startListening 이 호출 되면 동시에 호출 됩니다.
        }

        override fun onRmsChanged(rmsdB: Float) {

        }

        override fun onBufferReceived(buffer: ByteArray?) {
        // recognizer 에 buffer , 즉 , 무언가 음성이 Text 로써 인식이 될 때마다
        // ByteArray 로 이곳 에서 수신 가능 합니다.
        }

        override fun onEndOfSpeech() {
            // recognizer 의 stopListening 이 호출 되면 동시에 호출 됩니다.
        }

        override fun onError(error: Int) {
            // 에러가 발생
        }

        override fun onResults(results: Bundle?) {
            val matches = results?.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION)
            var content = ""

            for (i in matches!!.indices){
                content += matches[i]
            }
        // recognizer 의 stopListening 이 호출 된 후 별도의 Error 가 발생 하지 않을 경우
        // 이곳, onResults 에서 Bundle 에 String Array 로 인식된 음성이 순서 대로 들어 있게 됩니다.

        }

        override fun onPartialResults(partialResults: Bundle?) {

        }

        override fun onEvent(eventType: Int, params: Bundle?) {

        }
    })

 

 

이 후  

val intent = Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH)
intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, context.packageName)
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, "ko-KR")
recognizer.startListening(intent)

 

언어를 한국어로 설정한 뒤 Recognize Speech 에 대한 Intent 를 recognizer.startListening 에 전달하여

음성인식 기능을 시작하고

 

 

recognizer.stopListening()

 

으로 음성 인식 기능을 종료할 수 있습니다.