Repository navigation
feat: Add Whisper speech-to-text captioning for video and audio (.srt) (Continues #774) - #788
Conversation
KnifeLemon
left a comment
There was a problem hiding this comment.
Thanks, @rohitLovesKrishna! That was a fast and thorough round. The translations are intact now, the outside paths and the transliteration are gone, the model is pinned, and the scope is SRT only. I've approved the CI run.
A few things are left before this can go in:
1. Spoken language needs a control
SpokenLanguage exists, but nothing in the app sets it. Today it can only be changed by editing presets.json. Please add a picker to the preset editor, under the Caption checkbox:
- Auto (the default);
- the languages whisper.cpp knows, shown by name.
2. No platform checks in Filee.Core
BuiltInData and the v57 migration branch on OperatingSystem.IsWindows(). Built-in data and migrations have to be the same everywhere: a settings folder moves between machines, and the Core tests run on all three systems.
- Keep the preset and the slices the same on every platform.
- Let
PresetAvailabilitymark the slice unusable on macOS and Linux, as it already does.
3. Wording
- Not built in: "Whisper (built-in AI)" / "Whisper (내장 AI)" isn't right, because it's a ~157 MB download. Plain "Whisper" is enough.
- Avoid "any language": whisper.cpp knows about 100.
- Korean uses the polite 해요 style throughout
ko.json("…바꿔요"), not 합니다. For example:engines.package.whisper.description:동영상과 오디오의 말소리를 SRT 자막 파일로 바꿔요. 인터넷 연결 없이 작동해요.
4. Long files
- Fixed timeouts: 10 minutes for the FFmpeg extraction and 30 minutes for Whisper are fixed. A two-hour video with the base model on a CPU can take longer than that. Use
StallWatchlike FFmpeg and calibre do: let it run while it keeps printing progress (-pp), and report that progress instead of the fixed 0.20 / 0.85. - Threads:
-t 4should follow the machine (Environment.ProcessorCount, capped sensibly).
5. Results through Filee
The SRT samples in the description come from running whisper-cli.exe by hand. Please show them made by Filee: the Caption slice on the donut, or
filee convert clip.mp4 --preset caption-video
Include one English clip and one other language, with the language picker set once to Auto and once to the language itself.
Thanks again! Tag me when it's ready.
2026-10-30.12-52-55_compressed.mp4Thanks for the thorough review, @KnifeLemon ! I've addressed all the points: 1. Spoken language control in Preset Editor
2. Platform neutrality in Filee.Core
3. Wording & Translations
4. Long files & progress
5. Results through Filee CLITest 1: English clip (
|
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Indonesian (KnifeLemon#790) came to main after this branch started, so id.json was missing the ten caption and spoken-language strings. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The format check wants a final newline. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
KnifeLemon
left a comment
There was a problem hiding this comment.
Thanks, @rohitLovesKrishna! Every point from the review is in:
- the spoken language picker (Auto plus whisper.cpp's languages);
- no platform checks in
Filee.Core; - plain "Whisper" in the strings, and 해요 style in Korean;
StallWatchwith real progress instead of fixed timeouts, and threads that follow the machine;- results made through Filee itself.
I merged main into the branch, added the ten new strings in Indonesian (which reached main meanwhile), and added a missing final newline for the format check. CI is green on all platforms.
Welcome aboard, and thanks for sticking with two rounds of review!

2026-10-30.09-22-30_compressed.mp4
Hi @KnifeLemon ,
Continues #774
Thank you for the detailed and constructive review! All requested points have been fully addressed:
Summary of Changes:
Preserved Translations & i18n:
main(028390c3).crop.perspective*,crop.corner_*) and preserved original indentation across all 18i18n/*.jsonfiles.Clean Engine Paths & FFmpeg Integration:
WhisperConverternow strictly searchesFindBundled,OwnCopyFolder, the CLI folder, and systemPATH.FfmpegConverter.Locate(). Throws a clean error if missing; removed bare"ffmpeg"fallback.Multi-language Support (Spoken Language Option):
UrduToDevanagari.cs.SpokenLanguage(defaults to"auto") toMediaOptions, passed directly towhisper.cppvia-l <lang>.Pinned Model Download:
ggml-base.bindownload inengines.jsonto immutable commit SHA5359861c739e955e79d9a303bcbc70fb988958b1.Cross-Platform Handling (Windows-only Gate):
engines.jsonand the Donut Caption slice are gated to Windows (OperatingSystem.IsWindows()).WhisperConverter.GetStatus()cleanly reportsengine.reason.unsupported_platform.Scoped Strictly to SRT (Removed Burn-in):
IConverter.csandRoutePlanner.csto reflect SRT transcription only.Clean Schema Migration:
AddCaptionPresetinUserDataStore.csto standard migration semantics: inserts preset, offers tovideoandaudioprofiles.CaptionRouteTests.csverifying a v56 library learns the preset once on both donuts.Notices & Docs:
whisper.cpp(MIT) and GGML Whisper model (MIT) toTHIRD-PARTY-NOTICES.md.docs/ENGINES.mddetailing size (~157 MB with base model), offline operation, and FFmpeg requirement.Evidence & Sample Subtitles:
1. English Sample (
test_en.srt):Command:
whisper-cli.exe -m ggml-base.bin -f clip_en.wav -osrt -of clip_en -l en -t 4Output:
2. Hindi Sample (
test_hi.srt):Command:
whisper-cli.exe -m ggml-base.bin -f sant.wav -osrt -of sant -l hi -t 4Output:
(Attaching screenshots of Settings → Engines and the Donut with the Caption slice below).


