Ajouter des sous-titres aux vidéos
🤖/video/subtitle ajoute des sous-titres et des sous-titres codés aux vidéos.

Ce Robot prend en charge les formats SRT, VTT, ASS et la sortie JSON horodatée de /speech/transcribe avec "format": "json". Transmettez la vidéo en tant que "video" et la transcription en tant que "subtitles" dans le paramètre use. Les mots du JSON sont regroupés en sous-titres et convertis en ASS pour le surlignage des mots dans les sous-titres incrustés, ou en blocs SRT simples pour les flux de sous-titres externes. Les blocs de sous-titres JSON externes conservent la casse et la ponctuation. Les segments du fournisseur ne déterminent pas les coupures entre les sous-titres. Le minutage SRT et VTT est conservé.
Sans preset ni options ffmpeg personnalisées, le préréglage hérité "flash" produit une sortie FLV. Avec cette valeur par défaut, les sous-titres incrustés utilisent l’audio MP3 ; les sous-titres externes copient l’audio d’entrée. Définissez "preset": "empty" pour conserver le conteneur d’entrée, par exemple MP4 pour une entrée MP4.
Lors de l’incrustation de sous-titres dans une vidéo HDR HLG ou PQ, un mappage tonal convertit la vidéo en SDR BT.709 avant le rendu des sous-titres. Les couleurs des sous-titres conservent les valeurs RGB prévues, et la sortie est marquée comme SDR. Les sous-titres externes préservent les couleurs HDR de la vidéo source. Le traitement existant des entrées SDR reste inchangé. Si ffmpeg.pre:filter:v fournit son propre mappage tonal, ce filtre contrôle la conversion des couleurs.
Exemple d’utilisation
Transcrire une vidéo téléversée en mots horodatés, puis incruster des sous-titres de style social en majuscules avec le mot prononcé mis en évidence. Les sous-titres contiennent normalement jusqu’à trois mots et sont coupés aux fins de phrase et aux pauses de plus de 0,4 seconde. Le regroupement des mots du style social peut ajouter un mot supplémentaire pour garder une expression courte groupée ou éviter un mot isolé en fin de phrase :
{
"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"
}
}
}Paramètres
interpolateboolean | Record<string, boolean>Détermine si les Assembly Variables sont interpolées pour chaque champ d’instruction.
Par défaut, la plupart des champs d’instruction des Robots interpolent les Assembly Variables. Définissez ce paramètre sur
falsepour traiter tous les champs d’instruction comme du texte littéral, ou définissez le chemin d’un champ individuel surfalsepour traiter uniquement ce champ comme du texte littéral. Pour les champs propres à un Robot qui sont littéraux par défaut, définissez ce paramètre surtrueou définissez le chemin de ce champ surtruepour réactiver l’interpolation.Utilisez des noms de champs tels que
path, ou des chemins avec points tels queffmpeg.vfpour les objets imbriqués.output_metaRecord<string, boolean> | boolean | Array<string>Permet de spécifier un ensemble de métadonnées dont le calcul est plus coûteux en puissance CPU et qui sont donc désactivées par défaut afin que le traitement de vos Assemblies reste rapide.
Pour les images, vous pouvez ajouter
"has_transparency": truedans cet objet pour déterminer si l’image contient des parties transparentes, et"dominant_colors": truepour extraire de l’image un tableau de codes couleur hexadécimaux.Pour les images, vous pouvez également ajouter
"blurhash": truepour extraire une chaîne BlurHash — une représentation compacte d’un espace réservé pour l’image, utile pour afficher un aperçu flou pendant le chargement de l’image complète.Pour les images,
"thumbhash": trueextrait plutôt un ThumbHash encodé en base64 dansmeta.thumbhash, accompagné demeta.has_alpha(qui indique si un canal alpha existe, même lorsque l’image est entièrement opaque). Il décrit les pixels orientés selon les données EXIF et utilise la première image des images animées. L’extraction est effectuée au mieux : les images de plus de 40 mégapixels, les formats non pris en charge ou un décodage échoué ou limité ne produisent aucun espace réservé. Une extraction réussie ajoute des frais de métadonnées équivalents à 20 % des octets de ce fichier. Aucun supplément ThumbHash ne s’applique lorsque l’option est désactivée ou lorsqu’aucun hash n’est produit.Définissez cette option sur le Step qui produit l’image, par exemple
/upload/handlepour les originaux téléversés ou/image/resizepour les sorties traitées. La définir uniquement sur/transloadit/storene déclenche pas l’extraction : le stockage conserve les métadonnées du Step producteur. Transloadit Storage conserve un hash généré avec sa version immuable et le renvoie dans les résultats stockés et lors des lectures natives de ressources. Les téléversements directs vers S3 ne génèrent pas d’espaces réservés. Un espace réservé contient des informations sur l’image : protégez-le donc avec les mêmes contrôles d’accès que l’image complète.Pour les vidéos, vous pouvez ajouter le paramètre
"colorspace": truepour extraire l’espace colorimétrique de la vidéo de sortie.Pour les vidéos, vous pouvez également ajouter
"interlaced": truepour détecter si la vidéo est entrelacée. Cette option combine l’indicateur ffprobe peu coûteuxfield_orderavec une passe d’échantillonnageidetlimitée sur les premières images de la source, et exposeinterlaced,field_orderainsi qu’un objet de diagnosticinterlace_detectionsousfile.meta. Cette opération est coûteuse en calcul et facturée en conséquence.Pour l’audio, vous pouvez ajouter
"mean_volume": truepour obtenir une valeur unique représentant le volume moyen du fichier audio.Vous pouvez également définir cette option sur
falsepour ignorer l’extraction des métadonnées et accélérer le transcodage.user_metaRecord<string, any>(par défaut :{})Ajoute des métadonnées JSON personnalisées à chaque fichier émis sans modifier son contenu. Les objets et tableaux imbriqués sont pris en charge.
L’héritage dépend du Robot. Les valeurs sont fusionnées avec la valeur
user_metaexistante du fichier de sortie ; le Step actuel remplace les clés de premier niveau correspondantes. Attribuez explicitement les clés requises lorsqu’un Robot crée de nouvelles sorties.Dans les Steps de traitement,
${file.*}désigne la première entrée et${result.*}le fichier émis. Les valeurs sont évaluées pour chaque sortie après l’exécution du Robot, avant l’extraction ultérieure des métadonnées et le stockage temporaire. Sur:original, les valeurs sont évaluées pour chaque téléversement avant l’extraction des métadonnées.Les Steps en aval lisent
${file.user_meta.key}. Consultez Métadonnées personnalisées pour un exemple complet et les règles d’héritage.resultboolean(par défaut :false)Indique si les résultats de ce Step doivent figurer dans l’Assembly Status JSON
queuebatchDéfinir la file d’attente sur « batch » abaisse manuellement la priorité des Jobs de ce Step afin d’éviter de consommer des emplacements prioritaires de Jobs pour des Jobs qui n’ont pas besoin d’un temps d’attente nul dans la file
force_acceptboolean(par défaut :false)Forcer un Robot à accepter un type de fichier qu’il aurait ignoré.
Par défaut, les Robots ignorent les fichiers qu’ils ne connaissent pas. Le Robot 🤖/video/encode, par exemple, ignorera volontiers les images en entrée.
Avec le paramètre
force_acceptdéfini surtrue, vous pouvez forcer les Robots à accepter tous les fichiers qui leur sont envoyés. Cela entraîne généralement des erreurs et ne doit être utilisé que pour le débogage ou pour traiter des cas limites.ignore_errorsboolean | Array<meta | execute>(par défaut :[])Ignore les erreurs pendant certaines phases du traitement.
Si vous définissez cette valeur sur
["meta"], le Robot ignorera les erreurs lors de l’extraction des métadonnées.Si vous définissez cette valeur sur
["execute"], le Robot ignorera les erreurs lors de la phase d’exécution principale.Définir cette valeur sur
trueéquivaut à["meta", "execute"]: les erreurs seront alors ignorées dans les deux phases.usestring | Array<string> | Array<object> | objectIndique quel(s) Step(s) utiliser comme entrée.
- Vous pouvez choisir n’importe quel nom pour les Steps, sauf
":original"(réservé aux téléversements des utilisateurs gérés par Transloadit) - Vous pouvez fournir plusieurs Steps en entrée à l’aide de tableaux :
{ "use": [ ":original", "encoded", "resized" ] } - Vous pouvez également étiqueter les Steps d’entrée avec
aspour transmettre une intention sémantique aux Robots :{ "use": [ { "name": ":original", "as": "image" }, { "name": ":original", "as": "mask" } ] }
AstuceC’est probablement tout ce que vous devez savoir sur
use, mais vous pouvez consulter les cas d’utilisation avancés.- Vous pouvez choisir n’importe quel nom pour les Steps, sauf
ffmpegobjectUn objet de paramètres à transmettre à FFmpeg. Si un préréglage est utilisé, les options spécifiées sont fusionnées par-dessus celles du préréglage. Pour connaître les options disponibles, consultez la documentation de FFmpeg. Les options spécifiées ici ont priorité sur celles du préréglage.
ffmpeg_stackv6 | v7 | v8 | string(par défaut :"v6.0.0")Sélectionne la version de la pile FFmpeg à utiliser pour l’encodage. Nous recommandons actuellement d’utiliser « v7 ». Les versions exactes « v6.0.0 », « v7.0.0 » et « v8.0.0 » sont des valeurs héritées qui restent acceptées pour assurer la rétrocompatibilité. Les valeurs « v5.x », dépréciées, sont également acceptées.
widthstring | number | nullLargeur de la nouvelle vidéo, en pixels.
Si la valeur n’est pas spécifiée et que le paramètre
presetest disponible, la largeur fournie parpresetsera appliquée.heightstring | number | nullHauteur de la nouvelle vidéo, en pixels.
Si la valeur n’est pas spécifiée et que le paramètre
presetest disponible, la hauteur fournie parpresetsera appliquée.presetandroid | android-high | android-low | android_high | android_low | dash-1080p-video | dash-1080p_video |Convertit une vidéo selon des paramètres préconfigurés.
Vous pouvez utiliser ici la valeur
'empty'si vous spécifiez vos propres paramètres FFmpeg à l’aide du Robot, ou si vous ne souhaitez pas que Transloadit définisse de paramètres d’encodage.subtitles_typeburned | external | burn(par défaut :"external")Détermine si les sous-titres sont ajoutés à la vidéo sous forme de flux distinct (valeur
"external"), que vous pouvez ensuite activer ou désactiver dans votre lecteur vidéo, ou s’ils doivent être incrustés directement dans la vidéo (valeur"burned"ou"burn") afin de faire partie du flux vidéo.stylesocialApplique une apparence prédéfinie aux sous-titres incrustés : texte en police Poppins très grasse, contour épais et ombre noire douce. Les sous-titres JSON s’affichent en majuscules dans le tiers inférieur. Par défaut, la taille de la police des sous-titres JSON est calculée à partir du côté le plus court de la vidéo et ajustée pour que chaque sous-titre tienne dans la largeur de sécurité, de préférence sur une ligne et au maximum sur deux. Les mots ne sont jamais coupés. Chaque sous-titre passe de 85 % à sa taille finale en 120 millisecondes, puis ses mots restent en place tandis que la mise en évidence change de couleur. Le fichier de transcription est conservé. Les paramètres de style existants prennent le pas sur le préréglage ; une valeur explicite du paramètre
font_sizedésactive l’ajustement automatique. Les fichiers ASS conservent leurs propres styles. Avec les données JSON horodatées provenant de/speech/transcribe, le mot actif est mis en évidence jusqu’au début du mot ou du sous-titre suivant ; les autres mots utilisentfont_color. Les virgules et les points en fin de mot sont omis dans les sous-titres JSON de style social ; les points d’interrogation et d’exclamation sont conservés. La mise en évidence et le regroupement des mots nécessitent une entrée JSON.highlight_colorstring | string(par défaut :"FFD60A")La couleur d’accentuation du mot actif dans les sous-titres JSON. S’applique uniquement aux sous-titres JSON incrustés. Avec
"style": "social", le mot précédent reste surligné pendant les courtes pauses jusqu’au début du mot ou du sous-titre suivant. Sans le style social,font_colorest utilisé pour l’ensemble du sous-titre pendant les pauses.Utilisez le format
"rgb","rrggbb"ou"aarrggbb", éventuellement précédé de#. Les couleurs à trois chiffres sont étendues à six chiffres. Les couleurs sans alpha sont entièrement opaques. Pour les couleurs à huit chiffres, les deux premiers chiffres définissent la transparence ("00"correspond à une opacité totale,"ff"à une transparence totale).max_words_per_captionstring | number(par défaut :3)Le nombre maximal visé de mots JSON horodatés affichés dans un sous-titre. Les sous-titres sont coupés plus tôt aux signes de ponctuation de fin de phrase ou aux pauses de plus de 0,4 seconde. Avec
"style": "social", un mot grammatical anglais en fin de sous-titre, comme « by », « to » ou « the », passe au sous-titre suivant lorsque c’est possible. Les expressions courtes comme « line of code » peuvent rester groupées, et un mot isolé en fin de phrase peut rejoindre le sous-titre précédent. Ces ajustements autorisent au maximum un mot supplémentaire par sous-titre, sans franchir les fins de phrase ni les pauses longues. Les sous-titres d’un seul mot sont conservés lorsque la limite est de 1. Un sous-titre reste visible jusqu’au début du suivant lorsque la pause ne dépasse pas 0,4 seconde, et disparaît à la fin de son dernier mot lors des pauses plus longues. Ne modifie pas les segments SRT, VTT ou ASS.border_stylebox | outline | shadow(par défaut :"outline")Définit le style des sous-titres. Utilisez le paramètre
border_colorpour définir la couleur de la bordure.border_colorstring | string(par défaut :"000000")La couleur de la bordure des sous-titres. La valeur par défaut est le noir opaque. S’applique uniquement aux sous-titres incrustés.
Utilisez le format
"rgb","rrggbb"ou"aarrggbb", éventuellement précédé de#. Les couleurs à trois chiffres sont étendues à six chiffres. Les couleurs sans alpha sont entièrement opaques. Pour les couleurs à huit chiffres, les deux premiers chiffres définissent la transparence ("00"correspond à une opacité totale,"ff"à une transparence totale).fontstringLa famille de polices à utiliser. Inclut également la graisse et le style de la police. La police par défaut est Arial. Avec
"style": "social", la police par défaut est Poppins, avec sa graisse ExtraBold pour les sous-titres JSON. Une police définie explicitement prend le pas sur le style.Vous trouverez ici la liste de toutes les polices prises en charge.
font_colorstring | string(par défaut :"FFFFFF")La couleur du texte des sous-titres. S’applique uniquement aux sous-titres incrustés.
Utilisez le format
"rgb","rrggbb"ou"aarrggbb", éventuellement précédé de#. Les couleurs à trois chiffres sont étendues à six chiffres. Les couleurs sans alpha sont entièrement opaques. Pour les couleurs à huit chiffres, les deux premiers chiffres définissent la transparence ("00"correspond à une opacité totale,"ff"à une transparence totale).font_sizestring | numberDéfinit la taille du texte dans l’espace de coordonnées des sous-titres de 288 pixels, mis à l’échelle selon la hauteur de la vidéo. La valeur par défaut est 16. Avec
"style": "social", la valeur par défaut est 54. Pour les sous-titres JSON de style social, l’omission de cette valeur adapte cette valeur par défaut au côté le plus court de la vidéo, l’augmente de 18 % pour les vidéos au format portrait et réduit les sous-titres au besoin pour qu’ils tiennent sur deux lignes au maximum. Avant cet ajustement, les majuscules de Poppins mesurent environ 7,5 % du côté le plus court, ou environ 9 % pour les vidéos au format portrait. Une valeur explicite conserve le dimensionnement relatif à la hauteur et désactive l’ajustement automatique.boldbooleanIndique si le texte des sous-titres doit être en gras. S’applique uniquement aux sous-titres incrustés. La valeur par défaut est
false. Avec"style": "social", la valeur par défaut esttrue; une valeur explicite defalseprend le pas sur le style.italicboolean(par défaut :false)Indique si le texte des sous-titres doit être en italique. S’applique uniquement aux sous-titres incrustés.
outline_widthstring | number | nullDéfinit la largeur du contour du texte dans l’espace de coordonnées des sous-titres de 288 pixels, mis à l’échelle selon la hauteur de la vidéo. Les chaînes numériques telles que
"4"sont également acceptées. S’applique uniquement aux sous-titres incrustés avec les styles de bordure"outline"ou"box". Si ce paramètre est omis ou vautnull, la largeur par défaut est utilisée (2 avec"style": "social", proportionnelle à la taille finale ajustée de la police pour les sous-titres JSON de style social).positionbottom | bottom-left | bottom-right | center | left | right | top |(par défaut :"bottom")Définit la position des sous-titres. Avec
"style": "social", la position basse par défaut place les sous-titres JSON dans le tiers inférieur, avec un espace supplémentaire en bas pour les vidéos au format portrait. Une valeur explicite prend le pas sur le style.languagestring | nullDéfinit la langue du flux de sous-titres à l’aide d’un code de langue à trois lettres (par exemple
"eng","deu","spa"). Utilisé uniquement si les sous-titres sont externes. Lorsque vous ajoutez plusieurs flux de sous-titres, définissez une langue différente pour chaque flux afin que les lecteurs vidéo puissent proposer un choix de langue.namestring | nullDéfinit un nom lisible pour la piste de sous-titres (par exemple
"English","Deutsch","Español"). Utilisé uniquement si les sous-titres sont externes. Ce nom est affiché à côté de la langue dans les menus de sous-titres des lecteurs vidéo.keep_subtitlesboolean(par défaut :false)Indique si les sous-titres existants dans le fichier d’entrée doivent être conservés ou remplacés par les nouveaux sous-titres. Utilisé uniquement si les sous-titres sont externes. Définissez ce paramètre sur
truelorsque vous enchaînez plusieurs Steps/video/subtitlepour ajouter plusieurs flux de sous-titres (par exemple dans différentes langues) à la même vidéo.
Démonstrations
Articles de blog associés
- Nouveau Robot pour incruster facilement des sous-titres en vidéo
- Re-Loadit : téléverser simplement avec le Robot /upload/handle
- Nouveauté : transcription et sous-titrage automatiques de vidéos
- Build a Reddit video subtitling bot with Transloadit (English)
- Créer des visualisations audio attrayantes avec Transloadit
- Styliser les sous-titres avec Transloadit : 3 méthodes créatives
- Nouveautés vidéo : transitions, chapitres, CMAF et plus encore
- Sous-titres façon réseaux sociaux, mot prononcé en surbrillance