Popiai-skill仓库
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

4.4 KiB

歌词拆解

目标

将歌曲音频转为带时间戳的歌词段落,标注纯音乐段(前奏/间奏/尾奏)。

输入

输入 必需 说明
音频文件 歌曲音频文件路径
LRC 文件 如提供则直接解析,跳过 ASR

处理流程

如果用户未提供音频文件,直接在对话中向用户提问,要求提供音频文件路径。音频文件是整个 MV 创作流程的前提,必须先获取。

音频文件确认后,扫描 .mv/*/lyric.md 中的 音频:/Audio: 字段,检查是否已有该音频路径对应的歌词拆解:

  • 已存在 → 读取已有的 lyric.md 内容,展示给用户,通过 AskUserQuestion 询问用户:
    • 直接使用已有歌词拆解,进入下一阶段
    • 重新拆解(覆盖已有文件)
  • 不存在 → 继续正常拆解流程

正常拆解流程:如果用户未提供 LRC 文件,通过 AskUserQuestion 询问用户是否有 LRC 文件可以提供(选项:有/没有)。

  • 用户提供了 → 走路线 A
  • 用户没有 → 走路线 B(ASR 兜底)

路线 A:用户提供 LRC 文件

直接解析 LRC 文件,提取时间戳和歌词文本。

路线 B:ASR + LLM(兜底方案)

  1. 获取音频时长:通过 ffprobe 获取音频总时长
    ffprobe -v error -show_entries format=duration -of csv=p=0 <audio_path>
    
  2. 音频预处理:检查文件大小,如果超过 5MB 则先压缩再调用 ASR(hilo_tools_audio_transcribe_lyrics 限制 10MB)
    # 检查文件大小(字节)
    stat -f%z <audio_path>          # macOS
    stat -c%s <audio_path>          # Linux
    wc -c < <audio_path>            # 跨平台
    (Get-Item <audio_path>).Length   # Windows PowerShell
    # 如果 > 5242880(5MB),压缩为 64kbps 单声道
    ffmpeg -y -i <audio_path> -b:a 64k -ar 16000 -ac 1 <compressed_path>
    

    压缩后使用 <compressed_path> 调用 ASR,原始音频保留用于后续阶段。

  3. ASR 识别:调用 MCP 工具 hilo_tools_audio_transcribe_lyrics,获取词级时间戳
    • 中文自动使用 Tencent Cloud ASR,其他语言使用 Whisper ASR
    • 返回的 JSON 包含 segments(时间戳 + 歌词 + 词级信息)
  4. 纯音乐段检测:工具自动识别并标注无歌词段落
    • 开头无歌词 > 0.5s → [prelude]
    • 歌词间间隙 > 5s → [interlude]
    • 结尾无歌词 > 0.5s → [outro]
  5. 歌词矫正:调用 MCP 工具 hilo_tools_read_media 传入音频文件,获取对音频内容的听写结果,然后 LLM 结合 ASR 结果和听写结果进行歌词矫正(纠正错别字、断句、标点等)

输出格式

每个段落包含时间码和歌词文本,纯音乐段用方括号标记。文件头部必须包含音频文件路径(相对项目根目录),用于后续阶段引用和歌词拆解去重判断。

完整示例见 references/lyric-example.md(非中文用户参考 references/lyric-example-en.md)。

注:每个时间段的歌词按实际演唱的句子逐行拆分,一句一行。

格式校验

歌词写入 lyric.md 后,必须运行校验脚本:

python3 .opencode/skills/mv-creator/scripts/validate_lyric.py .mv/{song_name}/lyric.md

校验规则:时间码格式、时间段连续性、单段建议不超过 20 秒(WARN)、纯音乐段无歌词、歌词段非空。

  • 通过 → 调用 MCP 工具 preview_and_collect_feedback 启动预览:

    • script: .opencode/skills/mv-creator/scripts/render_preview.py
    • args: [".mv/{song_name}/lyric.md", "--type", "lyric", "--lang", "{lang}"]
    • feedback_path: .mv/{song_name}/feedback.md

    工具会启动预览服务器、打开浏览器,等待用户提交反馈后直接返回反馈内容:

    • 内容为 LGTM → 用户确认无修改,进入下一阶段
    • 其他内容 → 用户的编辑建议,按建议修改后重新校验和预览
  • 未通过 → 通过 AskUserQuestion 询问用户处理方式:

    • 用户手动修改:暂停流程,等待用户修改 lyric.md 后重新校验
    • 重新 ASR:重新执行 ASR 识别和 LLM 矫正,覆盖当前文件
    • 模型自动修复:由 LLM 根据校验错误信息自动修正 lyric.md,修复后重新校验
    • 中止流程:终止 MV 创作流程

文件存储

./.mv/{song_name}/lyric.md