feat: 完善 N7 智能座舱交互与控制链路

This commit is contained in:
vee
2026-09-07 15:34:59 +08:00
parent 32d179143f
commit c96970f068
100 changed files with 30088 additions and 1174 deletions
+45
View File
@@ -49,6 +49,15 @@ class TranscriptAssemblerTests(unittest.TestCase):
self.assertEqual(result.text, "打开空调。")
self.assertEqual(result.duplicate_callbacks, 1)
def test_duplicate_partial_callback_is_idempotent(self) -> None:
assembler = TranscriptAssembler("utterance-1")
callback = segment("s0", 0, "打开空", final=False)
assembler.update(callback)
result = assembler.update(callback)
self.assertEqual(result.text, "打开空")
self.assertEqual(result.duplicate_callbacks, 1)
self.assertEqual(len(result.partial_segments), 1)
def test_final_cannot_be_mutated(self) -> None:
assembler = TranscriptAssembler("utterance-1")
assembler.update(segment("s0", 0, "打开空调。", final=True))
@@ -56,6 +65,42 @@ class TranscriptAssemblerTests(unittest.TestCase):
self.assertTrue(result.uncertain)
self.assertEqual(result.text, "打开空调。")
def test_late_partial_cannot_overwrite_authoritative_final(self) -> None:
assembler = TranscriptAssembler("utterance-1")
assembler.update(segment("s0", 0, "打开空调。", final=True))
result = assembler.update(segment("s0", 0, "打开空", final=False))
self.assertEqual(result.text, "打开空调。")
self.assertTrue(result.uncertain)
self.assertIn("changed after final commit", result.conflicts[0])
def test_partial_final_duplicate_and_out_of_order_torture_sequence(self) -> None:
assembler = TranscriptAssembler("utterance-1")
assembler.update(segment("s1", 1, "温度二十", final=False))
assembler.update(segment("s0", 0, "打开空", final=False))
assembler.update(segment("s1", 1, "温度二十四点五度", final=True))
duplicate = segment("s1", 1, "温度二十四点五度", final=True)
assembler.update(duplicate)
result = assembler.update(segment("s0", 0, "打开空调", final=True))
completed = assembler.finish()
self.assertEqual(result.text, "打开空调,温度二十四点五度")
self.assertEqual(completed.text, result.text)
self.assertEqual(completed.duplicate_callbacks, 1)
self.assertGreaterEqual(completed.out_of_order_callbacks, 2)
self.assertFalse(completed.partial_segments)
self.assertFalse(completed.uncertain)
def test_progressive_partial_is_replaced_instead_of_appended(self) -> None:
assembler = TranscriptAssembler("utterance-1")
snapshots = [
assembler.update(segment("s0", 0, text, final=False)).text
for text in ("打", "打开空", "打开空调")
]
self.assertEqual(snapshots, ["打", "打开空", "打开空调"])
self.assertNotIn("打,打开", snapshots[-1])
def test_out_of_order_callbacks_are_sorted(self) -> None:
assembler = TranscriptAssembler("utterance-1")
assembler.update(segment("s1", 1, "打开氛围灯。", final=True))