zebra-report/web
Russell Ballestrini e23808d410
zebra-spaces: self-transcribe + Whisper telemetry stats
Two related additions:

1. Self-transcription. The host's own voice wasn't being transcribed
   because capture nodes only attached to listenerAudioNodes (remote
   speakers' streams from SFU/mesh worklets). micStream — the local
   capture for publishing — was never tapped. Added startSelfCapture
   / stopSelfCapture that wraps micStream in a parallel
   whisper-capture worklet. Lines are tagged with myUUID so the local
   user's handle shows in the transcript log.

   Wired into:
   - toggleTranscribe ON/OFF → starts/stops self capture alongside
     remote captures
   - getMic → starts self capture if transcribe is already on (covers
     "user enabled transcribe before granting mic permission")
   - applyMicMode / reacquireMic → stops + restarts self capture
     against the new micStream so we don't keep transcribing a
     stopped MediaStreamTrack

2. Whisper telemetry stats. Each 5s tick now appends:
   xcr=on  sent=N drp=N emt=N avgMs=N wrkr=1 caps=N selfCap=1
     - xcr: on/off
     - sent: chunks shipped to the worker this tick
     - drp:  chunks dropped by the inflight gate (worker saturated)
     - emt:  text lines emitted after silence/hallucination/dup filters
     - avgMs: average inference latency per chunk (device-perf proxy)
     - wrkr: 1 once the worker has loaded the model
     - caps: # of active remote-capture worklets
     - selfCap: 1 if local mic is being captured
   Reset each tick so we see RATE, not cumulative.

   Lets us compare devices across mesh from server-side signal log:
   Snapdragon-8 should show avgMs ~150-300; mid-range phones 1500-
   3000; desktop x86 50-150. drp > 0 means worker can't keep up with
   the audio chunks arriving (multiple speakers talking at once).

Factored the chunk-handling pipeline into handleWhisperChunk(uuid,
chunk) so both remote and self captures share the same filter +
inflight-gate + telemetry path.
2026-06-05 13:21:49 -04:00
..
blog phase 1: unfirehose reconstruction from session JSONL ingest 2026-05-27 13:51:14 -04:00
fonts phase 2: gap analysis — cat>> append + binary asset recovery 2026-05-27 13:54:19 -04:00
chat.html zebra-spaces: listener mute button doubles as audio-unlock gesture 2026-06-03 20:57:09 -04:00
host-your-own.html zebra-spaces: listener mute button doubles as audio-unlock gesture 2026-06-03 20:57:09 -04:00
how-it-works.html zebra-spaces: listener mute button doubles as audio-unlock gesture 2026-06-03 20:57:09 -04:00
index.html web: bump mobile body padding from 1rem to 1.25rem so the right edge has visible breathing room 2026-05-31 14:13:25 -04:00
kernel.html web: bump mobile body padding from 1rem to 1.25rem so the right edge has visible breathing room 2026-05-31 14:13:25 -04:00
stamp.js web: stamp each zebra-report page with build date + md5/sha256 2026-05-28 17:50:12 -04:00
zebra-audio.html zebra-spaces: listener mute button doubles as audio-unlock gesture 2026-06-03 20:57:09 -04:00
zebra-spaces.html zebra-spaces: self-transcribe + Whisper telemetry stats 2026-06-05 13:21:49 -04:00