Vonage Voice API와 ElevenLabs Conversational AI를 활용한 실시간 음성 대화 AI 아키텍처 상세 분석
요약
본 글은 Vonage Voice API와 ElevenLabs Conversational AI를 결합하여 초저지연 실시간 음성 대화 시스템을 구축하는 아키텍처를 상세히 분석합니다. 핵심은 미들웨어 서버가 Vonage의 전화 스트림과 ElevenLabs의 AI 통신을 WebSocket으로 브릿징(중계)하는 것입니다. 이를 통해 기존 3단계 API 호출 방식 대비 지연 시간을 획기적으로 줄였습니다.
핵심 포인트
- Vonage Voice API와 ElevenLabs Conversational AI를 결합하여 실시간 음성 대화 시스템 구축 가능
- 미들웨어 서버가 두 서비스 간의 WebSocket 연결 및 데이터 포맷 변환을 담당하는 것이 핵심 아키텍처
- ElevenLabs의 Conversational AI는 ASR, LLM, TTS 과정을 단일 연결에서 처리하여 지연 시간을 최소화함
- 전통적인 3단계 API 호출 방식 대비 밀리초 단위의 응답 속도와 Barge-in 처리가 가능해짐
안녕하세요. 이번에는 전화망과 최첨단 음성 AI를 매끄럽게 통합하는 데모 프로젝트인 vonage-voice-ws-elevenlabs-convAI-demo의 아키텍처를 자세히 분석하고 개발 엔지니어들에게 설명합니다.
이 메커니즘을 이해함으로써, Vonage Voice API의 WebSocket 기능과 ElevenLabs Conversational AI를 결합하여 지연 시간이 극도로 적은 실시간 전화 기반 AI 대화 시스템(AI 에이전트, 자동 응답 시스템 등)을 구축할 수 있습니다.
본 구성의 핵심은 'Vonage로부터의 전화 음성 스트림'과 'ElevenLabs AI와의 통신'을 자체 서버(미들웨어) 내에서 WebSocket을 사용하여 실시간으로 브릿지(중계)하는 메커니즘입니다.
- 통신 인프라: Vonage Voice API (전화망 발신/수신, NCCO를 이용한 호출 제어 및 WebSocket 라우팅)
- 음성 AI 모델: ElevenLabs Conversational AI (음성 인식 ASR + LLM 추론 + 음성 합성 TTS를 통합한 실시간 대화 엔드포인트)
- 프로토콜: WebSocket (양방향 바이너리 음성 스트리밍)
- 서버 사이드: Node.js / Python (WebSocket 브릿지 서버 역할 수행)
사용자가 전화를 걸어 AI가 응답하기까지의 전체 흐름을 Mermaid 다이어그램으로 보여드립니다.
Vonage Voice API는 수신 전화를 받으면 개발자가 지정한 Webhook(Answer URL)으로 HTTP 요청을 보냅니다. 이때, 서버 측은 다음과 같은 NCCO(JSON 포맷의 호출 제어 명령)를 반환함으로써 '전화 음성을 WebSocket을 통해 서버로 스트리밍 해달라'고 지시합니다.
[
{
"action": "connect",
...
- : Vonage와 서버 간의 음성 포맷입니다. 압축되지 않은 리니어 PCM(16bit), 샘플링 레이트 16kHz의 원본 음성 데이터가 스트리밍됨을 의미합니다.
audio/l16;rate=16000
미들웨어 서버의 가장 큰 역할은 Vonage와 ElevenLabs의 두 개의 WebSocket 연결을 실시간으로 연결하고, 데이터를 배스 리레이(bucket relay)하는 것입니다.
-
Vonage로부터의 연결 수신: Vonage로부터의 WebSocket 연결을 받아 초기 메타데이터(발신 번호 등)를 처리합니다.
-
ElevenLabs로의 연결: ElevenLabs의 Conversational AI 엔드포인트에 클라이언트로 연결하고, Agent ID를 전달하여 세션을 시작합니다.
-
양방향 포맷 변환 및 중계:
-
Vonage에서 들어오는 바이너리 PCM 음성을 ElevenLabs가 수용할 수 있는 포맷(Base64 인코딩된 JSON 메시지 등)으로 변환하여 전송합니다.
-
반대로 ElevenLabs에서 돌아오는 음성 데이터를 바이너리로 디코드하여 Vonage의 WebSocket 연결로 흘려보냅니다.
지금까지는 고급 음성 봇을 만들 때 'Google/AWS 등에서 텍스트화(ASR)' → 'OpenAI 등에서 텍스트 응답(LLM)' → 'ElevenLabs 등에서 음성화(TTS)'와 같이, 3개의 API를 순차적으로 호출해야 했으며 이로 인해 수 초의 레이턴시가 피할 수 없었습니다.
ElevenLabs의 'Conversational AI'는 이 모든 것을 하나의 WebSocket 연결 내에서 완전 관리형으로 완결시킵니다. 이러한 통합 덕분에 네트워크 오버헤드가 극적으로 줄어들어, 사람과 대화하는 것 같은 밀리초 단위의 응답 속도가 실현됩니다. 또한, AI가 발화하는 도중에 사용자가 끼어들여 말하기 시작하는(Barge-in / Interruption) 처리도 ElevenLabs 측에서 지능적으로 저지연으로 제어됩니다.
개발 엔지니어가 본 아키텍처를 구현할 때 특히 주의해야 할 트러블슈팅 포인트입니다.
Vonage로부터의 WebSocket 스트림은 16000Hz의 audio/l16 입니다.
ElevenLabs에 대해 '16kHz PCM으로 송수신' 설정을 정확하게 하지 않으면, 음성이 빠르게 재생되거나 느리게 재생되거나 심각한 노이즈가 발생할 수 있습니다. 양방향으로 설정 파라미터를 완벽하게 일치시키는 것이 가장 중요합니다.
순수한 음성 데이터뿐만 아니라, 제어용 메타데이터(JSON)가 동일한 WebSocket 라인을 통해 흐릅니다.
- Vonage 측: 연결 직후에 메타데이터를 포함하는 메시지(
event: "websocket:connected"등)를 텍스트 프레임으로 전송해 옵니다. - ElevenLabs 측: '사용자 발화 시작', 'AI 발화 종료' 등의 메타데이터 이벤트를 JSON으로 발생시킵니다.
바이너리 데이터 프레임(음성)과 텍스트 프레임(제어 JSON 메시지)의 핸들링을 정확하게 분리 및 파싱하고, 애플리케이션이 충돌하지 않도록 예외 처리를 구현해야 합니다.
실시간 대화에서 서버 측의 의도치 않은 버퍼링은 치명적입니다. ElevenLabs로부터 돌아온 음성 청크(조각)는 큰 크기로 쌓아두려고 하지 말고, 수신한 즉시 Vonage의 WebSocket에 쓰는(스트리밍 처리) 구현을 해야 합니다.
vonage-voice-ws-elevenlabs-convAI-demo
의 아키텍처는 '전화망(Vonage)과 최첨단 음성 생성 AI(ElevenLabs)를 WebSocket으로 직결하는' 차세대 음성 대화 애플리케이션에서 표준적인 구성입니다.
이 구성을 기반으로 함으로써, 고객 지원 자동 응답, 영어 회화 AI 튜터, 노인 대상 안부 전화 등 다양한 전화 기반의 AI 제품을 낮은 지연 시간과 자연스러운 사용자 경험으로 제공하는 것이 가능해집니다. 꼭 직접 환경에서 작동시켜 그 압도적인 응답 속도를 체감해 보시기 바랍니다.
꼭 리포지토리를 클론하여 로컬에서 실행해 보세요. PR, Issue 보고 등 느끼신 점이나 제안 사항이 있으시면 주저하지 마시고 알려주세요。
이미지를 클릭하면 YouTube 동영상이 재생됩니다
AI 자동 생성 콘텐츠
본 콘텐츠는 Qiita AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기