fix: whisper 重复伪影整条删除,避免翻译层空响应失败

whisper 在单个窗口内卡住重复时会把一个单元写满整条 cue(实测 30 秒整、重复
74–446 次,如 `チン`×111)。这类正文会让下游 LLM 跟着循环、把输出预算耗在思考上,
最终 `content` 返回空串并报 `translation alignment failed … Expecting value:
line 1 column 1 (char 0)`;它也可能直接渲染成超长字幕行。

- `nodes/subtitle_cleanup.py` 新增 `remove_repetition_entries`:**纯模式判据、无字符
  词表**——展示时长 ≥15s 且同一 1–6 字单元连续重复 ≥6 次且覆盖正文 ≥70% 的 cue 整条
  删除;真实短促呻吟(`ぇ`×15、`ああああああ`)靠时长区分,零误删。
- `nodes/whisper.py` 在转写产出处应用该清洗(VAD 开关都生效,它与套话幻觉无关)。
- 真实数据验证:本地全部真实转写 3605 条 cue 只删 5 条 30 秒伪影;对照实验同批次
  伪影截短后 5/5 成功、原样 1/5。
This commit is contained in:
2026-09-18 22:23:25 +08:00
parent f656ec98c5
commit 3f4478523e
6 changed files with 247 additions and 12 deletions
@@ -0,0 +1,53 @@
{
"artifacts": [
{
"start": "00:10:00,064",
"end": "00:10:30,064",
"text": "チンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチンチ",
"repeats": 111,
"unit": "チン"
},
{
"start": "00:36:29,999",
"end": "00:36:59,999",
"text": "ああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああ",
"repeats": 446,
"unit": "あ"
},
{
"start": "00:40:20,199",
"end": "00:40:50,199",
"text": "ハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハッハ",
"repeats": 111,
"unit": "ハッ"
}
],
"moans": [
{
"start": "00:01:28,832",
"end": "00:01:31,252",
"text": "しゅしゅしゅしゅしゅしゅしゅ",
"repeats": 7,
"unit": "しゅ"
},
{
"start": "00:01:31,991",
"end": "00:01:33,991",
"text": "しゅしゅしゅしゅしゅしゅ",
"repeats": 6,
"unit": "しゅ"
},
{
"start": "00:03:00,096",
"end": "00:03:02,276",
"text": "ウウウウウウウウウウ",
"repeats": 10,
"unit": "ウ"
}
],
"normal": {
"start": "00:00:12,000",
"end": "00:00:15,000",
"text": "そんなにご褒美欲しかったの?"
}
}