Comment générer des sous-titres avec auto-subtitle
Depuis Dragon Naturally Speaking, la reconnaissance vocale a fait des progrès. Mais elle est toujours aussi peu accessible au grand public (du moins… gratuitement !). A part utiliser l'outil de votre smartphone (limité à quelques phrases) ou uploader votre vidéo sur Youtube et croiser les doigts pour que des sous-titres soient générés, vous pouvez un peu vous gratter !
Alors, si vous aimez la ligne de commande, pourquoi ne pas essayer l'outil proposé par Miguel Piedrafita et basé sur Whisper d'OpenAI ?
D'après son concepteur « Whisper est un système de reconnaissance automatique de la parole (ASR) de pointe qui a été entraîné sur un ensemble de données vaste et varié de 680 000 heures de données supervisées multilingues et multitâches obtenues sur l'internet. ». S'il est aussi performant que ChatGPT, autre produit-phare d'OpenAI, ça donne plutôt envie !
Installation
Rendez-vous sur le dépôt Git de l'outil. Histoire de voir que la doc est épaisse comme un papier à cigarette… Surtout, restez entre vous, développeurs Python, ne rendez pas cela trop accessible aux nullos comme nous ! Bref…
Si vous n'avez pas déjà Git, Python et Visual C++ sur votre bécane, le processus d'installation sera un peu plus long qu'annoncé dans la doc… Non, auto-subtitle n'est pas un gentil petit install.exe pour Windows à télécharger, il va vous falloir bouffer de la ligne de commande !
Je commence donc par installer une version récente de Python. Je vais chercher l'exe pour Windows sur le site officiel (version 3.12.3 au moment où j'écris ces lignes) et je l'installe…
Ensuite, rendez-vous dans le répertoire où se trouve l'outil pip et lancer une ligne de commande… Ou ajouter le chemin « C:\Users\<Votre nom>\AppData\Local\Programs\Python\Python312\Scripts » à la variable d'environnement PATH de votre Windows.
Sinon, à l'exécution de la commande suivante, vous aurez droit à l'habituel « n'est pas reconnu en tant que commande interne ou externe, un programme exécutable ou un fichier de commandes »
On va enfin pouvoir installer auto-subtitle !
pip install git+https://github.com/m1guelpf/auto-subtitle.git
J'ai déjà Git sur mon PC. Sinon, au moment de l'installation j'aurais eu droit à un gentil message suivant :
"ERROR: Error [WinError 2] Le fichier spécifié est introuvable while executing command git version ERROR: Cannot find command 'git' - do you have 'git' installed and in your PATH?"
Pour télécharger Git, c'est par ici
Quand cela fonctionne, voilà ce que vous obtenez :
Auto-subtitle s'installe à partir du dépôt Git, quelque part, on ne sait pas où. Et surtout pas dans le dossier que j'avais pris la peine de créer, ce serait trop facile ! Aucune variable d'environnement n'est créée, cet emplacement demeurera donc à jamais un mystère…
Premier test : je lâche un auto_subtitle –help
Et je me fais insulter : ModuleNotFoundError: No module named ‘ffmpeg'. Comment ça, il ne trouve pas ffmpeg ??? Menteur ! ffmpeg est installé sur mon PC…
Bon, on va ajouter un nouveau ffmpeg à l'environnement Python, alors…
pip install ffmpeg-python
Et surtout pas pip install ffmpeg, sinon à la première utilisation vous aurez l'erreur « AttributeError: module ‘ffmpeg' has no attribute ‘input' »
Voilà , il l'a, son ffmpeg. Nouveau auto_subtitle –help. Nouvelle erreur…
Microsoft Visual C++ Redistributable is not installed, this may lead to the DLL load failure. It can be downloaded at https://aka.ms/vs/16/release/vc_redist.x64.exe (...) Error loading "C:\Users\Precision\AppData\Local\Programs\Python\Python312\Lib\site-packages\torch\lib\c10.dll" or one of its dependencies.
Pourtant c10.dll s'y trouve. C'est donc Visual C++ qui manque (pffff…)
Je vais télécharger Visual C++ sur ce site. Je l'installe…
Et cette fois-ci, auto_subtitle –help fonctionne sans message d'erreur.
Utilisation
La théorie
Comme tout outil en ligne de commande, on commence par l'appeler par son nom, auto_subtitle
Ensuite on lui passe un ou plusieurs des paramètres suivants :
- –model (on a le choix entre tiny.en, tiny, base.en, base, small.en, small, medium.en, medium, large-v1, large-v2, large-v3, large). Par défaut : small
- –output_dir ou -o (pour spécifier le dossier de destination)
- –task {transcribe,translate}]
- –language (suivi de auto pour détection automatique de la langue, ou d'un code à deux lettres pour la langue, comme fr pour le français, de pour l'allemand, en pour l'anglais)
- –output_srt (pour choisir si on veut que la transcription soit enregistrée dans un fichier srt à part ou incluse comme piste dans le fichier video). Par défaut : false (incluse)
- –srt_only (si vous ne voulez que le fichier .srt contenant la transcription, et non pas la vidéo avec sa piste de sous-titre). Par défaut : false
- –verbose (faire suivre de true si vous voulez afficher les messages d'info et de debug de l'outil durant la progression de l'opération). Par défaut : false
- –task (transcribe ou translate selon qu'on veut faire une simple reconnaissance dans la langue originale de la vidéo ou une traduction vers l'anglais)
Et ensuite, le chemin de la vidéo à traiter
La pratique
Premier essai sans aucun paramètre, juste le nom du fichier (un cours de Gym direct). Les guillemets, c'est parce que le nom du fichier contient des espaces.
auto_subtitle nomdufichier.mp4
Bravo, il reconnaît la langue tout seul comme un grand ! Sinon j'aurais pu la préciser via –language fr
Le processus est effectivement assez long (on a droit à une barre de progression) et plutôt gourmand en ressources CPU. J'ai failli entendre murmurer les ventilos de mon Dell Precision 5810 (eux qui ne daignent même pas se mettre à tourner au lancement d'Android Studio)
Mais cette première expérience se solde par un échec : « ffmpeg._run.Error: ffmpeg error (see stderr output for detail) »
Nouvel essai en lui passant le paramètre –verbose true. On dit adieu à la barre de progression, à la place on voit défiler tous les dialogues (on note quelques imprécisions : Gym direct est compris « Jim Jirek »). Mais, nouvel échec à la fin. Et ce n'est pas plus informatif.
Finalement, je demande la création d'un fichier srt, et là ça fonctionne !
auto_subtitle "Abdo Gainage MHD (2023-11-16).mp4" --verbose true --srt_only true
Sur un autre PC, la transcription a échoué lors de mes premiers essais, avec ces messages bien incompréhensibles pour qui n'a jamais codé en Python de sa vie…
File "<frozen runpy>", line 198, in _run_module_as_main File "<frozen runpy>", line 88, in _run_code File "C:\Users\Dell\AppData\Local\Programs\Python\Python312\Scripts\auto_subtitle.exe\__main__.py", line 7, in <module> File "C:\Users\Dell\AppData\Local\Programs\Python\Python312\Lib\site-packages\auto_subtitle\cli.py", line 49, in main audios = get_audio(args.pop("video")) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\Dell\AppData\Local\Programs\Python\Python312\Lib\site-packages\auto_subtitle\cli.py", line 84, in get_audio ).run(quiet=True, overwrite_output=True) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\Dell\AppData\Local\Programs\Python\Python312\Lib\site-packages\ffmpeg\_run.py", line 325, in run raise Error('ffmpeg', out, err) ffmpeg._run.Error: ffmpeg error (see stderr output for detail)
Apparemment c'était un souci de chemin. Sur ce laptop, je n'avais qu'un seul disque dur, donc j'opérais dans le répertoire Vidéos. Mentionner le chemin complet et lancer la ligne de commande en mode administrateur a résolu le problème
auto_subtitle "C:\Users\[Utilisateur]\Videos\Abdo Gainage MHD (2023-11-16).mp4" --verbose true --srt_only true
On note qu'au bout d'un moment, les sous-titres prennent une légère avance sur la voix. Ce n'est pas forcément très gênant
Et quand on le lance sur un cours mené par un maître de conférences à la diction irréprochable, le résultat devient bluffant ! En revanche, Auto-subtitle rencontre un peu plus de difficultés sur des vidéos combinant plusieurs langues (par exemple pour un reportage sur des groupes musicaux dans lesquels on diffuse des extraits de leurs chansons dans une langue différente, ou quand des noms propres peu connus sont cités).
Et sinon, c'est un peu dommage que cet outil tellement pratique soit si difficile à installer et pas très simple à prendre en main…
Merci à Pim de m'avoir fait découvrir cet outil !