Whisper AI do transkrypcji wideo

implementacje

Przedstawiony kod implementuje kompleksowe rozwiązanie do automatycznej transkrypcji plików multimedialnych z generacją napisów SRT, wykorzystujące najnowsze osiągnięcia w dziedzinie rozpoznawania mowy. System integruje model Whisper Turbo firmy OpenAI z infrastrukturą przetwarzania multimedialnego, oferując wydajną konwersję mowy na tekst z dokładnym oznaczeniem czasowym.

Wymagania techniczne

System wymaga następujących komponentów:

KomponentWersjaCel
Python3.8+Środowisko wykonawcze
Whisper2024.10+Model transkrypcji
FFmpeg7.1+Przetwarzanie multimediów
PyTorch2.3+Inferencja modeli ML

Instrukcja implementacji

Krok 1: Przygotowanie środowiska

Instalacja potrzebnych zależności może się różnić np. instalacja ffmpeg dla ubuntu

Bash
sudo apt update && sudo apt install -y ffmpeg python3-pip 

Gdzie dla systemów Windows wygląda to inaczej, musimy pobrać ffmpeg z oficjalnej strony projektu.

Następnie pobrane archiwum należy wypakować w wybrane przez siebie miejsce na dysku i dodać ścieżkę ffmpeg do pliku exe (folder ffmpeg/bin/) do zmiennej środowiskowej a zrobimy to korzystając z wyszukiwarki

a następnie dodając ścieżkę do folderu w PATH

Krok 2: Instalacja pakietów Python

Bash
 pip install openai-whisper

Krok 3: Implementacja.

Python
import os
import platform
import subprocess
import sys
import whisper
import torch

def check_ffmpeg_installed():
    try:
        subprocess.run(["ffmpeg", "-version"], check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        return True
    except (subprocess.CalledProcessError, FileNotFoundError):
        return False

def get_os_specific_instructions():
    current_os = platform.system()
    instructions = {
        "Darwin": "\n\033[94mBrew install command:\nbrew install ffmpeg\033[0m",
        "Windows": "\n\033[94mChocolatey install command:\nchoco install ffmpeg\n\nScoop install command:\nscoop install ffmpeg\033[0m",
        "Linux": "\n\033[94mAPT install command:\nsudo apt install ffmpeg\033[0m"
    }
    return instructions.get(current_os, "Please install FFmpeg for your operating system")

def format_timestamp(seconds):
    hrs = int(seconds // 3600)
    mins = int((seconds % 3600) // 60)
    secs = int(seconds % 60)
    msecs = int((seconds - int(seconds)) * 1000)
    return f"{hrs:02}:{mins:02}:{secs:02},{msecs:03}"

def validate_file_path(file_path):
    if not os.path.isfile(file_path):
        raise FileNotFoundError(f"Input file not found: {file_path}")
    if not file_path.lower().endswith(('.mp4', '.avi', '.mov', '.mkv', '.mp3', '.wav', '.flac')):
        raise ValueError("Unsupported file format. Please provide a video or audio file")

def optimize_system_settings():
    if torch.cuda.is_available():
        torch.backends.cudnn.benchmark = True
        torch.set_num_threads(4)


def preprocess_audio(file_path):
    temp_file = "temp_audio.wav"
    cmd = [
        "ffmpeg",
        "-y", "-i", file_path,
        "-ac", "1", "-ar", "16000",
        "-c:a", "pcm_s16le",
        "-hide_banner", "-loglevel", "error",
        temp_file
    ]
    subprocess.run(cmd, check=True)
    return temp_file



def main():
    try:
        # Detect operating system
        current_os = platform.system()
        print(f"\033[1mDetected operating system: {current_os}\033[0m")

        # Check FFmpeg installation
        if not check_ffmpeg_installed():
            print("\033[91mFFmpeg is not installed or not in system PATH\033[0m")
            print(get_os_specific_instructions())
            return

        # Optimize system settings
        optimize_system_settings()

        # Load Whisper Turbo model
        print("\n\033[93mLoading Whisper Turbo model... (Initial download may take several minutes)\033[0m")
        model = whisper.load_model("turbo")
        
        # Get input file path
        file_path = input("\n\033[1mEnter path to media file: \033[0m").strip()
        validate_file_path(file_path)

        # Preprocess audio
        preprocessed_file_path = preprocess_audio(file_path)

        # Transcribe content
        print("\n\033[96mStarting transcription...\033[0m")
        result = model.transcribe(preprocessed_file_path, task='transcribe')

        # Save results as SRT subtitles
        base_name = os.path.splitext(os.path.basename(file_path))[0]
        output_file = f"{base_name}.srt"
        with open(output_file, "w", encoding="utf-8") as f:
            for i, segment in enumerate(result.get("segments", []), start=1):
                start = format_timestamp(segment["start"])
                end = format_timestamp(segment["end"])
                text = segment["text"].strip()
                f.write(f"{i}\n{start} --> {end}\n{text}\n\n")

        print(f"\n\033[1;92mTranscription complete! Saved to:\033[0m {output_file}")
        print(f"\033[95mProcessing time: {result['segments'][-1]['end']:.1f}s\033[0m")

    except Exception as e:
        print(f"\n\033[91mError: {str(e)}\033[0m")
        sys.exit(1)

if __name__ == "__main__":
    main()

Implementacja zawiera następujące funkcje:

  • check_ffmpeg_installed() – która sprawdzaczy ffmpeg jest zainstalowane
  • get_os_specific_instructions() – sprawdza na jakim systemie jest uruchomione(Windows,Linux,MacOS)
  • format_timestamp() – tworzący timestampy dla formatu srt
  • validate_file_path() – sprawdzający format pliku
  • main() – realizujący całą logikę projektu.
  • preprocess_audio() – przygotowywujący audio pod transkrypcje
  • optimize_system_settings() – wybierający najlepszą opcje dla wykrytej konfiguracji

Uruchomienie i działanie

W terminalu uruchamiamy poprzez komendę

Bash
python transcribe_whisper.py

Nastąpi wtedy pobranie modelu whisper turbo i po poprawnym pobraniu zostanie wyświetlony komunikat o podaniu ścieżki do filmu gdzie po tym nastąpi transkrypcja.

prędkość transkrypcji jest zależna od sprzętu i materiału oraz języka w materiale źródłowym, jeśli chcesz przeczytać więcej na ten temat zapraszam do wątku na githubie.

Repozytorium

Implementacja jest dostępna też na githubie pod adresem.
Dodatkowo jest tam też implementacja pod sam dźwięk.

Źródło:

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Powiązane posty

Zacznij wpisywać wyszukiwane hasło powyżej i naciśnij Enter, aby wyszukać. Naciśnij ESC, aby anulować.

Powrót do góry
Hej. Nie zapomnij podzielić się opinią oraz udostępnić dalej.