render(
events,voice,opts) ->buf,info/err
Render phoneme events into a mono 16 kHz sample buffer
opts.yield_every (parameter frames) makes the render cooperative: every N
frames it calls coroutine.yield(done_fraction) — the incremental path
speech.say_job slices a long render across an application's own schedule.
All render state lives in locals a yield cannot touch, so the sliced output
is byte-identical to the monolithic one by construction.