ElevenLabs가 9개의 Text to Speech 모델과 2개의 Speech to Text 모델을 갖추고 OpenRouter에 출시되었습니다.
이미 OpenRouter를 통해 언어 모델과 통신하는 앱이라면 이제 말하기와 듣기도 할 수 있습니다. Eleven v4로 톤과 전달 방식을 지정하여 긴 콘텐츠에 내레이션을 입히고, v4 Turbo로 에이전트에 더 빠른 음성 응답을 제공하거나, Scribe v2로 화자 라벨이 포함된 대화 전사를 수행하세요. 별도의 ElevenLabs 플랜이 필요하지 않습니다. OpenRouter API 키로 다음을 호출하기만 하면 됩니다. POST /api/v1/audio/speech 그리고 POST /api/v1/audio/transcriptions 당신의 OpenRouter API 키로 호출하세요.
10월 19일 오전 8시 PT까지 모든 OpenRouter 고객은 모든 ElevenLabs 모델을 OpenRouter 정가의 50% 할인된 가격에 이용할 수 있습니다
어떤 모델을 사용할지
세 가지 모델로 시작하고, 작업에 필요할 때 나머지를 활용하세요:
- 내레이션, 캐릭터, 제품 비디오: Eleven v4. 오디오 태그가 스크립트가 연기를 수행하도록 합니다.
- 음성 에이전트와 실시간 응답: Eleven v4 Turbo, ElevenLabs가 실시간 사용을 위해 만들었으며 v4 요금의 절반입니다.
- 전사본, 회의 노트, 자막: Scribe v2, 화자 라벨과 단어 타임스탬프를 제공합니다.
긴 오디오에 속도 조절이 필요하면 Multilingual v2를, 요청당 최대 40,000자의 대용량 음성에는 Flash v2.5를 사용하세요. Scribe v2 Medical은 의학 용어에 맞춰 파인튜닝되었습니다.
Text to Speech
| 모델 | OpenRouter ID | 요청당 최대 글자 수 | 선택 기준 |
|---|---|---|---|
| Eleven v4 | elevenlabs/eleven-v4 | 10,000 | ElevenLab의 가장 높은 품질, 가장 감정적인 음성. [whispering], [laughing] 같은 오디오 태그를 활용한 표현력 있는 내레이션과 캐릭터 연기 |
| Eleven v4 Turbo | elevenlabs/eleven-v4-turbo | 10,000 | 음성 에이전트를 위한 저지연 응답 |
| Eleven v3 | elevenlabs/eleven-v3 | 5,000 | 오디오 태그를 활용한 표현력 있는/극적인 내레이션과 캐릭터 연기 |
| Eleven v3 Conversational | elevenlabs/eleven-v3-conversational | 5,000 | v3 요금의 절반으로 주고받는 대화. 극적인 표현 폭을 갖추고 실시간 대화에 맞게 조정되었습니다. |
| Eleven Multilingual v2 | elevenlabs/eleven-multilingual-v2 | 10,000 | 속도 조절이 가능한, 다양한 언어에서 안정적인 긴 오디오. |
| Eleven Flash v2.5 | elevenlabs/eleven-flash-v2.5 | 40,000 | 대용량 빠르고 저렴한 다국어 음성. 32개 언어 지원. |
| Eleven Flash v2 | elevenlabs/eleven-flash-v2 | 30,000 | 빠른 영어 전용 음성 |
| Eleven Turbo v2.5 | elevenlabs/eleven-turbo-v2.5 | 40,000 | ElevenLab의 첫 세대 저지연 모델로, 현재는 Flash로 대체되었습니다 |
| Eleven Turbo v2 | elevenlabs/eleven-turbo-v2 | 30,000 | ElevenLab의 1세대 저지연 모델로, 현재는 Flash로 대체됨 |
ElevenLabs는 모델 가격을 두 등급으로 책정합니다. Eleven v4, v3, Multilingual v2는 글자당 전체 요율로 청구되며, v4 Turbo, v3 Conversational, Flash, Turbo는 그 절반으로 청구됩니다. 현재 글자당 가격은 각 모델 페이지의 텍스트 음성 변환 컬렉션.
음성을 텍스트로 변환
| 모델 | OpenRouter ID | 다음을 위해 선택하세요 |
|---|---|---|
| Scribe v2 | elevenlabs/scribe-v2 | 90개 이상 언어에서 단어 타임스탬프, 화자 라벨 및 오디오 이벤트 태그를 제공하는 일반 전사 |
| Scribe v2 Medical | elevenlabs/scribe-v2-medical | Scribe v2 대비 임상 오디오에서 의학 용어 오류 35% 감소 |
두 Scribe 모델은 동일한 요청 형식과 동일한 초당 가격을 사용합니다. WebSocket 기반 Realtime Scribe v2는 이번 출시에 포함되지 않습니다.
워크스루: 첫 MP3에서 음성 에이전트까지
세 단계로 구성된 작은 제품 투어를 만들어 보겠습니다. 먼저 Eleven v4가 이를 해설합니다. 그다음 음성 에이전트가 관련 질문에 답하고, 마지막으로 Scribe v2가 팀의 검토 회의를 누가 무엇을 말했는지 알 수 있는 노트로 변환합니다. 요청이 예상과 다르게 작동하면 마지막에 있는 팁을 확인하세요.
키를 한 번만 설정하세요:
export OPENROUTER_API_KEY="your-api-key"
1단계: Eleven v4로 제품 투어 내레이션 만들기
다음 내레이션 한 줄로 시작합니다:
curl https://openrouter.ai/api/v1/audio/speech \
--fail-with-body \
-H "Authorization: Bearer $OPENROUTER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "elevenlabs/eleven-v4",
"input": "[cheerfully] Welcome to the tour. [whispering] Let me show you the shortcut first.",
"voice": "george",
"response_format": "mp3"
}' \
--output intro.mp3
voice ElevenLabs의 21개 사전 제작 음성 중 어느 것이든 이름으로 지정할 수 있습니다(george 여기); 이름은 대소문자를 구분하지 않습니다. 명시적인 response_format — 다음 참조 첫 요청을 위한 팁 양쪽 모두를 위한 것입니다.
대괄호로 묶인 단어들은 오디오 태그입니다. Eleven v4와 v3는 다음과 같은 태그를 읽습니다. [whispering], [laughing], [sighs], 그리고 [curious] 태그는 음성으로 말하는 대신 전달 방향으로 사용됩니다. 태그는 청구되는 글자 수에 포함됩니다.
전체 투어 스크립트는 한 번의 요청으로 처리할 수 있는 길이(v4에서는 10,000자, v3에서는 5,000자)를 초과하므로, 문단 경계를 기준으로 분할하세요. ElevenLabs 전용 설정은 provider.options.elevenlabs아래에 넣습니다. 이웃한 텍스트를 previous_text 및 next_text 로 전달하면 연결 지점에서도 억양이 일관되게 유지되고, seed 을 고정하면 재실행 시 결과가 더욱 재현 가능해집니다:
import os
import requests
API = "https://openrouter.ai/api/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['OPENROUTER_API_KEY']}"}
NARRATOR = "george"
def split_paragraphs(text: str, limit: int = 9000) -> list[str]:
chunks, current = [], ""
for para in text.split("\n\n"):
if current and len(current) + len(para) + 2 > limit:
chunks.append(current)
current = para
else:
current = f"{current}\n\n{para}" if current else para
return chunks + [current] if current else chunks
chunks = split_paragraphs(open("tour-script.txt").read())
with open("tour.mp3", "wb") as out:
for i, chunk in enumerate(chunks):
options = {"seed": 7}
if i > 0:
options["previous_text"] = chunks[i - 1][-500:]
if i + 1 < len(chunks):
options["next_text"] = chunks[i + 1][:500]
r = requests.post(
f"{API}/audio/speech",
headers=HEADERS,
json={
"model": "elevenlabs/eleven-v4",
"input": chunk,
"voice": NARRATOR,
"response_format": "mp3",
"provider": {"options": {"elevenlabs": options}},
},
)
r.raise_for_status()
out.write(r.content)
2단계: 음성 에이전트로 질문에 답변하기
이제 사용자가 투어 관련 질문을 소리 내어 물어볼 수 있게 해 보세요. 음성 에이전트는 세 가지 모델을 연결합니다: 질문에는 Scribe v2, 답변에는 채팅 모델, 그리고 응답에는 Eleven v4 Turbo를 사용합니다. ElevenLabs는 v4 Turbo를 실시간 용도로 구축했으며, v4 요금의 절반으로 과금합니다.
import base64
def transcribe(path: str) -> str:
with open(path, "rb") as f:
audio_b64 = base64.b64encode(f.read()).decode()
r = requests.post(
f"{API}/audio/transcriptions",
headers=HEADERS,
json={
"model": "elevenlabs/scribe-v2",
"input_audio": {"data": audio_b64, "format": "wav"},
},
)
r.raise_for_status()
return r.json()["text"]
def answer(question: str) -> str:
r = requests.post(
f"{API}/chat/completions",
headers=HEADERS,
json={
"model": "openai/gpt-5-mini",
"messages": [
{"role": "system", "content": "You are the product tour guide. Answer in one or two sentences."},
{"role": "user", "content": question},
],
},
)
r.raise_for_status()
return r.json()["choices"][0]["message"]["content"]
def speak(text: str, out_path: str) -> None:
r = requests.post(
f"{API}/audio/speech",
headers=HEADERS,
json={
"model": "elevenlabs/eleven-v4-turbo",
"input": text,
"voice": NARRATOR,
"response_format": "mp3",
},
)
r.raise_for_status()
with open(out_path, "wb") as f:
f.write(r.content)
speak(answer(transcribe("question.wav")), "reply.mp3")
전사(transcription) 응답은 JSON 형식이며, 그 안에 전사본이 담겨 있습니다. text 그리고 usage 오디오 초 수와 달러를 보고하는 객체 cost 요청의 일부입니다. Swap openai/gpt-5-mini 의 모든 채팅 모델에 대해 카탈로그 오디오 통화는 건드리지 않으면서 동일한 유지 voice 그러니까 그 에이전트는 1단계의 내레이터처럼 들립니다.
3단계: 리뷰 회의를 화자 표시 노트로 변환하기
팀이 투어 리뷰를 위해 회의할 때, Scribe v2는 누가 무엇을 말했는지 알려줄 수 있습니다. 녹음 파일을 multipart로 업로드하고 요청하세요. verbose_json 단어 타임스탬프가 포함되어 있으며, 설정합니다 diarize 아래 provider.options.elevenlabs. 그러면 응답의 모든 단어에 화자가 지정됩니다. 회의 참석자가 몇 명인지 알고 있다면 pass num_speakers 분할을 개선하기 위해서입니다.
curl https://openrouter.ai/api/v1/audio/transcriptions \
--fail-with-body \
-H "Authorization: Bearer $OPENROUTER_API_KEY" \
-F file="@tour-review.mp3" \
-F model="elevenlabs/scribe-v2" \
-F response_format="verbose_json" \
-F "timestamp_granularities[]=word" \
-F provider='{"options": {"elevenlabs": {"diarize": true, "num_speakers": 3, "tag_audio_events": true}}}'
다음 항목은 각각 words 있다 word, start, end, confidence, speaker (정수)이며 speaker_label (speaker_0, speaker_1, 등). tag_audio_events 다음과 같은 항목들을 추가합니다 (laughter) 단어들과 함께 표시됩니다. 연속된 단어를 다음 기준으로 묶습니다 speaker turn들을 가져온 뒤, 그 turn들을 챗 모델에 보내 요약과 액션 아이템을 생성합니다:
def to_turns(words: list[dict]) -> list[str]:
turns: list[tuple[int, list[str]]] = []
for w in words:
if turns and turns[-1][0] == w.get("speaker"):
turns[-1][1].append(w["word"])
else:
turns.append((w.get("speaker"), [w["word"]]))
return [f"Speaker {s}: {' '.join(ws)}" for s, ws in turns]
업로드는 25 MB로 제한되며, 이는 128 kbps MP3 기준 약 27분 분량에 해당합니다.
더 긴 녹음 파일의 경우 공개 URL을 전달하면 ElevenLabs가 파일을 직접 다운로드하므로 25 MB 제한이 적용되지 않습니다:
"input_audio":{ "url": "https://example.com/tour-review.mp3" }
매우 긴 파일은 여전히 180초 업스트림 요청 제한 시간에 도달할 수 있으므로, 길게 진행되는 녹음은 분할하십시오.
첫 요청을 위한 팁
- 이름 또는 ID로 음성을 선택하세요.
위한
voice, ElevenLabs의 미리 만들어진 21개 음성 중 하나를 이름으로 전달하세요:george,sarah,adam,alice,bella,brian,charlie,daniel,jessica,roger,will그 외 기능들(각 모델 페이지에서 전체 목록 확인 가능)입니다. 이름은 대소문자를 구분하지 않습니다. 다른 음성을 사용하려면 해당 음성의 ElevenLabs voice ID를 다음과 같이 전달하세요:voice— 아래에서 복사하세요: ElevenLabs 음성 라이브러리. 복제하거나 설계한 보이스는 자신의 ElevenLabs 계정에 저장되므로, 해당 보이스를 사용하려면 BYOK. - 을(를) 요청하세요
mp3재생 가능한 파일이 필요할 때는 을(를) 지정하지 않으면, 저희 음성 엔드포인트는 원시 PCM(16비트 little-endian 모노, 24 kHz)을 반환합니다. 이는 오디오 파이프라인에는 적합하지만 대부분의 플레이어에서는 열 수 없습니다.response_format, 저희 음성 엔드포인트는 원시 PCM(24 kHz의 16비트 little-endian 모노)을 반환합니다. 이는 오디오 파이프라인에는 적합하지만 대부분의 플레이어에서는 열 수 없습니다."response_format": "mp3"을(를) 설정하면 재생 가능한 44.1 kHz, 128 kbps 파일을 얻을 수 있습니다. - Multilingual v2와 Flash는
Multilingual v2 및 Flash는
speed0.7에서 1.2까지의 값을 받습니다. Eleven v4 및 v4 Turbo에는 속도 조절 기능이 없으며 기본값이 아닌speed긴 대본 분할 - 각 모델에는 요청당 문자 제한이 있습니다(모델 표 참조). 오디오 태그도 제한과 청구 문자 수에 포함됩니다. 1단계와 같이 단락 경계에서 분할하고,
각 모델에는 요청당 글자 수 제한이 있습니다(모델 표 참조). 오디오 태그는 이 제한에 청구되는 글자 수에 모두 포함됩니다. 1단계에서와 같이 단락 경계를 기준으로 분할하고, 다음을 전달하세요.
previous_text을(를) 전달하여 이어지는 부분이 자연스럽게 들리도록 하세요.next_textElevenLabs 전용 설정은 - 아래에 위치합니다
provider.options.elevenlabsText to Speech는seed,previous_text,next_text,language_code,apply_text_normalization,apply_language_text_normalization,pronunciation_dictionary_locators,voice_settings(stability,similarity_boost,style,use_speaker_boost,speed)과(와)output_format을(를) 받습니다(ElevenLabs 형식 이름, 예:mp3_22050_32또는pcm_16000; 반드시response_format코덱과 일치해야 함). Speech to Text는diarize,num_speakers,diarization_threshold,tag_audio_events,no_verbatim을(를) 받으며,seed.num_speakers과(와)diarization_threshold는diarize: true이(가) 필요하고, 둘 중 하나만 설정할 수 있으며 동시에 둘 다 설정할 수는 없습니다. 필드 이름은 나열된 그대로 정확히 사용하세요. 이 목록에 없는 키는 무시되며, 목록에 있는 키라도 잘못된 값을 넣으면 400이 반환됩니다. - Scribe는 세 글자 언어 코드를 반환합니다
두 글자
language힌트(en)를 보낼 수 있습니다. 감지된 언어는 ISO 639-3 코드로 반환됩니다(eng).
시작하기
- Create an OpenRouter API 키.
- 위의 1단계에 있는 curl 예시를 사용하여 첫 번째 요청을 만들어 보세요.
- 모든 매개변수에 대해서는 Text to Speech 및 Speech to Text 가이드를 참조하세요.
Text to Speech는 입력 문자당 과금되며, 유니코드 코드 포인트로 계산하므로 이모지나 CJK 문자도 1회로 계산됩니다. 오디오 태그도 문자로 계산됩니다. Scribe는 오디오 초당 과금되며, 모든 전사 응답의 usage.cost 필드가 해당 요청의 비용을 알려줍니다. 우리는 ElevenLabs 가격을 추가 요금 없이 그대로 전달합니다. 현재 요금은 각 모델 페이지를 참조하세요.
이미 ElevenLabs 계정이 있으신가요?
다음과 같이 키를 추가합니다 BYOK 자신만의 복제된 음성, 발음 사전, 그리고 mp3_44100_192와 같은 더 높은 품질의 포맷을 사용할 수 있습니다.
만들어 OpenRouter API 키, 또는 다음에서 모델을 먼저 사용해 보거나 놀이터. 텍스트 음성 변환 그리고 음성을 텍스트로 변환 가이드에서 전체 요청 참조를 확인할 수 있습니다.
