SubtitleEdit/subtitleedit · error · InvalidOperationException

Chatterbox TTS "Turbo" model crashed CrispASR during startup

Error message

Chatterbox TTS "Turbo" model crashed CrispASR during startup. This is a known upstream issue in the chatterbox-turbo backend (especially on macOS/CPU). Try the "Base" model instead, or file an issue at https://github.com/CrispStrobe/CrispASR/issues with the log below.

What it means

Thrown by ChatterboxTtsCpp when the spawned crispasr server process dies during its 15-minute startup health-check loop AND LooksLikeChatterboxTurboStartupCrash(modelKey, tail) matches the log. It signals a known upstream defect in the chatterbox-turbo backend (notably macOS/CPU). The message directs the user away from the Turbo model toward Base, which loads cleanly.

Source

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

                            + GetSetModelsFolder() + " are likely stale or partially downloaded. "
                            + "Delete them and try again so they re-download. Original output: " + tail
                            + LaunchCmdSuffix(exitedLaunchCommand));
                    }
                    if (LooksLikeChatterboxTurboTokenizerMismatch(tail))
                    {
                        throw new InvalidOperationException(
                            "Chatterbox TTS \"Turbo\" does not load with CrispASR 0.8.0. The turbo model "
                            + "is fine — 0.8.0's tokenizer/vocab check was overly strict and rejected its "
                            + "benign embedding superset (50257-token tokenizer, text vocab size 50276). "
                            + "This is fixed upstream (CrispStrobe/CrispASR#181): a newer CrispASR loads "
                            + "Turbo normally, with no re-download. Until then, switch to the \"Base\" "
                            + "Chatterbox model, which works."
                            + Environment.NewLine + Environment.NewLine + tail
                            + LaunchCmdSuffix(exitedLaunchCommand));
                    }
                    if (LooksLikeChatterboxTurboStartupCrash(modelKey, tail))
                    {
                        throw new InvalidOperationException(
                            "Chatterbox TTS \"Turbo\" model crashed CrispASR during startup. This is a known "
                            + "upstream issue in the chatterbox-turbo backend (especially on macOS/CPU). "
                            + "Try the \"Base\" model instead, or file an issue at "
                            + "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);
            }

View on GitHub (pinned to 17a9f07487)

Solutions

  1. Switch the Chatterbox model selection from 'Turbo' to 'Base' and regenerate — Base is unaffected.
  2. If you need Turbo, run on a CUDA GPU host where the crash signature is not seen.
  3. Track / pull the upstream CrispStrobe/CrispASR fix for the turbo startup crash and re-download CrispASR via Video → Audio to text → Engine settings → Re-download.
  4. Attach the captured server log tail (included in the exception message) to a new issue at https://github.com/CrispStrobe/CrispASR/issues if no fix is released yet.

Example fix

// before
var modelKey = "chatterbox-turbo";
await engine.Speak(text, out, voice, lang, region, modelKey, ct);

// after — prefer Base which loads cleanly on CPU/macOS
var modelKey = "chatterbox-base";
await engine.Speak(text, out, voice, lang, region, modelKey, ct);
Defensive patterns

Strategy: fallback

Validate before calling

// Before synthesis, prefer Base unless you know the host has a working Turbo.
var modelKey = IsCpuOrMacosHost() ? "chatterbox-base" : Se.Settings.Video.TextToSpeech.ChatterboxModel;
// LooksLikeChatterboxTurboStartupCrash is internal — surface model choice via settings UI,
// defaulting CPU/macOS users to Base.

Try / catch

try { await engine.Speak(text, out, voice, lang, region, "chatterbox-turbo", ct); }
catch (InvalidOperationException ex) when (ex.Message.Contains("Turbo", StringComparison.Ordinal) && ex.Message.Contains("Base", StringComparison.Ordinal))
{
    Se.WriteToolsLog("Chatterbox Turbo crashed on startup; retrying with Base.", true);
    await engine.Speak(text, out, voice, lang, region, "chatterbox-base", ct);
}

Prevention

When it happens

Trigger: Selecting the Chatterbox 'Turbo' model key, then invoking synthesis so EnsureServerRunningAsync launches crispasr with --backend chatterbox; the process exits non-zero during startup and its captured stderr/stdout tail matches the turbo-crash signature. Most reproducible on macOS or CPU-only machines.

Common situations: Running Chatterbox Turbo on an Apple Silicon Mac or a CPU-only Linux box; a fresh install where Turbo is the default; after a CrispASR version bump that regressed the turbo backend.

Related errors


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