使用 ElevenLabs Music API 生成音樂。適用於創作器樂曲、附歌詞的歌曲、背景音樂、廣告歌或任何 AI 生成的音樂作品。支援基於提示詞的生成、可精細控制的作曲計畫,以及包含中繼資料的詳細輸出。
ElevenLabs 音樂生成
從文字提示詞生成音樂 — 支援器樂曲、附歌詞的歌曲,以及透過作曲計畫進行精細控制。
設定: 請參閱安裝指南。若使用 JavaScript,僅使用
@elevenlabs/*套件。
以下所有範例預設使用 music_v2(目前生成模型)。僅在明確要求時才傳入 model_id="music_v1"。
快速開始
Python
from elevenlabs import ElevenLabs
client = ElevenLabs()
audio = client.music.compose(
prompt="A chill lo-fi hip hop beat with jazzy piano chords",
music_length_ms=30000,
model_id="music_v2",
)
with open("output.mp3", "wb") as f:
for chunk in audio:
f.write(chunk)
TypeScript
import { ElevenLabsClient } from "@elevenlabs/elevenlabs-js";
import { createWriteStream } from "fs";
const client = new ElevenLabsClient();
const audio = await client.music.compose({
prompt: "A chill lo-fi hip hop beat with jazzy piano chords",
musicLengthMs: 30000,
modelId: "music_v2",
});
audio.pipe(createWriteStream("output.mp3"));
cURL
curl -X POST "https://api.elevenlabs.io/v1/music" \
-H "xi-api-key: $ELEVENLABS_API_KEY" -H "Content-Type: application/json" \
-d '{"prompt": "A chill lo-fi beat", "music_length_ms": 30000, "model_id": "music_v2"}' \
--output output.mp3
方法
| 方法 | 說明 |
|---|---|
music.compose |
從提示詞或作曲計畫生成音訊 |
music.stream |
即時串流生成的音訊區塊(付費方案) |
music.composition_plan.create |
生成結構化計畫以進行精細控制 |
music.compose_detailed |
生成音訊 + 作曲計畫 + 中繼資料;傳入 store_for_inpainting=True 以啟用修補功能 |
music.compose_detailed_stream |
以伺服器推送事件串流音訊,同時包含作曲計畫、中繼資料及可選的字詞時間戳記 |
music.video_to_music |
從一或多個上傳的影片檔案生成背景音樂 |
music.upload |
上傳音訊檔案供後續修補工作流程使用,可選擇擷取其作曲計畫或字詞層級時間戳記 |
完整參數詳情請參閱 API 參考。
music.upload 僅提供給具備修補功能存取權限的企業客戶。
影片轉音樂
從上傳的影片片段生成背景音樂,透過
POST /v1/music/video-to-music
(client.music.video_to_music)。此功能與基於提示詞的
music.compose(POST /v1/music)不同。
API 會依序合併影片,接受可選的自然語言描述,並允許您使用最多 10 個標籤(例如 upbeat 或 cinematic)來引導風格。此端點仍預設使用 music_v1;傳入 model_id="music_v2" 以使用較新模型。
Python
from elevenlabs import ElevenLabs
client = ElevenLabs()
audio = client.music.video_to_music(
videos=["trailer.mp4"],
description="Build suspense, then resolve with a warm cinematic finish.",
tags=["cinematic", "suspenseful", "uplifting"],
model_id="music_v2",
)
with open("video-score.mp3", "wb") as f:
for chunk in audio:
f.write(chunk)
TypeScript
import { ElevenLabsClient } from "@elevenlabs/elevenlabs-js";
import { createReadStream, createWriteStream } from "fs";
const client = new ElevenLabsClient();
const audio = await client.music.videoToMusic({
videos: [createReadStream("trailer.mp4")],
description: "Build suspense, then resolve with a warm cinematic finish.",
tags: ["cinematic", "suspenseful", "uplifting"],
modelId: "music_v2",
});
audio.pipe(createWriteStream("video-score.mp3"));
cURL
curl -X POST "https://api.elevenlabs.io/v1/music/video-to-music" \
-H "xi-api-key: $ELEVENLABS_API_KEY" \
-F "videos=@trailer.mp4" \
-F "description=Build suspense, then resolve with a warm cinematic finish." \
-F "tags=cinematic" \
-F "tags=suspenseful" \
-F "tags=uplifting" \
-F "model_id=music_v2" \
--output video-score.mp3
目前 API 架構的限制:
- 每次請求上傳 1-10 個影片檔案
- 總合併上傳大小保持在 200 MB 以下
- 總合併影片長度保持在 600 秒以下
- 使用
description進行高層級音樂方向引導,使用tags提供簡潔風格提示
作曲計畫
music_v2 作曲計畫是一個有序的 chunks 列表。每個區塊指定自己的 text(段落標籤、歌詞、內嵌提示)、duration_ms、positive_styles、negative_styles 和 context_adherence(low、medium 或 high,預設 high)。每個計畫最多 30 個區塊,每個區塊 3,000–120,000 毫秒,總長度 3 秒至 10 分鐘。
先產生計畫,編輯後再作曲:
plan = client.music.composition_plan.create(
prompt="An epic orchestral piece building to a climax",
music_length_ms=60000,
model_id="music_v2",
)
# 就地編輯區塊
plan["chunks"][0]["text"] = "[Intro]\nQuiet strings rising"
audio = client.music.compose(
composition_plan=plan,
model_id="music_v2",
)
const plan = await client.music.compositionPlan.create({
prompt: "An epic orchestral piece building to a climax",
musicLengthMs: 60000,
modelId: "music_v2",
});
plan.chunks[0].text = "[Intro]\nQuiet strings rising";
const audio = await client.music.compose({
compositionPlan: plan,
modelId: "music_v2",
});
或手動建立計畫以控制每個段落的歌詞和風格:
composition_plan = {
"chunks": [
{
"text": "[Verse]\nWalking down an empty street",
"duration_ms": 15000,
"positive_styles": ["pop", "upbeat", "female vocals", "acoustic guitar"],
"negative_styles": ["dark", "slow"],
"context_adherence": "high",
},
{
"text": "[Chorus]\nThis is my moment",
"duration_ms": 15000,
"positive_styles": ["powerful vocals", "full band"],
"negative_styles": [],
"context_adherence": "high",
},
]
}
audio = client.music.compose(composition_plan=composition_plan, model_id="music_v2")
const compositionPlan = {
chunks: [
{
text: "[Verse]\nWalking down an empty street",
durationMs: 15000,
positiveStyles: ["pop", "upbeat", "female vocals", "acoustic guitar"],
negativeStyles: ["dark", "slow"],
contextAdherence: "high",
},
{
text: "[Chorus]\nThis is my moment",
durationMs: 15000,
positiveStyles: ["powerful vocals", "full band"],
negativeStyles: [],
contextAdherence: "high",
},
],
};
const audio = await client.music.compose({
compositionPlan,
modelId: "music_v2",
});
將較廣泛的特性(曲風、樂器、人聲風格)放在 positive_styles 中,而非 text。第一個區塊的風格設定整體基調 — 請包含 6–7 個風格。
輸出格式
在作曲、詳細作曲或串流請求中使用 output_format 查詢參數來選擇生成的音訊格式。auto 會選擇適合模型的 MP3 格式;對於 music_v2,它會選擇 mp3_48000_192。更高位元率的 MP3 選項包括 mp3_48000_240 和 mp3_48000_320。
串流
對於付費方案,可以在生成時即時串流音訊區塊,無需等待完整檔案:
from io import BytesIO
stream = client.music.stream(
prompt="A driving synthwave track with arpeggiated leads",
music_length_ms=30000,
model_id="music_v2",
)
buffer = BytesIO()
for chunk in stream:
if chunk:
buffer.write(chunk)
const stream = await client.music.stream({
prompt: "A driving synthwave track with arpeggiated leads",
musicLengthMs: 30000,
modelId: "music_v2",
});
const chunks: Buffer[] = [];
for await (const chunk of stream) {
chunks.push(chunk);
}
詳細串流
當應用程式需要在音訊仍在接收時取得生成的音樂中繼資料時,請使用詳細串流。POST /v1/music/detailed/stream 接受與詳細作曲相同的提示詞或作曲計畫主體,串流 text/event-stream,並可透過 with_timestamps 包含字詞時間戳記。
curl -N -X POST "https://api.elevenlabs.io/v1/music/detailed/stream?output_format=auto" \
-H "xi-api-key: $ELEVENLABS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"prompt": "A bright indie pop hook with warm guitars", "music_length_ms": 30000, "model_id": "music_v2", "with_timestamps": true}'
修補
修補功能透過在單一作曲計畫中混合音訊參考區塊(已儲存歌曲中未變更的片段)與新的生成區塊,來編輯或延伸已儲存的歌曲。
步驟 1 — 取得 song_id,可以透過儲存新生成的歌曲或上傳現有音訊:
# 選項 A:保留生成結果以供後續編輯
result = client.music.compose_detailed(
prompt="An upbeat pop song with verse and chorus",
music_length_ms=60000,
model_id="music_v2",
store_for_inpainting=True,
)
song_id = result.song_id
# 選項 B:上傳現有曲目並擷取其計畫
uploaded = client.music.upload(
file=open("my-song.mp3", "rb"),
extract_composition_plan="music_v2",
)
song_id = uploaded.song_id
composition_plan = uploaded.composition_plan
import { createReadStream } from "fs";
// 選項 A:保留生成結果以供後續編輯
const result = await client.music.composeDetailed({
prompt: "An upbeat pop song with verse and chorus",
musicLengthMs: 60000,
modelId: "music_v2",
storeForInpainting: true,
});
let songId = result.songId;
// 選項 B:上傳現有曲目並擷取其計畫
const uploaded = await client.music.upload({
file: createReadStream("my-song.mp3"),
extractCompositionPlan: "music_v2",
});
songId = uploaded.songId;
const compositionPlan = uploaded.compositionPlan;
步驟 2 — 作曲一個計畫,參考已儲存的音訊並重新生成您想變更的部分:
plan = {
"chunks": [
{"song_id": song_id, "range": {"start_ms": 0, "end_ms": 30000}},
{
"text": "[Chorus]\nWe're rising up tonight",
"duration_ms": 30000,
"positive_styles": ["bigger drums", "layered vocals", "anthemic"],
"negative_styles": ["sparse"],
"context_adherence": "high",
},
]
}
audio = client.music.compose(composition_plan=plan, model_id="music_v2")
const plan = {
chunks: [
{ songId, range: { startMs: 0, endMs: 30000 } },
{
text: "[Chorus]\nWe're rising up tonight",
durationMs: 30000,
positiveStyles: ["bigger drums", "layered vocals", "anthemic"],
negativeStyles: ["sparse"],
contextAdherence: "high",
},
],
};
const audio = await client.music.compose({
compositionPlan: plan,
modelId: "music_v2",
});
若要匹配已儲存片段的感覺但不複製它,請在生成區塊上附加 conditioning_ref(最多 30,000 毫秒)以及 condition_strength(low、medium、high 或 xhigh)。放置在第一個區塊上的條件會影響後續所有區塊。
完整修補參數列表請參閱 API 參考。
內容限制
- 不能參考特定藝人、樂團或受版權保護的歌詞
bad_prompt錯誤會包含prompt_suggestion,提供替代措辭bad_composition_plan錯誤會包含composition_plan_suggestion
錯誤處理
try:
audio = client.music.compose(prompt="...", music_length_ms=30000)
except Exception as e:
print(f"API error: {e}")
try {
const audio = await client.music.compose({
prompt: "...",
musicLengthMs: 30000,
});
} catch (err) {
console.error("API error:", err);
}
常見錯誤:401(金鑰無效)、422(參數無效)、429(速率限制)。




