video-lyrics-subtitle

$npx mdskill add aAAaqwq/AGI-Super-Team/video-lyrics-subtitle

Generate synchronized SRT/ASS subtitles from lyrics and audio.

  • Converts lyric text and audio into formatted subtitle files.
  • Integrates with FFmpeg to burn subtitles directly into video.
  • Parses LRC format or JSON timelines to calculate timing.
  • Outputs SRT or ASS files with optional bilingual support.
SKILL.md
.github/skills/video-lyrics-subtitleView on GitHub ↗
---
name: video-lyrics-subtitle
description: Video lyrics subtitle generator — create synchronized subtitle files for music videos
---

# 🎵 视频歌词字幕生成 Skill

> 视频歌词字幕生成引擎:从歌词文本 + 时间轴 → SRT/ASS 字幕 → FFmpeg 烧录到视频

## 触发词

歌词字幕、lyrics subtitle、字幕烧录、字幕生成、SRT、ASS、bilingual subtitle、双语字幕、字幕文件、字幕制作

## 功能概述

从歌词文本(纯文本或 LRC 格式)+ 时间轴信息,生成 SRT/ASS 字幕文件,并可通过 FFmpeg 烧录到视频中。

### 核心 Pipeline

```
lyrics.txt + audio.mp3
  → generate_srt.py   (生成 SRT 时间轴)
  → generate_ass.py   (可选:生成 ASS 高级样式 / KTV 效果)
  → burn_subtitles.sh (FFmpeg 烧录到视频)
  → final_with_subtitles.mp4
```

## 脚本位置

所有脚本在 `scripts/` 子目录下:

| 脚本 | 功能 |
|------|------|
| `scripts/generate_srt.py` | 从歌词文本 + 时间轴生成 SRT 字幕 |
| `scripts/generate_ass.py` | SRT → ASS 转换(支持 KTV 高亮) |
| `scripts/burn_subtitles.sh` | FFmpeg 烧录字幕到视频 |

## 标准输入

| 输入 | 文件 | 说明 |
|------|------|------|
| 歌词原文 | `lyrics/lyrics.txt` | 纯文本或 LRC 格式带时间戳 |
| 中文翻译 | `lyrics/lyrics_cn.txt` | 可选,用于双语字幕 |
| 音频文件 | `audio/song_final.mp3` | 用于获取总时长(纯文本歌词时) |
| 视频文件 | `video/*.mp4` | 烧录目标 |

## generate_srt.py — SRT 字幕生成

### 用法

```bash
python3 scripts/generate_srt.py <lyrics_file> [options]
```

### 选项

| 参数 | 说明 |
|------|------|
| `lyrics_file` | 歌词文件路径(LRC 或纯文本) |
| `--audio <file>` | 音频文件,用于获取总时长(纯文本歌词时必须) |
| `--duration <seconds>` | 总时长(秒),替代 `--audio` |
| `--bilingual <cn_file>` | 中文翻译文件,生成双语 SRT |
| `--json-timeline <file>` | 带时间轴的 JSON 文件(如 `chloe_lyrics_parsed.json`) |
| `-o / --output <file>` | 输出 SRT 文件路径(默认 stdout) |

### 输入格式支持

#### 1. LRC 格式(带时间戳)
```
[00:00.00](纯音乐前奏)
[00:15.00]樱花落尽时 花瓣纷飞如雪
[00:20.00]你的笑容 在记忆中凋谢
```

#### 2. 纯文本格式(等间隔分配)
需要 `--audio` 或 `--duration` 指定总时长,每行歌词等间隔分配时间。
空行表示纯音乐段,自动标注 `(纯音乐)`。

#### 3. JSON 时间轴格式
通过 `--json-timeline` 传入带 `sections[].lines[]` 结构的 JSON 文件,
支持精确的 start/end 时间。

### SRT 生成规则

- 每行歌词对应一条 SRT 条目
- 空行 / 纯音乐段自动标注 `(纯音乐)`
- 双语模式:原文行在上,翻译行在下,同一条目内用 `\N` 分隔
- 时间格式:`HH:MM:SS,mmm`(SRT 标准)

### 示例

```bash
# LRC 歌词 → SRT
python3 scripts/generate_srt.py lyrics/lyrics.lrc -o subtitles/lyrics.srt

# 纯文本歌词 + 音频时长 → SRT
python3 scripts/generate_srt.py lyrics/lyrics.txt --audio audio/song_final.mp3 -o subtitles/lyrics.srt

# 双语字幕
python3 scripts/generate_srt.py lyrics/lyrics.txt --audio audio/song_final.mp3 \
  --bilingual lyrics/lyrics_cn.txt -o subtitles/lyrics_bilingual.srt

# JSON 时间轴 → SRT
python3 scripts/generate_srt.py lyrics/lyrics.txt \
  --json-timeline script/chloe_lyrics_parsed.json \
  -o subtitles/lyrics.srt
```

## generate_ass.py — ASS 高级字幕生成

### 用法

```bash
python3 scripts/generate_ass.py <srt_file> [options]
```

### 选项

| 参数 | 说明 |
|------|------|
| `srt_file` | 输入 SRT 文件路径 |
| `--style <ktv\|simple>` | 样式模式(默认 `simple`) |
| `--font <name>` | 字体名称(默认 `Noto Sans CJK SC`) |
| `--fontsize <size>` | 字体大小(默认 `48`) |
| `--primary-color <hex>` | 主文字颜色(默认 `#FFFFFF`) |
| `--outline-color <hex>` | 描边颜色(默认 `#000000`) |
| `--back-color <hex>` | 背景色(默认 `#80000000` 半透明黑) |
| `-o / --output <file>` | 输出 ASS 文件路径(默认同名 `.ass`) |

### ASS 样式

#### simple 模式
- 底部居中显示
- 白色文字 + 黑色描边
- 半透明背景条

#### ktv 模式
- 逐字高亮效果(`\kt` 标签)
- 播放时文字从灰色变为亮色
- 适合 KTV / 卡拉 OK 场景

### 示例

```bash
# 简单样式
python3 scripts/generate_ass.py subtitles/lyrics.srt -o subtitles/lyrics.ass

# KTV 样式
python3 scripts/generate_ass.py subtitles/lyrics.srt --style ktv -o subtitles/lyrics.ass

# 自定义字体和颜色
python3 scripts/generate_ass.py subtitles/lyrics.srt \
  --font "Source Han Sans CN" --fontsize 52 \
  --primary-color "#FFD700" -o subtitles/lyrics.ass
```

## burn_subtitles.sh — FFmpeg 字幕烧录

### 用法

```bash
bash scripts/burn_subtitles.sh <video_file> <subtitle_file> [output_file]
```

### 功能

- 自动检测字幕格式(SRT / ASS)
- 调用 FFmpeg 硬字幕烧录
- 默认输出文件名:`<video>_with_subtitles.mp4`
- FFmpeg 路径:`~/tools/ffmpeg`

### FFmpeg 命令

```bash
# SRT 硬字幕
ffmpeg -i video.mp4 -vf "subtitles=lyrics.srt" -c:a copy output.mp4

# ASS 硬字幕
ffmpeg -i video.mp4 -vf "ass=lyrics.ass" -c:a copy output.mp4
```

### 示例

```bash
# 烧录 SRT 字幕
bash scripts/burn_subtitles.sh video/phase1_preview.mp4 subtitles/lyrics.srt video/final_with_subtitles.mp4

# 烧录 ASS 字幕
bash scripts/burn_subtitles.sh video/phase1_preview.mp4 subtitles/lyrics.ass video/final_with_subtitles.mp4
```

---

## 📁 规范 MV 项目文件结构

所有 MV 项目遵循以下文件结构:

```
~/clawd/projects/MediaClaw/output/<project-name>/
├── lyrics/                    # 🎵 歌词(必须有)
│   ├── lyrics.txt             # 歌词原文(纯文本或LRC)
│   ├── lyrics_cn.txt          # 中文翻译(可选)
│   └── lyrics.json            # 带时间轴的JSON(程序生成)
├── subtitles/                 # 📝 字幕文件(程序生成)
│   ├── lyrics.srt             # SRT格式
│   ├── lyrics_bilingual.srt   # 双语SRT
│   └── lyrics.ass             # ASS格式(KTV效果)
├── audio/                     # 🎶 音频
│   └── song_final.mp3         # 最终版音频
├── video/                     # 🎬 视频
│   ├── clips/                 # 各clip片段
│   └── final_with_subtitles.mp4  # 最终带字幕视频
├── frames/                    # 🖼️ 参考帧图片
└── script/                    # 📜 剧本/计划
    ├── mv_script.json         # MV脚本
    └── edit_plan.json         # 剪辑计划
```

### 文件命名铁律 ⚠️

| 内容 | 固定路径 | 说明 |
|------|----------|------|
| 歌词原文 | `lyrics/lyrics.txt` | 纯文本或 LRC |
| 中文翻译 | `lyrics/lyrics_cn.txt` | 可选 |
| SRT 字幕 | `subtitles/lyrics.srt` | 单语 |
| 双语 SRT | `subtitles/lyrics_bilingual.srt` | 双语 |
| ASS 字幕 | `subtitles/lyrics.ass` | KTV 效果 |
| 最终视频 | `video/final_with_subtitles.mp4` | 带字幕成品 |

**禁止随意命名**(如 `sub01.srt`、`lyrics_raw_v2.txt`、`final_v3_new.mp4`)。
所有文件必须遵循以上命名规范。

---

## 完整工作流示例

```bash
# 设置项目路径
PROJECT=~/clawd/projects/MediaClaw/output/chloe-sakura-mv
SKILL=~/clawd/skills/video-lyrics-subtitle

# 1. 生成 SRT 字幕(从 LRC 歌词)
python3 $SKILL/scripts/generate_srt.py \
  $PROJECT/lyrics/lyrics.txt \
  --json-timeline $PROJECT/script/sakura_mv_final.json \
  -o $PROJECT/subtitles/lyrics.srt

# 2. 生成 ASS 字幕(KTV 风格)
python3 $SKILL/scripts/generate_ass.py \
  $PROJECT/subtitles/lyrics.srt \
  --style ktv \
  -o $PROJECT/subtitles/lyrics.ass

# 3. 烧录字幕到视频
bash $SKILL/scripts/burn_subtitles.sh \
  $PROJECT/video/phase1_preview_sakura_mv.mp4 \
  $PROJECT/subtitles/lyrics.ass \
  $PROJECT/video/final_with_subtitles.mp4
```
More from aAAaqwq/AGI-Super-Team