Jak zrobić transkrypcję filmu do tekstu za pomocą FFmpeg i faster-whisper
Masz nagranie spotkania, rozmowy, webinaru albo filmu szkoleniowego i chcesz zamienić je na tekst. Można odpalić nagranie, zatrzymywać co kilka sekund i przepisywać ręcznie. Rozsądniej jest zrobić to automatycznie.
Notatka przed czytaniem
Po co robić transkrypcję?
Transkrypcja przydaje się wszędzie tam, gdzie nagranie zawiera wiedzę, decyzje albo ustalenia. W małej firmie bardzo często dotyczy to spotkań z klientami, szkoleń, webinarów, konsultacji i nagrań roboczych.
Można jej użyć do:
- przygotowania notatki po spotkaniu
- spisania rozmowy z klientem
- opracowania materiału z webinaru
- stworzenia szkicu artykułu z nagrania
- wyszukania konkretnych fragmentów rozmowy
- przygotowania listy zadań po spotkaniu
- archiwizacji wiedzy w firmie
Najważniejsze jest to, że transkrypcja nie musi być końcem procesu. Może być początkiem automatyzacji: z nagrania powstaje tekst, z tekstu streszczenie, ze streszczenia lista zadań, a z listy zadań konkretny proces w firmie.
Czego potrzebujesz?
Do przykładu użyjemy trzech rzeczy:
- FFmpeg, czyli narzędzia do pracy z audio i wideo
- Pythona
- biblioteki faster-whisper, która pozwala uruchomić model Whisper lokalnie
Zakładamy, że masz plik film.mp4 w folderze roboczym. W tym samym folderze utworzymy środowisko Pythona, plik audio i skrypt transkrypcji.
Źródła techniczne
Wpis opiera się na dokumentacji Microsoft Learn dla winget install, oficjalnej dokumentacji FFmpeg oraz README projektu faster-whisper.
Krok 1. Instalacja narzędzi
Na Windowsie FFmpeg można zainstalować przez Windows Package Manager, czyli winget. Microsoft opisuje komendę winget install, opcję --id oraz -e / --exact, która wymusza dokładne dopasowanie pakietu.
winget install --id Gyan.FFmpeg -e
python -m venv .venv
.venv\Scripts\activate
pip install faster-whisperCo tu się dzieje?
- winget install --id Gyan.FFmpeg -e instaluje FFmpeg z konkretnym identyfikatorem pakietu
- python -m venv .venv tworzy lokalne środowisko Pythona
- .venv\Scripts\activate aktywuje środowisko w PowerShellu
- pip install faster-whisper instaluje bibliotekę do transkrypcji
Krok 2. Zamiana filmu na audio
Do transkrypcji nie potrzebujemy obrazu. Model ma rozpoznawać mowę, więc najpierw przygotowujemy prosty plik audio.
ffmpeg -i "film.mp4" -vn -ac 1 -ar 16000 -c:a pcm_s16le "audio.wav"Ta komenda bierze plik film.mp4 i tworzy z niego plik audio.wav. FFmpeg używa opcji wejściowych i wyjściowych zależnie od ich miejsca w komendzie, więc kolejność ma znaczenie.
| Fragment | Znaczenie |
|---|---|
| ffmpeg | uruchamia program FFmpeg |
| -i "film.mp4" | wskazuje plik wejściowy |
| -vn | pomija obraz i zostawia audio |
| -ac 1 | ustawia jeden kanał audio, czyli mono |
| -ar 16000 | ustawia częstotliwość próbkowania na 16 kHz |
| -c:a pcm_s16le | zapisuje audio jako 16-bit PCM WAV |
| "audio.wav" | określa nazwę pliku wynikowego |
Dlaczego mono i 16 kHz? Do rozpoznawania mowy zwykle nie potrzebujemy stereo ani jakości muzycznej. Ważniejsze jest to, żeby głos był czytelny, a plik prosty do przetwarzania.
Opcjonalnie: start od konkretnego momentu filmu
Czasem nagranie ma kilka minut wstępu, ciszy, planszy tytułowej albo ustawiania mikrofonu. Wtedy nie trzeba przetwarzać całego filmu od początku.
Można użyć flagi -ss przed wejściem:
ffmpeg -ss 00:05:39 -i "film.mp4" -vn -ac 1 -ar 16000 -c:a pcm_s16le "audio.wav"W tym przykładzie FFmpeg zaczyna od momentu 00:05:39. To nie jest obowiązkowy element. Do standardowej transkrypcji całego filmu używamy wersji bez -ss.
Krok 3. Skrypt Pythona do transkrypcji
Utwórz plik transkrybuj.py w tym samym folderze, w którym znajduje się audio.wav.
from pathlib import Path
from faster_whisper import WhisperModel
AUDIO_FILE = Path("audio.wav")
OUTPUT_FILE = Path("transkrypcja.txt")
MODEL_NAME = "large-v3"
if not AUDIO_FILE.exists():
raise FileNotFoundError(f"Nie znaleziono pliku: {AUDIO_FILE}")
model = WhisperModel(MODEL_NAME, device="auto", compute_type="auto")
segments, info = model.transcribe(
str(AUDIO_FILE),
language="pl",
vad_filter=True,
)
print(f"Język: {info.language}, prawdopodobieństwo: {info.language_probability:.2f}")
with OUTPUT_FILE.open("w", encoding="utf-8") as file:
for segment in segments:
text = segment.text.strip()
if not text:
continue
line = f"[{segment.start:.2f} - {segment.end:.2f}] {text}"
print(line)
file.write(line + "\n")
print(f"Zapisano: {OUTPUT_FILE}")Po uruchomieniu skrypt zapisze wynik do pliku transkrypcja.txt. Każda linia będzie miała prosty format:
[12.34 - 18.90] Treść rozpoznanej wypowiedzi.Dzięki temu nie dostajesz tylko ściany tekstu, ale tekst ze znacznikami czasu. To jest wygodne, gdy trzeba wrócić do konkretnego fragmentu nagrania.
Co oznaczają ustawienia w skrypcie?
Najważniejsza linia tworzy model:
model = WhisperModel(MODEL_NAME, device="auto", compute_type="auto")MODEL_NAME = "large-v3" oznacza, że używamy dużego modelu Whisper. Jest dokładniejszy, ale może być ciężki dla słabszego komputera. Pierwsze uruchomienie może też potrwać, bo model musi zostać pobrany.
Jeżeli komputer nie daje rady albo transkrypcja trwa zbyt długo, zacznij od mniejszego modelu:
MODEL_NAME = "medium"albo:
MODEL_NAME = "small"Mniejsze modele zwykle działają szybciej, ale mogą robić więcej błędów, szczególnie przy gorszym dźwięku, kilku osobach mówiących naraz albo specjalistycznym słownictwie.
device="auto" pozwala bibliotece samodzielnie dobrać sposób uruchomienia modelu. Jeśli dostępna jest zgodna karta graficzna i środowisko jest poprawnie skonfigurowane, transkrypcja może działać szybciej. Jeśli nie, skrypt użyje procesora.
compute_type="auto" pozwala dobrać sposób obliczeń automatycznie. W praktyce wpływa to na wydajność, zużycie pamięci i zgodność ze sprzętem.
Transkrypcja i generator segments
W części transkrypcji mamy:
segments, info = model.transcribe(
str(AUDIO_FILE),
language="pl",
vad_filter=True,
)language="pl" mówi modelowi, że nagranie jest po polsku. Dzięki temu model nie musi zgadywać języka.
vad_filter=True włącza filtr wykrywania mowy. Narzędzie próbuje pominąć fragmenty bez wypowiedzi, na przykład ciszę albo dłuższe przerwy.
segments to kolejne fragmenty rozpoznanego tekstu. Każdy segment ma między innymi czas początku, czas końca i tekst wypowiedzi.
Ważny detal techniczny
W faster-whisper segments jest generatorem. To znaczy, że właściwa transkrypcja wykonuje się dopiero wtedy, gdy przechodzimy po segmentach w pętli for. Dlatego w tym skrypcie zapis do pliku odbywa się właśnie w pętli.
Jak uruchomić cały proces?
Zakładając, że masz w folderze pliki film.mp4 oraz transkrybuj.py, uruchom po kolei:
ffmpeg -i "film.mp4" -vn -ac 1 -ar 16000 -c:a pcm_s16le "audio.wav"
python transkrybuj.pyPo zakończeniu pracy powinien pojawić się plik:
transkrypcja.txtCo może pójść nie tak?
Komenda ffmpeg nie działa
Najpierw sprawdź, czy FFmpeg jest zainstalowany:
ffmpeg -versionJeżeli PowerShell nie rozpoznaje komendy, zamknij i otwórz terminal ponownie. Czasem system musi odświeżyć zmienną PATH po instalacji.
Python nie widzi biblioteki faster_whisper
Sprawdź, czy aktywowane jest środowisko .venv:
.venv\Scripts\activateDopiero potem instaluj bibliotekę:
pip install faster-whisperTranskrypcja trwa bardzo długo
To normalne przy dużych modelach i długich nagraniach. Spróbuj zmienić MODEL_NAME = "large-v3" na "medium" albo "small".
Wynik ma błędy
Automatyczna transkrypcja nie jest idealnym stenogramem. Jakość wyniku zależy od jakości nagrania.
- hałas w tle
- echo
- kilka osób mówiących naraz
- cichy mikrofon
- muzyka pod głosem
- specjalistyczne nazwy
- nazwiska i nazwy firm
Przy ważnych materiałach transkrypcję warto później przejrzeć ręcznie.
A co z danymi firmowymi?
Jeżeli transkrybujesz spotkania firmowe, rozmowy z klientami albo nagrania zawierające dane osobowe, trzeba uważać na dostęp do plików i miejsce przetwarzania danych.
Lokalne uruchomienie modelu ma tę zaletę, że plik audio nie musi być wysyłany do zewnętrznej usługi. To nie zwalnia jednak z myślenia o bezpieczeństwie. Pliki z nagraniami i transkrypcjami warto trzymać w uporządkowanym miejscu, z dostępem tylko dla osób, które faktycznie powinny je widzieć.
Co można z tym zrobić dalej?
Sam plik transkrypcja.txt jest użyteczny, ale największa wartość zaczyna się krok dalej.
Taki proces można rozbudować, na przykład:
- automatycznie pobierać nagrania z wybranego folderu
- robić transkrypcję nowych plików
- generować krótkie podsumowanie spotkania
- wyciągać decyzje i zadania
- zapisywać wynik do Google Drive
- tworzyć wpis w arkuszu albo CRM
- wysyłać notatkę e-mailem do zespołu
- budować bazę wiedzy z nagrań
Wtedy transkrypcja przestaje być jednorazowym skryptem. Staje się elementem procesu.
Podsumowanie
Do podstawowej transkrypcji filmu wystarczą trzy kroki:
- wyciągnąć audio z filmu przez FFmpeg
- przepuścić audio przez faster-whisper
- zapisać wynik do pliku tekstowego
To prosty przykład, ale dobrze pokazuje szerszy schemat automatyzacji: z nagrania robimy tekst, z tekstu wiedzę, a z wiedzy uporządkowany proces.
Chcesz zamienić nagrania w użyteczne notatki i zadania?
MorenaTech pomaga budować praktyczne procesy AI: transkrypcję nagrań, streszczenia spotkań, wyciąganie decyzji, listy zadań i uporządkowaną bazę wiedzy z firmowych materiałów.
Czytaj dalej w sekcji Techniczna
Git przy pracy z AI: jak nie stracić kontroli nad projektem
AI przyspiesza zmiany w kodzie, ale Git pozwala sprawdzić diff, pracować na branchu, zapisywać decyzje w commitach i nie zamieniać projektu w serię przypadkowych eksperymentów.
MAPI-local-medium: lokalny serwer MCP, który daje modelowi pamięć, narzędzia i granice
Techniczne wyjaśnienie, czym jest MAPI-local-medium: lokalny serwer MCP, który pozwala modelowi językowemu korzystać z pamięci projektowej, narzędzi, bootstrapu kontekstu i kontrolowanego środowiska pracy.
Dlaczego AI potrzebuje pamięci. RAG to za mało, kiedy liczy się ciągłość pracy
Sama wyszukiwarka kontekstu nie wystarcza, gdy AI ma pracować dłużej niż kilka minut. Zobacz, po co asystentowi pamięć, czym różni się od RAG i dlaczego bez niej wiele wdrożeń kończy się operacyjną amnezją.