Hmbown/CodeWhale · error · anyhow::Error
mimo-v2.5-tts-voiceclone requires --clone-voice <mp3|wav>…
Error message
mimo-v2.5-tts-voiceclone requires --clone-voice <mp3|wav> or --voice <data-uri>
What it means
The TUI's speech-synthesis path rejects a voice-clone request that arrives without any voice source. When the target model is mimo-v2.5-tts-voiceclone, it needs either a local mp3/wav sample (--clone-voice, converted to a data URI) or an explicit --voice data URI; with neither, it bails instead of sending a request the provider would reject.
Solutions
- Pass --clone-voice path/to/sample.mp3 (or .wav) with the voice-clone model
- Or pass --voice with a non-empty data URI
- Or use the default voice model if you don't need cloning
Example fix
// before codewhale --model mimo-v2.5-tts-voiceclone --say hi // after codewhale --model mimo-v2.5-tts-voiceclone --clone-voice my-voice.wav --say hi
Defensive patterns
Strategy: validation
Validate before calling
if model == "mimo-v2.5-tts-voiceclone" && clone_path.is_none() && voice.as_deref().map_or(true, |v| v.trim().is_empty()) { eprintln!("voiceclone requires --clone-voice or --voice"); } Prevention
- Always pair the voiceclone model with --clone-voice
- Check that the voice variable is non-empty before building the command
When it happens
Trigger: Calling the TTS/voice-clone flow with model mimo-v2.5-tts-voiceclone and no --clone-voice file, plus a --voice value that is empty or whitespace-only, so the else-if chain falls through to the voice-clone bail.
Common situations: Users switch the speech model to voiceclone but forget to pass --clone-voice; a shell variable holding the voice value expands empty; an old config omits the voice field after migrating to the voiceclone model.
Understand the failure class
Background: "missing required argument" and "the following required arguments were not provided": what required-argument errors mean and how to fix them — this error's family across 20 libraries.
Related errors
- lane log proxy requires a command
- mimo-v2.5-tts-voicedesign requires --voice-prompt or…
- Model ' ' requires a voice design prompt. Pass…
- --out is required (write the private key OUTSIDE any…
- A positive pull request number is required
AI-assisted analysis of Hmbown/CodeWhale@73e0f67d83 (2026-09-22).
Data as JSON: /api/errors/679877ada8930b7a.
Report an issue: GitHub.
Appendix: source
Thrown at crates/tui/src/lib.rs:7853
let instruction = combine_speech_instructions(instruction, voice_prompt);
if is_voice_design
&& instruction
.as_deref()
.is_none_or(|value| value.trim().is_empty())
{
bail!(
"mimo-v2.5-tts-voicedesign requires --voice-prompt or --instruction to describe the voice"
);
}
let voice = if let Some(clone_path) = clone_voice {
Some(encode_voice_clone_sample_data_uri(&clone_path)?)
} else if is_voice_design {
None
} else if let Some(value) = voice.filter(|value| !value.trim().is_empty()) {
Some(value)
} else if is_voice_clone {
bail!("mimo-v2.5-tts-voiceclone requires --clone-voice <mp3|wav> or --voice <data-uri>");
} else {
Some(DEFAULT_VOICE.to_string())
};
let format = normalize_speech_format(&format).with_context(|| {
format!("Unsupported speech format '{format}' (allowed: wav, mp3, pcm16)")
})?;
let output = output.unwrap_or_else(|| {
output_dir
.or_else(|| config.speech_output_dir())
.unwrap_or_default()
.join(default_speech_output_name(&format))
});
let client = CodewhaleClient::new(config)?;
let response = client
.synthesize_speech(SpeechSynthesisRequest {
model: model.clone(),
text,View on GitHub (pinned to 73e0f67d83)