OpenRouter Blog更新日

ElevenLabsがOpenRouterに登場

ElevenLabsがOpenRouterに登場し、Text to Speechモデル9種とSpeech to Textモデル2種を提供します。Eleven v4で人間のような感情を込めた音声を配信し、v4 Turboでエージェントに低レイテンシの応答を与え、Scribe v2で会議を誰が何を発言したかがわかるメモに変換できます。どのモデルを選ぶべきか、そして最初から最後まで作り上げた1つのプロジェクトをご紹介します。

画像の出典 · OpenRouter Blog

ElevenLabsがOpenRouterに登場し、Text to Speechモデル9種とSpeech to Textモデル2種を提供します。

すでにOpenRouter経由で言語モデルと通信しているアプリなら、今や話すことも聞くことも可能です。Eleven v4でトーンや話し方を指示しながら長編コンテンツのナレーションを行い、v4 Turboでエージェントの音声応答を高速化し、Scribe v2で話者ラベル付きの会話文字起こしを行えます。別のElevenLabsプランは不要です。OpenRouterのAPIキーで POST /api/v1/audio/speech と POST /api/v1/audio/transcriptions を呼び出すだけです。

10月19日午前8時(太平洋時間)まで、すべてのOpenRouterのお客様に対し、すべてのElevenLabsモデルがOpenRouterの定価から50%オフ

どのモデルを使うべきか

まずは3つのモデルから始め、必要に応じて他のモデルを使い分けましょう:

  • ナレーション、キャラクター、製品ビデオ: Eleven v4。オーディオタグにより、脚本が演技をコントロールできます。
  • 音声エージェントとライブ応答: Eleven v4 Turbo。ElevenLabsがリアルタイム用途のために構築したモデルで、v4の半分のレートで利用できます。
  • 文字起こし、会議メモ、キャプション: Scribe v2。話者ラベルと単語レベルのタイムスタンプに対応しています。

長編オーディオで速度調整が必要な場合はMultilingual v2を、1リクエストあたり最大40,000文字の大量音声にはFlash v2.5を使用してください。Scribe v2 Medicalは医療用語に特化してチューニングされています。

Text to Speech

モデルOpenRouter ID1リクエストあたりの最大文字数選ぶべき用途
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,000v3の半分のレートでの対話形式のやり取り。ドラマチックな表現力を備え、ライブ対話向けに調整されています。
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,000ElevenLabsの初世代低レイテンシモデル、現在はFlashに取って代わられました
Eleven Turbo v2elevenlabs/eleven-turbo-v230,000ElevenLabの初代低レイテンシモデル。現在はFlashに置き換えられています。

ElevenLabsはモデルを2つの料金 tiers で価格設定しています。Eleven v4、v3、Multilingual v2 は文字あたりの全額レートで課金され、v4 Turbo、v3 Conversational、Flash、Turbo はその半分で課金されます。現在の文字あたりの価格は、各モデルページの 音声読み上げ(Text to Speech)コレクション.

音声からテキストへ

モデルOpenRouter IDそれを選ぶ対象
Scribe v2elevenlabs/scribe-v290以上の言語に対応し、単語のタイムスタンプ、話者ラベル、音声イベントタグ付きの汎用文字起こし
Scribe v2 Medicalelevenlabs/scribe-v2-medical臨床音声において、Scribe v2と比較して医療用語のエラーが35%少ない

両方のScribeモデルは同じリクエスト形式と同じ1秒あたりの価格を使用します。WebSocket経由のRealtime Scribe v2は今回のリリースには含まれていません。

ウォークスルー:最初のMP3から音声エージェントまで

小さなプロダクトツアーを3つのステップで構築します。まずEleven v4がそれをナレーションします。次にボイスエージェントがそれに関する質問に答え、最後にScribe v2がチームのレビュー会議を、誰が何を発言したかがわかるメモに変換します。リクエストが期待どおりに動作しない場合は、最後のヒントを確認してください。

キーを一度設定してください:

export OPENROUTER_API_KEY="your-api-key"

ステップ1: Eleven v4で製品ツアーのナレーションを作成する

ナレーションを1行から始めてください:

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] 配達指示を読み上げる代わりにテキストとして入力することができます。タグは課金対象の文字数に含まれます。

完全なツアースクリプトは1回のリクエストで送れる長さ(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: 音声エージェントで質問に回答する

次に、ユーザーがツアーについての質問を声で尋ねられるようにしましょう。音声エージェントは3つのモデルを連結します。質問には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 「and a」 usage オーディオ秒数とドルを報告するオブジェクト cost リクエストの一部です。Swap openai/gpt-5-mini 内の任意のチャットモデルに対して カタログ 音声通話には触れずに、同じまま保ちます。 voice つまり、そのエージェントはstep 1のナレーターのようです。

ステップ3:レビュー会議を話者ラベル付きのメモにする

チームがツアーの振り返りのために集まるとき、Scribe v2 は誰が何を発言したかを教えてくれます。録音をマルチパートとしてアップロードし、 verbose_json 単語レベルのタイムスタンプ付きで、セットします diarize 未満 provider.options.elevenlabs。その後、応答内のすべての単語に話者が割り当てられます。会議に何人がいたかがわかっている場合は、渡してください 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までに制限されており、これは128 kbpsのMP3で約27分に相当します。

より長い録音の場合は公開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 など(完全なリストは各モデルのページに掲載されています)。 名前の大文字・小文字は区別されません。他の音声を使う場合は、そのElevenLabs音声IDを voice からコピーしてください。 ElevenLabs ボイスライブラリ。\nクローンまたはデザインした音声は自分自身のElevenLabsアカウントに保存されるため、それらを使用する際には BYOK.
  2. 依頼する mp3 再生できるファイルが必要なとき If you omit response_formatは、当社の音声エンドポイントが raw PCM(16 ビット リトルエンディアン、モノラル、24 kHz)を返します。これはオーディオパイプラインには適していますが、ほとんどのプレーヤーでは開けません。Set "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が3文字の言語コードを返すようになりました 2文字のコードを送信できます language ヒント (en)。検出された言語は ISO 639-3 コードとして返されます (eng).

はじめに

  1. を作成する OpenRouter APIキー.
  2. 上記のステップ1にあるcurlの例を使って、最初のリクエストを実行してください。
  3. 各パラメータの詳細については、 Text to Speech および Speech to Text のガイドをご覧ください。

Text to Speechは入力の文字ごとに課金され、Unicodeコードポイントとしてカウントされるため、絵文字やCJK文字は1文字として数えられます。オーディオタグも文字としてカウントされます。Scribeはオーディオの秒数ごとに課金され、すべての文字起こしレスポンスのusage.costフィールドにそのリクエストのコストが表示されます。ElevenLabsの価格をマークアップなしでそのまま提供しており、現在の料金は各モデルのページをご覧ください。

ElevenLabsのアカウントをすでにお持ちですか?

鍵を追加するには、次のコマンドを使います。 BYOK 独自にクローンした音声、発音辞書、および mp3_44100_192 などの高品質フォーマットを使用するためのものです。

を作成する OpenRouter APIキー, またはモデルをまず Playground。The テキスト読み上げ および 音声からテキストへ ガイドにはリクエストの完全なリファレンスが掲載されています。

原文の出典

OpenRouter Blog

内容について

原文の公開と権利は出典元に帰属します。

機械翻訳 · 原文をご参照ください