{"record":{"id":"619d47c1b6f3c182","repo":"Hmbown/CodeWhale","slug":"mimo-v2-5-tts-voicedesign-requires-voice-prompt","errorCode":null,"errorMessage":"mimo-v2.5-tts-voicedesign requires --voice-prompt or --instruction to describe the voice","messagePattern":"mimo-v2\\.5-tts-voicedesign requires --voice-prompt or --instruction to describe the voice","errorType":"validation","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/tui/src/lib.rs","lineNumber":7392,"sourceCode":"        voice_prompt.is_some(),\n    );\n    let model_lower = model.to_ascii_lowercase();\n    if !model_lower.contains(\"tts\") {\n        bail!(\n            \"speech requires a TTS model (examples: {}); got {model}\",\n            SPEECH_MODEL_EXAMPLES.join(\", \")\n        );\n    }\n    let is_voice_design = model_lower.contains(\"voicedesign\");\n    let is_voice_clone = model_lower.contains(\"voiceclone\");\n\n    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    })?;","sourceCodeStart":7374,"sourceCodeEnd":7410,"githubUrl":"https://github.com/Hmbown/CodeWhale/blob/0c42157ee52f9d55af2b506d71b46249910f77d3/crates/tui/src/lib.rs#L7374-L7410","documentation":"Voice-design guard: when the resolved model contains \"voicedesign\" (mimo-v2.5-tts-voicedesign), the command needs a natural-language description of the voice supplied via `--voice-prompt` or `--instruction` (combined by combine_speech_instructions). Without one the design model has nothing to synthesize a voice from, so the CLI bails.","triggerScenarios":"`codewhale speech --model mimo-v2.5-tts-voicedesign` (or inference selecting it via --voice-prompt) with neither `--voice-prompt` nor `--instruction`, or both blank after trimming.","commonSituations":"Switching from plain TTS to voice design and assuming a default voice applies; passing --instruction containing only whitespace.","solutions":["Add `--voice-prompt \"...\"` describing the target voice (tone, gender, pace)","Or add `--instruction \"...\"`; when both are present they are merged","If you did not want voice design, switch the model back to mimo-v2.5-tts"],"exampleFix":"// before\n$ codewhale speech --model mimo-v2.5-tts-voicedesign\nError: mimo-v2.5-tts-voicedesign requires --voice-prompt or --instruction to describe the voice\n\n// after\n$ codewhale speech --model mimo-v2.5-tts-voicedesign --voice-prompt 'calm male narrator, slow pace'","handlingStrategy":"validation","validationCode":"case \"$MODEL\" in *voicedesign*)\n  [ -n \"${VOICE_PROMPT}${INSTRUCTION}\" ] || { echo 'voicedesign needs --voice-prompt or --instruction' >&2; exit 2; } ;;\nesac","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Treat a voice description as mandatory input wherever the design model is used","Keep prompts in variables so the flag is never accidentally dropped"],"tags":["speech","tts","voice-design","missing-argument"],"backgroundTag":"missing-required-argument","analyzedSha":"0c42157ee52f9d55af2b506d71b46249910f77d3","analyzedAt":"2026-08-20T21:50:45.477Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}