[全双工打断]:完成常驻打断控制器,包含播放取消、推理取消和低延迟验收

This commit is contained in:
mkbk
2026-06-19 12:28:20 +08:00
parent af2de5ec66
commit f31e3d89d6
6 changed files with 290 additions and 9 deletions
+23
View File
@@ -5,6 +5,7 @@ import unittest
from pathlib import Path
from owner_voice_pet.agent_memory import FakeMemoryManager, MemoryRecordInput, SQLiteMemoryManager
from owner_voice_pet.config import AppConfig
from owner_voice_pet.full_duplex_audio import FakeWebRtcAudioProcessingProvider, RenderReferenceRingBuffer
from owner_voice_pet.full_duplex_control import CancellationGraph, FullDuplexStateMachine
from owner_voice_pet.full_duplex_response import (
@@ -15,6 +16,7 @@ from owner_voice_pet.full_duplex_response import (
SentenceSegmenter,
)
from owner_voice_pet.full_duplex_speech import FakeStreamingSttProvider, FakeVadProvider, InterruptionDetector, TranscriptEvent
from owner_voice_pet.full_duplex_runtime import FullDuplexAgentRuntime
from owner_voice_pet.full_duplex_testing import (
PerformanceMetricRecorder,
build_fake_full_duplex_audio_fixture,
@@ -70,6 +72,27 @@ class FullDuplexIntegrationTests(unittest.TestCase):
self.assertTrue(graph.root.cancelled)
self.assertEqual(machine.current_state, PipelineState.LISTENING)
def test_full_duplex_runtime_interrupt_fixture_uses_audio_hub_and_buffers_user_audio(self) -> None:
runtime = FullDuplexAgentRuntime(
config=AppConfig(
audio_apm_provider="fake",
audio_apm_required=False,
barge_in_min_speech_ms=200,
)
)
fixture = build_fake_full_duplex_audio_fixture()[1:3]
summary = runtime.run_interrupt_fixture(fixture, initial_state=PipelineState.SPEAKING)
self.assertTrue(summary.interrupted)
self.assertTrue(runtime.cancellation_graph.root.cancelled)
self.assertEqual(runtime.state_machine.current_state, PipelineState.LISTENING)
self.assertIsNotNone(runtime.interrupt_controller)
self.assertEqual(
[item.frame_id for item in runtime.interrupt_controller.buffered_user_frames],
[2, 3],
)
def test_streaming_stt_llm_tts_playback_order(self) -> None:
stt = FakeStreamingSttProvider(
scripted_events=[