跳到正文
openrouter blog·· 20 小時前精選AI 評分65

ElevenLabs 於 OpenRouter 上提供 TTS/STT 服務

ElevenLabs is now on OpenRouter

AI 導讀

ElevenLabs 現已在 OpenRouter 上提供九款文字轉語音模型與兩款語音轉文字模型,讓已使用 OpenRouter 的應用可直接加入語音功能。

推薦理由

已經使用 OpenRouter 的應用可直接加入 ElevenLabs TTS/STT,並享 50% 折扣,省去額外訂閱,讓語音功能更輕鬆整合,並可即時呼叫多語言與高容量模型。

正文 · AI 翻譯

ElevenLabs 現已在 OpenRouter 上提供九個文字轉語音模型和兩個語音轉文字模型。

如果您的應用程式已透過 OpenRouter 與語言模型對話,它現在也能說話和聽話。使用 Eleven v4 以語調與語氣指示來敘述長篇內容,使用 v4 Turbo 為您的代理提供更快的語音回覆,或使用 Scribe v2 以說話者標籤轉錄對話。您不需要單獨的 ElevenLabs 計畫。只需使用 POST /api/v1/audio/speech 與 POST /api/v1/audio/transcriptions 呼叫並提供您的 OpenRouter API 金鑰。

所有 OpenRouter 客戶在 10 月 19 日 8am PT 前,皆可以 ElevenLabs 所有模型的官方零售價格 50% 折扣購買。

哪一個模型適合使用

先從三個模型開始,必要時再使用其餘模型:

  • 敘事、角色、產品影片: 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 則以半額計費。當前每字價格可在每個模型頁面中的 文字轉語音集合 查閱。

語音轉文字

模型OpenRouter ID適用於
Scribe v2elevenlabs/scribe-v2一般轉錄,包含單字時間戳、說話者標籤和音訊事件標籤,支援 90 多種語言
Scribe v2 Medicalelevenlabs/scribe-v2-medical醫療術語在臨床音訊上比 Scribe v2 錯誤率低 35%

兩個 Scribe 模型使用相同的請求格式和相同的每秒價格。即時 Scribe v2 透過 WebSocket 並非本次發布的一部分。

流程說明:從第一個 MP3 到語音代理

我們將以三個步驟建立一個簡易產品導覽。首先 Eleven v4 進行旁白。接著語音代理回答相關問題,最後 Scribe v2 將團隊的回顧會議轉成筆記,顯示誰說了什麼。若請求行為與預期不符,請參考最後的提示。

一次設定您的 API 金鑰:

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)

第二步:以語音代理回答問題

現在讓使用者以語音提問導覽問題。語音代理串接三個模型: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")

轉錄回應為 JSON,包含在 text 的文字稿,以及一個 usage 物件報告音訊秒數與請求金額(美元)cost。將 openai/gpt-5-mini 交換成 目錄 中任何聊天模型,且不改動音訊呼叫,保持相同的 voice,使代理聽起來像第一步的敘述者。

第三步:將審查會議轉成帶說話者標籤的筆記

當團隊聚會審查導覽時,Scribe v2 可告訴你誰說了什麼。以 multipart 上傳錄音,請求 verbose_json 並包含單詞時間戳,並在 provider.options.elevenlabs 下設定 diarize。回應中的每個單詞都會帶有說話者資訊。如果你知道會議中人數,傳遞 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 將連續單詞分組以得到回合,然後將回合送給聊天模型做摘要與行動項:

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,約可容納 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(16 位元小端單聲道 24 kHz)。適合音訊管線,但大多數播放器無法開啟。設定 "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.elevenlabs Text 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 金鑰。
  2. 使用上方第 1 步的 curl 範例傳送您的第一個請求。
  3. 每個引數請參閱 Text to Speech 與 Speech to Text 指南。

Text to Speech 的費用按輸入字元計算,字元以 Unicode 程式碼點計算,因此表情符號或 CJK 字元算作一個字元。音訊標籤亦算作字元。Scribe 的費用按音訊秒數計算,每次轉錄回應的 usage.cost 欄位會告訴您該請求的成本。我們直接使用 ElevenLabs 的價格,不加額外費用;請參閱各模型頁面瞭解最新費率。

已經擁有 ElevenLabs 帳號?

使用 BYOK 加入您的金鑰,以使用您自己的克隆聲音、發音字典,及更高品質的格式,例如 mp3_44100_192。

建立一個 OpenRouter API 金鑰,或先在 Playground 試用模型。Text to Speech 與 Speech to Text 指南提供完整的請求參考。

來源:openrouter blog · openrouter.ai