---
title: "GPU-Accelerated Subtitle Generator"
description: "GPU-Accelerated Subtitle Generator: Subtitles for a whole video library, on GPUs the house is already using."
url: https://www.joekarlsson.com/work/gpu-subtitle-generator/
---

![A playhead runs along a film's audio waveform as Whisper, on an NVIDIA GPU, writes each line of speech into an SRT file: They're coming to get you, Barbara](https://www.joekarlsson.com/images/projects/gpu-subtitle-generator/thumb-08106819.webp)

# GPU-Accelerated Subtitle Generator

Subtitles for a whole video library, on GPUs the house is already using.

2026

[Read why I built it](https://www.joekarlsson.com/blog/building-a-gpu-accelerated-subtitle-generator/)

My video library has thousands of files in dozens of languages, and most had no subtitles. This writes them with faster-whisper on the two NVIDIA cards in my homelab. It detects the language, translates to English and saves a `.en.srt` next to each video, so Plex, Jellyfin and VLC find it on their own.

The same GPUs run Plex transcoding, Tdarr and my house's voice assistant, so the workers wait their turn: each checks for free VRAM before a file and backs off when something else needs the card. Two run from midnight to 4 PM and one in the evening, when Plex is busiest. Whisper also invents lines over silence ("Thank you for watching!"), so a filter of more than 200 patterns throws those out.

## How it's made

Python · Whisper AI · CUDA · NVIDIA GPU · Bash

Bash scripts schedule the workers and hand out folders with directory locks, no queue or database. A Python script runs faster-whisper on CUDA and writes the SRT files. [How I built it](https://www.joekarlsson.com/blog/building-a-gpu-accelerated-subtitle-generator/).

_Diagram: The subtitle generator in four layers. A cron job or a manual trigger starts the scheduler (subtitle-scheduler.sh), which starts and stops workers, cleans stale locks and manages the worker lifecycle. Parallel workers (parallel-worker.sh) claim folders with mkdir, wait for a free GPU and track progress. The Whisper engine (generate-subtitles.py) runs faster-whisper on CUDA, filters hallucinations and writes SRT files._

## Lineage

Also runs Whisper

[FollowSpot](https://www.joekarlsson.com/work/followspot/): A voice-following teleprompter that runs in the browser and listens with a local whisper.cpp model. Read your script out loud and the highlight follows you, through flubs, skips, and ad-libs. You pick the model, the audio never leaves your machine, and the column centers over the camera lens so nobody can see your eyes reading. I built it because I can't memorize lines. 2026 · JavaScript, whisper.cpp, Whisper

[Project page](https://www.joekarlsson.com/work/followspot/) · [Source](https://github.com/JoeKarlsson/followspot) · [Blog Post](https://www.joekarlsson.com/blog/followspot-local-whisper-teleprompter/)

Also transcribes locally

[Screencast Director](https://www.joekarlsson.com/work/screencast-director/): A macOS screen recorder that drafts the edit for me, because editing is the part of video I hate. I talk through a demo once, and it keeps the talking at real time, speeds up the typing, cuts the dead air, zooms on clicks and adds captions. Then I fix it on a timeline or ask an AI model to change it. 2026 · Swift, macOS, ScreenCaptureKit

[Project page](https://www.joekarlsson.com/work/screencast-director/) · [Source](https://github.com/JoeKarlsson/screencast-director) · [Blog Post](https://www.joekarlsson.com/blog/screencast-director-screen-recorder/)

[← All works](https://www.joekarlsson.com/work/)
