
Faire des sous-titres manuellement, c’est souvent une vraie galère : écouter, mettre sur pause toutes les deux secondes, taper le texte, ajuster le timing… bref, un travail long et pénible. Pourtant, ils sont essentiels : ils rendent une vidéo accessible au plus grand nombre, facilitent la compréhension et permettent de suivre même sans le son.
En bon fainéant d’informaticien, je me suis donc demandé : comment simplifier tout ça ?
Dans cet article, je te partage ma méthode pour générer automatiquement des sous-titres. Elle n’est pas parfaite, mais elle permet d’obtenir un résultat déjà très correct, avec seulement quelques ajustements à faire à la main.
Extraire l’audio de la vidéo :
On commence par installer les paquets nécessaires pour réaliser l’opération depuis un pc sous linux (debian like):
sudo apt install ffmpeg python3 python3-pip -yEnsuite, on extrait l’audio en .wav depuis la vidéo. Si ta vidéo est en .mkv, adapte simplement le nom du fichier :
ffmpeg -i video.mp4 audio.wavTu dois avoir maintenant un fichier audio.wav qui contient la bande son de ta vidéo et qui servira de base pour la transcription automatique.
Installer whisper
Whisper, c’est un modèle d’IA opensource bien connu quipermet de transformer automatiquement l’audio en texte.
Il fonctionne directement sur ton ordinateur, sans connexion internet, et peut servir à créer des sous-titres dans plusieurs langues.
Installer le paquet whisper :
pip install openai-whisperCrée un environnement isolé appelé venv (pour installer des paquets sans toucher au système)
sudo apt install python3-venv -y
python3 -m venv venv
source venv/bin/activateCréer le script pour générer les sous-titres:
nano transcribe.py#!/usr/bin/env python3
import sys
import whisper
import os
# Vérifie la présence d’un argument
if len(sys.argv) < 2:
print("Usage: python3 transcribe.py fichier.wav [modele]")
print("Exemple: python3 transcribe.py audio.wav base")
sys.exit(1)
# Fichier audio et modèle
audio_file = sys.argv[1]
model_name = sys.argv[2] if len(sys.argv) > 2 else "base"
# Vérifie que le fichier existe
if not os.path.exists(audio_file):
print(f"Erreur : le fichier '{audio_file}' n'existe pas.")
sys.exit(1)
# Charge le modèle
print(f"[*] Chargement du modèle '{model_name}'...")
model = whisper.load_model(model_name)
# Transcrit en français
print(f"[*] Transcription de {audio_file} en français...")
result = model.transcribe(audio_file, language="fr")
# Fichier de sortie .srt basé sur le nom du fichier audio
srt_file = os.path.splitext(audio_file)[0] + "_corrige.srt"
# Sauvegarde au format SRT
def format_time(t):
h = int(t // 3600)
m = int((t % 3600) // 60)
s = int(t % 60)
ms = int((t - int(t)) * 1000)
return f"{h:02}:{m:02}:{s:02},{ms:03}"
with open(srt_file, "w", encoding="utf-8") as f:
for i, segment in enumerate(result["segments"], start=1):
start = format_time(segment["start"])
end = format_time(segment["end"])
text = segment["text"].strip()
print(f"[*] Transcription terminée : {srt_file}")Lancer le sous-titrage
python3 transcribe.py audio.wav Le fichier output.srt contient les sous-titrages , tu n’as plus qu’à l’importer dans ton logiciel de montage vidéos ou sur la plateforme vidéos comme peertube.
Tips pour améliorer les perfs du script
Il existe plusieurs modes , rapidité ou précision. J’en ai testé plusieurs et celui qui est meilleur rapport précision/vitesse est : small
Améliorer la qualité audio
Whisper est sensible au bruit et aux changements de locuteurs.
Tu peux améliorer le résultat avec :
ffmpeg -i video.mkv -ar 16000 -ac 1 -af "highpass=f=200,lowpass=f=3000" audio.wavCa nettoye un peu le son avant transcription
Corriger les erreurs grammaticales
Avec LanguageTool, il est possible de corriger automatiquement les fautes d’orthographe, de grammaire et de ponctuation dans les sous-titres générés.
pip install language-tool-pythonCharger LanguageTool:
import language_tool_python
print("[*] Correction grammaticale avec LanguageTool (fr)…")
tool = language_tool_python.LanguageTool('fr')Correction LanguageTool
corrected = tool.correct(text)
f.write(f"{i}\n{start} --> {end}\n{text}\n\n")Le script complet avec correction grammaticale
#!/usr/bin/env python3
import sys
import whisper
import os
import language_tool_python
# Vérifie la présence d’un argument
if len(sys.argv) < 2:
print("Usage: python3 transcribe.py fichier.wav [modele]")
print("Exemple: python3 transcribe.py audio.wav base")
sys.exit(1)
# Fichier audio et modèle
audio_file = sys.argv[1]
model_name = sys.argv[2] if len(sys.argv) > 2 else "base"
# Vérifie que le fichier existe
if not os.path.exists(audio_file):
print(f"Erreur : le fichier '{audio_file}' n'existe pas.")
sys.exit(1)
# Charge le modèle
print(f"[*] Chargement du modèle '{model_name}'...")
model = whisper.load_model(model_name)
# Transcrit en français
print(f"[*] Transcription de {audio_file} en français...")
result = model.transcribe(audio_file, language="fr")
# Charger LanguageTool
print("[*] Correction grammaticale avec LanguageTool (fr)...")
tool = language_tool_python.LanguageTool('fr')
# Fichier de sortie .srt basé sur le nom du fichier audio
srt_file = os.path.splitext(audio_file)[0] + "_corrige.srt"
# Sauvegarde au format SRT
def format_time(t):
h = int(t // 3600)
m = int((t % 3600) // 60)
s = int(t % 60)
ms = int((t - int(t)) * 1000)
return f"{h:02}:{m:02}:{s:02},{ms:03}"
with open(srt_file, "w", encoding="utf-8") as f:
for i, segment in enumerate(result["segments"], start=1):
start = format_time(segment["start"])
end = format_time(segment["end"])
text = segment["text"].strip()
# Correction LanguageTool
corrected = tool.correct(text)
f.write(f"{i}\n{start} --> {end}\n{text}\n\n")
print(f"[*] Transcription terminée : {srt_file}")Et voilà , bien sûr la qualité des sous-titrages dépendra énormément de la qualité du fichier source audio. Et donc , je te conseille fortement de relire le texte avant publication sur ta vidéo.
Mais au final tu auras économiser du temps et de l’énergie pour le gros du taf 😉
Leave a Reply