A local-first desktop workbench that turns audio, video, YouTube, podcasts and documents into clean Markdown, ready to be used as a corpus for a RAG system.
Download for Windows: get TranscriptLab-<version>-win64.zip (about 13 MB, the exe plus README and CHANGELOG) or the single TranscriptLab_v_<version>.exe from the latest release. No Python needed. Put the exe anywhere (Desktop, Downloads, D:\Apps). Since 0.16.9 everything the app writes (settings, dictionaries, logs, and the tools it installs for you) lives in one folder, %LOCALAPPDATA%\TranscriptLab by default or another folder you choose at the first start, so moving the exe loses nothing. The SHA-256 of each file is in the release notes.
Windows SmartScreen: the file is not code-signed, so Windows may show "Windows protected your PC". Click More info, then Run anyway. You can also run the app from source (see Quick start) and read every line of the code first.
Companies that hold valuable know-how (lectures, interviews, calls, manuals) cannot always send it to a public AI service. TranscriptLab runs the heavy work on your own machine: speech-to-text with OpenAI Whisper, document conversion with MarkItDown, and cleaning rules that make the output consistent. The result is a folder of tidy Markdown files with metadata headers, which is the raw material for a retrieval-augmented generation (RAG) pipeline or later fine-tuning.
The app is a Tkinter desktop GUI with one tab per job:
| Tab | Purpose |
|---|---|
| A/V Transcription | Batch queue for audio/video files, Whisper model choice per language, model download on demand, live log and progress |
| Live | Capture audio playing on the PC (Windows loopback) and transcribe it in chunks |
| To Markdown | Convert PDF, DOCX and subtitle files to Markdown |
| MD Polish | Re-flow wrapped lines, remove caption noise and hyphenation, apply custom correction dictionaries, optional Claude-assisted clean-up levels |
| YT Transcripts | Fetch captions for videos or channels and save them as Markdown |
| YT Download | Download media with yt-dlp, with pacing and optional automatic transcription |
| Podcasts | Read RSS feeds, download episodes and transcribe them |
| Link Grabber | Collect video links from a channel with filters (duration, sections) |
| Dictionary | Vocabulary profiles that prime Whisper and fix recurring mistakes |
| Comparison | Run two Whisper models on the same excerpt and compare the output |
Other features: metadata header per Markdown file, ETA estimates learned from past runs, saved queues, a LAN status page to watch long batches from a phone, and a built-in tools manager (Help → Check for Tools) that installs, finds and updates Whisper, FFmpeg, MarkItDown and yt-dlp, with Docling and pyaudiowpatch optional.
Since 0.16.9:
- One folder for everything: settings, dictionaries, queues, logs, tools, Whisper models and the app's own Python 3.12 (downloaded once, about 15 MB, checked) live in one folder you can choose. The first start walks through three steps: the folder, what was found from an older install (use it where it is, move it, or start fresh), and Install the tools now?. Settings → Storage shows the size per part and can move the folder.
- Check for Tools: one table with Install / Update per tool, Install All and Update All, and a window per tool (status, version, location, Repair, Use another copy, Search again). Tools you already have (winget, scoop, Chocolatey, Program Files, the PATH) are found and used where they are.
- Recordings from Tiny Recorder:
TranscriptLab --transcribe <file>hands a recording to the open window (there is always one window); it starts at once when TranscriptLab is idle and ready. - Interface in English, Portuguese (Brazil) and Spanish, following the Windows display language or chosen in Settings → General.
- Optional: FFmpeg, yt-dlp and Whisper can be put on your user PATH (never the system PATH) so other programs can use them.
Since 0.16.8:
- Whisper models are downloaded by the app itself (Settings → Whisper → AI models): progress, Cancel, resume after a dropped connection, SHA-256 check. A model manager shows the size on disk and can verify or delete a model.
- Help menu with Check for updates… (asks the GitHub releases API, no key). The exe can download the new version next to itself, check its SHA-256 and start it; the old exe is kept. An optional daily check at start is off by default.
- Unexpected errors go to
TranscriptLab_Data\logs\app.log(API keys removed).
- Install Python 3.9+ (Tkinter comes with it on Windows).
- Run
TranscriptLab.bat(orpython TranscriptLab.py). - Follow the first-start steps, then use Help → Check for Tools → Install All to get Whisper, FFmpeg, MarkItDown and yt-dlp.
- Add files in the A/V Transcription tab, choose language and model, press start.
Whisper models run locally. Nothing is uploaded unless you turn on the optional Claude-assisted polish, which needs your own API key.
Speech-to-text output usually needs correcting before it becomes a corpus, and a fluent correction can silently change or invent text. tcqa covers that step in two parts: a Claude Code agent revises the transcripts and logs every change, a second agent re-checks each correction, and an offline checker (no AI, no network) confirms that each corrected transcript changed only what its log says, before the text goes into a RAG or fine-tuning corpus.
Only transcribe or download material you have the right to use. The repository contains code only; it ships no transcripts, recordings or corpus data.
- About 34,900 lines of Python in one file, organised in clear sections
- 77 numbered versions, from a 35 KB prototype to the current build (see
archive/versions/) - 362 unit tests in
tests/test_v0_16_9.py; about 335 run on every push (Ubuntu, Python 3.10 and 3.12). The others use the Windows registry,taskkillor drive paths and are skipped there; on Windows 361 pass and 1 is skipped (build report of 0.16.9) - Run the tests:
python -m pytest tests -v(the Tk tests need a display; CI usesxvfb-run). They use a temporary data folder and never touchTranscriptLab_Data docs/legacy/has the first READMEs
- Read API keys from environment variables or the OS keychain instead of the local settings file
- Split the single file into modules
- Export chunked Markdown with embeddings metadata for common vector stores
Built with Claude (Anthropic) as the coding partner. I wrote the requirements and the revision prompts, tested every build on real data, and decided what to fix next. The archive/versions/ folder keeps every earlier release so the iteration history is visible.
Security note: the app stores any API keys you enter in a local settings file outside this repository. .gitignore excludes config and settings files so keys are never committed.
See CONTRIBUTING.md and SECURITY.md. Bug reports and ideas are welcome through the issue templates.
MIT. See LICENSE.
Luiz Junqueira - junqueira.ch - LinkedIn

