Whisper IA

Automatiser la transcription audio et vidéo avec Whisper, Nextcloud, et du Python.

Dans cet article, je vais vous guider à travers la configuration et l’utilisation du modèle de transcription Whisper d’OpenAI sur un système Windows 11. Vous découvrirez comment j’ai automatisé la transcription de fichiers audio et de vidéos YouTube via un serveur domestique Nextcloud, avec une gestion simple et fluide des fichiers à partir d’un smartphone. Ce guide couvre toutes les étapes, de l’installation des dépendances à l’automatisation complète de la transcription.

Dans la vrai vie qu’est ce qui ce passe ?

J’enregistre les partie de cours de fac importantes et prend des notes écrites pour le reste. Sur le trajet je relis mes notes et en fais un fichier audio. Toujours sur mon smartphone, je déplace les fichiers audio dont je veux une retranscription dans un répertoire qui est sur mon cloud privée « nextcloud ». Je prend soins de nommer les fichiers explicitement. Nextcloud, l’application sur mon smartphone synchronise le dossier et fait une copie des fichier audio sur mon serveur. Je fais un peu différemment si je veux une retranscription d’un documentaire ou d’une conférence sur youtube. Je copie l’adresse de la vidéo dans un fichier .txt que je déplace dans un autre répertoire de mon cloud prévu aussi uniquement pour ça. je nomme aussi bien le fichier. Mon serveur lui vas scanner les deux répertoires , si le script détecte des fichiers il les transcrits, et dépose la transcription sous forme de fichier .txt et .docx dans un troisième répertoire aussi dans le cloud, me permettant ainsi de récupérer les textes de retranscription.

Suite à cela je peu retravailler mes cours de façon automatiser avec une autre IA tel que ChatGPT

Configuration matérielle utilisée :

  • Système d’exploitation : Windows 11
  • GPU : Nvidia 4060 Ti 16 Go VRAM
  • CPU : AMD Ryzen 7
  • RAM : 64 Go DDR4 3600 MHz
  • Stockage : SSD NVMe

1. Préparation de l’environnement

1.1. Installation de Python

Si vous ne l’avez pas déjà fait, installez Python sur votre machine. Lors de l’installation, veillez à cocher l’option « Add Python to PATH ».

1.2. Création d’un environnement virtuel

Créez un environnement virtuel Python pour isoler les dépendances de votre projet. Voici la commande pour créer un environnement :

Bash
python -m venv whisper_env
Bash

Activez l’environnement virtuel :

Bash
whisper_env\Scripts\activate
Bash

1.3. Installation des dépendances

Pour que le script fonctionne, installez les bibliothèques suivantes dans votre environnement virtuel :

  • Whisper : Le modèle de transcription d’OpenAI.
Bash
pip install git+https://github.com/openai/whisper.git
Bash
  • PyTorch (avec CUDA pour l’accélération GPU)
Bash
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
Bash
  • python-docx : Pour convertir les fichiers .txt en .docx.
Bash
pip install python-docx
Bash
  • yt-dlp : Pour télécharger des vidéos YouTube et en extraire l’audio.
Bash
pip install yt-dlp
Bash
  • ffmpeg-python : Une interface Python pour manipuler les fichiers audio et vidéo via FFmpeg.
Bash
pip install ffmpeg-python
Bash

1.4. Installation de FFmpeg

FFmpeg est requis pour la manipulation des fichiers audio et vidéo. Il doit être installé en dehors de Python. Voici comment procéder :

  1. Téléchargez FFmpeg depuis le site officiel.
  2. Décompressez l’archive.
  3. Ajoutez FFmpeg au PATH de votre système pour qu’il soit accessible partout.

2. Démarrage automatique de Whisper au lancement de Windows

Pour rendre le processus encore plus simple et transparent, j’ai configuré le démarrage automatique de Whisper au lancement de mon PC. Cela me permet de lancer Whisper et mon script de transcription sans intervention manuelle dès que mon ordinateur démarre.

2.1. Création d’un script de démarrage Windows

Le script de démarrage suivant est configuré pour activer l’environnement virtuel Python, se rendre dans le répertoire où se trouve le script de transcription, et lancer ce dernier en arrière-plan.

Voici le contenu du fichier .bat que j’utilise pour démarrer Whisper et lancer le script de transcription lors du démarrage de mon PC :

Bash
@echo off
timeout /t 30

REM Activer l'environnement virtuel et journaliser
echo Activating virtual environment >> F:\IA\whisper\start_log.txt
call F:\IA\whisper\venv\Scripts\activate.bat >> F:\IA\whisper\start_log.txt 2>&1

REM Se déplacer dans le répertoire du script
echo Changing directory to F:\IA\whisper >> F:\IA\whisper\start_log.txt
cd /d F:\IA\whisper >> F:\IA\whisper\start_log.txt 2>&1

REM Démarrer le script de transcription en arrière-plan et journaliser
echo Starting transcription script >> F:\IA\whisper\start_log.txt
start /B python transcription_script.py >> F:\IA\whisper\script_log.txt 2>&1

REM Désactiver l'environnement virtuel une fois que le script s'est terminé
echo Deactivating virtual environment >> F:\IA\whisper\start_log.txt
deactivate
Bash

2.2. Fonctionnement du script de démarrage

  • Activation de l’environnement virtuel : Le script commence par attendre 30 secondes pour laisser au système le temps de démarrer, puis il active l’environnement virtuel où toutes les dépendances Python sont installées.
  • Changement de répertoire : Ensuite, il se déplace dans le répertoire où se trouve le script de transcription.
  • Lancement du script de transcription : Le script transcription_script.py est lancé en arrière-plan et enregistre les logs dans un fichier (script_log.txt).
  • Désactivation de l’environnement virtuel : Enfin, une fois le script terminé, l’environnement virtuel est désactivé.

3. Automatisation de la transcription avec Nextcloud

3.1. Gestion des fichiers via Nextcloud

J’ai mis en place un serveur Nextcloud à domicile avec un nom de domaine et un reverse proxy. Cette configuration me permet de gérer mes fichiers à distance via l’application Nextcloud sur mon smartphone. Voici comment le processus fonctionne :

  • Pour les fichiers audio : J’enregistre des fichiers audio sur mon smartphone et je les copie dans un répertoire Nextcloud dédié à la transcription. Une fois le fichier synchronisé avec mon serveur, un script Python prend le relais pour effectuer la transcription.
  • Pour les vidéos YouTube : J’ai un autre répertoire dédié où je crée un fichier texte contenant l’URL de la vidéo YouTube que je souhaite transcrire. Ce fichier .txt est nommé en fonction du contenu de la vidéo. Une fois ce fichier synchronisé avec le serveur, le script télécharge la vidéo, en extrait l’audio, et génère la transcription.

3.2. Comment fonctionne le script d’automatisation ?

Voici les étapes détaillées du fonctionnement du script :

  1. Surveillance des répertoires Nextcloud : Le script surveille en continu les répertoires spécifiés dans Nextcloud, à la recherche de nouveaux fichiers audio ou de fichiers texte contenant des URL YouTube.
  2. Transcription automatique des fichiers audio : Dès qu’un fichier audio est détecté, il est transcrit en texte grâce à Whisper. Les résultats sont générés sous deux formats : .txt et .docx.
  3. Téléchargement et transcription des vidéos YouTube : Si un fichier .txt contenant une URL YouTube est détecté, le script télécharge la vidéo, en extrait l’audio avec yt-dlp, puis génère une transcription.
  4. Stockage des transcriptions : Une fois les transcriptions effectuées, elles sont sauvegardées dans un autre répertoire Nextcloud. Ces fichiers sont immédiatement accessibles via l’application Nextcloud sur mon smartphone.

4. Fonctionnement du script de transcription

Le script de transcription est au cœur de ce processus d’automatisation. Il gère la détection des fichiers audio ou des liens YouTube dans les répertoires surveillés, effectue la transcription via Whisper, et enregistre les résultats.

Python
import os
import time
import whisper
import torch
from docx import Document
import yt_dlp

# Dossiers source et destination
audio_folder = r"\\OMV\whisper\trans_audio"
text_folder = r"\\OMV\whisper\trans_texte"
video_folder = r"\\OMV\whisper\trans_video"
lock_file = os.path.join(audio_folder, "transcription.lock")

# Extensions audio supportées
audio_extensions = [".m4a", ".mp3", ".wav", ".flac"]

# Modèle Whisper à utiliser
model_name = "large-v3"
device = "cuda" if torch.cuda.is_available() else "cpu"
model = whisper.load_model(model_name, device=device)

# Fonction pour transcrire un fichier audio dans la langue d'origine
def transcribe_audio(file_path):
    print(f"Transcribing {file_path} in the original language...")
    result = model.transcribe(file_path)
    return result["text"]

# Fonction pour convertir .txt en .docx
def txt_to_docx(txt_path, docx_path):
    print(f"Converting {txt_path} to {docx_path}...")
    doc = Document()
    with open(txt_path, "r", encoding="utf-8") as f:
        text = f.read()
        doc.add_paragraph(text)
    doc.save(docx_path)

# Fonction pour télécharger la vidéo YouTube et renommer le fichier audio
def download_youtube_video(video_url, output_dir, output_file_base):
    ydl_opts = {
        'format': 'bestaudio/best',  # Télécharger la meilleure qualité audio disponible
        'outtmpl': os.path.join(output_dir, output_file_base + '.webm'),  # Utiliser le nom du fichier texte pour .webm
        'postprocessors': [{
            'key': 'FFmpegExtractAudio',
            'preferredcodec': 'mp3',  # Convertir en MP3
            'preferredquality': '192',
        }],
    }
    
    with yt_dlp.YoutubeDL(ydl_opts) as ydl:
        info_dict = ydl.extract_info(video_url, download=True)
        video_title = info_dict.get("title", "Untitled")  # Obtenir le titre de la vidéo
        audio_file = os.path.join(output_dir, output_file_base + '.mp3')  # Utiliser le même nom de base pour .mp3
        print(f"Downloaded and converted: {audio_file}")
        return audio_file, video_title

# Fonction principale pour scanner le dossier et traiter les fichiers
def scan_and_process():
    while True:
        # Si une transcription est en cours, attendre
        if os.path.exists(lock_file):
            print("Transcription en cours. Attente de 5 minutes avant de scanner à nouveau...")
            time.sleep(300)  # 5 minutes
            continue

        # Vérifier si le fichier d'arrêt existe
        stop_file = os.path.join(audio_folder, "stop.txt")
        if os.path.exists(stop_file):
            print("Stop file detected. Exiting the script...")

            # Renommer le fichier stop.txt en no_stop.txt
            no_stop_file = os.path.join(audio_folder, "no_stop.txt")
            os.rename(stop_file, no_stop_file)

            # Sortir du script après l'arrêt
            break

        # Créer un fichier de verrouillage
        with open(lock_file, "w") as lock:
            lock.write("locked")

        try:
            # Scanner le dossier des fichiers audio
            for file_name in os.listdir(audio_folder):
                if any(file_name.endswith(ext) for ext in audio_extensions):
                    audio_path = os.path.join(audio_folder, file_name)
                    txt_file_name = os.path.splitext(file_name)[0] + ".txt"
                    txt_path = os.path.join(text_folder, txt_file_name)
                    
                    # Vérifie si le fichier .txt existe déjà
                    if not os.path.exists(txt_path):
                        # Transcrire le fichier audio en texte
                        text = transcribe_audio(audio_path)
                        
                        # Enregistrer le texte dans un fichier .txt
                        with open(txt_path, "w", encoding="utf-8") as txt_file:
                            txt_file.write(text)
                        
                        # Convertir le fichier .txt en .docx
                        docx_file_name = txt_file_name.replace(".txt", ".docx")
                        docx_path = os.path.join(text_folder, docx_file_name)
                        txt_to_docx(txt_path, docx_path)
                    else:
                        print(f"Transcript for {file_name} already exists.")

            # Scanner le dossier des fichiers vidéos (liens YouTube)
            for file_name in os.listdir(video_folder):
                if file_name.endswith(".txt"):
                    link_path = os.path.join(video_folder, file_name)
                    with open(link_path, "r") as link_file:
                        video_url = link_file.readline().strip()

                        # Nom du fichier de transcription basé sur le nom du fichier .txt déposé
                        base_name = os.path.splitext(file_name)[0]
                        txt_file_name = base_name + ".txt"
                        txt_path = os.path.join(text_folder, txt_file_name)
                        docx_file_name = base_name + ".docx"
                        docx_path = os.path.join(text_folder, docx_file_name)
                        mp3_file_name = base_name + ".mp3"
                        mp3_path = os.path.join(audio_folder, mp3_file_name)

                        # Vérifie si un fichier .mp3, .txt ou .docx existe déjà
                        if os.path.exists(mp3_path) or os.path.exists(txt_path) or os.path.exists(docx_path):
                            print(f"Transcript or audio file for {base_name} already exists. Skipping.")
                        else:
                            # Télécharge la vidéo YouTube et récupère le chemin de l'audio et le titre de la vidéo
                            audio_path, video_title = download_youtube_video(video_url, audio_folder, base_name)
                            
                            # Transcrire l'audio en texte
                            text = transcribe_audio(audio_path)

                            # Créer la transcription avec le titre, l'URL et le texte transcrit
                            transcription_with_metadata = f"{video_title}\n{video_url}\n\n{text}"
                            
                            # Enregistrer le texte avec le titre et l'URL dans un fichier .txt
                            with open(txt_path, "w", encoding="utf-8") as txt_file:
                                txt_file.write(transcription_with_metadata)
                            
                            # Convertir le fichier .txt en .docx
                            txt_to_docx(txt_path, docx_path)
                            
                            # Supprimer la vidéo téléchargée après traitement
                            webm_file = os.path.join(audio_folder, base_name + '.webm')
                            if os.path.exists(webm_file):
                                os.remove(webm_file)
                                print(f"Deleted temporary file: {webm_file}")

        except Exception as e:
            print(f"Error occurred: {e}. Retrying in 2 minutes...")
            time.sleep(60)  # Attendre 1 minute avant de réessayer

        # Supprimer le fichier de verrouillage une fois terminé
        os.remove(lock_file)

        # Attendre 5 minutes avant de refaire une vérification
        print("Waiting for 5 minutes...")
        time.sleep(300)

# Lancer le processus
if __name__ == "__main__":
    scan_and_process()
Python

Étapes clés du script :

  1. Surveillance des répertoires Nextcloud
    • Le script surveille le répertoire des fichiers audio et des vidéos.
    • Dès qu’un fichier audio ou un fichier .txt contenant une URL YouTube est détecté, le script commence le traitement.
  2. Transcription des fichiers audio
    • Si un fichier audio est trouvé, le script utilise Whisper pour générer une transcription en texte.
    • Les fichiers .txt et .docx sont ensuite sauvegardés dans le répertoire cloud.
  3. Téléchargement et transcription des vidéos YouTube
    • Pour les vidéos, le script télécharge la vidéo via yt-dlp, extrait l’audio, puis génère une transcription similaire à celle des fichiers audio.
  4. Gestion des logs et des fichiers de sortie
    • Le script journalise les événements dans des fichiers log (start_log.txt, script_log.txt) pour un suivi des actions.
    • Les transcriptions sont enregistrées dans les formats .txt et .docx dans un répertoire dédié.

5. Conclusion

Grâce à l’intégration de Whisper, Nextcloud et un script Python d’automatisation, j’ai réussi à créer un système efficace pour gérer mes transcriptions de fichiers audio et de vidéos YouTube. Ce flux de travail me permet de gérer mes fichiers en toute simplicité depuis mon smartphone, avec une synchronisation fluide via Nextcloud. Que vous ayez besoin de transcrire des podcasts, des notes vocales