메인 콘텐츠로 건너뛰기
LiveKit Agents는 실시간 음성 AI를 구축하기 위한 프레임워크입니다. Venice는 음성 에이전트의 세 단계인 음성-텍스트 변환(STT), LLM, **텍스트-음성 변환(TTS)**을 모두 구동할 수 있습니다. livekit-plugins-openai 플러그인을 Venice base URL로 지정하면 STT와 LLM을 처리합니다. TTS의 경우 짧은 VeniceTTS 클래스가 Venice의 /audio/speech 엔드포인트를 직접 호출합니다.
Venice는 LiveKit Agents의 STT-LLM-TTS 파이프라인 아키텍처에 적합합니다. Venice는 OpenAI Realtime(스피치-투-스피치) WebSocket API를 제공하지 않으므로 RealtimeModel / 멀티모달 경로는 사용할 수 없습니다. 아래에 표시된 컴포넌트 기반 파이프라인을 사용하세요. 각 모델을 완전히 제어할 수 있으며 추론은 Venice의 프라이빗 인프라 안에서 유지됩니다.

Venice가 LiveKit Agents에 매핑되는 방식

설정

프레임워크와 아래에서 사용할 플러그인을 설치하세요:
Venice API 키와 LiveKit 연결 정보를 설정하세요:
OpenAI 플러그인은 api_key가 생략되면 OPENAI_API_KEY로 대체됩니다. Venice를 지정하고 있으므로 항상 api_key를 명시적으로 전달하세요(그렇지 않으면 잘못된 환경 변수에서 키를 읽게 됩니다). 아래 예제는 VENICE_API_KEY를 읽습니다.

Venice TTS 클래스

Venice에서는 플러그인의 openai.TTS 클래스를 사용하지 마세요. 현재 livekit-plugins-openai 릴리스는 모든 스피치 요청에 stream_format 필드를 보내며, Venice의 /audio/speech 엔드포인트는 이를 400 오류로 거부합니다. 대신 이 클래스를 에이전트 옆에 venice_tts.py로 저장하세요. 이 클래스는 Venice가 허용하는 필드만으로 /audio/speech를 호출하고, 오디오가 도착하는 대로 LiveKit에 전달합니다.
venice_tts.py
response_format은 모델이 지원하는 형식이어야 합니다. GET /models?type=tts에서 model_spec.supported_formats를 확인하세요. tts-kokoro에는 pcm을 사용하세요. LiveKit이 디코드 단계 없이 재생합니다. 다른 모델에는 mp3 또는 wav를 전달하면 LiveKit이 오디오를 디코드합니다.

전체 음성 에이전트

다음은 Venice STT로 트랜스크립션하고, Venice LLM으로 사고하며, 위의 VeniceTTS 클래스를 통해 Venice TTS로 말하는 완전한 음성 에이전트입니다. Silero가 로컬 음성 활동 감지를 제공하여 배치 STT가 언제 턴이 끝났는지 파악할 수 있게 합니다.
agent.py
개발 모드로 실행:

각 컴포넌트 설정하기

LLM

LLM은 가장 깔끔한 매핑입니다 — Venice /chat/completions는 SSE 스트리밍, 툴 호출, 비전을 모두 지원하며 LiveKit이 이 모든 것을 직접 사용합니다. venice-uncensored-1-2는 추론을 프라이빗하고 검열 없이 유지하면서 TTS 파이프라인에 공급합니다. 첫 토큰까지의 시간이 더 짧아야 하는 경우에만 flash 클래스 모델을 선택하세요.
Venice 고유 옵션(웹 검색, 캐릭터 페르소나, 사고 제어)은 extra_body를 통해 전달하세요:

Speech-to-Text

LiveKit의 OpenAI STT는 음성 세그먼트마다 /audio/transcriptions를 호출하므로, 턴이 언제 끝나는지 감지하기 위해 VAD(위의 Silero)가 필요합니다. 기본 모델을 Venice STT 모델로 재정의하세요. nvidia/parakeet-tdt-0.6b-v3는 가장 작고 지연 시간이 낮은 옵션이며, 더 높은 정확도가 필요하다면 stt-xai-v1이나 elevenlabs/scribe-v2가 최신 대안입니다.

Text-to-Speech

VeniceTTS는 /audio/speech를 호출합니다. Venice에서 음성은 모델별로 정해져 있으므로 동일한 모델의 model/voice 쌍을 전달하세요. tts-kokoro는 음성 단계를 프라이빗하고 검열 없이 유지하여 LLM의 출력을 그대로 말할 수 있으며, pcm 출력은 MP3 디코드 단계를 피해 지연 시간을 약간 줄여 줍니다. 프로바이더 기반의 더 빠른 음성(예: Gemini)은 콘텐츠 필터링을 적용할 수 있으므로, 검열 없는 음성이 필요하다면 피하세요.

권장 모델

모델 ID는 시간이 지남에 따라 변경됩니다 — 하드코딩하는 대신 런타임에 GET /models?type=... 및 GET /models/traits로 현재 옵션을 확인하세요. 음성 에이전트의 경우 체감 응답성은 첫 토큰까지의 시간과 TTS 속도에 의존하므로 저지연 티어(이름에 flash, turbo, mini가 있거나 파라미터 수가 적은 모델)를 우선시하세요. 현재 카탈로그에서 시작하기 좋은 지점들:

모든 모델 둘러보기

텍스트, 음성-텍스트, 텍스트-음성으로 필터링하고 실시간 가격 및 기능을 확인하세요.

지연 시간 및 프로덕션 팁

음성 에이전트의 품질은 턴 전환 지연 시간 — 사용자가 문장을 끝낸 시점과 에이전트가 말하기 시작하는 시점 사이의 시간 — 에 좌우됩니다. 전체 Venice 파이프라인에서는 대략 다음을 예상하세요: 첫 오디오까지 약 0.8–1.5초를 예상하세요 — 어시스턴트 스타일의 차분한 턴 전환에는 훌륭합니다. 매우 자주 끊기고 겹치는 대화의 경우에는 네이티브 스피치-투-스피치 모델 대비 간격이 느껴질 것입니다.

지연 시간 줄이기

  • VeniceTTS의 기본값인 response_format="pcm"과 함께 tts-kokoro를 사용해 MP3 디코드 단계를 건너뛰세요.
  • Silero VAD를 조정(silero.VAD.load(min_silence_duration=0.4))하여 음성을 잘라내지 않고 엔드포인팅을 단축하세요.
  • STT/TTS에는 저지연 티어를 선호하세요(예: tts-kokoro TTS, nvidia/parakeet-tdt-0.6b-v3 STT). 프라이빗하고 검열 없이 유지하려면 LLM은 venice-uncensored-1-2를 유지하세요. 첫 토큰까지의 시간이 더 빨라야 할 때만 flash 클래스 LLM으로 전환하세요.
  • 답변을 간결하게 유지하세요 — 체감 응답성을 좌우하는 것은 첫 문장입니다.

프로바이더 혼합

LiveKit은 각 컴포넌트를 독립적으로 선택할 수 있게 해주므로, 프라이버시와 검열 없는 모델이 가장 중요한 곳에서는 Venice를 유지하고 지연 시간이 중요한 곳에서는 스트리밍 프로바이더로 교체할 수 있습니다. 상호작용이 많은 일반적인 구성은 Venice LLM(및 선택적으로 STT)을 유지하면서 전용 스트리밍 TTS와 페어링하는 방식입니다:
가장 단순하고 가장 프라이빗한 설정을 위해 전체 Venice로 시작하세요. 빠르고 대화형이 강한 소비자 경험을 구축한다면 Venice LLM을 유지하고 음성 출력 단계에는 스트리밍 TTS를 평가해보세요.

제약 사항 및 참고

  • 스피치-투-스피치 / Realtime API 없음. Venice에는 OpenAI Realtime WebSocket이 없으므로 openai.realtime.RealtimeModel 및 멀티모달 에이전트 경로는 사용할 수 없습니다. 위에 나온 STT-LLM-TTS 파이프라인을 사용하세요.
  • STT는 배치이며 스트리밍이 아닙니다. Venice 트랜스크립션은 요청/응답 방식이므로 엔드포인팅을 위해 VAD(Silero)가 필요합니다. 이는 스트리밍 STT 소켓 대비 약간의 지연 시간을 추가합니다.
  • TTS는 openai.TTS가 아닌 VeniceTTS 클래스를 사용합니다. 현재 livekit-plugins-openai 릴리스는 스피치 요청에 stream_format을 보내며, Venice는 이를 400 오류로 거부합니다. VeniceTTS는 streaming=False를 보고하므로 LiveKit은 응답을 대략 한 문장씩 합성하며, Venice의 streaming 플래그는 사용하지 않습니다. 그래도 대부분의 에이전트에서 지연 시간은 충분히 양호합니다. 디코드 오버헤드를 최소화하려면 response_format="pcm"을 사용하세요.
  • 음성을 모델과 일치시키세요. TTS voice ID는 매칭되는 model에서만 유효합니다. Text-to-Speech Models를 참조하세요.
  • 모델 목록을 하드코딩하지 마세요. Venice 모델 ID는 정기적으로 폐기 및 교체됩니다 — 런타임에 GET /models / GET /models/traits를 쿼리하세요. Deprecations를 참조하세요.

관련 리소스