
ElevenLabs Music v2 APIのcomposition planで曲調と長さを指定して音声データを作成できるようになったので試してみた
どうも!オペ部の西村祐二です!
ElevenLabs の 2026年6月15日のChangelog で、Music v2 API が追加されました。
music_v2 では、従来のようにプロンプトだけで曲を生成するだけでなく、composition_plan を使って曲のセクション、尺、歌詞、スタイルを chunk 単位で指定できます。
この記事では、music_v2 の composition plan を使って、短いオリジナルJ-popデモと45秒のオーケストラ曲を生成してみます。
Music v2 APIで何が変わったのか
Changelog によると、model_id に music_v2 を指定することで、Generate music、Stream music、Generate music detailed、Upload music で新しいモデルを利用できます。
大きな変更点は、GenerationChunk と AudioRefChunk を使った chunk-based composition plan です。公式ドキュメントでは、music_v2 の plan は順序付きの chunk リストとして扱われ、それぞれの chunk にセクションごとの歌詞、スタイル、duration を持たせられると説明されています。
ざっくり言うと、次のような使い分けになります。
| 使い方 | 向いているケース |
|---|---|
prompt だけで生成 |
まず雰囲気をすばやく試したい |
composition_plan で生成 |
曲構成、歌詞、各セクションの尺を指定したい |
/v1/music/plan で plan を作ってから生成 |
自分でゼロからJSONを書くのではなく、AIに下書きさせたい |
なお、composition plans の公式ガイド では、prompt と composition_plan は同時に使わず、どちらか一方を指定する形になっています。
試した環境
今回の検証環境は次の通りです。
- 実行日: 2026-06-17
- OS: macOS
- API: ElevenLabs Music API
- モデル:
music_v2 - 実行方法:
curl+jq - 出力形式:
mp3_48000_192
APIキーは環境変数 ELEVENLABS_API_KEY に設定して使います。この記事ではキーの値は扱いません。
export ELEVENLABS_API_KEY="<YOUR_ELEVENLABS_API_KEY>"
まずcomposition planを生成する
最初に、POST /v1/music/plan を使って composition plan を生成します。
このエンドポイントは音声そのものではなく、曲構成のJSONを返します。公式の Create composition plan によると、このエンドポイント自体はクレジット消費なしで利用できますが、プランに応じた rate limit の対象になります。
今回は10秒のシティポップ風インストを作るプロンプトで試しました。
jq -n \
--arg prompt 'Create a 10-second instrumental city pop loop for a product demo. Structure it as a soft intro, a brighter main groove, and a clean ending. Use 95 BPM, electric piano, muted guitar, light bass, tight drums, and no vocals.' \
'{prompt:$prompt,music_length_ms:10000,model_id:"music_v2"}' \
| curl -sS \
-X POST 'https://api.elevenlabs.io/v1/music/plan' \
-H "xi-api-key: ${ELEVENLABS_API_KEY}" \
-H 'Content-Type: application/json' \
--data-binary @- \
| jq .
返ってきた plan は chunks を持つJSONでした。実際には次のように、Intro、Main Groove、Ending の3セクションに分かれました。
{
"chunks": [
{
"text": "[Soft Intro]",
"duration_ms": 3000,
"positive_styles": [
"city pop",
"instrumental",
"95 bpm",
"electric piano",
"muted guitar"
],
"negative_styles": [
"vocals",
"aggressive",
"heavy metal"
],
"context_adherence": "high"
},
{
"text": "[Brighter Main Groove]",
"duration_ms": 4500,
"positive_styles": [
"bright funky muted guitar riffing",
"tight snare drum and hi-hat groove",
"funky walking bassline"
],
"negative_styles": [
"distorted lead guitar",
"vocals"
],
"context_adherence": "high"
},
{
"text": "[Clean Ending]",
"duration_ms": 3000,
"positive_styles": [
"staccato electric piano stabs",
"clean guitar tail",
"snare hit ending on beat"
],
"negative_styles": [
"fade out",
"reverb crash",
"vocals"
],
"context_adherence": "high"
}
]
}
公式ドキュメント上のAPIリファレンス例では、music_v1 と music_v2 の plan shape が混ざって見える箇所もありますが、今回 model_id: "music_v2" で実行したレスポンスは chunks ベースでした。
composition planから音楽を生成する
次に、生成された plan を POST /v1/music に渡して音声ファイルを生成します。
Compose music API では、prompt または composition_plan のどちらかを指定して曲を生成できます。music_v2 のデフォルト出力形式は mp3_48000_192 ですが、今回は明示的に query parameter で指定しました。
jq -n --slurpfile plan /tmp/elevenlabs_music_v2_plan.json '{
model_id: "music_v2",
composition_plan: $plan[0]
}' \
| curl -sS \
-X POST 'https://api.elevenlabs.io/v1/music?output_format=mp3_48000_192' \
-H "xi-api-key: ${ELEVENLABS_API_KEY}" \
-H 'Content-Type: application/json' \
--data-binary @- \
-o elevenlabs_music_v2_citypop.mp3
結果はHTTP 200で、MP3ファイルが生成されました。
Content-Type: audio/mpeg
MPEG Layer III, 192 kbps, 48 kHz, Joint Stereo
Duration: 10.512 seconds
まずは plan 生成から音声生成まで、REST APIだけで一通り動かせることを確認できました。
作成された音声は下記です。
J-popデモを作ってみる
ここからが本題です。
短いJ-popデモを作るため、Jpopの曲と歌詞に対応したcomposition plan をAIに書いてもらいました。既存アーティスト名や既存曲名には寄せず、完全オリジナルのデモとして、Intro、Verse、Pre-Chorus、Chorus、Outro の5 chunksに分けます。
{
"model_id": "music_v2",
"composition_plan": {
"chunks": [
{
"text": "[Intro]\n{instrumental hook}",
"duration_ms": 4000,
"positive_styles": [
"modern J-pop",
"bright female vocal production",
"128 BPM",
"A major",
"sparkling electric piano",
"clean electric guitar",
"tight pop drums",
"warm synth pad",
"catchy instrumental hook",
"polished radio mix"
],
"negative_styles": [
"existing artist imitation",
"cover song",
"dark",
"heavy metal",
"lo-fi",
"distorted vocals"
],
"context_adherence": "high"
},
{
"text": "[Verse 1]\n夜明け前のホームで\nほどけた夢を結んだ",
"duration_ms": 8000,
"positive_styles": [
"gentle verse",
"clear Japanese female vocals",
"natural Japanese pronunciation",
"spacious phrasing",
"soft electric piano",
"light guitar arpeggios",
"subtle sidechain synth",
"steady pop groove"
],
"negative_styles": [
"rap",
"shouting",
"spoken word",
"a cappella",
"crammed lyrics",
"rushed syllables",
"overly dramatic vibrato"
],
"context_adherence": "high"
},
{
"text": "[Pre-Chorus]\n風が背中を押す",
"duration_ms": 6000,
"positive_styles": [
"rising pre chorus",
"clear Japanese female vocals",
"natural Japanese pronunciation",
"building drums",
"layered harmonies",
"uplifting synth lift",
"snare build",
"emotional but hopeful"
],
"negative_styles": [
"dropout",
"quiet ending",
"dark chord change",
"crammed lyrics",
"rushed syllables",
"screaming"
],
"context_adherence": "high"
},
{
"text": "[Chorus]\n走れ 朝焼けライン\n胸の奥まで照らして\n新しい今日へ",
"duration_ms": 11000,
"positive_styles": [
"big J-pop chorus",
"clear Japanese female vocals",
"natural Japanese pronunciation",
"spacious singable topline",
"catchy topline",
"full band",
"bright synth strings",
"driving drums",
"wide vocal harmonies",
"uplifting melody",
"radio-ready hook"
],
"negative_styles": [
"sad ballad",
"minimal arrangement",
"low energy",
"crammed lyrics",
"rushed syllables",
"spoken voice"
],
"context_adherence": "high"
},
{
"text": "[Outro]\n{short instrumental tag}\n朝焼けライン",
"duration_ms": 3000,
"positive_styles": [
"short outro",
"clean final chord",
"sparkling synth tail",
"memorable pop ending"
],
"negative_styles": [
"long fade out",
"abrupt cut",
"dark ending"
],
"context_adherence": "high"
}
]
}
}
この plan をそのまま POST /v1/music に渡して生成しました。
curl -sS \
-X POST 'https://api.elevenlabs.io/v1/music?output_format=mp3_48000_192' \
-H "xi-api-key: ${ELEVENLABS_API_KEY}" \
-H 'Content-Type: application/json' \
--data-binary @composition-plan.json \
-o elevenlabs_jpop_asayake-line.mp3
生成結果は次の通りです。
HTTP 200
Content-Type: audio/mpeg
File size: 769,005 bytes
Format: MP3, 48 kHz, 192 kbps
Duration: 32.040 seconds
作成された曲は下記です。
怪しいところもありますが、いい感じに曲が生成されました。
曲調と長さを変えて45秒の曲も作ってみる
composition plan は、曲調や長さを変えたいときにも扱いやすいです。
試しに、J-popデモとは別に、イントロなしで開始直後から主旋律が鳴る45秒の尺指定のオーケストラ曲も作ってみました。既存ゲーム作品や作曲家の再現ではなく、完全オリジナルのファンタジーRPG向けBGMという前提です。
全体の plan は長いので、ここでは要点だけ抜粋します。
{
"model_id": "music_v2",
"composition_plan": {
"chunks": [
{
"text": "[Main Theme - immediate start]\n{full heroic orchestral theme begins on the first beat}",
"duration_ms": 12000,
"positive_styles": [
"original fantasy RPG orchestral music",
"immediate main theme",
"no intro",
"grand symphonic arrangement",
"full strings",
"heroic brass fanfare",
"timpani and cymbal swells",
"cinematic game soundtrack",
"majestic and adventurous",
"140 BPM"
],
"negative_styles": [
"existing game franchise imitation",
"cover song",
"recognizable melody",
"slow intro",
"fade in",
"lyrics"
],
"context_adherence": "high"
},
{
"text": "[Rising Adventure]\n{strings drive forward while brass answers the main theme}",
"duration_ms": 10000,
"positive_styles": [
"driving ostinato strings",
"French horns answer melody",
"snare and timpani rhythm",
"heroic journey feeling",
"fantasy world map energy"
],
"context_adherence": "high"
},
{
"text": "[Heroic Lift]\n{main theme modulates upward with brighter brass and soaring strings}",
"duration_ms": 10000,
"positive_styles": [
"soaring violin melody",
"bright brass counter melody",
"wordless choir texture",
"uplifting modulation",
"large fantasy battle theme"
],
"context_adherence": "high"
},
{
"text": "[Climax]\n{full orchestra peaks with percussion hits and triumphant cadence}",
"duration_ms": 10000,
"positive_styles": [
"full orchestra climax",
"triumphant brass",
"rapid string runs",
"crash cymbals",
"timpani rolls"
],
"context_adherence": "high"
},
{
"text": "[Final Hit]\n{short decisive orchestral ending with a resonant final chord}",
"duration_ms": 3000,
"positive_styles": [
"decisive final chord",
"orchestral hit",
"short reverb tail",
"complete ending",
"no fade out"
],
"context_adherence": "high"
}
]
}
}
この plan も同じ POST /v1/music に渡すだけです。
curl -sS \
-X POST 'https://api.elevenlabs.io/v1/music?output_format=mp3_48000_192' \
-H "xi-api-key: ${ELEVENLABS_API_KEY}" \
-H 'Content-Type: application/json' \
--data-binary @fantasy-rpg-plan.json \
-o elevenlabs_fantasy-rpg_45s_no-intro.mp3
生成結果は次の通りです。
HTTP 200
Content-Type: audio/mpeg
File size: 1,080,621 bytes
Format: MP3, 48 kHz, 192 kbps
Duration: 45.024 seconds
J-popの32秒デモから、45秒の壮大なオーケストラ曲へ、JSONの duration_ms と style 指定を変えるだけで同じAPIから生成できました。曲調、尺、開始直後の入り方までリクエストに含められるので、短いBGM素材やデモ音源をさっと作りたいときに扱いやすいです。
作成された曲は下記です。
実際に試して分かったこと
曲構成をJSONとして扱えるのが便利
プロンプトだけで曲を生成する場合、「Aメロ、Bメロ、サビを入れて」と書いても、実際の尺や区切りがどこまで反映されるかはモデル任せになりがちです。
composition plan では、少なくともリクエスト側の意図として、Intro は4秒、Verse は8秒、Pre-Chorus は6秒、Chorus は11秒、Outro は3秒、という形で曲構造を明示できます。
music_v2 では section duration が常に尊重される扱いになっており、respect_sections_durations は music_v1 向けのパラメータとして説明されています。この点も、構造指定を前提に曲を作りたい場合には分かりやすいです。
日本語歌詞もそのまま渡せた
今回のJ-popデモでは、text に日本語歌詞をそのまま入れました。短い検証では、APIエラーにはならずMP3が生成されました。
ただし、歌詞の聞き取りや発音の自然さは、曲調や尺、歌詞量に左右されます。短いデモでは1 chunkあたりの歌詞を詰め込みすぎないほうが扱いやすそうです。また漢字の読み間違いもあるため、歌詞をひらがなに直すなどちょっとした調整もまだ必要そうです。
曲調と長さを変えながら試せる
J-popデモでは、Intro、Verse、Pre-Chorus、Chorus、Outro という構成で32.040秒のMP3を生成しました。次に、同じエンドポイントで、イントロなし、45秒、壮大なファンタジーRPG風オーケストラ曲という別方向の plan を渡したところ、45.024秒のMP3が生成されました。
この差分をAPIリクエストだけで作れるのは便利です。曲調や長さを文章でざっくり指定するだけでなく、chunkごとに「ここは12秒」「ここから盛り上げる」「最後は3秒で決める」といった指定を書けるため、用途に合わせた短尺BGMを作る流れに向いていそうです。
negative_stylesも調整に効く
今回の plan では、negative_styles に existing artist imitation、cover song、a cappella、spoken voice などを入れました。
音楽生成では「何を入れたいか」だけでなく「何を避けたいか」も書けると、試行錯誤がしやすくなります。特にオリジナル曲として生成したい場合、既存アーティストや既存曲に寄せる指定を避けるだけでなく、negative側にも明示しておくと扱いやすいです。
detailedエンドポイントは別途試したい
今回は通常の POST /v1/music でMP3を受け取りました。
Generate music detailed では、JSON metadata と binary audio file を含む multipart/mixed レスポンスを返すため、生成結果の metadata も扱いたい場合はこちらが便利そうです。
ただし、curl だけで扱うより、SDKや小さな解析スクリプトを用意したほうがよさそうだったので、今回は通常の音声生成に絞りました。
注意点
APIキーなしではplan生成もできなかった
/v1/music/plan はクレジット消費なしと説明されていますが、今回の環境ではAPIキーなしで叩くとHTTP 401になりました。
{
"status": "needs_authorization",
"message": "Neither authorization header nor xi-api-key received, please provide one."
}
クレジットを消費しないことと、認証なしで使えることは別物として考えたほうがよさそうです。
公開・商用利用はプランと規約を確認する
今回の記事では技術検証として短いデモを生成しました。
生成物を公開したり、動画・広告・プロダクトに組み込んだりする場合は、利用中のプラン、商用利用条件、出力物の扱いを公式の Pricing や利用規約で確認してください。
まとめ
ElevenLabs Music v2 API の composition plan を使って、短いオリジナルJ-popデモと45秒のオーケストラ曲を生成してみました。
今回試した範囲では、music_v2 の composition_plan は、曲構成をJSONとして扱いたい場合に便利でした。特に、セクションごとの尺、歌詞、入れたいスタイル、避けたいスタイルを分けて指定できるため、プロンプト一発生成よりも意図を整理しやすいです。
一方で、最終的な歌詞の聞き取りやメロディの印象は生成結果を聴いて判断する必要があります。まずは /v1/music/plan で構成案を作り、短い尺で生成してから、曲調や長さを変えながら plan を手直ししていく流れが扱いやすそうです。
次は POST /v1/music/detailed で metadata 付きのレスポンスを扱い、promptだけ生成と composition plan 指定の違いも比較してみたいです。
誰かの参考になれば幸いです。
参考リンク:









