음성 에이전트 — Pipecat과 LiveKit
음성 에이전트(voice agent)는 2026년에 프로덕션의 한 축으로 자리 잡은 범주입니다. Pipecat은 Python 기반 프레임 파이프라인(frame-based pipeline)을 제공합니다. 흐름은 VAD → STT → LLM → TTS → 전송(transport)입니다. LiveKit Agents는 WebRTC를 통해 AI 모델과 사용자를 연결합니다. 프리미엄 스택의 프로덕션 지연 시간 목표는 전체 구간(end-to-end) 기준 450-600ms 수준입니다.
유형: Learn
언어: Python (stdlib)
선수 학습: Phase 14 · 01 (Agent Loop), Phase 14 · 12 (Workflow Patterns)
소요 시간: 약 60분
학습 목표
- Pipecat의 프레임 기반 파이프라인을 설명합니다. DOWNSTREAM은 소스(source)에서 싱크(sink)로 흐르고, UPSTREAM은 제어(control)를 다룹니다.
- 표준 음성 파이프라인 단계와 Pipecat이 지원하는 전송 방식을 말할 수 있습니다.
- LiveKit Agents의 두 음성 에이전트 클래스인
MultimodalAgent와 VoicePipelineAgent를 설명하고, 각각이 언제 맞는지 구분합니다.
- 2026년 프로덕션 지연 시간 기대치를 요약하고, 그것이 아키텍처 선택을 어떻게 밀어붙이는지 설명합니다.
문제
음성 에이전트는 텍스트 루프에 TTS를 덧붙인 것이 아닙니다. 지연 시간 예산(latency budget)은 가혹합니다. 목표는 약 600ms이고, 부분 오디오(partial audio)가 기본이며, 턴 감지(turn detection) 자체가 하나의 모델입니다. 전송 방식도 전화망 SIP(telephony SIP)부터 WebRTC까지 다양합니다. 결국 프레임 기반 파이프라인(Pipecat)을 직접 만들거나, 플랫폼(LiveKit)에 기대야 합니다.
개념
Pipecat (pipecat-ai/pipecat)
- Python 프레임 기반 파이프라인 프레임워크입니다.
Frame → FrameProcessor 체인으로 구성됩니다.
- 흐름 방향은 두 가지입니다.
- DOWNSTREAM — 소스 → 싱크입니다. 오디오가 들어오고, TTS가 나갑니다.
- UPSTREAM — 피드백과 제어입니다. 취소(cancellation), 지표(metrics), 말 끼어들기(barge-in)를 다룹니다.
PipelineTask는 이벤트(on_pipeline_started, on_pipeline_finished, on_idle_timeout)와 지표/추적/RTVI용 관찰자(observer)를 통해 생명주기(lifecycle)를 관리합니다.
전형적인 파이프라인은 다음과 같습니다.
VAD (Silero) → STT → LLM (컨텍스트가 user/assistant 역할을 번갈아 가짐) → TTS → transport
지원 전송 방식은 Daily, LiveKit, SmallWebRTCTransport, FastAPI WebSocket, WhatsApp입니다.
Pipecat Flows는 구조화된 대화(structured conversations), 즉 상태 머신(state machines)을 추가합니다. Pipecat Cloud는 관리형 런타임(managed runtime)입니다.
LiveKit Agents (livekit/agents)
- WebRTC를 통해 AI 모델과 사용자를 연결합니다.
- 핵심 개념은
Agent, AgentSession, entrypoint, AgentServer입니다.
- 음성 에이전트 클래스는 두 가지입니다.
- MultimodalAgent — OpenAI Realtime 또는 그에 준하는 모델을 통해 오디오를 직접 처리합니다.
- VoicePipelineAgent — STT → LLM → TTS 캐스케이드(cascade)입니다. 텍스트 수준 제어(text-level control)를 제공합니다.
- 트랜스포머 모델(transformer model)을 통한 의미 기반 턴 감지(semantic turn detection)를 제공합니다.
- MCP 통합이 기본으로 제공됩니다.
- SIP를 통한 전화망 연동을 지원합니다.
- LiveKit Inference를 쓰면 API 키 없이 50개 이상의 모델을 사용할 수 있고, 플러그인을 통해 200개 이상의 모델을 더 쓸 수 있습니다.
상용 플랫폼
Vapi는 최적화된 프리미엄 스택에서 약 450-600ms를 목표로 하고, Retell은 180개 테스트 통화에서 전체 구간 약 600ms를 보고합니다. WebRTC 팀 없이 관리형 음성 스택을 원한다면 이런 플랫폼을 고릅니다.
이 패턴이 잘못되는 지점
- 말 끼어들기 처리(barge-in handling)가 없는 경우. 사용자가 중간에 끼어들어도 에이전트가 계속 말합니다. Pipecat에서는 UPSTREAM 취소 프레임(cancel frames)이 필요하고, LiveKit에도 그에 해당하는 처리가 필요합니다.
- STT 신뢰도(confidence)를 무시하는 경우. 신뢰도가 낮은 전사(transcript)를 마치 복음처럼 LLM에 넣습니다. 신뢰도 기준으로 게이트를 두거나 확인을 요청해야 합니다.
- TTS가 문장 중간에서 끊기는 경우. 파이프라인이 발화 중간에 취소되면, TTS가 그 사실을 알아야 하거나 오디오를 잘라야 합니다.
- 지연 시간 예산을 무시하는 경우. 모든 구성 요소가 50-200ms를 더합니다. 출시하기 전에 체인의 합계를 계산해야 합니다.
2026년의 일반적인 지연 시간
- VAD: 20-60ms
- STT 부분 결과: 100-250ms
- LLM 첫 토큰: 150-400ms
- TTS 첫 오디오: 100-200ms
- 전송 왕복 시간(transport RTT): 30-80ms
전체 구간 450-600ms는 프리미엄 수준입니다. 800-1200ms는 흔합니다. 1500ms를 넘으면 고장 난 것처럼 느껴집니다.
만들어보기
code/main.py는 다음을 포함한 프레임 기반 장난감 파이프라인입니다.
Frame 유형입니다. audio, transcript, text, tts_audio, control이 있습니다.
process(frame)을 가진 Processor 인터페이스입니다.
- 스크립트형 처리기로 구성된 5단계 파이프라인입니다. VAD → STT → LLM → TTS → transport입니다.
- 말 끼어들기를 보여주기 위한 UPSTREAM 취소 프레임입니다.
실행합니다.
python3 code/main.py
추적 출력은 정상 흐름과, TTS를 발화 중간에 멈추는 말 끼어들기 취소를 보여줍니다.
사용해보기
- Pipecat은 완전한 제어가 필요할 때 씁니다. 커스텀 처리기, Python 우선 구조, 교체 가능한 공급자(provider)를 사용할 수 있습니다.
- LiveKit Agents는 WebRTC 우선 배포와 전화망 연동에 적합합니다.
- Vapi / Retell은 WebRTC 팀 없이 호스팅 음성 에이전트를 쓰고 싶을 때 적합합니다.
- OpenAI Realtime / Gemini Live는 오디오 입력/오디오 출력(direct audio-in/audio-out), 즉
MultimodalAgent 방식에 적합합니다.
산출물 만들기
outputs/skill-voice-pipeline.md는 VAD + STT + LLM + TTS + 전송, 그리고 말 끼어들기 처리를 포함한 Pipecat 형태의 음성 파이프라인을 스캐폴딩합니다.
연습문제
- 장난감 파이프라인에 지표 관찰자(metrics observer)를 추가하세요. 초당 단계별 프레임 수를 세어봅니다. 지연 시간은 어디에 쌓이나요?
- 신뢰도 게이트가 있는 STT(confidence-gated STT)를 구현하세요. 임계값보다 낮으면 "다시 말씀해 주시겠어요?"를 요청합니다.
- 의미 기반 턴 감지를 추가하세요. 단순 규칙으로, 전사 문장이 "?"로 끝나면 턴이 끝났다고 봅니다.
- Pipecat의 전송 문서를 읽어보세요. stdlib 전송을 SmallWebRTCTransport 설정으로 바꾸는 스텁(stub)을 작성합니다.
- 같은 질의에 대해 OpenAI Realtime과 STT+LLM+TTS 캐스케이드를 측정하세요. 텍스트 수준 제어는 어떤 지연 시간 비용을 갖나요?
핵심 용어
| 용어 | 흔한 설명 | 실제 의미 |
|---|
| 프레임(Frame) | "이벤트(event)" | 파이프라인 안에서 이동하는 유형 있는 데이터 단위입니다. 오디오, 전사, 텍스트, 제어가 될 수 있습니다. |
| 처리기(Processor) | "파이프라인 단계" | process(frame)을 가진 핸들러(handler)입니다. |
| DOWNSTREAM | "앞으로 흐르는 흐름" | 소스에서 싱크로 가는 흐름입니다. 오디오가 들어오고 음성이 나갑니다. |
| UPSTREAM | "피드백 흐름" | 취소, 지표, 말 끼어들기를 위한 제어 흐름입니다. |
| VAD | "음성 활동 감지(Voice activity detection)" | 사용자가 말하고 있는지를 감지합니다. |
| 의미 기반 턴 감지(Semantic turn detection) | "스마트한 발화 종료 감지" | 사용자의 말이 끝났는지를 모델 기반으로 판단합니다. |
| MultimodalAgent | "직접 오디오 에이전트" | 오디오가 들어가고 오디오가 나옵니다. 중간에 텍스트가 없습니다. |
| VoicePipelineAgent | "캐스케이드 에이전트" | STT + LLM + TTS 구조입니다. 텍스트 수준 제어가 가능합니다. |
더 읽을거리