Skip to content
averageencoreenjoerPublic

About

Convert videos to text (TXT/JSON) in a few clicks. Local, offline speech-to-text with a friendly web UI, Docker and CLI. Powered by Whisper.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Latest commit

Β 

History

1 Commit

Folders and files

Repository files navigation

🎬 vid2text

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.

Tests Python 3.10+ MIT license

Tech stack


πŸ“– Table of contents


πŸ€” What is this?

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.

✨ What you get

πŸ–±οΈ 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.

πŸš€ Quick start (easiest way, with Docker)

Docker is a free program that runs apps in a ready-made box, so you don't need to install anything else.

Step 1 β€” Install Docker

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.

Step 2 β€” Download vid2text

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)

Step 3 β€” Start it

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 --build

The first start takes a few minutes (it builds the app once). Later starts take seconds.

Step 4 β€” Open the app

Open your browser and go to πŸ‘‰ http://localhost:8000

Step 5 β€” Add your videos

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.yml and replace ./input with the full path of your folder, for example C:/Users/Anna/Videos:/data/input (Windows) or /Users/anna/Movies:/data/input (macOS).


🐍 Alternative: install without Docker

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 serve

Your browser opens automatically. ffmpeg (the tool that reads video files) is installed together with the app, so there is nothing else to set up.


πŸ–₯️ Using the app

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             β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
  1. 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.
  2. Choose the output folder and tick the formats you want (TXT, JSON or both). The folder is created if it does not exist.
  3. 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).

βš™οΈ Advanced settings (optional)

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.


🎞️ Supported formats

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.


πŸ“„ What the results look like

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.


🎯 Choosing an accuracy level

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.


⌨️ Command line (optional)

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 small

❓ Frequently asked questions

Is 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.


πŸ› οΈ Troubleshooting

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.

πŸ‘©β€πŸ’» For developers

Project layout

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

Run the 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.

Continuous integration

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.

HTTP API

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

Environment variables

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 on 127.0.0.1 by default and has no login, so don't expose it to the internet.


πŸ“œ License

MIT Β© averageencoreenjoer

About

Convert videos to text (TXT/JSON) in a few clicks. Local, offline speech-to-text with a friendly web UI, Docker and CLI. Powered by Whisper.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages