ElevenLabs 现已登陆 OpenRouter,带来九个文本转语音模型和两个语音转文本模型。

如果你的应用已经通过 OpenRouter 与语言模型对话,现在它也能说和听了。用 Eleven v4 旁白长篇内容,并掌控语气和表达方式;用 v4 Turbo 为你的智能体提供更快的语音回复;或用 Scribe v2 转录带说话人标签的对话。你不需要单独的 ElevenLabs 套餐。只需调用POST /api/v1/audio/speech和POST /api/v1/audio/transcriptions并使用你的 OpenRouter API 密钥。

即日起至 10 月 19 日上午 8 点(太平洋时间),所有 OpenRouter 客户均可享受每个 ElevenLabs 模型 50% 的 OpenRouter 标价折扣

该用哪个模型

先从三个模型入手,当任务需要时再使用其余的:

  • 旁白、角色、产品视频:Eleven v4。音频标签让脚本自带表演。
  • 语音智能体和实时回复:Eleven v4 Turbo,ElevenLabs 专为实时使用打造,费率是 v4 的一半。
  • 转录、会议记录、字幕:Scribe v2,带说话人标签和词级时间戳。

当长篇音频需要速度控制时使用 Multilingual v2,处理每次请求最多 40,000 字符的高并发语音时使用 Flash v2.5。Scribe v2 Medical 针对医学术语进行了微调。

文本转语音

模型OpenRouter ID每次请求最大字符数选择它的理由
Eleven v4elevenlabs/eleven-v410,000ElevenLab 质量最高、最具表现力的语音。富有表现力的旁白和角色演绎,支持 [whispering] 和 [laughing] 等音频标签
Eleven v4 Turboelevenlabs/eleven-v4-turbo10,000面向语音智能体的低延迟回复
Eleven v3elevenlabs/eleven-v35,000富有表现力/戏剧性的旁白和角色演绎,支持音频标签
Eleven v3 Conversationalelevenlabs/eleven-v3-conversational5,000一来一回的对话,费率是 v3 的一半。具有戏剧性表现范围,为实时对话调优。
Eleven Multilingual v2elevenlabs/eleven-multilingual-v210,000跨多种语言的稳定长篇音频,支持速度控制。
Eleven Flash v2.5elevenlabs/eleven-flash-v2.540,000快速、低成本的多语言高并发语音。支持 32 种语言。
Eleven Flash v2elevenlabs/eleven-flash-v230,000快速的纯英语语音
Eleven Turbo v2.5elevenlabs/eleven-turbo-v2.540,000ElevenLab 的第一代低延迟模型,现已被 Flash 取代
Eleven Turbo v2elevenlabs/eleven-turbo-v230,000ElevenLab 的第一代低延迟模型,现已被 Flash 取代

ElevenLabs 将其模型定价分为两档。Eleven v4、v3 和 Multilingual v2 按完整的每字符费率计费,而 v4 Turbo、v3 Conversational、Flash 和 Turbo 按半价计费。当前的每字符价格位于每个模型页面中的Text to Speech 集合。

Speech to Text

模型OpenRouter ID选择它用于
Scribe v2elevenlabs/scribe-v2通用转录,支持词级时间戳、说话人标签和音频事件标签,覆盖 90 多种语言
Scribe v2 Medicalelevenlabs/scribe-v2-medical医学术语,在临床音频上相比 Scribe v2 错误减少 35%

两个 Scribe 模型使用相同的请求结构和相同的每秒价格。通过 WebSocket 的 Realtime Scribe v2 不在此次发布范围内。

演练:从第一个 MP3 到语音智能体

我们将分三步构建一个小型产品导览。首先由 Eleven v4 进行旁白。然后一个语音智能体回答关于它的问题,最后 Scribe v2 将团队的评审会议转化为显示谁说了什么的笔记。如果某个请求的行为不符合你的预期,请查看末尾的提示。

一次性设置你的密钥:

exportOPENROUTER_API_KEY="your-api-key"

步骤 1:用 Eleven v4 为产品导览配旁白

从一行旁白开始:

curlhttps://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"
}'\
--outputintro.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,使重新运行更具可重复性:

importos

importrequests

API="https://openrouter.ai/api/v1"
HEADERS={"Authorization":f"Bearer{os.environ['OPENROUTER_API_KEY']}"}
NARRATOR="george"


defsplit_paragraphs(text:str, limit:int=9000) -> list[str]:
chunks, current=[],""
forparaintext.split("\n\n"):
ifcurrentandlen(current)+len(para)+2>limit:
chunks.append(current)
current=para
else:
current=f"{current}\n\n{para}"ifcurrentelsepara
returnchunks+[current]ifcurrentelsechunks


chunks=split_paragraphs(open("tour-script.txt").read())

withopen("tour.mp3","wb")asout:
fori, chunkinenumerate(chunks):
options={"seed":7}
ifi>0:
options["previous_text"]=chunks[i-1][-500:]
ifi+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 的一半。

importbase64


deftranscribe(path:str) ->str:
withopen(path,"rb")asf:
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()
returnr.json()["text"]


defanswer(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()
returnr.json()["choices"][0]["message"]["content"]


defspeak(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()
withopen(out_path,"wb")asf:
f.write(r.content)


speak(answer(transcribe("question.wav")),"reply.mp3")

转录响应是 JSON,其中转录文本位于text以及一个usage对象,用于报告音频秒数和该请求的美元cost。将openai/gpt-5-mini替换为目录中的任意聊天模型不触碰音频调用,并保持相同的voice这样智能体的声音就像第 1 步中的旁白。

第 3 步:将评审会议转化为带说话人标记的笔记

当你的团队开会评审导览时,Scribe v2 可以告诉你谁说了什么。以 multipart 形式上传录音,请求verbose_json带词级时间戳,并设置diarize在provider.options.elevenlabs下。响应中的每个词都带有说话人。如果你知道会议中有多少人,传入num_speakers以改进分离效果。

curlhttps://openrouter.ai/api/v1/audio/transcriptions\
--fail-with-body\
-H"Authorization: Bearer$OPENROUTER_API_KEY"\
-Ffile="@tour-review.mp3"\
-Fmodel="elevenlabs/scribe-v2"\
-Fresponse_format="verbose_json"\
-F"timestamp_granularities[]=word"\
-Fprovider='{"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对连续词进行分组以获得发言轮次,然后将这些轮次发送给聊天模型以生成摘要和行动项:

defto_turns(words: list[dict]) -> list[str]:
turns: list[tuple[int, list[str]]]=[]
forwinwords:
ifturnsandturns[-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)}"fors, wsinturns]

上传上限为 25 MB,大约相当于 27 分钟的 128 kbps MP3。

对于更长的录音,传入一个公开 URL,ElevenLabs 会直接下载该文件,因此 25 MB 的上限不适用:

"input_audio":{"url":"https://example.com/tour-review.mp3"}

非常长的文件仍可能触及 180 秒的上游请求超时,因此请拆分运行时间较长的录音。

首次请求的小贴士

  1. 按名称或 ID 选择声音。对于voice,按名称传入 ElevenLabs 的 21 个预制声音中的任意一个:george,sarah,adam,alice,bella,brian,charlie,daniel,jessica,roger,will等等(完整列表见各模型页面)。voice名称不区分大小写。要使用任何其他声音,请将其 ElevenLabs 声音 ID 作为传入——从ElevenLabs 声音库复制。你克隆或设计的声音存在于你自己的 ElevenLabs 账户中,因此请通过BYOK
  2. 使用它们。mp3当你想要一个可播放的文件时,请求如果你省略response_format,我们的语音端点会返回原始 PCM(24 kHz 的 16 位小端单声道)。这适合音频流水线,但大多数播放器无法打开它。设置"response_format": "mp3"以获得一个可播放的 44.1 kHz、128 kbps 文件。
  3. 使用 Multilingual v2 或 Flash 进行语速控制Multilingual v2 和 Flash 接受speed从 0.7 到 1.2。Eleven v4 和 v4 Turbo 没有语速控制,并会拒绝非默认的speed,所以在这些模型上省略它,改用音频标签来调整节奏。
  4. 拆分长脚本每个模型都有单次请求的字符上限(见模型表)。音频标签会计入该上限,也会计入你的计费字符数。像第 1 步那样按段落边界拆分,并传入previous_text和next_text,让衔接听起来自然。
  5. ElevenLabs 专属设置放在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。
  6. Scribe 返回三字母语言代码你可以发送一个两字母的language提示(en)。检测到的语言会以 ISO 639-3 代码返回(eng)。

快速开始

  1. 创建一个OpenRouter API key。
  2. 用上面第 1 步中的 curl 示例发出你的第一个请求。
  3. 关于每个参数,请参阅Text to Speech和Speech to Text指南。

Text to Speech 按输入字符计费,按 Unicode 码点计数,因此一个 emoji 或一个 CJK 字符计为一次。音频标签也计为字符。Scribe 按音频秒数计费,每个转录响应上的 usage.cost 字段会告诉你该请求的费用。我们按 ElevenLabs 定价原价传递,不加价;当前费率见各模型页面。

已经有 ElevenLabs 账户?

用BYOK添加你的密钥,以使用你自己克隆的声音、发音词典,以及更高质量的格式,例如 mp3_44100_192。

创建一个OpenRouter API key,或先在Playground中试用某个模型。Text to Speech和Speech to Text指南包含完整的请求参考。