Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Feature] Convert TTML into ASS #765

Open
wants to merge 9 commits into
base: master
Choose a base branch
from

Conversation

Lucki
Copy link

@Lucki Lucki commented Mar 8, 2025

Wenn Untertitel heruntergeladen werden, sind diese im TTML-Format. Handelsübliche Abspielprogramme können jedoch mit dem Format nichts anfangen. Deswegen existiert bereits ein Konverter in das SRT-Format.
SubRip hat jedoch den Nachteil, dass wichtige Informationen bei der Konvertierung verloren gehen - im Besonderen die Positionierungsangabe, welche sicherstellt, dass wichtige Bildbereiche nicht überdeckt sind.
Meines Wissens nach hat SubRip auch keine Positionierungsmöglichkeit vorgesehen, manche Abspielprogramme unterstützen jedoch die Positionierungstags des ASS-Formates.
Aufgrund der fehlenden Spezifikation habe ich mich entschieden, das ASS-Format direkt einzubauen, anstatt SRT zu erweitern.
WebVTT wäre auch eine Möglichkeit, diese habe ich mir jedoch nicht genauer angeschaut.

Dieser PR fügt die Konvertierung in das Advanced SubStation (ASS) Format hinzu, welches mithilfe von libass in vielen populären Abspielprogrammen unterstützt wird. Besonders hervorzuheben sind hier Kodi und VLC, welche zusammen bestimmt einen Großteil der Nutzer hat.
Getestet habe ich die resultierenden Untertitel in Kodi, MPV und VLC.

Vorschau

Untertitelansichtsvergleich
  • TTML?: Ansicht der Untertitel im Webplayer der Mediathek.
  • ASS: Der Untertiteltext wird aus dem wichtigen Bereich herausgeschoben, die Darstellung ist näher an der originalen TTML-Darstellung aufgrund des transparenten Hintergrundes.
  • SRT: Der Untertiteltext überdeckt die in das Video eingebackene Schrift und macht beide Texte unlesbar.

Detailerklärungen

Aufgrund der abschließenden Formatierung, wie im Styleguide angegeben, empfehle ich, die Leerzeichenänderungen in der Reviewansicht auszublenden oder den letzten Commit zu entfernen. Editierungen von Maintainern sind aktiviert.

Die interne Positionsangabe ist stark auf die hier benötigten Werte (Integer in Nummernpadanordung) zugeschnitten. Falls später noch weitere Konvertierungen wie WebVTT hinzugefügt werden sollten, müsste diese wahrscheinlich angepasst werden.

Ein paar Besonderheiten im Hinblick zur "Spezifikation":

  • Es wird die Angabe von LayoutResX, LayoutResY, PlayResX und PlayResY gefordert. Diese Informationen sind uns bei der Generierung jedoch nicht bekannt. Die Angabe wirkt sich auf die Größe der Schrift aus. Ein Weglassen der Angaben scheint jedoch in allen getesteten Abspielprogrammen die Videodaten als Fallback zu nehmen und somit erwartbare Größen zu produzieren.
  • Ähnliches gilt für die Schriftart. Die TTML-Dateien haben Verdana, Arial, Tiresias als tts:fontFamily angegeben. Auch die ASS-Dateien können Schriftarten angeben, allerdings muss die angegebene Schriftart auf allen Systemen vorhanden sein und hat auch wieder Auswirkungen auf die Größe. Ein Weglassen der Angaben scheint auch hier wieder in allen getesteten Abspielprogrammen ein Fallback zu nehmen und somit erwartbare Größen zu produzieren.
  • Die richtige Schriftgröße ist schwierig aufgrund der verschiedenen Schriftarten. Für die Fallbackschriftart scheint 22 mit der Größe im Webplayer und SRT-Format sehr ähnlich zu sein.
  • MarginV gibt den Abstand zum oberen und unteren Ende an. Die Angabe sollte in Pixeln sein, ist gleichzeitig aber abhängig von LayoutResX, PlayResX… die wir nicht angegeben haben. Deswegen bin ich nicht sicher, was die Einheit des Wertes real ist. 25 erreicht in meinen Tests ungefähr die Position des Webplayers.
  • Die Positionierung und Farbverwaltung kann in Stilen vorgenommen werden, die dann in den Dialogzeilen referenziert werden. Erst wollte ich das auch genauso machen, habe mich dann aber auf eine komplette Anpassung "inline" mithilfe von Tags umentschieden. Einerseits müssten Farbanpassungen innerhalb einer Zeile sowieso "inline" erfolgen, andererseits würde jegliche Kombination in Stilen angegeben werden müssen.
  • Die Farbangaben sind praktisch komplett umgedreht und somit ein ziemlicher Krampf: ABGR und der Alphachannel nochmal im Wert mit 255 als durchsichtig.

References


Ich bin über ein TTML gestolpert, in dem die p style nur optional vorhanden waren. Der Force-Push hat die Commits dahingehend geändert.
Als Bonus habe ich am Ende auch den span style als optional geändert. Dieser kann einfach gedroppt werden, wenn unerwünscht - real habe ich das bisher nicht gesehen.

Lucki added 9 commits March 11, 2025 20:59
tts:textAlign is often used inside ttml files to move
subtitles out of the way of important things on screen,
similar to tts:displayAlign.
Observed values are left, center and right.
This commit saves that information into the internal
object using an integer.

Mappings:
- start:  -1
- left:   -1
- center:  0
- right:   1
- end:     1

https://www.w3.org/TR/2018/REC-ttml1-20181108/#style-attribute-textAlign
tts:displayAlign is often used inside ttml files to move
subtitles out of the way of important things on screen,
similar to tts:textAlign.
Observed values are before and after.
This commit saves that information into the internal
object using an integer.

Mappings:
- before: 8
- center: 5
- after:  2

https://www.w3.org/TR/2018/REC-ttml1-20181108/#style-attribute-displayAlign
This is adding the remaining bits necessary
to convert the internal representation
into the ASS format. Best effort is made to
have the resulting subtitles look as intended.

In particular this means:
- Giving the subtitles a box background
  with given color and transparency
- Positioning the subtitles on screen
  using the region and alignment information
- Color code the subtitles with provided
  color
- Respecting forced line breaks
All changed fields aren't evaluated by existing tests yet.
as mentioned in the styleguides
@Lucki Lucki force-pushed the feature/ttml_to_ass branch from 0f4c61a to 3f61a8e Compare March 11, 2025 20:01
@derreisende77
Copy link
Contributor

Ich komme leider erst nächste Woche dazu mir das anzusehen. Bist Du soweit fertig damit oder sind noch commits zu erwarten?

@Lucki
Copy link
Author

Lucki commented Mar 14, 2025

Kein Problem, es eilt ja nicht, da dies kein kritisches Problem behebt. Ich denke, dass nach dem Ansehen Details in zusätzlichen Commits implementiert werden müssen. Gerade im Hinblick auf die Schriftart und Abspielgröße bin ich mir auch unsicher, ob die aktuelle Lösung die Beste ist und wäre über weitere Meinungen dankbar.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants