Vito
[参考脚本地址(点击跳转)](https://github.com/vito01111/media-subtitle-tools/blob/main/video_asr_subtitle.py)
## 一、为什么要用语音识别做字幕提取
### 1.1 **ASR的优势**
- 时间线准确:精确到毫秒级的时间戳
- 适用范围广:无字幕视频、软字幕、音频文件都能处理
- 配合翻译:可以先识别原语言字幕,再用AI翻译成目标语言
### 1.2 适用场景
- 视频没有硬字幕(如采访、讲座、播客)
- 需要多语言字幕(识别后翻译)
- 音频文件转文字
- 视频翻译工作流:原语言识别 → AI翻译 → 双语字幕
### 1.3 faster-whisper-large-v2 的特点
- 基于 OpenAI Whisper 模型优化
- 支持多语言识别(100+语言)
- 速度快、准确率高
- 算力舱内置API,无需额外部署
---
## 二、环境准备
### 2.1 必需工具
- **FFmpeg**:用于音频提取和分割(需添加到系统PATH)
- **Python 3.8+**:运行脚本
- **算力舱API地址**: https://asr-ai.{这里填你的用户名}.heiyu.space/v1/audio/transcriptions
将 `{这里填你的用户名}` 替换为你的实际用户名
### 2.2 Python依赖
```bash
pip install requests
```
### 2.3 验证FFmpeg
```bash
ffmpeg -version
```
---
## 三、ASR字幕识别的处理思路
### 3.1 整体流程图
```
视频文件 → 提取音频 → 分割音频 → 顺序ASR识别 → 合并字幕 → 生成SRT
```
### 3.2 五步详解
**第一步:音频提取**
- 使用 FFmpeg 从视频中提取音频轨道
- 转换为 MP3 格式(64k比特率、32kHz采样率)
- 压缩音频大小,加快上传和识别速度
**第二步:音频分割**
- 将长音频按固定时长(如15分钟)分割成多个片段
- 避免单次API调用超时
- 控制单个请求的文件大小
**第三步:顺序ASR识别**
- 将音频片段逐个提交到算力舱 faster-whisper API
- 提供交互式语言选择菜单(8种常用语言)
- 必须明确指定语言代码(不支持 auto 自动检测)
- 直接返回 SRT 格式字幕,包含精确时间轴
- 单线程顺序处理,避免API并发限速
**第四步:字幕合并**
- 将多个片段的 SRT 文件按时间轴合并
- 自动调整时间偏移,保证连续性
- 处理跨片段的字幕断句问题
**第五步:AI 智能校对**
- 使用长上下文大模型(Claude、Gemini等)校对
- 修正专有名词、标点符号、语义不通顺等问题
- 提供视频背景信息,提升校对准确率
---
## 四、算力舱API调用方式
### 4.1 API配置
```python
# API配置
ASR_API_URL = "https://asr-ai.{这里填你的用户名}.heiyu.space/v1/audio/transcriptions"
ASR_MODEL = "Systran/faster-whisper-large-v2"
```
### 4.2 调用示例
```python
def transcribe_audio(audio_file, language='ja'):
"""转录音频为字幕"""
with open(audio_file, 'rb') as f:
files = {'file': (audio_file, f, 'audio/mpeg')}
data = {
'model': ASR_MODEL,
'language': language, # 语言代码:zh/ja/en/ko等(不支持auto)
'response_format': 'srt' # 直接返回SRT格式
}
response = requests.post(
ASR_API_URL,
files=files,
data=data,
timeout=300 # 5分钟超时
)
if response.status_code == 200:
return response.text # SRT格式字幕
else:
raise Exception(f"API错误: {response.status_code}")
```
**重试机制示例**:
```python
# 指数退避重试
for attempt in range(3):
if attempt > 0:
time.sleep(2 ** attempt) # 等待 2, 4, 8 秒
result = transcribe_audio(audio_file, language)
if result:
break
```
### 4.3 核心要点
- 使用 `multipart/form-data` 方式上传音频文件
- 支持多种音频格式:MP3、WAV、M4A、FLAC等
- `response_format` 可选:json、text、srt、vtt
- 返回的 SRT 包含序号、时间轴、字幕文本
### 4.4 多语言支持
| 语言 | 代码 | 适用场景 |
|------|------|----------|
| 中文 | zh | 国产影视、教学视频 |
| 日文 | ja | 日剧、动漫、日本综艺 |
| 英文 | en | 欧美影视、TED演讲 |
| 韩文 | ko | 韩剧、韩综 |
| 西班牙语 | es | 西语影视、拉美内容 |
| 法语 | fr | 法语影视、欧洲内容 |
| 德语 | de | 德语影视、欧洲内容 |
| 俄语 | ru | 俄语影视、东欧内容 |
**重要说明**:
- ⚠️ **API 不支持 auto 自动检测**,必须明确指定 ISO 639-1 语言代码
- ✅ **使用交互式菜单选择**,避免输入错误的语言代码
- ✅ **指定正确的语言代码**可以显著提升识别准确率
---
### 4.5 交互式使用体验
脚本提供了友好的交互式界面,新手也能轻松上手:
#### 视频文件选择
- **单个文件**:自动选择,无需手动输入
- **多个文件**:显示编号列表供选择,显示文件大小
- **Windows去重**:避免 `*.mp4` 和 `*.MP4` 重复显示同一文件
#### 语言选择菜单
```
请选择识别语言:
1. 中文 (Chinese)
2. 日语 (Japanese)
3. 英语 (English)
4. 韩语 (Korean)
5. 西班牙语 (Spanish)
6. 法语 (French)
7. 德语 (German)
8. 俄语 (Russian)
请选择语言 (1-8):
```
#### 命令行快速使用
```bash
# 交互式选择(推荐新手)
python video_asr_subtitle.py
# 指定语言跳过菜单(推荐熟练用户)
python video_asr_subtitle.py -l ja
# 完整指定所有参数
python video_asr_subtitle.py movie.mp4 -l zh -d 600
```
#### 实时进度显示
```
✅ 找到视频文件: movie.mp4
✅ 已选择: 日语 (Japanese)
🔄 正在从视频中提取音频...
✅ 音频提取完成 (耗时: 18.1秒)
🔄 正在分割音频 (每段 15 分钟)...
✅ 音频分割完成,共 2 个片段 (耗时: 0.7秒)
🔄 正在识别片段 [1/2]: movie_segment_000.mp3
✅ 片段 [1/2] 识别完成 (耗时: 145.8秒)
```
---
## 五、AI辅助开发
### 5.1 生成脚本的提示词
```markdown
请帮我写一个Python脚本,实现视频语音字幕识别功能,需求如下:
1. 功能需求:
- 使用FFmpeg从视频中提取音频(MP3格式,64k比特率,32kHz采样率)
- 将长音频按固定时长(默认15分钟)分割成多个片段
- 调用算力舱 faster-whisper-large-v2 API 进行语音识别
- 交互式语言选择菜单(支持中文、日语、英语、韩语等8种常用语言)
- 合并多个片段的SRT字幕文件,自动调整时间偏移
- 自动清理临时文件(提取的音频、音频片段)
2. 算力舱API调用方式:
- 接口地址:https://asr-ai.{这里填你的用户名}.heiyu.space/v1/audio/transcriptions
- 模型:Systran/faster-whisper-large-v2
- 请求方式:POST multipart/form-data
- 参数:
* file: 音频文件(MP3格式)
* model: 模型名称
* language: ISO 639-1 语言代码(zh/ja/en/ko等,**不支持 auto**)
* response_format: 返回格式(srt)
- 返回:SRT格式字幕文本
3. 技术要点:
- FFmpeg音频提取:
* 命令:ffmpeg -i video.mp4 -vn -acodec libmp3lame -ab 64k -ar 32000 -y audio.mp3
* -vn: 不包含视频
* -acodec libmp3lame: MP3编码
* -ab 64k: 64k比特率
* -ar 32000: 32kHz采样率
* -y: 覆盖已存在文件
- FFmpeg音频分割:
* 命令:ffmpeg -i audio.mp3 -f segment -segment_time 900 -c copy -y output_%03d.mp3
* -f segment: 分割模式
* -segment_time 900: 每段15分钟(900秒)
* -c copy: 直接复制,不重新编码
* -y: 覆盖已存在文件
- SRT合并逻辑:
* 解析每个SRT文件的时间轴(hh:mm:ss,ms格式)
* 为每个片段添加时间偏移(片段索引 × 分割时长)
* 重新编号,生成完整的SRT文件
4. 异常处理:
- API调用失败时自动重试(最多3次,指数退避)
- 记录详细错误信息:HTTP状态码、响应内容
- 超时错误:增加超时时间并重试(基础超时300秒)
- 网络错误:自动重试
- 部分失败时继续处理:即使部分片段识别失败,也生成可用字幕
5. 输出要求:
- 生成 _.srt 文件(如:movie_ja.srt)
- 显示实时进度:当前处理片段/总片段数
- 输出统计信息:
* 音频提取耗时
* 音频分割耗时
* ASR识别耗时(每个片段)
* 字幕合并耗时
* 总耗时
* 字幕总条数
* 成功/失败片段数
6. 用户体验优化:
- 视频文件选择:
* 单个MP4文件:自动选择
* 多个MP4文件:显示编号列表供用户选择
* Windows系统去重:避免 *.mp4 和 *.MP4 重复匹配同一文件
- 语言选择菜单:
* 显示8种常用语言的中文菜单(中文、日语、英语、韩语、西班牙语、法语、德语、俄语)
* 如果通过 -l 参数指定了有效语言,直接使用
* 否则显示交互式菜单供用户选择
- 命令行参数:
* python video_asr_subtitle.py [视频文件] [-l 语言代码] [-d 分割时长]
- 其他优化:
* Windows系统自动设置UTF-8编码
* 显示彩色状态图标(✅ ⚠️ ❌ 🔄)
* 清除代理设置,避免连接问题
* 自动清理临时文件
7. 可配置参数:
- SEGMENT_DURATION: 音频分割时长(默认900秒)
- ASR_API_URL: API地址
- ASR_MODEL: 模型名称
- MAX_RETRIES: 最大重试次数(默认3次)
- TIMEOUT: API超时时间(默认300秒)
- 支持通过环境变量调整
8. 重要说明:
- 使用单线程顺序处理:经测试,该API在并发请求时会降低单个请求的处理速度,单线程反而更高效
- 不支持 auto 语言检测:API 要求明确指定 ISO 639-1 语言代码
- 15分钟分割对识别质量影响很小:片段足够长,上下文完整,边界影响可忽略
```
### 5.2 字幕校对提示词
#### 通用ASR字幕校对提示词
```markdown
你是一个专业的字幕校对助手。我会提供一份通过语音识别(ASR)生成的视频字幕文件(SRT格式),需要你进行智能校对和修正。
## 第一步:分析视频背景信息
在开始校对之前,请先通读字幕内容,分析并总结以下信息:
1. **视频类型**:电影解说、电视剧、综艺、纪录片、教学视频、访谈等
2. **主题领域**:科技、历史、娱乐、教育、体育等
3. **关键人物**:视频中出现的重要人名、角色名(注意人名的一致性)
4. **专业术语**:领域特定的词汇(如技术名词、医学术语、法律用语等)
5. **语言风格**:正式/口语化、是否有网络用语、方言俚语等
6. **时代背景**:现代、历史题材、未来科幻等
请先输出你的分析结果,格式如下:
【视频背景分析】
- 视频类型:
- 主题领域:
- 关键人物:
- 专业术语:
- 语言风格:
- 其他特征:
## 第二步:识别并修正典型ASR错误
### 1. 同音字误识(重点)
这是ASR识别最常见的错误类型,需要特别注意:
**常见同音字错误示例:**
- "发头张" → "发条张"(UP主昵称)
- "石东初" → "石东出"(人名)
- "优惠" → "幽会"(动词)
- "丁烧" → "盯梢"(动词)
- "张首级" → "张守基"(人名)
- "蛊惑仔" → "古惑仔"(专有名词)
- "李子诚" vs "黎子诚" → 统一为正确写法
**修正方法:**
- 人名地名:根据上下文和常识确定正确用字,全文保持一致
- 专有名词:查证官方标准写法(如电影名、角色名)
- 多音字:根据语境判断正确读音和用字
- 成语俗语:修正错误的同音替换
- 动词形容词:根据语义选择正确用字
### 2. 重复内容清理(重点)
ASR识别卡顿会导致大量重复字幕,必须删除:
**典型重复模式:**
- 连续多条相同内容(如 "Running Mate" 重复50次)
- 短语重复(如 "你这什么玩意儿" 重复30次)
- 识别卡顿导致的单字/词重复
**处理方法:**
- 删除所有重复的字幕条目
- 只保留第一次出现的内容
- 删除后重新编号,保持序号连续
- 如果重复内容是噪声(如 "Running Mate"),直接全部删除
### 3. 人名一致性校正(重点)
同一人物在全文中必须使用统一的写法:
**检查要点:**
- 通读全文,列出所有人名
- 确定每个人物的正确写法(优先使用官方译名)
- 全文统一替换,确保一致性
- 特别注意同音不同字的人名(如"李子诚"/"黎子诚")
### 4. 标点符号补充
- 补充缺失的逗号、句号、问号、感叹号
- 对话部分使用引号或冒号标识
- 修正错误的断句
- 保持每条字幕1-2句话的长度
- 避免一句话过长,影响阅读体验
### 5. 专有名词校正
- 人名、地名、机构名:确保拼写准确且全文一致
- 影视作品名:使用书名号《》
- 品牌、产品名:保持官方标准写法
- 外来语音译:统一译法(如"古惑仔"不是"蛊惑仔")
- UP主昵称:保持原有写法(如"发条张")
### 6. 语义通顺性检查
- 根据上下文修正语句不通顺的地方
- 补充缺失的主语、谓语、宾语
- 修正时态、语态错误
- 保持原有的语言风格(口语化/书面化)
- 对于口语化表达,如果符合语境则保留
- 修正明显的语法错误
### 7. 语气词和口头禅
- 保留有意义的语气词(啊、呢、吧、嘛等)
- 删除过多的重复语气词
- 保留说话人的口头禅(如果是角色特征)
- 删除无意义的填充词(嗯、啊、那个等)
### 8. 时间轴完整性
- 保持SRT格式不变(序号、时间轴、字幕文本、空行)
- 不要修改时间戳
- 删除重复或噪声字幕后,重新编号保持连续
- 确保每条字幕都有完整的格式
## 第三步:输出修正结果
输出格式要求:
1. 完整的修正后SRT文件内容
2. 在文件末尾添加校对说明(以"# "开头的注释)
校对说明应包括:
- 主要修正的错误类型和数量(如:修正同音字50处、删除重复字幕80条、统一人名3处)
- 删除的重复内容统计
- 无法确定的疑问项(标注行号)
- 建议人工复核的部分
## 修正示例
**修正前:**
3
00:00:20,859 --> 00:00:26,859
由朴勋正指导、李正仔、黄正明、崔明志主演的韩国犯罪黑帮片《新世界》
11
00:00:51,859 --> 00:00:54,859
其会长石东初近些年大力开疆拓土
15
00:01:03,859 --> 00:01:07,859
亲情大好的石会长某夜去情妇家优惠
44
00:03:00,439 --> 00:03:03,439
重量级帮派大佬去世,门口少不了警方的丁烧
219
00:15:29,340 --> 00:15:30,340
Running Mate
220
00:15:31,539 --> 00:15:32,340
Running Mate
221
00:15:32,340 --> 00:15:32,539
Running Mate
**修正后:**
3
00:00:20,859 --> 00:00:26,859
由朴勋正指导,李政宰、黄政民、崔岷植主演的韩国犯罪黑帮片《新世界》。
11
00:00:51,859 --> 00:00:54,859
其会长石东出近些年大力开疆拓土。
15
00:01:03,859 --> 00:01:07,859
心情大好的石会长某夜去情妇家幽会。
44
00:03:00,439 --> 00:03:03,439
重量级帮派大佬去世,门口少不了警方的盯梢。
(删除所有 "Running Mate" 重复字幕,重新编号)
## 注意事项
1. **保持原意**:修正错误但不改变原始表达意思
2. **尊重风格**:不要将口语化内容改成书面语(如电影解说的口语化表达)
3. **谨慎删除**:只删除明确的重复和噪声,有疑问的保留
4. **标注疑问**:无法确定的地方在注释中说明
5. **完整输出**:输出完整的SRT文件,不要省略任何部分
6. **人名一致**:同一人物全文使用统一写法,这是最重要的
7. **重复必删**:连续重复的字幕必须删除,不要犹豫
---
现在请开始校对以下字幕内容:
[在此处粘贴SRT文件内容]
```
---
## 六、参数调优建议
### 6.1 音频分割时长调整
- **15分钟**(默认):适合大部分场景,平衡速度和稳定性
**调整方法**:修改脚本中的 `SEGMENT_DURATION` 参数
### 6.2 音频质量调整
- **64k/32kHz**(默认):适合语音识别,文件小速度快
- **128k/44.1kHz**:追求更高识别准确率
- **32k/16kHz**:极速模式,牺牲部分准确率
**调整方法**:修改FFmpeg的 `-ab` 和 `-ar` 参数
### 6.3 语言选择方式
- **交互式菜单选择**(推荐新手):显示8种常用语言的中文菜单,避免输入错误
- **命令行参数指定**(推荐熟练用户):使用 `-l` 参数直接指定语言代码
**重要说明**:
- ⚠️ **API 不支持 auto 自动检测**,必须明确指定 ISO 639-1 语言代码(zh/ja/en/ko等)
- ✅ 使用交互式菜单可以避免输入错误的语言代码
- ✅ 指定正确的语言代码可以显著提升识别准确率
**调整方法**:
```bash
# 使用交互式菜单
python video_asr_subtitle.py
# 命令行指定语言
python video_asr_subtitle.py -l ja
```
---
## 七、脚本速度实测
### 7.1 性能数据
以30分钟视频为例(基于实际测试):
- 音频提取:约 18 秒(本地FFmpeg处理)
- 音频分割:约 1 秒(本地FFmpeg处理)
- ASR识别:约 140-270 秒/片段(取决于API负载,单线程顺序处理)
- 字幕合并:约 0.1 秒
- **总耗时**:约 300 秒(5分钟左右)

### 7.2 速度对比
| 方法 | 30分钟视频耗时 | 优势 | 劣势 | |
| ----- | -------- | -------- | ------ | --- |
| ASR识别 | 约5分钟 | 速度快、时间轴准 | 依赖音频质量 | |
| OCR识别 | 100-200秒 | 适合硬字幕 | 需要画面清晰 | |
| | | | | |
---
## 八、常见问题排查
### 8.1 识别效果差
**问题表现**:
- 字幕缺失:部分对话没有被识别
- 识别错误多:大量同音字误识
- 时间轴不准:字幕与画面不同步
**解决方案**:
- **字幕缺失** → 检查音频质量,提高音频比特率
- **识别错误多** → 必须指定正确的语言代码(API不支持auto)
- **时间轴不准** → 检查音频分割和合并逻辑
### 8.2 API调用失败
**问题表现**
- 连接失败:无法连接到算力舱
- 返回错误:API返回4xx/5xx错误
**解决方案**:
- **连接失败** → 确保打开懒猫微服和算力舱,检查网络连通性
- **返回错误** → 查看响应内容,检查音频格式和参数配置(特别是language参数必须是有效的ISO 639-1代码)
### 8.3 处理速度慢
**问题表现**:
- 音频提取慢:FFmpeg处理时间长
- ASR识别慢:API调用耗时长
- 整体慢:总处理时间超出预期
**解决方案**:
- **音频提取慢** → 检查FFmpeg是否正确安装,视频编码是否支持
- **ASR识别慢** → 检查算力舱负载,考虑错峰使用
- **整体慢** → 降低音频质量(128k→64k)
### 8.4 多语言识别问题
**问题表现**:
- 混合语言识别不准:视频中有多种语言
- 方言识别困难:地方口音重
**解决方案**:
- **混合语言** → 分段处理,不同语言片段使用不同language参数
- **方言识别** → 推荐用阿里的FunASR识别
---
## 九、进阶应用:视频翻译工作流
### 9.1 完整流程
```
原视频 → ASR识别原语言字幕 → AI翻译目标语言 → 生成双语字幕
```
### 9.2 AI翻译提示词
```markdown
请将以下SRT字幕从[原语言]翻译成[目标语言],要求:
1. 保持SRT格式不变(序号、时间轴、字幕文本)
2. 翻译要符合目标语言的表达习惯
3. 保留专有名词的原文或使用通用译法
4. 保持原有的语气和情感
5. 每条字幕长度适中,便于阅读
[在此处粘贴SRT文件内容]
```
---
## 十、总结
### 10.1 核心优势
- **速度快**:30分钟视频约5分钟处理完成(这是large版本的,不是tiny,精度更高)
- **时间轴准**:精确到毫秒级,无需手动调整
- **多语言支持**:支持中文、日语、英语、韩语等多种语言
### 10.2 适用场景总结
| 场景 | 推荐方案 | 理由 |
|------|----------|------|
| 无字幕视频 | ASR识别 | 唯一选择 |
| 硬字幕视频 | OCR识别 | 更准确 |
| 需要翻译 | ASR+AI翻译 | 完整工作流 |
| 音频文件 | ASR识别 | 直接处理 |
| 多语言视频 | ASR分段识别 | 灵活切换语言 |
评论
0暂无评论