Añadir subtítulos a videos
🤖/video/subtitle añade subtítulos y pistas de Closed Captions a los videos.

Este Robot admite SRT, VTT, ASS y la salida JSON con marcas de tiempo de /speech/transcribe con "format": "json". Pasa el video como "video" y la transcripción como "subtitles" en el parámetro use. Las palabras del JSON se agrupan en subtítulos y se convierten a ASS para resaltar palabras en subtítulos incrustados, o a segmentos SRT sin formato para flujos de subtítulos externos. Los segmentos JSON externos conservan las mayúsculas, las minúsculas y la puntuación. Los segmentos del proveedor no determinan las divisiones entre subtítulos. Se conserva la temporización de SRT y VTT.
Sin un preset ni opciones ffmpeg personalizadas, el ajuste preestablecido heredado "flash" genera una salida FLV. Con este valor predeterminado, los subtítulos incrustados usan audio MP3; los subtítulos externos copian el audio de entrada. Establece "preset": "empty" para conservar el contenedor de entrada, por ejemplo MP4 para una entrada MP4.
Al incrustar subtítulos en un video HDR HLG o PQ, se aplica un mapeo de tonos al video para convertirlo a SDR BT.709 antes de dibujar los subtítulos. Los colores de los subtítulos conservan sus valores RGB previstos y la salida se etiqueta como SDR. Los subtítulos externos conservan los colores HDR del video de origen. Las entradas SDR mantienen su procesamiento actual. Si ffmpeg.pre:filter:v proporciona su propio mapeo de tonos, ese filtro controla la conversión de color.
Ejemplo de uso
Transcribe un video subido en palabras con marcas de tiempo y luego añade subtítulos incrustados en mayúsculas para redes sociales, con la palabra pronunciada resaltada. Los subtítulos normalmente contienen hasta tres palabras y se dividen al final de las oraciones y en las pausas de más de 0,4 segundos. La segmentación de frases para redes sociales puede usar una palabra adicional para mantener unida una frase corta o evitar que una palabra quede aislada al final de una oración:
{
"steps": {
"captioned": {
"ffmpeg_stack": "v7",
"preset": "empty",
"robot": "/video/subtitle",
"style": "social",
"subtitles_type": "burned",
"use": {
"steps": [
{
"as": "video",
"name": ":original"
},
{
"as": "subtitles",
"name": "transcript"
}
]
}
},
"transcript": {
"format": "json",
"provider": "aws",
"robot": "/speech/transcribe",
"source_language": "en-US",
"use": ":original"
}
}
}Parámetros
interpolateboolean | Record<string, boolean>Controla si las Assembly Variables se interpolan en campos de instrucciones individuales.
De forma predeterminada, la mayoría de los campos de instrucciones de los Robots interpolan Assembly Variables. Establece esta opción en
falsepara tratar todos los campos de instrucciones como texto literal, o establece la ruta de un campo individual enfalsepara tratar únicamente ese campo como texto literal. En el caso de los campos específicos de un Robot que son literales de forma predeterminada, establece esta opción entrueo la ruta de ese campo entruepara volver a habilitar la interpolación.Usa nombres de campos como
patho rutas con puntos comoffmpeg.vfpara los objetos anidados.output_metaRecord<string, boolean> | boolean | Array<string>Te permite especificar un conjunto de metadatos cuyo cálculo requiere más recursos de CPU y que, por lo tanto, está desactivado de forma predeterminada para mantener el procesamiento de tus Assemblies rápido.
Para imágenes, puedes añadir
"has_transparency": trueen este objeto para extraer si la imagen contiene partes transparentes y"dominant_colors": truepara extraer un array de códigos de color hexadecimales de la imagen.Para imágenes, también puedes añadir
"blurhash": truepara extraer una cadena BlurHash, una representación compacta de un marcador de posición para la imagen que resulta útil para mostrar una vista previa desenfocada mientras se carga la imagen completa.Para imágenes,
"thumbhash": trueextrae en su lugar un ThumbHash codificado en base64 enmeta.thumbhash, junto conmeta.has_alpha(si existe un canal alfa, incluso cuando es totalmente opaco). Describe píxeles orientados según EXIF y usa el primer fotograma en el caso de imágenes animadas. La extracción se realiza según el mejor esfuerzo posible: las imágenes de más de 40 megapíxeles, los formatos no compatibles o una decodificación fallida o limitada no generan ningún marcador de posición. Una extracción exitosa añade un cargo de metadatos equivalente al 20 % de los bytes de ese archivo. No se aplica ningún recargo por ThumbHash cuando está desactivado o cuando no se genera ningún hash.Configura esta opción en el Step que genera la imagen, como
/upload/handlepara los originales subidos o/image/resizepara las salidas procesadas. Configurarla únicamente en/transloadit/storeno solicita la extracción: el almacenamiento conserva los metadatos del origen. Transloadit Storage conserva un hash generado junto con su versión inmutable y lo devuelve en los resultados almacenados y en las lecturas nativas de activos. Las subidas directas a S3 no generan marcadores de posición. Un marcador de posición contiene información de la imagen, por lo que debes protegerlo con los mismos controles de acceso que la imagen completa.Para videos, puedes añadir el parámetro
"colorspace": truepara extraer el espacio de color del video de salida.Para videos, también puedes añadir
"interlaced": truepara detectar si el video está entrelazado. Esto combina el indicadorfield_orderde ffprobe, cuyo costo computacional es bajo, con una pasada de muestreo limitada medianteidetsobre los primeros fotogramas de la fuente, y exponeinterlaced,field_ordery un objeto de diagnósticointerlace_detectionenfile.meta. Esto requiere muchos recursos computacionales y se factura en consecuencia.Para audio, puedes añadir
"mean_volume": truepara obtener un único valor que represente el volumen promedio del archivo de audio.También puedes establecer esto en
falsepara omitir la extracción de metadatos y acelerar la transcodificación.user_metaRecord<string, any>(valor predeterminado:{})Añade metadatos JSON personalizados a cada archivo emitido sin modificar su contenido. Se admiten objetos y arrays anidados.
La herencia depende del Robot. Los valores se combinan con los
user_metaexistentes en el archivo de salida; el Step actual reemplaza las claves coincidentes de nivel superior. Asigna explícitamente las claves necesarias cuando un Robot cree nuevos archivos de salida.En los Steps de procesamiento,
${file.*}hace referencia a la primera entrada y${result.*}al archivo emitido. Los valores se evalúan para cada salida después de ejecutarse el Robot, antes de la posterior extracción de metadatos y del almacenamiento temporal. En:original, los valores se evalúan para cada subida antes de la extracción de metadatos.Los Steps posteriores leen
${file.user_meta.key}. Consulta Metadatos personalizados para ver un ejemplo completo y las reglas de herencia.resultboolean(valor predeterminado:false)Indica si los resultados de este Step deben aparecer en el Assembly Status JSON
queuebatchEstablecer la cola en «batch» reduce manualmente la prioridad de los Jobs de este Step para evitar consumir cupos prioritarios con Jobs que no necesitan un tiempo de espera cero en la cola
force_acceptboolean(valor predeterminado:false)Forzar a un Robot a aceptar un tipo de archivo que habría ignorado.
De forma predeterminada, los Robots ignoran los archivos que no reconocen. 🤖/video/encode, por ejemplo, ignorará sin problemas las imágenes de entrada.
Si configuras el parámetro
force_acceptcomotrue, puedes forzar a los Robots a aceptar todos los archivos que reciban. Esto normalmente provocará errores y solo debe usarse para depuración o para abordar casos extremos.ignore_errorsboolean | Array<meta | execute>(valor predeterminado:[])Ignorar errores durante fases específicas del procesamiento.
Establecer este parámetro en
["meta"]hará que el Robot ignore los errores durante la extracción de metadatos.Establecer este parámetro en
["execute"]hará que el Robot ignore los errores durante la fase principal de ejecución.Configurar este parámetro como
trueequivale a["meta", "execute"]y hará que se ignoren los errores en ambas fases.usestring | Array<string> | Array<object> | objectEspecifica qué Step o Steps se usarán como entrada.
- Puedes elegir cualquier nombre para los Steps, excepto
":original"(reservado para las subidas de usuarios gestionadas por Transloadit) - Puedes proporcionar varios Steps como entrada mediante arrays:
{ "use": [ ":original", "encoded", "resized" ] } - También puedes etiquetar los Steps de entrada con
aspara comunicar la intención semántica a los Robots:{ "use": [ { "name": ":original", "as": "image" }, { "name": ":original", "as": "mask" } ] }
ConsejoProbablemente eso sea todo lo que necesitas saber sobre
use, pero puedes consultar los casos de uso avanzados.- Puedes elegir cualquier nombre para los Steps, excepto
ffmpegobjectUn objeto de parámetros que se pasará a FFmpeg. Si se utiliza un ajuste preestablecido, las opciones especificadas se combinan con las de ese ajuste. Para consultar las opciones disponibles, revisa la documentación de FFmpeg. Las opciones especificadas aquí tienen prioridad sobre las del ajuste preestablecido.
ffmpeg_stackv6 | v7 | v8 | string(valor predeterminado:"v6.0.0")Selecciona la versión del stack de FFmpeg que se usará para el encoding. Actualmente recomendamos usar «v7». Las versiones exactas «v6.0.0», «v7.0.0» y «v8.0.0» son valores heredados que siguen aceptándose por compatibilidad con versiones anteriores. También se aceptan los valores obsoletos «v5.x».
widthstring | number | nullAncho del nuevo video, en píxeles.
Si no se especifica el valor y el parámetro
presetestá disponible, se aplicará el ancho proporcionado porpreset.heightstring | number | nullAltura del nuevo video, en píxeles.
Si no se especifica el valor y el parámetro
presetestá disponible, se aplicará la altura proporcionada porpreset.presetandroid | android-high | android-low | android_high | android_low | dash-1080p-video | dash-1080p_video |Convierte un video según un ajuste preestablecido.
Puedes usar aquí el valor
'empty'si especificas tus propios parámetros de FFmpeg mediante el Robot o si no quieres que Transloadit establezca ningún ajuste de encoding.subtitles_typeburned | external | burn(valor predeterminado:"external")Determina si los subtítulos se añaden al video como un flujo separado (valor
"external"), que luego puede activarse y desactivarse en el reproductor de video, o si deben incrustarse directamente en el video (valor"burned"o"burn") para que formen parte del flujo de video.stylesocialAplica una apariencia prediseñada a los subtítulos incrustados: texto Poppins de gran grosor, un contorno grueso y una sombra negra suave. Los subtítulos JSON se muestran en mayúsculas en el tercio inferior. De forma predeterminada, el tamaño de fuente de los subtítulos JSON se basa en el lado más corto del video y cada subtítulo se ajusta al ancho seguro, preferentemente en una línea y como máximo en dos. Las palabras nunca se dividen. Cada subtítulo crece desde el 85 % hasta su tamaño completo durante 120 milisegundos; luego, sus palabras permanecen en su lugar mientras el resaltado cambia de color. El archivo de transcripción se conserva. Los parámetros de estilo existentes tienen prioridad sobre el ajuste preestablecido; un valor explícito de
font_sizedesactiva el ajuste automático. Los archivos ASS conservan sus propios estilos. Con JSON con marcas de tiempo de/speech/transcribe, la palabra activa permanece resaltada hasta que comienza la siguiente palabra o el siguiente subtítulo; las demás palabras usanfont_color. Las comas y los puntos finales se omiten en los subtítulos JSON con estilo social; los signos de interrogación y exclamación se conservan. El resaltado y la agrupación de palabras requieren una entrada JSON.highlight_colorstring | string(valor predeterminado:"FFD60A")El color de resaltado de la palabra activa en los subtítulos JSON. Solo se aplica a los subtítulos JSON incrustados. Con
"style": "social", la palabra anterior permanece resaltada durante las pausas breves hasta que comienza la siguiente palabra o el siguiente subtítulo. Sin el estilo social, se usafont_colorpara todo el subtítulo durante las pausas.Usa el formato
"rgb","rrggbb"o"aarrggbb", con el prefijo opcional#. Los colores de tres dígitos se expanden a seis dígitos. Los colores sin alfa son totalmente opacos. En los colores de ocho dígitos, los dos primeros dígitos especifican la transparencia ("00"es totalmente opaco y"ff"es totalmente transparente).max_words_per_captionstring | number(valor predeterminado:3)El número máximo objetivo de palabras del JSON con marcas de tiempo que se muestran en un subtítulo. Los subtítulos se dividen antes cuando hay signos de puntuación de fin de oración o pausas de más de 0,4 segundos. Con
"style": "social", una palabra funcional en inglés al final, como «by», «to» o «the», pasa al siguiente subtítulo cuando es posible. Las frases cortas, como «línea de código», pueden mantenerse juntas, y una palabra aislada al final de una oración puede unirse al subtítulo anterior. Estos ajustes permiten como máximo una palabra adicional por subtítulo, sin cruzar finales de oración ni pausas largas. Los subtítulos de una sola palabra se conservan cuando el límite es 1. Un subtítulo permanece visible hasta que comienza el siguiente si la pausa es de como máximo 0,4 segundos, y desaparece al terminar su última palabra durante pausas más largas. No modifica los segmentos de SRT, VTT ni ASS.border_stylebox | outline | shadow(valor predeterminado:"outline")Especifica el estilo de los subtítulos. Usa el parámetro
border_colorpara especificar el color del borde.border_colorstring | string(valor predeterminado:"000000")El color del borde de los subtítulos. El valor predeterminado es negro opaco. Solo se aplica a los subtítulos incrustados.
Usa el formato
"rgb","rrggbb"o"aarrggbb", con el prefijo opcional#. Los colores de tres dígitos se expanden a seis dígitos. Los colores sin alfa son totalmente opacos. En los colores de ocho dígitos, los dos primeros dígitos especifican la transparencia ("00"es totalmente opaco y"ff"es totalmente transparente).fontstringLa familia tipográfica que se usará. También incluye el grosor y el estilo de la fuente. La fuente predeterminada es Arial. Con
"style": "social", la fuente predeterminada es Poppins, con su grosor ExtraBold para los subtítulos JSON. Una fuente explícita tiene prioridad sobre el estilo.Consulta aquí la lista de todas las fuentes compatibles.
font_colorstring | string(valor predeterminado:"FFFFFF")El color del texto de los subtítulos. Solo se aplica a los subtítulos incrustados.
Usa el formato
"rgb","rrggbb"o"aarrggbb", con el prefijo opcional#. Los colores de tres dígitos se expanden a seis dígitos. Los colores sin alfa son totalmente opacos. En los colores de ocho dígitos, los dos primeros dígitos especifican la transparencia ("00"es totalmente opaco y"ff"es totalmente transparente).font_sizestring | numberEspecifica el tamaño del texto en el espacio de coordenadas de subtítulos de 288 píxeles, que se escala según la altura del video. El valor predeterminado es 16. Con
"style": "social", el valor predeterminado es 54. Para los subtítulos JSON con estilo social, si se omite el valor, este tamaño predeterminado se escala según el lado más corto del video, se aumenta en un 18 % para videos verticales y se reducen los subtítulos según sea necesario para que ocupen como máximo dos líneas. Antes del ajuste, las letras mayúsculas de Poppins miden aproximadamente un 7,5 % del lado más corto, o aproximadamente un 9 % para videos verticales. Un valor explícito mantiene el tamaño relativo a la altura y desactiva el ajuste automático.boldbooleanEspecifica si el texto de los subtítulos debe estar en negrita. Solo se aplica a los subtítulos incrustados. El valor predeterminado es
false. Con"style": "social", el valor predeterminado estrue; un valor explícito defalsetiene prioridad sobre el estilo.italicboolean(valor predeterminado:false)Especifica si el texto de los subtítulos debe estar en cursiva. Solo se aplica a los subtítulos incrustados.
outline_widthstring | number | nullEspecifica el ancho del contorno del texto en el espacio de coordenadas de subtítulos de 288 píxeles, que se escala según la altura del video. También se aceptan cadenas numéricas como
"4". Solo se aplica a los subtítulos incrustados con los estilos de borde"outline"o"box". Si se omite o esnull, se usa el ancho predeterminado (2 con"style": "social", proporcional al tamaño final de la fuente tras el ajuste para los subtítulos JSON con estilo social).positionbottom | bottom-left | bottom-right | center | left | right | top |(valor predeterminado:"bottom")Especifica la posición de los subtítulos. Con
"style": "social", la posición inferior predeterminada coloca los subtítulos JSON en el tercio inferior, con espacio adicional debajo en videos verticales. Un valor explícito tiene prioridad sobre el estilo.languagestring | nullEspecifica el idioma del flujo de subtítulos mediante un código de idioma de tres letras (por ejemplo,
"eng","deu","spa"). Solo se utiliza si los subtítulos son externos. Al añadir varios flujos de subtítulos, establece un idioma diferente para cada flujo, de modo que los reproductores de video puedan ofrecer una selección de idiomas.namestring | nullEspecifica un nombre legible para la pista de subtítulos (por ejemplo,
"English","Deutsch","Español"). Solo se usa si los subtítulos son externos. Este nombre se muestra junto al idioma en los menús de subtítulos de los reproductores de video.keep_subtitlesboolean(valor predeterminado:false)Especifica si deben conservarse los subtítulos existentes en el archivo de entrada o si el nuevo subtítulo debe reemplazarlos. Solo se utiliza si los subtítulos son externos. Establécelo en
trueal encadenar varios Steps/video/subtitlepara añadir varios flujos de subtítulos (por ejemplo, en distintos idiomas) al mismo video.
Demos
Publicaciones relacionadas del blog
- Incrusta subtítulos en videos fácilmente con nuestro nuevo Robot
- Re-Loadit: simplifica las subidas con el Robot /upload/handle
- Nueva función: transcripción automática de videos con subtítulos
- Build a Reddit video subtitling bot with Transloadit (English)
- Creación de visualizaciones de audio atractivas con Transloadit
- Estilo de subtítulos con Transloadit: 3 formas creativas
- Novedades en video: transiciones, capítulos, CMAF y más
- Subtítulos estilo redes sociales con la palabra hablada resaltada