Transcriere audio offline cu Whisper, pas cu pas
Transcrierea audio offline cu Whisper păstrează înregistrarea pe calculatorul tău. Convertești în 16 kHz mono cu FFmpeg, rulezi faster-whisper pe GPU sau CPU și exporți TXT, SRT sau VTT, cu vorbitori marcați prin pyannote.

Transcriere audio offline cu Whisper înseamnă că rulezi un model deschis de speech-to-text pe propriul calculator, deci înregistrarea nu pleacă de pe el. Cea mai rapidă cale este faster-whisper: convertești sunetul în 16 kHz mono cu FFmpeg, încarci un model precum large-v3 pe GPU, în float16, sau unul mai mic pe CPU, în int8, și scrii TXT, SRT sau VTT. Adaugă pyannote sau WhisperX când vrei să știi cine a vorbit.
De ce să transcrii audio local?
Interviurile, ședințele, cursurile și apelurile cu clienți conțin adesea date personale sau confidențiale. Un flux local nu are pas de încărcare pe un server. Modelul se descarcă o dată, iar după ce e în cache, transcrierea în sine nu are nevoie de rețea. Nu plătești nici pe minut, pentru că plătești în hardware și în timp de configurare. Codul și ponderile Whisper sunt publicate sub licența MIT, care permite acest lucru. Serviciile din cloud pot fi potrivite pentru audio care nu e sensibil. Dacă folosești unul, citește mai întâi termenii lui de utilizare a datelor, înainte să încarci ceva.
Whisper, faster-whisper sau WhisperX: pe care îl alegi?
| Unealtă | Ce este | O alegi când |
|---|---|---|
| openai/whisper | Implementarea de referință în PyTorch, cu licență MIT. Cere instalat utilitarul ffmpeg. | Vrei comportamentul original și linia lui de comandă, de exemplu whisper audio.mp3 --model turbo. |
| faster-whisper | O reimplementare pe CTranslate2, cu tipurile de calcul float16, int8_float16 și int8. Decodează sunetul cu PyAV. | Vrei consum mai mic de memorie și un API Python curat. Este alegerea implicită de mai jos. |
| WhisperX | Adaugă marcaje de timp pe cuvânt prin aliniere forțată cu wav2vec2 și diarizare a vorbitorilor prin pyannote. | Ai nevoie de sincronizare precisă pe cuvânt și de etichete de vorbitor dintr-o singură comandă. |
Viteza și acuratețea depind de sunetul tău și de hardware. README-ul faster-whisper publică tabele de benchmark, iar mutarea sensată este să cronometrezi două minute din propriile înregistrări, pe propriul calculator.
Ce hardware îți trebuie?
README-ul Whisper listează VRAM aproximativ pentru implementarea originală. Ia cifrele drept ghid de dimensionare, pentru că modelele faster-whisper cuantizate cer mai puțin.
| Model | Parametri | VRAM în README | Variantă doar engleză |
|---|---|---|---|
| tiny | 39M | circa 1 GB | tiny.en |
| base | 74M | circa 1 GB | base.en |
| small | 244M | circa 2 GB | small.en |
| medium | 769M | circa 5 GB | medium.en |
| large | 1550M | circa 10 GB | nu există |
| turbo | 809M | circa 6 GB | nu există |
GPU sau CPU?
Un GPU NVIDIA este varianta rapidă. faster-whisper cere cuBLAS și cuDNN 9 pentru CUDA 12 pe GPU. Merge și pe CPU. Alege small sau medium, folosește compute_type="int8" și setează numărul de fire cu OMP_NUM_THREADS. Un CPU durează mult mai mult decât un GPU, așa că măsoară înainte să pui un folder în coadă.
Ce schimbă cuantizarea?
faster-whisper acceptă float16, int8_float16 și int8. Folosește float16 pe GPU implicit, int8_float16 când memoria GPU e la limită și int8 pe CPU. O precizie mai mică consumă mai puțină memorie și poate schimba câteva cuvinte, deci compară rezultatul pe sunetul tău înainte să te fixezi pe o setare.
Cum pregătești sunetul cu FFmpeg?
Whisper lucrează pe sunet mono de 16 kHz, în ferestre de 30 de secunde. Încărcătorul lui apelează ffmpeg cu -ac 1 -ar 16000. Dacă convertești tu fișierul, obții o intrare previzibilă, dispare orice pistă video și poți verifica rezultatul.
ffmpeg -i interview.m4a -vn -ac 1 -ar 16000 interview.wav-vn elimină video, -ac 1 face mixaj la mono, iar -ar 16000 reeșantionează la 16 kHz. Pentru înregistrări zgomotoase, DeepFilterNet este un cadru open-source de îmbunătățire a vocii pentru sunet la 48 kHz, cu comanda deep-filter. Rulează-l înainte să reeșantionezi la 16 kHz, apoi compară transcrierea cu și fără el, pentru că o filtrare agresivă poate înghiți vorbirea liniștită.
Cum transcrii pas cu pas cu faster-whisper?
- Creează un mediu virtual și instalează pachetul.
python -m venv .venv .venv\Scripts\activate pip install faster-whisper - Pe GPU, instalează cuBLAS și cuDNN 9 pentru CUDA 12. README-ul faster-whisper trimite către biblioteci gata făcute pentru Windows și Linux.
- Convertește sunetul cu comanda FFmpeg de mai sus.
- Salvează scriptul de mai jos ca
transcribe.pyși ruleazăpython transcribe.py interviu.wav. Scrie TXT, SRT, VTT și JSON lângă fișierul audio.
import json
import sys
from pathlib import Path
from faster_whisper import WhisperModel
audio = Path(sys.argv[1])
# GPU: large-v3 in float16. CPU: try "small" or "medium" with compute_type="int8".
model = WhisperModel("large-v3", device="cuda", compute_type="float16")
segments, info = model.transcribe(
str(audio), language="ro", beam_size=5, vad_filter=True, word_timestamps=True
)
def stamp(t, sep):
ms = round(t * 1000)
h, ms = divmod(ms, 3_600_000)
m, ms = divmod(ms, 60_000)
s, ms = divmod(ms, 1000)
return f"{h:02}:{m:02}:{s:02}{sep}{ms:03}"
rows = [
{"start": s.start, "end": s.end, "text": s.text.strip(),
"words": [{"w": w.word, "start": w.start, "end": w.end} for w in (s.words or [])]}
for s in segments # the generator runs here
]
out = audio.with_suffix("")
out.with_suffix(".txt").write_text("\n".join(r["text"] for r in rows), encoding="utf-8")
out.with_suffix(".srt").write_text(
"\n".join(f"{i}\n{stamp(r['start'], ',')} --> {stamp(r['end'], ',')}\n{r['text']}\n"
for i, r in enumerate(rows, 1)), encoding="utf-8")
out.with_suffix(".vtt").write_text(
"WEBVTT\n\n" + "\n".join(f"{stamp(r['start'], '.')} --> {stamp(r['end'], '.')}\n{r['text']}\n"
for r in rows), encoding="utf-8")
out.with_suffix(".json").write_text(json.dumps(rows, ensure_ascii=False, indent=2), encoding="utf-8")Contează două detalii. segments este un generator, deci transcrierea pornește abia când îl parcurgi. Iar vad_filter=True elimină tăcerile înainte de decodare. Schimbă language cu codul limbii din înregistrare, de exemplu en pentru engleză.
Ce faci dacă primești eroarea TypeError cu metadata_errors?
La momentul scrierii, în octombrie 2026, faster-whisper 1.2.1 eșuează cu TypeError: open() got an unexpected keyword argument 'metadata_errors' când este instalat PyAV 19, pentru că PyAV 19 a eliminat un argument pe care faster-whisper îl mai transmite. Problema este urmărită în issue-ul 1589 din faster-whisper. Fixarea unui PyAV mai vechi a rezolvat-o în testul nostru, cu versiunea 18.1.0.
pip install "av<19"Ce format de export alegi?
| Format | Pentru ce | Detaliu |
|---|---|---|
| TXT | Citit, citate, lipit în documente | Text simplu, un segment pe linie în scriptul de mai sus |
| SRT | Subtitrări în majoritatea editoarelor video | Cue-uri numerotate, virgulă înainte de milisecunde: 00:00:05,340 |
| VTT | Subtitrări pentru video pe web | Fișierul începe cu WEBVTT, punct înainte de milisecunde, UTF-8 |
| JSON | Căutare, analiză, uneltele tale | Segmente cu timpi pe cuvânt, plus un câmp de vorbitor dacă îl adaugi |
Specificația W3C WebVTT definește semnătura WEBVTT, formatul de timp 00:00:01.000 --> 00:00:04.000 și tipul text/vtt.
Cum obții etichete de vorbitor (diarizare)?
Whisper transcrie cuvinte și nu spune cine a vorbit. Diarizarea vorbitorilor este un model separat. pyannote.audio este un set de unelte Python cu licență MIT pentru asta. Pipeline-ul lui primește un fișier audio și întoarce intervale de timp etichetate SPEAKER_00, SPEAKER_01 și așa mai departe. Ai nevoie de un token de acces Hugging Face și trebuie să accepți mai întâi condițiile modelului pe Hugging Face. Exemplul din README arată așa.
import torch
from pyannote.audio import Pipeline
pipeline = Pipeline.from_pretrained(
"pyannote/speaker-diarization-community-1",
token="HUGGINGFACE_ACCESS_TOKEN")
pipeline.to(torch.device("cuda"))
output = pipeline("audio.wav")Ca să combini cele două rezultate, dă fiecărui segment Whisper vorbitorul ale cărui intervale îl acoperă cel mai mult. WhisperX face alinierea și diarizarea pentru tine.
whisperx path/to/audio.wav --model large-v2 --diarize --hf_token YOUR_TOKENPăstrează așteptări realiste. README-ul WhisperX spune că vorbirea suprapusă nu e tratată deosebit de bine și că diarizarea este departe de a fi perfectă. Ascultă un eșantion, apoi redenumește singur etichetele generice. Dacă memoria GPU e la limită, eliberează modelul Whisper înainte să încarci pipeline-ul de diarizare.
Cum obții rezultate bune cu Whisper în română și cu sunet zgomotos?
- Setează limba. Fără limbă dată, Whisper o detectează din cel mult primele 30 de secunde, iar o introducere zgomotoasă poate induce în eroare ghicirea. Transmite
language="ro". - Folosește cel mai mare model care încape. Româna este în lista de limbi Whisper. Fișa modelului spune că acuratețea variază pe limbi și scade pentru limbile cu mai puține date de antrenare, deci testează pe propriile înregistrări.
- Dă un prompt cu vocabular.
initial_promptacceptă vocabular propriu și nume proprii, iar faster-whisper oferă șihotwords. Înșiră nume, locuri și termeni tehnici din înregistrare. - Taie tăcerile. Fișa modelului avertizează că Whisper poate scoate text care nu a fost rostit și se poate repeta.
vad_filter=Trueajută la porțiunile fără voce. - Rupe buclele de repetiție. Setează
condition_on_previous_text=False. Documentația din codul Whisper spune că așa modelul se blochează mai rar, cu prețul unei consistențe mai mici între ferestre. - Încearcă un model ajustat. Pe Hugging Face există modele Whisper ajustate pentru română de către comunitate. Verifică licența și datele de antrenare ale fiecăruia și compară-l cu modelul standard pe sunetul tău.
La final, verifică diacriticele. O trecere scurtă face textul să folosească uniform ș și ț cu virgulă dedesubt.
fix = str.maketrans({"\u015f": "\u0219", "\u0163": "\u021b", "\u015e": "\u0218", "\u0162": "\u021a"})
text = text.translate(fix) # cedilla s and t become comma-below ș and țVerifică mereu numele, cifrele și datele, și rulează un clip de două minute înainte să pornești un lot lung. Același lucru e valabil pentru transcriere interviuri: ascultă o parte din rezultat înainte să ai încredere în tot.
Ce adaugă AI Transcription Studio peste toate astea?
AI Transcription Studio este o aplicație desktop Danube Labs aflată în dezvoltare. Are cod închis și nu a fost lansată, deci rândurile de față descriu ce este construită să facă. Strânge pașii de mai sus într-o singură interfață. Alegi motorul dintre Faster-Whisper pentru viteză, WhisperX pentru sincronizare precisă pe cuvânt și OpenAI Whisper ca rezervă. Diarizarea cu Pyannote stă în același loc, iar conversia audio și video prin FFmpeg este automată, cu reducere opțională a zgomotului prin DeepFilterNet. O coadă de lucru preia foldere întregi, se poate opri și relua, sare peste fișierele deja terminate și continuă când un fișier eșuează. Rezultatele se exportă în TXT, JSON, SRT și VTT, iar totul rulează local pe GPU sau CPU, cu memoria GPU eliberată între transcriere și diarizare. Nu publicăm încă cifre de acuratețe.
Vrei un flux privat de transcriere construit pentru tine?
Dacă vrei un flux privat de transcriere automată în română construit în jurul înregistrărilor tale, vezi sisteme AI sau programează un apel introductiv gratuit. După ce ai transcrierea, traducerea ei este o altă sarcină, tratată în ghidul nostru despre traducerea documentelor cu AI.
Întrebări frecvente
- Poate rula Whisper offline?
- Da. Descarci o dată ponderile modelului, iar apoi transcrierea rulează pe calculatorul tău, fără să trimită sunetul nicăieri. Codul și ponderile Whisper au licență MIT. Ai nevoie de Python, de suficientă memorie RAM sau VRAM pentru modelul ales și de FFmpeg sau, cu faster-whisper, de decodorul PyAV inclus pentru a citi fișierele audio.
- Am nevoie de GPU pentru transcriere locală cu Whisper?
- Nu. faster-whisper rulează pe CPU cu compute_type int8 și un model mai mic, precum small sau medium. Un GPU NVIDIA cu cuBLAS și cuDNN 9 pentru CUDA 12 îl face mult mai rapid. Testează un eșantion de două minute pe hardware-ul tău ca să vezi cât durează o înregistrare întreagă.
- Cum adaug etichete de vorbitor la o transcriere Whisper?
- Whisper nu identifică vorbitorii. Rulează un model de diarizare precum pyannote.audio, care cere un token Hugging Face, sau folosește WhisperX cu opțiunea de diarizare. Apoi dă fiecărui segment vorbitorul ale cărui intervale îl acoperă cel mai mult. Așteaptă-te la greșeli acolo unde oamenii vorbesc unul peste altul.
- Ce format audio cere Whisper?
- Whisper procesează sunet mono de 16 kHz în ferestre de 30 de secunde, iar încărcătorul lui convertește formatele uzuale prin ffmpeg. Pentru o intrare previzibilă, convertește mai întâi cu ffmpeg -i in.m4a -vn -ac 1 -ar 16000 out.wav. Comanda elimină video, face mixaj la mono și reeșantionează la 16 kHz.
- Funcționează bine Whisper în română?
- Româna este în lista de limbi Whisper, dar acuratețea variază în funcție de limbă și de calitatea sunetului, iar fișa modelului notează o acuratețe mai mică unde datele de antrenare sunt mai puține. Setează limba pe ro, folosește cel mai mare model pe care îl poți rula, dă un prompt cu nume și testează pe propriile înregistrări.
- Care este diferența dintre subtitrările SRT și VTT?
- Ambele sunt formate de subtitrări în text simplu. SRT numerotează fiecare cue și scrie milisecundele după o virgulă, ca în 00:00:05,340. WebVTT începe cu linia WEBVTT, folosește punct înainte de milisecunde, este UTF-8 și are tipul text/vtt, potrivit pentru video pe web.


