SubtitleEdit/subtitleedit · error · FileNotFoundException

omnivoice-tts executable not found.

Error message

omnivoice-tts executable not found.

What it means

FileNotFoundException thrown at the start of OmniVoiceTtsCpp.Speak when the omnivoice-tts binary does not exist at GetExecutableFileName() (the OmniVoice folder under Se.TextToSpeechFolder). Unlike the CrispASR engines, this is a standalone CLI binary, not a shared runtime.

Source

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

    public async Task<TtsResult> Speak(
        string text,
        string outputFolder,
        Voice voice,
        TtsLanguage? language,
        string? region,
        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,

View on GitHub (pinned to 17a9f07487)

Solutions

  1. Run the TTS download dialog to fetch omnivoice-tts via OmniVoiceDownloadService.
  2. Check GetExecutableFileName() resolves to the correct OS-specific name (.exe on Windows, bare name elsewhere).
  3. Verify the folder Se.TextToSpeechFolder/OmniVoice exists and contains the binary.
  4. Add an antivirus exclusion if the binary keeps disappearing after download.

Example fix

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

// after — check IsInstalled and guide the user before Speak
if (!await engine.IsInstalled(region))
{
    await ShowDownloadDialog(nameof(OmniVoiceTtsCpp));
    return;
}
Defensive patterns

Strategy: validation

Validate before calling

// Check before synthesis
if (!File.Exists(OmniVoiceTtsCpp.GetExecutableFileName()))
{
    await ShowDownloadDialog("omnivoice-tts binary not installed.");
    return;
}

Type guard

null

Try / catch

catch (FileNotFoundException ex) when (ex.Message.Contains("omnivoice-tts executable not found"))
{
    await ShowDownloadDialog(nameof(OmniVoiceDownloadService));
    // Retry after download
}

Prevention

When it happens

Trigger: Calling Speak() on the OmniVoice TTS engine when the omnivoice-tts (or omnivoice-tts.exe on Windows) executable has not been downloaded. The check is File.Exists(exe) returning false.

Common situations: User picked OmniVoice TTS without running the download dialog; the OmniVoice folder was deleted; the binary was quarantined by antivirus; the user is on a platform (e.g., FreeBSD) for which no prebuilt binary was downloaded.

Related errors


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