Transcription that stays on your machine
StoryFolder —
Part of: StoryFolder 0.4: AI Autofill, local transcription, and an assistant that can see your library
Last updated: 2 September 2026.
StoryFolder transcribes with whisper.cpp running as a process on your own computer, on audio taken from the file already sitting on your drive, and it joins every line to the shot it was said in. New in StoryFolder 0.4. It is on by default: when an import finishes, StoryFolder queues the transcription itself, using the small multilingual model. Identify speakers is a separate switch, off by default and slower when it is on. The engine and a model download once and need the network to do it, the recogniser gets things wrong and marks the words it was least sure about with an underline rather than a score, and a video with no speech in it comes back saying so. Transcription, speaker identification and the transcript and subtitle exports are all free.
What runs on your machine, and what still needs the network?
The audio never leaves. Whisper runs locally, speaker detection runs locally, and no third-party transcription account is involved in the job. The network is needed once, at the start, to fetch the engine build for your platform and a model file, and after that a transcription runs with the network off.
That is a statement about where the bytes went, not a certification, and StoryFolder makes no compliance claim on the strength of it. The longer argument about local transcription, including what to say when a client asks, is its own page.
Two things nearby do talk to the internet, and they are worth naming in the same breath so nobody reads "local" as an app-wide promise. AI Autofill sends one frame per shot to StoryFolder's server and on to a hosted vision model; it is the picture half of the index and it is the opposite of this feature in every respect, including the plan it sits on. Licence activation talks to StoryFolder's server too. The privacy help page is the current authority on both.
What happens when you import a video?
It transcribes itself. Automatic transcription is on out of the box, and the moment an import reaches Complete the video is queued for transcription as a separate job.
That separation is deliberate rather than incidental. Transcription is not part of the import's critical path, so a transcription that fails, is cancelled, or finds no engine installed cannot fail the import or leave you with a video stuck at 90%. You get the shots either way.
The controls are all in Settings → Transcription:
- Automatic transcription. The master switch. Off stops new transcriptions and leaves the ones you have readable.
- Download the model at startup. On by default, so the first video you import already has something to run against. Off leaves the download until the first time you actually transcribe, which is what you want on a metered connection.
- Language. Auto-detect, or one of 100. Worth setting by hand when the audio is quiet or switches languages mid-file.
- Translate to English. Transcribes non-English audio straight into English instead of its own language. It needs a multilingual model; the English-only ones refuse the task.
- Identify speakers. Off by default.
- Voice activity detection. On by default. It keeps the recogniser off the stretches with no speech in them, which is what stops timings drifting across a long music passage.
A per-run confirmation lets you override language, task, model, speaker detection and voice activity detection for one video without touching the global preference, which is how a single German interview gets handled inside an otherwise English project.
Which model does StoryFolder download?
small, the multilingual one. There are eight in the catalogue, four sizes in English-only and multilingual pairs, and the app labels them Tiny (English), Tiny (multilingual), Base (English), Base (multilingual), and so on up through Small and Medium.
| Size | What the app shows |
|---|---|
| Tiny | 77 MB |
| Base | 147 MB |
| Small | 487 MB |
| Medium | 1.5 GB |
The English-only and multilingual builds of a size are the same download, which is why small multilingual is the default rather than small.en: defaulting to English-only would buy nothing and would cost anyone working in another language a second full-size download. small rather than something smaller because the multilingual builds are noticeably weaker than their English-only twins at the small end, and this is the size where multilingual becomes usable across languages. If everything you cut is in English, the English-only twin of the same size is the better pick.
Each model carries its own controls: download with a live percentage, verify, which re-hashes the file on disk on demand, and offload, which deletes it. A model counts as installed only once the whole file has arrived intact. Settings → Storage shows what the models, the recognition engine, the speaker-detection assets and the voice-activity model are costing you in disk, and offers to free it.
How does speaker identification work?
It runs a separate local engine over the audio, marks out who is talking when, and labels each line with the speaker it came from. It is off by default and the app's own switch tells you it is slower with it on.
The engine is sherpa-onnx-offline-speaker-diarization, running pyannote's segmentation model plus a speaker embedder natively in C++. No Python, no PyTorch, no GPU requirement, and, like the recogniser, a separate process rather than a library linked into the app. It is not bit-identical to pyannote's reference pipeline, and no accuracy figure is published for it here.
What it gives you is speakers, not identities. They arrive as anonymous labels, and the useful work is the correcting:
- Rename a speaker and the name propagates through the transcript, the exports and the printed storyboard.
- Merge two speakers when one person was split across two labels.
- Assign by selection when the split is inside a line: drag across the words, pick the speaker, and StoryFolder splits the segment at word boundaries rather than reassigning the whole line.
The failure to plan for is the opposite one. Two people talking in the same scene can land under a single automatic speaker, and no amount of renaming fixes that until you have reassigned the words. Where nobody is working from a script, correcting speakers by hand is most of the job, and this is the tooling for it. If the engine is unavailable on a machine, the transcript keeps its single speaker rather than failing.
Where do the words end up?
In the same index as the pictures. Each transcript segment carries its own start and end, so it maps onto the shots it overlaps, and from there the text is searchable next to your metadata rather than as a separate document.
Reading modes are the visible half of that: By shot, By speaker, Continuous, Captions and Plain text. By shot is the one that matters, because it is the transcript laid against the shot grid rather than beside it.
Search is the other half. Type in the library box and a video comes back on a transcript hit with a reason line saying that is what it matched, in the same result list as a metadata match. The transcript editor has its own search box, which is a different and cleverer thing: it tolerates a word the recogniser split or misheard, and recovering a misheard word is its own page. An assistant reaches the same text through the connector's search tool.
Exports are SRT, WebVTT, plain text, CSV and Fountain, under Transcript & Subtitles in the export panel, and none of them is behind a plan. The CSV is the one worth knowing about, because it carries the shot number alongside the start, end, speaker and text, so the file already knows which picture each line belongs to. Speaker names print in SRT and VTT once there is more than one speaker. Statistics adds a transcript block: total lines, total words and each speaker's share.
What should you check before you trust a transcript?
Names, numbers, and the places where the audio was hard. Whisper degrades on heavy accents, on people talking over each other, on noisy location sound, and on whatever specialist vocabulary your client's industry runs on; product names and surnames are where you will notice it first.
StoryFolder's answer is a dotted underline under the words the model was least sure about, and no number anywhere, because Whisper's own confidence is not calibrated well enough to print as a percentage. The underline is a Display toggle and it is off until you turn it on.
On a long project, check the ends rather than the middle: the first and last minutes, the longest shot, one shot with music and no dialogue, and one where two people overlap. A file with music and no speech comes back as "No speech found in this video", which is a result about the audio and not a failed run. Then check the one export you are actually going to hand over, because a subtitle file that reads well in the app and badly in someone else's player is a problem you want to find now.
FAQ
Does StoryFolder upload my video to transcribe it? No. whisper.cpp runs as a process on your own machine against audio pulled from the local file. The engine and a model download once from StoryFolder's servers.
Does transcription start automatically after import? Yes. Automatic transcription is on by default, and a video is queued for transcription once its import reaches Complete.
Which model is the default?
small, the multilingual one, which the app shows as 487 MB. There are eight models across four sizes in English-only and multilingual pairs.
Is speaker identification free? Yes, and so is transcription. Identify speakers is off by default, and the speakers it finds still need naming by hand.
Which transcript and subtitle formats can I export? SRT, WebVTT, plain text, CSV and Fountain, none of them gated. The gated export is the Spreadsheet / Shot List.
Does speaker detection need Python or a GPU? No. The engine runs natively as its own process, with no Python, no PyTorch and no GPU requirement.
Can transcription find b-roll with no dialogue? No. It indexes speech, so a silent shot needs shot metadata instead, which is a different problem with a different answer.
Is there a Linux build? No. Engine builds are published for macOS on Apple silicon, macOS on Intel, and Windows x64.