Turn any video into text β in a few clicks, on your own computer.
Pick a folder with videos, pick a folder for the results, press one button.
No accounts, no uploads, no subscriptions.
- What is this?
- What you get
- Quick start (easiest way, with Docker)
- Alternative: install without Docker
- Using the app
- Supported formats
- What the results look like
- Choosing an accuracy level
- Command line (optional)
- Frequently asked questions
- Troubleshooting
- For developers
- License
vid2text listens to your videos and writes down what is said. It is handy for:
- π meeting and lecture recordings,
- π online courses and webinars,
- ποΈ interviews and podcasts,
- π making a huge video archive searchable.
Under the hood it uses Whisper, a well-known speech recognition model, through the fast faster-whisper library. It understands about 100 languages and works fully offline once the model has been downloaded.
π Privacy: your videos never leave your computer. Nothing is sent to any server.
| π±οΈ Simple interface | A web page with three steps. No commands needed. |
| π Folder in β folder out | Convert a whole folder (including sub-folders) at once. Results keep the same folder structure. |
| ποΈ Every common format | MP4, MOV, MKV, AVI, WEBM, WMV, FLV and many more β even plain audio like MP3 and WAV. |
| π TXT and JSON | Readable text for people, structured data for programs. Pick one or both. |
| π Many languages | Detects the language automatically, or you can choose it yourself. |
| β»οΈ Safe to re-run | Already converted files are skipped, so you can stop and continue later. |
| π³ Docker ready | One command to run it anywhere, nothing else to install. |
Docker is a free program that runs apps in a ready-made box, so you don't need to install anything else.
Download Docker Desktop for your system and install it like any other app: π https://www.docker.com/products/docker-desktop/
Then open Docker Desktop and wait until it says it is running.
Click the green Code button at the top of this page β Download ZIP, then unzip it.
(If you know Git: git clone https://github.com/averageencoreenjoer/vid2text.git)
Open a terminal inside the unzipped folder:
- Windows: open the folder, click the address bar, type
cmd, press Enter. - macOS: right-click the folder β New Terminal at Folder.
Then run:
docker compose up --buildThe first start takes a few minutes (it builds the app once). Later starts take seconds.
Open your browser and go to π http://localhost:8000
Two folders are created next to the project files:
| Folder | What it is for |
|---|---|
input/ |
Put your videos here |
output/ |
Your text files will appear here |
Copy videos into input/, press Start converting, and collect the results from output/.
To stop the app, press Ctrl + C in the terminal.
π‘ Want to use videos from another place on your computer? Open
docker-compose.ymland replace./inputwith the full path of your folder, for exampleC:/Users/Anna/Videos:/data/input(Windows) or/Users/anna/Movies:/data/input(macOS).
Prefer to run it directly? You need Python 3.10 or newer (download).
git clone https://github.com/averageencoreenjoer/vid2text.git
cd vid2text
python -m venv .venv
# Windows: .venv\Scripts\activate
# macOS/Linux:
source .venv/bin/activate
pip install .
vid2text serveYour browser opens automatically. ffmpeg (the tool that reads video files) is installed together with the app, so there is nothing else to set up.
The page has three numbered cards:
ββββββββββββββββββββββββββββββββββββββββββββββββ
β β Where are your videos? β
β [ /Users/anna/Videos ] [Browseβ¦]β
ββββββββββββββββββββββββββββββββββββββββββββββββ€
β β‘ Where should the text go? β
β [ /Users/anna/Transcripts ] [Browseβ¦]β
β Save as: (β TXT) (β JSON) β
ββββββββββββββββββββββββββββββββββββββββββββββββ€
β β’ Convert β
β [ Start converting ] β
β ββββββββββββββββ 3 of 8 files β
ββββββββββββββββββββββββββββββββββββββββββββββββ
- Choose the input folder. Click Browse⦠and click through your folders, or paste the path. The app tells you how many video files it found.
- Choose the output folder and tick the formats you want (TXT, JSON or both). The folder is created if it does not exist.
- Press Start converting. A progress bar shows which file is being processed. You can press Stop at any time; finished files are kept.
When everything is done you will see a list with β (done), β· (skipped) or β (failed, with the reason).
Click Advanced settings to change:
- Accuracy β a bigger model is more accurate but slower. See below.
- Spoken language β leave on Detect automatically unless the results come out in the wrong language.
- Include sub-folders β on by default.
- Add time marks to TXT files β adds
[00:01:15]at the start of every line. - Redo files that were already converted β by default they are skipped.
The app remembers your folders and settings for next time.
β³ First run: the speech model is downloaded once (from about 75 MB to 3 GB, depending on the accuracy you choose). After that it works offline. With Docker the model is stored in a Docker volume, so it is not downloaded again.
Video: mp4 m4v mov mkv avi wmv flv f4v webm mpg mpeg m2v ts mts m2ts 3gp 3g2 ogv vob asf rm rmvb divx mxf dv
Audio only: mp3 wav m4a aac flac ogg opus wma amr
If your video is in a rare format that is not listed, convert it to MP4 first, or open an issue.
For a video called lecture.mp4 you get lecture.txt and/or lecture.json.
lecture.txt β plain text, one phrase per line:
Hello and welcome to today's lecture.
Let's start with a quick overview.
With time marks turned on:
[00:00:00] Hello and welcome to today's lecture.
[00:00:04] Let's start with a quick overview.
lecture.json β structured data, useful if you want to process the text with other programs:
{
"source": "lecture.mp4",
"language": "en",
"duration": 312.4,
"text": "Hello and welcome to today's lecture. Let's start with a quick overview.",
"segments": [
{ "start": 0.0, "end": 3.2, "text": "Hello and welcome to today's lecture." },
{ "start": 3.2, "end": 6.8, "text": "Let's start with a quick overview." }
]
}Videos in sub-folders produce results in the same sub-folders of the output directory.
| Level | Download size* | Speed | Accuracy | Good for |
|---|---|---|---|---|
tiny |
~75 MB | β‘β‘β‘β‘β‘ | β ββββ | Quick tests, very clear speech |
base |
~140 MB | β‘β‘β‘β‘ | β β βββ | Default β everyday use |
small |
~460 MB | β‘β‘β‘ | β β β ββ | Good balance |
medium |
~1.5 GB | β‘β‘ | β β β β β | Noisy audio, accents |
large-v3 |
~3 GB | β‘ | β β β β β | Best quality, needs a strong computer |
* Approximate. Not sure what to pick? Start with base; if the text has too many mistakes, try small.
You don't need this if you use the web page. It is useful for automation.
# Convert a folder to both TXT and JSON
vid2text run ./videos ./transcripts
# Only TXT, Russian speech, better accuracy, with time marks
vid2text run ./videos ./transcripts -f txt -l ru -m small --timestamps
# Start the web interface on another port
vid2text serve --port 9000| Option | Meaning |
|---|---|
-f, --format |
txt or json (repeat for both; default both) |
-m, --model |
tiny, base, small, medium, large-v3 |
-l, --language |
Language code like en, ru, de (default: auto-detect) |
--timestamps |
Add time marks to TXT |
--no-recursive |
Ignore sub-folders |
--overwrite |
Redo files that already have results |
With Docker:
docker compose run --rm vid2text run /data/input /data/output -m smallIs it free? Yes, completely. It is open source under the MIT license.
Do I need internet? Only once, to download the speech model. After that it works offline.
Does it need a powerful computer or a graphics card? No. A normal laptop works; bigger models are just slower.
Can it separate speakers ("Speaker 1 / Speaker 2")? Not at the moment.
Can it translate to another language? Not at the moment; it writes down what is said, in the language that is spoken.
What if a video has no sound? That file is marked as failed with a clear reason, and the rest continue.
| Problem | What to do |
|---|---|
docker: command not found |
Install Docker Desktop and make sure it is running. |
| The page does not open | Check that the terminal still shows the app running, then visit http://localhost:8000. If the port is busy, change 8000:8000 to 9000:8000 in docker-compose.yml and visit localhost:9000. |
| "No video or audio files were found" | Check that the videos are in the folder you chose and have a supported extension. |
| Stuck on "Preparingβ¦" for a long time | The model is being downloaded on the first run. Wait, or choose a smaller accuracy level. |
| The text is in the wrong language | Open Advanced settings and choose the language manually. |
| The text has many mistakes | Pick a higher accuracy level (small or medium). |
| One file says "failed" | Read the reason shown next to it. The file may be damaged or have no audio track. |
src/vid2text/
βββ formats.py supported file extensions
βββ media.py finding files, extracting audio with ffmpeg
βββ engine.py speech recognition (faster-whisper wrapper)
βββ writers.py TXT and JSON output
βββ pipeline.py the batch conversion logic
βββ jobs.py background job runner used by the web UI
βββ cli.py command line entry point
βββ web/ FastAPI app and the static front-end
tests/ automated tests
pip install -e ".[dev]"
pytest
ruff check .The tests replace the speech model with a tiny fake one, so they are fast and need no download. They still use real ffmpeg to build sample MP4, MKV, AVI, WEBM and MOV files.
Every push and pull request runs GitHub Actions:
- β tests on Linux, macOS and Windows with Python 3.10 and 3.12,
- β lint check with Ruff,
- β Docker image build, the test suite inside the image, and a start-up check of the web interface.
| Method | Path | Purpose |
|---|---|---|
GET |
/api/config |
Models, supported extensions, default folders |
GET |
/api/browse?path=β¦ |
List sub-folders (used by the folder picker) |
POST |
/api/jobs |
Start a conversion |
GET |
/api/jobs/current |
Progress and results |
POST |
/api/jobs/cancel |
Stop after the current file |
| Variable | Meaning |
|---|---|
VID2TEXT_ROOTS |
Restrict the folder picker to these paths (used in Docker: /data) |
VID2TEXT_INPUT / VID2TEXT_OUTPUT |
Pre-filled folders in the interface |
VID2TEXT_MODEL_DIR |
Where downloaded models are stored |
β οΈ The web interface is meant for your own computer. It listens on127.0.0.1by default and has no login, so don't expose it to the internet.
MIT Β© averageencoreenjoer