# Video Lyrics Subtitle

> Video lyrics subtitle generator — create synchronized subtitle files for music videos

- Skill: `aaaaqwq/video-lyrics-subtitle` (Agent Skill, multi-file: 4 files)
- Install (CLI): `npx skillmds@latest add aaaaqwq/video-lyrics-subtitle`
- Raw SKILL.md: https://api.skillmd.com/api/skills/aaaaqwq/video-lyrics-subtitle/raw
- Safety review: pending (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: aAAaqwq (https://skillmd.com/u/aaaaqwq)
- Updated: 2026-09-09
- Page: https://skillmd.com/skills/aaaaqwq/video-lyrics-subtitle

---


# 🎵 视频歌词字幕生成 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
```

