music

music

熱門

使用 ElevenLabs Music API 生成音樂。適用於創作器樂曲、附歌詞的歌曲、背景音樂、廣告歌或任何 AI 生成的音樂作品。支援基於提示詞的生成、可精細控制的作曲計畫,以及包含中繼資料的詳細輸出。

385星標
51分支
更新於 2026/7/18
SKILL.md
唯讀
名稱
music
描述

使用 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.composePOST /v1/music)不同。

API 會依序合併影片,接受可選的自然語言描述,並允許您使用最多 10 個標籤(例如 upbeatcinematic)來引導風格。此端點仍預設使用 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_mspositive_stylesnegative_stylescontext_adherencelowmediumhigh,預設 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_240mp3_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_strengthlowmediumhighxhigh)。放置在第一個區塊上的條件會影響後續所有區塊。

完整修補參數列表請參閱 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(速率限制)。

參考資料