한 줄 정의

실시간 음성 에이전트 아키텍처는 cascade pipeline의 지연과 말 끊기 오류를 극복하기 위해 네이티브 양방향 스트리밍 모델과 클라이언트 오디오 버퍼 제어를 결합한 음성 대화 시스템 설계다.

핵심 요지

  • 기존 STT-LLM-TTS의 직렬 파이프라인(cascade)은 모델이 계속 떠드는 ‘불도저형’ 또는 숨소리에 반응해 대화 싱크가 깨지는 ‘과민반응형’ 오류를 초래한다.
  • 네이티브 양방향 모델(gemini-3.1-flash-live-preview 등)을 통해 입출력 오디오 바이트 스트림을 단일 웹소켓 세션에서 직접 제어한다.
  • 클라이언트는 마이크 큐, 스피커 큐, 송수신 큐를 비동기 제어하고, 서버가 interrupted 이벤트를 보낼 때 스피커 큐를 플러시(flush)하여 중단 처리를 구현한다.

상세

실시간 음성 아키텍처 핵심 제어 규격

  • 오디오 포맷 프로토콜: Gemini Live는 입력 16-bit PCM, 16 kHz 모노 및 출력 16-bit PCM, 24 kHz 모노를 강제한다. 규격 외 데이터 유입 시 재생 지연 및 왜곡이 발생한다.
  • VAD (Voice Activity Detection): 서버 측 VAD(automatic_activity_detection.disabled=False)는 웹소켓에서 발화 여부를 자동 연산해 interrupted 신호를 던진다. 노이즈가 극심한 산업 환경에서는 클라이언트 측 로컬 VAD를 구동해 제어 메시지를 송출해야 한다.
  • CHUNK_SIZE: 1024 프레임(약 64ms 분량)이 레이턴시 단축과 네트워크 오버헤드 부하 절감의 최적 임계점이다.
  • 세션 복원 (Session Resumption): 15분 타임아웃 및 10분 주기 웹소켓 GoAway 수신 시, SessionResumptionUpdate 핸들을 캐싱했다가 재접속 시 바인딩하여 2시간 내에서 대화 맥락을 즉시 복원한다.
  • 지터 버퍼 (Jitter Buffer): 네트워크 지터를 극복하고 음 끊김(dropout)을 방지하기 위해 50~100ms 가량 오디오 버퍼 지연을 고의 주입한다.
  • 필러 워드 (Filler Word) 및 데드 에어(Dead Air) 통제: 3초 이상 오디오가 비는 것을 막기 위해 도구 조회가 400ms를 초과할 경우, 모델이 먼저 추임새를 말하게 유도하고 백그라운드 비동기 함수로 API 조회를 수행한다.

예시

파이썬 asyncio 기반 입출력 배선 코드 스니펫

  • 별도 C 스레드에서 유입되는 마이크 콜백 데이터를 파이썬 메인 스레드로 안전하게 덤프하기 위해 call_soon_threadsafe를 사용한다.
# 마이크 캡처 콜백 예시
def callback(indata, frames, time_info, status):
    loop.call_soon_threadsafe(mic_queue.put_nowait, bytes(indata))
  • 스피커 중단 처리(Flush):
if sc.interrupted:
    interrupt_event.set()
    while not speaker_queue.empty():
        try:
            speaker_queue.get_nowait()
        except asyncio.QueueEmpty:
            break

충돌

관련 노트