Lokales, offline Speaker-Tracking für Konferenz- und Vortragsaufnahmen.
Find a file
2026-06-18 18:26:15 +02:00
LICENSE add LICENSE 2026-06-18 18:26:15 +02:00
readme.md add readme 2026-06-18 18:23:58 +02:00
speaker_track.py add speaker-track.py 2026-06-18 18:24:28 +02:00

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

  1. 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.
  2. 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.
  3. 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-ffmpeg automatisch 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.mp4 bzw. name_speaker.mov bei 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.