OpenAI est une entreprise dont la présentation n’est plus à faire depuis qu’elle défraye la chronique, cela fait déjà un peu plus d’un an, grâce à son agent conversationnel ChatGPT ou encore Dall-E, son générateur d’image.
Mais c’est sans compter sur plusieurs autres projets d’intelligence artificielle proposés par la structure, parmi lesquels Whisper dont je vais vous parler dans ce billet.
Transformer de l'audio en texte
Whisper est un réseau de neurones open-source conçu pour la reconnaissance de langage. Je vous passe le détail de l’architecture, il est disponible sur le lien Github au début de ce paragraphe.
Le lien en question contient également les instructions et le code nécessaire pour tester le modèle en Python. Pour la suite, je vais partir du principe que Python est installé sur votre machine et que vous savez à peu près le faire fonctionner - il n’y a pas besoin de connaissances très poussées.
Pour installer whisper, il faut utiliser la ligne de commande suivante :
pip install -U openai-whisper
Veuillez noter que vous devez aussi avoir installé ffmpeg au préalable. Pour Linux, vous pouvez le faire en une commande (nul doute que vous saurez le faire sans moi, sinon vous avez des exemples sur le Github de Whisper). Pour Windows, si vous ne voulez pas vous casser la tête, je vous suggère de télécharger le zip contenant l’exécutable sur leur site, puis de copier ffmpeg.exe (dans le dossier bin/) directement dans le dossier dans lequel vous mettrez votre script.
Ensuite, le script pour faire fonctionner le modèle est tout ce qu’il y a de plus simple :
import whisper
model = whisper.load_model("base")
result = model.transcribe("audio.mp3")
print(result["text"])
Je vous propose une version améliorée qui permet d’enregistrer le résultat dans un fichier et de connaître le temps d’exécution :
import whisper
import time
start = time.time()
model = whisper.load_model("base")
result = model.transcribe("audio.mp3")
with open("out.txt", mode="a", encoding="utf-8") as file:
file.write(result["text"])
print("Temps d'exécution : " + str(time.time() - start) + "s.")
Mais qu’est-ce c’est que ce "base" qui sert de paramètre à la méthode whisper.load_model()
?
Bien vu ! Il s’agit d’un paramètre qui permet de régler la taille du modèle. De cette taille vont dépendre la qualité de la traduction, mais aussi la vitesse et la quantité de RAM nécessaire.
Voici un petit tableau repris de la page Github de Whisper :
Taille du modèle | RAM nécessaire | Vitesse relative |
---|---|---|
tiny | ~ 1 Go | ~ x32 |
base | ~ 1 Go | ~ x16 |
small | ~ 2 Go | ~ x6 |
medium | ~ 5 Go | ~ x2 |
large | ~ 10 Go | x1 |
Je vous propose de comparer les performances et la précision de ces modèles. Pour ce faire, je vais prendre l’introduction de mon article sur la crise cardiaque :
« Crise cardiaque » c’est une expression que nous n’aimons pas beaucoup utiliser en médecine : elle est trop vague. Même pour les patients, elle peut recouvrir plusieurs réalités différentes :
- certains auront en tête l’image du sportif qui s’écroule sans prévenir sur le terrain,
- pour d’autres c’est l’expression d’une douleur intense dans le thorax, au niveau du cœur,
- quelques patients enfin nous parlent de crise cardiaque en nous disant que « le cœur s’emballe ». C’est également assez imprécis mais ça désigne le plus souvent l’existence de palpitations (le fait de sentir son cœur battre, rapidement et de manière irrégulière).
Il existe d’autres exemples, mais rien que ces trois situations sont liées à trois pathologies très différentes.
Cet article vous propose de découvrir la prise en charge de l’une de ces détresses que l’on nomme couramment « crise cardiaque » mais dont le nom correct est Syndrome Coronarien Aigu (ou SCA). Pour ce faire, je vais m’appuyer sur le cas d’un vrai patient, anonymisé, vu lors d’une garde.
La nuit est tombée depuis quelques heures déjà au-dessus du bâtiment du SMUR dans lequel je prends mes gardes lorsque mon bip sonne, m’informant que mon équipage est sollicité pour partir en intervention. Dans cette joyeuse compagnie composée d’un médecin urgentiste, d’un infirmier et d’un ambulancier, je suis l’externe. Étudiant en médecine, pas vraiment nécessaire sur intervention, mais dont la présence est malgré tout appréciée, à la fois parce que les membres de l’équipe aiment enseigner mais également parce que je parviens à me rendre utile.
Pimpon. ♫
Et c’est reparti.
Le texte a été lu dans un environnement calme, sans trop de bafouillage et en essayant de mettre un peu d’intonation. Mon micro est d’une qualité acceptable toutefois, il génère un léger bruit de fond. Si vous avez un micro de meilleure (ou de moins bonne) qualité, n’hésitez pas à tester de votre côté pour savoir comment se comporte Whisper.
Si vous n’avez pas le temps/pas le courage de lire l’intégralité du comparatif, j’ai mis un petit tableau récapitulatif à la fin.
tiny
Temps d’exécution : 12.34s (dont 6 secondes pour télécharger les 72Mo du modèle).
Sortie :
Chris Cardiac c’est une expression que ne n’aimant pas beaucoup utilisé en médecine, elle est trop vague. Même pour les patients, elle peut recouvrir plusieurs réalités différentes.
- Certains orientètes l’image du sportif qui s’écoule sans prévenir sur le terrain.
- Pour d’autres, c’est l’expression d’une douleur intense dans le Torax au niveau du coeur.
- Quelques patients, enfin, nous parle de Chris Cardiac en nous disant que le coeur s’emballe. C’était également assez impressionnant, mais sa désigne le plus souvent l’existence de palpitations. Le fait de sentir son carbate rapidement et de manière irégulée.
Il existe d’autres exemples, mais rien que ces trois situations sont liés à trop pathologites très différentes.
C’est article vous propose de découvrir la prise en charge de l’une de ces détresses que l’on aime quand on en crise Cardiac, mais dont le nom correct est syndrome de coronarien à e-gûl ou S-C-A. Pour ce faire, je vais m’appuyer sur le cas d’un vrai passion, anonymisé, vu lors d’une garde.
L’annuie est tombé depuis quelques heures déjà au-dessus du bêtement du smur dans lequel je promet garde lorsque mon bipçonne. M’en formant que mon équipage est sollicité pour partir en intervention. Dans cette joie, ce compagnie composé d’un médecin urgentiste, un infirmière dans un ambulantci, je suis l’externe. Et tu n’y en médecine, pas vraiment nécessaire sur l’intervention, mais dans la présence, c’est malgré tout appréci. À la fois parce que les morts de l’équipage aime t’en sénir, mais également parce que je parai un mérande utile.
Pins, pong, pong,
et c’est repartit.
Sans prendre en compte les fautes de français, je compte 57 mots faux sur 287 soit un taux d’erreur de 19.9%.
base
Temps d’exécution : 19.47s (dont 6 secondes pour télécharger les 139Mo du modèle).
Sortie :
Chris Cardiac, c’est une expression que ne n’aimont pas beaucoup utilisé en médecine, elle est trop vague. Même pour les passions, elle peut recouvrir plusieurs réalités différentes.
- Certains ont renté l’image du sportif qui s’écroule sans prévenir sur le terrain.
- Pour d’autres, c’est l’expression d’une douleur intense dans le Torax au niveau du cœur.
- Quelque patient, enfin, nous parle de Chris Cardiac en nous disons que le cœur s’emballe. C’est également assez impréci, mais ça désigne le plus souvent l’existence de palpitations. Le fait de sentir son cœur battre rapidement et de manière irregulaire.
Il existe d’autres exemples, mais rien que ces trois situations sont liées à trois pathologies très différentes.
Cette article vous propose de découvrir la prise en charge de l’une de ces détresse que l’on homme couramment Chris Cardiac, mais dont le nom correcte est syndrome coronaryngue ou S.C.A. Pour ce faire, je vais m’appuyer sur le cas d’un vrai patient, anonymisé, vu lors d’une garde.
La nuit est tombée depuis quelques heures déjà, au-dessus du bâtiment du SMUR dans lequel je promet garde lorsqu’on bipe sonne. M’informons que mon équipage est sollicité pour partir en intervention. Dans cette joise compagnie, composé d’un médecin urgentiste, t’en as fermé d’un ambulance-ci, je suis l’externe. Etudiant en médecine, pas vraiment nécessaire sur intervention, mais dans la présence est malgré tout appréci, à la fois parce que les membres de l’équipage aiment enseigné, mais également parce que je parviens me rendre utile.
P’''’''’''’''’''’''’''’''’''’''’''’''’''’''’''’''’''’''’''’''’''’''’''’''’''’''’''’''’''’''’''’''’''’''’''’''’''’''’''’''’''’''’''’''’''’''’''’''’''’''’''’''’''’''’''’''’''’''’''’''’''’''’''’''’''’''’''’''’''’''’''’''’'''
Je ne m’explique pas du tout la longue liste d’apostrophes en fin de document (et pourtant j’ai relancé le modèle plusieurs fois). Elle est peut-être due au « Pimpon » que j’ai légèrement chanté, pourtant, le modèle tiny censé être moins performant donne un résultat plus convaincant sur cette partie.
Cette fois-ci, j’arrive à un taux d’erreur de 10.33%. C’est mieux, mais le texte est encore pas mal massacré et je ne compte même pas les fautes de français.
small
Temps d’exécution : 1min 10.02s (dont 41 secondes pour télécharger les 461Mo du modèle).
Sortie :
Chris Cardiac, c’est une expression que nous n’aimons pas beaucoup utilisée en médecine. Elle est trop vague. Même pour les patients, elle peut recouvrir plusieurs réalités différentes.
- Certains auront en tête l’image du sportif qui s’écroule sans prévenir sur le terrain.
- Pour d’autres, c’est l’expression d’une douleur intense dans le thorax, au niveau du coeur.
- Quelques patients enfin nous parlent de Chris Cardiac en nous disant que le coeur s’emballe. C’est également assez imprécié, mais ça désigne le plus souvent l’existence de palpitations. Le fait de sentir son coeur battre rapidement et de manière irrégulaire.
Il existe d’autres exemples, mais rien que ces trois situations sont liées à trois pathologies très différentes.
Cet article vous propose de découvrir la prise en charge de l’une de ces détresses que l’on nomme couramment Chris Cardiac, mais dont le nom correct est Syndrome Coronarien aigu, ou SCA. Pour ce faire, je vais m’appuyer sur le cas d’un vrai patient, anonymisé, vu lors d’une garde.
La nuit est tombée depuis quelques heures déjà au-dessus du bâtiment du smur dans lequel je prends mes gardes lorsque mon bipçonne. M’informant que mon équipage est sollicité pour partir en intervention. Dans cette joyeuse compagnie composée d’un médecin urgentiste, un infirmier et d’un ambulancier, je suis l’externe. Étudiant en médecine, pas vraiment nécessaire sur intervention, mais dont la présence est malgré tout appréciée. A la fois parce que les membres de l’équipage aiment enseigner, mais également parce que je parlais à me rendre utile.
Pimpon, et c’est reparti.
J’arrive à un taux d’erreur de 3.65%, c’est beaucoup mieux ! Même d’un point de vue langagier, c’est plus correct. Il persiste toutefois ce « Chris Cardiac » (un musicien d’après Google).
medium
Temps d’exécution : 2min 47.75s (dont 1 minute et 27 secondes pour télécharger le modèle qui pèse 1.42Go).
Sortie :
Crise cardiaque, c’est une expression que nous n’aimons pas beaucoup utiliser en médecine. Elle est trop vague. Même pour les patients, elle peut recouvrir plusieurs réalités différentes.
- Certains ouvrent en tête l’image du sportif qui s’écroule sans prévenir sur le terrain.
- Pour d’autres, c’est l’expression d’une douleur intense dans le thorax, au niveau du cœur.
- Quelques patients, enfin, nous parlent de crise cardiaque en nous disant que le cœur s’emballe. C’est également assez imprécis, mais ça désigne le plus souvent l’existence de palpitations, le fait de sentir son cœur battre rapidement et de manière irrégulaire.
Il existe d’autres exemples, mais rien que ces trois situations sont liées à trois pathologies très différentes.
Cet article vous propose de découvrir la prise en charge de l’une de ces détresses que l’on nomme couramment crise cardiaque, mais dont le nom correct est syndrome coronarien aigu ou SCA. Pour ce faire, je vais m’appuyer sur le cas d’un vrai patient, anonymisé, vu lors d’une garde.
La nuit est tombée depuis quelques heures déjà au-dessus du bâtiment du smur dans lequel je prends mes gardes lorsque mon bip sonne, m’informant que mon équipage est sollicité pour partir en intervention. Dans cette joyeuse compagnie composée d’un médecin urgentiste, d’un infirmier et d’un ambulancier, je suis l’externe. Étudiant en médecine, pas vraiment nécessaire sur intervention, mais dont la présence est malgré tout appréciée, à la fois parce que les membres de l’équipage aiment enseigner, mais également parce que je parviens à me rendre utile.
Pong, pong, et c’est reparti.
Chris Cardiac a enfin disparu ! Toutefois, c’est le retour de ping pong, on ne peut pas tout avoir j’imagine. J’arrive à un taux d’erreur de 1.44%, ça commence à être vraiment pas mal ! Voyons si large fera mieux.
large-v3
large existe en plusieurs versions, j’utilise ici la dernière en date : large-v3 (écrire tel quel dans le script si vous voulez faire de même).
Temps d’exécution : 4min 58.96s (dont 2 minutes et 51 secondes pour télécharger les 2.88Go du modèle)
Sortie :
Crise cardiaque, c’est une expression que nous n’aimons pas beaucoup utiliser en médecine. Elle est trop vague. Même pour les patients, elle peut recouvrir plusieurs réalités différentes.
- Certains auront en tête l’image du sportif qui s’écroule sans prévenir sur le terrain.
- Pour d’autres, c’est l’expression d’une douleur intense dans le thorax, au niveau du cœur.
- Quelques patients, enfin, nous parlent de crise cardiaque en nous disant que le cœur s’emballe. C’est également assez imprécis, mais ça désigne le plus souvent l’existence de palpitations. Le fait de sentir son cœur battre rapidement et de manière irrégulière.
Il existe d’autres exemples, mais rien que ces trois situations sont liées à trois pathologies très différentes. Cet article vous propose de découvrir la prise en charge de l’une de ces détresses que l’on nomme couramment crise cardiaque, mais dont le nom correct est syndrome coronarien aigu ou SCA. Pour ce faire, je vais m’appuyer sur le cas d’un vrai patient, anonymisé, vu lors d’une garde.
La nuit est tombée depuis quelques heures déjà. Au-dessus du bâtiment du SMUR, dans lequel je prends mes gardes lorsque mon bip sonne, m’informant que mon équipage est sollicité pour partir en intervention. Dans cette joyeuse compagnie, composée d’un médecin urgentiste, d’un infirmier et d’un ambulancier, je suis l’externe. Étudiant en médecine, pas vraiment nécessaire sur intervention, mais dont la présence est malgré tout appréciée, à la fois parce que les membres de l’équipage aiment enseigner, mais également parce que je parviens à me rendre utile.
Pin, pon, et c’est reparti.
Si l’on excepte quelques rares fautes de français et la ponctuation (qui est compliquée à deviner pour le modèle), cette transcription est parfaite !
Petit tableau récapitulatif :
Modèle | Taille disque | Temps de téléchargement | Temps d’exécution | Temps total | Précision |
---|---|---|---|---|---|
tiny | 72Mo | 6s | 6s | 12s | 80% |
base | 139Mo | 6s | 13.5s | 19.5s | 90% |
small | 461Mo | 41s | 29s | 1min 10s | 96.5% |
medium | 1.42Go | 1min 27s | 1min 21s | 2min 48s | 98.5% |
large-v3 | 2.88Go | 2min 51s | 2min 8s | 4min 59s | 100% |
Bien évidemment, ce petit comparatif a de nombreuses limitations : les performances dépendent de ma connexion (fibre optique) et de ma configuration (modeste mais récente) et puis ma méthode de calcul de précision est assez grossière, mais je la trouve suffisante pour mettre en évidence les différences entre ces modèles.
Générer un fichier de sous-titres
J’ai généré le texte de mon enregistrement, c’est très bien. Mais si je voulais sous-titrer une vidéo, je devrais encore me taper manuellement toute la synchronisation, le temps gagné serait assez relatif.
Et si nous modifiions notre script pour générer automatique un fichier au format SRT ?
SRT est un format assez standard et parmi les plus utilisés dans le monde du sous-titrage. Il découpe le texte en séquences qui sont arrangées de cette manière :
1
00:00:00,000 --> 00:03:00,000
Première séquence de sous-titres
2
00:03:00,00 --> 00:06:00,000
Deuxième séquence de sous-titres.
Les séquences sont numérotées sur la première ligne, sur la deuxième on a le timecode de début et celui de fin séparés d’une flèche puis, sur la troisième ligne, le texte en lui-même.
Il existe également une possibilité d’enrichir ce fichier pour styliser nos sous-titres, mais restons simples !
Voici le code que je vous propose :
import whisper
import time
from datetime import timedelta
start = time.time()
model = whisper.load_model("large-v3")
segs = model.transcribe("audio.mp3")['segments']
result = ""
for seg in segs:
begin = "0" + str(timedelta(seconds=int(seg["start"]))) + ",000"
end = "0" + str(timedelta(seconds=int(seg["end"]))) + ",000"
txt = seg["text"]
result += str(seg["id"] + 1) + "\n"
result += begin + " --> " + end + "\n"
result += txt + "\n\n"
with open("out.srt", mode="a", encoding="utf-8") as file:
file.write(result)
print("Temps d'exécution : " + str(time.time() - start) + "s.")
Et voici le résultat :
1
00:00:00,000 --> 00:00:04,000
Crise cardiaque, c'est une expression que nous n'aimons pas beaucoup utiliser en médecine.
2
00:00:05,000 --> 00:00:05,000
Elle est trop vague.
3
00:00:06,000 --> 00:00:09,000
Même pour les patients, elle peut recouvrir plusieurs réalités différentes.
4
00:00:10,000 --> 00:00:14,000
Certains auront en tête l'image du sportif qui s'écroule sans prévenir sur le terrain.
5
00:00:15,000 --> 00:00:18,000
Pour d'autres, c'est l'expression d'une douleur intense dans le thorax, au niveau du cœur.
6
00:00:19,000 --> 00:00:23,000
Quelques patients, enfin, nous parlent de crise cardiaque en nous disant que le cœur s'emballe.
7
00:00:24,000 --> 00:00:28,000
C'est également assez imprécis, mais ça désigne le plus souvent l'existence de palpitations.
8
00:00:28,000 --> 00:00:31,000
Le fait de sentir son cœur battre rapidement et de manière irrégulière.
9
00:00:32,000 --> 00:00:38,000
Il existe d'autres exemples, mais rien que ces trois situations sont liées à trois pathologies très différentes.
10
00:00:39,000 --> 00:00:44,000
Cet article vous propose de découvrir la prise en charge de l'une de ces détresses que l'on nomme couramment crise cardiaque,
11
00:00:44,000 --> 00:00:48,000
mais dont le nom correct est syndrome coronarien aigu ou SCA.
12
00:00:49,000 --> 00:00:54,000
Pour ce faire, je vais m'appuyer sur le cas d'un vrai patient, anonymisé, vu lors d'une garde.
13
00:00:54,000 --> 00:00:56,000
La nuit est tombée depuis quelques heures déjà.
14
00:00:56,000 --> 00:01:00,000
Au-dessus du bâtiment du SMUR, dans lequel je prends mes gardes lorsque mon bip sonne,
15
00:01:01,000 --> 00:01:04,000
m'informant que mon équipage est sollicité pour partir en intervention.
16
00:01:04,000 --> 00:01:10,000
Dans cette joyeuse compagnie, composée d'un médecin urgentiste, d'un infirmier et d'un ambulancier, je suis l'externe.
17
00:01:10,000 --> 00:01:15,000
Étudiant en médecine, pas vraiment nécessaire sur intervention, mais dont la présence est malgré tout appréciée,
18
00:01:15,000 --> 00:01:20,000
à la fois parce que les membres de l'équipage aiment enseigner, mais également parce que je parviens à me rendre utile.
19
00:01:21,000 --> 00:01:24,000
Pin, pon, et c'est reparti.
Pour une raison étrange, il semble y avoir une espace avant chaque occurrence de texte. Je pense que c’est facilement corrigible en mettant à jour le script.
On peut d’ailleurs sans doute trouver de nombreuses pistes d’amélioration pour ce script, mais n’étant pas développeur, je laisse ce soin aux personnes plus douées que moi !
J’ai utilisé un script très similaire pour générer les sous-titres de vidéos d’interviews qui durent environ 1h, et plus seulement pour faire joujou comme ici.
J’ai commencé par le mode medium et le ratio temps d’exécution/précision me paraissait tout à fait satisfaisant : le temps de génération était du même ordre de grandeur que la durée de la vidéo et je n’étais que peu obligé de revenir sur le texte pour le corriger. En revanche, là où le modèle pêchait plus sérieusement, c’était sur la synchronisation entre le texte et l’audio. Il me générait des séquences parfois très petites (de l’ordre de quelques secondes avec seulement quelques mots) que j’étais obligé de fusionner pour ne pas avoir une succession de micro-phrases illisibles. Et plus on avançait dans le temps, plus il y avait des problèmes de synchronisation.
Je suis donc revenu sur mon choix de medium et je suis passé sur large-v3. Cependant, pour éviter les exports trop longs et les gros problèmes de synchronisation en fin de piste, j’ai découpé mon audio en une dizaine de parties de 5 à 10 minutes chacune. Ça m’a aussi permis de paralléliser les tâches puisque j’ajoutais et je vérifiais le sous-titrage d’une partie pendant que le modèle générait la suivante.
large-v3 est beaucoup plus précis que medium ce qui était plutôt attendu, mais il génère également des séquences beaucoup plus longues dont les sous-titres font régulièrement deux ou trois lignes (ce qui est un peu trop à mon goût). Mais, en montage vidéo, il est beaucoup moins pénible de découper des gros sous-titres que d’en fusionner plusieurs petits. La synchronisation est en outre bien meilleure (ce qui est peut-être dû au découpage en plus petits exports plutôt qu’au changement de modèle) et le temps d’exécution quelque part entre 1.5 et 2x la durée de l’audio en entrée.
Vous l’aurez compris : pour moi large-v3 est le meilleur compromis dans ce cas d’usage.
Si on compare aux autres outils du même genre (comme ceux qui sont intégrés dans les logiciels de montage tels que Adobe Premiere Pro ou Davinci Resolve Studio), Whisper large-v3 est beaucoup plus précis mais les séquences sont moins optimisées (trop longues ou trop courtes et décalées) : on sent qu’il n’est pas conçu pour cela à la base. Il est également plus lent, mais cela tient au fait qu’il s’exécute localement sur votre ordinateur sans envoyer votre audio sur des serveurs inconnus ce qui, pour moi, est un point très positif.
Si jamais vous voulez libérer de la place, Whisper stocke ses modèles dans C:\Users\VotreNomDUtilisateur\.cache
. large-v3 pèse plus de 3 Go à lui tout seul.