Licence CC 0

Sous-titrer automatiquement un enregistrement

Avec OpenAI Whisper

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.

5 commentaires

Humm, normalement, quand tu fais pip install -U openai-whisper.

Ça vient avec un utilitaire Python que tu peux appeler avec whisper en ligne de commande. Cet utilitaire s’occupe de la transcription des sous-titre et à même une fonctionnalité de traduction (très très limité, vers l’anglais uniquement).

Il facilite également l’utilisation du GPU également.

L’aide du logiciel
$ whisper --help
usage: whisper [-h] [--model MODEL] [--model_dir MODEL_DIR] [--device DEVICE] [--output_dir OUTPUT_DIR]
               [--output_format {txt,vtt,srt,tsv,json,all}] [--verbose VERBOSE] [--task {transcribe,translate}]
               [--language {af,am,ar,as,az,ba,be,bg,bn,bo,br,bs,ca,cs,cy,da,de,el,en,es,et,eu,fa,fi,fo,fr,gl,gu,ha,haw,he,hi,hr,ht,hu,hy,id,is,it,ja,jw,ka,kk,km,kn,ko,la,lb,ln,lo,lt,lv,mg,mi,mk,ml,mn,mr,ms,mt,my,ne,nl,nn,no,oc,pa,pl,ps,pt,ro,ru,sa,sd,si,sk,sl,sn,so,sq,sr,su,sv,sw,ta,te,tg,th,tk,tl,tr,tt,uk,ur,uz,vi,yi,yo,yue,zh,Afrikaans,Albanian,Amharic,Arabic,Armenian,Assamese,Azerbaijani,Bashkir,Basque,Belarusian,Bengali,Bosnian,Breton,Bulgarian,Burmese,Cantonese,Castilian,Catalan,Chinese,Croatian,Czech,Danish,Dutch,English,Estonian,Faroese,Finnish,Flemish,French,Galician,Georgian,German,Greek,Gujarati,Haitian,Haitian Creole,Hausa,Hawaiian,Hebrew,Hindi,Hungarian,Icelandic,Indonesian,Italian,Japanese,Javanese,Kannada,Kazakh,Khmer,Korean,Lao,Latin,Latvian,Letzeburgesch,Lingala,Lithuanian,Luxembourgish,Macedonian,Malagasy,Malay,Malayalam,Maltese,Mandarin,Maori,Marathi,Moldavian,Moldovan,Mongolian,Myanmar,Nepali,Norwegian,Nynorsk,Occitan,Panjabi,Pashto,Persian,Polish,Portuguese,Punjabi,Pushto,Romanian,Russian,Sanskrit,Serbian,Shona,Sindhi,Sinhala,Sinhalese,Slovak,Slovenian,Somali,Spanish,Sundanese,Swahili,Swedish,Tagalog,Tajik,Tamil,Tatar,Telugu,Thai,Tibetan,Turkish,Turkmen,Ukrainian,Urdu,Uzbek,Valencian,Vietnamese,Welsh,Yiddish,Yoruba}]
               [--temperature TEMPERATURE] [--best_of BEST_OF] [--beam_size BEAM_SIZE] [--patience PATIENCE]
               [--length_penalty LENGTH_PENALTY] [--suppress_tokens SUPPRESS_TOKENS] [--initial_prompt INITIAL_PROMPT]
               [--condition_on_previous_text CONDITION_ON_PREVIOUS_TEXT] [--fp16 FP16]
               [--temperature_increment_on_fallback TEMPERATURE_INCREMENT_ON_FALLBACK]
               [--compression_ratio_threshold COMPRESSION_RATIO_THRESHOLD] [--logprob_threshold LOGPROB_THRESHOLD]
               [--no_speech_threshold NO_SPEECH_THRESHOLD] [--word_timestamps WORD_TIMESTAMPS]
               [--prepend_punctuations PREPEND_PUNCTUATIONS] [--append_punctuations APPEND_PUNCTUATIONS]
               [--highlight_words HIGHLIGHT_WORDS] [--max_line_width MAX_LINE_WIDTH] [--max_line_count MAX_LINE_COUNT]
               [--max_words_per_line MAX_WORDS_PER_LINE] [--threads THREADS]
               audio [audio ...]

positional arguments:
  audio                 audio file(s) to transcribe

options:
  -h, --help            show this help message and exit
  --model MODEL         name of the Whisper model to use (default: small)
  --model_dir MODEL_DIR
                        the path to save model files; uses ~/.cache/whisper by default (default: None)
  --device DEVICE       device to use for PyTorch inference (default: cpu)
  --output_dir OUTPUT_DIR, -o OUTPUT_DIR
                        directory to save the outputs (default: .)
  --output_format {txt,vtt,srt,tsv,json,all}, -f {txt,vtt,srt,tsv,json,all}
                        format of the output file; if not specified, all available formats will be produced (default:
                        all)
  --verbose VERBOSE     whether to print out the progress and debug messages (default: True)
  --task {transcribe,translate}
                        whether to perform X->X speech recognition ('transcribe') or X->English translation ('translate')
                        (default: transcribe)
  --language {af,am,ar,as,az,ba,be,bg,bn,bo,br,bs,ca,cs,cy,da,de,el,en,es,et,eu,fa,fi,fo,fr,gl,gu,ha,haw,he,hi,hr,ht,hu,hy,id,is,it,ja,jw,ka,kk,km,kn,ko,la,lb,ln,lo,lt,lv,mg,mi,mk,ml,mn,mr,ms,mt,my,ne,nl,nn,no,oc,pa,pl,ps,pt,ro,ru,sa,sd,si,sk,sl,sn,so,sq,sr,su,sv,sw,ta,te,tg,th,tk,tl,tr,tt,uk,ur,uz,vi,yi,yo,yue,zh,Afrikaans,Albanian,Amharic,Arabic,Armenian,Assamese,Azerbaijani,Bashkir,Basque,Belarusian,Bengali,Bosnian,Breton,Bulgarian,Burmese,Cantonese,Castilian,Catalan,Chinese,Croatian,Czech,Danish,Dutch,English,Estonian,Faroese,Finnish,Flemish,French,Galician,Georgian,German,Greek,Gujarati,Haitian,Haitian Creole,Hausa,Hawaiian,Hebrew,Hindi,Hungarian,Icelandic,Indonesian,Italian,Japanese,Javanese,Kannada,Kazakh,Khmer,Korean,Lao,Latin,Latvian,Letzeburgesch,Lingala,Lithuanian,Luxembourgish,Macedonian,Malagasy,Malay,Malayalam,Maltese,Mandarin,Maori,Marathi,Moldavian,Moldovan,Mongolian,Myanmar,Nepali,Norwegian,Nynorsk,Occitan,Panjabi,Pashto,Persian,Polish,Portuguese,Punjabi,Pushto,Romanian,Russian,Sanskrit,Serbian,Shona,Sindhi,Sinhala,Sinhalese,Slovak,Slovenian,Somali,Spanish,Sundanese,Swahili,Swedish,Tagalog,Tajik,Tamil,Tatar,Telugu,Thai,Tibetan,Turkish,Turkmen,Ukrainian,Urdu,Uzbek,Valencian,Vietnamese,Welsh,Yiddish,Yoruba}
                        language spoken in the audio, specify None to perform language detection (default: None)
  --temperature TEMPERATURE
                        temperature to use for sampling (default: 0)
  --best_of BEST_OF     number of candidates when sampling with non-zero temperature (default: 5)
  --beam_size BEAM_SIZE
                        number of beams in beam search, only applicable when temperature is zero (default: 5)
  --patience PATIENCE   optional patience value to use in beam decoding, as in https://arxiv.org/abs/2204.05424, the
                        default (1.0) is equivalent to conventional beam search (default: None)
  --length_penalty LENGTH_PENALTY
                        optional token length penalty coefficient (alpha) as in https://arxiv.org/abs/1609.08144, uses
                        simple length normalization by default (default: None)
  --suppress_tokens SUPPRESS_TOKENS
                        comma-separated list of token ids to suppress during sampling; '-1' will suppress most special
                        characters except common punctuations (default: -1)
  --initial_prompt INITIAL_PROMPT
                        optional text to provide as a prompt for the first window. (default: None)
  --condition_on_previous_text CONDITION_ON_PREVIOUS_TEXT
                        if True, provide the previous output of the model as a prompt for the next window; disabling may
                        make the text inconsistent across windows, but the model becomes less prone to getting stuck in a
                        failure loop (default: True)
  --fp16 FP16           whether to perform inference in fp16; True by default (default: True)
  --temperature_increment_on_fallback TEMPERATURE_INCREMENT_ON_FALLBACK
                        temperature to increase when falling back when the decoding fails to meet either of the
                        thresholds below (default: 0.2)
  --compression_ratio_threshold COMPRESSION_RATIO_THRESHOLD
                        if the gzip compression ratio is higher than this value, treat the decoding as failed (default:
                        2.4)
  --logprob_threshold LOGPROB_THRESHOLD
                        if the average log probability is lower than this value, treat the decoding as failed (default:
                        -1.0)
  --no_speech_threshold NO_SPEECH_THRESHOLD
                        if the probability of the <|nospeech|> token is higher than this value AND the decoding has
                        failed due to `logprob_threshold`, consider the segment as silence (default: 0.6)
  --word_timestamps WORD_TIMESTAMPS
                        (experimental) extract word-level timestamps and refine the results based on them (default:
                        False)
  --prepend_punctuations PREPEND_PUNCTUATIONS
                        if word_timestamps is True, merge these punctuation symbols with the next word (default:
                        "'“¿([{-)
  --append_punctuations APPEND_PUNCTUATIONS
                        if word_timestamps is True, merge these punctuation symbols with the previous word (default:
                        "'.。,,!!??::”)]}、)
  --highlight_words HIGHLIGHT_WORDS
                        (requires --word_timestamps True) underline each word as it is spoken in srt and vtt (default:
                        False)
  --max_line_width MAX_LINE_WIDTH
                        (requires --word_timestamps True) the maximum number of characters in a line before breaking the
                        line (default: None)
  --max_line_count MAX_LINE_COUNT
                        (requires --word_timestamps True) the maximum number of lines in a segment (default: None)
  --max_words_per_line MAX_WORDS_PER_LINE
                        (requires --word_timestamps True, no effect with --max_line_width) the maximum number of words in
                        a segment (default: None)
  --threads THREADS     number of threads used by torch for CPU inference; supercedes MKL_NUM_THREADS/OMP_NUM_THREADS
                        (default: 0)
+4 -0

Ah oui tiens, c’est pas mal du tout ça ! Et en plus c’est marqué sur la page Github, j’ai lu trop vite. 😅

Du coup, le script Python n’est pas forcément des plus utiles, mais ça m’aura fait pratiquer. Pour le reste, c’était surtout la présentation de l’outil et de ses avantages et ses limites qui m’importait.

Merci pour cet ajout !

+0 -0

@qwerty: Je fais un tout petit peu de pub. J’ai écris un article le mois dernier, (quelques jours après ce billet) sur le même sujet: La publicité et les trains. (Toute la première partie est juste un kiff personnel sur l’étude des publicités de trains ^^", mais la deuxième partie parle vraiment d’apprentissage automatique).

Je parle rapidement du projet insanely-fast-whisper, que j’ai découvert en écrivant l’article, qui permet la transcription en temps réel et performante. 🤯

+2 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte