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
- Run the TTS download dialog to fetch omnivoice-tts via OmniVoiceDownloadService.
- Check GetExecutableFileName() resolves to the correct OS-specific name (.exe on Windows, bare name elsewhere).
- Verify the folder Se.TextToSpeechFolder/OmniVoice exists and contains the binary.
- 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
- Call IsInstalled() before synthesis.
- Run the TTS download dialog to fetch the omnivoice-tts binary.
- Add an antivirus exclusion for the SE TextToSpeech/OmniVoice folder.
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
- CrispASR executable not found. Install CrispASR via Video →
- OmniVoice TTS models not found in {GetSetModelsFolder()}. Do
- CrispASR executable not found. Install CrispASR via Video →
- OmniVoice TTS voice cloning requires a transcript file at {r
- OmniVoice (CrispASR) — the crispasr server crashed during sy
AI-assisted analysis of SubtitleEdit/subtitleedit@17a9f07487 (2026-08-13).
Data as JSON: /api/errors/c4b38ff447a17e5d.
Report an issue: GitHub.