S4: Untertitel aus der Mikrofonspur, plus vorgegebenes OBS-Layout
whisper.cpp laeuft ueber die Tonspur und liefert Tokens; daraus werden Woerter mit Zeitstempeln (Wortstuecke wie "Sav"+"ina" wieder zusammengesetzt) und daraus kurze Zeilen im ASS-Format mit wortweiser Hervorhebung. SRT und Transkript fallen nebenbei ab. An einem echten deutschen Clip geprueft. Drei Fehler kamen erst dabei heraus: Zeilen mit einem einzigen Wort bei zoegerndem Sprechen, ein Nachlauf, der in die naechste Zeile ragte (ASS stapelt gleichzeitige Zeilen uebereinander), und ein Uebertragsfehler im Zeitformat bei 59,999 s. Layout wird jetzt VORGEGEBEN statt nachgemessen: ein Vergleich zweier Aufnahmen zeigte, dass die Facecam von Stream zu Stream anders liegt. Das Profil "default" beschreibt die Vorgabe (Facecam 480x270 oben links, Chat ab x=1405, Gameplay-Band 890 breit mittig auf x=960), "bestand-2026-09" haelt den alten Zustand fuer altes Material fest. Dazu eine Ausrichtungsvorlage als Bild, die in OBS ueber die Szene gelegt wird, und docs/obs-layout.md. Befund am echten Clip: im Streambild sind bereits zwei Textebenen eingebrannt (Spieluntertitel und ein Live-Caption-Overlay). Beides ist im Layout-Dokument behandelt. 53 Tests gruen. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013VTGjd92LsDDWF3frd9FTB
This commit is contained in:
1 parent
0e020f3073
commit
974dfd075b
11 files changed
+824
-33
No files matched your search
+26
-2
@@ -38,8 +38,11 @@ gibt. Vorher ist sie nur Ballast.
|
||||
| Layout eingemessen | **fertig** — `config/layout.yaml`, vorgezogen aus S3 |
|
||||
| S1 Einrichtung + Auth + DB + IRC-Ingest | **fertig** — 20 Tests grün, Daemon läuft |
|
||||
| S2 OBS-Anbindung + Trigger | **Code fertig**, Abnahme braucht laufendes OBS |
|
||||
| S3 9:16-Render | **fertig** — Durchlauf verifiziert, 39 Tests grün |
|
||||
| S4–S6 | offen |
|
||||
| S3 9:16-Render | **fertig** — Durchlauf verifiziert |
|
||||
| S4 Untertitel | **fertig** — an echtem Clip verifiziert, 53 Tests grün |
|
||||
| S5 Onboarding + Sichtung | als Nächstes |
|
||||
| S6 Erstchatter-Begrüßung | offen |
|
||||
| OBS-Layout vorgegeben | **fertig** — [`obs-layout.md`](obs-layout.md) |
|
||||
|
||||
**S1 abgenommen am 2026-09-09.** Der Daemon läuft, hängt am Chat, die
|
||||
Einrichtung ist unter `http://localhost:4792/setup` erreichbar.
|
||||
@@ -197,6 +200,27 @@ mindestens 320 px. Ins Video kommt weiterhin die Mischung von Spur 1.
|
||||
Untertitel, und der Text wird auf dem Handy von der TikTok-Oberfläche nicht
|
||||
verdeckt.
|
||||
|
||||
**S4 abgenommen am 2026-09-09**, geprüft an einem echten 30-Sekunden-Clip mit
|
||||
deutscher Sprache. 41 Wörter in 37 s Rechenzeit auf der CPU, Transkript
|
||||
inhaltlich korrekt, Untertitel sitzen zeitlich und sind lesbar.
|
||||
|
||||
Drei Fehler kamen erst am echten Material heraus:
|
||||
|
||||
- **Ein-Wort-Zeilen.** Bei zögerndem Sprechen zerfiel der Text in Zeilen mit
|
||||
einem einzigen Wort („Dank" / „es," / „Savina,"). Die Obergrenze von 2,2 s je
|
||||
Zeile war zu eng; jetzt 3,2 s plus ein Nachverdichten, das allein stehende
|
||||
Wörter an den Nachbarn hängt. 17 Zeilen wurden zu 10.
|
||||
- **Überlappende Zeilen.** Der Nachlauf von 0,25 s ragte in die nächste Zeile.
|
||||
ASS stapelt gleichzeitig sichtbare Zeilen übereinander — das sieht kaputt
|
||||
aus. Das Ende wird jetzt am Beginn der Folgezeile abgeschnitten.
|
||||
- **Zeitformat.** Bei 59,999 s rundeten die Hundertstel auf 100 und der Übertrag
|
||||
lief nicht in die Minuten: `0:00:60.00` statt `0:01:00.00`. Gefunden durch
|
||||
einen Test, nicht durch Zusehen.
|
||||
|
||||
**Befund fürs Streamsetup:** Im Quellmaterial lagen bereits zwei Textebenen
|
||||
(Spieluntertitel und ein Live-Caption-Overlay mit Wort-Markierung). Beide sind
|
||||
fest eingebrannt. Behandelt in [`obs-layout.md`](obs-layout.md).
|
||||
|
||||
### S5 — Oberfläche: Onboarding und Sichtung · ~2 Tage
|
||||
|
||||
**Erststart-Assistent.** Die heutige Einrichtungsseite ist ein Formularblock —
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 80 KiB |
@@ -0,0 +1,119 @@
|
||||
# OBS-Layout — die Vorgabe
|
||||
|
||||
**Kurzfassung für Abdu:** Facecam **480×270** bündig oben links. Chat und
|
||||
Alerts erst ab **x = 1405**. Der Streifen dazwischen bleibt frei.
|
||||
|
||||

|
||||
|
||||
## Warum überhaupt eine Vorgabe
|
||||
|
||||
Der Zuschnitt auf 9:16 nimmt feste Bildbereiche aus dem fertigen Streambild.
|
||||
Verrutscht die Kamera um 50 Pixel, sitzt in jedem Short der Kopf schief — und
|
||||
das merkt man erst, wenn der Clip fertig ist.
|
||||
|
||||
Ein Vergleich zweier Aufnahmen hat gezeigt, dass die Kamera derzeit von Stream
|
||||
zu Stream unterschiedlich liegt. Statt das nachzumessen, steht die Position
|
||||
jetzt fest. Einmal einrichten, danach passt jeder Clip.
|
||||
|
||||
## Die Zahlen
|
||||
|
||||
| Element | Position | Größe |
|
||||
|---|---|---|
|
||||
| **Facecam** | x 0, y 0 (bündig oben links) | **480 × 270** |
|
||||
| **Gameplay-Band** | x 515 bis 1405 | 890 × 1080 |
|
||||
| **Chat, Alerts, Overlays** | ab x 1405 | 515 px Spalte |
|
||||
| **Minimap, HUD, Kacheln** | x 0 bis 515, unterhalb der Kamera | frei |
|
||||
|
||||
Zwischen Kamera (endet bei 480) und Gameplay-Band (beginnt bei 515) liegen
|
||||
35 Pixel Luft. Der Abstand ist Absicht: Ein leicht verrutschter Kamerarahmen
|
||||
schiebt dann nicht sofort einen Streifen Gesicht in das Gameplay-Bild.
|
||||
|
||||
## So richtest du es ein
|
||||
|
||||
1. **Vorlage laden.** In OBS eine **Bild-Quelle** anlegen, Datei
|
||||
`docs/assets/obs-layout-vorlage.png`, und sie in der Quellenliste **ganz
|
||||
nach oben** ziehen. Größe auf 1920×1080, Position 0,0.
|
||||
2. **Deckkraft runter.** Rechtsklick auf die Quelle → Filter → *Farbkorrektur*
|
||||
→ Deckkraft ca. 60 %. Dann sieht man die eigenen Quellen darunter.
|
||||
3. **Facecam ziehen**, bis sie den grünen Rahmen ausfüllt. Beim Skalieren
|
||||
`Shift` **nicht** gedrückt halten — das Seitenverhältnis muss 16:9 bleiben,
|
||||
die Kamera darf nicht verzerrt werden.
|
||||
> Steht die Kamera in OBS als 4:3 (z. B. 640×480), vorher in den
|
||||
> Kameraeinstellungen auf eine 16:9-Auflösung umstellen (1280×720 oder
|
||||
> 1920×1080). Ein 4:3-Bild in einen 16:9-Rahmen zu ziehen staucht das
|
||||
> Gesicht.
|
||||
4. **Chat-Overlay und Alerts** nach rechts schieben, sodass sie komplett
|
||||
rechts der orangen Linie liegen.
|
||||
5. **Alles andere** (Minimap gehört zum Spiel, Kacheln, Sub-Ziel) nach links
|
||||
unten oder in die rechte Spalte — nur nicht in den cyanen Bereich.
|
||||
6. **Vorlage ausblenden** (Auge anklicken). Nicht löschen: beim nächsten
|
||||
Layout-Umbau ist sie wieder da.
|
||||
|
||||
## Prüfen
|
||||
|
||||
```powershell
|
||||
docker compose run --rm toolkit calibrate
|
||||
```
|
||||
|
||||
Nimmt das neueste Video aus dem Wiedergabepuffer-Ordner und legt drei Bilder in
|
||||
`data/clips/_calibration/` ab: das Einzelbild, dasselbe mit eingezeichneten
|
||||
Ausschnitten, und die fertige 9:16-Vorschau. Sitzt in der Vorschau der Kopf
|
||||
mittig und ist im Gameplay-Teil kein Chat zu sehen, stimmt das Layout.
|
||||
|
||||
## Text im Bild — hier wird es eng
|
||||
|
||||
Bei der Prüfung eines echten Clips lagen **drei Textebenen übereinander**:
|
||||
|
||||
1. die Untertitel des Spiels („Genau, ich mach da … sag zu dem Typen")
|
||||
2. ein **Live-Caption-Overlay** mit lila Wort-Markierung („Okay FIFA **Es**")
|
||||
3. dazu käme der Untertitel, den das Toolkit für das Short erzeugt
|
||||
|
||||
Das ist eine Ebene zu viel — und die ersten beiden sind fest ins Streambild
|
||||
eingebrannt, lassen sich also nachträglich nicht entfernen.
|
||||
|
||||
**Spieluntertitel: aus.** Sie laufen über die volle Bildbreite, werden vom
|
||||
Ausschnitt rechts angeschnitten und bringen im Short nichts.
|
||||
|
||||
**Live-Captions: verschieben, nicht abschalten.** Für Zuschauer im Stream sind
|
||||
sie wertvoll, gerade für Leute, die ohne Ton mitlesen. Sie müssen nur aus dem
|
||||
cyanen Band heraus. Zwei brauchbare Plätze:
|
||||
|
||||
| Ort | Vorteil | Nachteil |
|
||||
|---|---|---|
|
||||
| **unten links**, x 0 bis 515, zweizeilig | bleibt live sichtbar, stört das Short nicht | schmaler, also mehr Zeilenumbrüche |
|
||||
| **rechte Spalte** unter dem Chat, ab x 1405 | viel Platz | konkurriert mit dem Chat um Aufmerksamkeit |
|
||||
|
||||
Ganz abschalten geht auch — dann haben nur die Shorts Untertitel. Das ist eine
|
||||
Entscheidung für den Stream, nicht fürs Toolkit; beides funktioniert.
|
||||
|
||||
Ein **HUD am rechten Rand** (Killfeed, Inventar) ist im Short nicht zu sehen.
|
||||
Wo das stört, bekommt das Spiel ein eigenes Profil in
|
||||
[`config/layout.yaml`](../config/layout.yaml).
|
||||
|
||||
## Was das Ergebnis begrenzt — und wie man es hebt
|
||||
|
||||
Das Short entsteht aus dem **fertig zusammengesetzten Streambild**. Die Kamera
|
||||
ist darin 480 Pixel breit und wird für das Hochformat auf 1080 vergrößert, also
|
||||
um Faktor 2,25. Das sieht weicher aus als das Original. Genauso das Gameplay,
|
||||
Faktor 1,21 — das fällt kaum auf.
|
||||
|
||||
Wer schärfer will, braucht eine zweite Bildquelle statt eines Zuschnitts:
|
||||
|
||||
| Weg | Aufwand | Ergebnis |
|
||||
|---|---|---|
|
||||
| Zuschnitt aus dem Streambild (heute) | keiner | brauchbar, leicht weich |
|
||||
| OBS-Plugin **Source Record** — Kamera zusätzlich einzeln aufnehmen | Plugin installieren, eine Quelle konfigurieren | Kamera in voller Auflösung, Zusammensetzen aus zwei Dateien |
|
||||
| OBS-Plugin **Aitum Vertical** — echte zweite Leinwand 1080×1920 | Plugin plus eigene Szene | bestes Ergebnis, kein Zuschnitt nötig |
|
||||
|
||||
Das ist eine Aufgabe für nach dem MVP. Der Zuschnitt reicht, um anzufangen —
|
||||
und ohne Clips, die überhaupt entstehen, bringt die beste Bildqualität nichts.
|
||||
|
||||
## Wenn das Layout sich doch ändert
|
||||
|
||||
`config/layout.yaml` kennt mehrere Profile. Das Profil `bestand-2026-09` hält
|
||||
fest, wie es vor der Vorgabe aussah — damit lassen sich alte Aufnahmen noch
|
||||
korrekt rendern:
|
||||
|
||||
```powershell
|
||||
docker compose run --rm toolkit render <datei> bestand-2026-09
|
||||
```
|
||||
Reference in new issue
Block a user