SubtitleEdit/subtitleedit · error · InvalidOperationException
crispasr (indextts) exited during startup (code {exitCode}).
Error message
crispasr (indextts) exited during startup (code {exitCode}). Output: {tail}{LaunchCmdSuffix} What it means
InvalidOperationException from IndexTtsCrispAsr.EnsureServerRunningAsync when the indextts crispasr server process exits before the first successful health probe. Mirrors the F5-TTS equivalent: the exit code, last 2000 chars of server log, and the launch command are attached. Server state fields (_serverProcess/_serverPort/_serverVoicePath/_serverModelKey) are cleared so the next call restarts cleanly.
Source
Thrown at src/ui/Features/Video/TextToSpeech/Engines/IndexTtsCrispAsr.cs:617
HookProcessExitOnce();
// First-run auto-download (~870 MB total) needs a generous timeout, but much
// shorter than VibeVoice/Qwen3 thanks to the smaller model.
var deadline = DateTime.UtcNow.AddMinutes(hasLocalTalker && hasLocalCodec ? 5 : 15);
while (DateTime.UtcNow < deadline)
{
ct.ThrowIfCancellationRequested();
if (process.HasExited)
{
var tail = SnapshotServerLog();
var exitCode = process.ExitCode;
var exitedLaunchCommand = _serverLaunchCommand;
_serverProcess = null;
_serverPort = 0;
_serverLaunchCommand = null;
_serverVoicePath = null;
_serverModelKey = null;
throw new InvalidOperationException(
$"crispasr (indextts) 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 (indextts) did not report healthy within {(hasLocalTalker && hasLocalCodec ? 5 : 15)} minutes. Last output: {lastOutput}"
+ LaunchCmdSuffix(timeoutLaunchCommand));
}
finallyView on GitHub (pinned to 17a9f07487)
Solutions
- Read the `Output:` tail — the indextts backend prints its abort reason there.
- Run the `Launch command:` line in a terminal for the full error.
- Confirm the reference WAV at the `--voice` path still exists and is readable.
- Verify both talker and codec GGUFs (or let `--auto-download` re-fetch on a stable link).
- Add the CrispASR folder to AV exclusions.
Defensive patterns
Strategy: try-catch
Validate before calling
// Pre-flight checks before first synth
if (!File.Exists(engine.GetCrispAsrExecutable())) { PromptInstallCrispAsr(); return; }
if (!File.Exists(indexVoice.FilePath)) { WarnUser("Reference WAV missing"); return; } Try / catch
try { await indexEngine.Speak(...); }
catch (InvalidOperationException ex) when (ex.Message.Contains("exited during startup"))
{
ShowDiagnostics(ex.Message); // exit code + Output tail + launch command
} Prevention
- Pre-stage talker + codec GGUFs to avoid auto-download failures at boot.
- Verify the `--voice` reference WAV still exists before each job.
- Add CrispASR to AV exclusions.
- Match the CrispASR version to the CLI flags the code emits.
When it happens
Trigger: Missing or corrupt talker/codec GGUF and `--auto-download` fails; the `--voice` reference WAV is unreadable so the indextts backend aborts at init; CUDA/runtime error at boot; the path-traversal `--voice` arg contains characters the backend rejects at startup; AV killing the process.
Common situations: Reference WAV deleted/moved after the voice was selected (path baked into `--voice` no longer valid); interrupted first-run ~870 MB model download; CrispASR CLI flag change between versions; GPU driver incompatibility.
Related errors
- crispasr (f5-tts) exited during startup (code {exitCode}). O
- crispasr (indextts) did not report healthy within {5|15} min
- crispasr (f5-tts) did not report healthy within {(hasLocalTa
- Voice is not an IndexTtsVoice
- IndexTTS (CrispASR) requires a reference voice WAV. Import o
AI-assisted analysis of SubtitleEdit/subtitleedit@17a9f07487 (2026-08-13).
Data as JSON: /api/errors/c2962ee34c074cf3.
Report an issue: GitHub.