안드로이드

STT(구글) - SpeechRecognizer Document

코딩하는후운 2022. 11. 9. 18:14
반응형

Android Speech Recognizer

안드로이드에서는 구글 SpeechToText, TextToSpeech 기술인 stt, tts를 내장 API로 지원하고 있습니다.

별도의 설치 없이 gradle에 특별한 세팅이 필요하지 않고 manifest에 몇 가지 권한을 주면 바로 불러와서 사용가능 합니다.

 

Android Developers SpeechRecognizer 공식문서

 

SpeechRecognizer

이 클래스는 음성 인식 서비스에 대한 액세스를 제공합니다.

이 서비스를 사용하면 음성 인식기에 액세스할 수 있습니다.

 

이 클래스를 직접 인스턴스화하지 말고 대신

SpeechRecognizer#createSpeechRecognizer(Context) 또는 SpeechRecognizer#createOnDeviceSpeechRecognizer(Context)를 호출하세요.

 

이 클래스의 메서드는 기본 응용 프로그램 스레드에서만 호출해야 합니다.

 

이 API를 구현하면 음성 인식을 수행하기 위해 오디오를 원격 서버로 스트리밍할 수 있습니다.

따라서 이 API는 상당한 양의 배터리와 대역폭을 소모합니다. 지속적인 인식으로는 사용되지 않습니다.

 

이 클래스를 사용하려면 애플리케이션에 Manifest.permission.RECORD_AUDIO 권한이 있어야 합니다.

 

문제 사항

  • 나는 여러 문장들로 이루어져 있으면서 문장간 호흡이 긴 음성을 글자로 만드는 것을 생각하고 있는데, 음성인식은 한 호흡만을 바로 문장으로 만들고 기능을 종료하는 것 같았다. 공짜기능을 쓰기 때문에 그런것 같다.

참조 : https://enchiridion.tistory.com/2

  • 만약 음성인식 앱이 없을 때는 ActivityNotFoundException이 발생하므로 예외처리를 해줘야 하는 듯 합니다

참조 : https://blog.naver.com/skelentom/10167064677

 

 

 

관련 함수

인스턴스를 얻기 위해서는 생성자 대신 다음의 메소드를 호출합니다.

SpeechRecognizer createSpeechRecognizer (Context context)

 

 

그리고 반환된 인스턴스에 콜백 리스너를 등록해야 합니다. 메소드는 다음과 같습니다.

void setRecognitionListener (RecognitionListener listener)

콜백 리스너는 RecognitionListener 인터페이스를 구현하는 인스턴스를 하나 전달해 주면 됩니다. RecognitionListener는 다음의 메소드를 재정의 해줘야 합니다.

 

void onReadyForSpeech (Bundle params)

준비가 다 된 SpeechRecognizer의 startListening(Intent recognizerIntent)을 호출하면 실행됩니다. 말을 들을 준비가 되었다는 콜백입니다.

 

void onEndOfSpeech()

음성이 끝났을 때 호출됩니다. 음성 인식이 성공했다는 건 아니고 이 콜백 다음에 인식 결과에 따라 on‌Error나 onResults가 호출됩니다.

 

void onBufferReceived(byte[] buffer)

새 소리가 들어왔을 때 호출됩니다. 직접 확인해 보면 onReadyForSpeech과 onEndOfSpeech 사이에서 무수히 호출되는 것을 볼 수 있습니다.

 

void onRmsChanged(float rmsdB)

들리는 소리 크기가 변경되었을 때 호출됩니다. 소리 크기는 dB단위로 전달됩니다. (RMS(root mean square)는 제곱 평균 제곱근으로 음수 양수를 오가는 값들의 평균을 구할 때 좋다고 인터넷에서 찾아보니까 그러네요)

확인해보면 onBufferReceived하고 비슷하게 호출됩니다.

 

void on‌Error (int error)

에러가 발생했을 때 호출됩니다. 전달인자 error은 SpeechRecognizer 에서 미리 정의된 다음의 상수들입니다.

ERROR_NETWORK_TIMEOUT : 네트워크 타임아웃

ERROR_NETWORK :  그 외 네트워크 에러

ERROR_AUDIO :  녹음 에러

ERROR_SERVER :  서버에서 에러를 보냄

ERROR_CLIENT :  클라이언트 에러

ERROR_SPEECH_TIMEOUT :  아무 음성도 듣지 못했을 때

ERROR_NO_MATCH :  적당한 결과를 찾지 못했을 때

ERROR_RECOGNIZER_BUSY :  RecognitionService가 바쁠 때

ERROR_INSUFFICIENT_PERMISSIONS: uses-permission(즉 RECORD_AUDIO) 이 없을 때

void onResults(Bundle results)

음성 인식이 끝나고 결과가 나왔을 때 호출됩니다. 전달인자는 무려 Bundle인데요, results.get(SpeechRecognizer.RESULTS_RECOGNITION)해 주면 ArrayList<String>가 나오므로 걱정하지 않으셔도 됩니다.

void onPartialResults (Bundle partialResults)

부분적인 결과를 잡아 냈을 때 호출됩니다.

저로선 정확히 어떨 때 호출되는지 모르겠습니다

 

 

참조 :

https://blog.naver.com/skelentom/10167064677

https://enchiridion.tistory.com/2

반응형

'안드로이드' 카테고리의 다른 글

STT관련 라이브러리 API정보  (0) 2022.11.09
STT (구글) - 샘플코드  (0) 2022.11.09
STT(Speech-to-Text)란?  (0) 2022.11.09
RxJava2을 사용한 Retrofit통신  (0) 2022.11.04
[Android] DB Realm Migration  (0) 2022.11.04