Tutti gli articoli

· Casimiro Ferreira· 5 min di lettura

Modelli di TTS che Girano su una Patata

  • phoonnx
  • TTS
  • ONNX
  • VITS
  • self-hosted
  • OVOS

Una buona sintesi vocale non richiede una GPU né un abbonamento cloud. Una voce naturale e multilingue può stare in qualcosa che vi vergognereste di chiamare server — quel genere di scheda che tenete in un cassetto “non si sa mai”. Una patata.

phoonnx è il nostro framework di ricerca proprio per quel bersaglio: piccole voci basate su VITS che girano completamente offline, su CPU, su hardware economico, e che possiamo anche addestrare da zero noi stessi.

Quanto è piccolo “piccolo”?

Mettiamoci sopra un numero concreto invece di sventolare le mani. Abbiamo preso una voce phoonnx di produzione — la voce basca “Miro” (OpenVoiceOS/phoonnx_eu-ES_miro_espeak) — direttamente da Hugging Face e abbiamo contato i pesi nel grafo ONNX:

import onnx, numpy as np
m = onnx.load("miro_eu-ES.onnx")
print(sum(int(np.prod(i.dims)) for i in m.graph.initializer))
# 15650459

~15,65 milioni di parametri. Questa è l’intera voce — encoder, decoder, tutto quanto — in un file da 63 MB. La voce femminile “Dii” della stessa release conta esattamente lo stesso numero, perché condividono l’architettura VITS standard di phoonnx; la personalità vive nei pesi, non in capacità aggiuntiva.

Per dare una prospettiva: un singolo strato di un “piccolo” modello linguistico moderno può portare più parametri di questo intero sintetizzatore vocale, eppure parla fluentemente.

Perché VITS, e perché ONNX

VITS è la spina dorsale di ogni voce phoonnx. È un’architettura end-to-end — testo (be’, fonemi) in ingresso, forma d’onda in uscita — senza un vocoder separato da accudire e senza un ciclo autoregressivo che avanza un campione alla volta. Quel design end-to-end è precisamente ciò che la rende trattabile su una patata: un unico passaggio in avanti, sintesi parallela, fatto.

Non spediamo PyTorch all’edge. Le voci addestrate vengono esportate in ONNX ed eseguite tramite onnxruntime sulla CPU — niente CUDA, niente GPU, niente roulette dei driver. onnxruntime è un motore C++ compatto e portatile, e un grafo da 15 milioni di parametri rientra ampiamente in ciò che un core di classe Raspberry Pi mastica più veloce del tempo reale. Il risultato è un assistente vocale che continua a parlare quando la vostra connessione internet è giù, quando il provider cloud ha un’interruzione, o quando semplicemente non avete mai voluto che l’audio di casa uscisse di casa in primo luogo.

I fonemi sono dove si nasconde l’intelligenza

Un modello acustico minuscolo può permettersi di essere minuscolo perché phoonnx fa il duro lavoro linguistico a monte, nel phonemizer. Un phonemizer (grafema-fonema, o G2P) converte il testo scritto nella sequenza di unità sonore che il modello effettivamente pronuncia — così che la rete VITS non debba mai imparare l’ortografia, ma solo il suono.

Il nostro lavoro sui fonemi si fonda su grafema-a-IPA per 820 lingue e sulla fonetica classica del portoghese, che rendono possibile addestrare voci per lingue a basse risorse senza settimane di annotazione esperta.

phoonnx è deliberatamente agnostico rispetto al phonemizer e ne raccoglie un piccolo esercito: espeak-ng, gruut, epitran, misaki, transphone (che raggiunge le migliaia di lingue catalogate in Glottolog), oltre a specialisti come mantoq per l’arabo, cotovia per il galiziano, OpenJTalk per il giapponese, e KoG2P per il coreano. Emettono IPA, ARPA, Pinyin, Hangul, Buckwalter — qualunque cosa serva alla lingua. C’è persino un G2P multilingue basato su modello costruito su ByT5, esportato in ONNX come tutto il resto.

Scaricare l’ortografia sul phonemizer è il trucco che permette a un modello da 15 milioni di parametri di suonare bene in una lingua a basse risorse che non ha mai visto scritta.

Un framework per costruire voci, non solo per eseguirle

phoonnx non è solo un toolkit di inferenza. Il framework compagno phoonnx_train è il modo in cui creiamo le voci in primo luogo.

phoonnx_train copre l’intera pipeline:

  • Preelaborazione di un dataset in stile LJSpeech in dati di addestramento fonemizzati.
  • Addestramento del generatore VITS (quei ~15,65M di parametri) su una singola GPU consumer o di fascia media — un modello così piccolo non richiede un cluster di addestramento.
  • Esportazione del checkpoint finito in ONNX con un singolo script, pronto per essere calato direttamente in onnxruntime su un dispositivo.

Poiché la ricetta è aperta e i modelli sono piccoli, costruire una voce completamente nuova per una lingua che non ha alcuna opzione offline aperta è un progetto su scala di weekend, non su scala di borsa di ricerca. È così che siamo riusciti a colmare lacune per lingue trascurate — basco, mirandese, portoghese europeo e altre — invece di aspettare che un fornitore decida che una lingua è commercialmente interessante.

Già collegato al vostro assistente

Non dovete incollare a mano nulla di tutto questo. phoonnx include un plugin nativo per OpenVoiceOS, ovos-tts-plugin-phoonnx, che recupera e carica le voci per voi:

"tts": {
  "module": "ovos-tts-plugin-phoonnx",
  "ovos-tts-plugin-phoonnx": {
    "voice": "OpenVoiceOS/phoonnx_pt-PT_miro_tugaphone"
  }
}

Omettete voice e sceglie il primo modello che corrisponde alla vostra lingua. Per gestire le voci al di fuori di un assistente c’è una CLI, phoonnx-voices, per elencare lingue, sfogliare voci e pre-scaricare modelli:

phoonnx-voices list-voices --lang pt-PT
phoonnx-voices download OpenVoiceOS/phoonnx_pt-PT_miro_tugaphone

E poiché phoonnx parla il semplice VITS-su-ONNX, il suo motore di inferenza esegue anche voci addestrate da Piper, Mimic3, Coqui e MMS — oltre mille lingue e voci in totale. Un piccolo runtime, un enorme catalogo, e niente di tutto ciò che telefona a casa.

Il punto

La tecnologia vocale che vi rispetta deve girare dove siete voi — sul vostro hardware, sotto il vostro controllo, con il cavo di rete staccato se volete. phoonnx è la nostra scommessa che il modo per arrivarci non siano modelli più grandi, ma la giusta architettura resa piccola: VITS per la spina dorsale, phonemizer ingegnosi per portare il carico linguistico, ONNX per la portabilità e un framework di addestramento aperto così che chiunque possa far crescere il catalogo.

Quindici milioni e mezzo di parametri, in esecuzione su CPU, addestrati su hardware che chiunque può possedere: questa è la pipeline di addestramento dietro ogni voce phoonnx.