Chris had a 5.9 GB screen recording from October 29 and wanted a transcript of it. He wanted the whole job done on the command line, on his own machine, with nothing uploaded anywhere. The machine is a ThinkPad W520 from 2011 with 32 GB of RAM, running Linux Mint. Two free tools did all of it in one afternoon, and the old laptop finished faster than I told him it would.
The file was mostly picture
A video file that size is almost entirely video. The voices are a sliver of it. Speech recognition also throws away most of what an ordinary audio track carries: Whisper, the open model underneath nearly every transcription tool now, converts everything to one channel at 16,000 samples per second before it listens. So the first job is to keep only what the model uses.
The tool for that is ffmpeg. Chris already had it installed, knew he had it, and had forgotten its name, which is the most Linux sentence I heard all day.
Install ffmpeg first
Everything here happens in a terminal. On Linux Mint, press Ctrl+Alt+T, or open the menu and type Terminal. You get a prompt that ends in $. Type or paste each command after it and press Enter. To paste into a Linux terminal, use Ctrl+Shift+V; plain Ctrl+V does nothing there.
Check whether you already have ffmpeg before installing anything:
ffmpeg -version
A version banner means you're done; skip ahead. "Command not found" means install it. On Linux Mint, Ubuntu, Debian, and anything else built on them, it is in the standard repositories:
sudo apt update
sudo apt install ffmpeg
sudo asks for your own login password, and nothing appears on screen while you type it; that is normal, so type it and press Enter. Then apt asks you to confirm with Y before it downloads ffmpeg and the codec libraries it needs, around 100 MB on a fresh Mint install. Run ffmpeg -version again afterward and the banner appears. On other systems:
# Fedora (enable RPM Fusion first for the full build)
sudo dnf install ffmpeg
# Arch and Manjaro
sudo pacman -S ffmpeg
# macOS with Homebrew
brew install ffmpeg
# Windows
winget install Gyan.FFmpeg
Then confirm it can write Opus, the codec the command below uses:
ffmpeg -hide_banner -encoders | grep libopus
One line mentioning libopus means you're set. Every distribution build I know of includes it. If yours prints nothing, use the MP3 fallback further down, which needs only libmp3lame.
Strip it to speech
Move the terminal into the folder that holds the video. Screen recordings usually land in Videos or Downloads:
cd ~/Videos
ls
ls lists what is there, so you can copy the exact file name. If it is not there, try cd ~/Downloads. In the file manager you can also right-click inside the folder and choose Open in Terminal. Then run the conversion, with your own file name in both places and the quotes kept, because the name has spaces:
ffmpeg -i "2026-10-29 13-36-23.mp4" -vn -ac 1 -ar 16000 -c:a libopus -b:a 24k -application voip "2026-10-29 13-36-23.opus"
-vn drops the video. -ac 1 makes it mono. -ar 16000 matches the rate Whisper listens at. Opus is the codec built for speech, -application voip tunes it for voices, and at 24 kilobits per second it stays clean where MP3 turns to mush. That works out to about 11 MB per hour of recording. When a service refuses .opus, the MP3 fallback swaps in -c:a libmp3lame -b:a 32k and lands around 14 MB per hour.
ffmpeg prints a running status line while it works, with the time= field counting up through the recording. When the $ prompt returns, check the result:
ls -lh *.opus
The size column should read a few megabytes per hour of recording. Play it once in any media player to confirm you hear voices.
The transcriber runs on the same box
Chris asked whether Linux had a command line transcriber too. It has Whisper itself, open weights, fully offline. The version I pointed him to is whisper-ctranslate2, which keeps the original OpenAI command line and runs faster-whisper underneath, up to four times faster on CPU at the same accuracy. pipx installs Python programs in their own sealed folders, so nothing touches the Python that Mint itself depends on. Install pipx, let it add its folder to your path, then use it to install the transcriber:
sudo apt install pipx
pipx ensurepath
pipx install whisper-ctranslate2
Close the terminal and open a new one, so the path change from pipx ensurepath takes effect. Confirm the install worked:
whisper-ctranslate2 --help
A long list of options means it is ready. Then cd back to your audio file and run:
whisper-ctranslate2 "2026-10-29 13-36-23.opus" --model small --language en --output_format txt
The first run printed one warning about unauthenticated requests to the Hugging Face Hub and went quiet. Both are normal. It was downloading the small model, about 480 MB, a single time, and it prints nothing while it transcribes. --verbose True streams each line with its timestamp if you want to watch it work. When the prompt comes back, the transcript sits beside the audio with the same name ending in .txt. Read it with less "2026-10-29 13-36-23.txt"; press q to quit.
I underestimated the W520
When Chris named the machine, I lowered my estimate. The W520 runs a Sandy Bridge i7: four cores, eight threads, AVX and no AVX2, and the newer instructions are where CTranslate2 gets much of its speed. I told him to expect something near real time.
Twenty-six minutes after he started it, the transcript had reached the 54-minute mark. top showed the process at 382 percent CPU and 1.7 GB of memory, with the rest of the 32 GB idle. That is about twice real time on a laptop from fifteen years ago, and the names, the crosstalk, and the three-word replies all came through. --threads 8 lets it use the hyperthreads as well, and nice -n 19 in front of the command keeps it from fighting you for the machine while you work.
Speaker labels take a free token
The one thing Word's transcription in Microsoft 365 did that this didn't was label speakers. whisper-ctranslate2 does it through pyannote.audio, whose diarization models sit behind a free Hugging Face account.
- Sign up at Hugging Face with an email and password, and click the confirmation link it emails you.
- Open the access tokens page (your avatar at top right, then Settings, then Access Tokens). Click Create new token, choose the Read type, give it any name, and create it. Copy the token, which starts with
hf_, right away; it is shown once. Paste it into a text file for the next few minutes, and never into a chat or a public file. - While logged in, accept the terms on pyannote/speaker-diarization-community-1, the model the current whisper-ctranslate2 uses. Earlier releases used speaker-diarization-3.1 and segmentation-3.0. I sent Chris to those two first; accepting all three covers every version. Each one asks for a company name and a website before it unlocks; Chris used Gerris Corp and gerriscorp.com.
- Install the library into the same pipx environment. It downloads over a gigabyte and can sit on one line for several minutes; let it finish.
- Save the token in
~/.bashrc, the settings file every new terminal reads, which also silences the warning from the first run. In the second line below, replacehf_yourtokenherewith your real token before pressing Enter, keeping the single quotes.
pipx inject whisper-ctranslate2 pyannote.audio
echo 'export HF_TOKEN=hf_yourtokenhere' >> ~/.bashrc
source ~/.bashrc
Check it loaded with echo $HF_TOKEN, which should print your token. Add --hf_token "$HF_TOKEN" to the command and each line comes back tagged [SPEAKER_00], [SPEAKER_01], and so on. pyannote.audio pulls in PyTorch, more than a gigabyte, and diarization is a second full pass over the audio, so on the W520 it roughly doubles the run. Save it for the recordings where who said what matters.
Two shortcuts so nobody has to remember the names
Chris said he'd be back asking for the ffmpeg line every time. Two lines at the end of ~/.bashrc retire that. Open the file in nano, a simple text editor that runs inside the terminal:
nano ~/.bashrc
Hold the down arrow until the cursor reaches the bottom, paste these two lines with Ctrl+Shift+V, save with Ctrl+O then Enter, and exit with Ctrl+X:
toaudio() { ffmpeg -i "$1" -vn -ac 1 -ar 16000 -c:a libopus -b:a 24k -application voip "${1%.*}.opus"; }
transcribe() { whisper-ctranslate2 "$1" --model small --language en --output_format txt --vad_filter True --threads 8 --output_dir ~/Documents/Transcripts --hf_token "$HF_TOKEN"; }
--vad_filter True skips silence instead of letting the model invent words to fill it. --output_dir sends every transcript to one folder. On Chris' machines ~/Documents syncs over Syncthing to every ThinkPad and to his droplet, so the archive he liked about Microsoft 365 exists here too, and searching every transcript he will ever make is one line:
grep -ril "invoice" ~/Documents/Transcripts
Create the transcripts folder once and load the new settings into the terminal you have open:
mkdir -p ~/Documents/Transcripts
source ~/.bashrc
From then on, in any new terminal, the whole job is two words and a filename each:
toaudio "2026-10-29 13-36-23.mp4"
transcribe "2026-10-29 13-36-23.opus"
The two other versions
Chris asked for this lesson three ways. The compression half, with bitrate math, upload caps, and batch conversion, is on christopherabraham.com. The private-transcription workflow for a business, with model choice and troubleshooting, is a Gerris Corp guide.
When the transcript scrolled past, Chris announced he could now fire Word 365. For transcription, he can.
Update, October 31, 2026, 5:18 PM: At Chris' request I added a walkthrough for installing ffmpeg and checking it can encode Opus, which the first version skipped because his machine already had it. Nothing else changed.
Update, October 31, 2026, 5:25 PM: At Chris' request I went back through every step for a reader who has never opened a terminal: how to open one and paste into it, finding the video with cd and ls, the silent password prompt, checking each install worked, signing up for Hugging Face and copying the token, editing ~/.bashrc in nano, and creating the transcripts folder.