{"record":{"id":"a4eecf4d3de0fecf","repo":"babysor/MockingBird","slug":"duration-must-be-in-range-0-36-seconds","errorCode":null,"errorMessage":"duration must be in range (0, 36] seconds","messagePattern":"duration must be in range \\(0, 36\\] seconds","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"skills/speak/scripts/noiz_tts.py","lineNumber":70,"sourceCode":"\ndef synthesize(\n    base_url: str,\n    api_key: str,\n    text: str,\n    voice_id: Optional[str],\n    reference_audio: Optional[Path],\n    output_format: str,\n    speed: float,\n    emo: Optional[str],\n    target_lang: Optional[str],\n    similarity_enh: bool,\n    save_voice: bool,\n    duration: Optional[float],\n    timeout: int,\n    out_path: Path,\n) -> float:\n    if duration is not None and not (0 < duration <= 36):\n        raise ValueError(\"duration must be in range (0, 36] seconds\")\n    url = f\"{base_url.rstrip('/')}/text-to-speech\"\n    data: Dict[str, str] = {\n        \"text\": text,\n        \"output_format\": output_format,\n        \"speed\": str(speed),\n    }\n    if voice_id:\n        data[\"voice_id\"] = voice_id\n    if emo:\n        data[\"emo\"] = emo\n    if target_lang:\n        data[\"target_lang\"] = target_lang\n    if similarity_enh:\n        data[\"similarity_enh\"] = \"true\"\n    if save_voice:\n        data[\"save_voice\"] = \"true\"\n    if duration is not None:\n        data[\"duration\"] = str(duration)","sourceCodeStart":52,"sourceCodeEnd":88,"githubUrl":"https://github.com/babysor/MockingBird/blob/28dc5e14f12d7c754612af2fde8e78a4b03f8616/skills/speak/scripts/noiz_tts.py#L52-L88","documentation":"ValueError raised by synthesize() when the optional duration parameter is outside the API-supported range. The Noiz /text-to-speech endpoint only accepts durations greater than 0 and at most 36 seconds; this is a client-side pre-validation of that constraint.","triggerScenarios":"Calling synthesize(..., duration=0), a negative duration, or duration > 36 (e.g. 60 to synthesize a minute of audio in one call).","commonSituations":"User passes a CLI --duration meant for long narration, or computes duration from subtitle cue timings that exceed 36s per cue.","solutions":["Clamp duration to (0, 36] before calling synthesize","Split long audio into multiple <=36s requests and concatenate","Pass duration=None to let the server decide length"],"exampleFix":"# before\nsynthesize(..., duration=60.0)\n# after\nsynthesize(..., duration=min(duration, 36.0))","handlingStrategy":"validation","validationCode":"def safe_duration(d):\n    if d is None: return None\n    if not (0 < d <= 36):\n        raise ValueError('duration must be in (0, 36]')\n    return d","typeGuard":"def is_valid_duration(d) -> bool:\n    return d is None or (isinstance(d, (int, float)) and 0 < d <= 36)","tryCatchPattern":"try:\n    synthesize(...)\nexcept ValueError as e:\n    if 'duration' in str(e):\n        synthesize(..., duration=None)","preventionTips":["Clamp durations to 36s max","Chunk long audio needs into multiple requests","Validate numeric CLI args before calling"],"tags":["validation","parameter","range","noiz-tts"],"backgroundTag":"parameter-out-of-range","analyzedSha":"28dc5e14f12d7c754612af2fde8e78a4b03f8616","analyzedAt":"2026-08-27T02:26:53.589Z","schemaVersion":2},"datasetVersion":"2026-08-27T03:17:27.898Z"}