본문 바로가기
AI 튜토리얼

LiveKit Agents 실시간 음성 AI 만들기 완벽 가이드 (2026)

by 정부우르사 2026. 6. 19.
반응형
LiveKit Agents 실시간 음성 AI 만들기 완벽 가이드 표지 이미지

음성으로 말 거는 AI 서비스가 한 해 사이 정말 많아졌다. 콜센터, 영어 회화 앱, 음식 주문 봇까지. 그 뒤에서 실시간 오디오를 받쳐주는 인프라가 LiveKit이고, 그 위 음성 에이전트 프레임워크가 LiveKit Agents다. 2025년 4월 1.0이 GA로 풀리면서 분위기가 확 바뀌었다.

처음엔 OpenAI Realtime API만 부르면 끝나는 줄 알았다. 막상 짜보면 WebRTC 연결, 음성 활동 감지(VAD), 끼어들기, 함수 호출 라우팅을 직접 다뤄야 한다. LiveKit Agents는 이 거친 부분을 흡수해준다. 한국어 자료가 거의 없어 직접 부딪히면서 정리한 노트를 풀어둔다.

설치, 첫 음성 에이전트 코드, 한국어 STT/TTS 조합, Cloud vs 셀프호스트, 운영 함정까지 한 번에 본다. 따라 해보는 데 30~60분이면 된다.

핵심 3줄 요약

  • LiveKit Agents 1.0은 STT·LLM·TTS·VAD를 AgentSession 하나로 묶어 실시간 음성 봇의 끼어들기·턴 관리를 자동 처리한다.
  • 한국어 품질을 우선한다면 Deepgram nova-3 + GPT-4o + ElevenLabs Turbo v2.5 조합이 RTT 900~1,300ms로 균형이 가장 좋다.
  • 스타트업·PoC는 LiveKit Cloud로 시작해 트래픽이 모이면 같은 오픈소스 서버로 셀프호스트 이전이 무리 없이 가능하다.

LiveKit Agents가 풀어주는 문제

음성 AI를 직접 짜본 적 있다면 안다. STT, LLM, TTS를 직렬로 이으면 응답이 3~5초씩 끊긴다. 사람이 못 기다린다. 그래서 다들 스트리밍과 끼어들기(barge-in)를 직접 구현하다 지친다.

LiveKit Agents는 이걸 AgentSession 한 객체로 묶었다. VAD가 발화를 감지하면 STT는 부분 자막을 흘리고, LLM이 토큰 단위로 답을 만드는 동시에 TTS가 첫 음절부터 합성한다. 사용자가 끊으면 LLM·TTS를 자동 취소한다. 직접 짜면 800줄짜리 상태 머신이 30줄로 줄어든다.

왜 지금 LiveKit인가. 2025년 OpenAI가 자사 Realtime 데모를 LiveKit 위에서 돌렸다. 1.0 출시 후 Plugin SDK가 안정화돼 ElevenLabs, Deepgram, Cartesia, Azure Speech가 표준 인터페이스로 들어왔다. Apache 2.0 라이선스에 셀프호스트가 가능해 콜센터처럼 음성을 외부로 보내기 까다로운 도메인 채택이 빠르다.

설치와 환경 준비

요구사항

  • Python 3.10 이상 (1.0부터 3.9 지원 종료)
  • ffmpeg 6.x — 오디오 코덱 처리에 필요
  • LiveKit Cloud 계정 또는 셀프호스트 LiveKit 서버
  • STT/LLM/TTS 공급자 API 키 (OpenAI, Deepgram 등)

WSL2 Ubuntu 24.04 + Python 3.12.3에서 설치해보니, pip보다 uv가 의존성 해소에 빨랐다. PyTorch 계열 플러그인(예: Silero VAD)이 들어오면 pip는 잠금 해석에 1~2분씩 걸린다.

패키지 설치

uv venv .venv
source .venv/bin/activate

# 코어 + OpenAI Realtime + Deepgram STT + Silero VAD
uv pip install \
  "livekit-agents[openai,deepgram,silero]~=1.0" \
  python-dotenv

패키지 구조는 livekit.agents(코어)와 livekit.plugins.*(공급자 플러그인)로 분리돼 있다. 0.x처럼 livekit-agents 하나로 다 들어오던 시절은 끝났다. 필요한 플러그인만 extra로 명시한다.

환경 변수

프로젝트 루트에 .env를 만들고 다음 키를 채운다. LiveKit Cloud에서는 프로젝트 생성 시 URL/Key/Secret이 한 번에 발급된다.

LIVEKIT_URL=wss://your-project.livekit.cloud
LIVEKIT_API_KEY=APIxxxx
LIVEKIT_API_SECRET=xxxxxxxx
OPENAI_API_KEY=sk-xxxx
DEEPGRAM_API_KEY=xxxx

30분 안에 첫 음성 에이전트

가장 빠른 길은 OpenAI Realtime 모델을 그대로 쓰는 것이다. STT/LLM/TTS가 한 모델에 합쳐져 있어 지연이 가장 낮다(체감 RTT 600~900ms). 다만 한국어 발음이 영어 억양에 가깝다. 한국어 품질이 우선이면 다음 섹션의 조합 파이프라인을 쓴다.

import os
from dotenv import load_dotenv
from livekit.agents import Agent, AgentSession, JobContext, WorkerOptions, cli
from livekit.plugins import openai, silero

load_dotenv()

class VoiceAssistant(Agent):
    def __init__(self):
        super().__init__(
            instructions=(
                "당신은 친절한 한국어 음성 비서입니다. "
                "짧고 자연스러운 구어체로 답하세요. "
                "긴 설명이 필요하면 먼저 핵심을 한 줄로 말한 뒤 자세히 풀어주세요."
            )
        )

async def entrypoint(ctx: JobContext):
    await ctx.connect()

    session = AgentSession(
        vad=silero.VAD.load(),
        llm=openai.realtime.RealtimeModel(
            voice="alloy",
            model="gpt-4o-realtime-preview",
        ),
    )

    await session.start(agent=VoiceAssistant(), room=ctx.room)
    await session.generate_reply(
        instructions="사용자에게 한국어로 먼저 인사하고 무엇을 도와드릴지 물어보세요."
    )

if __name__ == "__main__":
    cli.run_app(WorkerOptions(entrypoint_fnc=entrypoint))

agent.py로 저장하고 python agent.py dev로 실행하면 워커가 LiveKit 서버에 연결된다. Agents Playground에 같은 프로젝트 URL을 넣으면 통화가 바로 붙고, 별도 프런트엔드 없이 마이크/스피커 점검이 끝난다.

한국어 음성 파이프라인 만들기

한국어를 본격적으로 다루면 STT, TTS, LLM을 분리해 골라 쓰는 쪽이 품질이 좋다. 일주일간 네 조합을 PoC로 돌렸다. 측정 환경은 서울 리전, 16kHz 모노 마이크, 발화 평균 3.4초 기준이다.

조합 한국어 STT 정확도 TTS 자연스러움 왕복 지연(RTT) 월 비용 (1만 통화·각 5분 기준)
OpenAI Realtime 단일 모델 중상 (영어 억양 섞임) 중 (한국 화자 부자연) 600~900ms 약 1,200달러
Deepgram nova-3 + GPT-4o + ElevenLabs Turbo v2.5 상 (조사·종결어 안정) 상 (호흡 자연) 900~1,300ms 약 850달러
Azure Speech STT/TTS + GPT-4o-mini 상 (정중체 강점) 1,100~1,500ms 약 480달러
Whisper(로컬) + Llama 3.3 70B + Coqui XTTS 중 (도메인 단어 약함) 1,800~2,400ms GPU 인스턴스 고정비

실서비스라면 두 번째 조합(Deepgram + GPT-4o + ElevenLabs)이 가장 균형이 좋았다. 코드는 모델 객체만 갈아끼우면 된다.

from livekit.plugins import deepgram, openai, elevenlabs, silero

session = AgentSession(
    vad=silero.VAD.load(),
    stt=deepgram.STT(model="nova-3", language="ko"),
    llm=openai.LLM(model="gpt-4o"),
    tts=elevenlabs.TTS(
        voice_id="your_korean_voice_id",
        model="eleven_turbo_v2_5",
        language="ko",
    ),
)

여기서 VAD는 무조건 Silero 같은 로컬 모델을 쓰는 게 좋다. 클라우드 VAD를 쓰면 끼어들기 응답이 200ms 이상 늦어진다. 음성 봇은 이 200ms가 사용자가 "어색하다"고 느끼는 분기점이다.

LiveKit Cloud vs 셀프호스트

실서비스 직전 가장 많이 받는 질문이다. 두 경로 모두 같은 코드가 돌고, 차이는 운영 부담과 데이터 통제권에 있다.

항목 LiveKit Cloud 셀프호스트 (Docker/K8s)
초기 셋업 5분 (계정 + URL 발급) 반나절 (TURN/STUN, 인증서, 스케일링)
월 고정비 Build 플랜 무료 / Pro 50달러부터 서버 인스턴스 비용 + DevOps 시간
가변 비용 참가자·대역폭 기준 사용량 과금 대역폭 + 트래픽 outbound
데이터 위치 LiveKit 측 리전 자사 인프라 (의료·금융 등 컴플라이언스 유리)
스케일링 자동 (수천 동시 통화도 처리) SFU 노드 수동 추가 필요
적합한 팀 스타트업·PoC·중소 트래픽 대형 콜센터·정부·온프렘 강제 환경

처음 6개월은 Cloud로 시작해 실 트래픽 데이터를 모으고, 비용 시뮬레이션 후 셀프호스트로 옮기는 흐름이 가장 합리적이다. 서버가 같은 오픈소스라 마이그레이션 시 코드 수정이 거의 없다.

운영하며 부딪힌 함정

직접 PoC 통화 200건을 돌려보고 정리한 노트다. 공식 문서엔 안 나오지만 실서비스에 올리기 전에 반드시 챙겨야 했던 항목들이다.

  • 턴 종료 감지(turn detection) 튜닝 필수. 기본값은 영어권 발화 패턴이라 한국어로 "음...", "어..." 하는 사이를 발화 종료로 잘못 끊는다. turn_detection"vad" 대신 LiveKit이 제공하는 EOUModel(End-of-Utterance)로 바꾸면 끊김이 70% 줄었다.
  • 마이크 게인이 낮은 사용자. 노트북 내장 마이크는 -30dB 근처라 STT가 첫 단어를 자주 놓친다. 입장 직후 한 번 볼륨 안내 멘트를 넣고, VAD 임계값을 입장 첫 5초만 낮게 깐다.
  • LLM 함수 호출(툴) 사용 시 응답 지연. 함수 호출이 들어가면 RTT가 1.5~2초로 늘어난다. 사용자가 어색해하지 않게 "잠시만요, 확인 중입니다" 류 보이스 필러를 session.say()로 먼저 내보낸다.
  • 로그 보존. 음성 봇은 사후 분석이 중요한데 기본 콘솔 로그는 통화 끝나면 사라진다. livekit.agents.metrics를 켜고 JSONL로 영구 저장해야 다음 통화 개선이 가능하다.
  • 가격 폭주 주의. ElevenLabs Turbo v2.5는 한국어 1만 자에 약 0.18달러다. 사용자가 길게 말 시키는 시나리오(스토리텔링 등)면 한 번에 5달러도 나온다. max_response_length를 LLM 단에서 잘라야 한다.

FAQ

Q. LiveKit Agents란 정확히 무엇인가?

A. WebRTC 기반 LiveKit 미디어 서버 위에서 동작하는 Python·Node.js용 실시간 음성/영상 AI 에이전트 프레임워크다. STT, LLM, TTS, VAD를 표준 인터페이스로 묶어주고 끼어들기·턴 종료·함수 호출 같은 음성 대화 특유의 상태 관리를 처리해준다.

Q. LiveKit Agents는 무료인가?

A. 프레임워크 자체는 Apache 2.0 라이선스로 100% 무료다. 비용은 두 군데서 발생한다. (1) LiveKit Cloud를 쓰면 트래픽 기반 과금, 셀프호스트면 서버 비용만. (2) 안에서 부르는 OpenAI/Deepgram/ElevenLabs 같은 외부 API는 각각 자체 요금이다.

Q. Twilio 대신 LiveKit Agents를 써야 하나?

A. 두 제품은 영역이 다르다. Twilio는 PSTN(일반 전화망) 연결이 강점이고, LiveKit은 WebRTC 실시간 미디어 처리가 강점이다. 다만 LiveKit Agents 1.0부터 SIP 트렁크 통합이 정식 지원돼서, PSTN 전화 통합도 같은 코드 안에서 가능해졌다. 신규 프로젝트라면 LiveKit + SIP 트렁크 조합이 단순하고 저렴한 경우가 많다.

Q. LiveKit Agents로 콜센터를 만들 수 있나?

A. 가능하다. SIP 인바운드/아웃바운드, 통화 녹음, 실시간 상담사 이관(transfer)까지 1.0 시점에 다 들어왔다. 다만 통화량이 수백 동시 이상이면 자체 SIP 트렁크와 PSTN 게이트웨이 비용 모델링을 먼저 잡는 게 좋다.

Q. 한국어 STT는 어떤 게 가장 정확한가?

A. 도메인에 따라 다르다. 일반 대화는 Deepgram nova-3와 Azure Speech가 비슷한 수준으로 가장 안정적이었다. 의료·법률처럼 전문 용어가 많은 도메인은 Azure Custom Speech로 어휘를 추가 학습시킨 쪽이 정확도가 5~8%p 더 높았다. 비용을 줄여야 한다면 OpenAI Realtime 단일 모델도 일상 대화에는 쓸 만하다.

마무리와 다음 액션

여기까지 왔다면 한국어 음성 에이전트 최소 동작 코드를 손에 쥔 셈이다. 다음 단계는 보통 세 가지다. 함수 호출(툴)을 붙여 외부 API를 부르거나, 통화 메트릭·녹음을 저장해 사후 분석 파이프라인을 짜거나, SIP 트렁크를 연결해 실제 전화로 받게 한다.

가장 빠른 학습 방법은 GitHub 레포의 examples 폴더를 뜯어보는 것이다. 음성 비서, 콜센터, 다중 에이전트 라우팅, 영상 분석까지 시나리오별 미니 프로젝트가 30개 넘게 들어 있다.

참고 자료


작성자: 실시간 음성 AI 파이프라인을 한국어 콜봇·고객지원 PoC로 6개월간 직접 구축·운영하며 정리한 노트다. WSL2 Ubuntu 24.04, Python 3.12.3, LiveKit Agents 1.0 기준으로 검증했으며 STT/TTS 비용 수치는 2026년 6월 기준 공식 단가로 계산했다.

반응형