Files
Popiai-skill/video-creation/mv-creator/phases/01-lyrics.md
T

96 lines
4.4 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.
# 歌词拆解
## 目标
将歌曲音频转为带时间戳的歌词段落,标注纯音乐段(前奏/间奏/尾奏)。
## 输入
| 输入 | 必需 | 说明 |
|------|------|------|
| 音频文件 | 是 | 歌曲音频文件路径 |
| LRC 文件 | 否 | 如提供则直接解析,跳过 ASR |
## 处理流程
如果用户未提供音频文件,直接在对话中向用户提问,要求提供音频文件路径。音频文件是整个 MV 创作流程的前提,必须先获取。
音频文件确认后,扫描 `.mv/*/lyric.md` 中的 `音频:`/`Audio:` 字段,检查是否已有该音频路径对应的歌词拆解:
- **已存在** → 读取已有的 `lyric.md` 内容,展示给用户,通过 `AskUserQuestion` 询问用户:
- 直接使用已有歌词拆解,进入下一阶段
- 重新拆解(覆盖已有文件)
- **不存在** → 继续正常拆解流程
正常拆解流程:如果用户未提供 LRC 文件,通过 `AskUserQuestion` 询问用户是否有 LRC 文件可以提供(选项:有/没有)。
- 用户提供了 → 走路线 A
- 用户没有 → 走路线 B(ASR 兜底)
### 路线 A:用户提供 LRC 文件
直接解析 LRC 文件,提取时间戳和歌词文本。
### 路线 BASR + LLM(兜底方案)
1. **获取音频时长**:通过 ffprobe 获取音频总时长
```bash
ffprobe -v error -show_entries format=duration -of csv=p=0 <audio_path>
```
2. **音频预处理**:检查文件大小,如果超过 5MB 则先压缩再调用 ASR(`hilo_tools_audio_transcribe_lyrics` 限制 10MB
```bash
# 检查文件大小(字节)
stat -f%z <audio_path> # macOS
stat -c%s <audio_path> # Linux
wc -c < <audio_path> # 跨平台
(Get-Item <audio_path>).Length # Windows PowerShell
# 如果 > 52428805MB),压缩为 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` 后,**必须**运行校验脚本:
```bash
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
```