[Pipeline 事件总线]:完成语音助手事件模型,包含stage事件、终端reporter和测试覆盖
This commit is contained in:
@@ -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(["第一问", "第二问"])
|
||||
|
||||
Reference in New Issue
Block a user