{"record":{"id":"bf05cfe29d082972","repo":"cjpais/Handy","slug":"moonshine-transcription-failed","errorCode":null,"errorMessage":"Moonshine transcription failed: {}","messagePattern":"Moonshine transcription failed: (.+?)","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"src-tauri/src/managers/transcription.rs","lineNumber":1342,"sourceCode":"                            })\n                            .map_err(|e| {\n                                anyhow::anyhow!(\"transcribe-cpp transcription failed: {}\", e)\n                            })\n                    }\n                    LoadedEngine::Parakeet(parakeet_engine) => {\n                        let params = ParakeetParams {\n                            timestamp_granularity: Some(TimestampGranularity::Segment),\n                            ..Default::default()\n                        };\n                        parakeet_engine\n                            .transcribe_with(&audio, &params)\n                            .map(|r| r.text)\n                            .map_err(|e| anyhow::anyhow!(\"Parakeet transcription failed: {}\", e))\n                    }\n                    LoadedEngine::Moonshine(moonshine_engine) => moonshine_engine\n                        .transcribe(&audio, &TranscribeOptions::default())\n                        .map(|r| r.text)\n                        .map_err(|e| anyhow::anyhow!(\"Moonshine transcription failed: {}\", e)),\n                    LoadedEngine::MoonshineStreaming(streaming_engine) => streaming_engine\n                        .transcribe(&audio, &TranscribeOptions::default())\n                        .map(|r| r.text)\n                        .map_err(|e| {\n                            anyhow::anyhow!(\"Moonshine streaming transcription failed: {}\", e)\n                        }),\n                    LoadedEngine::SenseVoice(sense_voice_engine) => {\n                        let language = match normalize_cjk_language(&validated_language) {\n                            \"zh\" => Some(\"zh\".to_string()),\n                            \"en\" => Some(\"en\".to_string()),\n                            \"ja\" => Some(\"ja\".to_string()),\n                            \"ko\" => Some(\"ko\".to_string()),\n                            \"yue\" => Some(\"yue\".to_string()),\n                            _ => None,\n                        };\n                        applied_language_hint = language.clone();\n                        let params = SenseVoiceParams {\n                            language,","sourceCodeStart":1324,"sourceCodeEnd":1360,"githubUrl":"https://github.com/cjpais/Handy/blob/98a4d80cce8ad41efec2a419b59d9e81229a35d7/src-tauri/src/managers/transcription.rs#L1324-L1360","documentation":"MoonshineModel::transcribe failed during ONNX inference with default TranscribeOptions. transcribe-rs surfaces an ONNX Runtime error — session run failure, execution-provider problem, invalid input length (Moonshine has minimum chunk requirements), or damaged model files. Only this call fails; the engine is put back into the slot, so the model stays loaded for the next attempt.","triggerScenarios":"moonshine_engine.transcribe(&audio, &TranscribeOptions::default()) errors: audio shorter than Moonshine's minimum chunk after VAD trimming; OrtError from a failing GPU execution provider; corrupted/missing .onnx artifacts at inference time; OOM during decode.","commonSituations":"Brief clicks/short utterances reduced to tiny audio by VAD; partial model deletion on disk; ort version/provider mismatch after update; low-memory machines; other GPU processes contending.","solutions":["Retry with a longer recording so the audio meets Moonshine's minimum input length","Re-download the Moonshine model if every attempt fails","Free memory / close GPU-heavy applications and retry","Try another engine to determine whether the fault is Moonshine-specific","Update Handy for ort/transcribe-rs fixes"],"exampleFix":"// before\nlet r = moonshine_engine.transcribe(&audio, &TranscribeOptions::default())?;\n\n// after — pad short audio to Moonshine's minimum chunk before transcribing\nlet audio = if audio.len() < MIN_MOONSHINE_SAMPLES { pad_to(audio, MIN_MOONSHINE_SAMPLES) } else { audio };\nlet r = moonshine_engine.transcribe(&audio, &TranscribeOptions::default())?;","handlingStrategy":"try-catch","validationCode":"// Moonshine needs a minimum chunk; pad or reject before the engine call\nconst MIN_MOONSHINE_SAMPLES: usize = 16_000; // ~1s @ 16kHz\nanyhow::ensure!(audio.len() >= MIN_MOONSHINE_SAMPLES || pad_ok, \"clip too short for Moonshine\");","typeGuard":null,"tryCatchPattern":"match tm.transcribe(audio.clone()) {\n    Err(e) if e.to_string().contains(\"Moonshine transcription failed\") => {\n        let padded = pad_to_min(audio, MIN_MOONSHINE_SAMPLES);\n        tm.transcribe(padded)\n    }\n    other => other,\n}","preventionTips":["Avoid ultra-short clips; Moonshine has minimum input-length requirements","Verify the model pack is intact (non-empty .onnx files) before sessions","Free RAM before long inference batches","Keep transcribe-rs/ort and model artifacts version-aligned via app updates"],"tags":["rust","onnx","moonshine","inference","transcribe-rs"],"backgroundTag":"onnx-inference-failed","analyzedSha":"98a4d80cce8ad41efec2a419b59d9e81229a35d7","analyzedAt":"2026-08-16T20:58:09.966Z","schemaVersion":2},"datasetVersion":"2026-08-16T23:17:17.608Z"}