初始发布: 21 个 skills (Claude Code / Codex / DSH)
This commit is contained in:
@@ -0,0 +1,146 @@
|
||||
---
|
||||
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 BPM,6/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)
|
||||
Reference in New Issue
Block a user