Cartesia로 음성 AI 에이전트 만들기
Siri나 Alexa와 대화하다 “죄송하지만 이해하지 못했습니다”라는 답으로 끝나는 경험에 지치셨나요? 새로운 음성 AI 에이전트는 자연스럽게 대화하고 문맥을 이해하며 사람 같은 지능으로 응답할 수 있습니다.
기본 명령만 실행하는 기존 음성 비서와 달리 이런 에이전트는 고객 경험을 바꿉니다. “영어는 1번” 같은 번거로운 전화 메뉴를 거치는 대신 사람에게 말하듯 필요한 것을 AI에게 말하면 됩니다.
Cartesia API로 음성 AI 에이전트를 만드는 방법을 살펴보겠습니다.
음성 AI 에이전트란?
음성 AI 에이전트는 사람과 자연스럽게 대화하는 지능형 시스템입니다. 간단한 질문부터 복잡한 작업까지 음성 언어를 이해하고 응답합니다. 음성 인식, 자연어 처리, 음성 합성을 결합해 자연스러운 음성 상호작용을 만듭니다.
다음과 같은 일상적인 작업을 처리할 수 있습니다.
- 자주 묻는 질문에 답하기
- 예약 잡기
- 주문 상태 확인하기
- 적절한 부서로 통화 연결하기
- 기본적인 문제 해결 지원하기
이런 반복적인 상호작용을 AI에 맡기면 팀은 더 복잡하고 의미 있는 일에 집중하며 시간과 자원을 잘 쓸 수 있습니다.
음성 AI 에이전트는 어떻게 작동하나요?
음성 AI 에이전트는 인공지능으로 사람의 말을 처리하고 의도를 해석합니다. 회사 지식 기반에서 정보를 가져와 적절한 텍스트 응답을 만들고 자연스러운 대화 음성으로 전달합니다.
흐름은 다음과 같습니다.
- 음성 인식 ASR: 사용자가 말하면 AI가 음성을 텍스트로 전사합니다.
- 자연어 처리: 문맥과 뉘앙스를 포함해 사용자의 의미와 의도를 분석합니다.
- 정보 검색: 이해한 의도에 맞는 정보를 지식 기반에서 가져옵니다.
- 응답 생성: 대화 문맥과 검색한 정보로 적절한 답변을 만듭니다.
- 음성 합성: 응답 텍스트를 자연스러운 음성으로 바꿔 사용자에게 전달합니다.

음성 AI 에이전트 작업 흐름
AI 에이전트는 미리 녹음된 스크립트에 따라 대화를 시작할 수 있습니다. 예를 들어 “제 이름은 _____입니다. 오늘 무엇을 도와드릴까요?”라고 말할 수 있습니다.
그다음 시스템이 사용자 응답을 녹음하고 텍스트로 바꿔 LLM이나 내부 AI 시스템에 실시간으로 전달합니다. LLM은 적절한 텍스트 답변을 만들고 음성 AI 에이전트가 이를 다시 음성으로 바꿉니다. 예약 확인이나 일반적인 문제 해결처럼 시스템의 목표에 도달할 때까지 대화를 이어갈 수 있습니다.
Python에서 Cartesia API로 음성 AI 에이전트 만들기
이 튜토리얼은 Cartesia API와 Sonic 모델을 사용해 음성 AI 에이전트를 설정하는 방법을 안내합니다.
환경 설정
Cartesia API를 사용하려면 계정, API 키, FFmpeg 설치가 필요합니다. 다음 순서대로 진행하세요.
- Cartesia Play에서 계정을 만듭니다.
- Cartesia API Keys에서 API 키를 받습니다.

- 다음과 같이 오디오 처리용 FFmpeg를 설치합니다.
# On Ubuntu/Debian
sudo apt update && sudo apt install ffmpeg
# On macOS (using Homebrew)
brew install ffmpeg
# On Windows (using Chocolatey)
choco install ffmpeg
Cartesia API 자체에 FFmpeg가 필수는 아니지만 오디오 파일을 변환하고 저장하고 재생하는 데 유용합니다. 코드 샘플은 원래 언어와 식별자를 유지합니다.
음성 인식 엔드포인트 선택
먼저 고객의 입력을 녹음하고 텍스트로 바꿔야 합니다. 여러 음성 인식 기술을 선택할 수 있습니다. 예를 들어 OpenAI의 Whisper API는 다양한 오디오 형식과 여러 언어의 전사를 지원하며, 영어가 아닌 발화를 영어로 번역할 수도 있습니다.
다른 선택지로 Google Speech to Text, Amazon Transcribe, Azure AI Speech, Assembly, Deepgram, Speechmatics가 있습니다.
전사된 텍스트로 응답 생성
응답 생성은 AI 애플리케이션의 핵심 기능에 따라 달라집니다. 의료 분야의 음성 AI 에이전트라면 기존 의료 AI 앱과 의료 데이터베이스에 연결해야 합니다. 예약용이라면 캘린더 앱에서 데이터를 찾아야 합니다. 이런 기능은 보통 추론 능력이 더 높은 Anthropic Claude Sonnet이나 OpenAI O1 또는 4O 같은 다른 AI 모델을 사용해 만듭니다.
음성 AI 에이전트 플랫폼 사용하기
설정이 너무 복잡하게 느껴진다면 LiveKit, VAPI, RASA 같은 플랫폼으로 시작할 수도 있습니다.
가장 단순한 개념 검증용 음성 에이전트는 공백과 주석을 빼면 코드 50줄입니다.
load_dotenv(dotenv_path=".env.local")
logger = logging.getLogger("voice-agent")
def prewarm(proc: JobProcess):
proc.userdata["vad"] = silero.VAD.load()
async def entrypoint(ctx: JobContext):
initial_chat_context = llm.ChatContext().append(
role="system",
text=(
"You are a voice assistant created by LiveKit. Your interface with users will be voice. "
"You should use short and concise responses, and avoid usage of unpronounceable punctuation. "
),
)
logger.info(f"connecting to room {ctx.room.name}")
await ctx.connect(auto_subscribe=AutoSubscribe.AUDIO_ONLY)
# Wait for the first participant to connect
participant = await ctx.wait_for_participant()
logger.info(f"starting voice assistant for participant {participant.identity}")
# Set up the Agent
agent = VoicePipelineAgent(
vad=ctx.proc.userdata["vad"],
stt=deepgram.STT(),
llm=openai.LLM(model="gpt-4o-mini"),
tts=cartesia.TTS(
model="sonic-3.5",
voice="a0e99841-438c-4a64-b679-ae501e7d6091",
),
chat_ctx=initial_chat_context,
)
agent.start(ctx.room, participant)
# Once connected, we start by hardcoding a greeting
await agent.say(f"Hey {participant.identity}! How can I help you today?", allow_interruptions=True)
if __name__ == "__main__":
cli.run_app(
WorkerOptions(
entrypoint_fnc=entrypoint,
prewarm_fnc=prewarm,
),
)
입력 텍스트 형식 맞추기
자연스러운 음성 출력을 위해서는 입력 텍스트 형식이 중요합니다.
- 문장부호로 질문과 강조를 표현해 자연스럽게 들리도록 합니다.
- 발음 오류를 피하도록 약어를 풀어 씁니다. 예를 들어 “Dr.” 대신 “Doctor”를 씁니다.
- 자연스러운 말의 리듬에 맞게 텍스트를 구성합니다.
스크립트 예시
안녕하세요! 고객 서비스에 전화해 주셔서 감사합니다.
<break time="1s" />
I’m Anna, how can I help you today?
<break time="1s" />
Could you please provide your order number so we can get started? We’ll resolve this as quickly as possible and keep you updated.
<break time="1s" />
음성 합성 엔드포인트 선택
Cartesia는 여러 TTS 엔드포인트를 제공합니다. WebSocket과 스트림 엔드포인트가 대화형 음성 에이전트에 적합한 이유는 다음과 같습니다.
- 지연 시간: WebSocket 연결을 미리 맺으면 음성 생성을 시작할 때 연결 지연이 발생하지 않습니다. 보통 약 200ms를 절약합니다.
- 입력 스트리밍: 생성 음성의 운율을 유지하면서 입력을 스트리밍할 수 있습니다. LLM처럼 텍스트를 실시간으로 생성할 때 유용합니다.
- 타임스탬프: 생성 음성의 타임스탬프가 있는 전사로 자막이나 실시간 전사 기능을 만들 수 있습니다. 모델과 언어별 제한은 TTS 엔드포인트 비교를 참고하세요.
- 멀티플렉싱: 하나의 연결로 여러 대화를 처리할 수 있습니다.
TTS bytes POST 엔드포인트는 오디오 파일을 미리 생성하는 데 적합합니다. WAV, MP3 등 여러 형식으로 만들 수 있습니다.
엔드포인트를 선택하기 전에 Cartesia TTS 엔드포인트 문서에서 애플리케이션에 맞는 것을 확인하세요.
API 호출
텍스트 형식을 맞췄다면 선택한 TTS 엔드포인트로 보낼 수 있습니다. API는 텍스트와 선택적 설정 파라미터가 포함된 JSON 페이로드를 받습니다. Python용 Cartesia SDK로 다음과 같이 설정합니다.
pip install cartesia
# Or using uv
uv add cartesia
# Make the API call
import os
import subprocess
from cartesia import Cartesia
if os.environ.get("CARTESIA_API_KEY") is None:
raise ValueError("CARTESIA_API_KEY is not set")
client = Cartesia(api_key=os.environ.get("CARTESIA_API_KEY"))
response = client.tts.generate(
model_id="sonic-3.5",
transcript="Hello, world! I'm generating audio on Cartesia.",
voice={"mode": "id", "id": "a0e99841-438c-4a64-b679-ae501e7d6091"}, # Greg - Supporter
language="en",
# You can find the supported output_format at https://docs.cartesia.ai/api-reference/tts/bytes
output_format={
"container": "wav",
"encoding": "pcm_f32le",
"sample_rate": 44100,
},
)
with open("sonic.wav", "wb") as f:
f.write(response.read())
# Play the file
subprocess.run(["ffplay", "-autoexit", "-nodisp", "sonic.wav"])
다음 명령으로 스크립트를 실행합니다.
env CARTESIA_API_KEY=YOUR_API_KEY python cartesia.py
# On uv
env CARTESIA_API_KEY=YOUR_API_KEY uv run cartesia.py
이 스크립트는 텍스트를 Sonic 모델에 보내고 오디오 출력을 받아 .wav 파일로 저장합니다.
음성 에이전트 설정
Cartesia API로 속도, 감정, 현지화 등 음성 출력을 추가로 조정할 수 있습니다.
속도
API 요청의 voice 객체에서 __experimental_controls 사전에 speed 파라미터를 추가합니다.
속도 옵션은 다음과 같습니다.
- “slowest”: 매우 느린 발화
- “slow”: 보통보다 느린 발화
- “normal”: 기본 발화 속도
- “fast”: 보통보다 빠른 발화
- “fastest”: 매우 빠른 발화
더 세밀하게 제어하려면 [−1.0,1.0] 범위의 숫자로 속도를 지정할 수 있습니다. 0은 기본 속도, 음수는 느리게, 양수는 빠르게 합니다.
"voice": {
"mode": "id",
"id": "VOICE_ID",
"__experimental_controls": {
"speed": "fast,
}
}
감정
API 요청의 voice 객체에서 __experimental_controls 사전에 emotion 파라미터를 추가합니다. emotion은 emotion_name: level 형식의 태그 배열입니다.
감정 이름은 anger, positivity, surprise, sadness, curiosity를 사용할 수 있습니다.
감정 수준은 lowest, low, high, highest이며, 해당 감정을 더하는 방식입니다. 예를 들어 “surprise: low”는 놀람을 줄이는 것이 아니라 조금 더합니다. 수준을 생략하면 중간 정도의 감정을 더합니다.
"voice": {
"mode": "id",
"id": "VOICE_ID",
"__experimental_controls": {
"emotion": [
"positivity:high",
]
}
}
입력 스트리밍
대화형 애플리케이션에서는 LLM 같은 AI 모델에서 나오는 텍스트로 음성을 동적으로 생성하고 싶을 수 있습니다. Cartesia API는 continuations로 실시간 음성 생성을 지원합니다. 이전 생성의 소리 패턴과 문맥을 유지하면서 끝난 지점에서 이어서 생성합니다.
텍스트 입력의 context_id로 continuation을 설정합니다. 하나의 연속된 문장에 속한 모든 단어나 구절에는 같은 context_id를 지정해야 합니다.
{"transcript":
"Hello, Sonic!",
"continue": true,
"context_id": "stream1"
}
{"transcript":
" I'm streaming ",
"continue": true,
"context_id": "stream1"
}
{"transcript":
"inputs.",
"continue": false,
"context_id": "stream1"
}
context_id를 포함한 생성 요청을 TTS WebSocket 엔드포인트로 보냅니다. 같은 context_id의 후속 입력은 운율을 유지하며 생성을 이어갑니다.
음성 AI 에이전트, 챗봇, 상호작용형 경험에 유용한 기능입니다.
음성 AI 에이전트에 관한 자주 묻는 질문
음성 AI 기술을 지금 사용할 수 있나요?
네. 기업들은 음성 AI 솔루션을 적극적으로 도입하고 있습니다. Cartesia 같은 플랫폼은 고품질 음성 생성, 짧은 지연 시간, 사실적인 대화 음성을 제공합니다. AI 음성 에이전트는 정보 데이터베이스를 바탕으로 질문에 답하고, 예약, CRM 기록 생성, 아웃바운드 통화, 잠재 고객 선별 같은 작업을 처리할 수 있습니다.
어떤 기업이 음성 AI 에이전트의 도움을 받을 수 있나요?
의료, 콜센터, 게임, 의료보험 등에서 이미 AI 음성 에이전트를 사용합니다. 월간 통화량이 많은 기업이라면 고객 상호작용을 자동화하고 운영 효율을 높이는 데 활용할 수 있습니다.
영어 외의 언어도 말할 수 있나요?
네. 음성 AI 에이전트는 여러 언어를 지원할 수 있지만 품질은 TTS 제공업체에 따라 달라집니다. 예를 들어 Cartesia는 스페인어, 독일어, 프랑스어, 이탈리아어, 힌디어를 포함한 15개 언어를 지원합니다.
AI 음성 에이전트는 얼마나 맞춤화할 수 있나요?
기업의 구체적인 요구에 맞출 수 있습니다. 회사 데이터로 학습해 고객 질문에 정확히 답하고 선호에 맞게 목소리를 바꿀 수 있습니다. 웹사이트, CRM, 캘린더, API 엔드포인트가 있는 소프트웨어 등 기존 시스템과 연결해 현재 워크플로에 도입할 수 있습니다.
AI 음성 에이전트는 아직 로봇처럼 들리나요?
아니요. 현대 AI 음성 기술은 기계적으로 들리는 말을 크게 줄였습니다. 자연스러운 멈춤, 끼어들기, 대화의 뉘앙스를 더 잘 처리합니다. 특히 Cartesia 같은 고품질 TTS 제공업체를 사용하면 AI 음성과 사람 음성의 차이를 구별하기 점점 어려워지고 있습니다.
