SubtitleEdit/subtitleedit · error · InvalidOperationException

VibeVoice (CrispASR) requires a reference voice WAV. Import

Error message

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.

What it means

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.

Source

Thrown at src/ui/Features/Video/TextToSpeech/Engines/VibeVoiceCrispAsr.cs:345

        GetVoices(language);

    public async Task<TtsResult> Speak(
        string text,
        string outputFolder,
        Voice voice,
        TtsLanguage? language,
        string? region,
        string? model,
        CancellationToken cancellationToken)
    {
        if (voice.EngineVoice is not VibeVoice vibeVoice)
        {
            throw new ArgumentException("Voice is not a VibeVoice");
        }

        if (string.IsNullOrEmpty(vibeVoice.FilePath))
        {
            throw new InvalidOperationException(
                "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.");
        }

        var modelKey = ResolveModelKey(model);
        await EnsureServerRunningAsync(modelKey, cancellationToken);

        var outputFileName = Path.Combine(TtsOutputFolder.Resolve(outputFolder, GetSetFolder), Guid.NewGuid() + ".wav");
        var inputText = text;

        // OpenAI-compatible /v1/audio/speech payload. CrispASR's vibevoice backends look at:
        //   - `input`             — the text to synthesise
        //   - `response_format`   — "wav"
        //   - `voice`             — see below
        //   - `speed`             — server-side linear resample of the synth output (0.25-4.0).
        //                           VibeVoice 1.5B tends to be on the slow side; default is 1.1
        //                           and the user can override in the engine settings dialog.

View on GitHub (pinned to 17a9f07487)

Solutions

  1. Import a reference voice WAV via the voice settings, then select it in the combo.
  2. Confirm the reference WAV still exists on disk; re-import if removed.
  3. Prefer a 24 kHz mono 16-bit PCM WAV to match VibeVoice's expected input.
  4. Disable the Speak action in the UI until at least one voice with a FilePath is available.
Defensive patterns

Strategy: validation

Validate before calling

if (string.IsNullOrEmpty(vibeVoice.FilePath))
    throw new InvalidOperationException("VibeVoice requires an imported reference WAV.");
if (!File.Exists(vibeVoice.FilePath))
    throw new FileNotFoundException("Reference WAV missing", vibeVoice.FilePath);

Prevention

When it happens

Trigger: 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.

Common situations: User attempts synthesis before importing any reference; cleanup tool removed the reference; manual voice-list construction that skipped FilePath.

Related errors


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