[低延迟端点]:完成首句保留和快速结束修正,包含ACK缓冲策略、批量读帧和主说话人端点回归测试

This commit is contained in:
mkbk
2026-06-17 22:04:25 +08:00
parent e74ec28e7d
commit a64bb86da4
15 changed files with 136 additions and 15 deletions
+32 -1
View File
@@ -116,9 +116,10 @@ class WakeVadSttTests(unittest.TestCase):
provider.load()
recorder = PrimarySpeakerVadRecorder(
provider,
min_duration_ms=40,
min_duration_ms=250,
end_silence_ms=1000,
speaker_profile_ms=40,
speaker_profile_min_ms=40,
speaker_absent_ms=40,
)
frames = [
@@ -142,6 +143,35 @@ class WakeVadSttTests(unittest.TestCase):
self.assertEqual(consumed, 4)
self.assertEqual(segment.metadata["transcript"], "你是谁")
def test_primary_speaker_endpoint_does_not_wait_for_vad_min_duration(self) -> None:
provider = EnergyVadProvider()
provider.load()
recorder = PrimarySpeakerVadRecorder(
provider,
min_duration_ms=1000,
end_silence_ms=1000,
speaker_profile_ms=120,
speaker_profile_min_ms=40,
speaker_absent_ms=40,
)
frames = [
make_frame(1, 0, speech=True, metadata={"speaker_id": "owner", "transcript": "你在做什么"}),
make_frame(2, 20, speech=True, metadata={"speaker_id": "owner"}),
make_frame(3, 40, speech=True, metadata={"speaker_id": "background"}),
make_frame(4, 60, speech=True, metadata={"speaker_id": "background"}),
make_frame(5, 80, speech=True, metadata={"speaker_id": "owner", "transcript": "第二次重复"}),
]
segment = None
for item in frames:
result = recorder.feed(item)
if isinstance(result, AudioSegment):
segment = result
break
self.assertIsNotNone(segment)
assert segment is not None
self.assertEqual(segment.metadata["end_reason"], "primary_speaker_absent")
self.assertEqual(segment.metadata["transcript"], "你在做什么")
def test_primary_speaker_endpoint_allows_short_pause(self) -> None:
provider = EnergyVadProvider()
provider.load()
@@ -150,6 +180,7 @@ class WakeVadSttTests(unittest.TestCase):
min_duration_ms=40,
end_silence_ms=1000,
speaker_profile_ms=40,
speaker_profile_min_ms=40,
speaker_absent_ms=60,
)
frames = [