안드로이드/에러

SimpleCall (카카오엔터 SDK) & STT문제

코딩하는후운 2022. 11. 22. 13:13
반응형

1. 안드로이드 내부 API - SpeechRecognizer를 통해 STT테스트를 해보았습니다.

  • 통화중이 아닐 때에는 마이크로 전달한 음성이 제대로 인식이 되는데
  • 통화중일때에는 SpeechRecognizer.ERROR_NO_MATCH라는 에러가 발생합니다.

 

통화중 아닐 때

계속 내부적으로 입력 받는것을 인식

 

통화중일 때

onRmsChanged가 한번만 불리면서 몇초 뒤에 onError 7이 떨어집니다.

 

AudioFocus

  • 처음에 통화 연결되면 -2로 AUDIOFOCUS_LOSS_TRANSIENT로 되고
  • 그뒤에 통화를 종료하면 AUDIOFOCUS_REQUEST_GRANTED로 변함.

 

2. 구글 클라우드 API

  • 이것도 통화중이 아닐 때에는 음성이 제대로 인식 & 인식 끝이 제대로 되는데
  • 통화중일때에는 마이크쪽을 계속 인식이 되어있는듯 합니다. (STT에서 마이크 인풋이 없을 시 결과를 리턴해주어야 하는데, 계속 입력되는것으로 판단 되어지는듯)
AudioEmitter라는 클래스(구글클라우드에 있었음)를 이용하여
AudioRecorder로 startRecording()하여
ScheduledExecutorService로 입력된 buffer를 읽어 오는것 같다.

실제 scheduleAtFixedRate함수는 계속 타고 있음.(들어옵니까? 로그가 계속 찍힘)
subscriber에서 requestStream.onNext의 결과가 호출되지 않음.

참고로 통화 중간에 requestStream.onCompleted() 호출하면 결과 호출되면서 stream closed됨.

 

MediaRecorder로 통화중에 녹음을 해보았는데 통화중 녹음은 또 됩니다.
하지만 STT할 때에 마이크로 입력된 buffer를 읽어오려면 AudioRecorder를 써야함.
(실제 AudioRecorder에도 마이크는 입력되는듯 하나 말이 끝낫다는 인식을 못하는듯.?)

 

통화중이 아닐때에는 말을 하면

override fun onNext(value: StreamingRecognizeResponse)가 호출되면서 결과를 볼 수 있다.

 

통화중일 때

  • 오랜시간 있으면 OutOfRangeException 발생
    com.google.api.gax.rpc.OutOfRangeException: io.grpc.StatusRuntimeException: OUT_OF_RANGE: Exceeded maximum allowed stream duration of 305 seconds.
  • 마이크 입력이 계속 되어진다고 판단 되는것 같다

 

통화가 끊기면

포커스가 1로 바뀌면서 결과값을 받는 override fun onNext(value: StreamingRecognizeResponse) 가 호출된다.

 

예상되는 문제는

통화시작 되면 AudioFocus가 -2(AUDIOFOCUS_LOSS_TRANSIENT)로 변경되면서 발생하는 이슈 같은데
자세히는 모르겠음.. 어렵..

 


참고할만한 자료?

https://source.android.com/docs/core/audio/concurrent?hl=ko 

 

동시 캡처  |  Android 오픈소스 프로젝트  |  Android Open Source Project

동시 캡처 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. Android 10은 예를 들어 사용자가 접근성 서비스에서 제공하는 음성 명령으로 VoIP 통화 또는 동영상

source.android.com

https://developer.android.com/guide/topics/media/sharing-audio-input

 

오디오 입력 공유  |  Android 개발자  |  Android Developers

오디오 입력 공유 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 일반적으로 오디오 입력은 내장 마이크, 외부 마이크 또는 기기에 연결된 오디오 인터페이

developer.android.com

https://source.android.com/docs/core/audio/avoiding_pi?hl=ko 

 

우선순위 역전 회피  |  Android 오픈소스 프로젝트  |  Android Open Source Project

우선순위 역전 회피 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 이 문서에서는 Android의 오디오 시스템에서 우선순위 역전을 회피하기 위해 시도하는 방

source.android.com

 


결국 안되는것인지..? 아시는분 의견주시면 감사하겠습니다!

https://dog-footprint.tistory.com/37

 

안드로이드 구글STT에서 Recording이 안되는 이유

안녕하세요. 이번 포스팅은 구글STT를 실행하면서 Recording하는 방법을 알려드리고 싶지만 현재 기술적으로 불가능해서 왜 안되는지에 대한 이유를 알려드리기 위해 적게 되었습니다. 구글STT는 Re

dog-footprint.tistory.com

 

녹음(MediaRecorder) + STT(SpeechRecognizer) 기능 살펴보았습니다.

STT 기능 누르니 AudioFocus -2로 변경 되며  onRmsChanged가 한번 불리며 이미 녹음 쪽에 마이크가 점유 된것 같습니다.

STT(SpeechRecognizer) + 녹음(MediaRecorder) 기능 

STT를 먼저 누르고 녹음을 해보았습니다.

녹음쪽 MediaRecorder에서 마이크 점유를 뺏어가는듯(?) 하면서 STT쪽 onError 7 발생 하였습니다.

 

녹음(MediaRecorder) + GoogleCloud STT API (AudioRecorder)

녹음하면서 GoogleCloud STT API는 동작 하였습니다.
따로 AudioFocus Change가 일어나지 않았습니다.

 

통화 + GoogleCloud STT API (AudioRecorder)

통화 할때 AudioFocus 가 -2로 변하면서 점유를 뺏기는 것 같다.

통화 + 녹음(MediaRecorder)

통화 할때 AudioFocus 가 -2로 변하는데..
통화중에는 녹음이 된다.. 왜 되지..?
AudioFocus 문제가 아닌가 결국?

!? 차이는 AudioRecorder와 MediaRecorder의 차이 이긴 한데


Google Cloud Api - Speech패키지

  • 통화중에 Speech 패키지를 통해 테스트 해보았더니.
  • 통화중에 STT가 된다.

 

SpeechRecognition패키지

  • AudioEmitter 사용
    • 그 안에 AudioRecord를 이용하여 input(recording)된 음성을 버퍼만큼 읽어옴.
  • scheduleAtFixedRate로 일정시간마다 반복실행은 되는것 같고, speechClient의 onNext가 비동기로 실행이 안되는 느낌(?)

 

Speech 패키지

  • VoiceRecorder 사용
    • 그 안에 AudioRecord를 이용하여 input(recording)된 음성을 버퍼만큼 읽어옴.
  • 쓰레드로 ProcessVoice(Runnable)을 실행시키고 while문에서 계속 AudioRecord를 이용하여 읽음
    • 실제 읽어오는건 (실시간으로 계속 읽어들임)
      • 안녕
      • 안녕하
      • 안녕하세
      • 안녕하세요

 

결론

AudioFocus문제일 것 같았는데, 그런 문제는 아니었던것 같습니다.
실제 통화하면서 녹음은 가능하기 때문에 AudioRecord로 동시에 가능한것 같습니다.

GoogleCloud의 Speech패키지로 
while문에서 계속 AudioRecord를 이용하여 읽어 들이면서 제대로 같이 되는것 같음.

반응형