Transcription audio avec Whisper.cpp + bash scripting

Page content

Transcrire de l’audio en texte (ASR) avec whisper.cpp Si vous n’avez pas entendu parler de whisper.cpp ou que vous pensiez qu’il vous fallait impérativement une carte graphique pour pouvoir exécuter le désormais fameux modèle whisper d’OpenAI, cet article est fait pour vous.

Mais remettons les choses dans leurs contextes, qu’est-ce que whisper pour commencer: c’est un projet d’OpenAI fournissant une interface en ligne de commande pour leur modèle ASR (Automatic Speech Recognition). Il permet donc, de convertir des fichiers audio en texte, et comme il est désormais en open source sur Github vous pouvez le réutiliser (selon les termes de la licence), dans votre propre code si le cœur vous en dit. D’ailleurs c’est précisément ce qu’a fait un certain G.Gerganov en proposant un portage du modèle d’OpenAI en C/C++, cette implémentation à l’avantage de pouvoir s’exécuter sans GPU dédier.

Je vous propose donc un petit guide d’installation et de configuration de whisper.cpp sous Linux. Enfin nous envisagerons également quelques pistes pour facilité l’utilisation de ce modèle en l’intégrant à l’environnement de bureau Cinnamon.

Installation et configuration de whisper.cpp

Installons quelques paquets nécessaires:

sudo apt install build-essential libsdl2-dev cmake

Cloner le référentiel de whisper.cpp :

cd /opt && git clone https://github.com/ggerganov/whisper.cpp.git 
cd whisper.cpp

Télécharger l’un des modèles au format ggml, ils sont classés par ordre croissant de performance, mais garder en mémoire que vous devez disposer de suffisamment de mémoire RAM :

Model Disk RAM
tiny 75 MB ~390 MB
tiny.en 75 MB ~390 MB
base 142 MB ~500 MB
base.en 142 MB ~500 MB
small 466 MB ~1.0 GB
small.en 466 MB ~1.0 GB
medium 1.5 GB ~2.6 GB
medium.en 1.5 GB ~2.6 GB
large-v1 2.9 GB ~4.7 GB
large 2.9 GB ~4.7 GB

Dans notre cas nous utiliserons le modèle de base

bash ./models/download-ggml-model.sh base

Nous pourrons ensuite compiler, et faire le premier test

make
./main -m models/ggml-base.bin -f samples/jfk.wav

Pour vos propres transcriptions garder à l’esprit que whisper ne supporte que des fichiers .wav 16 bits. Alors assurez-vous de convertir votre fichier par exemple avec ffmpeg :

ffmpeg -i "input.mp4" -ar 16000 -ac 1 -c:a pcm_s16le "output.wav"

et enfin executer la transcription

./main -m  models/ggml-base.bin -f "output.wav"

Cas d’usage : la génération de sous-titre

Dans mon cas, l’usage numéro de cet outil c’est la création de sous-titre pour mes vidéos sur YouTube et Peertube. D’une part parce que les sous-titres automatiques de YouTube sont de qualité… relative; d’autre part parce que whisper.cpp gère très bien la traduction de la langue source vers l’anglais. Voyons donc, en détail comment réaliser cela.

Je commence par la conversion de mon fichier vidéo avec ffmpeg

ffmpeg -i "yt-vid.mp4" -ar 16000 -ac 1 -c:a pcm_s16le "yt-vid.wav"

Ensuite j’exécute la transcription avec les options suivantes

./main -t 12 -osrt -l fr -tr -m models/ggml-base.bin -f "yt-vid.wav"

Cette commande utilise deux options supplémentaires :

  • -t 8 pour spécifier le nombre de threads (pour la performance)
  • -osrt pour générer des fichiers de sous-titres au format SRT
  • -l fr Par defaut whisper reconnais automatiquement la langue d’origine du fihier audio, mais je préfère le lui spécifier au cas ou il aurait des difficultés pour la déterminer.
  • -tr Enfin je lui demande de me sortir le fichier de sous-titre traduit en anglais

À l’issue de cette opération j’aurais dans le répertoire courant mon fichier de sous-titre traduit en English 🇬🇧️ .

Un simple scripts Bash pour faciliter l’utilisation

Voila vous l’avez remarqué la commande n’est pas très pratique, je pourrais l’enregistrer en tant qu’alias Bash, mais je vous propose une alternative. Pour ceux d’entre vous qui utilisent Linux Mint dans sa saveur Cinnamon le gestionnaire de fichier Nemo dispose d’une feature pratique permettant l’invocation de script depuis le menu contextuel. Cela nous permettrait, directement depuis Nemo, de sélectionner nos fichiers, et d’un simple clic-droit lancer la transcription 😎️.

Pour ce faire voici un exemple de script à enregistrer dans ‘$HOME/.local/share/nemo/scripts’:

#!/bin/bash

while [ $# -gt 0 ]; do
    video=$1

    # Convertir le fichier en format audio WAV
    ffmpeg -i "$video" -ar 16000 -ac 1 -c:a pcm_s16le "$video.wav"

    # Exécuter le programme principal avec les options spécifiées
    /opt/whisper.cpp/./main -t 8 -l fr -tr -osrt -m /opt/whisper.cpp/models/ggml-medium.bin -f "$video.wav"
    
    #Clean
    rm "$video.wav"

    shift
done

notify-send -a "Transcript" -t 5000 -u normal "La transcription pour $video est terminée".

Pour faire simple ce script fonctionne de la manière suivante:

  • while [ $# -gt 0 ]; do: Cela commence une boucle while qui se répète tant qu’il y a des arguments en ligne de commande non traités.

  • video=$1: La variable video est initialisée avec la valeur du premier argument en ligne de commande.

  • Pour ffmpeg et whisper vous connaissez maintenant 😉️, j’ai cependant préféré l’utilisation du modèle medium, car il me propose globalement de meilleurs résultats.

Une fois que toutes les vidéos ont été traitées, la boucle while se termine et la commande suivante est exécutée :

  • notify-send envoie une notification à l’utilisateur, indiquant que la transcription pour le fichier $basefile est terminée. La notification est affichée pendant 5 secondes (-t)

Pour activer notre script depuis Nemo, aller dans Edition/Préférences/Greffons

Conclusion

J’utilise whisper.cpp depuis plusieurs mois maintenant et je doit dire que les performances sont au rendez-vous. Je pense que ce projet va ouvrir la voie à nombreuses intégrations dans le futur d’ailleur sur ce point le README propose déja quelques intérations. N’hésitez donc pas à expérimenter avec whisper.cpp et à l’adapter à vos besoins.

Bonne transcription !

Ressources :