Desktop-App zur Video-Transkription und Untertitel-Erstellung via FFmpeg + OpenAI Whisper.
- Transkription mit OpenAI Whisper (lokal, kein Cloud-Account nötig)
- Mehrsprachige Übersetzung via ArgosTranslate (offline)
- Untertitel-Editor mit Zeitstempel-Anpassung
- Export als
.srt,.vtt,.txt - Video-Export mit eingebrannten Untertiteln (Burn-in) oder als Soft-Subtitle-Spur
- Anpassbare Untertitel-Darstellung: Schriftart, Größe, Position, Farbe, Hintergrund
- Eigene Fonts via
.ttf,.woff,.woff2 - Warteschlange für mehrere Videos
- Light/Dark-Mode
- Python 3.10+
- ffmpeg — wird beim Start automatisch erkannt; wenn nicht vorhanden, bietet die App eine Installationsanleitung
# Virtuelle Umgebung erstellen
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
# Abhängigkeiten installieren
pip install -r requirements.txtrequirements.txt:
| Paket | Zweck |
|---|---|
PySide6 >= 6.6 |
GUI-Framework |
openai-whisper |
Spracherkennung (lokal) |
ffmpeg-python |
ffmpeg-Bindings für Audio-Extraktion |
python main.pyDie App wird mit PyInstaller gebündelt. ffmpeg und ffprobe werden automatisch mit eingebunden — der Endnutzer braucht keine separate Installation.
pip install pyinstallerffmpeg muss beim Build im PATH vorhanden sein (wird dann ins Bundle kopiert):
# macOS
brew install ffmpeg
# Windows
winget install Gyan.FFmpeg./build.shDas Script führt PyInstaller aus und erstellt anschließend automatisch eine .dmg:
dist/Captionizer.app # App-Bundle
dist/Captionizer.dmg # Distributionsfertiges Disk Image
Alternativ einzeln:
pyinstaller Captionizer.spec --noconfirm
hdiutil create -volname "Captionizer" -srcfolder dist/Captionizer.app -ov -format UDZO dist/Captionizer.dmg- Bindet
ffmpegundffprobevom System-PATH ein (landen inContents/Frameworks/auf macOS) - Bundelt Whisper-Assets (Tiktoken-Encoding)
- Bundelt GUI-Assets (
gui/assets/) - Kein Terminal-Fenster (
console=False) - UPX-Komprimierung aktiviert
Beim Start erweitert die App ihren internen PATH automatisch um:
Contents/MacOS/(Executable-Verzeichnis)Contents/Frameworks/(PyInstaller-Standard für Binaries)Contents/Resources/
Dadurch wird das gebündelte ffmpeg gefunden, ohne dass der Nutzer etwas installieren muss.
- Datei laden — Drag & Drop oder über den Datei-Dialog; mehrere Dateien werden als Warteschlange verarbeitet
- Transkription — Whisper-Modell und Quellsprache wählen, dann starten
- Übersetzung (optional) — Zielsprachen auswählen; Sprachpakete werden einmalig heruntergeladen
- Editor — Segmente ansehen und Texte/Zeitstempel anpassen
- Export — Untertitel-Datei oder Video exportieren
| Modus | Beschreibung |
|---|---|
.srt / .vtt / .txt |
Nur Untertitel-Datei |
| Soft Subtitles | Untertitel als separate Spur im Video (an/abschaltbar im Player), mehrsprachig möglich |
| Burn-in | Untertitel dauerhaft ins Videobild eingebrannt, mit vollem Style-Kontrolle |
| Modell | VRAM | Empfehlung |
|---|---|---|
turbo |
~6 GB | Beste Balance aus Geschwindigkeit und Genauigkeit |
large-v3 |
~10 GB | Höchste Genauigkeit |
medium |
~5 GB | Guter Kompromiss |
small |
~2 GB | Schnell, ausreichend für viele Anwendungsfälle |
tiny |
~1 GB | Nur für Tests |
Ohne dedizierte GPU läuft Whisper auf der CPU — das dauert länger, funktioniert aber.
.
├── main.py # Einstiegspunkt, ffmpeg-Check, App-Start
├── Captionizer.spec # PyInstaller-Build-Konfiguration
├── requirements.txt
├── assets/ # App-Icon (.icns, .png)
├── gui/
│ ├── main_window.py # Hauptfenster
│ ├── styles.py # Light/Dark-Stylesheet
│ ├── icons.py # Icon-Lader
│ ├── constants.py # Modelle, Sprachen, UI-Konstanten
│ ├── subtitle_utils.py # SRT/VTT/TXT-Parsing und Zeitformat-Utilities
│ ├── main_window_mixins/
│ │ ├── ui.py # UI-Aufbau und Layouts
│ │ ├── player.py # Video-Player, Theme, Segment-Highlight
│ │ ├── workflow.py # Queue, Whisper, Übersetzungs-Ablauf
│ │ └── editor_export.py # Segment-Editor und Export-Logik
│ └── widgets/
│ └── common.py # CardFrame, StepperBar, StepBadge
└── worker/
├── ffmpeg_worker.py # Audio-Extraktion (QThread)
├── whisper_worker.py # Transkription und Whisper-Übersetzung (QThread)
├── translate_worker.py # ArgosTranslate-Übersetzung (QThread)
└── mux_worker.py # Video-Muxing (Soft/Burn-in, QThread)