File size: 4,842 Bytes
b21cfae | 1 2 3 4 5 6 7 8 9 | <!doctype html><html lang="en"><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Robby playback synchronization validation</title><style>body{font:16px/1.6 system-ui;max-width:960px;margin:50px auto;padding:0 22px;color:#453f36;background:#f8f6f0}table{border-collapse:collapse;width:100%;font-size:14px}td,th{text-align:left;border-bottom:1px solid #d8d0c3;padding:12px}code{background:#eee9df;padding:2px 5px}.note{padding:16px;background:#eee9df;border-radius:12px}a{color:#765c39}</style><a href="/">← Robby</a><h1>Playback synchronization validation</h1><p>18 October 2026 · Humaneness Small RL + frozen Nemotron 3.5 / original TYGER GRU · RTX 3090</p>
<p class="note">The lost-machine demo was not present here. “Before” is a reproducible reconstructed arrival-order/fixed-150-ms control, not a measurement of that missing installation. The new clock mapping is tested; physical microphone-to-speaker accuracy still needs a test on the user's actual device.</p>
<table><tr><th>Test</th><th>Fixed-delay control</th><th>Playback-position timestamps</th></tr><tr><td>60 simulated buffering/device/network scenarios, median position error</td><td>340 ms</td><td>0 ms under ideal supplied clocks</td></tr><tr><td>Simulated p95 position error</td><td>1,005.75 ms</td><td>0 ms under ideal supplied clocks</td></tr><tr><td>Bot-only echo −26 / −40 / −60 / −90 dB, false BARGE events</td><td>2 / 1 / 0 / 0</td><td>0 / 0 / 0 / 0</td></tr><tr><td>User interruption at 1.5 s; first BARGE, same four echo levels</td><td>4.16 s / not detected / 4.16 s / 4.16 s</td><td>1.92 s / 1.92 s / 1.60 s / 1.92 s</td></tr><tr><td>Silence</td><td>Not run</td><td>No endpoint or BARGE</td></tr><tr><td>Normal synthetic speech followed by silence</td><td>Not run</td><td>Endpoint detected; no BARGE</td></tr><tr><td>Live headless browser → Luna → shared Small RL → playback</td><td>Not applicable</td><td>Five PCM chunks, 116 tagged microphone blocks; cancellation/reconnect passed; no JavaScript errors</td></tr></table>
<h2>What changed</h2><p>Capture and playback share one AudioContext. Each 20-ms microphone block carries the exact reply ID and 24-kHz playback sample position corresponding to its capture timestamp. Output position comes from <code>getOutputTimestamp()</code>, with reported device latency as an explicit fallback; input latency is used when available. Network arrival time is never the synchronization clock. Scheduled gaps remain silence, cancelled future audio is removed, and already played history is retained for delayed capture blocks. Completion waits for browser DAC playback, not TTS generation completion.</p>
<p>The server reconstructs its second ear from the PCM actually delivered to the browser, using one stateful polyphase resampler. The original TYGER turn-taking heads, debounce rules and thresholds are unchanged. A user-triggered quiet chirp can estimate additional acoustic delay by correlation; weak or AEC-suppressed echoes yield “uncertain,” not an invented correction.</p>
<h2>Scope and limitations</h2><p>The model check used two existing synthetic TTS utterances, not private microphone recordings. Echo scaling was −26 to −90 dB, with an artificial 400-ms reference lead in the control. Repeated BARGE events are counted in the diagnostic continuous-speaking replay; live playback stops at the first event. These are four controlled echo conditions, not a population benchmark. An earlier, discarded diagnostic paired a short reply with a long speaking-mode silence; it is not included as evidence. Room reverb, Bluetooth clock drift and each browser's true input latency still require physical testing. Headphones remain useful when acoustic echo cancellation is ineffective.</p>
<p>Seven correlation tests recovered synthetic 0–440-ms delays and rejected silence/unrelated noise. Twelve upstream second-ear tests passed. Responsive desktop/mobile checks found no horizontal overflow or JavaScript errors. Camera processing is local; no microphone audio or voiceprints are published.</p>
<h2>Reproduction</h2><p>Sources: <a href="https://github.com/nineninesix-ai/tyger-s2s/tree/97d011dcd4c8d2a117e54f00bf5b2d457cefa160">TYGER pinned source</a>, <a href="https://huggingface.co/nineninesix/tyger/tree/a5d4d73bb74fa4a7082dcd4387e44a1e5ac151b6">pinned Nemotron/GRU bundle</a>, <a href="https://github.com/nineninesix-ai/tyger-s2s/blob/97d011dcd4c8d2a117e54f00bf5b2d457cefa160/scripts/validate/second_ear.py">upstream second-ear diagnostic</a>. Local validation code: <code>sync_validation.py</code>, <code>audio_sync.py</code>, <code>static/clock.js</code>; measured JSON is retained in local <code>logs/sync-model-v2.json</code> and <code>logs/sync-clock.json</code>. The model bundle has OpenMDW 1.1 terms, not CC BY 4.0.</p></html>
|