{"record":{"id":"679877ada8930b7a","repo":"Hmbown/CodeWhale","slug":"mimo-v2-5-tts-voiceclone-requires-clone-voice-m","errorCode":null,"errorMessage":"mimo-v2.5-tts-voiceclone requires --clone-voice <mp3|wav> or --voice <data-uri>","messagePattern":"mimo-v2\\.5-tts-voiceclone requires --clone-voice <mp3\\|wav> or --voice <data-uri>","errorType":"validation","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/tui/src/lib.rs","lineNumber":7404,"sourceCode":"    let instruction = combine_speech_instructions(instruction, voice_prompt);\n    if is_voice_design\n        && instruction\n            .as_deref()\n            .is_none_or(|value| value.trim().is_empty())\n    {\n        bail!(\n            \"mimo-v2.5-tts-voicedesign requires --voice-prompt or --instruction to describe the voice\"\n        );\n    }\n\n    let voice = if let Some(clone_path) = clone_voice {\n        Some(encode_voice_clone_sample_data_uri(&clone_path)?)\n    } else if is_voice_design {\n        None\n    } else if let Some(value) = voice.filter(|value| !value.trim().is_empty()) {\n        Some(value)\n    } else if is_voice_clone {\n        bail!(\"mimo-v2.5-tts-voiceclone requires --clone-voice <mp3|wav> or --voice <data-uri>\");\n    } else {\n        Some(DEFAULT_VOICE.to_string())\n    };\n    let format = normalize_speech_format(&format).with_context(|| {\n        format!(\"Unsupported speech format '{format}' (allowed: wav, mp3, pcm16)\")\n    })?;\n    let output = output.unwrap_or_else(|| {\n        output_dir\n            .or_else(|| config.speech_output_dir())\n            .unwrap_or_default()\n            .join(default_speech_output_name(&format))\n    });\n\n    let client = DeepSeekClient::new(config)?;\n    let response = client\n        .synthesize_speech(SpeechSynthesisRequest {\n            model: model.clone(),\n            text,","sourceCodeStart":7386,"sourceCodeEnd":7422,"githubUrl":"https://github.com/Hmbown/CodeWhale/blob/0c42157ee52f9d55af2b506d71b46249910f77d3/crates/tui/src/lib.rs#L7386-L7422","documentation":"Voice-clone guard: for model names containing \"voiceclone\" the request must carry a voice sample — either `--clone-voice <path to mp3/wav>` (base64-encoded to a data URI, 10 MiB cap) or `--voice` holding an existing data:audio/... data-URI. With neither present the clone model cannot operate, so the CLI bails instead of sending a doomed request.","triggerScenarios":"`codewhale speech --model mimo-v2.5-tts-voiceclone` where `--clone-voice` is absent and `--voice` is absent or whitespace-only (a non-blank --voice value is passed through to the API instead).","commonSituations":"Forgetting the sample file after switching models; running voiceclone with only a text prompt; assuming a named default voice suffices for cloning.","solutions":["Clone from a file: add `--clone-voice <path>` to an mp3 or wav sample","Or supply the sample inline: `--voice data:audio/wav;base64,...`","If you meant ordinary TTS, use the non-clone model (mimo-v2.5-tts) with the default voice"],"exampleFix":"// before\n$ codewhale speech --model mimo-v2.5-tts-voiceclone\nError: mimo-v2.5-tts-voiceclone requires --clone-voice <mp3|wav> or --voice <data-uri>\n\n// after\n$ codewhale speech --model mimo-v2.5-tts-voiceclone --clone-voice sample.wav\n// or: --voice data:audio/wav;base64,...","handlingStrategy":"validation","validationCode":"case \"$MODEL\" in *voiceclone*)\n  [ -n \"${CLONE_VOICE}${VOICE}\" ] || { echo 'voiceclone needs --clone-voice or --voice' >&2; exit 2; } ;;\nesac","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Keep clone samples in a fixed location and default-expand the path with : \"${SAMPLE:?}\"","Remember --voice must be a data:audio/... URI when used for cloning"],"tags":["speech","tts","voice-cloning","missing-argument"],"backgroundTag":"missing-required-argument","analyzedSha":"0c42157ee52f9d55af2b506d71b46249910f77d3","analyzedAt":"2026-08-20T21:50:45.477Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}