cjpais/Handy · error · anyhow::Error

Parakeet transcription failed

Error message

Parakeet transcription failed: {}

What it means

The Parakeet branch calls parakeet_engine.transcribe_with(&audio, &params) with segment-level timestamp granularity; this error wraps the ONNX Runtime inference failure. The chained message after the colon is ORT's own error (provider failure, invalid tensor shape, session/graph error).

Solutions

  1. Check the chained ORT message for provider errors and switch accelerator to CPU if GPU is implicated
  2. Retry with a slightly longer recording to rule out too-short audio
  3. Reload/re-download the Parakeet model if the graph itself errors
  4. Update the app if the ONNX Runtime version changed model compatibility
Defensive patterns

Strategy: retry

Try / catch

if let Err(e) = manager.transcribe(audio.clone()) {
    if e.to_string().contains("Parakeet transcription failed") {
        // transient ORT/provider failures often clear: reload model and retry once
        manager.unload_current_model();
        manager.load_model_blocking(&model_id, None)?;
        return manager.transcribe(audio);
    }
    return Err(e);
}

Prevention

When it happens

Trigger: ONNX inference fails: audio too short/degenerate for the feature extractor, execution provider error (CUDA/CoreML/DirectML init or runtime failure), or corrupted model graph loaded earlier.

Common situations: Very short recordings (a fraction of a second) after VAD trimming; GPU provider issues on driver update; mixing model files between versions of the app.

Related errors


AI-assisted analysis of cjpais/Handy@ba10ce1943 (2026-08-17). Data as JSON: /api/errors/ab6bcbb50e426cce. Report an issue: GitHub.

Appendix: source

Thrown at src-tauri/src/managers/transcription.rs:1363

                            .map(|t| {
                                // Whisper's audio-based LID (auto mode only;
                                // `None` when a language hint was passed).
                                model_detected_language = t.language;
                                t.text
                            })
                            .map_err(|e| {
                                anyhow::anyhow!("transcribe-cpp transcription failed: {}", e)
                            })
                    }
                    LoadedEngine::Parakeet(parakeet_engine) => {
                        let params = ParakeetParams {
                            timestamp_granularity: Some(TimestampGranularity::Segment),
                            ..Default::default()
                        };
                        parakeet_engine
                            .transcribe_with(&audio, &params)
                            .map(|r| r.text)
                            .map_err(|e| anyhow::anyhow!("Parakeet transcription failed: {}", e))
                    }
                    LoadedEngine::Moonshine(moonshine_engine) => moonshine_engine
                        .transcribe(&audio, &TranscribeOptions::default())
                        .map(|r| r.text)
                        .map_err(|e| anyhow::anyhow!("Moonshine transcription failed: {}", e)),
                    LoadedEngine::MoonshineStreaming(streaming_engine) => streaming_engine
                        .transcribe(&audio, &TranscribeOptions::default())
                        .map(|r| r.text)
                        .map_err(|e| {
                            anyhow::anyhow!("Moonshine streaming transcription failed: {}", e)
                        }),
                    LoadedEngine::SenseVoice(sense_voice_engine) => {
                        let language = match normalize_cjk_language(&validated_language) {
                            "zh" => Some("zh".to_string()),
                            "en" => Some("en".to_string()),
                            "ja" => Some("ja".to_string()),
                            "ko" => Some("ko".to_string()),
                            "yue" => Some("yue".to_string()),

View on GitHub (pinned to ba10ce1943)