RealtimeVAD - Silero보다 100ms 빠른 음성 종료 감지
Show HN: RealtimeVAD – trading false positives for 110ms earlier end-of-speech
RealtimeVAD는 음성 비서가 사용자의 말이 끝났음을 더 빨리 알 수 있게 해주는 오픈소스 VAD(Voice Activity Detection) 라이브러리입니다. 기존 Silero VAD로 '무엇이 음성인가'를 판단하면서, 10ms마다 오디오 레벨을 방의 소음 및 화자 자신의 음량과 비교하는 두 번째 빠른 검사를 추가합니다. 실제 3,279개 턴에서 Silero보다 중앙값 100ms 먼저 speech-off 신호를 보냈고, 82%의 턴에서 종료 시점도 더 빨랐습니다. numpy와 onnxruntime만 필요하며 CPU 한 스레드에서 실시간보다 훨씬 빠르게 동작합니다. pip install realtimevad로 바로 사용할 수 있고, LiveKit Agents 플러그인도 제공됩니다.
음성 비서는 사용자가 말을 멈췄다는 걸 알기 전까지 아무것도 할 수 없습니다. RealtimeVAD는 그 결정을 수백 밀리초 더 빠르게 내립니다. 일찍 틀리는 대신, 110ms 더 빠른 종료 신호를 얻는 거래인 셈이죠.
- nowittyusername
이 문제를 아예 피해갈 수도 있습니다. 저는 "투기적 재생성(speculative regeneration)"이라고 부르는 파이프라인을 몇 달째 쓰고 있는데 아주 잘 동작합니다. 기본적으로 추론 서버에 접근할 수만 있으면 됩니다. 아이디어는 이렇습니다. n밀리초(제 경우 보통 300ms)의 침묵이 있을 때마다 ASR 전사 결과를 LLM에 즉시 보내 처리하게 합니다. 모델이 답변을 시작하게 두되, 턴 종료 토큰에 도달하기 전에 사용자가 다시 말하기 시작하면 생성을 취소하고 다시 300ms를 기다립니다. 이걸 반복합니다. 또한 추론 속도와 무관하게 최종 LLM 답변이 확정되도록 안전 윈도우도 설정해야 합니다. 아주 잘 동작합니다. 기본적으로 사용자는 그 "침묵" 윈도우 때문에 최대 300ms의 지연을 겪게 됩니다. 그래서 지연 측면에서 신경 써야 할 나머지는 LLM 추론 속도와 ASR, TTS 지연뿐입니다. 제 파이프라인에서는 사용자가 말을 멈추는 순간 모델이 이미 약 900ms~1.2초 안에 응답하고 있습니다. 제 gemma 26b moe 모델이고, 4비트 양자화에 thinking 켜짐... mtp로 초당 약 300 토큰 정도 나옵니다... ASR과 TTS는 둘 다 합쳐서 350ms 미만입니다... 어쨌든 thinking을 끄면 속도는 더 개선될 수 있지만, 제 음성 에이전트는 툴 호출 기능이 있고 thinking을 끄면 상식 능력이 떨어지기 때문에 똑똑하게 두고 싶습니다.... 재밌네요!
- com2kid
이걸 올리는 게 이번이 세 번째쯤 되는 것 같네요 -
아주 빠른, 작고 형편없는 LLM을 돌리세요. 아니면 요즘엔 결정 모델(decision model)을 써보는 게 더 좋습니다.
이전 대화 턴과 지금까지 확보한 모든 STT(ASR 출력)를 넣고, 사용자가 말을 끝냈을 확률을 물어보세요.
그 확률을 이용해 VAD 시간을 줄이면 됩니다.
진짜 음성 대 음성 모델만큼 좋지는 않지만, 순수 VAD에 비해 수백 ms를 줄여줍니다. 보너스로, 사용자가 아직 말을 끝내지 않았을 때는 더 오래 기다릴 수도 있게 해줍니다.