SubtitleEdit/subtitleedit · error · FileNotFoundException

CrispASR executable not found. Install CrispASR via Video →

Error message

CrispASR executable not found. Install CrispASR via Video → Audio to text first.

What it means

FileNotFoundException from IndexTtsCrispAsr.EnsureServerRunningAsync when GetCrispAsrExecutable() resolves to a path that does not exist. The crispasr binary is shared with the Audio-to-text feature; the message directs the user to install it via Video → Audio to text. The missing file path is passed as the exception's FileName.

Source

Thrown at src/ui/Features/Video/TextToSpeech/Engines/IndexTtsCrispAsr.cs:524

        await ServerLock.WaitAsync(ct);
        try
        {
            if (_serverProcess is { HasExited: false } && _serverPort != 0
                && string.Equals(_serverVoicePath, voicePath, StringComparison.OrdinalIgnoreCase)
                && string.Equals(_serverModelKey, modelKey, StringComparison.OrdinalIgnoreCase))
            {
                return;
            }

            if (_serverProcess != null)
            {
                StopServerInternal();
            }

            var exe = GetCrispAsrExecutable();
            if (!File.Exists(exe))
            {
                throw new FileNotFoundException(
                    "CrispASR executable not found. Install CrispASR via Video → Audio to text first.", exe);
            }

            // Talker + codec GGUFs: use locally staged copies when present; otherwise fall back
            // to crispasr's own --auto-download (fetches into ~/.cache/crispasr/ on first run).
            var talkerFileName = GetTalkerFileName(modelKey);
            var talker = GetTalkerPath(modelKey);
            var hasLocalTalker = IsValidLocalModelFile(talker, talkerFileName);
            var codec = GetCodecPath();
            var hasLocalCodec = IsValidLocalModelFile(codec, CodecFileName);

            var port = FindFreeLoopbackPort();
            var psi = new ProcessStartInfo
            {
                WorkingDirectory = Path.GetDirectoryName(exe) ?? GetSetFolder(),
                FileName = exe,
                UseShellExecute = false,
                CreateNoWindow = true,

View on GitHub (pinned to 17a9f07487)

Solutions

  1. Run Video → Audio to text once to install/locate CrispASR, then retry IndexTTS.
  2. Verify the path returned by GetCrispAsrExecutable() actually contains the binary.
  3. If installed elsewhere, point the CrispASR location setting at the real folder.
  4. Reinstall CrispASR if the binary was deleted.
Defensive patterns

Strategy: validation

Validate before calling

var exe = engine.GetCrispAsrExecutable(); // if exposed
if (!File.Exists(exe))
{
    PromptInstallCrispAsr(); // Video → Audio to text
    return;
}

Try / catch

try { await indexEngine.Speak(...); }
catch (FileNotFoundException ex) when (ex.Message.Contains("CrispASR executable not found"))
{
    PromptInstallCrispAsr();
}

Prevention

When it happens

Trigger: CrispASR was never installed; the install was deleted/moved; the expected install location (registry/config) points at a stale path; a portable-mode folder layout change.

Common situations: Fresh machine where Audio-to-text (whisper/CrispASR) was never run; user cleaned up 'unused' folders; the binary is present but at a different path than GetCrispAsrExecutable returns.

Related errors


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