| LICENSE | ||
| readme.md | ||
| speaker_track.py | ||
speaker-track
Lokales, offline Speaker-Tracking für Konferenz- und Vortragsaufnahmen.
Das Tool erkennt die vortragende Person in einer Weitwinkelaufnahme, folgt ihr geglättet und rendert daraus einen fertigen Hochformat-Clip, der sich direkt neben die Folien legen lässt, zum Beispiel in einem Multi-Cam-Schnitt in Final Cut Pro oder DaVinci Resolve.
Alles läuft auf dem eigenen Rechner. Kein Cloud-Upload, keine externen Dienste, kein Abo.
Funktionen
- Automatische Personenerkennung über YOLO (Ultralytics).
- Folgt der Person geglättet bei fester Ausschnittsgröße, dadurch kein Zoom-Zittern.
- Robust gegen Schatten und Publikum: das Tool wählt die Person mit der höchsten Erkennungssicherheit und der größten Nähe zur vorherigen Position, nicht einfach die größte Box.
- Preview-Modus mit eingezeichnetem Ausschnitt, um das Tracking vor dem Rendern zu prüfen.
- Render-Modus mit frei wählbarer Ausgabegröße (Standard 600x900, für 4K zum Beispiel 1200x1800).
- Stapelverarbeitung ganzer Ordner, optional parallel über mehrere CPU-Kerne.
- Fortschrittsanzeige mit Restzeit (ETA), pro Datei und im Stapel.
- Exportiert zusätzlich die Bewegungsdaten als CSV.
Wie es funktioniert
- Analyse: Das Tool liest das Video und erkennt jede n-te Frame die Person. Bei mehreren Treffern wählt es anhand von Erkennungssicherheit und Kontinuität die echte vortragende Person, nicht einen Schatten an der Wand oder eine Person im Publikum.
- Bahn: Aus den Treffern wird eine durchgehende, geglättete Mittelpunktbahn berechnet. Die Ausschnittsgröße bleibt fest (abgeleitet aus der mittleren Personenhöhe mal Zoomfaktor), damit der Ausschnitt bei Kameraschwenks und -zooms nicht springt.
- Render: Der Ausschnitt wird Frame für Frame zugeschnitten, auf die Zielgröße skaliert und mit ffmpeg encodiert. Die Originaltonspur wird mitübernommen.
Voraussetzungen
- Python 3.9 oder neuer
- ffmpeg, wird über das Paket
imageio-ffmpegautomatisch mitgeliefert. Ein systemweit installiertes ffmpeg wird, falls vorhanden, bevorzugt. - Beim ersten Lauf lädt Ultralytics einmalig das Modell
yolov8n.pt(rund 6 MB) herunter, danach läuft alles offline.
Getestet auf Apple Silicon, dort wird automatisch die GPU genutzt. Läuft ebenso auf CPU und auf NVIDIA-GPUs.
Installation
python3 -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install ultralytics opencv-python imageio-ffmpeg numpy
Schnellstart
Zuerst das Tracking an einem einzelnen Talk prüfen, schnelles Debug-Video mit eingezeichnetem Ausschnitt:
python speaker_track.py talk.mov -o out --mode preview --max-frames 1500
Dann out/talk_preview.mp4 ansehen. Der gelbe Rahmen ist der Ausschnitt, der orange Punkt der erkannte Mittelpunkt. Passt die Rahmung nicht, mit --zoom und --smooth nachjustieren und Preview erneut laufen lassen.
Wenn es passt, den fertigen Clip rendern:
python speaker_track.py talk.mov -o out --mode render --zoom 1.2
Einen ganzen Ordner verarbeiten und mehrere Dateien parallel:
python speaker_track.py /pfad/zu/talks -o out --mode render --zoom 1.2 --jobs 2
Für ein 4K-Projekt die Ausgabegröße verdoppeln:
python speaker_track.py /pfad/zu/talks -o out --mode render --zoom 1.2 --out-size 1200x1800
Optionen
| Option | Beschreibung | Standard |
|---|---|---|
inputs |
eine oder mehrere Videodateien oder Ordner | Pflicht |
-o, --out |
Ausgabeordner | speaker_out |
--mode {preview,render} |
preview zeichnet den Ausschnitt ein, render erzeugt den fertigen Clip | preview |
--zoom |
Ausschnittshöhe = mittlere Personenhöhe mal diesem Faktor. Größer ist weiter, kleiner ist enger | 1.9 |
--smooth |
Glättung der Bewegung in Sekunden | 1.2 |
--track-y |
auch vertikal mitführen, Standard ist eine feste Höhe | aus |
--out-size |
Ausgabegröße in Pixel, Breite x Höhe | 600x900 |
--aspect |
Seitenverhältnis des Ausschnitts | 2:3 |
--codec {h264,prores} |
Ausgabecodec, prores für maximale Qualität | h264 |
--jobs |
Anzahl parallel verarbeiteter Dateien | 1 |
--step |
nur jede n-te Frame analysieren, größer ist schneller | 8 |
--conf |
Erkennungsschwelle, höher filtert unsichere Treffer wie Schatten | 0.4 |
--device |
YOLO-Gerät: mps, cpu oder cuda |
mps |
--detector {yolo,mock} |
yolo für die echte Erkennung, mock nur zum Testen der Pipeline | yolo |
--preview-width |
Breite des Preview-Videos in Pixel | 960 |
--max-frames |
nur die ersten n Frames verarbeiten, praktisch für schnelle Tests | alle |
Ausgabedateien
Pro Eingabedatei name.ext entstehen im Ausgabeordner:
name_speaker.mp4bzw.name_speaker.movbei prores, der fertige Hochformat-Clip, nur im Render-Modus.name_preview.mp4, das Debug-Video mit eingezeichnetem Ausschnitt, nur im Preview-Modus.name_track.csv, die Bewegungsdaten pro Frame (Frame, Zeit, Ausschnitts-Rechteck), falls du die Bahn anderweitig weiterverwenden willst.
Beispielausgabe
Detector: yolo | Modus: render | Dateien: 19 | Jobs: 2
[1/19] 01_talk.mov
Analyse 100% | 38391 Frames | 04:32
Render 68% | 26100/38391 | ETA 01:05
[1/19] fertig: 01_talk.mov | gesamt 06:12 | Rest ca. 1:50:00
Einsatz in Final Cut Pro
Der gerenderte Clip ist bereits zugeschnitten und folgt der Person, ein separates Tracking oder Keyframen entfällt. Den Clip auf die unterste Spur legen und unter „Räumliche Anpassung" auf „Keine" stellen, sonst skaliert Final Cut den Clip auf die Projekthöhe und die Größe stimmt nicht mehr. Danach per Position neben die Folien schieben. In einem 4K-Projekt verdoppeln sich die Positionswerte gegenüber 1080p, die Skalierung in Prozent bleibt gleich.
Performance und Parallelisierung
Eine einzelne Datei nutzt nicht alle Kerne: die Erkennung läuft auf der GPU, das Decodieren ist Single-Thread, nur das Encodieren ist multi-threaded. Den Durchsatz bei vielen Dateien holst du über --jobs, das mehrere Talks gleichzeitig verarbeitet.
Jeder parallele Job braucht zusätzlichen Arbeitsspeicher, grob 1,5 bis 2,5 GB. Starte mit --jobs 2 und beobachte den Speicher, bei genug RAM kannst du höher gehen. Wer die Analyse beschleunigen will, erhöht --step, das reicht bei langsam laufenden Vortragenden problemlos.
Grenzen
- Panels und Diskussionsrunden: Bei mehreren Personen funktioniert Einzel-Tracking nicht zuverlässig. Das Tool warnt, wenn es häufig mehrere Personen erkennt. Für solche Aufnahmen besser einen festen Ausschnitt verwenden.
- Starke Kameraschwenks und -zooms: Die Ausschnittsgröße bleibt bewusst fest, damit nichts zittert. Bei einem heftigen Zoom kann die Person den Rahmen kurz füllen. Deshalb vorher im Preview-Modus prüfen.
- Quellauflösung: Der Ausschnitt wird aus der Totale geschnitten. Für einen scharfen 4K-Clip sollte die Quelle echtes 4K sein, aus 1080p wird hochskaliert und damit weicher.