"""Real Piper playback test against isolated room-state fixtures. Uses free loopback ports.""" import array from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer import json import os from pathlib import Path import subprocess import threading import time import urllib.request import wave import teddy_speech as speech ROOT = Path(__file__).resolve().parent STATE = {"run_id":"speech-smoke", "teddy":{"online":True,"muted":False,"takeover":False,"current":None}} class Fixture(BaseHTTPRequestHandler): def do_GET(self): data=json.dumps({"state":STATE}).encode() self.send_response(200) self.send_header("Content-Length",str(len(data))) self.end_headers() self.wfile.write(data) def log_message(self,*_): pass def wait(status,port,seconds=60): until=time.monotonic()+seconds while time.monotonic()22050 and max(abs(x) for x in samples)>100 print(f"Verified non-silent PCM WAV: {wav.getframerate()} Hz; {wav.getnframes()/wav.getframerate():.1f}s") print("PASS: room-state fixture -> real Piper -> local playback; mute/replay/stop") finally: process.terminate() process.wait(timeout=5) fixture.shutdown() fixture.server_close() if __name__=="__main__": run()