ComfyUI集成Whisper实现高效字幕生成:从配置到性能优化实战
做视频后期最怕什么?我投“对字幕”一票。
传统流程里,先 FFmpeg 抽音频→Audition 切噪音→人工听写→Aegisub 打轴→再 FFmpeg 压回视频,一条 10 分钟短片就能耗掉一下午。更惨的是客户临时改一版文案,全部重来。
去年我把 OpenAI Whisper 塞进 ComfyUI,让整条链路变成“拖视频→点运行→收带字幕 MP4”,同长度片子从 90 分钟手工降到 12 分钟自动,效率直接翻 7 倍。今天把踩过的坑、调优笔记全部打包,给你一份能直接落地的 cook-book。
1. 背景痛点:手工字幕的“三高一低”
- 高耗时:纯听写,每分钟视频≈3 分钟人工,语速快或带口音时翻倍。
- 高错误:听错、打错、时间戳错位,返工率 15 % 以上。
- 高重复:一旦视频剪一刀,时间轴全乱,字幕要重对。
FFmpeg 方案只能“切”与“压”,无法产生文本;调用云端 ASR 又面临排队、限流、费用三座大山。Whisper 本地跑虽然吃 GPU,但一次部署无限量、无 QPS 限制,长视频也能夜里批量跑。ComfyUI 的节点式画布正好把“抽音→识别→对齐→烧录”串成可视化工作流,改参数就像调色阶一样拖拉拽,这才有了把 Whisper 塞进去的想法。
2. 技术架构:一张图看懂数据怎么流
核心只有 3 个自定义节点:
- AudioExtract– 把任意视频轨抽成 16 kHz WAV,返回帧率与采样点。
- WhisperASR– 加载 Whisper 模型,输出带时间戳的 subtitle list。
- BurnSub– 用 ffmpeg-python 把字幕画到 x264 编码的新视频。
ComfyUI 的 Execution Engine 负责调度:
- 上游节点输出
AUDIO_PATH+META_DICT - WhisperASR 消费后吐出
SUB_PATH - BurnSub 再把最终视频写进
output/
整个流程零中间手工文件,节点缓存机制保证重复运行只算增量。
3. 核心代码:30 行搞定模型加载 + 事件回调
下面片段直接拷进custom_nodes/whisper_node.py就能被 ComfyUI 识别,Python≥3.8,Torch≥2.0 测试通过。
3.1 模型懒加载与内存管理
import whisper, os, torch, functools from comfy.model_management import get_torch_device, soft_empty_cache _MODELS = {} # 全局缓存,key=model_name def load_model(name="base"): if name in _MODELS: return _MODELS[name] device = get_torch_device() model = whisper.load_model(name, device=device) _MODELS[name] = model return model要点:
- 用 ComfyUI 自带的
get_torch_device()自动识别 CUDA/MPS/CPU,节点在笔记本和服务器间迁移不用改代码。 - 全局缓存避免每次运行都 IO,长视频批量跑时尤其明显。
3.2 节点入口与事件处理
class WhisperASR: @classmethod def INPUT_TYPES(cls): return {"required": { "audio": ("AUDIO_PATH",), "model": (["tiny", "base", "small"], {"default": "base"}), "language": ("STRING", {"default": "zh"}), "beam_size": ("INT", {"default": 5, "min": 1, "max": 20}), "temperature": ("FLOAT", {"default": 0.0, "step": 0.1})}} RETURN_TYPES = ("SUB_PATH",) FUNCTION = "transcribe" CATEGORY = "audio" def transcribe(self, audio, model, language, beam_size, temperature): model = load_model(model) result = model.transcribe( audio, language=None if language == "auto" else language, beam_size=beam_size, temperature=temperature, word_timestamps=True, initial_prompt="简体中文字幕" if language == "zh" else "" ) sub_path = audio.replace(".wav", ".srt") self.to_srt(result["segments"], sub_path) soft_empty_cache() # 立即释放 GPU return (sub_path,) @staticmethod def to_srt(segments, path): with open(path, "w", encoding="utf-8") as f: for i, seg in enumerate(segments, 1): f.write(f"{i}\n") f.write(f"{seg['start']:.3f} --> {seg['end']:.3f}\n") f.write(f"{seg['text'].strip()}\n\n")参数说明:
beam_size越大越准也越慢,5 是官方默认,中文访谈 7 足够。temperature>0会开启采样,适合创意场景,字幕建议锁 0 保证一致。word_timestamps=True把颗粒度压到词级,方便后续对齐。
3.3 字幕与视频帧同步算法
Whisper 返回的是音频时间,但视频后期常剪掉头尾黑场,直接烧录会错位。我的策略:抽音频时记录start_pts(第一个视频帧的 presentation timestamp),再把每条字幕的start/end统一减去该值,最后调用 ffmpeg 的-itsoffset做整体偏移,误差控制在 40 ms 以内,肉眼无感。
4. 性能优化:让 1 小时视频 5 分钟跑完
4.1 音频分块策略
Whisper 对 30 min 以上音频一次性推理会 OOM。先按静音点切成 ≤120 s 的 chunk,再批量喂模型。
- 用
webrtcvad找语音活动段,阈值 0.5,兼顾速度与精度。 - 每段 overlap 0.5 s,防止切词。
4.2 GPU 内存监控与自动释放
def gpu_mem_get(): return torch.cuda.memory_allocated() / 1024**3 def auto_gc(threshold=7.5): if gpu_mem_get() > threshold: soft_empty_cache() torch.cuda.empty_cache()在transcribe()每处理完一个 chunk 后调用,显存稳压在 6 GB 以下,RTX 3060 也能跑 small 模型。
4.3 多进程批处理
ComfyUI 默认单图流,但长视频可拆多条任务。我写了一个BatchWhisper节点,一次性接收目录,再用concurrent.futures.ProcessPoolExecutor把 chunk 分发给 4 进程,IO 与 GPU 重叠。实测 60 min / 1080p 视频,RTF(Real-Time Factor)从 0.28 降到 0.06,相当于 15 分钟素材 55 秒出结果。
5. 避坑指南:踩过的坑,一个比一个酸
- API 限流– 若你偷懒用官方 Whisper API,免费额度 100 file/天,跑 10 集剧集就熄火;本地模型虽吃显卡,但长痛不如短痛。
- 模型选择– tiny 速度飞快,中文 WER 能到 18 %;base 降到 9 %;small 再降到 5 %,但显存翻倍。访谈类 base 足够,教学视频推荐 small。
- 时间戳精度– Whisper 原生 20 ms 步进,遇到连读容易提前 100 ms。可在后处理里用动态规划把字幕边界对齐到静音谷点,误差 <2 帧(33 ms)。
6. 扩展思考:把 VAD 再往前推一步
Whisper 自带语音检测,但模型大、调用重。先用轻量 VAD(如 Silero VAD 3.0)预筛静音段,只送有效区间给 Whisper,能再省 25 % 计算量。思路:
- Silero VAD 给出 0/1 标签 → 合并连续 1 得到语音段 → 每段前后留 0.3 s 缓冲 → 送入 Whisper。
- 对直播录屏、会议录像这类“大段静音”场景,RTF 能再降 40 %。
ComfyUI 的好处是节点即插即用,你把 Silero 封装成另一个节点,连根线就能 A vignette 测试,非常爽。
7. 性能测试数据小结(RTX 4070 / i7-12700)
| 模型 | 显存峰值 | RTF↓ | 中文 WER↓ | 备注 |
|---|---|---|---|---|
| tiny | 2.1 GB | 0.03 | 18.4 % | 实时流 prototype |
| base | 3.8 GB | 0.06 | 9.1 % | 日常 Vlog 首选 |
| small | 6.1 GB | 0.12 | 5.0 % | 课程、纪录片 |
| medium | 11.9 GB | 0.25 | 3.2 % | 需 24 GB 卡,字幕交印厂 |
(RTF=识别耗时/视频时长,数值越小越快)
8. 小结:把 7 小时夜班变成 1 杯咖啡时间
实践半年,最大的感受是“流程比模型更重要”。Whisper 只解决了 ASR 精度,真正的提效是把抽音、对齐、压字幕全部串进 ComfyUI 的自动化管线。如今给 UP 主做字幕外包,单条 10 分钟报价从 80 元降到 15 元还能赚,客户改文案只需改节点参数,10 分钟重新出片,再也不怕“甲方凌晨两点说加个字”。
如果你也在视频后期里被字幕折磨,不妨把这套节点拖回去试试;下一步我准备把 VAD + Whisper + 翻译 + 多语烧录做成一键模板,让双语字幕同样“喝杯咖啡就好”。祝各位跑显存不爆、甲方不催,我们评论区交流新坑。