안드로이드
(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)
}