{"record":{"id":"e43ab4890ec38df3","repo":"SubtitleEdit/subtitleedit","slug":"crispasr-executable-not-found-install-crispasr-vi-e43ab4","errorCode":null,"errorMessage":"CrispASR executable not found. Install CrispASR via Video → Audio to text first.","messagePattern":"CrispASR executable not found\\. Install CrispASR via Video → Audio to text first\\.","errorType":"exception","errorClass":"FileNotFoundException","httpStatus":null,"severity":"critical","filePath":"src/ui/Features/Video/TextToSpeech/Engines/Qwen3TtsCrispAsr.cs","lineNumber":937,"sourceCode":"        }\n\n        await ServerLock.WaitAsync(ct);\n        try\n        {\n            if (_serverProcess is { HasExited: false } && _serverPort != 0 && _serverModelKey == modelKey)\n            {\n                return;\n            }\n\n            if (_serverProcess != null)\n            {\n                StopServerInternal();\n            }\n\n            var exe = GetCrispAsrExecutable();\n            if (!File.Exists(exe))\n            {\n                throw new FileNotFoundException(\n                    \"CrispASR executable not found. Install CrispASR via Video → Audio to text first.\", exe);\n            }\n\n            // Talker and codec GGUFs: if locally staged, use directly; otherwise hand off to\n            // crispasr's --auto-download to fetch them into ~/.cache/crispasr/ on first run.\n            // Slower the first time, instant after. A proper SE-side download service is a\n            // follow-up; this keeps the engine usable without manual file placement.\n            var talker = GetTalkerPath(modelKey);\n            var hasLocalTalker = IsValidLocalModelFile(talker, GetTalkerFileName(modelKey));\n            var codec = GetCodecPath();\n            var hasLocalCodec = IsValidLocalModelFile(codec, CodecFileName);\n\n            var port = FindFreeLoopbackPort();\n            var psi = new ProcessStartInfo\n            {\n                WorkingDirectory = Path.GetDirectoryName(exe) ?? GetSetFolder(),\n                FileName = exe,\n                UseShellExecute = false,","sourceCodeStart":919,"sourceCodeEnd":955,"githubUrl":"https://github.com/SubtitleEdit/subtitleedit/blob/17a9f0748781032255db3526b7215d2fb891e3af/src/ui/Features/Video/TextToSpeech/Engines/Qwen3TtsCrispAsr.cs#L919-L955","documentation":"FileNotFoundException thrown by EnsureServerRunningAsync when GetCrispAsrExecutable() resolves to a path that does not exist. The message points the user at the install route ('Video → Audio to text') because CrispASR is shared with the transcription feature and is installed through that workflow, not bundled with the TTS engine.","triggerScenarios":"CrispASR was never installed (the user went straight to TTS without running Audio-to-text); the executable was deleted or quarantined; the install path in settings points at the wrong location; a portable/moved install lost the binary.","commonSituations":"Fresh install where only the TTS engine was added; antivirus flagged and removed the binary; OS update cleared a temp install location; settings migrated to a new machine without reinstalling CrispASR.","solutions":["Install CrispASR via Video → Audio to text first, as the message instructs.","Check the FileName in the exception for the exact resolved path that's missing.","Re-stage the CrispASR binary at the path GetCrispAsrExecutable() returns for your OS.","If antivirus quarantined it, restore/whitelist the binary and reinstall."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"var exe = GetCrispAsrExecutable();\nif (!File.Exists(exe))\n    throw new FileNotFoundException(\"CrispASR executable not found. Install CrispASR via Video → Audio to text first.\", exe);","typeGuard":null,"tryCatchPattern":"try { await EnsureServerRunningAsync(modelKey, ct); }\ncatch (FileNotFoundException ex) when (ex.FileName == GetCrispAsrExecutable())\n{ await OfferInstallCrispAsrAsync(); throw; }","preventionTips":["Surface an 'install CrispASR' prompt when the engine is selected, not only at Speak time.","Run the Audio-to-text install flow as part of TTS engine setup.","Whitelist the binary in antivirus to prevent quarantine."],"tags":["tts","crispasr","file-not-found","setup","csharp"],"backgroundTag":null,"analyzedSha":"17a9f0748781032255db3526b7215d2fb891e3af","analyzedAt":"2026-08-13T18:11:43.374Z","schemaVersion":2},"datasetVersion":"2026-08-13T19:17:28.613Z"}