import measure as m
import asyncio,inspect,json,time,threading,tempfile,wave
from pathlib import Path
p=m.p
# Experimental incremental iterator: same daemon, model, Pipecat, and sink.
source=inspect.getsource(p.JarvisPocketTTSService.run_tts)
# measure patched run; obtain original saved function instead
source=inspect.getsource(m.orig_run)
import textwrap
source=textwrap.dedent(source).replace('sorted(raw)','raw')
ns=p.__dict__.copy();exec(source,ns);m.orig_run=ns['run_tts']
def synth(self,request_id,text,output_directory,cancelled):
 terminal={}
 def chunks():
  with self._synthesis_lock:
   self._send({'type':'synthesize','requestId':request_id,'text':text,'outputDirectory':output_directory})
   while True:
    if cancelled.is_set():self.cancel(request_id)
    line=self._process.stdout.readline()
    if not line:raise p.DaemonError('EOF')
    e=json.loads(line)
    if e.get('requestId')!=request_id:continue
    if e['type']=='chunk':yield(e['index'],e['path'])
    elif e['type']=='synthesis-finished':terminal.update(e);return
    elif e['type']=='cancelled':return
    elif e['type']=='failed':raise p.DaemonError(e.get('message'))
 return chunks(),terminal,None
p.PocketDaemon.synthesize=synth
m.save=lambda:Path('/tmp/jarvis-pr8-perf-results/stream-results.json').write_text(json.dumps(m.rows,indent=2))
if __name__=='__main__':asyncio.run(m.main())
