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

  1. Re-run — the partial download is cached and resumes, so the second attempt is shorter.
  2. Ensure network/proxy/antivirus allows the CrispASR model CDN so the silent fetch is not throttled.
  3. Pre-stage all model files locally so the 5-minute local deadline applies.
  4. On slow hardware, allow more time or move to a GPU host for faster warm-up.
  5. 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

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


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