{"record":{"id":"ecb1dab0a1fd4e17","repo":"SubtitleEdit/subtitleedit","slug":"vibevoice-crispasr-the-crispasr-server-crashed","errorCode":null,"errorMessage":"VibeVoice (CrispASR) — the crispasr server crashed during synthesis. | VibeVoice (CrispASR) request failed — the connection to the crispasr server was dropped.{Environment.NewLine}Server log:{Environment.NewLine}{serverLog}{LaunchCmdSuffix}","messagePattern":"VibeVoice \\(CrispASR\\) — the crispasr server crashed during synthesis\\. \\| VibeVoice \\(CrispASR\\) request failed — the connection to the crispasr server was dropped\\.(.+?)Server log:(.+?)(.+?)(.+?)","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"src/ui/Features/Video/TextToSpeech/Engines/VibeVoiceCrispAsr.cs","lineNumber":411,"sourceCode":"            response = await HttpClient.PostAsync($\"{ServerBaseUrl}/v1/audio/speech\", content, cancellationToken);\n        }\n        catch (HttpRequestException ex)\n        {\n            var serverLog = SnapshotServerLog();\n            var launchCommand = _serverLaunchCommand;\n            var died = _serverProcess?.HasExited == true;\n            if (died)\n            {\n                StopServerInternal();\n            }\n\n            var failMsg = $\"VibeVoice (CrispASR) request failed — Voice: {vibeVoice}, Text: {text}, \"\n                + $\"RequestJson: {body}, ServerExited: {died}, ServerLog: {serverLog}\"\n                + LaunchCmdSuffix(launchCommand);\n            Se.LogError(ex, failMsg);\n            Se.WriteToolsLog(failMsg);\n\n            throw new InvalidOperationException(\n                (died\n                    ? \"VibeVoice (CrispASR) — the crispasr server crashed during synthesis.\"\n                    : \"VibeVoice (CrispASR) request failed — the connection to the crispasr server was dropped.\")\n                + (string.IsNullOrEmpty(serverLog) ? string.Empty : $\"{Environment.NewLine}Server log:{Environment.NewLine}{serverLog}\")\n                + LaunchCmdSuffix(launchCommand),\n                ex);\n        }\n\n        using (response)\n        {\n            if (!response.IsSuccessStatusCode)\n            {\n                var errorBody = await SafeReadErrorAsync(response, cancellationToken);\n                var serverLog = SnapshotServerLog();\n                var launchCommand = _serverLaunchCommand;\n                var errMsg = $\"VibeVoice (CrispASR) server error {(int)response.StatusCode} {response.StatusCode} — \"\n                    + $\"Voice: {vibeVoice}, Text: {text}, RequestJson: {body}, \"\n                    + $\"ResponseBody: {errorBody}, ServerLog: {serverLog}\"","sourceCodeStart":393,"sourceCodeEnd":429,"githubUrl":"https://github.com/SubtitleEdit/subtitleedit/blob/17a9f0748781032255db3526b7215d2fb891e3af/src/ui/Features/Video/TextToSpeech/Engines/VibeVoiceCrispAsr.cs#L393-L429","documentation":"InvalidOperationException thrown when HttpClient.PostAsync to /v1/audio/speech raises an HttpRequestException. The message branches on _serverProcess.HasExited: 'crashed during synthesis' if the server died, 'connection was dropped' otherwise. The captured server log and launch command are appended, and the original HttpRequestException is chained as InnerException.","triggerScenarios":"Server OOM/abort during synthesis; loopback socket reset; server killed by another code path mid-request; the reference voice file referenced by the payload was removed after server start, causing the server to abort.","commonSituations":"Long input exhausts GPU memory; concurrent Speak races a server restart; antivirus kills the child process; reference WAV deleted out from under the server.","solutions":["Use the crashed-vs-dropped branch to narrow cause: 'crashed' → read the server log for the abort reason; 'dropped' → socket/network.","Shorten input text or use a smaller VibeVoice quant to lower peak memory.","Ensure nothing else stops/restarts the crispasr server while synthesis is in flight.","Re-import the reference voice if the server log shows it can't read the WAV."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"if (_serverProcess is not { HasExited: false })\n    throw new InvalidOperationException(\"crispasr server is not running.\");","typeGuard":null,"tryCatchPattern":"try { response = await HttpClient.PostAsync($\"{ServerBaseUrl}/v1/audio/speech\", content, ct); }\ncatch (HttpRequestException ex)\n{\n    var died = _serverProcess?.HasExited == true;\n    throw new InvalidOperationException(died ? \"crispasr crashed\" : \"connection dropped\", ex);\n}","preventionTips":["Serialize Speak calls to avoid racing a server restart.","Cap input length to keep peak memory bounded.","Refuse to send when _serverProcess.HasExited."],"tags":["tts","vibevoice","crispasr","http","server-process","csharp"],"backgroundTag":null,"analyzedSha":"17a9f0748781032255db3526b7215d2fb891e3af","analyzedAt":"2026-08-13T18:11:43.374Z","schemaVersion":2},"datasetVersion":"2026-08-13T19:17:28.613Z"}