Files
skills/minimax-music/SKILL.md
T

147 lines
7.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
name: minimax-music
description: 调用 MiniMax music-3.0 生成音乐(带唱歌曲/纯音乐/自动作词/翻唱),并可裁成定长无缝循环 BGM。触发关键词:「生成音乐」「做首歌」「写首歌」「AI 作曲」「生成 BGM」「背景音乐」「配乐」「纯音乐」「器乐」「MiniMax 音乐」「music-3.0」「翻唱」「循环 BGM」「游戏配乐」「短片配乐」。适用场景:游戏/短片/播客的背景音乐、Demo 小样、根据歌词谱曲、按参考音频翻唱。
version: 1.0.0
author: william
---
# MiniMax 音乐生成 Skill
调用 MiniMax **music-3.0** 生成音乐并下载到本地;需要定长循环 BGM 时再用 `loopify.py` 做后期。
## 触发判断
用户说"生成一段音乐/BGM/配乐"、"做首歌"、"写首纯音乐"、"给这个视频配个乐"、"游戏循环 BGM"等 → 按下方流程执行。
## 两个脚本
| 脚本 | 作用 | 依赖 |
|------|------|------|
| `generate.py` | 调 API 生成音乐 | Python 3 标准库 |
| `loopify.py` | 裁成定长无缝循环 + 客观验收 | ffmpeg + numpy |
## API Key
优先读环境变量 `MINIMAX_API_KEY`,否则读 `~/.claude/skills/minimax-music/key.txt`(权限 600)。切换用 `export MINIMAX_API_KEY=<新key>`
⚠️ **区域必须匹配**:国内 key 配 `api.minimaxi.com`(脚本内置),海外 key 要改成 `api.minimax.io`,否则报鉴权失败。
## 计费
| 模型 | 价格 | RPM |
|------|------|-----|
| `music-3.0` / `music-2.6` / `music-cover` | **¥1.0 / 首** | 120 |
| `music-3.0-free` / `music-2.6-free` / `music-cover-free` | **免费** | 3 |
**按"首"计费,不按秒。** 试风格、调 prompt 一律先用 `--free`(免费且不限次数,只限速率),定稿再跑付费模型。
## 四种模式
```bash
S=~/.claude/skills/minimax-music
# 1. 带唱:lyrics 必填,prompt 可选
python3 $S/generate.py "独立民谣,忧郁内省,木吉他分解和弦+弦乐铺底" -l @lyrics.txt -o song.mp3
# 2. 纯音乐:反过来,prompt 必填,lyrics 可省
python3 $S/generate.py "中世纪奇幻大地图探索,鲁特琴+竖琴+木笛,中慢速,无鼓" --instrumental -o bgm.mp3
# 3. 自动作词:不用自己写词
python3 $S/generate.py "抒情流行,夏夜告别,遗憾但释然" --auto-lyrics -o auto.mp3
# 4. 翻唱:参考音频 6s-6min、<=50MB
python3 $S/generate.py "" --cover ref.mp3 -l "[Verse]\n新歌词..." -o cover.mp3
# 免费试跑(任何模式加 --free)
python3 $S/generate.py "..." --instrumental --free -o test.mp3
```
### 常用参数
| 参数 | 说明 | 默认 |
|------|------|------|
| `prompt`(位置) | 曲风/情绪/场景,≤2000 字 | 纯音乐时必填 |
| `-l, --lyrics` | 歌词 ≤3500 字,`\n` 分行,支持 `@文件` | 带唱时必填 |
| `--instrumental` | 纯音乐 | 否 |
| `--auto-lyrics` | 模型自动作词 | 否 |
| `--cover` | 翻唱参考音频(路径或 URL)| — |
| `-m, --model` | 模型 | `music-3.0` |
| `--free` | 换成对应免费模型 | 否 |
| `-o, --output` | 输出路径 | 时间戳命名 |
| `--sample-rate` / `--bitrate` / `--format` | 16000/24000/32000/**44100**、32000/64000/128000/**256000**、**mp3**/wav/pcm | 见粗体 |
| `--hex` | 用 hex 返回而非 url | 否 |
## 歌词格式
`[Intro]` `[Verse]` `[Chorus]` `[Bridge]` `[Outro]` 分段,段间空行:
```
[Verse]
雨把街灯揉成一片橙黄
玻璃门后面有人在张望
[Chorus]
你转身的那一秒
雨就轻了一点点
```
## 定长无缝循环 BGM
**接口没有 duration 参数**,时长完全不可控(实测:带唱 61s、纯音乐 97-126s,纯音乐普遍更长因为没有歌词框住它)。游戏/短片要定长循环,必须后期处理:
```bash
python3 $S/loopify.py raw.mp3 -o bgm_loop.mp3 -L 45 --preview 3
```
它做四件事:
1. **测实际速度,把循环长度对齐到整数小节**。只对齐电平不对齐节奏的话,循环起来会丢拍——这是最容易翻车的地方。`-L 45 --tol 1.0` 表示在 44-46s 里找整小节长度。
2. **扫描起点**,比较首尾 2 秒的 RMS + 频谱质心 + 低频占比,选最接近的窗口,并避开渐入、渐出、能量凹陷。
3. **qsin 等功率曲线做尾→头交叉淡化**(默认 2.0s),并自动把峰值压到 `--peak`(默认 -1.0 dBFS)留余量。
4. **客观验收**:峰值削波、异常静音、接缝逐样本跳变 vs 曲内 99.9 分位跳变、接缝前后 RMS 差、立体声宽度。
`--preview 3` 会额外导出连播三遍的文件——**循环 BGM 一定要循环着听至少 3 分钟**,单听一遍听不出接缝和"听腻"的问题。
## 写 prompt 的要点
**先想清楚这段音乐会不会被循环播放,两种写法是相反的:**
| | 一次性配乐(短片/过场)| 循环 BGM(游戏/等待画面)|
|---|---|---|
| 情绪 | 写**情绪曲线**:"开头克制,中段弦乐推起,结尾回落渐弱" | 写**稳定**:"全曲同调性、同速度、同织体密度,平稳流动" |
| 结构 | 可以有前奏尾奏 | **明确不要前奏尾奏、不要渐强、不要淡出结尾** |
| 旋律 | 可以抓耳 | **克制、留白多、听十分钟不腻** |
其余通用要点:
- **写死速度和拍号**"中慢速约 80 BPM6/8 摇曳律动,自然小调"
- **逐件点名配器**:"鲁特琴分解和弦作骨架,竖琴琶音点缀,木笛吹主旋律,柔和弦乐铺底"
- **一定要写否定项**。不写它很容易自己加鼓、加合成器、加人声,配画面就吵了:
"严格不要:人声、歌词、吟唱、现代流行元素、电子合成器、重鼓组、密集打击乐"
- 中英混写没问题;有必须命中的风格关键词就直接用英文写进去(`medieval fantasy, orchestral, instrumental, loopable, game soundtrack`
## 工作流
1. 明确用途(配画面?循环 BGM?独立歌曲?)和时长要求
2. 按上表写 prompt**先用 `--free` 试 1-2 版**确认方向
3. 方向对了跑付费 `music-3.0` 定稿(¥1
4. 要定长循环就接 `loopify.py`,看验收输出是否全项通过
5. 把成品路径告诉用户;循环 BGM 一并给 `--preview` 的试听文件
## 坑
1. **HTTP 200 不代表成功**。一律看 `base_resp.status_code``0` 成功、`1002` 限流、`1004` 鉴权失败、`1008` 余额不足、`1026` 敏感内容、`2013` 参数错。脚本已处理并翻译成人话。
2. **`output_format` 接口默认是 `hex`**(一大串十六进制塞在 JSON 里)。脚本默认改成了 `url` 并自动下载,两种都兼容。**url 链接 24 小时过期**,别只存链接。
3. **`extra_info` 里没有计费字段**(不像视频接口有 `usage`),没法从响应对账,只能自己按"首"数。
4. **必填是条件性的**:纯音乐要 prompt、带唱要 lyrics,反了会 2013。脚本在发请求前就本地拦截,不会白花钱。
5. **翻唱三个参数互斥**`audio_url` / `audio_base64` / `cover_feature_id` 只能给一个;`cover_feature_id` 24 小时过期。
6. **两份官方文档的歌词长度打架**API 参考写 1-3500 字,指南写 10-1000 字。后者只适用于带 `cover_feature_id` 的翻唱。
7. **free 模型限 RPM 3**,串行调用够用,别并发。
8. **输出电平不稳定**:实测同样参数,有的曲子峰值 -2.3 dBFS,有的直接 0.0 dBFS 顶格。顶格素材做交叉淡化时两路叠加必然削波,`loopify.py` 已自动衰减留余量;如果你自己用 ffmpeg 拼接,记得先量峰值。
## 参考
- [音乐生成 API](https://platform.minimaxi.com/docs/api-reference/music-generation)
- [音乐生成指南](https://platform.minimaxi.com/docs/guides/music-generation)
- [按量付费定价](https://platform.minimaxi.com/docs/guides/pricing-paygo)