Ofox経由でElevenLabs APIを使う:最初の音声を生成し、保存・検証する

Ofox経由でElevenLabs APIを使い、PythonやcURLで最初の音声を生成する手順。実際のMP3、設定、検証用コード、エラーの切り分けを紹介します。

ベージュの背景と淡いカードに鍵と紐の線画。幾何学模様とElevenLabs APIの文字。

OfoxでElevenLabsの音声を生成するには、/v1/audio/speech にテキスト、Ofox APIキー、モデルID elevenlabs/eleven_v4、対応する音声ID、出力形式を送ります。成功したバイナリ応答を保存した後、音声としてデコードできることまで確認します。ファイル名が speech.mp3 でも、中身がエラーJSONなら音声にはなりません。

この記事は2026年10月10日の実際の呼び出しに基づきます。独自の英語原稿から10.00秒のMP3を生成し、別のScribeリクエストで文字起こししました。原音声、クライアント、応答記録をダウンロードできます。1件の成功例であり、稼働率の測定や、ElevenLabsの全機能がOfox経由で利用できるという説明ではありません。

完成させるもの

成果物は、再生可能な音声、入力原稿、秘密情報を含まない設定、検証記録です。HTTP 200だけで完成とせず、動画編集や文字起こしに渡せるファイルを残します。再現には利用権限と残高のあるOfoxキー、および正常な上流経路が必要です。この例では個人のElevenLabsキーを別途入力しません。

使用するのは既存の音声IDで、声の新規登録や人物の声のクローン作成は行いません。実在人物に関係する声を利用するときは、権利と同意を別に確認してください。APIが成功したことは、その人物を模倣したり、あらゆる用途で公開したりする許可にはなりません。

一式をダウンロードすると、audio_api.py、comparison.txt、elevenlabs.mp3、応答メタデータが入っています。認証は環境変数から読み込み、失敗した課金対象POSTを自動で繰り返さない構成です。

ElevenLabsの生成音声

1. ツールと原稿を準備する

Python、requests、FFmpeg、ffprobe を用意します。HTTPだけならメディアツールは不要ですが、ここでは長さとデコードの確認も検収に含めます。実行するターミナルで各コマンドが使えるか確認します。

python3 -m pip install requests
ffmpeg -version
ffprobe -version

OFOX_API_KEY は普段使う秘密情報管理ツールか非公開の環境設定で登録してください。ソース、記事、画面キャプチャ、Git管理する .env には入れません。デバッグのためにAuthorizationヘッダーを表示することも避けます。付属クライアントは設定済み変数を直接読みます。

最初は comparison.txt の文章をそのまま使用します。

A clear product video starts with a clear brief. Show the real interface, explain one useful task, and check the exported video before sharing it.

UTF-8で保存し、問題を切り分ける間は文面を固定してください。原稿、声、モデル、形式を一度に変えると、どの変更が効いたか判断できません。多言語制作では先に各言語の原稿を校正します。翻訳の正しさと音声生成の成功は別の検査です。

自分の原稿では略語や曖昧な日付を整理します。数字だけの日付より月名と年を含む表記の方が確認しやすくなります。固有名詞の発音はテキスト表示では判断できないため、最終音声を聞いて確認します。この例では、経路で未検証の感情指定や発音制御を使えると約束しません。

2. ゲートウェイ用のモデルと音声を指定する

項目検証した値意味
modelelevenlabs/eleven_v4Ofoxのプロバイダー付きID
voiceJBFqnCBsd6RMkjVDRZzbこの呼び出しで受理された音声ID
response_formatmp3_22050_32ファイル名ではなくMP3プリセット
speed1.0送信した速度設定。長さの保証ではない

変更前にモデルページを確認します。表示名をモデルIDの代わりに使ったり、別プロバイダーの声名が使えると考えたりしないでください。

OfoxとElevenLabsのネイティブAPIは同じ入口ではありません。ネイティブ例は音声IDをURLに入れる場合がありますが、この記事ではOfoxのURLとJSONの voice を使います。ネイティブ資料の専用パラメーターをすべてコピーしても、互換性を確認したことにはなりません。

まず最小構成で成功させ、その後に声、言語指定、追加設定を一つずつ試します。共通クライアントを作る場合もプロバイダー固有項目を分離し、すべての音声モデルが同じ設定で交換できるように見せないことが重要です。

3. Pythonで最初のMP3を生成する

展開したキットのディレクトリで実行します。

python3 audio_api.py speech \
  --engine elevenlabs \
  --text comparison.txt \
  --output my-first-voiceover.mp3

新しい出力名を使ってください。クライアントは既存ファイルへの上書きを拒否し、前の試行の証拠を保護します。秘密を含まない入力設定を保存し、応答形式を調べ、バイト列を書き出し、長さを取得してデコードします。期待する応答は音声の実体であり、音声URLを含むJSONではありません。

今回の応答はHTTP 200、audio/mpeg、40,456バイト、10.00秒でした。クライアント計測は2.861秒です。ネットワークと処理を含む単発の値なので、最初の音が届くまでの時間やサービス全体の性能保証とは区別します。

実際のMP3を確認できます。音量調整や無音カットをする場合は別版として保存し、APIの元出力を残してください。

4. 同じリクエストをcURLで作る

次は代替手段です。応答を一時ファイルに保存し、HTTP成功時だけ名前を変更します。

python3 - <<'PY'
import json
from pathlib import Path
payload = {
    'model': 'elevenlabs/eleven_v4',
    'voice': 'JBFqnCBsd6RMkjVDRZzb',
    'input': Path('comparison.txt').read_text().strip(),
    'response_format': 'mp3_22050_32',
    'speed': 1.0,
}
Path('speech-request.json').write_text(json.dumps(payload))
PY
curl --fail-with-body --silent --show-error \
  https://api.ofox.ai/v1/audio/speech \
  -H "Authorization: Bearer $OFOX_API_KEY" \
  -H 'Content-Type: application/json' \
  --data-binary @speech-request.json \
  --output speech-response.tmp \
  && mv speech-response.tmp curl-voiceover.mp3

PythonとcURLを両方実行する必要はありません。両方なら2回の生成になります。公開音声はPythonクライアントで取得しており、cURLは同等のリクエスト構築例です。古いcURLで --fail-with-body が使えなければPythonを使うか、状態コードを明示的に判定します。

失敗した一時ファイルには調査に役立つエラー本文が残ることがあります。読む前に削除せず、再生ソフトに渡すためだけに .mp3 へ変更しないでください。

5. ステータスではなくファイルを検収する

ffprobe -v error -show_entries \
  stream=codec_name,sample_rate,channels:format=duration \
  -of json my-first-voiceover.mp3
ffmpeg -v error -i my-first-voiceover.mp3 -f null -

デコード成功は技術検査です。ブランドの読み、間、映像の切り替え、聞き手に合う話し方までは判断しません。公開前には全編を通常の音量で聞き、承認した原稿と照合します。

本例のScribeによる転写は、句読点の違いを除き同じ語を返しました。ただし認識モデルが誤りを正規化したり、不要な音を見逃したりする可能性があります。モデル同士の一致を完全な音質の証明にしません。

検収記録には原稿版、モデル、声、形式、長さ、デコード結果、発音確認者を記載します。未確認は未確認のまま残します。HTTP成功でも内容を確認していない音声は編集レビュー待ちであり、すぐに広告へ使える成果物とは限りません。

6. 実測の長さで動画に合わせる

別の声や別の生成では同じ原稿の長さも変わり得ます。speed=1.0 は十秒の映像に必ず合うという指定ではありません。音声が長ければ場面や原稿を調整し、短ければ意図した余韻を残すなど、編集上の判断をします。

動作を理解しないまま最短ストリームに合わせるオプションを使うと、映像や発話の終わりを切る場合があります。動画ナレーションの手順で測定とMP4組み立てを、Scribe字幕ガイドで実際の語タイミングを確認してください。

この例で確かめたのは指定構成の音声生成です。すべての言語、専門用語、納品形式で同じ品質になることまでは示していません。

7. 費用は単位と採用テイクで考える

文字、音声トークン、転写の秒数は異なる単位です。裸の単価を並べず、適用設定とモデルページ、リクエストごとの請求記録を確認します。40KBのファイルや約3秒の処理時間から料金は推定できません。

この例の設定は自分の利用履歴と照合するために保存されています。カタログ見積もりを、このサンプルで確定した請求額としては表示しません。

制作では不採用テイクと再試行も数えます。3回生成して1本を採用した場合と1回で採用できた場合は、完成物あたりの費用が異なります。課金された呼び出し全体を記録し、単価だけでなく合格した成果物単位で判断してください。

8. 失敗した段階を切り分ける

症状調べるもの次の対応
quotaを示す401本文とリクエストID実際に使われた経路・アカウントを確認
認証を示す401環境変数と認証方式秘密を表示せず設定を修正
400、形式非対応モデル・声・形式の組み合わせ検証済み設定へ戻し一項目ずつ変更
小さなMP3が再生できない応答形式と本文エラーを読み、原因修正後に生成
タイムアウト、結果不明リクエスト履歴完了の有無を確認してから再試行
語の欠落、読みの問題原音声と原稿修正して別テイクを保存

今回の準備ではOfox残高が正でも上流の割当エラーが返ることがあり、経路の復旧後に新規呼び出しが成功しました。この事実を、すべての401の原因が同じだという説明には使いません。

よくある質問

ElevenLabsのAPIキーを設定しますか?
いいえ。この例はOfoxキーでOfoxゲートウェイへ認証します。ElevenLabsのネイティブ認証とは別です。
好きな音声名を指定できますか?
互換性を確認してください。本例は記載した正確なIDで成功しており、表示名や別社の声名がそのまま使えるとは限りません。
MP3の中身がJSONなのはなぜですか?
状態コードと応答形式を検査せず、エラーを保存した可能性があります。拡張子ではなくエラー原因を修正します。
HTTP 200なら公開してよいですか?
デコード、全体の長さ、発音、欠落、映像との同期を確認してから公開を判断します。