Comment construire un système de sous-titres automatiques pour vidéos multilingues
Récemment, nous avons participé à un appel d'offres public lié au besoin d'une transcription vidéo automatique innovante et à la génération de sous-titres.
Une chaîne d'outils pour créer automatiquement une transcription de la parole est aujourd'hui assez courante, et de nombreuses solutions existent.
Cependant, dans le cadre de ce projet, une demande spéciale ajoute un défi important. Le besoin est de transcrire des vidéos multilingues, y compris la langue luxembourgeoise, pour générer des sous-titres.
Le luxembourgeois est principalement parlé au Luxembourg. Environ 400 000 personnes parlent luxembourgeois dans le monde. Le luxembourgeois est assez proche de l'allemand, mais il se caractérise par un degré élevé de multilinguisme : des mots et des phrases venant principalement du français et de l'allemand font partie du lexique régulier et surviennent assez fréquemment.
C'est un défi car tous les outils courants disponibles ne sont pas toujours conçus pour prendre en charge l'audio multilingue, mais aussi principalement parce que le luxembourgeois n'est définitivement pas une langue aussi courante que l'anglais ou le français.
Et pour couronner le tout, nous devions le faire avec une contrainte en termes de budget, pour cette phase de démonstration de faisabilité du concept, qui était d'environ 10 jours pour travailler sur un concept afin de valider nos idées.
Texte à la pointe de la technologie pour la parole
Pour ce projet, nous avons examiné des modèles open source de "texte à parole" capables de traiter de telles tâches. À ce jour, deux candidats se démarquent clairement :
Les deux modèles utilisent une architecture de modèle encodeur/décodeur, et sont donc comparables. Leurs données d'entraînement et leurs méthodes d'entraînement sont différentes, ce qui influe certainement sur la précision et les langues prises en charge.
Ils proposent tous deux différentes tailles de modèle pour choisir le rapport précision/débit adapté aux besoins. Ils prennent également en charge de nombreuses langues, avec une précision intéressante pour les langues largement parlées. Le luxembourgeois fait partie des langues prises en charge, mais avec une précision médiocre en raison d'une quantité très limitée de données d'entraînement pour cette langue particulière.
En ce qui concerne l'optimisation de ces modèles pour mieux prendre en charge le luxembourgeois, nous pouvons mentionner plusieurs initiatives locales. Ces initiatives proviennent toutes du monde académique, car elles nécessitent la collecte et l'organisation de données d'entraînement spécifiques (enregistrements de la parole luxembourgeoise avec une vérité textuelle). Pour en citer deux, toutes deux utilisant le modèle de Meta (wav2vec) :
- Le travail de l'Université du Luxembourg pour construire des données d'entraînement et le réglage fin du modèle : résumé et travail détaillé.
- Un travail de thèse de Le Minh Nguyen.
Leurs résultats sont intéressants, car tous ont prouvé une diminution significative du taux d'erreur sur la transcription audio du luxembourgeois. Cependant, pour des raisons inconnues, les modèles de réglage fin disponibles manquent complètement de prise en charge pour d'autres langues.
Comme on peut facilement comprendre que le succès d'un tel projet nécessitera ce type d'ajustement fin du modèle pour obtenir une précision appropriée, il est également important de prendre en compte les contraintes des sous-titres : la transcription doit être synchronisée avec le flux vidéo et doit être organisée en phrases, et non pas simplement comme une liste de mots sans aucune ponctuation.
Tous ces critères doivent être pris en compte pour obtenir un résultat approprié. Dans ce contexte, il est important de voir ce dont les modèles sont capables.
Lors de nos tests, nous avons constaté que le modèle Meta était seulement capable de donner les horodatages des mots, sans structure de phrase ni horodatage. En comparaison, le modèle Whisper est capable de transcrire précisément les phrases avec leur horodatage.
Quel modèle choisir pour cette démonstration de faisabilité ?
En résumé, nous avons besoin d'un modèle avec des capacités de transcription multilingue, prenant en charge le luxembourgeois, et fournissant une transcription avec des structures de phrases et des horodatages.
Au moment de la rédaction de cet article, il n'existe aucun modèle qui réponde à tous ces critères. Comme nous devions faire face à une période courte pour construire cette démonstration de faisabilité, et comme le jeu de données d'entraînement pour le luxembourgeois existe déjà dans une certaine mesure, nous avons choisi de nous concentrer sur le modèle le plus adapté pour générer les sous-titres plutôt que d'obtenir la meilleure précision de transcription luxembourgeoise.
Le réglage fin d'un modèle prend du temps et peut être coûteux, nous avons donc choisi de construire une chaîne d'outils complète pour valider chaque étape plutôt que de nous concentrer sur la précision précoce. Le réglage fin pourrait être effectué ultérieurement, avec une architecture de chaîne d'outils validée.
De plus, le luxembourgeois n'est pas la seule langue à prendre en charge dans cette démonstration de faisabilité. L'anglais, l'allemand et le français sont également prévus pour être fréquents. Et ces langues ont une très bonne précision sans aucun réglage fin.
Ainsi, l'approche du modèle Whisper est intéressante :
- Nous pouvons obtenir une bonne transcription des phrases.
- Les langues principales ont un taux d'erreur de mot très bon.
- L'étape de réglage fin pour un meilleur support du luxembourgeois sera possible.
Une solution alternative aurait pu être de continuer à utiliser le modèle Meta XLS-R avec ajustement fin et de construire un algorithme pour reconstruire des phrases à partir des horodatages des mots. Nous avons essayé cette méthode, mais les résultats n'étaient pas satisfaisants ou auraient impliqué d'autres modèles d'IA.
En plus de cela, vous devez également prendre en compte l'aspect du contenu multilingue.
C'est pourquoi nous avons choisi d'opter pour le modèle Whisper.
Défi et notre idée
Au-delà du compromis effectué sur le choix d'un modèle, le principal défi de ce projet est de traiter un contenu vidéo/sonore multilingue.
Le modèle Whisper est capable de comprendre différentes langues, mais sa logique interne n'est pas capable de passer d'une langue à une autre au sein de la même transcription audio.
Avec un contenu multilingue, ce modèle transcrira le contenu en utilisant la première langue qu'il détectera au tout début du flux audio. Ses capacités multilingues pourraient détecter les différences de langue et produire une transcription suffisamment bonne, mais nous perdrons les informations de contexte (langue actuelle), et le taux d'erreur des mots augmentera certainement.
Une idée à laquelle nous avons pensé était de traiter la transcription de chaque locuteur individuellement : le modèle Whisper traiterait chacun d'eux comme un audio individuel, répétant ensuite la détection de la langue et la transcription.
La détection et la division d'un flux audio par locuteur sont ce qu'on appelle la "diarization des locuteurs".
Plusieurs solutions existent pour appliquer cette "diarization des locuteurs", dans notre cas, nous avons choisi d'opter pour une solution open source, basée sur un modèle d'IA : Pyannote audio.
Cette bibliothèque Python est une boîte à outils spécialement conçue pour les tâches de diarization :
- détection d'activité vocale,
- détection de changement de locuteur,
- détection de parole superposée,
- incorporation de locuteur.
Dans notre cas, nous avons inclus cet outil pour pouvoir diviser un flux audio en plusieurs parties, chacune représentant un discours d'un locuteur identifié, avec des horodatages relatifs au fichier audio original.
Après cette étape, nous obtenons alors une liste de fichiers audio, représentant une piste pour chaque locuteur.
Pour chacune d'entre elles, nous pouvons ensuite utiliser le modèle Whisper qui renverra une transcription textuelle de l'audio, sous forme de phrases, avec les horodatages.
La dernière étape consistera à appliquer le décalage de chaque piste sur chaque horodatage de transcription pour obtenir une transcription complète synchronisée avec le fichier audio original.
Transcription en sous-titres
La dernière étape consiste à utiliser toutes ces informations pour produire un fichier de sous-titres, selon la syntaxe attendue (par exemple : SRT, VTT).
Comme nous obtenons des informations structurées de Pyannote et Whisper (JSON ou CSV), il est assez facile d'utiliser un langage de programmation classique pour transformer ces informations en un fichier de sous-titres.
Mais ici, nous voulions aller un peu plus loin pour introduire l'automatisation et les ajustements de transcription, qui sont des parties essentielles du travail de création de sous-titres, souvent oubliées :
- Pour corriger d'éventuelles fautes de frappe dans la transcription ou reformuler une phrase de manière plus concise
- Pour réorganiser les phrases
- Pour formater automatiquement la transcription dans le format souhaité
- Pour appliquer toute traduction automatique
Un outil parfait pour une telle tâche est un modèle de langage large (LLM). Par exemple, nous pouvons créer une requête pour demander à OpenAI GPT de transformer notre transcription (informations structurées en JSON ou CSV) en un fichier de sous-titres, avec une revue/ajustement du texte, et si nécessaire de les traduire dans n'importe quelle langue cible.
Un exemple de requête que nous avons utilisé :
You are an AI assistant that automates CSV to ${format} conversion.
To remember you some languages codes:
- lb = Luxembourgish
- en = English
- fr = French
- de = German
For the conversion from the CSV content :
- For each line transcribe the text in "Text" column as a whole text, using the language code available in the language column of the same line
- Convert time code in the Start and End columns into dubbing time code.
- Use the speaker column to add the speaker identification in the output format (${format})
CSV content:
Speaker;language;Start;End;Text
${content}
${format} content:
Ce que nous avons construit
Pour démontrer notre idée, nous avons dû construire une chaîne d'outils minimale qui s'appuiera sur les technologies que nous venons de décrire.
Notre prototype était basé sur une application web simple capable de :
- Télécharger ou enregistrer un fichier audio
- Envoyer le fichier audio à une API distante pour exécuter les étapes de diarization, de transcription et de formatage des sous-titres
- Afficher le résultat de chaque étape
L’API distante fonctionnait sur un serveur équipé d'un GPU (Nvidia T4/16Go) pour accélérer les étapes d'IA.
Est-ce que cela fonctionne ?
Nous avons effectué de nombreux tests pour comprendre les performances de ce prototype, notamment pour comparer la précision de la transcription avec et sans la diarization. Bien sûr, nous savions que le taux d'erreur des mots pour le luxembourgeois ne serait pas bon, car notre modèle Whisper n'était pas suffisamment entraîné pour cette langue.
Cependant, nous avons observé une amélioration nette avec la diarization, tant pour les contenus multilingues que monolingues.
Audio avec uniquement du luxembourgeois
Pour ce test, nous avons utilisé la piste audio de cette vidéo : GovJobs - Présentation métiers : Ministère de la Justice.
Sans diarization :
La langue détectée est l'allemand, et donc l'audio complet est transcrit en allemand, avec une précision moyenne.
Avec diarization :
La diarization permet à Whisper d'obtenir de meilleurs résultats, tant en termes de précision de la détection de la langue. La détection de la langue n'est pas parfaite : même si tous les locuteurs parlent luxembourgeois, tous leurs dialogues ne sont pas identifiés comme luxembourgeois, mais plutôt comme allemands ou néerlandais.
Un point intéressant est que la détection de la langue est cohérente avec le locuteur (par exemple, le locuteur "03" est toujours détecté comme luxembourgeois).
Nous atteignons certainement la limite du modèle Whisper en ce qui concerne la langue luxembourgeoise : son entraînement est probablement insuffisant et ne représente pas suffisamment les variations d'accent ou de prononciation.
Création des sous-titres
Ici, aucune surprise, avec la requête que nous avons décrite précédemment, le modèle de langage large (LLM) produit le contenu du fichier SRT sans aucun problème.
Contenu multilingues
Nous avons testé plusieurs flux audio multilingues, et dans cet exemple, nous lisons la transcription d'un enregistrement en direct réalisé par notre client lors de la démo de notre prototype.
Leur enregistrement a été réalisé par 4 personnes, parlant respectivement en allemand, en anglais, en français et en luxembourgeois.
Sans diarisation :
Sans la diarization, bien sûr, nous avons le même problème : tout est transcrit en allemand car c'est la première langue utilisée pendant l'enregistrement. De plus, le taux d'erreur des mots est celui auquel on peut s'attendre avec ce comportement.
Avec diarization :
Si nous activons la diarization, nous avons les 4 locuteurs identifiés, avec leur langue respective. Le taux d'erreur des mots est meilleur pour chacun d'eux, mais reste assez faible pour la langue luxembourgeoise.
Création des sous-titres
La création de sous-titres est également bonne, que nous laissions la langue d'origine ou que nous forçions une traduction spécifique.
Quelques chiffres
Taux d'erreur des mots
Conformément à notre vidéo d'exemple, la vérité de terrain est déterminée par le fichier SRT fourni par le ministère compétent responsable de la vidéo.
Requête générée (réduite pour plus de lisibilité) | Sans la diarization | Avec la diarization |
Transcription automatique (DE détecté, à tort) | 93,86% | 88,60% |
Avec la diarization | 92,60% | 82,41% |
FACTEUR DE TEMPS RÉEL
Notre solution implique plusieurs étapes de calcul, donc la vitesse de transcription est également à prendre en compte. Cette charge de travail nécessite un calcul intensif et un matériel spécifique pour leur optimisation.
Dans notre cas, pour héberger l'API (pyannote et whisper), nous avons utilisé une instance AWS EC2 équipée d'un GPU dédié. Il s'agit d'un GPU d'entrée de gamme, mais ce n'est toujours pas le matériel le moins cher. L'API peut être hébergée sur une instance CPU classique, mais ses performances seront vraiment impactées (entre 6 et 10 fois plus lentes).
Avec cette instance (EC2 g4dn.xlarge - 1x Nvidia T4 GPU 16 Go), nous avons pu atteindre un facteur de temps réel de 3 : cela signifie que pour une audio de 3 minutes, cette solution nécessitera 1 minute de temps de traitement total.
Ce facteur de performance peut en effet être augmenté en utilisant un meilleur GPU, mais bien sûr, cela augmentera également le coût total de la solution.
CONCLUSION
En conclusion, l'intégration de la diarization et du suivi de la transcription a significativement amélioré la qualité de la génération de sous-titres. Notre modèle Whisper choisi excelle en précision des horodatages des phrases, ce qui est crucial pour la création de sous-titres synchronisés. Malgré son efficacité, la performance du modèle en matière de détection de la langue et de taux d'erreur des mots pour le luxembourgeois est insuffisante par rapport à des langues plus largement parlées. C'était un compromis attendu, compte tenu des données d'entraînement actuelles du modèle.
Pour aller de l'avant, notre stratégie d'affinement implique l'accumulation d'un corpus substantiel d'échantillons audio luxembourgeois. Notre objectif est de collecter des données qui dépassent non seulement le volume obtenu dans des initiatives antérieures, comme l'utilisation du modèle Meta par l'Université du Luxembourg, mais qui englobent également un spectre diversifié de dialectes et de prononciations. Cette diversité est cruciale pour atténuer la confusion linguistique du modèle avec des langues similaires, telles que le néerlandais et l'allemand. Ce faisant, nous pouvons améliorer la robustesse du modèle et nous assurer que le luxembourgeois est représenté avec la même précision que les autres langues.
En plus d'améliorer les métriques techniques, notre projet a le potentiel d'avoir un impact significatif sur la communauté multilingue du Luxembourg en fournissant des informations plus accessibles et précises. De plus, il contribuera au domaine croissant de la linguistique computationnelle et de la génération automatique de sous-titres, ouvrant la voie à une technologie plus inclusive qui surmonte les barrières linguistiques. Alors que nous nous engageons dans ce voyage, nous accueillons la collaboration avec des experts linguistiques et la communauté technologique pour créer un modèle qui sert de référence pour les groupes linguistiques plus restreints à l'échelle mondiale.