Comment générer automatiquement les sous-titres d’une vidéo ?

soustitrage

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 -y

Ensuite, 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.wav

Tu 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-whisper

Cré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/activate

Cré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.wav

Ca 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-python

Charger 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 😉

Be the first to comment

Leave a Reply

Votre adresse de messagerie ne sera pas publiée.


*