OpenRouter、音声文字起こし API を提供開始
本文の状態
日本語全文を表示中
詳細モードで約19分の本文を読めます。
同じ出来事の情報源
この情報源を基点に整理
OpenRouter Blog
OpenRouter は音声認識機能を API エンドポイントに統合し、 Whisper クラスモデルを含む複数のプロバイダから自動ロードバランシングで利用可能にする新機能を発表した。
AI深層分析を開く2026年7月29日 04:35
AI深層分析
キーポイント
API の一元化と簡素化
OpenRouter は既存の Chat Completions と同じ API キーと認証方式を用いて音声トランスクリプションを実行できるエンドポイントを提供し、新たな SDK や別サービスの導入を不要とした。
プロバイダ間の自動ロードバランシング
複数のプロバイダがホストするモデルに対して自動的に負荷分散を行い、特定のベンダーに固定されることなく柔軟な利用を実現している。
入力形式と制限の明確化
音声データは Base64 符号化または multipart ファイル(最大 25MB)での送信が必須であり、外部 URL の指定や SRT/VTT 出力には対応していない。
詳細なメタデータとコスト管理
レスポンスにはトランスクリプトテキストに加え、音声の秒数、トークン数、および実際の請求金額が含まれるため、利用状況の厳密な計測が可能である。
リクエストボディの構成
リクエストボディにはモデル名と音声ファイルを含む input_audio オブジェクトが含まれる。input_audio 内では base64 データ、フォーマット文字列に加え、言語ヒントや温度パラメータをオプションで指定できる。
重要な引用
You don't need a new SDK or a separate service.
When a transcription model is hosted by more than one provider, we load-balance across them automatically.
The real limits to design around are a 60-second upstream timeout, no audio URLs... and no SRT/VTT output.
Inside input_audio you put the file as base64 data and a format string.
編集コメントを表示
編集コメント
音声認識機能をチャット API と同一のインターフェースで提供することは、開発者のワークフローを大幅に簡素化する実用的な進展である。ただし、ファイルサイズや出力形式の制限は設計時に必ず確認すべき点となる。
Source Article
元記事を日本語で読む
本文に関係しない購読案内、埋め込み通知、サイト内プロモーションは除いています。
40 分間の営業通話の録音、音声メモフォルダ、あるいはユーザーがマイクボタンを押しっぱなしにしている状態など、テキスト化が必要なケースは多々あります。従来のアプローチでは、チャットトラフィックを処理する既存システムの上に Whisper サーバーを立てるか、音声認識専用の SDK を追加プロバイダーとして導入する必要がありました。
しかし OpenRouter では、同じ API キーと認証情報を用いて Chat Completions と同様の形式で POST /api/v1/audio/transcriptions エンドポイントへオーディオを送信するだけで済みます。返ってくるのは、転写されたテキストと使用量情報を格納した JSON です。
新しい SDK や別々のサービスを用意する必要はありません。通話トラフィックと同じプラットフォーム上で音声文字起こしが実行されるため、複数のプロバイダがホストするモデルは自動的にロードバランシングされ、特定のベンダーに固定されることはありません。
Tl;dr
POST /api/v1/audio/transcriptionsに base64 でエンコードされたオーディオを送信し、レスポンスから JSON 形式のテキストとusageオブジェクトを読み取ることで文字起こしが可能です。使用する Bearer キーは Chat Completions と共通です。
Whisper クラスのモデルもここで利用可能です(スラッグは openai/whisper-1)。より新しいトークン課金対応の音声テキスト変換 (STT) モデルも存在します。これらを見つけるには、デフォルトのカタログではなく ?output_modalities=transcription パラメータを指定して検索してください。
転写モデルを複数のプロバイダーがホストしている場合、自動的に負荷分散が行われます。チャットで使用するリクエストごとのルーティング制御には、order、allow_fallbacks、data_collection などが含まれます。
このエンドポイントでは、現在 sort は適用されていません。ここで指定されるプロバイダーブロックには、各プロバイダー固有のオプションのみが含まれます。
Bring-your-own-key (BYOK) 機能を使えば、プラットフォーム利用料のみで独自のプロバイダーキーをルーティングできます。
設計上の制約として、アップストリームのタイムアウトが60秒であること、音声ファイルのURL指定ができないこと(base64 形式の JSON または OpenAI 方式の multipart ファイルで最大25MBまで)、SRT/VTT 出力に対応していないことの3点が挙げられます。OpenAI 互換プロバイダーでは、response_format: "verbose_json" を設定することで、単語およびセグメントごとのタイムスタンプを取得可能です。
料金はモデルによって時間ベースまたはトークンベースで設定されており、プロバイダーによる上乗せはありません。usage.cost フィールドには、リクエストごとの実際の費用が返されるため、利用状況の管理が可能です。
OpenRouter で音声 transcription を行う方法
OpenRouter API キーをチャット呼び出しと同じく Bearer トークンとして設定し、モデルを選択した上で、base64 符号化された音声を POST /api/v1/audio/transcriptions エンドポイントに送信します。JSON レスポンス内の text フィールドから転写結果を取得できます。
レスポンスは JSON 形式で、text フィールドに文字起こしテキストが格納され、usage オブジェクトには音声の秒数、トークン数、およびリクエストにかかった費用ドル額が含まれます。1 回のリクエストで文字起こしが完了するため、ポーリングやジョブ ID の追跡は不要です。

リクエスト本文には model と input_audio オブジェクトが含まれます。input_audio 内では、ファイルを base64 データとして、フォーマットを文字列として指定します。必要に応じて言語のヒントや温度パラメータ、プロバイダブロックを追加することも可能です。以下に全体の流れを示します。
# Encode the file to base64, then POST it.
AUDIO_B64=$(base64 -i meeting.mp3 | tr -d '\n')
curl https://openrouter.ai/api/v1/audio/transcriptions \
-H "Authorization: Bearer $OPENROUTER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "openai/whisper-1",
"input_audio": { "data": "'"$AUDIO_B64"'", "format": "mp3" },
"language": "en"
}'import base64
import os
import requests
with open("meeting.mp3", "rb") as f:
audio_b64 = base64.b64encode(f.read()).decode("utf-8")
api_key = os.environ["OPENROUTER_API_KEY"]
response = requests.post(
"https://openrouter.ai/api/v1/audio/transcriptions",
headers={"Authorization": f"Bearer {api_key}"},
json={
"model": "openai/whisper-1",
"input_audio": {"data": audio_b64, "format": "mp3"},
"language": "en",
},
)
print(response.json()["text"])import { OpenRouter } from '@openrouter/sdk';
import { readFileSync } from 'fs';
const openRouter = new OpenRouter({ apiKey: process.env.OPENROUTER_API_KEY });
const audioB64 = readFileSync('meeting.mp3').toString('base64');
const result = await openRouter.stt.createTranscription({
sttRequest: {
model: 'openai/whisper-1',
inputAudio: { data: audioB64, format: 'mp3' },
language: 'en',
},
});
console.log(result.text);利用可能な音声認識モデルは?
利用可能なモデルは大きく 2 つのファミリーに分かれます。`openai/whisper-1` に代表される Whisper クラスのモデルは、音声の秒数に基づいて課金されます。一方、比較的新しい音声認識モデルはトークン単位での課金となります。
どちらを選ぶべきかは、求められる精度、対応言語の組み合わせ、そして予算によって決まります。
STT(音声テキスト変換)モデルの ID は、デフォルトの /api/v1/models カタログには表示されません。これは当然のことです。なぜなら、文字起こしは出力モダリティの一つであり、それをフィルタリングして探す必要があるからです。
curl "https://openrouter.ai/api/v1/models?output_modalities=transcription" \
-H "Authorization: Bearer $OPENROUTER_API_KEY"これにより、各モデルの現在の価格情報が含まれた音声認識モデルの一覧が取得できます。このリストは、ページ形式で閲覧したい場合に便利な Speech-to-Text コレクション にも掲載されています。また、モデルカタログ では、各モデルのリアルタイム料金を確認できます。
モデルを実装する前に試したい場合は、OpenRouter Playground でブラウザ内でアップロードしたファイルを転写できます。
フィールドごとのリクエスト契約
一連の処理は 3 つの手順で行われます。まずファイルを base64 エンコードし、モデルとフォーマットを指定して POST 送信します。その後、レスポンスから text と usage の値を読み取ります。
data フィールドには、data: URI ではなく生の base64 バイトを指定します。そのため、data:audio/mp3;base64, というプレフィックスは付与しないでください。
format フィールドは必須であり、アップストリームのモデルに対してこれらのバイトをどのようにデコードするかを指示します。
| パラメータ | 必須 | 内容 |
|---|---|---|
model | はい | STT モデルのスラッグ(例:openai/whisper-1) |
input_audio.data | はい | Base64 形式の音声(生バイト列、データ URI は不可) (原文の技術表記: data:) |
input_audio.format | はい | wav, mp3, flac, m4a, ogg, webm, aac のいずれか |
language | いいえ | ISO-639-1 コード(en, es, …)。省略時は自動検出されます |
temperature | いいえ | サンプリング温度(0 から 1) |
response_format | いいえ | json(デフォルト)または verbose_json。後者は task, language, duration, セグメントのタイムスタンプを追加します(OpenAI 互換プロバイダーのみ) |
timestamp_granularities | いいえ | ["segment"] または verbose_json 使用時の ["word"]。word を指定すると、words 配列に単語レベルのタイムスタンプが追加されます |
provider | いいえ | プロバイダー固有のオプションのパsthrough(例:Groq の prompt)。このエンドポイントではリクエストごとのルーティング制御は適用されません |
このエンドポイントでは、OpenAI 形式の multipart/form-data アップロード(ファイルとモデル)も受け付けています。ただし、サイズは最大 25MB に制限されています。 (原文の技術表記: file、model)
すでに OpenAI の /v1/audio/transcriptions エンドポイント向けにクライアントを構築済みであれば、そのベース URL を指し替えるだけで対応可能です。
https://openrouter.ai/api/v1 で動作は変わりません。ファイルサイズが 25 MB を超える場合は、base64 の JSON パスを経由します。 (原文の技術表記: https://openrouter.ai/api/v1)
言語のヒントは任意です。指定しない場合、モデルが自動的に言語を検出しますが、短い音声やノイズの多いクリップでは、言語を明示することで曖昧さを減らすことができます。
一部のプロバイダーは、provider パラメータを通じて独自のパラメータを受け付けます。例えば Groq では、provider.options.groq.prompt を使用して期待される語彙を指定できます。これにより、モデルが誤って変換してしまう可能性のある固有名詞や専門用語の処理精度を向上させることができます。
レスポンスとその利用状況の集計 (原文の技術表記: prompt)
レスポンスは、テキスト文字列を含む JSON 形式で返されます。また、usage オブジェクトも含まれており、これによりリクエストごとの使用量を推定するのではなく、実際に計測して管理することが可能になります。
{
"text": "Thanks everyone for joining. Let's start with the Q3 numbers.",
"usage": {
"seconds": 9.2,
"total_tokens": 113,
"input_tokens": 83,
"output_tokens": 30,
"cost": 0.000508
}
}(原文の技術表記: text)
cost の値はドキュメント内の例示であり、実際の料金の見積もりではありません。実際の費用は、使用するモデルと音声の長さによって異なります。usage オブジェクトには、音声の秒数(audio duration)、トークン数、そしてドル建ての cost が報告されます。 (原文の技術表記: seconds)
レスポンスには、特定の要求を後から追跡またはデバッグするためにログに記録できる X-Generation-Id ヘッダーも含まれています。
文字起こしと音声入力、テキスト読み上げの使い分け
音声からテキストへ変換したい場合は /audio/transcriptions を、モデルに音声を推論させたい場合はチャットでの音声入力を使用してください。
通訳エンドポイントは、会議の議事録作成、音声コマンドの処理、キャプション生成、および通話やポッドキャストの検索可能なアーカイブ構築に適しています。
サポート通話での感情分析を行いたい場合、発言内容に関する Q&A を行いたい場合、あるいは単一のプロンプト内で音声と他のモダリティを混合して処理したい場合は、/chat/completions エンドポイントで input_audio コンテンツタイプを使用してください。テキストから音声への変換は、これとは別に用意された第三の専用エンドポイントで行います。

| あなたが求めているのは… | 使用 | 得られるもの |
|---|---|---|
| 音声からテキストへの変換(文字起こし) | POST /api/v1/audio/transcriptions | JSON 形式のテキストと使用量情報 |
| 音声について推論を行うモデル(感情分析、Q&A、マルチモーダル) | /chat/completions への input_audio | チャット完了レスポンス |
音声分析およびテキスト読み上げについては、音声 API 発表ページ をご覧ください。
文字起こしにおけるプロバイダールーティングの仕組み
通訳機能はチャットと同じルーティングレイヤーを利用しています。1 つのモデルが複数のプロバイダによってホストされている場合、当社は価格に基づいて負荷分散を行い、リクエストを各プロバイダに振り分けます。これにより、特定のベンダーに縛られることなく利用可能です。
ただし現時点で通訳機能には、リクエストごとのルーティング制御機能は提供されていません。
チャット呼び出しで設定する order、only、allow_fallbacks、data_collection、sort の各フィールドは、/api/v1/audio/transcriptions には適用されません。
このエンドポイントの provider ブロックには、プロバイダー固有のオプションが格納されます。
{
"model": "openai/whisper-large-v3",
"input_audio": { "data": "<base64>", "format": "wav" },
"provider": {
"options": {
"groq": { "prompt": "Expected vocabulary: OpenRouter, API, transcription" }
}
}
}このリクエストでは、Groq に対して固有名詞を正しく処理するための語彙ヒントが渡されます。オプションはプロバイダーのスラッグでキー付けされており、一致したプロバイダーのオプションのみが転送されます。特定のトランスクリプションでプロバイダーを固定したり、リクエストごとのデータポリシーを強制したい場合、その制御機能はこのエンドポイントではまだ利用できません。完全なプロバイダーオブジェクトの詳細は、プロバイダールーティングドキュメントに記載されています。
OpenRouter はプロバイダーごとの価格を明示していないため、カタログ掲載料金が実際の請求額となります。また「ゼロ・コンプリーション・インシュアランス(Zero Completion Insurance)」により、転写に失敗した場合は課金されません。
すでにプロバイダーと契約済みの場合、BYOK を利用すれば、独自のキー経由でリクエストをルーティングでき、従量課金モデルの費用ではなくプラットフォーム利用料のみを支払うことが可能です。なお、従量課金プランでは、月間 100 万リクエストまで利用料が免除されます。
プラン策定における制限とは?
転写呼び出しを構成する際、以下の 4 つの制約が影響します。

| 制限 | ユーザーにとっての意味 |
|---|---|
| 60 秒のアップストリームタイムアウト | 処理に約 60 秒かかることを意味しますが、音声の長さに対する厳格な上限ではありません。大規模または非圧縮された録音ファイルでタイムアウトが発生します。長い音声はセグメントに分割し、それぞれをトランスクリプトして結合してください。 |
| 音声 URL の使用不可 | このエンドポイントでは、URL を通じて音声を渡すことはできません。base64 形式の JSON または OpenAI 互換の multipart ファイル(最大 25 MB)を送信してください。圧縮フォーマット(mp3, aac)を使用すると、より小さく高速なペイロードになります。 |
| SRT/VTT 出力の非対応 | srt, vtt, および text の応答フォーマットは、エラーコード 400 で拒否されます。タイムスタンプ情報は OpenAI 互換プロバイダーの verbose_json を経由して取得可能です。そこから字幕ファイルを自作してください。 |
| フォーマットサポートはプロバイダにより異なる | (wav/mp3/flac/m4a/ogg/webm/aac)のリストは一般的ですが、特定のモデルやプロバイダーがすべてをサポートしているとは限りません。wav が最も安全なデフォルトです。 |
タイムアウトは処理時間の上限を定めるものであり、音声の長さそのものを制限するものではないため、クリップの持続時間だけでは対応可能かどうかは判断できません。一晩続くゲームセッションのような長時間の録音には、チャンク化による処理が必要です。単発の通話では対応しきれないケースがあります。
キャプション出力のデフォルトは、タイミング情報なしのテキストと利用状況のみです。response_format を verbose_json に設定すると、セグメントレベルのタイムスタンプが取得できます。さらに timestamp_granularities: ["word"] を指定すれば、単語レベルのタイムスタンプも得られます。この機能は OpenAI 互換プロバイダー(OpenAI、Groq、Together など)で動作しますが、それ以外のプロバイダーでは 400 エラーを返して拒否されます。
組み込みの .srt や .vtt 出力機能はないため、タイムスタンプから自分で字幕ファイルを作成する必要があります。
転写リクエストにはいくらかかるのか?
モデルの利用料はカタログ価格そのもので、当社は上乗せ手数料を徴収しません。各リクエストの正確な費用は usage.cost フィールドで確認できます。
Whisper クラスのモデルは音声の秒数に対して課金され、新しいモデルはトークン数に基づいて課金されます。
料率は変動するため、詳細な最新情報は カタログ の各モデルページに掲載しており、本記事には記載していません。API からのレスポンスで usage.cost を確認すれば、各リクエストが実際にいくらだったかがわかります。
音声認識(STT)モデルは有料サービスのため、OpenRouter を利用した文字起こしには API キャンペーン残高から課金されます。
利用を開始するには、まず Playground で対象のモデルがあなたの音声データに適しているか確認し、API 接続を設定してください。そして、1 日目から利用料を管理するために各リクエストごとの usage.cost を確認するようにしましょう。
よくある質問
OpenRouter で音声ファイルを文字起こしするにはどうすればよいですか?
base64 でエンコードされた音声データを、model と input_audio オブジェクト(data と format を含む)を指定して POST /api/v1/audio/transcriptions エンドポイントに送信します。
レスポンスは、転写テキストを含む text 文字列と使用量を示す usage オブジェクトからなる JSON です。
秒数、トークン数、コストについて。Chat Completions と同じ Bearer API キーと認証を使用します。
OpenRouter は Whisper をサポートしていますか?
はい、Whisper クラスのモデルは文字起こしに利用可能です。使用するスラグは openai/whisper-1 です。
STT モデル ID はデフォルトの /api/v1/models リストに含まれていないため、?output_modalities=transcription でフィルタリングするか、Speech-to-Text コレクション を閲覧して見つける必要があります。Whisper は音声の秒数に基づいて課金されますが、新しい STT モデルはトークン数で課金されます。
OpenRouter の文字起こしに対応するオーディオ形式は何ですか?
一般的な音声ファイル形式として、wav、mp3、flac、m4a、ogg、webm、aac があり、これらは必須フィールドである input_audio.format に指定する必要があります。
モデルやプロバイダーによって対応状況が異なるため、すべてのモデルがあらゆる形式を受け付けるわけではありません。
wavは幅広い互換性を確保するための最も安全なデフォルト形式です。一方、mp3などの圧縮フォーマットは、より小さく高速なペイロードを提供します。
OpenRouter はタイムスタンプや SRT/VTT 字幕を返すことができますか?
タイムスタンプも取得可能です。response_format を verbose_json に設定すると、セグメントレベルのタイムスタンプが得られます。さらに、timestamp_granularities: ["word"] を追加することで、単語レベルのタイムスタンプを words 配列として取得できます。
これは OpenAI と互換性のあるプロバイダー(OpenAI、Groq、Together)で動作しますが、他のプロバイダーでは 400 エラーで拒否されます。SRT や VTT 形式の出力には対応していないため、タイムスタンプから自分で字幕ファイルを生成する必要があります。
オーディオはどのくらい長くできますか?
実質的な制限は、固定された音声長さの上限ではなく、約 60 秒のアップストリーム処理タイムアウトです。短編や中編のクリップは 1 回の呼び出しで返却されますが、長時間の録音の場合は、音声をセグメントに分割してそれぞれを転写し、最後にテキストをつなぎ合わせる必要があります。
OpenRouter の転写コストはいくら?
モデルの利用料はカタログ価格そのもので、追加の手数料はかかりません。Whisper などの音声認識モデルは音声の秒数に対して課金され、新しい音声テキスト変換(STT)モデルはトークン数に基づいて課金されます。各レスポンスに含まれる usage.cost フィールドには、そのリクエストにかかった正確なドル額が報告されています。
AI算出
主要ニュースainew評価標準
AI モデル(Whisper)および STT サービスの提供開始という明確な新事実を報じており、新規性が高い。ただし、日本固有の価格や規制情報がないため、日本の関連性は低い。
6つの評価軸を見る
- AI関連度
- 100
- 情報源の信頼性
- 25
- 新規性
- 75
- 調べる価値
- 75
- 重複の少なさ
- 100
- 日本での有用性
- 25
関連記事
今日のまとめ
AIデイリーブリーフで今日の重要ニュースをまとめ読み