Replay now matches the robots and no longer cuts words: - read the turn to turnComplete, not generationComplete, and drain the socket before each send; breaking early truncated every sentence and left frames that the next turn mis-read as its own reply - accept a take only if the model's own transcript covers the text AND the audio is long enough to contain it (the transcript reports the full text even for a 0.8s clip) - pitch gate: reject an off-tone take and re-ask, per voice, using a pure-Python F0 estimator (no numpy on the host) - continuation: speak the words a voice skipped instead of retrying a line it stops on deterministically - fresh Live session per replay; delivery drifts as turns accumulate Live Gemini tab: browser talks to Gemini directly (the reverse proxy cannot upgrade a WebSocket), with a persona library - named personas, per-robot selection, built-ins that cannot be overwritten. Dashboard: records search + voice filter, log panel falls back to polling, sign-in history with CSV/JSON export, and JS errors now show on the page instead of silently blanking a tab.
14 lines
919 B
JSON
14 lines
919 B
JSON
{
|
|
"_description": "Tunables for gemini/client.py. All keys are optional — defaults live in code. Gemini credentials (api_key, model_live, voice_name) come from core_config.json\u0027s gemini_defaults — single source of truth.",
|
|
"client": {
|
|
"_comment": "gemini/client.py — Gemini Live WebSocket client used by the typed-replay engine for one-shot TTS calls.",
|
|
"recv_timeout_sec": 30,
|
|
"reconnect_max_attempts": 3,
|
|
"reconnect_initial_delay_sec": 1.0,
|
|
"reconnect_max_delay_sec": 10.0,
|
|
"post_generation_grace_sec": 3,
|
|
"output_transcription": true,
|
|
"_comment_grace": "Seconds to keep reading after generationComplete, reset on every frame. 1.2 was too short: reads got cut and the leftover tail bled into the NEXT generation."
|
|
}
|
|
}
|