Snapshot: full project state

This commit is contained in:
2026-10-06 23:43:30 -07:00
commit 9991a836fe
15 changed files with 1642 additions and 0 deletions

62
multiturn_test.py Normal file
View File

@@ -0,0 +1,62 @@
#!/usr/bin/env python3
"""Multi-turn conversational test: two back-and-forth exchanges over /ws."""
import asyncio
import json
import sys
sys.path.insert(0, "/opt/collector")
from app import TTS, CFG
import websockets
tts = TTS(CFG["tts"])
tts.load()
P1 = tts.synthesize_16k("What is your name?")
P2 = tts.synthesize_16k("Tell me something interesting.")
FRAME = 640 # 20ms @ 16kHz
async def send_utterance(ws, pcm):
for i in range(0, len(pcm), FRAME):
await ws.send(pcm[i:i + FRAME])
await asyncio.sleep(0.02)
silence = b"\x00" * FRAME
for _ in range(50): # 1s silence -> VAD turn end
await ws.send(silence)
await asyncio.sleep(0.02)
async def read_reply(ws, seen_assistant):
"""Read messages until we collect a NEW assistant transcript + audio."""
audio = 0
while True:
try:
msg = await asyncio.wait_for(ws.recv(), timeout=45)
except Exception:
return False
if isinstance(msg, str):
m = json.loads(msg)
if m.get("role") == "assistant":
seen_assistant += 1
else:
audio += len(msg)
if seen_assistant >= 1 and audio > 0:
return True
async def main():
async with websockets.connect("ws://127.0.0.1:8766/ws") as ws:
await asyncio.sleep(6) # warm
# Turn 1
await send_utterance(ws, P1)
ok1 = await read_reply(ws, 0)
print("TURN1 reply:", "PASS" if ok1 else "FAIL")
# Turn 2
await asyncio.sleep(1)
await send_utterance(ws, P2)
ok2 = await read_reply(ws, 1)
print("TURN2 reply:", "PASS" if ok2 else "FAIL")
print("MULTITURN", "PASS" if (ok1 and ok2) else "FAIL")
asyncio.run(main())