lyrics-video-sync
$
npx mdskill add aAAaqwq/AGI-Super-Team/lyrics-video-syncAlign lyrics to video clips with precise timing and emotion mapping.
- Solves audio-video desynchronization in music video creation.
- Integrates Whisper for automatic lyric extraction from audio files.
- Decides matching by analyzing text emotion and audio energy levels.
- Delivers synchronized clips with burned-in subtitles and mixed audio.
SKILL.md
.github/skills/lyrics-video-syncView on GitHub ↗
---
name: lyrics-video-sync
description: "歌词-视频精准匹配引擎。将MP3中的歌词片段按时间轴精准匹配到对应视频clip,支持歌词提取、时间轴对齐、情绪映射、字幕烧录、音频分段混合。触发词:歌词匹配、lyrics sync、歌词卡点、音频对齐、字幕视频、lyrics video、歌词视频、音乐视频字幕"
---
# Lyrics-Video Sync — 歌词精准匹配引擎
## 解决的问题
AI MV 制作中,音频和视频经常脱节:
- ❌ 画面和歌词内容不匹配
- ❌ 关键歌词没有对应的视觉呈现
- ❌ 音频高潮段和视频高潮段错位
- ❌ 歌词没有字幕展示
## 工作流
```
音频文件(MP3) → 歌词提取/对齐 → 场景时间轴匹配 → 音频分段 → 视频混合 → 字幕烧录
```
## Step 1: 歌词提取与时间轴对齐
### 方案A: 已有歌词文件
支持格式:
- **LRC**: `[00:15.00]樱花飘落的季节`
- **SRT**: 字幕格式,带精确时间码
- **JSON**: `{lines: [{text, start_s, end_s}]}`
### 方案B: 从音频自动识别歌词
```bash
# 使用 Whisper 识别歌词(带时间戳)
python3 scripts/extract_lyrics_whisper.py \
--audio input.mp3 \
--output lyrics.json \
--language ja \
--model large
```
### 方案C: 手动标注歌词
```bash
python3 scripts/manual_lyrics_editor.py \
--audio input.mp3 \
--output lyrics.json
```
输出统一格式 (`lyrics.json`):
```json
{
"bpm": 90,
"duration": 236.8,
"lines": [
{
"index": 0,
"text": "桜が散る季節に",
"text_cn": "樱花飘落的季节",
"start_s": 24.0,
"end_s": 28.5,
"section": "verse1",
"emotion": "gentle",
"energy": 0.4
}
],
"sections": [
{
"type": "intro",
"start_s": 0,
"end_s": 24,
"energy": 0.3,
"emotion": "peaceful"
},
{
"type": "chorus",
"start_s": 94.7,
"end_s": 122.3,
"energy": 0.8,
"emotion": "passionate"
}
]
}
```
## Step 2: 歌词→场景映射
### 映射规则
| 歌词特征 | 推荐画面 |
|---------|---------|
| 自然意象(花/雨/风/月) | 对应自然景观 |
| 情感词(想/哭/笑) | 角色表情特写 |
| 动作词(走/跑/飞) | 对应角色动作 |
| 抽象词(梦/希望/自由) | 抽象/梦幻画面 |
| 重复/叠句 | 重复构图但不同角度 |
### 自动映射
```bash
python3 scripts/map_lyrics_to_scenes.py \
--lyrics lyrics.json \
--scenes scenes.json \
--output edit_plan.json \
--strategy emotion_energy
```
映射策略:
- **emotion_energy** (默认): 歌词情绪+能量→场景情绪对齐
- **keyword**: 歌词关键词→场景标签匹配
- **sequential**: 按时间顺序直接对应
## Step 3: 音频精准分段
每个视频 clip 对应一段音频,精确裁剪:
```bash
python3 scripts/segment_audio.py \
--audio input.mp3 \
--edit-plan edit_plan.json \
--output-dir segments/ \
--fade-in 0.3 \
--fade-out 0.5
```
### 分段规则
- 每段音频 = 对应 clip 的精确时间范围
- 段首段尾各加 0.3s fade(避免爆音)
- 相邻段之间保留 0.1s 重叠(交叉淡化用)
- 总时长必须等于原始音频时长(不增不减)
## Step 4: 视频+音频混合
### FFmpeg 混合命令模板
```bash
# 单个 clip + 对应音频段
ffmpeg -y -hide_banner \
-i clip.mp4 \
-i segment_01.m4a \
-c:v libx264 -crf 18 \
-c:a aac -b:a 192k \
-shortest \
clip_with_audio.mp4
# 多 clip 合并 + 全曲音频
ffmpeg -y -hide_banner \
-f concat -safe 0 -i clips.txt \
-i full_audio.mp3 \
-c:v libx264 -crf 18 \
-c:a aac -b:a 192k \
-shortest \
final_mv.mp4
```
### 音量平衡
```bash
# 对话/人声场景降低音乐音量
ffmpeg -i video.mp4 -i audio.mp3 \
-filter_complex "[1:a]volume=0.3[a]" \
-map 0:v -map "[a]" output.mp4
```
## Step 5: 歌词字幕烧录
### 生成 SRT 字幕
```bash
python3 scripts/lyrics_to_srt.py \
--lyrics lyrics.json \
--output subtitles.srt \
--style dual \
--font "Noto Sans CJK JP"
```
字幕样式选项:
- **single**: 原文(日语/英语)
- **dual**: 原文+中文双语
- **karaoke**: 逐字高亮(KTV效果)
- **minimal**: 底部一行小字
### 烧录到视频
```bash
ffmpeg -y -hide_banner \
-i final_mv.mp4 \
-vf "subtitles=subtitles.srt:force_style='FontSize=18,PrimaryColour=&H00FFFFFF,OutlineColour=&H00000000,Outline=2,Alignment=2'" \
-c:a copy \
final_mv_subtitled.mp4
```
### ASS 高级字幕(可选)
支持更丰富的样式:
- 渐变色歌词
- 描边+阴影
- 动画效果(淡入淡出/缩放)
```bash
python3 scripts/lyrics_to_ass.py \
--lyrics lyrics.json \
--output subtitles.ass \
--template karaoke_glow
```
## 完整 Pipeline 示例
```bash
# 从音频到带字幕的MV
export PATH="$HOME/tools:$PATH"
# 1. 提取歌词
python3 scripts/extract_lyrics_whisper.py \
--audio sakura_mv.mp3 -o lyrics.json
# 2. 映射到场景
python3 scripts/map_lyrics_to_scenes.py \
--lyrics lyrics.json \
--scenes video_plan.json \
-o edit_plan.json
# 3. 分段音频
python3 scripts/segment_audio.py \
--audio sakura_mv.mp3 \
--edit-plan edit_plan.json \
-o segments/
# 4. 逐clip混合音频
for clip in clips/*.mp4; do
name=$(basename "$clip" .mp4)
seg="segments/${name}.m4a"
[ -f "$seg" ] && ffmpeg -y -i "$clip" -i "$seg" \
-c:v copy -c:a aac -shortest "mixed/${name}.mp4"
done
# 5. 合并全部 + 烧录字幕
ffmpeg -f concat -safe 0 -i mixed.txt -i sakura_mv.mp3 \
-vf "subtitles=subs.srt" -c:a aac -shortest final.mp4
```
## 与其他 Skill 协作
```
lyrics-video-sync (歌词匹配)
← cinematic-video-gen (prompt增强,确保画面匹配歌词意境)
← qingyun-api (实际视频生成)
← av-sync-workflow (节拍级精度的音视频同步)
→ ffmpeg-video-editor (最终合成)
```
## 特殊场景
### 纯音乐段(无歌词)
- 用节拍分析代替歌词映射
- 能量高→快切/大动作,能量低→慢切/静景
- 参考 `av-sync-workflow` 的 beat sync
### 多语言歌词
- 主歌词+翻译并行显示
- SRT/ASS 支持双行布局
- 时间轴对齐到主语言
### Live Action + AI混合
- 真人片段的歌词卡点用节拍分析
- AI生成片段用歌词情绪映射
- 两者通过 edit_plan.json 统一调度
## 脚本目录
```
scripts/
├── extract_lyrics_whisper.py # Whisper歌词提取
├── map_lyrics_to_scenes.py # 歌词→场景映射
├── segment_audio.py # 音频精准分段
├── lyrics_to_srt.py # 歌词→SRT字幕
├── lyrics_to_ass.py # 歌词→ASS高级字幕
├── manual_lyrics_editor.py # 手动标注工具
└── verify_sync.py # 同步验证
```
---
*创建日期: 2026-04-10*
*创建人: 小a (CEO) — 基于《樱花落尽时》MV制作需求*