Moutmout

Le blog du Moutmout

Astronomie, informatique, reflexions diverses

Lecture de 5 Minutes

Un audiogramme et des sous-titres sur une image de Jerrie Cobb.

Pourquoi faire quelque chose en ligne, alors qu’on peut le faire en ligne de commande ? Dans cet article, je vous explique comment j’ai fait des vignettes vidéo pour mes podcasts avec un audiogramme et les sous-titres qui s’affichent.

Depuis juin 2021, je publie un épisode du podcast SpaceSheep chaque semaine. Et je commence à avoir pas mal de retours positifs, notamment d’auditeurs qui aimeraient bien partager SpaceSheep avec des gens qui ne sont pas sur le Fédiverse. Afin que mes auditeurs aient plus d’options pour interagir avec mes podcasts, j’ai décidé de les mettre en ligne sur YouTube.

En plus, l’hébergement principal de mon podcast SpaceSheep utilise un Raspberry Pi posé sur un coin de commode dans le salon. Question robustesse, on fait mieux. Donc dupliquer SpaceSheep sur YouTube me permet aussi de mettre mes podcasts en ligne même si j’ai des problèmes électriques ou informatiques à la maison.

Pour la version YouTube de chaque épisode de SpaceSheep, j’ai créé une espèce de « vignettes vidéo » avec un audiogramme et des sous-titres (disponible ici). Plusieurs services payants (ou gratuit pour les 5 première minutes de vidéo) en ligne vous proposent de le faire, mais j’ai préféré utiliser des outils libres sur ma machine. Dans cet article, je vous explique comment faire.

Ajouter un bandeau sombre sur chaque image

J’ai l’intention d’incruster des sous-titres en dur pour chaque vignette vidéo. Mais le contraste avec l’image de la vignette rend difficile la lecture du texte. Je commence donc par ajouter un bandeau plus sombre en bas de l’image. Celui-ci est partiellement transparent et fait la même hauteur que deux lignes de sous-titres. Pour cela, j’utilise GNU Image Manipulation Program (GNU IMP) et ImageMagick.

Créer le bandeau

Toutes les images qui illustrent mes épisodes de podcast font 1400x1400 pixels. C’est la norme si on veut pouvoir apparaître sur des plateformes de type Apple Podcast (j’ai pas réussi à y ajouter SpaceSheep, d’ailleurs. Si quelqu’un a des conseils pour m’y aider…) ou Spotify (sur lequel SpaceSheep apparaît \o/).

Dans GNU IMP, je créé une image de 1400x1400 pixels avec un fond transparent. Puis, je sélectionne un rectangle qui fait la taille de deux lignes de sous-titres (j’avoue, j’ai fait un peu au doigt mouillé pour la taille du rectangle), et je le remplis de noir. Enfin, j’exporte l’image avec le bandeau au format PNG.

Maintenant, je ferme GNU IMP, et j’ouvre un terminal.

Ajouter le bandeau à l’image de l'épisode

Assurez-vous d’avoir ImageMagick installé sur votre machine. On va ici utiliser la commande composite pour superposer la vignette de l'épisode (jerrie_cobb.png) avec le bandeau noir (bandeau_noir.png).

composite -blend 25x100 -gravity center jerrie_cobb.png bandeau_noir.png -alpha Set vignette.jpg

Une image de Jerrie Cobb + Une image avec un bandeau = Une image de Jerrie Cobb avec un bandeau plus sombre en bas de l’image.

On peut faire en sorte que le bandeau noir soit plus ou moins foncé en réglant le paramètre de l’option -blend 25x100. Si le premier nombre est plus petit, le bandeau sera plus foncé. Par exemple, si on utilise -blend 0x100, alors le bandeau sera complètement opaque. Au contraire, avec -blend 90x100, le bandeau sera beaucoup plus discret.

Puisque les deux images d’entrée ont la même taille, l’option -gravity center n’est pas très importante. Mais si l’image contenant le bandeau n’avait pas la même taille que la vignette, alors cette option permettrait de règler la position du bandeau dans l’image.

Créer l’audiogramme

L’audiogramme, c’est la courbe qui montre la quantité de son à chaque instant. Pour créer l’audiogramme d’un épisode et l’incruster sur l’image j’utilise l’outil ffmpeg.

ffmpeg -i episode.mp3 -loop 1 -framerate 30 -i vignette.jpg -filter_complex "[0:a]aformat=channel_layouts=mono,showwaves=s=2560x1440:mode=cline:r=30:colors=white[v];[1:v][v]overlay=format=auto:x=(W-w)/2:y=(H-h)/2,format=yuv420p[outv]" -map "[outv]" -map 0:a -c:v libvpx-vp9 -c:a copy -shortest tmp.mp4

Pensez bien à changer le nom du fichier sonore episode.mp3 et le nom du fichier d’image vignette.jpg (et éventuellement le fichier de sortie tmp.mp4).

Pendant que vous attendez que ffmpeg fasse son travail, vous pouvez commencer l'étape suivante !

Ajouter les sous-titres

Créer les sous-titres

J’ai déjà des transcriptions de chaque épisode écrites (que vous pouvez d’ailleurs retrouver sur ce blog), mais dans un fichier de sous-titres, il faut également indiquer le minutage au format suivant :

1
0:00:00,000 -> 0:00:02,420
En 1962, des auditions

La première ligne correspond à l’index du sous-titre. La deuxième ligne indique le temps pendant lequel ce sous-titre sera affiché à l'écran. La troisième ligne est le texte à afficher.

Pour l’avoir essayé, c’est (très) long et (très) pénible d’ajouter le temps pendant lequel chaque bout de phrase sera affiché à l'écran. Donc plutôt que de partir de la transcription et d’y ajouter le minutage, je génère des sous-titres automatiques, et ensuite je corrige les erreurs dans le texte. Attention, l'étape de correction des erreurs dans les sous-titres est très importante !!!

Pour générer les sous-titres automatiquement, j’utilise vosk, une bibliothèque en Python. D’après la documentation, on peut l’installer avec les commandes suivantes :

git clone https://github.com/alphacep/vosk-api
cd vosk-api/python/example

Il faut ensuite télécharger un modèle de reconnaissance vocale. Des modèles sont disponibles pour plusieurs langues dont le français.

wget https://alphacephei.com/vosk/models/vosk-model-fr-0.6-linto-2.2.0.zip
unzip vosk-model-fr-0.6-linto-2.2.0.zip
mv vosk-model-fr-0.6-linto-2.2.0 model

On peut ensuite utiliser vosk avec le modèle téléchargé pour générer un fichier .srt à partir d’un fichier audio.

python3 vosk-api/python/example/test_srt.py episode.mp3 > episode.srt

NB : Le dossier modele doit être dans le répertoire depuis lequel cette commande est exéctuée.

Puis j’ouvre le fichier episode.srt généré et je le lis en écoutant l’audio pour y corriger toutes les erreurs.

Les incruster dans la vidéo

Enfin j’ajoute les sous-titres à la vidéo, toujours avec ffmpeg et la commande suivante :

ffmpeg -i tmp.mp4 -vf subtitles=episode.srt:force_style='Fontsize=20' output.mp4

Après avoir vérifié que le fichier produit correspond bien à ce que je veux, je peux supprimer le fichier tmp.mp4 produit à l'étape précédente. Attention cependant à vérifier la qualité du fichier output.mp4 avant de supprimer le fichier tmp.mp4, puisque c’est la création de l’audiogramme qui est la plus chronophage.

Conclusion

Et voilà comment je créé les vignettes vidéo pour les épisodes de SpaceSheep. Vous pouvez regarder la première de ces vignettes sur YouTube.

J’espère que cet article vous a donné des idées. Maintenant, je retourne écrire des podcasts !

Articles Récents

Catégories

À Propos

Docteur, astrophysicienne. Je joue de l'euphonium, du clavier et du télescope quand je peux.