{"record":{"id":"b8c3373cbbeaf1d8","repo":"SubtitleEdit/subtitleedit","slug":"vibevoice-crispasr-requires-a-reference-voice-wa","errorCode":null,"errorMessage":"VibeVoice (CrispASR) requires a reference voice WAV. Import one via the voice settings, then pick it in the voice combo. Reference WAV should be 24 kHz mono.","messagePattern":"VibeVoice \\(CrispASR\\) requires a reference voice WAV\\. Import one via the voice settings, then pick it in the voice combo\\. Reference WAV should be 24 kHz mono\\.","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"src/ui/Features/Video/TextToSpeech/Engines/VibeVoiceCrispAsr.cs","lineNumber":345,"sourceCode":"        GetVoices(language);\n\n    public async Task<TtsResult> Speak(\n        string text,\n        string outputFolder,\n        Voice voice,\n        TtsLanguage? language,\n        string? region,\n        string? model,\n        CancellationToken cancellationToken)\n    {\n        if (voice.EngineVoice is not VibeVoice vibeVoice)\n        {\n            throw new ArgumentException(\"Voice is not a VibeVoice\");\n        }\n\n        if (string.IsNullOrEmpty(vibeVoice.FilePath))\n        {\n            throw new InvalidOperationException(\n                \"VibeVoice (CrispASR) requires a reference voice WAV. \"\n                + \"Import one via the voice settings, then pick it in the voice combo. \"\n                + \"Reference WAV should be 24 kHz mono.\");\n        }\n\n        var modelKey = ResolveModelKey(model);\n        await EnsureServerRunningAsync(modelKey, cancellationToken);\n\n        var outputFileName = Path.Combine(TtsOutputFolder.Resolve(outputFolder, GetSetFolder), Guid.NewGuid() + \".wav\");\n        var inputText = text;\n\n        // OpenAI-compatible /v1/audio/speech payload. CrispASR's vibevoice backends look at:\n        //   - `input`             — the text to synthesise\n        //   - `response_format`   — \"wav\"\n        //   - `voice`             — see below\n        //   - `speed`             — server-side linear resample of the synth output (0.25-4.0).\n        //                           VibeVoice 1.5B tends to be on the slow side; default is 1.1\n        //                           and the user can override in the engine settings dialog.","sourceCodeStart":327,"sourceCodeEnd":363,"githubUrl":"https://github.com/SubtitleEdit/subtitleedit/blob/17a9f0748781032255db3526b7215d2fb891e3af/src/ui/Features/Video/TextToSpeech/Engines/VibeVoiceCrispAsr.cs#L327-L363","documentation":"InvalidOperationException thrown when the selected VibeVoice has an empty/null FilePath. VibeVoiceCrispAsR is cloning-only — it has no built-in default voice — so every synthesis requires a user-imported reference WAV, ideally 24 kHz mono. The check runs before server start so the user gets a clear message instead of a server-side rejection.","triggerScenarios":"The voice combo is empty and a null/default voice was forced through; the imported reference WAV was deleted after import; a voice entry was constructed without seeding FilePath; migration lost the FilePath field.","commonSituations":"User attempts synthesis before importing any reference; cleanup tool removed the reference; manual voice-list construction that skipped FilePath.","solutions":["Import a reference voice WAV via the voice settings, then select it in the combo.","Confirm the reference WAV still exists on disk; re-import if removed.","Prefer a 24 kHz mono 16-bit PCM WAV to match VibeVoice's expected input.","Disable the Speak action in the UI until at least one voice with a FilePath is available."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"if (string.IsNullOrEmpty(vibeVoice.FilePath))\n    throw new InvalidOperationException(\"VibeVoice requires an imported reference WAV.\");\nif (!File.Exists(vibeVoice.FilePath))\n    throw new FileNotFoundException(\"Reference WAV missing\", vibeVoice.FilePath);","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Require an imported reference WAV before enabling Speak for this engine.","Re-verify the reference WAV path on startup.","Prefer 24 kHz mono 16-bit PCM for the reference."],"tags":["tts","vibevoice","voice-cloning","validation","csharp"],"backgroundTag":null,"analyzedSha":"17a9f0748781032255db3526b7215d2fb891e3af","analyzedAt":"2026-08-13T18:11:43.374Z","schemaVersion":2},"datasetVersion":"2026-08-13T19:17:28.613Z"}