mcpField
S
Songbrain

Songbrain

远程服务
songbrain.ai媒体与设计01 周前更新

关于 Songbrain

Songbrain 是面向 AI 视频工作流的托管音乐分析 API,并提供 SDK。它将歌曲结构、歌词时间信息与高光片段及按节拍同步的分镜提示结合起来,也提供 MCP 服务供兼容客户端直接分析歌曲。

主要功能

  1. 01歌曲 DNA:节奏、调性、情绪和乐器
  2. 02含强拍的节拍与段落时间线
  3. 03排序后的高光片段和逐词歌词时间
  4. 04按节拍同步的分镜计划与场景提示词
  5. 05Python 和 JavaScript/TypeScript SDK

适用场景

  1. 01为视频挑选歌曲中最精彩的片段
  2. 02根据音频生成节拍对齐的分镜计划
  3. 03利用音乐属性和评分比较曲目
  4. 04让 MCP 客户端直接分析歌曲

MCP 相关

托管 MCP 服务位于 https://api.songbrain.ai/v1/mcp,兼容客户端(如 Claude、Cursor 或 ChatGPT)可通过它读取并分析歌曲。

配置

远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。

服务地址https://api.songbrain.ai/v1/mcp
一键复制安装命令
Claude CodeTerminal
Cursor.cursor/mcp.json
VS Code.vscode/mcp.json
Claude Desktopclaude_desktop_config.json
Windsurf~/.codeium/windsurf/mcp_config.json

命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。

全部服务地址
Streamable HTTPhttps://api.songbrain.ai/v1/mcp需要授权

工具

7

此工具无需参数。

详细介绍

Songbrain

CI PyPI npm MCP Registry License: MIT

输入歌曲,输出视频方案——面向 AI 视频的音乐分析 API。

发送一首歌曲,即可获得视频模型能直接使用的 JSON:歌曲是什么、节拍和段落在哪里、该选用哪一部分、歌词是什么以及演唱时间、视频应呈现什么内容,以及每个场景都配有提示词并按节拍剪辑的镜头列表。

其底层功能通过一个托管 API 实现,包括带有强拍的节拍检测、歌曲结构分析(带重复字母标记的段落)、最佳片段检测和逐词计时的歌词;此外还提供位于 https://api.songbrain.ai/v1/mcp 的 MCP 服务,让 Claude、Cursor 或 ChatGPT 能直接读取歌曲(配置指南)。

此仓库包含官方的 Python 和 JavaScript/TypeScript SDK、示例以及 MCP 服务入口。

立即试用,无需密钥

curl https://api.songbrain.ai/v1/examples/old-truck-home/shot-plan

此请求会以与你的歌曲完全相同的格式,返回一首真实歌曲的故事和镜头方案。GET /v1/examples 会列出所有示例。

单次调用的返回内容

每首歌曲对应一份文档(架构为 songbrain.song/1)。时间以歌曲开头为起点,单位为秒。

部分内容
song_dna流派和子流派(37 种子流派)、节奏、调性和调性变化、情绪、演唱风格、乐器、能量、响度(LUFS、真峰值、各平台检查)、标语和相似曲目
timeline每个节拍、每个强拍、拍号、带重复字母标记(A、B、A)和能量的段落、人声变化、歌词钩子
best_moments按排名排列的片段,包含起始、峰值和结束时间、评分、片段效果好的原因及其背后的测量信号、片段内的节拍和演唱的歌词
lyrics带有起止时间的歌词行,以及每个单词各自的起止时间
scores病毒传播力、质量和歌词评分及其细分、效果好的方面、需要改进的方面、受众
story歌曲的含义、一个世界、一套三色调色板、视频围绕的单一元素(之前、事件、之后)、铺垫/转折/回报
shot_plan对最佳片段进行按节拍同步剪辑的方案(约 15 秒,9:16):每个场景都包含绝对起止秒数、幕、类型、镜头运动、转场、取景方式以及可直接使用的图像/视频提示词;此外还有面向整首歌曲、在节拍点切换的段落级方案

镜头方案中的一个场景:

{
  "index": 1,
  "kind": "tease",
  "act": "setup",
  "start_sec": 94.83,
  "end_sec": 96.246,
  "duration_sec": 1.416,
  "beats_in_scene": 4,
  "transition_in": "cold open, hold",
  "motion": "slow push-in on a still world",
  "prompt": "wide establishing shot of the empty space: A distant, warm yellow light source pulses faintly in the deep blue night ...",
  "sung": null
}

分析一首歌曲需要 60–90 秒(繁忙时最长约 2 分钟)。

从最佳片段开始,为视频模型编写提示词

一首歌的大部分片段都不值得制作动画。Songbrain 会优先排列效果最出色的片段窗口(best_moments,其中包含片段奏效的原因和背后的音频信号),并以排名最高的片段为基础构建 shot_plan:时长约 15 秒,按节拍剪辑,每个剪辑对应一个场景。每个场景都附有可直接用于图像或视频模型的提示词,提示词根据歌曲的故事、世界观和三色调色板撰写,让所有场景看起来像同一部电影,而不是互不相关的片段。

{"index": 8, "act": "turn", "start_sec": 102.965, "end_sec": 103.282, "motion": "impact: frame lands displaced and settles, fast energy",
 "prompt": "tight detail shot: The truck's grille, showing rust, illuminated by the faint glow of the low headlight. Faded brown and warm yellow, in ..."}

将提示词交给 Kling、Runway、Luma、Veo,或托管在 fal 或 Replicate 上的模型,并按照给定的秒数剪辑片段。示例:render-with-your-model.md、song_to_clips_fal.py、song_to_clips_replicate.py。完整歌曲计划(shot_plan.full_song)提供完整视频的剪辑点。

从 Spotify Audio Features 或 Audio Analysis 迁移?

自 2024 年 11 月 27 日起,新建的 Spotify 应用在访问 /audio-features 和 /audio-analysis 时会收到 403 错误。Songbrain 可从任何音频文件(无论是否已发行)返回同类数据,以及更多信息:

SpotifySongbrain说明
temposong_dna.tempo_bpm另含 tempo_confidence
key + modesong_dna.key"C minor";key_changes[] 记录每次调性变化发生的秒数
energysong_dna.energy范围为 0–1,另含各段落的能量
loudnesssong_dna.loudness_lufsEBU R128 综合响度和真峰值
valence、danceabilitysong_dna.mood[]以情绪词而非数字表示
instrumentalness、speechinesshas_vocals、song_dna.vocals人声风格或 "instrumental"
audio-analysis beatstimeline.beats每个节拍的秒数
audio-analysis barstimeline.downbeats每小节的第一个节拍
audio-analysis sectionstimeline.sections包含重复段落字母(A、B、A …)和相对能量
—best_moments、lyrics、story、shot_planSpotify 未提供:效果最出色的片段窗口及原因、歌词时间点、分镜列表

迁移指南,附十行示例:https://www.songbrain.ai/guides/spotify-audio-features-alternative

安装

pip install songbrain     # Python 3.9+, one dependency (requests)
npm install songbrain     # Node 18+, no runtime dependencies, ESM + CJS + types

软件包:PyPI · npm。

快速入门:Python

from songbrain import Songbrain

sb = Songbrain()                                   # reads SONGBRAIN_API_KEY
song = sb.analyze("song.mp3")                      # or analyze(audio_url="https://…")

dna = song["song_dna"]
print(dna["genre"], dna["tempo_bpm"], dna["key"])
for s in song["shot_plan"]["clip"]["scenes"]:
    print(f'{s["start_sec"]:.2f}-{s["end_sec"]:.2f} [{s["act"]}] {s["prompt"]}')

快速入门:TypeScript / JavaScript

import { Songbrain } from "songbrain";

const sb = new Songbrain();                        // reads SONGBRAIN_API_KEY
const song = await sb.analyze({ file: "song.mp3" }); // or { audioUrl: "https://…" }

const dna = song.song_dna!;
console.log(dna.genre, dna.tempo_bpm, dna.key);
for (const s of song.shot_plan?.clip?.scenes ?? []) {
  console.log(`${s.start_sec.toFixed(2)}-${s.end_sec.toFixed(2)} [${s.act}] ${s.prompt}`);
}

analyze() 会上传音频,等待歌曲处理完成,然后返回完整文档。传入 wait=False(Python)或 wait: false(JS),即可立即获取 ID,之后再使用 webhook 或 get_song / getSong 获取结果。

两种模式

每首歌都会以两种模式之一进行分析。如果只需要数据,或想先对多首歌曲排序,请使用 dna。然后再为选中的歌曲添加视频创作方向。dna 加上创作方向的费用与 full 相同。

模式返回内容价格
dna歌曲 DNA:song_dna、timeline、best_moments、lyrics、scores。不含故事和分镜计划10 个积分,约 $0.20
full(默认)歌曲 DNA + 视频创作方向:story 和与节拍同步、每个场景都带有提示词的 shot_plan25 个积分,约 $0.50
之后添加创作方向为已完成分析的 dna 歌曲生成 story + shot_plan。无需重新上传15 个积分,约 $0.30
song = sb.analyze("song.mp3", mode="dna")       # 10 credits: no story, no shot plan
if song["scores"]["virality"]["score"] >= 80:
    song = sb.add_direction(song["id"])         # +15 credits, waits about 30-40 s
    print(song["shot_plan"]["clip"]["scenes"][0]["prompt"])
let song = await sb.analyze({ file: "song.mp3", mode: "dna" }); // 10 credits: no story, no shot plan
if ((song.scores?.virality.score ?? 0) >= 80) {
  song = await sb.addDirection(song.id);                        // +15 credits, waits about 30-40 s
  console.log(song.shot_plan?.clip?.scenes[0]?.prompt);
}

每月 5 首免费歌曲适用于任一模式。添加创作方向不会占用免费歌曲额度。如果操作失败,将退还 15 个积分,歌曲仍保持 dna 状态。对 dna 歌曲调用 GET /v1/songs/{id}/shot-plan 会返回 409 no_direction。

无需使用 SDK:在 JSON 请求体中传入 "mode": "dna"(上传时使用 -F "mode=dna"),然后调用 POST /v1/songs/{id}/direction。无需密钥即可试用 dna 视图:GET https://api.songbrain.ai/v1/examples/sugar-rush?mode=dna。

SDK 方法

Python 使用 snake_case,JS 使用 camelCase 作为方法名。两者的响应字段均使用 API 自身的名称。

PythonJavaScriptAPIKey
analyze(file | audio_url=…, mode=None, test=False, idempotency_key=None, wait=True)analyze({ file | audioUrl, mode, test, idempotencyKey, wait })POST /v1/songs + 轮询yes
add_direction(id, wait=True)addDirection(id, { wait })POST /v1/songs/{id}/direction + 轮询yes
get_song(id, view, include)getSong(id, { view, include })GET /v1/songs/{id}yes
shot_plan(id)shotPlan(id)GET /v1/songs/{id}/shot-planyes
list_songs(limit, starting_after)listSongs({ limit, startingAfter })GET /v1/songsyes
iter_songs(page_size)iterSongs({ pageSize })GET /v1/songs,逐页获取yes
delete_song(id)deleteSong(id)DELETE /v1/songs/{id}yes
account()account()GET /v1/accountyes
test_webhook(url)testWebhook(url)POST /v1/webhooks/testyes
webhook_deliveries(limit)webhookDeliveries({ limit })GET /v1/webhooks/deliveriesyes
pricing()pricing()GET /v1/pricingno
examples()examples()GET /v1/examplesno
example(id, view, include, mode)example(id, { view, include, mode })GET /v1/examples/{id}no
example_shot_plan(id)exampleShotPlan(id)GET /v1/examples/{id}/shot-planno
webhooks.verify(body, header, secret)verifyWebhook(body, header, secret)Songbrain-Signature 标头–

两个 SDK 都会:

  • 将密钥作为 Authorization: Bearer sb_live_… 发送,
  • 抛出 SongbrainError(status、code、message、request_id / requestId)及其子类 AuthenticationError、InsufficientCredits、NotFound、RateLimited(带有 retry_after / retryAfter)、AnalysisFailed 和 WaitTimeout,
  • 为每首新歌曲发送 Idempotency-Key,并在遇到网络错误、429 和 5xx 时最多重试 3 次,采用退避策略并遵循 Retry-After,
  • 在 last_rate_limit / lastRateLimit 中保留最新的速率限制标头。

软件包文档:python/README.md · js/README.md

不使用 SDK

# 1. send a file (or JSON {"audio_url": "https://…"})
curl -X POST https://api.songbrain.ai/v1/songs \
  -H "Authorization: Bearer $SONGBRAIN_API_KEY" \
  -F "[email protected]" -F "title=My Song"
# → 202 {"id": "…", "status": "processing", "eta_sec": 75, "billing": {…}}

# 2. poll until status is "done"
curl https://api.songbrain.ai/v1/songs/$ID -H "Authorization: Bearer $SONGBRAIN_API_KEY"

文档端点选项:?view=summary 会省略词语时间戳和节拍数组(体积约缩小 3 倍)。?include=song_dna,shot_plan 只返回指定的部分。

错误始终采用 {"error": {"code": "…", "message": "…", "request_id": "req_…"}} 的形式,HTTP 状态码为 400、401、402、404、409、413、415 或 429。429 响应会携带 Retry-After 标头。

测试模式

发送 "test": true(或在 SDK 中使用 test=True / test: true),歌曲即可免费处理,无需音频,并会立即完成。你会获得 Sugar Rush 示例分析,其中包含你的 title 和 external_ref、"livemode": false 以及 billing.type = "test"。如果设置了 webhook_url,几秒内仍会收到带签名的 song.done。此模式适用于 CI,也方便你在花费歌曲额度之前构建集成。

song = sb.analyze(test=True, external_ref="ci-123")   # done right away, costs nothing
assert song["livemode"] is False

测试歌曲不会占用你的免费歌曲额度,但会受到速率限制,并计入每日上限。pytest 示例:cookbook/ci_test_mode.py。

使用自己的歌词

歌词会根据人声转录,唱出的词语可能会被听错。如果你有歌词(Suno 会提供),请一并发送:分析会在转录对应的时间点使用你的原文。听不清的演唱词语会被省略,不会猜测补全。

song = sb.analyze("song.mp3", lyrics=open("lyrics.txt").read())
song["lyrics"]["source"]   # "provided_lyrics"
const song = await sb.analyze({ file: "song.mp3", lyrics });

实测还是估算?

每首歌曲都带有 provenance,说明哪些字段是从音频中实测得出的(速度、调性、节拍、段落、响度、时刻窗口),哪些是转录得出的(歌词),哪些是 AI 模型判断的(流派、情绪、评分),以及哪些是生成的(故事、提示词、标语)。评分还会标注 "basis": "model_estimate"。详情请参阅:文档。

幂等性

POST /v1/songs 接受 Idempotency-Key 标头(1–255 个可打印字符)。在 24 小时内,同一账户使用相同的键会再次返回首次响应(歌曲 ID 相同,不会重复扣费),并附带 Idempotent-Replayed: true。相同的键用于不同请求时会返回 409 idempotency_key_reused;如果该键的首次请求仍在运行,则会返回 409 idempotency_in_progress(请在 1 秒后重试)。首次请求失败时不会保存,因此可以重试该键。

两个 SDK 都会为每次 analyze() 发送一个随机键,并在自身重试时复用该键,因此上传超时不会创建两首歌曲。传入自己的键(idempotency_key= / idempotencyKey),例如你的作业 ID,也可以确保跨进程重试安全。

分页

GET /v1/songs?limit=20&starting_after=<song id> 按时间倒序返回最新歌曲,并提供 has_more 和 next_cursor。将 next_cursor 作为 starting_after 传入以获取下一页,也可以让 SDK 自动处理:

for item in sb.iter_songs():           # Python
    print(item["id"], item["status"], item["livemode"])
for await (const item of sb.iterSongs()) console.log(item.id, item.status); // JS

请求 ID 和速率限制

每个响应都带有 Songbrain-Request-Id: req_… 标头,每个错误响应正文也会重复包含此 ID,字段为 error.request_id。SDK 会将其添加到错误对象(request_id / requestId)和错误消息中。联系支持人员时请提供此 ID。

使用密钥发出的请求会返回 X-RateLimit-Limit(每分钟请求数,目前为 120)、X-RateLimit-Remaining 和 X-RateLimit-Reset(距离窗口再次可用的秒数)。SDK 会将最后一次的值保存在 sb.last_rate_limit / sb.lastRateLimit 中。

User-Agent 和编码 Agent

SDK 会将 songbrain-python/<version> 或 songbrain-js/<version> 作为 User-Agent 发送。从 0.3.3 版本起,在编码 Agent 的 shell 中(Claude Code、Cursor、Gemini CLI、Codex、opencode、Augment),SDK 会附加 Agent 名称,例如 songbrain-js/0.4.0 (agent: claude-code)。名称来自这些工具自行设置的环境变量(AI_AGENT、CLAUDECODE、CURSOR_AGENT …);不会发送环境中的其他信息。浏览器不会发送此信息。设置 SONGBRAIN_NO_AGENT_HINT=1 可关闭此功能。

Webhook

创建歌曲时传入 webhook_url。当歌曲完成或失败时,Songbrain 会发送 song.done 或 song.failed 事件;余额不足时会发送 account.low_balance:

{"id": "evt_…", "type": "song.done", "created": 1791200000, "livemode": true, "data": {"id": "…", "status": "done", "mode": "full", "external_ref": "…"}}

每个 song.* 事件都包含 data.mode。只有 full 歌曲才会包含 data.shot_plan_url。为 dna 歌曲添加方向后,会收到第二个 song.done 事件,该事件有自己的事件 ID,且 data.direction_added: true。

  • 签名。 每个 webhook 都带有 Songbrain-Signature: t=<unix>,v1=<hex> 标头。v1 是使用密钥的 webhook secret,对 "<t>.<raw body>" 计算的 HMAC-SHA256。两个 SDK 都会为你验证签名(webhooks.verify / verifyWebhook)。
  • 按事件 ID 去重。 事件重试时,id(也会包含在 Songbrain-Event-Id 标头中)保持不变。请保存已处理的 ID,并对重复事件返回 2xx。
  • 重试。 任何非 2xx 响应都会触发重试,最多尝试 10 次,历时约 3 天:首次尝试后立即重试,之后分别在 1 分钟、5 分钟、30 分钟、2 小时、6 小时、12 小时、24 小时、48 小时和 72 小时后重试。不跟随重定向。
  • 测试 ping。 POST /v1/webhooks/test {"url": "…"}(test_webhook / testWebhook)会立即发送带签名的 ping,并告知你是否已送达。GET /v1/webhooks/deliveries(webhook_deliveries / webhookDeliveries)会列出最近的尝试及其状态码。

接收端示例:cookbook/webhook_receiver_fastapi.py(FastAPI,含去重功能)和 examples/python/webhook_server.py(Flask)。

MCP

Songbrain 在 https://api.songbrain.ai/v1/mcp(可流式传输的 HTTP)运行远程 MCP 服务。它适用于 Claude Code、Claude Desktop、Cursor 和其他 MCP 客户端。无需密钥即可使用示例工具。使用密钥后,你可以通过 URL 分析歌曲(analyze_song,可选 mode),并为 dna 歌曲添加视频导演说明(add_video_direction)。

claude mcp add --transport http songbrain https://api.songbrain.ai/v1/mcp \
  --header "Authorization: Bearer sb_live_…"

各客户端的设置说明:examples/mcp.md。注册表名称:io.github.songbrain-ai/songbrain(server.json)。

示例

文件功能
examples/python/shot_plan_to_prompts.py分析文件或 URL,并将每个场景打印为 01:34.8–01:36.2 [setup] prompt…
examples/node/shot-plan-to-prompts.mjs用 Node 实现相同功能
examples/python/webhook_server.py用于验证签名的 Flask 接收器
examples/render-with-your-model.md将场景提示词输入 Kling、Runway、Luma、Veo 或 fal,并按给定秒数剪辑
examples/mcp.mdClaude Code、Claude Desktop 和 Cursor 的 MCP 设置

运行任一脚本时添加 --example old-truck-home,即可在无需密钥的情况下试用。

食谱

可运行的食谱位于 cookbook/。它们都支持 --example sugar-rush(无需密钥);视频相关食谱还支持 --dry-run,可打印每次调用和 ffmpeg 命令。

食谱功能
song_to_clips_fal.py为分镜计划中的每个场景生成一个 fal.ai 视频片段,按节拍拼接,并在下方铺上歌曲
song_to_clips_replicate.py用 Replicate 实现相同功能
beat_synced_slideshow.py使用 ffmpeg,按场景、节拍、乐小节或段落剪辑文件夹中的图像。无需 AI 密钥
webhook_receiver_fastapi.py签名检查、按事件 ID 去重、处理 ping / song.done / song.failed
ci_test_mode.py使用测试模式进行 CI 的 pytest 测试

Postman

将 postman/Songbrain.postman_collection.json 导入 Postman、Insomnia 或 Bruno。设置 apiKey,然后运行 Songs → Create song (test mode)。其中包含所有端点、游标分页,以及用于创建请求的 Idempotency-Key。

定价

  • 每个账户每月可免费处理 5 首歌曲,任一模式均可。
  • 之后使用积分:每首 full 歌曲需 25 积分(约 $0.50),每首 dna 歌曲需 10 积分(约 $0.20),之后为 dna 歌曲添加导演说明需 15 积分(约 $0.30)。积分按套餐购买(500 积分 = $10,150 积分 = $4.99)。
  • 无订阅费用。full 歌曲包含全部内容:分析、故事和分镜计划。请参阅两种模式。
  • 限制:文件最大 100 MB,时长为 30 s 至 10 min;最多并行处理 3 首歌曲;每 24 h 最多处理 200 首歌曲;每个密钥每分钟最多 120 个请求。
  • 每月处理超过 1,000 首歌曲、需要发票、DPA 或 SLA:[email protected]。

实时价格:GET https://api.songbrain.ai/v1/pricing。

商业用途

条款 §17简述如下:

  • 你可以在付费 SaaS 中使用 API,包括为客户生成图像或视频的产品。
  • 你可以将结果提供给用户,无论是否修改。
  • 可以使用白标方案。无需注明 Songbrain。
  • 你歌曲的结果归你所有。删除歌曲或关闭账户后,你仍可保留这些结果。
  • 你可以使用结果训练自己的模型,但不得训练旨在为他人复现 Songbrain API 的模型。
  • 转售原始 API 访问权限或批量数据集需要获得书面同意。

音频仅用于分析,绝不用于训练。上传内容会在 24 小时内删除。

仓库结构

python/      PyPI package "songbrain"
js/          npm package "songbrain"
examples/    scripts and guides
cookbook/    runnable recipes (AI clips, slideshow, webhooks, CI)
postman/     Postman collection
server.json  MCP Registry entry
.github/     CI and publish workflows (tags py-v*, js-v*, mcp-v*)

链接

许可证

MIT © 2026 Songbrain。请参阅 LICENSE。此许可证适用于 SDK 代码;API 的使用受条款约束。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。