Universal Subtitle Format
El Universal Subtitle Format (USF) en español "Formato Universal de Subtítulos", es un proyecto ambicioso creado para proporcionar un formato de subtítulos limpio, documentado, potente y fácil de usar. El formato está basado en XML por muchas razones: flexibilidad, legibilidad humana, portabilidad, soporte de unicode, sistema de jerarquía y fácil administración.
Introducción
La meta del Universal Subtitle Format es crear un nuevo formato tomando lo mejor que existe en formatos de subtítulos actualmente.
El formato debe ser lo suficientemente flexible para ser usado en el subtitulado de cada día, así como en proyectos de subtitulado más avanzados. La clave del proyecto es de proveer una serie de herramientas y especificaciones para mejorar la calidad de los videos subtitulados previniendo el proceso de codificar los subtítulos junto con el vídeo ya que crea una gran pérdida de calidad debido al contraste de los subtítulos. También el formato se ha diseñado para que el usuario pueda cambiar el estilo predeterminado tal como el tamaño de fuente, el color, etc. en la reproducción.
Características y ventajas
- Basado en XML para mejor flexibilidad e interoperación.
- Sintaxis fácil de aprender, cercana al HTML.
- Basado en tiempo para evitar problemas con la conversión del frame rate del video.
- 4 tipos de elementos:
- texto
- imagen
- karaoke
- forma (rectángulo,...)
- Poderoso sistema de posicionamiento de elementos.
- 9 tipos de alineación (TopLeft,..., MiddleCenter,..., BottomRight).
- Relativo a la ventana o al video.
- Margen horizontal & vertical en píxel o porcentaje del vídeo/ventana.
- Atributos de texto usable en una base por letra.
- color
- cursiva, negrita, subrayado
- tamaño
- fuente
- Estilo definible para modificaciones globales más rápidas.
- Información meta para incrementar facilidades de almacenamiento/búsqueda.
- title (título)
- author (autor)
- language (lenguaje) (ISO 639-2 más uno definido por el usuario)
- date (fecha)
- comment (comentario)
La sintaxis del formato
Un fichero XML puede ser visto como un árbol, con una raíz, ramas y nodos.
<rootnode> +-rootnode <node> | <subnode/> +-node <node> | </rootnode> +-subnode
La raíz del árbol USF es llamado "USFSubtitles".
<USFSubtitles version="1.0"> +-USFSubtitles (1) @-version (1) <metadata>...</metadata> +-metadata (1) <styles>...</styles> +-styles (0..1) <effects>...</effects> +-effects (0..1) <subtitles>...</subtitles> +-subtitles (1..N) </USFSubtitles>
Entre los paréntesis el número posible de elementos. (1: requerido, 0..1: opcional, 1..N: por lo menos uno, 0..N).
@ es la marca para un atributo.
El atributo de la versión es utilizada por el reproductor para identificar que características son usadas en el archivo actual. La versión será incrementada en el futuro si nuevas características son necesarias.
Metadato
El nodo de metadato es bastante auto explicativo.
<metadata> +-metadata <title>Mi película</title> +-title (1) <author> +-author (1..N) <name>Mi nombre</name> | +-name (1) <email>miemail@servidor.com</email> | +-email (0..1) <url>http://www.misitio.com</url> | +-url (0..1) <task>traductor</task> | +-task (0..1) </author> | <language code="spa">Español</language> +-language (1) | @-code (1) <languageext code="DirectorComments"> +-languageext (0..1) Toff comments</languageext> | @-code <date>YYYY-MM-DD</date> +-date (0..1) <comment>mi commentario</comment> +-comment (0..1) </metadata>
El atributo del código de lenguaje (language code) es normalizado (ISO 639-2), ver Codes for the Representation of Names of Languages para un listado completo.
Otros ejemplos:
<language code="fre">Français</language> <language code="eng">English</language> <language code="deu">Deutsch</language> también puede ser "ger".
La extensión de lenguaje (languageext) debe estar definida en esta lista: Normal, HearingImpaired, DirectorComments, Forced, Children.
La fecha usa el estándar internacional de fechas (ISO 8601).
YYYY-MM-DD : - YYYY : año de cuatro dígitos (2006, 2007) - MM : mes de dos dígitos (01=Enero, etc.) - DD : día del mes de dos dígitos (01 a 31) ejemplo : 2006-08-25
Se puede usar etiquetas básicas (i, b, u, font, br) en el elemento comentario (comment), estas se usan para dar formato al texto como cursiva, negrita, subrayado, etc.
Estilos
Definir estilos es opcional, pero hará que los subtítulos sean más estructurados y fáciles de mantener.
<styles> <style name="MiNombreDeEstilo"> <fontstyle face="Arial" family="sans-serif" size="24" ó size="+1" (+10%) color="#AARRGGBB" weight="bold" italic="yes" underline="no" alpha="0-100" back-color="#AARRGGBB" outline-color="#AARRGGBB" outline-level="2" shadow-color="#AARRGGBB" shadow-level="4" wrap="no|auto"/> <position alignment="TopLeft" horizontal-margin="10" vertical-margin="20%" relative-to="Window" rotate-x="0-359" rotate-y="0-359" rotate-z="0-359"/> </style> ... </styles>
Los estilos son usados para definir configuraciones aplicables a un grupo de subtítulos de texto.
Un estilo tiene un atributo nombre (name) requerido, es el nombre que se usará de referencia luego. Todos los demás atributos son opcionales.
<styles> <style name="MiNombreDeEstilo"><fontstyle color="#FF0000" /></style> </styles> ... <subtitle> <text style="MiNombreDeEstilo">tu primer subtítulo de texto</text> </subtitle> <subtitle> <text style="MiNombreDeEstilo">tu segundo subtítulo de texto</text> </subtitle>
Si se cambia el estilo llamado "MiNombreDeEstilo" se tendrá que cambiar ambas líneas.
En el reproductor un estilo predeterminado (default) es definido, es usado si no se provee un estilo. Por otra parte se puede eliminar este estilo predeterminado usando el nombre "Default":
<style name="Default><fontstyle size="36"/></style>
Todo el estilo es heredado del estilo predeterminado (el del reproductor o el que se ha redefinido).
Ésta es la jerarqía usada:
+-----------------------+ |Internal default style | +-----------+-----------+ | +-----------+-----------+ |Redefined default style| +-----------+-----------+ +----------------------------+ +-----------+-----------+ +-----------+-----------+ | New style 1 | | New style 2 | ... +-----------------------+ +-----------------------+
- Estilo de fuente (fontstyle)
El atributo familia (family) especifica una lista priorizada de nombres de familias de fuente o nombres genéricos de familias.
Éstos son algunos ejemplos:
family="Times, 'Times New Roman', serif" family="Helvetica, Arial, sans-serif" family="'Courier New', Courier, monospace" family="'Comic Sans MS', cursive"
Como usted ve se recomienda que uno debe especificar una familia genérica de la fuente después de cualquier fuente nombrada como retraso a una familia preferida de los tipos de fuente; una de serif, sans-serif, monospace, cursive o fantasy. (Generic font families)
Los colores son definidos como en HTML, con 3 componentes, rojo, verde y azul en el rango 0.255 codificado en hexadecimal.
Así que rojo puro es #FF0000, verde puro #00FF00 y azul puro #0000FF.
El color puede ser extendido por un 4.º componente, un componente alpha especificando la transparencia del color. Un valor de un componente alpha de 255 especifica que el color es transparente, y un valor alpha de 0 especifica que el color es opaco. Valores del componente alpha desde 1 a 254 especifican el grado a cual se mezcla el color con el fondo. Cuando se escribe #FF0000 de hecho es #00FF0000 un color rojo opaco. Para hacer un color rojo transparente hay que escribir, por ejemplo #7FFF0000.
El atributo alpha puede ser usado para escalar el componente alpha de todos los colores por ejemplo color="#40FFFFFF" y alpha="50" traduciría a color="#A0FFFFFF".
"color" es el color del primer plano del texto, o el color destacado en modo karaoke.
"backcolor" es el color usado en karaoke cuando el texto no está destacado.
El peso de la fuente (font weight) se debe definir en esta gama:
"normal|bold|bolder|lighter|100|200|300|400|500|600|700|800|900" 'normal' es el mismo que '400'. 'bold' es el mismo que '700'. lighter & bolder introducen una noción de herencia.
- Posición
El atributo "alignment" (alineación) tiene 9 valores posibles:
TopLeft | TopCenter | TopRight -------------+----------------+-------------- MiddleLeft | MiddleCenter | MiddleRight -------------+----------------+-------------- BottomLeft | BottomCenter | BottomRight
El atributo "relative-to" (relativo-a) tiene dos valores posibles: "Window" o "Video".
Los márgenes están definidos en píxeles o en porcentaje de ventana o video dependiendo que se ha elegido en el atributo relativo-a.
La rotación está definida en grados. Se puede usar diferentes ejes de rotación para crear un tipo de efecto 3D.
Y^ Z | / | / | / |/ ----+-----------> X /|
La rotación común usada en 2D es el eje Z.
Por ejemplo, para escribir un texto en diagonal desde la esquina-inferior-izquierda a la esquina-superior-derecha se puede usar:
<position alignment="BottomLeft" horizontal-margin="10" vertical-margin="10" relative-to="Window" rotate-z="45"/>
Efectos
Los efectos todavía se consideran incompletos o en desarrollo.
Ésta es una idea, se define algunos cuadros-clave y el reproductor interpola el cuadro requerido para hacer la animación.
Ejemplo:
<effects> <effect name="50%-ZoomIn-ZoomOut"> <keyframes> <keyframe position="0%"><fontstyle size="1"/></keyframe> <keyframe position="50%"><fontstyle size="24"/></keyframe> <keyframe position="100%"><fontstyle size="1"/></keyframe> </keyframes> </effect> <effect name="FadeInFadeOut"> <keyframes> <keyframe position="$inicio"><fontstyle alpha="100"></keyframe> <keyframe position="$inicio+500"><fontstyle alpha="0"></keyframe> <keyframe position="$fin-500"><fontstyle alpha="0"></keyframe> <keyframe position="$fin"><fontstyle alpha="100"></keyframe> </keyframes> </effect> <effect name="HScrolling"> <keyframes> <keyframe position="0%"><position alignment="BottomRight" horizontal-margin="-$elemwidth"/></keyframe> <keyframe position="100%"><position alignment="BottomLeft"/></keyframe> </keyframes> </effect> </effects>
Se sustituye $inicio, $fin por la posición de los cuadro-clave.
Atributos que pueden ser "animados":
<position alignment, horizontal-margin, vertical-margin, relative-to/> <fontstyle size, color, alpha, outline-color, outline-level, shadow-color, shadow-level/>
Subtítulos
Es la parte esencial del fichero, la parte donde se pone el contenido de los subtítulos.
<subtitles> +-subtitles (1..N) <language code="spa">Español</language> +-language (1) | @-code (1) <languageext code="DirectorComments"> +-languageext (0..1) Comentarios de Toff</languageext> | @-code <subtitle +-subtitle (1..N) start="hh:mm:ss.mmm" @-start (1) stop="hh:mm:ss.mmm" @-stop (0..1) duration="hh:mm:ss.mmm"> @-duration (0..1) <text></text> +-text (0..N) <image></image> +-image (0..N) <karaoke></karaoke> +-karaoke (0..N) <shape></shape> +-shape (0..N) ... </subtitle> ... </subtitles>
Un subtítulo tiene 2 atributos de grupos-de-hora/tiempo (timestamps): start (inicio) y stop (detener).
Los timestamps usan el formato siguiente:
hh : dos-dígitos de hora (00-23) mm : dos-dígitos de minuto (00-59) ss : dos-dígitos de segundo (00-59) mmm : tres-dígitos de millisegundos (000-999)
En vez de usar un timestamps de detener se puede usar el atributo duración.
También es permitido usar un timestamp corto: ss[.mmm]
100.000 -> 00:01:40.000 1.100 -> 00:00:01.100 5.500 -> 00:00:05.500
El contenido de un subtítulo puede estar compuesto de diferentes elementos: texto, imagen o karaoke en cualquier número.
Todos los elementos pueden ser ubicados independientemente con los mismos atributos de posición que los estilos: "alignment", "horizontal-margin", "vertical-margin" and "relative-to".
- Texto
<text effect="MiNombreDeEfecto" style="MiNombreDeEstilo" speaker="JorSol"> <i>Italic</i><b>Bold</b><u>Underline</u><br/> <font face="Arial" size="16" color="#FF0000" outline-color="#00FF00" outline-level="2" shadow-color="#AAAAAA" shadow-level="4" >Texto en rojo en Arial 16</font> </text>
Los elementos de texto son definidos por un subconjunto de XHTML.
Todas las etiquetas disponibles son usadas en el ejemplo anterior.
Una nota especial para los usuarios de HTML, XHTML es un poco más estricto que HTML.
En XHTML se debe especificar que una etiqueta es una etiqueta vacía, así que el de salto de linea usa la etiqueta "<br/>" en lugar de "<br>". La etiqueta debe ser jerarquizada correctamente: <b><i>Este es </b>el ejemplo incorrecto.</i> <i><b>Este es </b>el ejemplo correcto.</i> XHTML es también sensitivo (distingue entre mayúsculas y minúsculas): <i>Esto es correcto</i>, <I>Esto es incorrecto</I>
- Imagen
El elemento "image" añade soporte para incluir imágenes en el video, tal y como si fueran subtítulos, normalmente o mejor dicho únicamente está soportado el Bitmap.
<image alpha="0-100" colorkey="#RRGGBB">Image_file_name</image>
La imagen debe estar en el mismo directorio, o en un sub-directorio del fichero de subtítulo.
El atributo "colorkey" es el color que se hará transparente en la imagen, por lo que un valor de #FFFFFF hará transparente todas las partes blancas de la imagen.
- Karaoke
El elemento karaoke es muy similar al elemento texto. La principal diferencia es que se usa una etiqueta especial <k t="duración_en_ms"/>.
Así que en el ejemplo abajo el texto "canción" tiene una duración de 400 ms, "cool" tiene una duración de 300ms...
<subtitle start="00:00:10.000" stop="00:00:11.000"> <karaoke><k t="100"/>una <k t="400"/>canción <k t="200"/>muy <k t="300"/>cool</karaoke> </subtitle>
La suma de todas las duraciones debe ser igual a la duración del subtítulo.
Aquí 100 + 400 + 200 + 300 = 1000 ms = 1s
- Forma (Sharpe)
El elemento "sharpe" se considera incompleto o en desarrollo (e incluso abandonado).
Un ejemplo básico de como podría usarse es:
<shape type="rectangle" width="160" height="120"/>
En las últimas propuestas no oficiales el elemento "sharpe" ha sido desechado en favor de USFxSVG, para usar gráficos vectoriales SVG de manera apropiada pero limitada en comparación a este. (Ver USFxSVG proposal 4)
Un ejemplo
<?xml version="1.0" encoding="UTF-8"?> <USFSubtitles version="1.0"> <metadata> <title>Ejemplo del Universal Subtitle Format</title> <author> <name>JorSol</name> <email>jorsol@wikipedia.org.ni</email> <url>http://es.wikipedia.org/</url> </author> <language code="spa">Español</language> <date>2006-02-01</date> <comment>Este es un corto ejemplo de USF.</comment> </metadata> <styles> <!-- Aquí redefinimos el estilo predeterminado --> <style name="Default" > <fontstyle face="Arial" size="24" color="#FFFFFF" back-color="#AAAAAA" /> <position alignment="BottomCenter" vertical-margin="20%" relative-to="Window" /> </style> <!-- Todos los demás estilos se heredan del predeterminado --> <style name="NarradorHablando"> <fontstyle italic="yes" /> </style> <style name="LetrasMusica"> <fontstyle back-color="#550000" color="#FFFF00" bold="yes" /> </style> </style> <subtitles> <subtitle start="00:00:00.000" stop="00:00:05.000"> <text alignment="MiddleCenter">Bienvenido a '''Wikipedia en Español'''</text> <image alignment="TopRight" vertical-margin="20" horizontal-margin="20" colorkey="#FFFFFF">WP_Logo.bmp</image> </subtitle> <subtitle start="00:00:06.000" stop="00:00:10.000"> <text style="NarradorHablando" speaker="JorSol">Hola! Esta es una <font size="16"> pequeña</font> muestra, cantemos una canción.</text> </subtitle> <subtitle start="00:00:06.000" stop="00:00:10.000"> <karaoke style="LetrasMusica"><k t="700"/>La! La! La! <k t="1000"/> Karaokeeeeeeeee <k t="100"/>is <k t="200"/>divertido !</text> </subtitle> <subtitles> </USFSubtitles>
Referencias
La mayor parte de este artículo está basado en la última especificación oficial de USF y puede ser descargada desde el sitio web.
Otros comentarios
La última especificación oficial es del 2003-06-18 y se considera un borrador por lo que la información contenida en este artículo puede llegar a ser inválida en el futuro, pero actualmente el desarrollo se encuentra en un estado casi nulo y la mayoría de las implementaciones que existen se basan en ésta especificación.