Faire des vignettes vidéo avec du logiciel libre
Petit tuto ffmpeg
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
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. Une fois téléchargée, on extrait l’archive et on la renomme model
.
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 model
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.
L'étape de relecture et de correction des sous-titres générés est très importante pour l’accessibilité des épisodes ! On peut également ajouter des descriptions des bruitages, ainsi que des notes sur l’intonation de la voix.
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 !