{"record":{"id":"ddbdfc27780bc9f1","repo":"SubtitleEdit/subtitleedit","slug":"crispasr-executable-not-found-install-crispasr-vi-ddbdfc","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":"error","filePath":"src/ui/Features/Video/TextToSpeech/Engines/MossTtsCrispAsr.cs","lineNumber":640,"sourceCode":"        }\n\n        await ServerLock.WaitAsync(ct);\n        try\n        {\n            if (MatchesCurrent())\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            var modelPath = GetModelPath(modelKey);\n            var hasLocalModel = AreModelsInstalled(modelKey);\n\n            var port = FindFreeLoopbackPort();\n            var psi = new ProcessStartInfo\n            {\n                WorkingDirectory = Path.GetDirectoryName(exe) ?? GetSetFolder(),\n                FileName = exe,\n                UseShellExecute = false,\n                CreateNoWindow = true,\n                RedirectStandardError = true,\n                RedirectStandardOutput = true,\n            };\n            psi.ArgumentList.Add(\"--server\");\n            psi.ArgumentList.Add(\"--backend\");","sourceCodeStart":622,"sourceCodeEnd":658,"githubUrl":"https://github.com/SubtitleEdit/subtitleedit/blob/17a9f0748781032255db3526b7215d2fb891e3af/src/ui/Features/Video/TextToSpeech/Engines/MossTtsCrispAsr.cs#L622-L658","documentation":"FileNotFoundException thrown by EnsureServerRunningAsync when GetCrispAsmExecutable() returns a path that does not exist on disk. The crispasr binary is shared between speech-to-text and TTS, and the error message directs the user to install it through the Video → Audio to text workflow, which is where the CrispAsrDownloadService runs.","triggerScenarios":"Calling Speak() on the MOSS-TTS (CrispASR) engine when File.Exists(GetCrispAsrExecutable()) is false. This happens when the user selected the engine but never installed CrispASR, when the install folder was deleted manually, or when the executable was quarantined by antivirus.","commonSituations":"First-time user who browsed to the TTS engine dropdown and picked MOSS-TTS without installing the runtime; the CrispASR folder under Se.TextToSpeechFolder was cleaned up by a disk-cleanup tool; the user moved their SE data directory and the relative path broke; antivirus flagged and removed the unsigned binary.","solutions":["Run Video → Audio to text → CrispASR install, which downloads and verifies the binary via CrispAsrDownloadService.","Check IsInstalled() or GetEngineUpdateStatus() before calling Speak() to surface the missing-binary state in the UI rather than at synthesis time.","Verify the path returned by GetCrispAsrExecutable() is accessible and not on a network mount that went offline.","Re-download if antivirus quarantined the file — add an exclusion for the SE TextToSpeech folder."],"exampleFix":"// before — Speak throws at server-start time\nawait engine.Speak(text, outputFolder, voice, language, region, model, ct);\n\n// after — check first and guide the user\nif (!await engine.IsInstalled(region))\n{\n    await ShowInstallPrompt(\"Install CrispASR via Video → Audio to text first.\");\n    return;\n}\nawait engine.Speak(text, outputFolder, voice, language, region, model, ct);","handlingStrategy":"validation","validationCode":"// Check before synthesis\nif (!File.Exists(MossTtsCrispAsr.GetCrispAsrExecutable()))\n{\n    await ShowInstallPrompt(\"Install CrispASR via Video → Audio to text first.\");\n    return;\n}","typeGuard":"null","tryCatchPattern":"catch (FileNotFoundException ex) when (ex.Message.Contains(\"CrispASR executable not found\"))\n{\n    await ShowInstallDialog(nameof(CrispAsrDownloadService));\n    // After install, retry the synthesis\n}","preventionTips":["Call IsInstalled() or GetEngineUpdateStatus() before synthesis to detect missing binaries.","Run the CrispAsrDownloadService install during engine selection, not at synthesis time.","Add an antivirus exclusion for the SE TextToSpeech folder to prevent binary quarantine."],"tags":["file-not-found","tts","moss-tts","crispasr","installation","csharp"],"backgroundTag":null,"analyzedSha":"17a9f0748781032255db3526b7215d2fb891e3af","analyzedAt":"2026-08-13T18:11:43.374Z","schemaVersion":2},"datasetVersion":"2026-08-13T19:17:28.613Z"}