SubtitleEdit/subtitleedit · error · TimeoutException
crispasr (cosyvoice3-tts) did not report healthy within {(al
Error message
crispasr (cosyvoice3-tts) did not report healthy within {(allLocal ? 5 : 30)} minutes. Last output: {lastOutput}{LaunchCmdSuffix} What it means
TimeoutException from CosyVoice3CrispAsr.EnsureServerRunningAsync: the deadline (5 minutes when all model files are local, 30 minutes when --auto-download must fetch the ~921 MB–2.5 GB bundle) elapsed without a successful /health probe and without the process exiting. StopServerInternal is called before throwing.
Source
Thrown at src/ui/Features/Video/TextToSpeech/Engines/CosyVoice3CrispAsr.cs:804
_serverLaunchCommand = null;
_serverModelKey = null;
_serverVoiceArg = null;
_serverRefText = null;
throw new InvalidOperationException(
$"crispasr (cosyvoice3-tts) 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 (cosyvoice3-tts) did not report healthy within {(allLocal ? 5 : 30)} minutes. Last output: {lastOutput}"
+ LaunchCmdSuffix(timeoutLaunchCommand));
}
finally
{
ServerLock.Release();
}
}
private static string SnapshotServerLog()
{
lock (_serverLog)
{
var s = _serverLog.ToString().TrimEnd();
return s.Length > 2000 ? s[^2000..] : s;
}
}
View on GitHub (pinned to 17a9f07487)
Solutions
- Re-run — the partial download is cached and resumes, so the second attempt is shorter.
- Ensure network/proxy/antivirus allows the CrispASR model CDN so the silent fetch is not throttled.
- Pre-stage all model files locally so the 5-minute local deadline applies.
- On slow hardware, allow more time or move to a GPU host for faster warm-up.
- Inspect 'Last output' — a stall line indicates a download/network problem.
Defensive patterns
Strategy: retry
Validate before calling
// Pre-stage model files locally so the 5-min (not 30-min) deadline applies.
if (!CosyVoice3CrispAsr.AreModelsInstalled(modelKey))
await DownloadCosyVoice3BundleAsync(modelKey, ct); // out-of-band pre-stage Try / catch
try { await cosyVoice3Engine.Speak(text, out, voice, lang, region, model, ct); }
catch (TimeoutException ex) when (ex.Message.Contains("did not report healthy", StringComparison.Ordinal))
{
Se.WriteToolsLog("CosyVoice3 startup timed out (likely download); retrying after cache.", true);
await cosyVoice3Engine.Speak(text, out, voice, lang, region, model, ct);
} Prevention
- Pre-stage the CosyVoice3 bundle so the local 5-min deadline applies.
- Whitelist the model CDN in proxy/AV so the silent fetch is not throttled.
- On slow hardware/GPU warm-up, allow more time or move to a faster host.
When it happens
Trigger: Startup loop runs until DateTime.UtcNow >= deadline while ProbeHealthAsync keeps returning false and process.HasExited stays false; the server is alive but never reports healthy.
Common situations: First run with --auto-download on a slow/throttled connection (30 min insufficient); the server bound to the port but /health is hung during warm-up; very slow CPU/GPU warm-up exceeding the local 5-minute window; CDN/proxy blocking the silent companion fetch behind -m auto.
Related errors
- crispasr (chatterbox) did not report healthy within 15 minut
- crispasr (cosyvoice3-tts) exited during startup (code {exitC
- crispasr (moss-tts) did not report healthy within {10|60} mi
- crispasr (omnivoice) did not report healthy within {5|30} mi
- crispasr (qwen3-tts) did not report healthy within {hasLocal
AI-assisted analysis of SubtitleEdit/subtitleedit@17a9f07487 (2026-08-13).
Data as JSON: /api/errors/c0a2faddb5c245ee.
Report an issue: GitHub.