文章

字幕时间轴为什么会漂:VAD 分块、局部时间戳与确定性排版

拆解长音频字幕的时间轴设计:如何把分块 ASR 的局部词级时间戳映射回原始媒体,并避免翻译破坏同步。

字幕时间轴为什么会漂:VAD 分块、局部时间戳与确定性排版

ASR 能输出正确文字,不代表能生成可用字幕。长音频经过 VAD 切块后,模型看到的是一段段从零开始的局部 WAV;播放器需要的却是完整媒体上的绝对时间。两者之间只要少加一次 offset、混用秒与毫秒,或者在合并 chunk 时丢掉静音区间,字幕就会越播越偏。

qwen3-asr-subtitle-studio 中,我把时间轴当成独立的数据工程问题,而不是 ASR 文本的附属字段。

标准化音轨是统一坐标系

所有输入先经 FFmpeg 转成 16 kHz 单声道 WAV。这样 VAD、切块和 ASR 面对的是同一个采样率与声道布局。原始视频可能有可变帧率、多音轨、不同编码和容器时间基;如果各步骤分别解释媒体,毫秒坐标很容易不一致。

标准 WAV 成为后端的唯一音频坐标系。媒体探测结果会记录时长等元数据,后续任何 segment 都必须落在 [0, duration] 范围内,并满足开始时间小于结束时间。

VAD 决定 chunk,不能删除时间

Silero VAD 找到语音区间,再由 chunk builder 合并过短片段、控制最大长度并导出连续 chunk。这里的“删除静音”只发生在送给 ASR 的文件层面,原音轨上的绝对起止位置必须保留。

假设第二个 chunk 对应原音轨的 125.4–158.7 秒,ASR 返回局部词时间 2.1–2.6 秒,那么完整时间轴就是 127.5–128.0 秒。基本公式很简单:

1
2
absolute_start = chunk_start + local_start
absolute_end   = chunk_start + local_end

真正复杂的是输入兼容。外部服务可能返回 start_ms/end_ms,也可能返回以秒为单位的 start_time/end_timestart/end;列表还可能包在 valuedata 字段里。适配器先统一解析和单位,再交给 mapper,避免业务层到处猜测格式。

Forced Aligner 是字幕契约的一部分

工作台要求 Qwen3-ASR 启用 Forced Aligner,并返回词或字级时间戳。仅有整段文本和 chunk 边界时,也许能把文字平均摊开,但那只是视觉近似:说话速度变化、停顿和中英混排都会让误差明显。

后端已经先做了一次 VAD,所以 ASR 服务不需要再次切分音频。重复 VAD 会让服务端重新裁边,局部坐标与上传 chunk 的长度发生偏差,映射回完整音轨时就更难解释。

时间戳解析必须 fail closed。无法识别的单位、缺少起止字段、负值、逆序或明显超出 chunk 的数据都应报错并保留原始响应,以便只重试该 chunk。静默猜测看起来“完成率更高”,代价却是用户在成片末尾才发现同步已经崩坏。

翻译不能拥有时间轴写权限

LLM 擅长翻译和润色,但它并不知道声音在哪一帧发生。工作台给每段文字稳定 ID,要求模型返回数量、顺序和 ID 完全一致的结构化 JSON。时间戳不进入可修改字段。

长内容按 batch 处理,后一批可以携带前一批完成文本作为语境,改善人名和术语连续性。上下文只用于生成,不改变已经落盘的前序 segment。这样即使某个 batch 失败,也可以局部重试,不会让整个时间轴重新编号。

对“保守润色”也需要同样约束。字幕不是文章,任意扩写会增加阅读速度并破坏画面同步。提示词应要求忠实、口语自然和长度克制,服务端则继续检查 segment 集合没有增删。

排版应当确定,而不是再次生成

ASR 的词级时间戳最终要组合成可读字幕。行宽、每条持续时间、间隔和标点断句可以由确定性规则处理;同样输入应得到同样结果。这样人工编辑、测试和重新导出才可比较。

人工界面允许合并、拆分、新增、删除,并分别锁定文本与排版。文本锁保护校正后的内容,排版锁保护人工调整的断句和时间边界。自动步骤再次运行时跳过相应字段,避免“修一个错,带回三个旧错”。

导出前还应做最后 QA:时间非负、段落有序、同轨不重叠、结束不超过媒体时长、文本非空、阅读速度不过分夸张。SRT、VTT 与 ASS 只是不同序列化格式,真正可信的资产是此前已经验证的统一 segment 模型。

字幕时间轴的关键不在于更复杂的模型,而在于守住坐标系和所有权:VAD 定义语音块,aligner 提供块内证据,mapper 负责绝对时间,LLM 只改文字,人工锁定最终决定。职责一旦混在一起,漂移就只是时间问题。

项目地址:cyijun/qwen3-asr-subtitle-studio

本文由作者按照 CC BY 4.0 进行授权