[Pipeline 状态机]:完成TurnController重构,包含wake到standby闭环和错误恢复

This commit is contained in:
mkbk
2026-06-17 21:29:28 +08:00
parent a251ff379d
commit f9da304568
5 changed files with 364 additions and 7 deletions
+5 -3
View File
@@ -21,7 +21,7 @@ from owner_voice_pet.events import (
)
from owner_voice_pet.llm import MockLlmProvider
from owner_voice_pet.models import AudioFrame, AudioSegment, Transcript
from owner_voice_pet.runtime import LiveVoiceRuntime
from owner_voice_pet.assistant_pipeline import VoiceAssistantPipeline
from owner_voice_pet.transport import MemoryAudioTransport
from owner_voice_pet.tts import SineTtsProvider
from owner_voice_pet.vad import EnergyVadProvider, VadRecorder
@@ -82,7 +82,7 @@ class RecordingReporter:
self.errors.append(f"{stage}:{code}:{message}")
def make_runtime(texts: list[str], context: ConversationContext | None = None) -> tuple[LiveVoiceRuntime, QueueSttProvider, MockLlmProvider, MemoryAudioTransport, RecordingReporter]:
def make_runtime(texts: list[str], context: ConversationContext | None = None) -> tuple[VoiceAssistantPipeline, QueueSttProvider, MockLlmProvider, MemoryAudioTransport, RecordingReporter]:
frames = []
for idx, _text in enumerate(texts):
base_id = idx * 5
@@ -95,7 +95,7 @@ def make_runtime(texts: list[str], context: ConversationContext | None = None) -
tts = SineTtsProvider()
reporter = RecordingReporter()
event_bus = PipelineEventBus()
runtime = LiveVoiceRuntime(
runtime = VoiceAssistantPipeline(
config=AppConfig(llm_api_key="secret", speech_provider="cloud", post_playback_drain_ms=0),
transport=transport,
wakeword=KeywordWakeWordProvider(),
@@ -113,6 +113,8 @@ def make_runtime(texts: list[str], context: ConversationContext | None = None) -
class LiveRuntimeTests(unittest.TestCase):
def test_repeated_runtime_runs_two_turns_and_returns_to_standby(self) -> None:
runtime, stt, llm, transport, reporter = make_runtime(["第一问", "第二问"])
self.assertIsInstance(runtime, VoiceAssistantPipeline)
self.assertIsNotNone(runtime.controller)
summary = runtime.run(max_turns=2)
self.assertEqual(summary.completed_turns, 2)