SubtitleEdit/subtitleedit · error · InvalidOperationException

Chatterbox TTS request failed — the crispasr server crashed…

Error message

Chatterbox TTS request failed — the crispasr server crashed during synthesis.

What it means

Same throw site as 190 but LooksLikeUpstreamChatterboxCrash was false and `died` is true — the crispasr server process exited during synthesis for a reason that does not match the known crash signature. The server log is appended so the actual cause is visible.

Solutions

  1. Read the appended serverLog in the message for the specific exit cause.
  2. Free RAM/GPU memory and reduce concurrent load.
  3. Restart: the engine relaunches the server on the next call.
  4. Check for antivirus or another process killing crispasr.
Defensive patterns

Strategy: retry

Try / catch

try { await chatterbox.Speak(...); }
catch (InvalidOperationException ex) when (ex.Message.Contains("crispasr server crashed"))
{ /* free RAM/GPU; engine relaunches server on next call; retry once */ }

Prevention

When it happens

Trigger: Server process dies mid-/v1/audio/speech with an unrecognized exit; `died` true, LooksLikeUpstreamChatterboxCrash false.

Common situations: OOM kill; GPU driver crash; server killed externally (task manager/AV); unhandled exception inside crispasr not matching the known pattern; model file vanishing mid-run.

Related errors


AI-assisted analysis of SubtitleEdit/subtitleedit@17a9f07487 (2026-08-13). Data as JSON: /api/errors/29ef67378cb852f3. Report an issue: GitHub.

Appendix: source

Thrown at src/ui/Features/Video/TextToSpeech/Engines/ChatterboxTtsCpp.cs:406

            if (died)
            {
                StopServerInternal();
            }
            var failMsg = $"Chatterbox TTS request failed - Voice: {chatterboxVoice}, Text: {text}, "
                + $"RequestJson: {body}, ServerExited: {died}, ServerLog: {serverLog}"
                + LaunchCmdSuffix(launchCommand);
            Se.LogError(ex, failMsg);
            Se.WriteToolsLog(failMsg);

            var prefix = LooksLikeUpstreamChatterboxCrash(serverLog)
                ? "Chatterbox TTS hit a CrispASR runtime bug during synthesis (ggml tensor read out of bounds). "
                  + "This is an upstream issue — please file it at https://github.com/CrispStrobe/CrispASR/issues with the server log below. "
                  + "The crash reproduces on the CPU and Vulkan builds (chatterbox's T3 step runs on CPU regardless of the build); "
                  + "the CUDA build may avoid it but is unverified."
                : "Chatterbox TTS request failed — "
                  + (died ? "the crispasr server crashed during synthesis." : "the connection to the crispasr server was dropped.");

            throw new InvalidOperationException(
                prefix
                    + (string.IsNullOrEmpty(serverLog) ? string.Empty : $"{Environment.NewLine}Server log:{Environment.NewLine}{serverLog}")
                    + LaunchCmdSuffix(launchCommand),
                ex);
        }

        using (response)
        {
            if (!response.IsSuccessStatusCode)
            {
                var errorBody = await SafeReadErrorAsync(response, cancellationToken);
                var serverLog = SnapshotServerLog();
                var launchCommand = _serverLaunchCommand;
                var errMsg = $"Chatterbox TTS server error {(int)response.StatusCode} {response.StatusCode} - "
                    + $"Voice: {chatterboxVoice}, Text: {text}, RequestJson: {body}, "
                    + $"ResponseBody: {errorBody}, ServerLog: {serverLog}"
                    + LaunchCmdSuffix(launchCommand);
                Se.LogError(errMsg);

View on GitHub (pinned to 17a9f07487)