SubtitleEdit/subtitleedit · error · TimeoutException

crispasr (chatterbox) did not report healthy within 15 minut

Error message

crispasr (chatterbox) did not report healthy within 15 minutes. Last output: {lastOutput}{LaunchCmdSuffix}

What it means

TimeoutException thrown by ChatterboxTtsCpp when the 15-minute startup deadline (DateTime.UtcNow.AddMinutes(15)) elapses without a successful /health probe and without the process exiting. The deadline is intentionally long because the first run auto-downloads ~880 MB of model weights.

Source

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

                            + "https://github.com/CrispStrobe/CrispASR/issues with the log below."
                            + Environment.NewLine + Environment.NewLine + tail
                            + LaunchCmdSuffix(exitedLaunchCommand));
                    }
                    throw new InvalidOperationException(
                        $"crispasr (chatterbox) exited during startup (code {exitCode}). Output: {tail}"
                        + LaunchCmdSuffix(exitedLaunchCommand));
                }
                if (await ProbeHealthAsync(port, TimeSpan.FromSeconds(2), ct))
                {
                    return;
                }
                await Task.Delay(TimeSpan.FromSeconds(1), ct);
            }

            var lastOutput = SnapshotServerLog();
            var timeoutLaunchCommand = _serverLaunchCommand;
            StopServerInternal();
            throw new TimeoutException(
                $"crispasr (chatterbox) did not report healthy within 15 minutes. Last output: {lastOutput}"
                + LaunchCmdSuffix(timeoutLaunchCommand));
        }
        finally
        {
            ServerLock.Release();
        }
    }

    private static bool LooksLikeOutdatedCrispAsr(string output)
    {
        // v0.5.x exits 0 and prints `error: unknown argument: ...` when it doesn't
        // recognise --voice-dir / --backend chatterbox. v0.6.x without the chatterbox
        // backend (e.g. ASR-only build) prints `unknown backend 'chatterbox'`.
        return output.Contains("unknown argument", StringComparison.Ordinal)
            || output.Contains("unknown backend", StringComparison.Ordinal);
    }

View on GitHub (pinned to 17a9f07487)

Solutions

  1. Re-run — the partial model download is cached and the second attempt continues from where it stopped.
  2. Check network/proxy/antivirus access to the CrispASR model host so the download is not throttled.
  3. Pre-stage the GGUFs in the configured models folder so startup is local and fast.
  4. If on a very slow CPU, allow more time or move to a GPU host for warm-up.
  5. Inspect 'Last output' in the message — if it shows a download progress stall, the CDN/firewall is the culprit.
Defensive patterns

Strategy: retry

Validate before calling

// First run downloads ~880 MB; the 15-min deadline can be tight. If you can detect a partial
// download, pre-stage or resume before calling Speak so the local deadline (not the download
// one) applies.

Try / catch

try { await engine.Speak(text, out, voice, lang, region, model, ct); }
catch (TimeoutException ex) when (ex.Message.Contains("did not report healthy within 15 minutes", StringComparison.Ordinal))
{
    Se.WriteToolsLog("Chatterbox startup timed out (likely download); retrying.", true);
    await engine.Speak(text, out, voice, lang, region, model, ct); // download is now cached
}

Prevention

When it happens

Trigger: EnsureServerRunningAsync launches crispasr; ProbeHealthAsync returns false every 2s for the full 15 minutes; process stays alive (so the exit-path errors never fire). On timeout, StopServerInternal kills it and throws.

Common situations: First run on a slow/throttled network where the ~880 MB download does not finish in 15 min; the server bound to the port but /health is hung; antivirus/proxy blocking the model CDN so download stalls silently; CPU so slow that model warm-up exceeds the window.

Related errors


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