[Pipeline 事件总线]:完成语音助手事件模型,包含stage事件、终端reporter和测试覆盖

This commit is contained in:
mkbk
2026-06-17 21:26:30 +08:00
parent 1ee9f8ba95
commit a251ff379d
5 changed files with 187 additions and 16 deletions
+34
View File
@@ -4,6 +4,21 @@ import unittest
from owner_voice_pet.config import AppConfig
from owner_voice_pet.conversation import ConversationContext
from owner_voice_pet.events import (
ACK_STARTED,
CAPTURE_STARTED,
LLM_STARTED,
PLAYBACK_FINISHED,
SPEECH_ENDED,
SPEECH_STARTED,
STANDBY_RESUMED,
STT_STARTED,
TRANSCRIPT_FINAL,
TTS_STARTED,
WAKE_DETECTED,
WAKE_LISTENING,
PipelineEventBus,
)
from owner_voice_pet.llm import MockLlmProvider
from owner_voice_pet.models import AudioFrame, AudioSegment, Transcript
from owner_voice_pet.runtime import LiveVoiceRuntime
@@ -79,6 +94,7 @@ def make_runtime(texts: list[str], context: ConversationContext | None = None) -
llm = MockLlmProvider(["这是答复。"])
tts = SineTtsProvider()
reporter = RecordingReporter()
event_bus = PipelineEventBus()
runtime = LiveVoiceRuntime(
config=AppConfig(llm_api_key="secret", speech_provider="cloud", post_playback_drain_ms=0),
transport=transport,
@@ -89,6 +105,7 @@ def make_runtime(texts: list[str], context: ConversationContext | None = None) -
tts=tts,
context=context or ConversationContext(),
reporter=reporter,
event_bus=event_bus,
)
return runtime, stt, llm, transport, reporter
@@ -108,6 +125,23 @@ class LiveRuntimeTests(unittest.TestCase):
self.assertLess(reporter.statuses.index("应答中:我在"), reporter.statuses.index("请说出问题"))
self.assertLess(reporter.statuses.index("请说出问题"), reporter.statuses.index("录音中:正在听取问题"))
self.assertIn("恢复待机:可继续唤醒", reporter.statuses[-1])
event_types = [event.type for event in runtime.event_bus.events]
expected_order = [
WAKE_LISTENING,
WAKE_DETECTED,
ACK_STARTED,
CAPTURE_STARTED,
SPEECH_STARTED,
SPEECH_ENDED,
STT_STARTED,
TRANSCRIPT_FINAL,
LLM_STARTED,
TTS_STARTED,
PLAYBACK_FINISHED,
STANDBY_RESUMED,
]
positions = [event_types.index(item) for item in expected_order]
self.assertEqual(positions, sorted(positions))
def test_temporary_context_is_sent_to_second_llm_call(self) -> None:
runtime, _, llm, _, _ = make_runtime(["第一问", "第二问"])