Install
openclaw skills install ai-songwriter-renxuAI歌曲创作核心技能 — 合辙押韵歌词创作 + MiniMax mmx-cli 正确调用 + 歌词验证 + 歌曲生成全流程。包含押韵规范、mmx模型路由、音乐生成参数、文件发送。当用户要求写歌/创作歌曲/生成音乐时激活。
openclaw skills install ai-songwriter-renxuai-songwriter(核心)
├── poetry/ 古诗词谱曲子技能(保留原文 + 递进押韵)
└── thematic/ 主题歌曲子技能(客户/景点调研 → 写入歌词)
所有写歌请求必须严格按以下顺序执行:
poetry/thematic/mmx music generate⚠️ 未经用户确认歌词,不得直接生成音频。这是硬规则。
选定一个韵母后,每一句最后一个字都必须发该韵。
| 韵母 | 常见安全字 |
|---|---|
| -ang | 光/望/扬/荡/长/忙/香/霜/央/黄/苍/场/昌 |
| -in | 心/亲/情/金/新/林/琴/音 |
| -ai | 爱/来/白/海/开/才 |
| -ou | 楼/舟/流/秋/游/留/悠/收/投/酬 |
| -an | 山/寒/难/残/叹/关/湾/前 |
第三句不押韵(白脚),一、二、四句押韵。适用于古诗词改编。
def validate_rhyme(lyrics_text, rhyme_set, poem_lines=None):
"""验证押韵
Args:
lyrics_text: 歌词字符串(多行)
rhyme_set: 押韵字集合
poem_lines: 原诗锚点集合,默认None表示无锚点
"""
if poem_lines is None:
poem_lines = set()
lines = [l.strip() for l in lyrics_text.strip().split('\n') if l.strip()]
errors = []
for i, line in enumerate(lines):
pos_in_stanza = (i % 4) + 1
is_white = (pos_in_stanza == 3)
last_char = line[-1]
if line in poem_lines:
continue
if is_white:
ok = last_char not in rhyme_set
note = f"✓ 白脚" if ok else f"✗ 白脚'{last_char}'押韵了"
else:
ok = last_char in rhyme_set
note = f"✓" if ok else f"✗ '{last_char}'不押韵"
if not ok:
errors.append((i+1, line, last_char, note))
print(f"{'✓' if ok else '✗'} 第{i+1:2d}句 {line} → {last_char} {note}")
return errors
| 目标韵 | 容易混入的错误字 |
|---|---|
| -ang | 月/前/向/星/心/梦/声/里/思 |
| -ou | 心/情/声/美/歌/路 |
| 任务 | 模型 | 命令 |
|---|---|---|
| 歌词生成 | lyrics_generation | mmx text chat --model lyrics_generation |
| 歌曲生成 | music-2.6 | mmx music generate --model music-2.6 |
| 语音合成 | speech-2.8-hd | mmx speech synthesize --model speech-2.8-hd |
| 图片生成 | image-01 | mmx image generate --model image-01 |
| 视频生成 | hailuo-2.3 | mmx video generate --model hailuo-2.3 |
⚠️ 必须指定
--model:music-2.6 而非 music-2.5。
mmx text chat \
--message "为主题'xxx'创作歌曲歌词。全程押韵(韵脚自选,如-ang/-in/-ai/-ou/-an等),每段4句。" \
--model lyrics_generation \
--non-interactive \
--quiet
⚠️
lyrics_generation是独立文本模型,不是mmx music子命令! ⚠️ 如果lyrics_generation返回空内容,换用mmx text chat --model MiniMax-M2.7作为备用。
mmx music generate \
--prompt "音乐风格描述" \
--lyrics "歌词文本" \
--vocals "人声描述" \
--model music-2.6 \
--out song.mp3 \
--non-interactive \
--quiet
歌词结构标签(可选):
mmx music generate 支持以下结构标签:[Intro] [Verse] [Pre Chorus] [Chorus] [Interlude] [Bridge] [Outro] [Post Chorus] [Transition] [Break] [Hook] [Build Up] [Inst] [Solo]。标签必须干净(括号内不要加描述),标签会被演唱出来。
长歌词(48句+)用异步模式:
mmx music generate \
--prompt "..." --lyrics "..." --vocals "..." \
--model music-2.6 \
--out song.mp3 \
--async --non-interactive --quiet
⚠️
--async不带--output json,否则报错。
也可以用 --lyrics-file 代替 --lyrics,读取本地歌词文件:
mmx music generate \
--prompt "..." --lyrics-file /path/to/lyrics.txt --vocals "..." \
--model music-2.6 \
--out song.mp3 \
--async --non-interactive --quiet
古诗词风格(慢板悠扬):
古诗词风格,慢板,悠扬沉郁,古琴独奏为主,箫声点缀,
节奏舒缓如行云流水,歌声要有气势有情感,字正腔圆,中速偏慢
温暖企业歌曲风格:
温暖积极的企业歌曲,节奏明快,充满希望和凝聚力,
现代企业宣传片风格,副歌更有推动感,适合合唱
景点歌曲风格:
古风景点歌曲,笛子为主,箫声点缀,
悠扬悠远,仿佛山水画卷展开
| 期望声线 | --vocals 示例 |
|---|---|
| 童声 | "sweet innocent child vocal" |
| 女声 | "bright female soprano" |
| 男声 | "warm male baritone, father singing" |
| 合唱 | "choir, uplifting chorus" |
| 最短 | 最长 | 目标 |
|---|---|---|
| 3分钟 | 5分钟 | 3:00 ~ 5:00 |
预估时长 ≈ 歌词总句数 × 3.2秒/句
24句 → 约77秒(明显不够)
48句 → 约2分34秒(仍偏短)
56句 → 约2分59秒(下限边缘)
60~92句 → 推荐交付区间
硬规则: 如果首版歌词不足 3 分钟,必须扩写或重复主结构后再交付确认稿。 补足优先级: 重复副歌 → 增加主歌 → 增加 Bridge → 整首 repeat。
在执行 mmx music generate 前,必须先把歌词文本发给用户确认。
流程固定为:
未确认歌词前,不得直接生成歌曲。
必须:纯文本歌词,一行一句,禁止包含结构标签(如[Verse]、[Chorus])和说明文字。
⚠️ 以上是用户确认稿格式。确认后传给
mmx music generate时,歌词仍然保持纯文本(无结构标签),--prompt中已包含风格描述,模型会根据上下文自行安排结构。
当通道为 wecom 时,使用 message 工具直发本地附件:
推荐参数:
action: "send"channel: "wecom"target: "wecom:<userid>"media + filePath: 本地绝对路径filename: 显式文件名(如 song.mp3)mimeType: 如 audio/mpegforceDocument: true发送前检查:
⚠️ 不要只输出
MEDIA:路径。 如果MEDIA:在该会话不稳定,直接用message工具。
# 第一步:获取 token
TOKEN=$(curl -s -X POST "https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal" \
-H "Content-Type: application/json" \
-d "{\"app_id\":\"$FEISHU_APP_ID\",\"app_secret\":\"$FEISHU_APP_SECRET\"}" \
| python3 -c "import sys,json; print(json.load(sys.stdin)['tenant_access_token'])")
# 第二步:上传文件
UPLOAD_RESP=$(curl -s -X POST "https://open.feishu.cn/open-apis/im/v1/files" \
-H "Authorization: Bearer $TOKEN" \
-F "file_name=song.mp3" -F "file_type=stream" \
-F "file=@/path/to/song.mp3;type=audio/mpeg")
FILE_KEY=$(echo $UPLOAD_RESP | python3 -c "import sys,json; print(json.load(sys.stdin)['data']['file_key'])")
# 第三步:发送
curl -s -X POST "https://open.feishu.cn/open-apis/im/v1/messages?receive_id_type=chat_id" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d "{\"receive_id\":\"$CHAT_ID\",\"msg_type\":\"file\",\"content\":\"{\\\"file_key\\\":\\\"$FILE_KEY\\\"}\"}"
默认使用 MEDIA:<绝对路径> 在回复中交付。
lyrics_generation 可能返回空内容(exit 0 但 content 为空)MiniMax-M2.7 作为备用--async 模式 + 轮询检查文件是否生成□ 每句尾字是否都是目标韵母?
□ 是否有字重复出现?(特别是句尾)
□ 每段是否都是4句?
□ 预计时长是否在3:00-5:00之间?
□ 是否已先把歌词草案发给用户确认?
□ 若长度不足,是否已通过扩写/重复主结构补足?
□ 是否指定了 --model music-2.6?
□ --vocals 是否描述了期望的声线?
□ 生成后是否验证了押韵?
□ 歌词是否纯文本交付(无结构标签)?
□ 生成后是否通过正确方式发送文件给用户?