Automatic reconnect when the connection drops
- When the connection to Soniox or Qwen drops mid-session, for example when a VPN or proxy switches or Wi-Fi blinks, Sokuji now reconnects on its own. The status line shows "Reconnecting…", then "Connection lost and restored" appears in the conversation, and the conversation and the session timer carry on. (#693)
- Works with Kizuna AI's managed Soniox and Qwen, which fetch new credentials for the reconnect, and with your own Soniox key. (#693)
- A connection that stays open but stops answering is now noticed and reconnected, on Soniox and on Qwen. Before, the session could sit silent until you stopped it. (#693)
- Read-aloud comes back after a reconnect: its connection is renewed together with the transcription. (#693)
- If the network stays down for more than 30 seconds, the session ends with "Connection lost" and the conversation stays on screen. What was said while the connection was down is not translated afterwards. (#693)
Soniox: the app's own voice is no longer transcribed
- When Sokuji reads a translation aloud through this computer's speakers, it now tells Soniox what it is about to say, so the microphone picking up that playback no longer turns into a new line that gets translated again. In face-to-face mode this removes the loop of the app translating its own voice: in our tests, stray lines from the app's own speech went from 51 to 1. (#687)
- On by default; the switch is in Soniox's advanced settings. In Both mode with separate sessions it is not used. (#687)
Full Changelog: v0.48.0...v0.49.0
All commits since v0.48.0
- chore(release): v0.49.0
- Merge pull request #693 from kizuna-ai-lab/feat/session-reconnect
- docs(session): Qwen's reissue limit is four a minute (#692)
- docs(session): name the reissue residuals, and what Qwen's limit of 2 a minute now costs (#692)
- fix(session): a session-started retry asks again after its wait whether the run is still open (#692)
- fix(qwen): a token fetched ahead of a stepped-back clock leaves the cache (#692)
- docs(session): a Qwen reconnect's token is minted since its drop, and session-started is retried while open (#692)
- fix(qwen): session-started is tried again while its connection is open (#692)
- fix(qwen): a managed reconnect always dials a token minted since its drop (#692)
- docs(spec): Qwen's liveness probe, its push-to-talk commit wait and their measurement (#692)
- fix(qwen): a connection that stays open and answers nothing reconnects as a stall (#692)
- fix(status): a screen reader can still read the reconnect's attempt and seconds (#692)
- fix(soniox): a reconnect opens a fresh TTS socket, so speech comes back (#692)
- test: pin the reconnect's frame, the throttled detail and the reissue role (#692)
- docs(soniox): the stall threshold cites its measurement (#692)
- fix(status): the reconnect line's live region stays steady while its seconds tick (#692)
- fix(session): a success read past the deadline's time is taken, and the attempt contract says so (#692)
- fix(qwen): a close during an attempt's handshake follows the live close policy (#692)
- fix(soniox): shared Both drops gap audio before the mixer, so none reaches the new socket (#692)
- fix(soniox): session-started is tried again while its connection is open (#692)
- docs(spec): Qwen reissues take their place before the mint (#692)
- docs: no internal names or channels in the reconnect spec and plan (#692)
- fix(soniox): a 429 reconnects unless it says the quota is used up (#692)
- docs(session): the flap limits and the reissued key's window in the spec (#692)
- fix(locales): screenContext keeps its escaped soft hyphen and zero-width space (#692)
- fix(soniox): a reissued key's window is counted on the client's clock from the answer, and a connect still going when it closes is given up (#692)
- fix(session): the restored notice once per flap burst, and a throttled request rate is a rate_limit (#692)
- fix(session): a flapping connection backs off down the ladder and is let go after 10 reconnects a minute; a drop behind an attempt's answer fails that attempt (#692)
- docs(session): the per-minute rate sentence names both providers (#692)
- fix(qwen): a cached token Qwen refuses is fetched again, throttles and spent sessions reconnect, shared refusal helpers (#692)
- feat(qwen): reconnect a dropped leg, managed or own key (#692)
- docs(session): the Qwen reissue rate is 2 a minute (#692)
- feat(qwen): the lease reissues a token for a dropped leg (#692)
- fix(soniox): every 5xx reconnects, either facade wakes, a drop after the grant ends is a lease end, plain give-up words (#692)
- docs(plan): point at the spec version that carries the rulings (#692)
- docs(session): spec and plan follow the implementation rulings (#692)
- feat(soniox): reconnect a dropped STT socket, managed or own key (#692)
- fix(soniox): bound reissue's token wait by the timeout and the context abort (#692)
- feat(soniox): the lease reissues a key for a dropped stream (#692)
- feat(ui): the reconnect attempt and time in the status line, and a restored notice (#692)
- fix(session): a shared connection's failure acts once in either order, and the session-cap give-up sends its drop (#692)
- feat(session): the run tracks reconnects for the status line, the notice and PostHog (#692)
- feat(app): a network port for reconnects (#692)
- feat(session): reconnect event definitions shared with mobile (#692)
- fix(session): reconnector guard, error_code and cap frames (#692)
- feat(session): a shared reconnect policy (#692)
- docs(session): reconnect and reissue limits raised, with a per-minute reissue limit (#692)
- docs(session): audio replay follows after reconnect (#692)
- docs(plan): client reconnect for Soniox and Qwen (#692)
- docs(session): faster attempts, the online wake, stalls and the lease take-back (#692)
- docs(session): what the user is told while reconnecting (#692)
- docs(session): an optional network type on drop and reconnect (#692)
- docs(session): shared event definitions with a client field (#692)
- docs(session): the reconnect analytics events (#692)
- docs(session): say what mobile reuses later (#692)
- docs(session): name the crash-before-started risk (#692)
- docs(session): per-key Soniox reissues, as checked against the backend (#692)
- docs(session): design reconnecting after an unexpected disconnect (#692)
- Merge pull request #687 from kizuna-ai-lab/feat/agent-text-input
- docs(soniox): spec §4.4 — the switch's name, its help, cost notes in the help
- feat(soniox): the agent text switch names both its purposes; cost notes in the help
- docs(soniox): the agent text switch is a Soniox setting (spec §4.3, §4.4)
- test(soniox): the setting off, through the real adapter
- refactor(soniox): the agent text switch is a Soniox setting
- docs(soniox): spec §4.4 — the switch in split Both
- fix(locales): smoother zh and ko wording for the split Both reason
- feat(speech): the split Both reason also in the switch's help
- feat(speech): the agent text switch is off and greyed in split Both
- fix(session): a throwing agent text setting reads as send nothing
- docs(soniox): agent text measurement results; split Both off and the narrow flag rule
- fix(session): ask for agent text only when the switch is on at Start
- fix(soniox): no agent text in split Both
- docs(soniox): run 1 is the US check; EU and JP not tested separately (owner)
- Merge branch 'main' into feat/agent-text-input
- docs(soniox): spec §8 run 1 covers every region and both key kinds
- fix(session): no agent text while the microphone is muted
- fix(session): contain a throw from a session's agentText inside the feed
- docs(soniox): run 1 covers every region and both key kinds, with a concrete gate
- docs(soniox): agent text measurement checklist for the pull request
- feat(speech): the agent text switch in the Speech section, in 30 locales
- feat(settings): keep the read-aloud translation out of recognition, wired to the run
- feat(session): the run sends agent text as speech is queued
- fix(session): a fill-in only extends chunks whose enqueue went through
- feat(session): agent text feed and its routing rule (spec §4.1, §4.2)
- feat(playback): say where each clip plays and when a voice goes idle
- feat(soniox): a session sends agent text on its STT socket
- feat(soniox): ask for agent text on every microphone socket of a run that may speak
- feat(soniox): agent text on the STT stream
- docs: managed temporary keys accept agent text; replay is out of scope
- docs: plan for Soniox agent text input (phase 1)
- Merge pull request #686 from kizuna-ai-lab/release/v0.48.0
- docs: design for Soniox agent text input (desktop first)