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
- 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.
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
- 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.
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
- Qwen3 TTS (CrispASR) voice cloning requires a reference voic
- Qwen3 TTS (CrispASR) voice cloning needs the spoken transcri
- IndexTTS (CrispASR) requires a reference voice WAV. Import o
- MOSS-TTS (CrispASR) requires a reference voice WAV. Import o
- OmniVoice TTS voice cloning requires a transcript file at {r
AI-assisted analysis of SubtitleEdit/subtitleedit@17a9f07487 (2026-08-13).
Data as JSON: /api/errors/b8c3373cbbeaf1d8.
Report an issue: GitHub.