从 YouTube Transcript 到 WhisperX:英语视频字幕制作流程探索

从 YouTube Transcript、yt-dlp,到 OpenAI Whisper、Faster Whisper 与 WhisperX,完整记录英语视频字幕制作与动态字幕时间轴对齐的本地实践过程,包括模型区别、速度测试、词级时间戳、forced alignment 与字幕工作流。

ASRYouTube TranscriptDynamic CaptionsWord-by-Word CaptionsHormozi Style Captionsyt-dlpOpenAI WhisperFaster WhisperWhisperXwav2vec2forced alignment霍尔莫齐风格字幕动态字幕 / 动力学排版逐字高亮 / 卡拉OK样式英语字幕制作语音识别词级时间戳字幕时间轴Whisper 字幕WhisperX 教程视频字幕工作流AI 字幕生成

最近一段时间,我在研究英语视频字幕的制作流程。发现很多英语短视频的字幕效果做得非常好,尤其是科技新闻、商业访谈、播客切片这类内容,不仅字幕本身准确,还会配合单词高亮、逐词动画、颜色切换、缩放强调等效果,整体观感非常专业。

比如:Alex Hormozi Shorts

后来我专门查了一些资料,才发现这种字幕风格其实已经形成了一套相对成熟的制作流派,在创作者圈子里,它经常被称为:

  • Hormozi Style Captions 霍尔莫齐风格字幕
  • Dynamic Captions 动态字幕 / 动力学排版
  • Word-by-Word Captions 逐字高亮 / 卡拉OK样式

我想尝试实现类似的效果。但在开始之前,我需要先找一些合适的测试样本。最理想的情况是:视频本身就已经有配套字幕,这样我就可以先把重点放在字幕解析、时间轴处理、样式渲染和动画效果上,而不是一开始就投入到语音识别和字幕生成里。

基于这个想法,我首先把目光放到了 YouTube 。毕竟很多视频本身就提供字幕,YouTube 也有自带的 Transcript 功能。

我开始尝试下载 YouTube 视频,使用的工具是 yt-dlp。它可以下载视频,也可以查看、下载 YouTube 上已有的字幕。常用命令大致如下:

GitHub Repo

yt-dlp/yt-dlp

A feature-rich command-line audio/video downloader

# js-runtimes 使用 JavaScript 动态逻辑
 
# 查看一个视频有哪些字幕
yt-dlp --js-runtimes node --list-subs "VIDEO_URL"
 
# 下载最佳视频 + 用户上传英文字幕
# 避免下载4K,可以限制到 1080P:-f "bv*[height<=1080]+ba/b[height<=1080]/b"
yt-dlp --js-runtimes node -f "bv*+ba/b" --write-subs --sub-lang en --sub-format srt "VIDEO_URL"
 
# 下载最佳视频 + 自动英文字幕
yt-dlp --js-runtimes node -f "bv*+ba/b" --write-auto-subs --sub-lang en --sub-format srt "VIDEO_URL"
 
# 只下载字幕,不下载视频
yt-dlp --js-runtimes node --skip-download --write-subs --write-auto-subs --sub-lang en --sub-format srt "VIDEO_URL"

一开始,我以为 YouTube 上现成的字幕,无论是用户上传的字幕,还是平台自动生成的字幕,都可以直接拿来做后期测试。但实际下载后,发现它们更像是“观看辅助字幕”,不适合直接进入视频制作流程。

YouTube Transcript 的问题

  1. 时间轴不够稳定:有些字幕和语音并不是完全贴合,做逐词高亮或卡点动画时会比较明显。
  2. 断句不自然:尤其是新闻类、采访类视频,字幕经常按照识别结果机械切分,而不是按照语义和阅读节奏切分。
  3. 格式不适合直接制作:有些用户上传字幕会出现大量全大写文本,虽然能看,但不适合直接作为精细化字幕素材。
  4. 阅读体验一般:字幕可能出现得太晚、消失得太早,或者一句话被切得过碎,导致后期排版和动画处理都不太舒服。

看来“能识别出来” 和 “适合视频制作” 是两回事。

YouTube 的 Transcript 可以作为参考,也可以帮助我快速理解视频内容,但如果目标是做出更专业的字幕效果,比如逐词高亮、精确时间轴、自然断句和更好的视觉节奏,那么它并不是最理想的起点。

在现在的 AI 时代,已经有很多 ASR 工具可以直接把语音识别成字幕文件。市面上当然也有不少商业 API 和在线应用,但作为开发者,更希望先尝试一种开源、本地化、可控的方案:模型能跑在自己的设备上,流程能拆开理解,后续也方便接入自己的字幕处理和视频生成工作流。

于是,我分别咨询了 ChatGPT、Gemini 和 Claude等,也查了一些资料。都提到了 Whisper 这一系列方案,包括 OpenAI Whisper、Faster Whisper 和 WhisperX。

简单来说:

  • OpenAI Whisper 是原始方案,适合理解基础能力和命令行流程。
  • Faster Whisper 是基于 CTranslate2 的 Whisper 重新实现,通常速度更快、内存占用更低。
  • WhisperX 在 Whisper 识别结果基础上加入了 forced alignment,可以进一步获得更细的词级时间戳,更适合字幕对齐、逐词高亮和后期制作场景。

综合来看,WhisperX 可能更接近我想要的方向。但按照我的习惯,我不太想一上来就直接使用最终工具,而是希望从 OpenAI Whisper 开始,再到 Faster Whisper,最后再到 WhisperX,逐步理解它们之间的关系、差异和适用场景。

于是,就有了今天这篇文章。下面是我从 OpenAI Whisper 到 Faster Whisper,再到 WhisperX 的本地实践记录,以及我最终的选择和结论。

测试设备如下:

  • MacBook Air 15-inch
  • 芯片:Apple M5
  • 内存:24GB
  • 系统:macOS Tahoe 26.4.1

OpenAI Whisper:从“能识别”到“能制作”的第一步

GitHub Repo

openai/whisper

Robust Speech Recognition via Large-Scale Weak Supervision

Whisper 是 OpenAI 于 2022 年开源的语音识别(ASR,Automatic Speech Recognition)模型。在整个开源 ASR 生态中的影响非常大。很多后来出现的工具,包括:

  • Faster Whisper
  • WhisperX
  • whisper.cpp
  • 各种 WebUI、桌面客户端、字幕工具链

都和 Whisper 有直接关系,或者建立在 Whisper 的模型能力之上。即使到了 2026 年,Whisper 通过开源、模型效果稳定、多语言的完整支持、英文识别质量、社区生态完善等原因,依然是整个开源 ASR 世界里最重要的基座之一。当然,这几年也出现了许多新的选择,可以查看 HuggingFace的排行榜 来了解相关的信息。

环境配置

官方说明:Python3.9 and PyTorch 1.10.1。

实际推荐的范围比较宽松:

我这里使用的是 conda 来隔离测试环境,虽然不一定必须使用 conda,但我还是建议单独创建一个虚拟环境,可以解决很多依赖冲突,特别是本机测试的时候。

# 可选
conda create -n test_whisper python=3.11
conda activate test_whisper
  • 安装 Whisper
pip install -U openai-whisper
  • Whisper 本身并不负责音视频解码,它依赖 ffmpeg,因此还需要安装 ffmpeg,macOS可以采用如下。
brew install ffmpeg
  • Rust 和 tiktoken 的问题,我没有碰到,就不介绍了,若出现,可以查阅官方文档。

模型

Whisper 最经典的模型体系包括:

  • tiny
  • base
  • small
  • medium
  • large

后续社区和 OpenAI 又陆续增加:

  • large-v2
  • large-v3
  • turbo

等变体版本。可以查看Whisper位于HuggingFace 的模型列表,目前共有12个:

模型参数量显存需求特点
tiny39M~1GB极快,但准确率较低
base74M~1GB入门测试
small244M~2GB平衡型
medium769M~5GB较高准确率
large1550M~10GB高质量
turbo809M~6GB大幅优化后的高速版本
  • .en 后缀是英文专用模型,在英文识别上通常会更快一点
    • small.en
    • medium.en
  • 不带 .en 是多语言模型

我使用large-v3-turbo,最新,进行了速度优化,对于我的设备,完全够了。

模型权重不需要单独下载,当执行命令的时候,会自动下载,在macOS,位于:~/.cache/whisper

测试

whisper "test.mp4" \
--model large-v3-turbo \
--language en \
--task transcribe \
--output_format all \
--fp16 False \
--device cpu \
--output_dir .
  • test.mp4:
    • 视频文件,Whisper 会自动调用 ffmpeg 提取音频;
    • 因此:mp4、mov、mkv、mp3、wav 格式都可以;
  • --model large-v3-turbo
    • 指定使用的模型,自动下载;
  • --language en
    • 指定识别语言为英文
    • 不指定,会首先检测语言;
  • --task transcribe
    • 转录
    • 另外一种是翻译
  • --output_format all
    • 内容输出格式:txt、srt、vtt、tsv、json
    • 也可以单独指定某种格式
  • --fp16 False
    • macOS CPU,FP16 并不一定真正加速

int8、FP16、FP32 都是模型计算精度。

类型精度速度内存占用
FP32最高最慢最大
FP16较高较快较小
INT8更低更快更省

结论

在我的设备上:

  • 一个 1 分 48 秒的视频,总耗时约 8 分 44 秒
  • 生成的字幕也存在如下问题:
描述说明
个别时间轴只有 0.18s / 0.2s字幕片段过短 / micro-segment
内容明显重复ASR hallucination / repetition
时间轴被切得异常碎timestamp instability

坦白说,速度并不快,不过当时我的机器同时开着:

  • Chrome
  • Cursor
  • Fork
  • Visual Studio Code
  • 多个后台服务

因此这个结果只能作为参考。同时也能明显感觉到:原版 openai-whisper 更偏向:

  • “官方参考实现”
  • “研究和验证模型能力”

而不是极致工程化优化。这也是后面 Faster Whisper 出现的重要原因之一。

Faster Whisper

GitHub Repo

SYSTRAN/faster-whisper

Faster Whisper transcription with CTranslate2

这也是 LLM 们强烈推荐的一个方案:使用 CTranslate2 对 OpenAI Whisper 进行重新实现。

底层使用的是:CTranslate2 Github,一个专门针对 Transformer 模型做推理优化的高性能推理引擎。

项目Openai WhisperFaster Whisper
本质官方实现Whisper 的高性能重实现
推理框架PyTorchCTranslate2
重点官方参考实现推理优化
CPU 性能一般很强

环境配置

  • Python3.9+
  • 不需要单独安装 ffmpeg 命令行

这一点和原版 Whisper 不太一样,因为它底层使用的是:

  • PyAV:FFmpeg 的 Python Binding。

简单理解:

  • 它内部已经调用了 FFmpeg 的能力;
  • 但不依赖系统里的 ffmpeg 命令。

安装:

pip install faster-whisper

模型

Faster Whisper 使用的是经过 CTranslate2 转换后的 Whisper 权重格式,而不是 PyTorch 原始权重,参见SYSTRAN Whisper Models

  • 它们基于同一个 Whisper 模型体系;
  • 但权重格式并不相同。
  • Openai Whisper 使用 PyTorch 权重;
  • Faster Whisper 使用的是 CTranslate2 转换后的权重。
  • 默认下载位置通常在:~/.cache/huggingface
  • 第一次运行时,会自动下载。
  • 首次下载模型时,会提示:hf auth login,建议配置 HuggingFace Token,提高下载速度

测试

和 Openai Whisper 不同,Faster Whisper 主要通过 Python 代码调用。我这里测试代码如下:

from faster_whisper import WhisperModel
 
video = "test.mp4"
 
model_size = "large-v3-turbo"
 
model = WhisperModel(
    model_size,
    device="cpu",
    compute_type="int8"
)
 
segments, info = model.transcribe(
    video,
    language="en",
    vad_filter=True,
    beam_size=5
)
 
with open("test.srt", "w", encoding="utf-8") as f:
 
    for i, segment in enumerate(segments, start=1):
 
        def fmt(t):
            h = int(t // 3600)
            m = int((t % 3600) // 60)
            s = int(t % 60)
            ms = int((t - int(t)) * 1000)
 
            return f"{h:02}:{m:02}:{s:02},{ms:03}"
 
        f.write(f"{i}\n")
        f.write(f"{fmt(segment.start)} --> {fmt(segment.end)}\n")
        f.write(segment.text.strip() + "\n\n")
  • compute_type="int8"
      • 使用 8 位量化推理;
    • 大幅降低内存占用;
    • CPU 上通常会明显更快。
    • 也支持:float32、float16
  • vad_filter=True
    • Voice Activity Detection,语音活动检测
    • 会尝试自动过滤:静音、空白、非语音片段,原版 Whisper 默认并没有这一层处理。
  • beam_size=5
    • Beam Search 参数。值越大,搜索越充分,准确率可能更高,但速度也会下降。
    • beam_size=5,算是一个比较平衡的值。

结论

视频长度耗时
1m48s32s
19m21s5m58.52s
  • 速度提升效果明显;
  • 偶尔字幕会出现重复,比如:“President Trump posting about the incident on social media” 这句重复,且时间轴错误
18
00:01:20,700 --> 00:01:26,879
President Trump posting about the incident on social media said it goes to show how important it is for presidents and

19
00:01:26,879 --> 00:01:26,959
future presidents to be protected.

20
00:01:26,959 --> 00:01:27,219
The White House needs to be protected.

21
00:01:27,239 --> 00:01:35,900
President Trump posting about the incident on social media said it goes to show how important it is for future presidents to get the most safe and secure space of its kind ever built, referencing his ballroom and what he says will be the security complex underneath.

WhisperX

GitHub Repo

m-bain/whisperX

WhisperX: Automatic Speech Recognition with Word-level Timestamps (& Diarization)

OpenAI Whisper、Faster Whisper 都可以应对:

  • 语音识别
  • 字幕生成,
  • 本地运行
  • 推理速度

等问题,但是对于视频字幕制作来说,时间轴精度是最重要的一个环节,特别是:单词高亮、逐词动画、精细字幕同步等。

Faster Whisper 也支持词级别时间戳,但是 WhisperX 加了 wav2vec2 对齐,实现了高精度词级时间戳,这也是各个 LLM 和搜索引擎推荐的主要原因。

wav2vec 2.0 是 Meta(Facebook)推出的语音模型。

模型更擅长
Whisper语音识别
wav2vec 2.0音频与文字时间对齐

环境配置

  • 建议使用 Conda;
  • 或者单独虚拟环境。

WhisperX 的依赖明显比前面复杂很多。包括:

  • PyTorch
  • torchaudio
  • pyannote
  • transformers
  • faster-whisper
  • CTranslate2

底层库版本,经常互相影响。

pip install whisperx

模型

WhisperX 底层本身就已经集成了 Faster Whisper;

因此它使用的是:CTranslate2 版本 Whisper 模型;

如果你之前已经跑过:Faster Whisper 很多 Whisper 模型文件实际上是可以复用的。通常位于 ~/.cache/huggingface

WhisperX 后续还会继续下载:

  • alignment 模型;
  • wav2vec 2.0 模型;
  • pyannote 模型(如果开启 diarization)

测试

WhisperX 同时支持:

  • CLI
  • Python API
whisperx test.mp4 \
  --model large-v3-turbo \
  --device cpu \
  --compute_type int8 \
  --output_dir . \
  --output_format all \
  --language en

同样的视频,耗时:40.699s

我在测试的时候,还出现如下的警告:

UserWarning: 
torchcodec is not installed correctly so built-in audio decoding will fail. Solutions are:
* use audio preloaded in-memory as a {'waveform': (channel, time) torch.Tensor, 'sample_rate': int} dictionary;
* fix torchcodec installation. Error message was:

Could not load libtorchcodec. Likely causes:
          1. FFmpeg is not properly installed in your environment. We support
             versions 4, 5, 6 and 7

原因是:安装的是 FFmpeg 8.x,但 torchcodec (PyTorch 新一代媒体解码方案)当前只支持 FFmpeg 4~7。暂时可以不用处理。

结论

视频长度耗时
1m48s40.699s
19m21s6m28.11s
  • 比 Faster Whisper 稍微慢了一点点;
  • 在我的测试样本中,没有再出现明显的重复与时间轴异常,如果大规模测试的话,可能还是存在;

暂无目录