SubtitleEdit/subtitleedit · error · FileNotFoundException

OmniVoice TTS models not found in {GetSetModelsFolder()}. Do

Error message

OmniVoice TTS models not found in {GetSetModelsFolder()}. Download them via the TTS download dialog.

What it means

FileNotFoundException thrown when either the omnivoice main model (GetModelBasePath) or the tokenizer/codec model (GetModelTokenizerPath) does not exist in the OmniVoice models folder. Both files are required by the omnivoice-tts CLI via its --model and --codec arguments.

Source

Thrown at src/ui/Features/Video/TextToSpeech/Engines/OmniVoiceTtsCpp.cs:234

        string? model,
        CancellationToken cancellationToken)
    {
        if (voice.EngineVoice is not OmniVoice omniVoice)
        {
            throw new ArgumentException("Voice is not an OmniVoice");
        }

        var exe = GetExecutableFileName();
        if (!File.Exists(exe))
        {
            throw new FileNotFoundException("omnivoice-tts executable not found.", exe);
        }

        var modelPath = GetModelBasePath();
        var codecPath = GetModelTokenizerPath();
        if (!File.Exists(modelPath) || !File.Exists(codecPath))
        {
            throw new FileNotFoundException(
                $"OmniVoice TTS models not found in {GetSetModelsFolder()}. Download them via the TTS download dialog.");
        }

        var outputFileName = Path.Combine(TtsOutputFolder.Resolve(outputFolder, GetSetFolder), Guid.NewGuid() + ".wav");
        var inputText = text;

        var psi = new ProcessStartInfo
        {
            WorkingDirectory = GetSetFolder(),
            FileName = exe,
            UseShellExecute = false,
            CreateNoWindow = true,
            RedirectStandardInput = true,
            RedirectStandardOutput = true,
            RedirectStandardError = true,
            StandardInputEncoding = Encoding.UTF8,
        };

View on GitHub (pinned to 17a9f07487)

Solutions

  1. Run the TTS download dialog to fetch the OmniVoice models (model + tokenizer pair).
  2. Check IsModelsInstalled() before calling Speak() to detect the missing-models state early.
  3. Verify both files exist: the model GGUF and the tokenizer GGUF in GetSetModelsFolder().
  4. If the download service changed model filenames, delete the old files and re-download to get the current pair.

Example fix

// before — throws mid-Speak if models are missing
if (!File.Exists(modelPath) || !File.Exists(codecPath))
    throw new FileNotFoundException($"OmniVoice TTS models not found in {GetSetModelsFolder()}...");

// after — surface in the UI with a download action
if (!IsModelsInstalled())
{
    await DialogService.ShowWarningAndAction(
        $"OmniVoice models not found in {GetSetModelsFolder()}.",
        "Download models", () => ShowDownloadDialog());
    return;
}
Defensive patterns

Strategy: validation

Validate before calling

// Check both model files exist before synthesis
if (!OmniVoiceTtsCpp.IsModelsInstalled())
{
    await ShowDownloadDialog("OmniVoice models not installed.");
    return;
}

Type guard

null

Try / catch

catch (FileNotFoundException ex) when (ex.Message.Contains("models not found"))
{
    await ShowDownloadDialog("Download OmniVoice models.");
    // Retry after download
}

Prevention

When it happens

Trigger: File.Exists(modelPath) or File.Exists(codecPath) returns false. The model filenames come from OmniVoiceDownloadService.ModelBaseFileName and ModelTokenizerFileName, so they depend on which release was pinned at download time.

Common situations: The user downloaded the engine binary but not the models (two-step download); the models were partially downloaded and one file is missing; the models folder was cleaned up; the download service was updated to new model filenames but the old files remain (or vice versa).

Related errors


AI-assisted analysis of SubtitleEdit/subtitleedit@17a9f07487 (2026-08-13). Data as JSON: /api/errors/403b78a1324b8671. Report an issue: GitHub.