Tutti gli articoli

Ho clonato la mia voce per leggere questo blog in sei lingue

Ascolta l'articolo (sperimentale) · 10:21

00:00 / 10:21

Una piccola onda sonora a sinistra che si dispiega in sei nastri vocali paralleli, uno per lingua, tutti con la stessa forma d'onda

Questo sito pubblica in sei lingue: inglese, portoghese, spagnolo, tedesco, francese e italiano. Per un po' è stata una promessa fatta solo di testo. Potevi leggere qualsiasi articolo nella tua lingua, ma se volevi ascoltarlo in viaggio o mentre cucinavi, non c'era nessun play da premere. Aggiungere l'audio era il passo successivo ovvio. La domanda interessante era di chi dovesse essere la voce.

Primo round: una voce che va in produzione

La prima versione usava voci neurali text-to-speech gratuite, una per lingua. Era la prima mossa giusta: costo zero, pochi minuti per integrarle, e ha messo un player funzionante su ogni articolo. Metterla online è anche ciò che ha mostrato qual era la vera asticella. Le voci erano pulite ma formali, leggevano le mie frasi con la cadenza di qualcun altro, e un sito personale narrato da una voce di catalogo è un segnaposto. Sulla scrittura c'è il mio nome. Anche la voce che la legge dovrebbe essere la mia, comprese le cinque lingue che non narrerò di persona tanto presto.

La svolta: un modello locale che clona

Il tassello che ha reso tutto questo praticabile è Chatterbox Multilingual, un modello TTS open-source con licenza MIT di Resemble AI. Tre proprietà lo hanno reso la scelta giusta:

  • Copre tutte e sei le mie lingue con un solo modello.
  • Gira su una GPU consumer. La mia è una RTX 3080, e la generazione usa circa 5,5 GB di VRAM.
  • Fa voice cloning zero-shot: gli dai una breve registrazione di riferimento e legge qualsiasi testo con quella voce, in qualunque delle sue lingue.

Quest'ultima proprietà è l'intera funzionalità. Niente studio di registrazione, niente training, niente dataset con ore di me che parlo. Il riferimento che guida tutto su questo sito è una registrazione che ho fatto al computer in una stanza silenziosa: circa quaranta secondi in cui leggo uno dei miei articoli in portoghese, a ritmo normale.

Perché il riferimento conta

Tanto per cominciare, la voce di serie del modello non era la mia, e in portoghese tendeva pure al brasiliano, che non è il modo in cui parlo. Non c'è nessun menu di voci per correggerlo, nessuna opzione "maschile, portoghese europeo" da selezionare. La voce è determinata interamente dall'audio di riferimento su cui condizioni il modello, quindi quei quaranta secondi erano l'unica leva che avevo, e hanno spostato parecchio. Timbro, registro e ritmo sono riconoscibilmente miei in ogni lingua. L'accento è arrivato solo in parte: la narrazione è molto più vicina al portoghese europeo di quanto lo fosse la voce di serie, ma in certi punti scivola ancora verso una cadenza brasiliana, perché il modello ha imparato il suo portoghese da dati in cui domina la variante brasiliana, e quaranta secondi di me piegano quella base senza cancellarla.

La parte che ancora mi sorprende è che il riferimento è solo in portoghese. Non ho mai registrato un campione in inglese, né in spagnolo, tedesco, francese o italiano. Gli stessi quaranta secondi in portoghese guidano tutte e sei le lingue: il modello estrae dalla registrazione come suona la mia voce e la applica a qualunque lingua gli venga chiesto di leggere.

Due note di messa a punto per farlo suonare bene:

  • Il ritmo predefinito era troppo rapido per un ascolto di lunga durata. Abbassare il guidance weight del modello (cfg_weight 0.3) e attenuare l'espressività ha prodotto una lettura più calma, adatta a un articolo. Quelle impostazioni sono integrate nella pipeline, così ogni file esce coerente.
  • In inglese, la voce clonata porta con sé il mio accento portoghese. L'ho tenuto. Un sito personale che all'improvviso suona come un madrelingua californiano in inglese e come me in portoghese sarebbe più strano di un accento, e l'accento è la versione veritiera.

La pipeline

Il marchio di questo sito è l'IA in produzione, quindi la narrazione doveva essere un sistema, non un lotto di file una tantum. Tutto gira da un solo comando, node scripts/generate-audio.mjs, e fa quanto segue:

  1. Scansiona ogni articolo in ogni lingua e confronta i timestamp dei file, così vengono rigenerati solo gli articoli nuovi o modificati. Pubblicare un nuovo post significa scrivere il markdown ed eseguire lo script.
  2. Passa i testi a un worker Python che carica Chatterbox una sola volta e lo tiene caldo, invece di pagare il caricamento del modello per ogni file.
  3. Legge ogni articolo pezzo per pezzo e cuce l'audio con pause naturali, che è ciò che impedisce a una lettura di 15 minuti di suonare come un unico paragrafo senza respiro.
  4. Normalizza il volume di ogni file. L'output grezzo del modello usciva intorno a meno 41 LUFS, che è un sussurro rispetto a qualsiasi podcast. Tutto viene portato al volume da podcast, tra meno 16 e meno 18 LUFS circa, così il player sta comodamente accanto a qualunque cosa tu abbia ascoltato per ultima.
  5. Scrive il risultato come un semplice MP3 per articolo per lingua. L'audio viene distribuito col sito come qualsiasi altro asset statico: nessun servizio di streaming, nessun player di terze parti, nessun tracciamento.

Il controllo qualità lavora nella direzione opposta: dopo un lotto, porzioni dell'audio generato passano per Whisper, il modello speech-to-text, e le trascrizioni vengono confrontate col testo di partenza. Oggi è un controllo a campione, non un passaggio automatico dentro la pipeline, e ha già trovato ciò che il mio orecchio non sentirebbe mai, nelle quattro lingue che non posso correggere a orecchio.

I numeri, così puoi dimensionare il tutto per il tuo setup: la generazione a pezzi richiede all'incirca il doppio della durata dell'audio finito, quindi un articolo lungo costa da 25 a 30 minuti di tempo GPU per lingua. Il catalogo completo, cinque articoli per sei lingue, è una run di circa dodici ore. La registrazione di riferimento non entra mai nel repository; lo script la legge da una cartella locale e il repo vede solo gli MP3 finiti.

Cosa ti insegna un batch lungo

Un job di dodici ore troverà i tuoi punti deboli. La mia prima run completa è morta a metà quando il processo che l'aveva lanciata è stato terminato, un classico fallimento dei job lunghi. A salvarla è stato lo stesso design che rende economica la pubblicazione: siccome la pipeline è incrementale e ogni file finito è durevole, il crash non è costato altro che il file che era a metà codifica, e persino quello era recuperabile dal suo output temporaneo. Riavvii il comando e continua da dove la run precedente si era fermata. Se stai costruendo una qualsiasi pipeline di generazione a lunga esecuzione, quella proprietà, la ripresa automatica come impostazione predefinita, vale più di una barra di avanzamento.

Come suona oggi

Non lo venderò per più di quello che è. La narrazione è chiaramente ascoltabile e inconfondibilmente mia, e ha ancora qualche spigolo: ogni tanto una frase esce tronca, o un pezzo balbetta come un disco graffiato prima di riprendersi. E il portoghese conserva la deriva che ho descritto sopra. È il mio timbro che legge le mie parole, con una cadenza che in certi punti un orecchio portoghese riconoscerà come tendente al brasiliano. Abbastanza lieve da pubblicarla, abbastanza presente da volerla mettere per iscritto qui. I controlli a campione con Whisper intercettano i fallimenti grossolani; quelli più sottili sfuggono, e in quattro di queste lingue non li sentirei mai da solo. Quindi tratto l'audio per ciò che è oggi, un accompagnamento. Premi play mentre leggi e ti porta attraverso il testo. Le prossime iterazioni sono già visibili da qui: una registrazione di riferimento più lunga e più pulita per riportare l'accento ancora più vicino al mio, e trasformare il controllo di QA in un ciclo di riparazione, in cui qualsiasi pezzo la cui trascrizione si discosta dal testo di partenza viene rigenerato automaticamente, così ogni file pubblicato converge verso il pulito.

La linea del consenso

Sono bastati quaranta secondi di audio per fare una copia convincente della mia voce, su una GPU da gaming, con software gratuito. Vale anche per la tua voce.

Mi sento a mio agio a pubblicare tutto questo per una ragione: è la mia voce, clonata da me, col mio consenso, che legge le mie parole, ed etichettata per ciò che è. La stessa capacità puntata sulla voce di chiunque altro senza permesso è una truffa, e il fatto che la barriera ora sia una breve registrazione significa che l'onere della prova si è spostato. La voce da sola non autentica più nessuno. Se la tua azienda tratta ancora "al telefono sembra l'amministratore delegato" come un'autorizzazione, questo paragrafo è il tuo incident report dal futuro.

Quanto costa

Dopo la configurazione iniziale, il costo marginale di narrare un nuovo articolo in sei lingue è qualche ora di tempo GPU in background e l'elettricità che ci sta dietro. Non ci sono tariffe API per carattere, e nessun testo degli articoli lascia mai la mia macchina. Le piattaforme vocali in hosting clonano con più rifinitura, e per prodotti commerciali con la narrazione al centro vale la pena valutarle, ma per un sito personale la via locale vince su costo, privacy e controllo, e trasforma l'intera funzionalità in un paio di script in un repo.

Ogni articolo qui ora ha un player in cima. Scegli una lingua, premi play e leggi insieme all'audio: sentirai questo testo più o meno come te lo leggerei io, a parte un accento che ho deciso di tenere e l'occasionale sillaba che il modello sta ancora imparando a centrare.

Le domande a cui questo articolo risponde

  • Si può davvero clonare una voce da una registrazione di quaranta secondi?

    Sì, e senza training, senza studio di registrazione e senza un dataset con ore di parlato. Chatterbox Multilingual, il modello open-source con licenza MIT di Resemble AI, fa voice cloning zero-shot: lo si condiziona su una breve registrazione di riferimento e legge qualsiasi testo con quella voce. Gira in locale su una RTX 3080 e usa circa 5,5 GB di VRAM.

  • Serve un campione vocale diverso per ogni lingua?

    No. Il riferimento dietro ogni file di questo sito è solo in portoghese, circa quaranta secondi di lettura di un articolo a ritmo normale, e non è mai stato registrato nulla in inglese, spagnolo, tedesco, francese o italiano. Il modello estrae dalla registrazione come suona la voce e la applica a qualunque lingua gli venga chiesto di leggere.

  • Somiglia davvero alla tua voce o sei generoso a dirlo?

    È chiaramente ascoltabile ed è inconfondibilmente il mio timbro, e ha spigoli che preferisco dire piuttosto che nascondere. Ogni tanto una frase esce tronca o un pezzo balbetta come un disco graffiato prima di riprendersi, e il portoghese conserva in certi punti una cadenza tendente al brasiliano. Le trascrizioni di Whisper su porzioni campionate intercettano i fallimenti grossolani, quelli più sottili sfuggono, e in quattro di queste lingue non li sentirei mai da solo. Per questo oggi l'audio è un accompagnamento al testo, non un sostituto della lettura.

  • Quanto tempo ci vuole e quanto costa narrare un articolo in sei lingue?

    La generazione a pezzi richiede all'incirca il doppio della durata dell'audio finito, quindi un articolo lungo costa da 25 a 30 minuti di tempo GPU per lingua, e il catalogo completo, cinque articoli per sei lingue, è stato una run di circa dodici ore. Dopo la configurazione iniziale il costo marginale di un nuovo articolo è qualche ora di tempo GPU in background e l'elettricità che ci sta dietro: nessuna tariffa API per carattere e nessun testo degli articoli che lascia la macchina. Le piattaforme in hosting clonano con più rifinitura e vale la pena valutarle quando la narrazione è al centro di un prodotto commerciale, ma per un sito personale la via locale vince su costo, privacy e controllo.