feat: whisper 节点自动接入自适应 VAD + 方案文档

- nodes/whisper.py:invoke 检测到 vad_filter=true 且未显式传 vad_parameters
  且 WOV_AUTO_VAD=1 时,自动调用 vad_profiler.vad_parameters_for_audio 按
  本音频信号动态确定 VAD 参数并传给 transcribe;分析失败回退默认不中断转写
  (防御性,不影响整段流程)。
- tests/test_nodes.py:新增自动 VAD 异常回退测试(patch profiler 抛错,
  验证 whisper 正常转写 + transcribe 收到 vad_parameters=None)。
- docs/adaptive_vad.md:完整方案文档(背景/可行性/三层架构/参数建议规则/
  评分器/实现落点/取舍/实现状态)。
This commit is contained in:
2026-09-06 08:15:13 +08:00
parent d0d96a8f89
commit 2c3c356348
3 changed files with 151 additions and 1 deletions
+21
View File
@@ -1002,6 +1002,27 @@ def test_whisper_segment_logs_full_video_time(caplog, tmp_path, monkeypatch) ->
assert any("分段 #1: 00:00:00,000 --> 00:00:01,000" in m for m in seg_logs)
assert any(m.startswith("分段 #3: 00:01:00,000") for m in seg_logs)
def test_whisper_auto_vad_fallback_on_error(tmp_path, monkeypatch) -> None:
"""自动 VAD 分析抛异常时,whisper 回退默认参数正常转写(防御性)。"""
import nodes.whisper as whisper_mod
def _boom(*args, **kwargs):
raise RuntimeError("auto vad analysis failed")
# 使 nodes.vad_profiler.vad_parameters_for_audio 抛异常(whisper.py 函数内 import)。
monkeypatch.setattr(
"nodes.vad_profiler.vad_parameters_for_audio", _boom, raising=False,
)
_install_fake_whisper(monkeypatch)
_make_wav(tmp_path / "audio.wav", 5)
response = whisper_invoke(
_whisper_request(tmp_path, params={"language": "ja", "vad_filter": True, "sample_rate": 16000})
)
assert response.status == "completed"
# 回退默认:transcribe 收到 vad_parameters=None。
_, kwargs = FakeWhisperModel.instances[-1]
assert kwargs.get("vad_parameters") is None
def test_wav_duration_fallback_on_invalid_file(tmp_path) -> None:
"""验证读取时长时,损坏/缺失文件回退 fallback 值(真实非法文件,非占位字节)。"""