Zum Inhalt springen

Whisper: Automatische Transkription von Videos in Text

    In diesem Beitrag erkläre ich dir, wie du Whisper, ein KI-basiertes Tool von OpenAI, zur automatischen Transkription von Videos verwenden kannst. Whisper ist in der Lage, gesprochene Sprache in verschiedenen Sprachen – einschließlich Deutsch – präzise in Text umzuwandeln. Damit eignet es sich hervorragend, um z. B. Interviews, Vorträge oder persönliche Videos zu transkribieren.

    Python 3.10 installieren

    Whisper setzt die Programmiersprache Python voraus und benötigt eine Version zwischen 3.7 und 3.10. In dieser Anleitung verwenden wir Python 3.10, um Kompatibilitätsprobleme zu vermeiden.

    Falls Windows-Sicherheit die Ausführung von python.exe blockiert, kannst du Python manuell als zulässige App hinzufügen:

    Eine virtuelle Umgebung (whisper-env) einrichten

    Whisper benötigt verschiedene Bibliotheken (wie torch für maschinelles Lernen, ffmpeg zur Audioverarbeitung und einige weitere Python-Pakete). Wenn du diese Pakete direkt in deinem globalen Python-Umfeld installieren würdest, könnten sie mit anderen Projekten, die möglicherweise andere Versionen dieser Bibliotheken benötigen, in Konflikt geraten. Eine virtuelle Umgebung hält alle benötigten Abhängigkeiten getrennt, sodass sie nur für Whisper gelten.

    cd C:\Users\Benutzername\Videos\
    mkdir whisper
    Projektordner erstellen

    Erstelle nun die virtuelle Umgebung mit dem Namen whisper-env im Projektordner, wodurch ein neuer Ordner namens whisper-env im Projektverzeichnis erstellt wird, der die isolierte Python-Umgebung enthält, in der alle Pakete für Whisper installiert werden.

    cd whisper
    python -m venv whisper-env
    Virtuelle Umgebung erstellen

    Um die virtuelle Umgebung zu nutzen, musst du sie aktivieren. Nach der Aktivierung zeigt der Prompt (whisper-env), dass die virtuelle Umgebung aktiv ist. Alle folgenden Python-Befehle (z. B. pip install) gelten nur für diese Umgebung, solange sie aktiv ist.

    C:\Users\Benutzername\Videos\whisper\whisper-env\Scripts\Activate
    Virtuelle Umgebung aktivieren

    Jetzt kannst du Whisper und alle notwendigen Abhängigkeiten in die virtuelle Umgebung installieren, ohne dass sie dein globales System beeinflussen.

    C:\Users\Benutzername\Videos\whisper\whisper-env\
    pip install openai-whisper
    Whisper in der virtuellen Umgebung installieren

    Falls bei der Installation Fehler auftreten sollten, dass fehlen eventuell weitere Abhängigkeiten bzw. Tools. Diese kannst du wie folgt installieren:

    pip install --upgrade setuptools wheel
    Problemlösung

    Falls eine Fehlermeldung zur Skriptausführung erscheint, passe die PowerShell-Sicherheitsrichtlinie an:

    Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
    Problemlösung

    ffmpeg installieren und zum Systempfad hinzufügenx

    Whisper benötigt ffmpeg, um Audio aus Videodateien zu extrahieren. Hier sind die Schritte zur Installation von ffmpeg. Die benötigte Datei „ffmpeg-release-essentials.zip“ kannst du auf der offiziellen Webseite downloaden. Anschließend muss der bin Ordner (C:\tools\ffmpeg-7.1-essentials_build\bin) innerhalb der Umgebungsvariable als Pfad hinzugefügt werden. Die ffmpeg Version kannst du dir anschließnd wie folgt anzeigen lassen:

    ffmpeg -version
    ffmpeg Version

    Whisper zur Transkription verwenden

    In dem zuvor erstelltem Projektordner „whisper“ habe ich die folgenden Ordner erstellt:

    • quelle: Dieser Ordner enthält die Videodateien, die transkribiert werden sollen.
    • transkript: Hier wird das fertige Transkript gespeichert.
    • whisper-env: Dies ist der Ordner mit der virtuellen Umgebung, in der Whisper installiert wurde.

    Mit dem folgenden Kommando kannst du die Datei Video1.mkv aus dem Ordner quelle transkribieren und das Transkript ohne Zeitstempel im Ordner transkript speichern.

    python -m whisper "C:\Users\Benutzername\Videos\whisper\quelle\Video1.mkv" --language German --output_format txt --output_dir "C:\Users\Benutzername\Videos\whisper\transkript"
    Transkript Kommando
    • "C:\Users\Benutzername\Videos\whisper\quelle\Video1.mkv": Der Pfad zur Videodatei, die transkribiert werden soll.
    • --language German: Gibt an, dass das Video auf Deutsch ist, damit Whisper die richtige Sprache verwendet.
    • --output_format txt: Speichert das Transkript als reine Textdatei (.txt) ohne Zeitstempel.
    • --output_dir "C:\Users\Benutzername\Videos\whisper\transkript": Gibt an, dass die Textdatei im Ordner transkript gespeichert wird.

    Virtuelle Umgebung beenden

    Nach Abschluss der Transkription kannst du die virtuelle Umgebung deaktivieren. Gib dazu einfach den folgenden Befehl ein:

    deactivate

    Automatisierte Transkription mehrerer Videos

    Wenn du mehrere Videodateien im selben Ordner hast und diese automatisch transkribieren möchtest, ohne dass bereits verarbeitete Dateien erneut bearbeitet werden, kannst du das folgende Python-Skript verwenden. Das Skript durchsucht einen festgelegten Ordner nach neuen oder geänderten Videodateien, transkribiert diese und speichert die Ergebnisse als Textdateien in einem Zielordner. Die Transkripte haben denselben Namen wie die Videodateien und enthalten nur den reinen Text ohne Zeitstempel. Eine zusätzliche Verlaufsdatei stellt sicher, dass bereits verarbeitete Videos beim nächsten Durchlauf übersprungen werden. So kannst du das Skript regelmäßig ausführen und es verarbeitet automatisch nur die relevanten Dateien.

    import os
    import subprocess
    import json

    # Konfiguration: Pfade, Sprache und unterstützte Dateiendungen
    source_folder = r"C:\Users\Benutzername\Videos\whisper\quelle"
    target_folder = r"C:\Users\Benutzername\Videos\whisper\transkript"
    history_file = os.path.join(target_folder, "transkript_history.json")
    language = "German" # Sprache einstellen: "German" für Deutsch, "English" für Englisch
    supported_extensions = ('.mp4', '.mkv', '.avi') # Unterstützte Videodateiendungen

    # Stelle sicher, dass das Zielverzeichnis existiert
    os.makedirs(target_folder, exist_ok=True)

    # Lade die Verlaufsdaten, falls die Verlaufsdatei existiert
    if os.path.exists(history_file):
    with open(history_file, "r") as file:
    processed_files = json.load(file)
    else:
    processed_files = {}

    # Rekursive Funktion zum Durchsuchen von Verzeichnissen und Verarbeiten von Videos
    def process_videos_in_folder(folder):
    for root, _, files in os.walk(folder):
    for file in files:
    # Nur Dateien mit den unterstützten Endungen verarbeiten
    if not file.endswith(supported_extensions):
    continue

    # Pfade für die Videodatei und das Ziel-Transkript erstellen
    video_path = os.path.join(root, file)
    relative_path = os.path.relpath(root, source_folder)
    output_folder = os.path.join(target_folder, relative_path)
    os.makedirs(output_folder, exist_ok=True)

    output_file = os.path.splitext(file)[0] ".txt"
    output_path = os.path.join(output_folder, output_file)

    # Überprüfe das Änderungsdatum der Datei
    video_mtime = os.path.getmtime(video_path)

    # Überprüfen, ob die Datei bereits verarbeitet wurde und ob das Änderungsdatum gleich ist
    if video_path in processed_files and processed_files[video_path] == video_mtime:
    print(f"Überspringe '{video_path}' (bereits verarbeitet).")
    continue

    # Whisper-Befehl für die Transkription
    command = [
    "python", "-m", "whisper", video_path,
    "--language", language, # Verwendet die eingestellte Sprache
    "--output_format", "txt",
    "--output_dir", output_folder
    ]

    print(f"Bearbeite '{video_path}' mit Spracheinstellung '{language}' ...")
    try:
    # Transkription starten
    subprocess.run(command, check=True, shell=True)
    print(f"Transkript für '{video_path}' gespeichert als '{output_path}'")

    # Nach erfolgreicher Verarbeitung das Änderungsdatum speichern
    processed_files[video_path] = video_mtime

    # Verlaufsdatei aktualisieren
    with open(history_file, "w") as file:
    json.dump(processed_files, file)
    except subprocess.CalledProcessError as e:
    print(f"Fehler bei der Verarbeitung von '{video_path}': {e}")

    # Starte die Verarbeitung im Quellordner
    process_videos_in_folder(source_folder)
    whisper_batch_transcription.py

    Führe das Skript mit folgendem Befehl aus:

    python whisper_batch_transcription.py

    Whisper mit dem Large-Modell und GPU-Unterstützung verwenden

    In diesem Abschnitt erfährst du, wie du das Large-Modell von Whisper optimal auf deiner NVIDIA-GPU nutzt, um die beste Transkriptionsgenauigkeit zu erzielen und gleichzeitig die Geschwindigkeit zu maximieren. Da das Large-Modell rechenintensiv ist, bietet sich die Verwendung einer GPU an, um die Verarbeitung deutlich zu beschleunigen.

    Bevor wir ins Detail gehen, sind einige grundlegende Begriffe zu klären.

    Was ist PyTorch (oder torch)?
    PyTorch ist eine Open-Source-Bibliothek für maschinelles Lernen, die hauptsächlich von Facebook AI entwickelt wurde. Sie bietet eine Vielzahl an Werkzeugen und Algorithmen für das Deep Learning und wird in der Programmiersprache Python verwendet.
    In deinem Fall nutzt Whisper PyTorch im Hintergrund als „Backend“, um die komplexen Berechnungen für die Transkription von Audio zu Text auszuführen. Wenn du Whisper installierst und nutzt, wird PyTorch automatisch im Hintergrund geladen – du musst dich also nicht direkt um PyTorch kümmern, sondern nur sicherstellen, dass es richtig installiert ist.

    Was ist torch?
    torch ist der Paketname für PyTorch in Python. Das heißt, wenn du im Python-Code import torch siehst, bezieht sich dies auf die PyTorch-Bibliothek. Der Name „torch“ wird verwendet, da PyTorch unter diesem Paketnamen in Python importiert wird.

    Was ist CUDA?
    CUDA (Compute Unified Device Architecture) ist eine Technologie und Programmierschnittstelle, die von NVIDIA entwickelt wurde. Sie ermöglicht es Programmen wie PyTorch, die Rechenleistung einer NVIDIA-GPU zu nutzen. GPUs sind besonders leistungsfähig bei parallelen Berechnungen, da sie viele Rechenoperationen gleichzeitig durchführen können. Wenn ein Modell wie Whisper große Mengen an Daten verarbeiten muss, kann CUDA die Rechenzeit erheblich verkürzen, indem es die GPU für die Berechnungen nutzt.
    Für PyTorch bedeutet dies, dass es CUDA verwenden kann, um Berechnungen auf einer NVIDIA-GPU statt auf der CPU laufen zu lassen, sofern eine solche GPU verfügbar ist und PyTorch mit CUDA-Unterstützung installiert ist.

    Installation von PyTorch mit CUDA-Unterstützung

    Damit deine GPU für Whisper genutzt werden kann, muss PyTorch mit CUDA-Unterstützung installiert sein. Ohne CUDA würde PyTorch nur die CPU verwenden, was langsamer ist. Führe den folgenden Befehl in der Kommandozeile aus, um PyTorch mit der passenden CUDA-Version zu installieren:

    pip install torch --extra-index-url https://download.pytorch.org/whl/cu118

    # Du kannst auch die Version vorgeben
    pip install torch==2.5.1 cu118 --extra-index-url https://download.pytorch.org/whl/cu118

    Um sicherzustellen, dass PyTorch mit CUDA-Unterstützung installiert ist und die GPU erkannt wird, kannst du das folgende Python-Skript ausführen. Es überprüft, ob CUDA verfügbar ist und zeigt die GPU-Informationen an.

    import torch

    # Überprüfen, ob CUDA verfügbar ist
    if torch.cuda.is_available():
    print("CUDA ist verfügbar! Die GPU kann verwendet werden.")
    print("CUDA Version:", torch.version.cuda)
    print("NVIDIA GPU Modell:", torch.cuda.get_device_name(0))
    else:
    print("CUDA ist nicht verfügbar. PyTorch verwendet die CPU.")
    CUDA_check.py

    In meinem Fall war CUDA nicht vorinstalliert. Die aktuelle Version könnt ihr auf der NVIDIA Webseite downloaden.

    Anschließend kannst du das Skript nochmal ausführen. Im Idealfall wird eine ähnliche Meldung angezeigt:

    Das Skript wurde um die Nutzung von „CUDA“ und „large model“ erweitert.

    import os
    import subprocess
    import json

    # Konfiguration: Pfade, Sprache, Modell und unterstützte Dateiendungen
    source_folder = r"C:\Users\Benutzername\Videos\whisper\quelle"
    target_folder = r"C:\Users\Benutzername\Videos\whisper\transkript"
    history_file = os.path.join(target_folder, "transkript_history.json")
    language = "German" # Sprache einstellen: "German" für Deutsch, "English" für Englisch
    model = "large" # Modell festlegen: z. B. "tiny", "base", "small", "medium", "large"
    supported_extensions = ('.mp4', '.mkv', '.avi') # Unterstützte Videodateiendungen

    # Stelle sicher, dass das Zielverzeichnis existiert
    os.makedirs(target_folder, exist_ok=True)

    # Lade die Verlaufsdaten, falls die Verlaufsdatei existiert
    if os.path.exists(history_file):
    with open(history_file, "r") as file:
    processed_files = json.load(file)
    else:
    processed_files = {}

    # Rekursive Funktion zum Durchsuchen von Verzeichnissen und Verarbeiten von Videos
    def process_videos_in_folder(folder):
    for root, _, files in os.walk(folder):
    for file in files:
    # Nur Dateien mit den unterstützten Endungen verarbeiten
    if not file.endswith(supported_extensions):
    continue

    # Pfade für die Videodatei und das Ziel-Transkript erstellen
    video_path = os.path.join(root, file)
    relative_path = os.path.relpath(root, source_folder)
    output_folder = os.path.join(target_folder, relative_path)
    os.makedirs(output_folder, exist_ok=True)

    output_file = os.path.splitext(file)[0] ".txt"
    output_path = os.path.join(output_folder, output_file)

    # Überprüfe das Änderungsdatum der Datei
    video_mtime = os.path.getmtime(video_path)

    # Überprüfen, ob die Datei bereits verarbeitet wurde und ob das Änderungsdatum gleich ist
    if video_path in processed_files and processed_files[video_path] == video_mtime:
    print(f"Überspringe '{video_path}' (bereits verarbeitet).")
    continue

    # Whisper-Befehl für die Transkription mit Large-Modell und GPU-Unterstützung
    command = [
    "python", "-m", "whisper", video_path,
    "--model", model, # Nutzt das festgelegte Modell (hier: "large")
    "--language", language, # Verwendet die eingestellte Sprache
    "--output_format", "txt",
    "--output_dir", output_folder,
    "--device", "cuda" # Nutzt die GPU (CUDA) für die Berechnungen
    ]

    print(f"Bearbeite '{video_path}' mit Modell '{model}', Spracheinstellung '{language}' ohne Zeitstempel auf der GPU ...")
    try:
    # Transkription starten
    subprocess.run(command, check=True, shell=True)
    print(f"Transkript für '{video_path}' gespeichert als '{output_path}'")

    # Nach erfolgreicher Verarbeitung das Änderungsdatum speichern
    processed_files[video_path] = video_mtime

    # Verlaufsdatei aktualisieren
    with open(history_file, "w") as file:
    json.dump(processed_files, file)
    except subprocess.CalledProcessError as e:
    print(f"Fehler bei der Verarbeitung von '{video_path}': {e}")

    # Starte die Verarbeitung im Quellordner
    process_videos_in_folder(source_folder)
    whisper_batch_transcription_CUDA.py

    Modelle und ihre Genauigkeit in verschiedenen Sprachen

    Die folgende Grafik von OpenAI zeigt die Genauigkeit der verschiedenen Whisper-Modelle in einer Vielzahl von Sprachen. Diese Leistungsmessung basiert auf WER (Word Error Rate) und CER (Character Error Rate), die auf den Common Voice 15 und Fleurs-Datensätzen evaluiert wurden. Jedes Modell von Whisper wurde für eine Reihe von Sprachen getestet, um seine Fähigkeit zur präzisen Transkription und seine Leistungsunterschiede je nach Sprache darzustellen. Zum Beispiel zeigt ein WER-Wert von 5,7 für Deutsch, dass das Modell pro 100 transkribierte Wörter etwa 5,7 Fehler macht, was eine relativ hohe Genauigkeit darstellt. Die Grafik gibt dir so eine gute Vorstellung davon, welches Modell in welcher Sprache besonders leistungsfähig ist.