본문으로 건너뛰기
김신건의 로그

[Voice AI] 음성 에이전트 아키텍처: Cascading / Streaming / S2S + Latency Budget

· 수정 · 📖 약 3분 · 1,067자/단어 #voice-agent #architecture #latency #streaming #cascading #s2s
voice agent architecture, cascaded pipeline, streaming pipeline, speech-to-speech, latency budget, end-to-end voice

정의

실시간 음성 AI 의 3가지 패턴. 각자 지연 vs 유연성 vs 비용 트레이드오프.

3 패턴 비교

flowchart TB
    subgraph Cascading["1. Cascading (순차)"]
        C1[STT] --> C2[LLM] --> C3[TTS]
        Note1["2-4초 지연 (직렬)"]
    end
    subgraph Streaming["2. Streaming (병행)"]
        S1[STT chunks] -.partial.-> S2[LLM streaming]
        S2 -.tokens.-> S3[TTS streaming]
        Note2["< 1초 지연 (병행)"]
    end
    subgraph S2S["3. Speech-to-Speech"]
        D1[Audio In] --> D2[Multimodal Model]
        D2 --> D3[Audio Out]
        Note3["< 300ms (직접 처리)"]
    end
CascadingStreamingS2S
종단 지연2-4초< 1초< 300ms
구현 난이도쉬움중간어려움 (제약)
유연성최고 (각 단계 교체)높음낮음 (벤더 lock)
비용낮음중간높음
Function callingOKOK제한
톤/감정 보존XX
한국어모델 마다모델 마다일부 (Realtime API 한국어)
사용MVP / 일반프로덕션 표준고급 UX

1. Cascading (순차)

sequenceDiagram
    User->>STT: 발화 (3초)
    Note over STT: 발화 종료 대기 + 전사 (500ms)
    STT->>LLM: 전체 텍스트
    Note over LLM: 응답 생성 (1500ms)
    LLM->>TTS: 전체 응답
    Note over TTS: 음성 합성 (800ms)
    TTS->>User: 음성 시작
    Note over User,TTS: 총: ~3초 지연
async def cascaded_pipeline(audio_url):
    transcript = await stt.transcribe(audio_url)   # 발화 끝나길 기다림
    response = await llm.chat(transcript)           # 전체 응답
    audio = await tts.synthesize(response)          # 전체 합성
    return audio

MVP 에는 OK. 프로덕션은 streaming 으로 진화.

2. Streaming (현재 표준)

sequenceDiagram
    User->>STT: 발화 (3초)
    par
        STT-->>LLM: partial "안녕"
        STT-->>LLM: partial "안녕하세요"
        STT-->>LLM: FINAL "안녕하세요, 오늘 회의"
        LLM-->>TTS: 토큰 "오늘은"
        LLM-->>TTS: 토큰 "수요일입니다"
        TTS-->>User: 오디오 청크 1
        TTS-->>User: 오디오 청크 2
    end
    Note over User: 음성 종료 후 < 1초 응답
async def streaming_pipeline(audio_stream):
    async for transcript_chunk in stt.stream(audio_stream):
        if transcript_chunk.is_final:
            async for token in llm.stream(transcript_chunk.text):
                sentence = aggregator.feed(token)
                if sentence:
                    async for audio_chunk in tts.stream(sentence):
                        yield audio_chunk

IMPORTANT

모든 단계 스트리밍 + sentence aggregator. 2026 시점 프로덕션 음성 AI 의 표준.

3. Speech-to-Speech (S2S)

sequenceDiagram
    User->>Realtime: 오디오 stream (WebRTC / WS)
    Note over Realtime: GPT-4o / Gemini Live<br/>(직접 오디오 처리)
    Realtime-->>User: 오디오 stream (< 300ms)
모델출시한국어특징
OpenAI Realtime API (GPT-4o)2024-10우수WebRTC / WS, function calling 부분
Gemini Live (gemini-live-2.5)2024-12우수Google AI Studio
Moshi (Kyutai)OSS영어full-duplex, 자체 호스팅

CAUTION

S2S 의 function calling 제약 = enterprise 시스템 연동 어려움. function 이 필수면 cascading + streaming 채택. [arXiv 참조].

Latency Budget (지연 예산)

flowchart LR
    Mic["마이크 (사용자 발화 끝)"] -->|VAD endpointing 200-500ms| STT
    STT -->|"STT (100-500ms)"| LLM
    LLM -->|"LLM TTFT (200-2000ms)"| TTS
    TTS -->|"TTS TTFA (200-800ms)"| Speaker
    Speaker -->|<= 1000ms| User
단계일반최적
Network (Mic → Server)30-100ms20ms
VAD endpointing500ms200ms (시맨틱)
STT (final)200-500ms100ms
LLM TTFT (Time-to-First-Token)500-2000ms200ms
Sentence aggregation50-200ms0 (streaming)
TTS TTFB200-800ms90ms (Cartesia)
Network (Server → Speaker)30-100ms20ms
2-4초< 700ms

IMPORTANT

800ms 가 “로봇 같지 않게 느껴지는” 임계. 사람 평균 응답 300-500ms. 모든 단계 동시 최적화 필요.

단계별 최적화

flowchart TB
    Opt[지연 줄이기]
    Opt --> S1[STT: 시맨틱 endpointing, partial 안 기다림]
    Opt --> S2[LLM: 작은 모델, TTFT 최우선, KV-cache]
    Opt --> S3[TTS: streaming + Cartesia급 모델]
    Opt --> Net[Network: WebRTC < WebSocket < HTTP]
    Opt --> Hop[Hop 축소: 같은 region, edge]

결정 트리

flowchart TD
    Q1{지연 요구}
    Q1 -->|< 300ms 필수| S2S_check{Function calling 필수?}
    Q1 -->|< 1초 OK| Stream[Streaming pipeline]
    Q1 -->|2-3초 OK + MVP| Cascade[Cascading]
    S2S_check -->|아니오| S2S[S2S 모델]
    S2S_check -->|예| Stream

한국 시장 권장

시나리오권장
콜봇 (상담)Streaming: CLOVA STT + GPT-4o-mini + CLOVA Voice
고급 음성 AIStreaming: Deepgram + GPT-4o + Cartesia
비용 절감Cascading: Whisper + GPT-3.5 + Edge TTS
톤/감정 criticalS2S: GPT-4o Realtime

흔한 함정

WARNING

  1. STT/LLM/TTS 각자 다른 region = network hop 누적 → 500ms+. 같은 region.
  2. batch 모델로 시작했다가 latency 못 맞춤 = 처음부터 streaming 모델.
  3. LLM 응답 끝나길 기다리고 TTS 시작 = TTS 의 streaming 의미 없음.
  4. VAD 없이 STT = STT 가 전사 못 끝남. 발화 종료 감지 필수.

인프라 요구사항

네트워크

음성 에이전트는 낮은 레이턴시가 생명입니다.

프로토콜지연용도
WebRTC최저브라우저 / 모바일 클라이언트. 미디어 서버 (LiveKit, Daily) 경유.
WebSocket낮음서버-서버 또는 기기 연결. 텍스트/바이너리 양방향 스트림.
HTTP chunked높음단순 구현 가능하나 지연 큼. 프로토타입에만 권장.

VAD (Voice Activity Detection) 선택

발화 종료를 얼마나 정확히, 얼마나 빠르게 감지하느냐가 전체 latency budget 의 핵심입니다.

VAD 방식지연설명
에너지 기반매우 낮음단순 볼륨 임계값. 오탐 많음.
Silero VAD낮음경량 ML 모델 (5 MB). 정확도-속도 균형. 가장 많이 쓰임.
시맨틱 endpointing중간STT partial 결과를 LLM 으로 “문장이 끝났는가” 판단. 가장 자연스러움.

Sentence Aggregator

STT 의 partial transcript 를 LLM 에 넘길 적절한 단위로 묶는 컴포넌트.

  • 너무 짧게 끊으면: LLM 이 컨텍스트 없이 처리 → 어색한 응답
  • 너무 길게 기다리면: TTS 시작이 늦어짐

일반적으로 문장 완성 (마침표, 쉼표 후 길이 임계) 기준으로 aggregation.

프로덕션 체크리스트

배포 전 검증 항목:

항목검증 방법
p50 / p95 / p99 latency실제 통화 10,000 건 이상 메트릭 수집
Barge-in사용자가 응답 도중 끊을 때 TTS 즉시 중단 + STT 재개
VAD 오탐 / 미탐배경 소음 환경 테스트 (사무실, 카페)
LLM fallback타임아웃 시 “잠시만 기다려 주세요” 응답
TTS 오류 복구TTS API 오류 시 기본 합성 폴백
동시 세션 수서버당 최대 동시 통화 수 부하 테스트
오디오 코덱Opus 16 kHz mono (WebRTC 표준), G.711 (전화망)

모니터링 메트릭

flowchart LR
    Mic["사용자 발화 종료"] -->|VAD delay| STT_start["STT 시작"]
    STT_start -->|STT latency| LLM_start["LLM 호출"]
    LLM_start -->|TTFT| TTS_start["TTS 첫 청크"]
    TTS_start -->|TTFB| Speaker["스피커 출력 시작"]

추적해야 하는 메트릭:

  • VAD endpointing delay: 실제 발화 종료 ~ STT 시작
  • STT latency: 오디오 수신 ~ final transcript
  • LLM TTFT (Time-to-First-Token): 프롬프트 전송 ~ 첫 토큰 수신
  • TTS TTFB (Time-to-First-Byte): 텍스트 전송 ~ 첫 오디오 청크
  • 종단 latency: VAD 종료 ~ 스피커 첫 소리

각 단계를 OpenTelemetry span 으로 기록하면 병목이 어느 단계인지 즉시 파악됩니다.

관련 위키

이 글의 용어 (9개)
[Voice AI] 음성 우선 프롬프트 + Function Calling + Structured Outputai
음성 우선 프롬프트 설계 음성 답변 = 귀로 듣는다. 텍스트 답변과 완전 다르게 짜야 한다. 음성 프롬프트의 핵심 원칙 | 원칙 | 의미 | |---|---| | 짧게 | 한 답…
[Voice AI] P50/P95/P99: latency 분포와 SLOdevops
정의 P50 / P95 / P99 = latency 분포의 분위수. 평균은 outlier 에 가려져 무의미. 음성 에이전트의 사용자 경험 은 p95/p99 가 결정. [!IMPO…
[Voice AI] Pipecat vs LiveKit Agents: 프레임워크 비교ai
정의 2026 시점 voice agent 프레임워크 4가지 선택지: | | Pipecat | LiveKit Agents | Vapi / Retell | 자체 구축 | |---|-…
[Voice AI] Speech-to-Speech: OpenAI Realtime, Gemini Live, Moshivoice
정의 S2S (Speech-to-Speech) = STT → LLM → TTS 직렬 파이프라인 우회, 오디오 → 오디오 직접 처리. 톤/감정 보존 + < 300ms latency…
[Voice AI] STT 스트리밍: partial vs final, endpointing, gRPC/WSvoice
정의 스트리밍 STT = 오디오 청크 가 들어올 때마다 부분 결과 (partial) 를 즉시 반환 + 발화 종료 시 최종 결과 (final) 확정. [!IMPORTANT] 대화형…
[Voice AI] TTS 스트리밍 + SSML: TTFB, sentence aggregation, 청킹voice
정의 TTS 스트리밍 = 텍스트 일부만 받아도 즉시 합성 + 오디오 청크 단위 전송. TTFB (Time-to-First-Audio) 최소화 = 대화 자연스러움의 핵심. TTFB…
[Voice AI] Turn Detection + Barge-in + AEC: 자연스러운 대화voice
정의 자연스러운 음성 대화의 3 요소: 1. Turn Detection - 사용자가 말끝났는지 정확히 판단 2. Barge-in - 에이전트가 말하는 중에 사용자가 끼어들 수 있…
[Voice AI] VAD: Silero, 에너지 기반, endpointing 임계값voice
정의 VAD (Voice Activity Detection) = 오디오 스트림에서 음성 vs 비음성 (침묵, 노이즈) 구분. 음성 에이전트의 발화 시작 / 종료 감지에 필수. 종…
[Voice AI] Voice RAG: 지연 병목 + 예측적 프리페치ai
정의 Voice RAG = 음성 에이전트에 RAG (Retrieval-Augmented Generation) 결합. 벡터 DB 조회 가 지연 누적 의 큰 원인이 되므로 예측적 프…

💬 댓글

사이트 검색 / 명령어

검색

스크롤 = 확대/축소 · 드래그 = 이동 · 0 = 원래 크기 · ESC = 닫기