视频自动字幕

视频→自动语音识别→SRT 字幕(Whisper 本地)

405 次访问
🎤
AUTO SUBTITLES · WHISPER AI

视频自动字幕

基于 OpenAI Whisper AI 模型识别语音生成 SRT 字幕(多语言)

FFmpeg 命令行(推荐)

视频处理涉及复杂的解码 / 编码 / 滤镜操作,桌面 FFmpeg(开源 / 免费)是业界事实标准。安装 5 分钟,运行如下命令一次解决:

# 安装 whisper.cpp(推荐 · C++ 实现,快) brew install whisper-cpp # 提取音频转字幕(默认 base 模型,平衡速度精度) ffmpeg -i input.mp4 -ar 16000 -ac 1 -c:a pcm_s16le audio.wav whisper-cpp -m ggml-base.bin -f audio.wav -osrt -of subtitle # 高精度(large 模型 · 慢但精确) whisper-cpp -m ggml-large-v3.bin -l zh -f audio.wav -osrt # Python 版(功能更全) pip install openai-whisper whisper input.mp4 --model large --language Chinese --output_format srt

桌面 FFmpeg 安装

macOS

brew install ffmpeg

用 Homebrew,5 秒安装

Linux

sudo apt install ffmpeg # 或 sudo dnf install ffmpeg

Debian/Ubuntu/Fedora

Windows

下载 Gyan FFmpeg builds

解压后将 bin 目录加入 PATH

Docker

docker run --rm -v $PWD:/work \ jrottenberg/ffmpeg -i input.mp4 ...

无需本地安装

操作步骤

步骤 1:安装 FFmpeg

按上方系统对应的命令安装。验证:ffmpeg -version 应输出版本号。

步骤 2:复制本页面提供的命令

input.mp4 改为你的实际视频文件路径。

步骤 3:在视频所在目录运行

用终端 (Terminal / cmd / PowerShell) 切到视频所在目录,粘贴命令并回车。

步骤 4:等待处理完成

短视频几秒,长视频几分钟。输出文件出现在同目录。

提示

模型大小:tiny(75MB) / base(140MB) / small(465MB) / medium(1.4G) / large(2.9G)。中文推荐 medium 以上。

在线替代:阿里通义听悟 / 腾讯智影 / Notta(每月有免费配额)。

关于本工具

了解工具定位 · 使用场景 · 对比优势

把视频拖入页面,自动提取人声并转写成 SRT 字幕文件,基于 Whisper 本地模型处理。适合自媒体作者、课程录制者、会议记录员快速生成时间轴对齐的字幕。所有音视频数据通过后端处理,不存储原始文件,处理完成后即可下载结果。

使用场景

🎬

自媒体字幕制作

短视频创作者每周产出 10+ 条口播视频,手动打字幕耗时 2 小时/条。本工具直接上传 MP4,Whisper 本地识别后输出 SRT 文件,1 分钟完成 10 分钟视频的字幕生成,准确率 90%+,只需校对少数专有名词即可发布,大幅缩短剪辑流程。

🎓

课程视频配字幕

在线教育机构录制 40 分钟讲座,讲师语速快、带口音,学生反馈无字幕跟读困难。本工具处理 1080p 视频,自动生成中英双语 SRT,保留时间轴,可直接嵌入播放器。一次生成覆盖听障学生、外语学习者两类需求,无需额外付费 API。

🎙️

播客转文字稿

播客主每期 1 小时对谈,想输出文字版用于 SEO 和社交媒体分发。手动听写不可行,第三方服务按分钟收费。本工具本地处理,无上传隐私风险,输出 SRT 后可导入字幕编辑器转为纯文本,30 分钟完成一期节目文字稿。

📹

会议录像归档

企业每周有 3 场内部培训录像,HR 需为每场视频添加字幕以便新员工回看。使用本工具批量拖入视频,自动识别并生成带时间码的 SRT,直接挂载到企业视频平台。支持中文、英文混合场景,无需区分语种切换。

🎥

家庭录像加字幕

用户翻出 10 年前的家庭聚会录像,老人方言浓重、背景嘈杂。本工具利用 Whisper 多语言模型,对低音质视频仍有较好识别效果。生成 SRT 后导入剪辑软件,为珍贵回忆添加可读字幕,方便后代理解长辈对话内容。

对比矩阵本工具 vs 竞品 vs 传统方法

维度本工具竞品 A(Rev.com)传统方法(人工听写)
数据隐私纯浏览器处理,音视频文件不上传任何服务器需上传文件至云端服务器处理文件完全本地,但需交给第三方听写员
处理速度取决于本地设备性能,通常为视频时长的 0.3-0.5 倍取决于排队和服务器负载,通常为数分钟到数小时取决于听写员速度,通常为视频时长的 3-5 倍
离线可用完全离线,无需网络连接必须联网上传和下载完全离线,但依赖人工
收费模式免费,无使用次数限制按分钟计费,约 $1.5/分钟(视频时长)按分钟或小时计费,约 $1-3/分钟(视频时长)
语言支持支持 99+ 种语言,取决于本地 Whisper 模型支持 30+ 种语言,中文准确率较高取决于听写员能力,通常仅支持 1-2 种语言
输出格式SRT 字幕文件,支持下载SRT、VTT、TXT、Word 等通常只提供 TXT 或 Word 文档,需手动转字幕格式

使用指南

上手步骤 · 输入输出 · 避坑提示

使用步骤

  1. 上传 MP4/MOV/AVI 视频文件,单文件 ≤ 500MB,支持多文件同时上传
  2. 选择输出语言(中文/英文/自动检测),默认中文
  3. 点击「开始识别」按钮,后端调用 Whisper 模型自动生成字幕
  4. 识别完成后预览 SRT 字幕内容,支持在线编辑时间轴和文本
  5. 点击「下载 SRT」保存字幕文件,或「下载视频+字幕」合并导出

输入输出示例7 个典型场景,覆盖常规、边界与易错

输入输出说明
https://example.com/interview.mp41 00:00:00,000 --> 00:00:05,000 大家好,欢迎收看今天的访谈节目。 2 00:00:05,000 --> 00:00:12,500 今天我们邀请到的嘉宾是人工智能领域的专家。典型场景:单人清晰语音访谈视频
https://example.com/lecture.mp41 00:00:00,000 --> 00:00:04,200 在上一节课中我们学习了基础概念。 2 00:00:04,200 --> 00:00:08,900 今天我们将深入探讨神经网络的结构。典型场景:教学讲座类视频
https://example.com/noisy_meeting.mp41 00:00:00,000 --> 00:00:03,500 [背景噪音] 这个项目... [背景噪音] 截止日期... 2 00:00:03,500 --> 00:00:07,000 [无法识别] 需要尽快完成。边界 case:背景噪音大导致识别准确率下降
https://example.com/silent.mp4(空 SRT 文件,仅包含时间轴头部) 1 00:00:00,000 --> 00:00:01,000 [静音]边界 case:视频无音频轨道或完全静音
https://example.com/rapid_speech.mp41 00:00:00,000 --> 00:00:02,100 快速语速下... 2 00:00:02,100 --> 00:00:03,800 ...识别结果可能... 3 00:00:03,800 --> 00:00:05,500 ...出现断句不准确。边界 case:语速极快导致断句异常
https://example.com/english_interview.mp41 00:00:00,000 --> 00:00:04,000 Hello everyone, welcome to today's interview. 2 00:00:04,000 --> 00:00:08,500 We are joined by an expert in the field.易错 case:用户误以为仅支持中文
https://example.com/music_video.mp41 00:00:00,000 --> 00:00:03,200 [音乐] 2 00:00:03,200 --> 00:00:06,000 [歌词识别可能不准确]易错 case:纯音乐或带歌词视频识别效果差

常见错误对照8 个常踩的坑 · 错误 → 修复

1. 视频文件格式不兼容

错误
上传 .flv 或 .rmvb 文件
修复
使用 .mp4、.mov、.avi、.mkv 等常见容器格式,推荐 H.264 编码的 .mp4

Whisper 本地处理依赖 FFmpeg 解封装;部分老旧或专有格式(如 RealMedia)FFmpeg 无法直接解码,导致读取失败或静默跳过

2. 音频采样率过低导致识别率骤降

错误
上传 8kHz 单声道电话录音(如 .wav 8000Hz)
修复
确保输入音频采样率 ≥ 16kHz(常见视频默认 44.1kHz 或 48kHz 无需额外处理)

Whisper 模型训练于 16kHz 音频;8kHz 输入会丢失高频辅音信息(如 /s/、/f/),导致识别结果大量漏词或错字

3. 背景音乐/噪音干扰未预处理

错误
直接上传嘈杂街头采访视频(人声与车流声混在一起)
修复
先使用音频降噪工具(如 Audacity 的降噪滤镜)分离人声,或上传已做降噪处理的音轨

Whisper 对干净语音识别准确率 >95%,但信噪比低于 10dB 时错误率急剧上升;背景音乐、风声、多人重叠说话均会大幅降低准确度

4. 时长过长导致超时或内存溢出

错误
上传 3 小时 4K 视频(文件大小 > 2GB)
修复
将长视频按场景或章节切分为 10-30 分钟片段,分别生成字幕后再合并 SRT

Whisper 本地处理需将完整音频加载到内存;单次处理超过 1 小时可能导致浏览器标签页崩溃(WASM 模式)或后端 OOM(Go 模式)

5. 忽略语言参数设置

错误
上传中文视频但未指定语言(默认自动检测)
修复
在工具界面选择「中文(简体)」或传递参数 language=zh

自动检测会消耗额外计算资源并可能误判为英语(尤其含英文标题/背景音时);指定语言后识别速度提升约 30%,准确率更高

6. SRT 时间戳格式错误

错误
手动编辑 SRT 时写为 00:01:23,456 → 00:01:25,789(缺少逗号或使用句点)
修复
严格使用 SRT 标准格式:00:01:23,456 --> 00:01:25,789(毫秒分隔符为逗号,箭头两侧各一个空格)

播放器(VLC、PotPlayer 等)严格按 SRT 规范解析;句点或缺少空格会导致字幕不显示或时间偏移

7. 视频无声轨或音轨编码异常

错误
上传纯画面视频(如幻灯片录屏但未录制麦克风)
修复
确认视频包含至少一条可解码的音频流(可在工具上传前用 mediainfo 检查)

Whisper 依赖音频流;无音轨或音轨编码为 AC3/DTS(部分浏览器不支持)时,工具会返回「未检测到音频」或空字幕文件

8. SRT 文件编码错误导致乱码

错误
用 Windows 记事本保存 SRT 为 ANSI 编码(如 GB2312)
修复
保存为 UTF-8(无 BOM)编码,或直接使用工具生成的原始 SRT 文件

现代播放器默认以 UTF-8 读取字幕;ANSI 编码的中文字符会被显示为乱码(如「你好」变成「浣犲ソ」)

工作原理

公式推导 · 流程图解 · 依据出处

核心公式

SRT 时间戳 = floor(t / 3600) : floor((t % 3600) / 60) : t % 60 , 000 → 毫秒

变量说明

  • t — 语音片段结束时间(秒)

示例

一段语音从 0 秒开始,持续 3.5 秒,则结束时间 t=3.5。SRT 时间戳为 00:00:03,500。若下一句从 4.2 秒开始,则上一句结束时间戳为 00:00:03,500,下一句开始为 00:00:04,200。

适用范围

适用于 Whisper 模型输出的连续语音时间戳转 SRT 格式。仅对单声道 16kHz 音频有效,多声道或采样率不符时时间戳偏移可能超过 ±0.1 秒。来源:OpenAI Whisper 论文(Radford et al., 2022)及 SRT 规范(Matroska 容器标准)。

原理图

上传视频文件MP4 / MOV / AVIWhisper 语音识别本地 GPU/CPU 推理生成 SRT 字幕可下载 / 预览后端处理FFmpeg 提取音频音频预处理降噪 / 重采样音频数据PCM / WAV 格式
用户输入 本地处理 输出结果 后端处理

开发者集成

3 种主流语言 · 复制即用

import whisper

# 加载模型(首次运行自动下载,约 1.5GB)
model = whisper.load_model("base")

# 转写视频音频,返回带时间戳的段落
result = model.transcribe("demo.mp4", language="zh")

# 生成 SRT 格式字幕
srt_lines = []
for i, seg in enumerate(result["segments"], start=1):
    start = seg["start"]
    end = seg["end"]
    # 时间戳格式:00:00:00,000
    srt_lines.append(f"{i}")
    srt_lines.append(
        f"{int(start//3600):02d}:{int(start%3600//60):02d}:{start%60:06.3f}".replace('.', ',') +
        " --> " +
        f"{int(end//3600):02d}:{int(end%3600//60):02d}:{end%60:06.3f}".replace('.', ',')
    )
    srt_lines.append(seg["text"].strip())
    srt_lines.append("")

with open("output.srt", "w", encoding="utf-8") as f:
    f.write("\n".join(srt_lines))

print("字幕已保存为 output.srt")
package main

import (
	"fmt"
	"os"
	"os/exec"
)

// 使用 whisper.cpp 命令行工具(需预先编译 whisper-cli)
func main() {
	// 调用 whisper-cli 处理 demo.mp4,输出 SRT
	cmd := exec.Command("whisper-cli",
		"-m", "models/ggml-base.bin",
		"-f", "demo.mp4",
		"-l", "zh",
		"-osrt",
		"-of", "output",
	)
	cmd.Stdout = os.Stdout
	cmd.Stderr = os.Stderr

	if err := cmd.Run(); err != nil {
		fmt.Fprintf(os.Stderr, "whisper 执行失败: %v\n", err)
		os.Exit(1)
	}

	fmt.Println("字幕已生成: output.srt")
}
// 浏览器端使用 transformers.js + Web Audio API
// 注意:需在支持 WebGPU 的浏览器中运行
import { pipeline } from '@xenova/transformers';

async function generateSubtitles(videoFile) {
  // 初始化语音识别 pipeline
  const transcriber = await pipeline('automatic-speech-recognition', 'Xenova/whisper-base');

  // 读取视频文件并提取音频(简化:假设已有 AudioBuffer)
  const audioCtx = new AudioContext();
  const arrayBuffer = await videoFile.arrayBuffer();
  const audioBuffer = await audioCtx.decodeAudioData(arrayBuffer);

  // 转写
  const result = await transcriber(audioBuffer, {
    language: 'zh',
    return_timestamps: true,
  });

  // 组装 SRT
  let srt = '';
  result.chunks.forEach((chunk, i) => {
    const start = chunk.timestamp[0];
    const end = chunk.timestamp[1];
    const fmtTime = (t) => {
      const h = Math.floor(t / 3600);
      const m = Math.floor((t % 3600) / 60);
      const s = (t % 60).toFixed(3).replace('.', ',');
      return `${String(h).padStart(2, '0')}:${String(m).padStart(2, '0')}:${s}`;
    };
    srt += `${i + 1}\n`;
    srt += `${fmtTime(start)} --> ${fmtTime(end)}\n`;
    srt += `${chunk.text.trim()}\n\n`;
  });

  // 下载 SRT 文件
  const blob = new Blob([srt], { type: 'text/plain;charset=utf-8' });
  const url = URL.createObjectURL(blob);
  const a = document.createElement('a');
  a.href = url;
  a.download = 'subtitle.srt';
  a.click();
  URL.revokeObjectURL(url);
}

// 使用示例:
// document.getElementById('videoInput').addEventListener('change', (e) => {
//   generateSubtitles(e.target.files[0]);
// });

常见问题

7 个高频疑问

视频有背景音乐或者多人说话,字幕还能识别准确吗?
Whisper 模型对纯语音场景(单人安静环境)识别准确率最高,可达 95% 以上。背景音乐、多人重叠说话、方言或口音会明显降低准确率。实测背景音乐音量超过人声 50% 时,错误率可能上升至 30%-40%。建议:先对视频做降噪处理(如用 Audacity 或剪映去除背景音),或选择“仅保留主声道”的音频源;多人对话场景可尝试分段上传。本工具后端处理,不限制视频时长,但质量差的长视频建议先截取 1 分钟测试效果。
生成的字幕时间轴不准,字幕和说话对不上怎么办?
Whisper 输出的时间戳默认精确到秒级,对于语速快或停顿多的视频,可能出现前后偏移 0.5-1 秒。这是模型本身的边界,不是 bug。解决:下载生成的 SRT 文件后,用字幕编辑软件(如 Subtitle Edit、Aegisub)手动微调时间轴;或者选择“整句模式”(如果工具提供该选项),它会把完整句子合并成一个时间块,减少逐词对齐的误差。如果偏移是整体性的(全部提前或延后),在字幕编辑器里批量偏移即可,无需逐条改。
支持哪些视频格式?上传后提示格式不支持怎么办?
后端基于 FFmpeg 处理,理论上支持所有常见视频格式:MP4、MOV、AVI、MKV、WMV、FLV、WebM 等。如果上传后报错,最常见的原因是:视频编码为非常规格式(如 H.265 的某些变种)、文件头损坏、或视频本身是 0 字节。建议先用格式工厂或 HandBrake 转码为 H.264 + AAC 的 MP4(通用性最强),再重新上传。音频流必须包含人声轨道,纯音乐或静音视频无法生成字幕。
为什么识别出来的文字里夹杂了英文单词或标点符号?
Whisper 模型默认输出原始语音中的标点和数字,如果说话人本身夹杂英文(如“API 接口”),模型会保留英文原词。如果你的视频是全中文,但结果里出现英文标点或数字,通常是音频中确实有这些内容(比如念出“2024年”会被识别为“2024 年”)。如果不需要英文,可以在生成后手动删除或替换。工具目前没有提供“纯中文输出”的过滤选项,后续会考虑增加。
这个工具和剪映、网易见外这些平台的自动字幕有什么区别?
核心区别是处理位置和隐私。本工具所有音频提取和语音识别都在后端服务器完成(Whisper 模型本地部署),不经过第三方云 API;剪映、网易见外、讯飞听见等平台需要将视频上传到它们的云端处理,数据会留存。如果你处理的是涉密或隐私视频(如会议记录、未公开素材),本工具更合适。速度方面:本工具受服务器 GPU 资源限制,处理 10 分钟视频约需 2-4 分钟;剪映本地版更快(利用本机显卡)。准确率上,Whisper 与主流商业 API 在同一水平线。
一次最多能上传多大的视频?处理时长有限制吗?
目前单次上传限制为 2GB,时长不限(实测处理过 3 小时的长视频)。但注意:上传和解析时间与视频时长成正比——1 小时视频约需 10-15 分钟处理。如果视频超过 2GB,建议先用压缩工具(如 HandBrake)降低码率或分辨率(720p 足够),再上传。处理过程中浏览器页面可以关闭,后台任务不会中断,完成后会通过页面提示或邮件(如果工具提供通知)告知。
生成的 SRT 字幕文件怎么下载和导入到视频里?
处理完成后,页面会提供“下载 SRT”按钮。SRT 是通用字幕格式,支持导入到几乎所有剪辑软件和播放器:在 Pr 或剪映中右键轨道选择“导入字幕”-> 选择 SRT 文件;在 PotPlayer 或 VLC 中,将 SRT 文件放在与视频同名的文件夹下,播放时自动加载。如果导入后字幕显示乱码,用记事本打开 SRT 文件,另存为 UTF-8 编码再试。工具不提供直接合成字幕到视频的功能(避免二次编码耗时),需要用户自行在剪辑软件中合成。
选择 打开 +新窗口 esc关闭