venice-audio-transcription について
venice-audio-transcription は、録音をテキスト化する開発者向けに Venice の音声文字起こし API を説明します。OpenAI 互換で、複数の音声認識モデルを選べ、タイムスタンプも返せます。
主な機能
- 01multipart/form-data による音声アップロード
- 02複数の音声認識モデルの選択
- 03テキストまたはタイムスタンプ付き JSON の返却
- 04単語・セグメント・文字単位の時刻情報
- 05ファイルサイズ上限 25 MB
活用シーン
- 01会議録音やボイスメモの文字起こし
- 02字幕や章立て用の時刻情報の生成
- 03モデル別オプションによる多言語音声の処理
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ veniceai/ skills --skill venice-audio-transcriptionインストール後、Claude Code で/venice-audio-transcriptionを入力して読み込まれたか確認します。
詳細
Venice Transcription(/audio/transcriptions)
POST /api/v1/audio/transcriptions は音声ファイルを受け取り、テキストを返します。multipart/form-data に対応した OpenAI 互換の API で、OpenAI SDK の audio.transcriptions.create() を変更せずに使用できます。
| メソッド | パス | 認証 | 備考 |
|---|---|---|---|
POST | /api/v1/audio/transcriptions | Bearer キーまたは x402(SIWX) | multipart/form-data、ファイルフィールドは file、最大 25 MB。音声の秒数に応じて課金されます。 |
次の場合に使用します
- ボイスメモ、会議、ポッドキャスト、短い音声の音声認識(STT)が必要な場合。
- 字幕やチャプター用の単語単位またはセグメント単位のタイムスタンプが必要な場合。
- Venice がホストする Parakeet、Whisper 系モデル、ElevenLabs Scribe、xAI STT から選択したい場合。
動画用の文字起こしエンドポイントはなくなりました。POST /video/transcriptions は廃止され、410 を返します。音声トラックを抽出してこちらに送信するか、動画に対応したチャットモデルに依頼してください(venice-chat)。
最小リクエスト
curl https://api.venice.ai/api/v1/audio/transcriptions \
-H "Authorization: Bearer $VENICE_API_KEY" \
-F "file=@./meeting.m4a" \
-F "model=nvidia/parakeet-tdt-0.6b-v3" \
-F "response_format=json" \
-F "timestamps=false"
{ "text": "Alright everyone, let's kick off the meeting...", "duration": 184.2 }
timestamps=true を指定すると、JSON に timestamps オブジェクトも含まれます(以下を参照)。
リクエスト(multipart/form-data)
以下のフィールドのみが読み取られます。フォーム内のその他の項目は無視されます。
| フィールド | 型 | デフォルト | 備考 |
|---|---|---|---|
file | binary | — | 必須です。 実際のファイルパートを指定してください(base64 は不可)。対応形式:wav/wave、flac、m4a、aac、mp4、mp3、ogg/oga、webm。拡張子と MIME で確認した後、バイナリシグネチャで検証されます。最大 25 MB。 |
model | string | — | 指定してください。 OpenAPI スキーマには nvidia/parakeet-tdt-0.6b-v3 がデフォルトとして記載されていますが、このデフォルトは適用されません。model を省略すると 400 "model is required" が返されます。 |
response_format | json / text | json | この 2 種類のみです。text を指定すると、文字起こし結果のみを含む text/plain 本文が返されます。 |
timestamps | bool(フォーム文字列として true/false) | false | JSON レスポンスに timestamps を追加します。 |
language | string | — | ISO 639-1 のヒント(en、ja など)。Whisper、Wizper、Scribe、xAI STT に渡されます。Parakeet では無視されます(自動検出)。 |
レスポンス
{
"text": "…",
"duration": 184.2,
"timestamps": {
"word": [{ "word": "Alright", "start": 0.12, "end": 0.48 }],
"segment": [{ "text": "Alright everyone…", "start": 0.12, "end": 4.9 }],
"char": [{ "char": "A", "start": 0.12, "end": 0.15 }]
}
}
duration(秒)と timestamps は省略可能です。含まれるタイムスタンプ配列はモデルによって異なります。
| モデル | タイムスタンプの粒度 |
|---|---|
openai/whisper-large-v3 | segment + word |
fal-ai/wizper | segment |
elevenlabs/scribe-v2 | word |
stt-xai-v1 | word |
nvidia/parakeet-tdt-0.6b-v3 | segment、word、char のいずれか、または複数が含まれる場合があります |
モデル
5 つすべてが、ライブの GET /models?type=asr リストに含まれています。料金は model_spec.pricing.per_audio_second.usd で確認できます。
| モデル ID | プライバシー | 備考 |
|---|---|---|
nvidia/parakeet-tdt-0.6b-v3 | private | Venice がホストする高速モデルです。language は無視されます。 |
openai/whisper-large-v3 | private | 多言語対応です。language のヒントに対応し、セグメント単位と単語単位のタイムスタンプを返します。 |
fal-ai/wizper | private | Whisper v3 の派生モデルです。language のヒントに対応し、セグメント単位のタイムスタンプを返します。 |
elevenlabs/scribe-v2 | anonymized | language のヒントに対応し、単語単位のタイムスタンプを返します。 |
stt-xai-v1 | anonymized | language のヒントに対応し、単語単位のタイムスタンプを返します。 |
modelPrivacy: PRIVATE_ONLY のキーでは、anonymized のモデルに対して 403 が返されます(PRIVATE_TEXT キーにはこの制限は適用されません)。文字起こしに失敗した場合、課金されません。
OpenAI SDK
import OpenAI from 'openai'
import fs from 'node:fs'
const client = new OpenAI({
apiKey: process.env.VENICE_API_KEY,
baseURL: 'https://api.venice.ai/api/v1',
})
const out = await client.audio.transcriptions.create({
file: fs.createReadStream('meeting.m4a'),
model: 'openai/whisper-large-v3',
response_format: 'json',
language: 'en',
// @ts-expect-error — Venice-specific extra, passes through multipart
timestamps: true,
})
console.log(out.text)
長いファイル
サーバー側のチャンク分割には対応しておらず、アップロードは最大 25 MB です。長時間の録音はクライアント側で(無音区間または固定長のセグメントで)分割し、各チャンクを文字起こししてから、タイムスタンプのオフセットを調整して結合してください。
ffmpeg -i long.mp3 -f segment -segment_time 600 -c copy chunk_%03d.mp3
エラー
| コード | 意味 |
|---|---|
400 | model が指定されていない、パラメーターが不正(例:response_format が json または text ではない)、file パートがない(JSON ボディを使用した場合も含む。→ "No audio file provided")、拡張子または MIME タイプがサポートされていない、あるいはバイナリー署名を認識できない場合です。 |
401 | 認証に失敗しました。 |
402 | 残高が不足しています。Bearer の場合 → {"error":"Insufficient USD or Diem balance…"}、またはキー独自の上限に達した場合は `"API key USD |
403 | PRIVATE_ONLY キーで anonymized モデルを呼び出した場合、またはリージョン制限に該当した場合です。 |
404 | 不明な model です。 |
413 | ファイルが 25 MB を超えています({"code":"PAYLOAD_TOO_LARGE","error":"File exceeds the maximum allowed size of 25 MB."})。 |
422 | アップストリームプロバイダーが音声を処理できませんでした(長さが 0、無音、破損、未対応の形式または言語、プロバイダー側による拒否)。suggested_prompt はありません。 |
429 | レート制限に達しました。 |
500 | 推論に失敗しました。 |
502 | アップストリームの ASR で一時的なエラーが発生しました — {"error":"Audio transcription failed due to a temporary upstream error. Please retry."}(code フィールドなし)。バックオフして再試行してください。 |
503 | モデルが一時的にオフラインです — ジッターを加えて再試行してください。 |
レスポンスボディの形式と再試行の戦略については、venice-errors を参照してください。
注意点
- 必ず
modelを送信してください。ドキュメントに記載されたデフォルト値は適用されません。 fileは実際のマルチパートファイルパートでなければなりません。JSON と Base64 の組み合わせはサポートされていません。verbose_json、srt、vttはありません。字幕にはresponse_format=jsonとtimestamps=trueを使用し、タイミング情報は独自に描画してください。textではタイムスタンプがすべて省略されます。timestamps.wordとtimestamps.segmentのどちらを使うかを決める前に、モデルが返す粒度を確認してください。- 拡張子が有効でも、バイナリー署名が音声形式でないファイルは拒否されます。標準プロファイル(例:MP3 44.1 kHz または 16 kHz)に再エンコードしてください。
429が返されたらバックオフしてください。すべてを並列で実行するのではなく、大量のバッチをスロットリングしてください。