안드로이드 TTS 구현하기
1. 서론
TTS는 text to speech의 약자로 텍스트를 음성으로 변환하는 기술이다. 안드로이드에서는 TextToSpeech API를 제공하여 애플리케이션에 쉽게 적용할 수 있도록 만들었다.
하지만 음성 기반 AI 비서를 만들기 위해 TTS를 사용하던 중 몇 가지 문제가 발생하였는데 가장 큰 문제는 TTS로 나간 소리가 음성인식을 통해 다시 사용자의 발화로 간주된다는 점이었다. 이는 스피커로 나간 소리가 다시 마이크로 인식되는 에코 현상으로 꽤나 중요하게 다뤄지는 문제이다.
아래 사진에서 '네 알겠습니다'로 시작하는 부분은 TTS로 나간 음성이 다시 인식된 결과이다.
2. 에코 해결하기
에코 캔슬레이션을 위한 방법에는 여러 가지가 있다. 당장 스피커폰 전화만 생각해도 상대방의 목소리가 주변에서 반사된 후 다시 마이크로 들어가 상대의 귀에 들어가지는 않는다.
가장 먼저 안드로이드의 AcousticEchoCanceler를 적용했다. 그러나 소리가 크면 여전히 AI의 음성을 사용자의 음성처럼 인식했고, NoiseSuppressor까지 적용해 보았지만 별 효과는 없었다. DSP(디지털 신호 처리 장치)와 같은 하드웨어를 직접 다루지 않으면 잘 안 되나 싶기도 하고, 소프트웨어 기반으로 AEC를 구현한 WebRTC가 있지만 Failed to resolve 에러가 계속 발생해서 포기했다.
대안으로 TTS가 종료될 때 그때까지 SpeechRecognizer를 종료하고, 그때까지 인식한 결과를 제거했다. 대신 언제든지 '잠깐만'이라는 단어가 음성으로 인식되면 TTS를 종료하도록 하였다. 이때도 역시나 음성인식 내용은 모두 초기화하였다.
3. 결론
WebRTC는 소프트웨어 기반으로 에코를 제거해준다고 한다. 원리는 잘 모르지만 추후에 시도해보고 싶다.