[播报文本净化]:完成TTS表情包过滤,包含emoji清理、上下文净化和回归测试
This commit is contained in:
@@ -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
|
||||
from owner_voice_pet.tts import CloudTtsProvider, SentenceBuffer, SineTtsProvider, sanitize_tts_text
|
||||
from owner_voice_pet.vad import EnergyVadProvider, VadRecorder
|
||||
from owner_voice_pet.wakeword import KeywordWakeWordProvider
|
||||
|
||||
@@ -60,6 +60,12 @@ class PipelineLlmTtsTests(unittest.TestCase):
|
||||
self.assertEqual(buffer.feed("剩余").copy(), [])
|
||||
self.assertEqual(buffer.flush(), ["剩余"])
|
||||
|
||||
def test_sanitize_tts_text_removes_unspeakable_expression_tokens(self) -> None:
|
||||
self.assertEqual(sanitize_tts_text("你好 😊"), "你好")
|
||||
self.assertEqual(sanitize_tts_text("好的"), "好的")
|
||||
self.assertEqual(sanitize_tts_text("没问题[捂脸],我来帮你。"), "没问题,我来帮你。")
|
||||
self.assertEqual(sanitize_tts_text("😂😂"), "")
|
||||
|
||||
def test_sine_tts_generates_non_empty_audio(self) -> None:
|
||||
provider = SineTtsProvider()
|
||||
provider.load()
|
||||
@@ -126,6 +132,22 @@ class PipelineLlmTtsTests(unittest.TestCase):
|
||||
self.assertEqual(len(transport.played_segments), 1)
|
||||
self.assertEqual(pipeline.context.messages()[-1].role, "assistant")
|
||||
|
||||
def test_pipeline_sanitizes_tts_text_and_assistant_context(self) -> None:
|
||||
frames = [
|
||||
frame(0, 0, {"wake_word": "小杰小杰", "wake_confidence": 0.95}),
|
||||
frame(1, 20, {"speech": True, "transcript": "你好"}),
|
||||
frame(2, 40, {"speech": True}),
|
||||
frame(3, 60, {"speech": False}),
|
||||
frame(4, 80, {"speech": False}),
|
||||
]
|
||||
pipeline, transport = make_pipeline(frames, MockLlmProvider(["你好 😊。没问题[捂脸],我来帮你。"]))
|
||||
result = pipeline.run_once()
|
||||
|
||||
self.assertTrue(result.success)
|
||||
self.assertEqual(result.assistant_text, "你好。没问题,我来帮你。")
|
||||
self.assertEqual(transport.played_segments[0].metadata["text"], "你好。没问题,我来帮你。")
|
||||
self.assertEqual(pipeline.context.messages()[-1].content, "你好。没问题,我来帮你。")
|
||||
|
||||
def test_pipeline_skips_llm_on_empty_transcript(self) -> None:
|
||||
llm = MockLlmProvider(["不应调用"])
|
||||
frames = [
|
||||
|
||||
Reference in New Issue
Block a user