Repository navigation
v0.7.5 — 四级字幕时间轴重建:修掉「播放本句只有 1 秒」
v0.7.5 — 字幕时间轴重建:修掉「播放本句只有 1 秒」
这次修什么
v0.7.4 修好了四级字幕的文本(找回 26% 丢失内容、补回标点、修好题号结构),但时间轴坏了:
- 145 行被压成 0.5 秒(41/49 课),点「播放本句」只能听到一小段甚至静音
- 典型:#1038 的
Question 1只占 0.98 秒,而紧随的Question 2占了 27.92 秒 - 887 行(9.5%)的时间区间落在音频静音上
原因是 whisper 对整段 20 分钟音频做分段时,段边界会横跨 15~20 秒的答题停顿;字幕行按字符比例铺在这段上,就被摊进了静音。
怎么修的
按长停顿切块重做时间轴,文本一个字没改:
- 能量检测找出真实语音段(-48 dBFS)
- 按 >3 秒的停顿切块,块内再按最大停顿切成 ≤55 秒的小块
- 每个小块:MiMo 转写拿准确文本,whisper 拿词级时间,两者对齐
- 全课词序与现有字幕文本对齐,重建每行起止
- 行边界吸附到真实语音段
cet4 共 49 课、1920 次 MiMo 调用、0 失败。
验证结果
| 指标 | 修前 | 修后 |
|---|---|---|
| 压缩行(<0.1 秒/词) | 145 | 0 |
| 落在静音的行 | 887(9.5%) | 76(0.8%) |
| 完全落在静音 | 287 | 47(多为 "A." "B." 这类不朗读的选项标签) |
门禁全过:
node scripts/audit/check-invariants.mjs # 87/87 PASS
node scripts/audit/check-duration-sanity.mjs # 0 违例
node scripts/audit/check-timeline-speech-overlap.mjs cet4 # 0.8% PASS
node scripts/audit/check-timeline-speech-overlap.mjs cet6 # 0.2% PASS题号覆盖仍是 cet4 392 组 / cet6 266 组、零缺题;时间戳单调、无重叠、无负时长。
抽检 4 条随机样本,把新窗口切出来单独做 ASR,结果与字幕文本逐字一致:
#1002 l19 字幕 Question one: Why were many passengers stranded at the railway station?
音频 Question 1. Why were many passengers stranded at the railway station?
#1038 l20 字幕 Question 1: What may be the reason that friends are similar...
音频 Question 1. What may be the reason that friends are similar...
新增门禁
scripts/audit/check-timeline-speech-overlap.mjs —— 按能量检测语音段,检查每行时间是否真的落在语音上。现有门禁只查时间戳自洽(单调/不重叠/正时长),查不出这类问题。
影响范围
- 只有
presets/cet4/seed.json的时间戳变化(v20261021.2 → v20261022.3),文本、译文、题号、锚点结构全部不动 scripts/audit/data-contract.mjs修了saveTranscript的写盘目标:原来硬编码 cet6,写四级会覆盖 cet6 seed- 六级语料本次未改(其时间轴本来就正常)