[结束提示音]:完成对话结束音效提示,包含本地短音生成、恢复待机播放和配置测试
This commit is contained in:
@@ -46,6 +46,8 @@ class CliAcceptanceTests(unittest.TestCase):
|
||||
self.assertEqual(data["endpoint_mode"], "primary_speaker")
|
||||
self.assertEqual(data["realtime_transcript_idle_timeout_ms"], 1500)
|
||||
self.assertEqual(data["context_mode"], "session_memory")
|
||||
self.assertTrue(data["end_chime_enabled"])
|
||||
self.assertEqual(data["end_chime_duration_ms"], 140)
|
||||
self.assertNotIn("secret-value", str(data))
|
||||
|
||||
def test_security_check_command_has_no_leaks(self) -> None:
|
||||
|
||||
@@ -269,8 +269,10 @@ class LiveRuntimeTests(unittest.TestCase):
|
||||
self.assertEqual(runtime.config.post_playback_drain_ms, 0)
|
||||
self.assertEqual(len(stt.calls), 2)
|
||||
self.assertEqual(len(llm.calls), 2)
|
||||
self.assertEqual(len(transport.played_segments), 4)
|
||||
self.assertEqual(transport.flush_count, 4)
|
||||
self.assertEqual(len(transport.played_segments), 6)
|
||||
self.assertEqual(transport.flush_count, 6)
|
||||
self.assertEqual(transport.played_segments[2].metadata["chime"], "end")
|
||||
self.assertEqual(transport.played_segments[5].metadata["chime"], "end")
|
||||
self.assertEqual(reporter.transcripts, ["第一问", "第二问"])
|
||||
self.assertIn("应答中:我在", reporter.statuses)
|
||||
self.assertLess(reporter.statuses.index("唤醒命中"), reporter.statuses.index("应答中:我在"))
|
||||
@@ -324,7 +326,7 @@ class LiveRuntimeTests(unittest.TestCase):
|
||||
self.assertEqual(summary.completed_turns, 2)
|
||||
self.assertEqual(ack_tts.synthesized_texts, ["我在"])
|
||||
self.assertEqual(transport.played_segments[0].metadata["text"], "我在")
|
||||
self.assertEqual(transport.played_segments[2].metadata["text"], "我在")
|
||||
self.assertEqual(transport.played_segments[3].metadata["text"], "我在")
|
||||
|
||||
def test_zero_post_playback_drain_flushes_without_dropping_prefilled_question(self) -> None:
|
||||
runtime, stt, _, transport, reporter = make_runtime(["第一问"])
|
||||
@@ -335,7 +337,8 @@ class LiveRuntimeTests(unittest.TestCase):
|
||||
self.assertEqual(summary.completed_turns, 1)
|
||||
self.assertEqual(reporter.transcripts, ["第一问"])
|
||||
self.assertEqual(len(stt.calls), 1)
|
||||
self.assertEqual(transport.flush_count, 2)
|
||||
self.assertEqual(transport.flush_count, 3)
|
||||
self.assertEqual(transport.played_segments[-1].metadata["chime"], "end")
|
||||
|
||||
def test_no_ack_text_does_not_drain_before_capture(self) -> None:
|
||||
runtime, stt, _, transport, reporter = make_runtime(["第一问"], wake_ack_text="")
|
||||
@@ -345,8 +348,9 @@ class LiveRuntimeTests(unittest.TestCase):
|
||||
self.assertEqual(summary.completed_turns, 1)
|
||||
self.assertEqual(reporter.transcripts, ["第一问"])
|
||||
self.assertEqual(len(stt.calls), 1)
|
||||
self.assertEqual(len(transport.played_segments), 1)
|
||||
self.assertEqual(transport.flush_count, 1)
|
||||
self.assertEqual(len(transport.played_segments), 2)
|
||||
self.assertEqual(transport.flush_count, 2)
|
||||
self.assertEqual(transport.played_segments[-1].metadata["chime"], "end")
|
||||
|
||||
def test_temporary_context_is_sent_to_second_llm_call(self) -> None:
|
||||
runtime, _, llm, _, _ = make_runtime(["第一问", "第二问"])
|
||||
@@ -593,6 +597,7 @@ class LiveRuntimeTests(unittest.TestCase):
|
||||
self.assertIn(FOLLOWUP_TIMEOUT, event_types)
|
||||
self.assertEqual(event_types[-1], STANDBY_RESUMED)
|
||||
self.assertEqual(len(llm.calls), 1)
|
||||
self.assertEqual(transport.played_segments[-1].metadata["chime"], "end")
|
||||
|
||||
def test_completed_reply_returns_to_standby_without_cloud_classifier_delay(self) -> None:
|
||||
frames = [wake_frame(0, 0)]
|
||||
|
||||
@@ -113,6 +113,9 @@ class ModelsConfigTests(unittest.TestCase):
|
||||
self.assertTrue(config.barge_in_enabled)
|
||||
self.assertEqual(config.barge_in_min_speech_ms, 250)
|
||||
self.assertEqual(config.barge_in_echo_guard_ms, 500)
|
||||
self.assertTrue(config.end_chime_enabled)
|
||||
self.assertEqual(config.end_chime_frequency_hz, 880)
|
||||
self.assertEqual(config.end_chime_duration_ms, 140)
|
||||
self.assertTrue(config.llm_stream)
|
||||
self.assertEqual(config.validate_basic(), [])
|
||||
|
||||
@@ -153,6 +156,8 @@ class ModelsConfigTests(unittest.TestCase):
|
||||
followup_listen_timeout_ms=-1,
|
||||
barge_in_min_speech_ms=-1,
|
||||
barge_in_echo_guard_ms=-1,
|
||||
end_chime_frequency_hz=0,
|
||||
end_chime_duration_ms=0,
|
||||
)
|
||||
errors = config.validate_basic()
|
||||
|
||||
@@ -161,6 +166,8 @@ class ModelsConfigTests(unittest.TestCase):
|
||||
self.assertTrue(any("OWNER_FOLLOWUP_LISTEN_TIMEOUT_MS" in error.message for error in errors))
|
||||
self.assertTrue(any("OWNER_BARGE_IN_MIN_SPEECH_MS" in error.message for error in errors))
|
||||
self.assertTrue(any("OWNER_BARGE_IN_ECHO_GUARD_MS" in error.message for error in errors))
|
||||
self.assertTrue(any("OWNER_END_CHIME_FREQUENCY_HZ" in error.message for error in errors))
|
||||
self.assertTrue(any("OWNER_END_CHIME_DURATION_MS" in error.message for error in errors))
|
||||
|
||||
def test_speaker_similarity_threshold_range_is_validated(self) -> None:
|
||||
config = AppConfig(speaker_similarity_threshold=1.5)
|
||||
|
||||
@@ -12,7 +12,7 @@ from owner_voice_pet.models import AudioFrame, ErrorCode, Message, PipelineState
|
||||
from owner_voice_pet.pipeline import VoicePipeline
|
||||
from owner_voice_pet.stt import MetadataSttProvider
|
||||
from owner_voice_pet.transport import MemoryAudioTransport
|
||||
from owner_voice_pet.tts import CloudTtsProvider, SentenceBuffer, SineTtsProvider, sanitize_tts_text
|
||||
from owner_voice_pet.tts import CloudTtsProvider, SentenceBuffer, SineTtsProvider, make_prompt_chime, sanitize_tts_text
|
||||
from owner_voice_pet.vad import EnergyVadProvider, VadRecorder
|
||||
from owner_voice_pet.wakeword import KeywordWakeWordProvider
|
||||
|
||||
@@ -73,6 +73,13 @@ class PipelineLlmTtsTests(unittest.TestCase):
|
||||
self.assertGreater(len(segment.pcm), 0)
|
||||
self.assertGreater(segment.duration_ms, 0)
|
||||
|
||||
def test_prompt_chime_generates_short_pcm_audio(self) -> None:
|
||||
segment = make_prompt_chime(frequency_hz=880, duration_ms=140, sample_rate=16000, channels=1)
|
||||
|
||||
self.assertEqual(segment.duration_ms, 140)
|
||||
self.assertEqual(segment.metadata["chime"], "end")
|
||||
self.assertGreater(len(segment.pcm), 0)
|
||||
|
||||
def test_cloud_tts_posts_speech_request(self) -> None:
|
||||
class FakeResponse:
|
||||
def __enter__(self):
|
||||
|
||||
Reference in New Issue
Block a user