{"id":78,"date":"2026-06-17T21:30:00","date_gmt":"2026-06-17T21:30:00","guid":{"rendered":"https:\/\/rpi.temporiti.net\/wordpress\/?p=78"},"modified":"2026-06-18T16:03:04","modified_gmt":"2026-06-18T14:03:04","slug":"whisper-small-trascrizione","status":"publish","type":"post","link":"https:\/\/rpi.temporiti.net\/wordpress\/?p=78","title":{"rendered":"Trascrizione audio in italiano con faster-whisper small"},"content":{"rendered":"<p>I webinar tecnici su Kubernetes o Postgres sono materiale che riascoltare nei tempi morti non riesco quasi mai, ma che vorrei rileggere come testo per estrarre comandi citati, riferimenti a CVE e nomi di tool da approfondire dopo. Da qualche mese ho montato un piccolo flusso di sbobinatura locale basato su whisperx (faster-whisper small come motore). Niente cloud, niente upload, gira tutto sul mio host mentre faccio altro, e l&#8217;audio non lascia mai la macchina.<\/p>\n<p>Il punto che mi ha convinto \u00e8 la combinazione fra peso del modello e qualit\u00e0 sull&#8217;italiano parlato pulito. Il small in formato CTranslate2 sta sotto i 500 MB, e su una CPU con qualche anno sulle spalle gira a una velocit\u00e0 pi\u00f9 che ragionevole se gli si d\u00e0 la quantizzazione <code>int8<\/code>. La taglia \u00e8 il compromesso che uso per quasi tutto: italiano da microfono o registrazione di un webinar, qualche minuto di rumore di fondo accettabile.<\/p>\n<h2>Setup con whisperx<\/h2>\n<p>Tutto dentro un virtualenv dedicato, senza toccare i pacchetti di sistema. Su Debian 13 lato server la procedura \u00e8 la stessa che uso sul portatile.<\/p>\n<pre><code class=\"language-bash\">\nsudo apt install -y ffmpeg python3-venv\npython3 -m venv ~\/.venvs\/whisper\nsource ~\/.venvs\/whisper\/bin\/activate\npip install --upgrade pip\npip install whisperx\n<\/code><\/pre>\n<p>L&#8217;unica dipendenza di sistema \u00e8 <code>ffmpeg<\/code>, che whisperx invoca per normalizzare qualsiasi formato in PCM 16 kHz mono. Niente download manuale di pesi: il modello viene scaricato la prima volta in <code>~\/.cache\/huggingface\/hub\/<\/code> e da l\u00ec non si muove.<\/p>\n<p>Per sbobinare un webinar mi basta un comando, nella sua forma pi\u00f9 minimale. La regola che mi sono dato (e che rispetto sempre quando la macchina lavora mentre faccio altro) \u00e8 di limitare i thread a 8, cos\u00ec il sistema resta reattivo e la ventola non parte.<\/p>\n<pre><code class=\"language-bash\">\nwhisperx webinar-postgres.m4a \\\n  --model small \\\n  --language it \\\n  --compute_type int8 \\\n  --threads 8\n<\/code><\/pre>\n<p>whisperx scrive il transcript accanto all&#8217;audio (<code>webinar-postgres.txt<\/code>, oltre ai vari formati). I sottotitoli SRT non mi servono quasi mai: quello che voglio \u00e8 un riassunto sintetico di cosa \u00e8 stato detto, da incollare negli appunti. Siccome il transcript \u00e8 gi\u00e0 testo sul mio host, lo passo a un modello locale via Ollama, cos\u00ec anche il riassunto resta sulla macchina senza nessun upload.<\/p>\n<pre><code class=\"language-bash\">\nollama run qwen2.5:7b \"Riassumi questo webinar tecnico in punti elenco, \\\nmettendo in evidenza comandi citati, CVE e nomi di tool da approfondire:\n\n$(cat webinar-postgres.txt)\"\n<\/code><\/pre>\n<h2>Un esempio reale<\/h2>\n<p>Un caso tipico: la registrazione di un webinar tecnico su Postgres, durata 42 minuti, in un file <code>.m4a<\/code>. L&#8217;ho buttato nella cartella di lavoro e ho lanciato whisperx mentre continuavo a fare altro.<\/p>\n<p>Il portatile ci ha messo otto minuti a trascrivere quei 42, mantenendo gli otto thread sotto il limite. Nel frattempo ho continuato a scrivere i miei appunti in Markdown senza notare rallentamenti. Il testo finale era pulito al punto da poter fare <code>grep -i \"wal\"<\/code> per ritrovare al volo tutti i passaggi dove si discuteva dei segmenti WAL. Due refusi su sigle tecniche (<code>pgbouncer<\/code> diventato &#8220;pg buncer&#8221; un paio di volte), risolti con un <code>sed<\/code> veloce.<\/p>\n<h2>Cosa fa bene<\/h2>\n<p>Italiano tecnico parlato chiaramente, microfono decente, una persona alla volta o al massimo due con turni netti: il small fa un lavoro pulito, restituisce timestamp affidabili e gestisce bene gli inglesismi che noi sysadmin infiliamo ovunque (kubectl, ingress, statefulset, sidecar non lo confondono).<\/p>\n<h2>Cosa fa meno bene<\/h2>\n<p>Le sigle pronunciate lettera per lettera (TLS, mTLS, PVC, CIDR) le scrive a orecchio e va corretto. Sui nomi propri di persona inventa. Quando due voci si parlano sopra perde qualche secondo. Per audio veramente sporco passo al medium, che \u00e8 la prossima taglia.<\/p>\n<h2>Privacy &#8211; vantaggio del modello locale<\/h2>\n<p>Tutto gira sulla mia macchina. L&#8217;audio di un webinar o di una sessione tecnica, che potrebbe contenere riferimenti a stringhe di connessione, hostname o dettagli interni di infrastruttura, non lascia mai l&#8217;host. Confrontato con servizi cloud equivalenti come l&#8217;API Whisper di OpenAI, dove il file audio viene caricato e ha policy di retention che dipendono dal piano, qui non c&#8217;\u00e8 nessun trasferimento e nessuna policy di terzi a cui sottostare.<\/p>\n<p>I pesi del modello stanno in <code>~\/.cache\/huggingface\/hub\/models--Systran--faster-whisper-small\/<\/code> e si liberano con un <code>rm -rf<\/code> quando voglio fare spazio. Niente telemetria, niente upload, nessuna chiamata di rete una volta scaricato il modello.<\/p>\n<p>Sul fronte licenze: il modello Whisper di OpenAI \u00e8 MIT, faster-whisper come libreria \u00e8 MIT, il runtime CTranslate2 sotto \u00e8 MIT, whisperx come wrapper \u00e8 BSD-4 con dipendenze MIT\/Apache. Tutto stack permissivo, posso usarlo in qualsiasi contesto senza pormi domande di compatibilit\u00e0.<\/p>\n<h2>In pratica<\/h2>\n<p>Il flusso si \u00e8 incastrato bene nella mia giornata: prendo la registrazione di un webinar tecnico, la lascio trascrivere durante la pausa pranzo o mentre faccio altro, e ritrovo il testo grezzo in pochi minuti. Diventa l&#8217;input per i miei appunti, mai un output pubblicato senza riletture. Partire da un transcript pieno di timestamp mi ha tagliato parecchio il tempo di scrittura: ritrovare un passaggio e citarlo \u00e8 enormemente pi\u00f9 veloce che riascoltare tutto e prendere appunti a mano.<\/p>\n<hr>\n<blockquote>\n<p>Immagine generata con ComfyUI Mac M1 \/ RealVisXL V5 Lightning.<\/p>\n<\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>I webinar tecnici su Kubernetes o Postgres sono materiale che riascoltare nei tempi morti non riesco quasi mai, ma che vorrei rileggere come testo per estrarre comandi citati, riferimenti a CVE e nomi di tool da approfondire dopo. Da qualche mese ho montato un piccolo flusso di sbobinatura locale basato su whisperx (faster-whisper small come [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":79,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6],"tags":[],"class_list":["post-78","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ai-locale"],"_links":{"self":[{"href":"https:\/\/rpi.temporiti.net\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/78","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rpi.temporiti.net\/wordpress\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/rpi.temporiti.net\/wordpress\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/rpi.temporiti.net\/wordpress\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/rpi.temporiti.net\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=78"}],"version-history":[{"count":13,"href":"https:\/\/rpi.temporiti.net\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/78\/revisions"}],"predecessor-version":[{"id":395,"href":"https:\/\/rpi.temporiti.net\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/78\/revisions\/395"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/rpi.temporiti.net\/wordpress\/index.php?rest_route=\/wp\/v2\/media\/79"}],"wp:attachment":[{"href":"https:\/\/rpi.temporiti.net\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=78"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rpi.temporiti.net\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=78"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rpi.temporiti.net\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=78"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}