안드로이드에서 STT 안되는 버그

Description

작업한 내용

  • 안드로이드에서 STT를 이용한 레코딩이 정상적으로 동작하지 않는 문제 원인 분석

  • 안드로이드에서 getUserMedia 점유하는 DynamicRecordingIndicator 안쓰도록 변경

  • Continuous 로직 보강

PR 리뷰시 참고할 사항

처음에는 Andorid/Chrome 환경이 SpeechRecognition API를 지원 안하나 생각했는데, caniuse에 지원된다고 적혀있더라고요. 공식 예제에서 테스트해서 Android/Chrome을 지원한다는 것을 확인했습니다.

If both apps are privacy-sensitive, the app which started capturing most recently receives audio and the other gets silence.

안드 공식문서에서 안드로이드 OS가 마이크 이중 점유를 허용하지 않는다는 것을 발견했습니다. 기존 로직은 getUserMedia와 SpeechRecognition를 같이 쓰고 있어서 문제가 발생하고 있었고, 안드로이드에서는 getUserMedia 에서 음성을 가져오고 있던 DynamicRecordingIndicator 대신 static한 indicator를 쓰게 변경했습니다.

SpeechRecognition API는 일정 시간동안 음성 입력이 없으면 종료되는데, Android에서는 이 timeout이 iOS에 비해 매우 짧습니다. 사용자가 잠깐 말을 멈춰도 세션이 종료되는 문제가 있기 때문에, continuous한 음성 입력이 가능하게 구현해줘야 합니다. Timeout을 커스터마이징할 수는 없어요.

SpeechRecognition 래핑한 라이브러리 에서도 continuous 동작을 완전하게 구현하지는 못했고, 데이터 유실이나 누락이 조금씩은 발생할 수 밖에 없습니다. 실무라면 SpeechRecognition API 도입을 포기하고 Google Cloud STT API 를 도입하는 게 맞을 것 같은데, 부캠의 성격이 있긴하니까 불완전해도 갖고 가는게 맞는 것 같아요. 맘 같아서는 안드일때는 Google Cloud STT API 쓰고 iOS일때 SpeechRecognition API 쓰게 하고 싶긴 하네요.