FastSpeech Panoramica e Implementazione del Paper

FastSpeech Panoramica ed Implementazione del Paper

Scopri di più sul text-to-speech e su come viene realizzato dai transformers

Nel 2019, FastSpeech ha spinto i limiti del text-to-speech neurale offrendo un significativo miglioramento nella velocità di inferenza mantenendo al contempo la robustezza per evitare ripetizioni o omissioni di parole. Ha inoltre consentito di controllare l’output del discorso in termini di pronuncia e prosodia.

In questa storia, ci proponiamo di familiarizzare con il modo in cui i transformers vengono impiegati per il text-to-speech, fornendo una panoramica sintetica dell’articolo FastSpeech e indicandoti come puoi implementarlo da zero. In questo, considereremo che tu abbia familiarità con i transformers e i loro diversi componenti. Se non lo sei, ti consigliamo vivamente di rivedere il precedente articolo che approfondisce questo argomento.

Quadro nello stile di Van Gogh con un transformer che parla in un microfono su un podio - Generato dall'autore usando Canva

Indice

· BackgroundIntroduzioneMel Spectrogram· Panoramica dell’articoloIntroduzioneEsperimenti e risultatiArchitetturaEncoderRegolatore di lunghezzaDecoder· ImplementazioneStrategiaImplementazione completa

Background

Introduzione

I modelli tradizionali di text-to-speech (TTS) si basavano su tecniche concatenate e statistiche. Le tecniche concatenate si basavano sulla sintesi del discorso attraverso la concatenazione di suoni da un database di suoni di fonemi (unità distintive di suono nella lingua). Le tecniche statistiche (ad esempio, HMM) cercavano di modellare le proprietà di base del discorso che sono sufficienti per generare una forma d’onda. Entrambi gli approcci spesso presentavano problemi nella produzione di suoni naturali o nell’esprimere emozioni. In altre parole, tendevano a produrre un discorso innaturale o robotico per il testo fornito.

La qualità del discorso è stata significativamente migliorata utilizzando l’apprendimento profondo (reti neurali) per il TTS. Tali metodi solitamente consistono in due modelli principali: il primo prende in input il testo e restituisce un corrispondente Mel Spectrogram e il secondo prende in input il Mel Spectrogram e sintetizza il discorso (chiamato vocoder).

Mel Spectrogram

Spettrogramma di The Official CTBTO Photostream su Flickr CC BY-SA 2.0.

Nella sua forma più semplice, una forma d’onda del discorso è semplicemente una sequenza di ampiezze che rappresentano le variazioni nella pressione dell’aria nel tempo. Possiamo trasformare qualsiasi forma d’onda in uno spettrogramma di Mel corrispondente (che è una matrice che indica la magnitudine delle diverse frequenze in diversi intervalli di tempo della forma d’onda originale) utilizzando la trasformata di Fourier a breve termine (STFT). È facile mappare un pezzo di audio nel suo spettrogramma di Mel utilizzando la trasformata di Fourier a breve termine; tuttavia, fare l’inverso è abbastanza difficile e i migliori metodi sistematici (ad esempio, Griffin Lim) possono produrre risultati approssimativi. Un approccio preferito è addestrare un modello per questa attività. I modelli esistenti addestrati per questa attività includono WaveGlow e WaveNet.

Quindi, per ripetere, i metodi di apprendimento profondo spesso affrontano il text-to-speech addestrando il modello a predire il MelSpectrogram del discorso corrispondente a molte istanze di testo. Si basa quindi su un altro modello (chiamato vocoder) per mappare lo spettrogramma previsto in audio. FastSpeech utilizza il modello WaveGlow di Nvidia.

Un Felice Trasformatore che Scrive un Articolo di Ricerca, Dipinto in Stile Van Gogh. — Generato dall'Autore utilizzando Canva

Panoramica dell’Articolo

Introduzione

Sebbene i metodi di TTS basati su trasformatori recenti abbiano migliorato drasticamente la qualità del discorso rispetto ai metodi tradizionali, rimangono ancora tre principali problemi con questi modelli:

  • Soffrono di rallentamenti nella generazione del discorso perché il decodificatore del trasformatore è autoregressivo. Questo significa che generano frammenti dello spettrogramma di Mel in modo sequenziale basandosi su frammenti generati in precedenza. Questo vale anche per i vecchi modelli di apprendimento profondo basati su RNN e CNN.
  • Non sono robusti; possono verificarsi salti di parole o ripetizioni a causa di piccoli errori nei punteggi di attenzione (alias allineamenti) che si propagano durante la generazione sequenziale.
  • Mancano un modo semplice per controllare le caratteristiche del discorso generato come la velocità o la prosodia (ad esempio, l’intonazione).

FastSpeech cerca di risolvere tutti e tre i problemi. Le due principali differenze dalle altre architetture a trasformatore sono che:

  • Il decodificatore non è autoregressivo; è perfettamente parallelizzabile; quindi, risolve il problema della velocità.
  • Utilizza un componente di regolazione della lunghezza proprio prima del decodificatore che cerca di garantire un allineamento ideale tra i fonemi e lo spettrogramma di Mel e omette il componente di cross-attenzione.
  • Il modo in cui il regolatore di lunghezza opera consente un facile controllo della velocità del discorso tramite un iperparametro. Le proprietà minori di prosodia come la durata delle pause possono essere controllate allo stesso modo.
  • In cambio, per scopi di regolazione della lunghezza, utilizza la distillazione delle conoscenze a livello di sequenza durante l’addestramento. In altre parole, si basa su un altro modello di text-to-speech già addestrato per l’addestramento (modello Transformer TTS).

Esperimenti e Risultati

I autori hanno utilizzato il dataset LJSpeech che include una durata audio di circa 24 ore distribuite su 13100 clip audio (Ognuna con il corrispondente testo di input). L’attività di addestramento consiste nell’inserire il testo e far prevedere al modello lo spettrogramma corrispondente. Circa il 95,6% dei dati è stato utilizzato per l’addestramento e il resto è stato diviso per essere utilizzato per la convalida e il testing.

  • Aumento della Velocità di Generazione Aumenta la velocità di generazione del 38x (o del 270x senza includere il vocoder) rispetto ai modelli TTS di trasformatori autoregressivi; da qui il nome FastSpeech.
  • Qualità Audio Utilizzando il punteggio medio delle opinioni di 20 parlanti nativi inglesi, gli autori hanno dimostrato che FastSpeech si avvicina molto alla qualità del modello Transformer TTS e a Tacotron 2 (allo stato dell’arte all’epoca).
  • Robustezza FastSpeech ha superato il Transformer TTS e Tacotron 2 con un tasso di errore zero (in termini di salti e ripetizioni) su 50 esempi sfidanti di text-to-speech, rispetto al 24% e al 34% per il Transformer TTS e Tacotron 2 rispettivamente.
  • Controllo Gli autori hanno presentato esempi per dimostrare che il controllo della velocità e della durata delle pause funziona.
  • Ablazione Gli autori confermano l’efficacia delle decisioni come l’integrazione di convoluzioni 1D nel trasformatore e l’utilizzo della distillazione delle conoscenze a livello di sequenza. Rivelano una degradazione delle prestazioni (in termini di punteggio medio delle opinioni) in assenza di ciascuna decisione.

Architettura

Figura di architettura FastSpeech dal documento FastSpeech

La prima figura rappresenta l’intera architettura che consiste in un codificatore, regolatore di lunghezza e decodificatore:

Il blocco Feedforward Transformer (FFT) viene utilizzato sia nell’encoder che nel decodificatore. È simile al layer dell’encoder nel transformer, ma sostituisce il FFN posto-posizione con una convoluzione 1D. Un iperparametro N rappresenta il numero di blocchi FFT (collegati in sequenza) nell’encoder e nel decodificatore. N è impostato su 6 nel documento.

Il regolatore di lunghezza adatta le lunghezze delle sequenze dei suoi input in base al predittore della durata (terza figura). Il predittore della durata è una semplice rete mostrata nella quarta figura.

Si dovrebbe intuire che il flusso dei dati assume la seguente forma:

Encoder

L’encoder prende una sequenza di interi corrispondenti ai caratteri presenti nel testo. Un convertitore di grafemi in fonemi può essere utilizzato per convertire il testo in una sequenza di caratteri fonetici come menzionato nel documento; tuttavia, useremo semplicemente le lettere come unità di carattere e assumiamo che il modello possa imparare qualsiasi rappresentazione fonetica di cui ha bisogno durante l’addestramento. Quindi, per un input “Dì ciao!”, l’encoder prende una sequenza di 10 interi corrispondenti a["D","ì"," ","c","i","a","o","!"].

Similmente all’encoder del transformer, lo scopo dell’encoder è assegnare a ciascun carattere una rappresentazione vettoriale ricca che tenga conto del carattere fonetico stesso, del suo ordine e della sua relazione con gli altri nel testo dato. Come nel transformer, mantiene la dimensionalità dei vettori assegnati all’encoder per scopi di Add & Norm.

Per una sequenza di input con n caratteri, l’encoder restituisce [h₁,h₂,…,hₙ] dove ciascuna rappresentazione ha dimensionalità emb_dim.

Regolatore di Lunghezza

Lo scopo del regolatore di lunghezza è semplicemente ripetere la rappresentazione dell’encoder data ad ogni carattere. L’idea è che la pronuncia di ciascun carattere nel testo corrisponda in genere a unità multiple (o zero) dello spettrogramma Mel (da generare dal decodificatore); non si tratta solo di un’unità sonora. Con unità di spettrogrammi Mel, intendiamo una colonna nello spettrogramma Mel, che assegna una distribuzione di frequenza del suono alla finestra temporale corrispondente a quella colonna e corrisponde al suono effettivo nella forma d’onda.

Il regolatore di lunghezza opera nel seguente modo:

  1. Prevedere il numero di unità dello spettrogramma Mel per ciascun carattere.
  2. Ripetere la rappresentazione dell’encoder secondo quel numero.

Ad esempio, dato le rappresentazioni dell’encoder [h₁, h₂, h₃, h₄, h₅] dei caratteri di input corrispondenti a “cavaliere”. Ecco cosa accade durante l’inferenza:

  1. Il regolatore di lunghezza passa ciascuna rappresentazione al predittore della durata che utilizza la rappresentazione (che coinvolge le relazioni con tutti gli altri caratteri nel testo) per prevedere un singolo intero che rappresenta il numero di spettrogrammi Mel per il carattere corrispondente.
  2. Supponiamo che il predittore della durata restituisca [ 1, 2, 3, 2, 1] quindi il regolatore di lunghezza ripete ogni stato nascosto secondo la durata prevista che produce [h₁, h₂, h₂, h₃, h₃, h₃, h₄, h₄, h₅]. Ora conosciamo la lunghezza della sequenza (10), che è la lunghezza dello spettrogramma Mel.
  3. Passa questa nuova sequenza al decodificatore.

Si noti che in un contesto reale, passare cavaliere a FastSpeech e ispezionare l’output del predittore della durata ha restituito [ 1, 8, 15, 3, 0, 17]. Notare che le lettere k, g, h contribuiscono in modo trascurabile allo spettrogramma Mel rispetto alle altre lettere. Infatti, ciò che viene davvero pronunciato quando viene pronunciata quella parola è principalmente la lettera n, i, t.

“`html

Controllabilità È facile controllare la velocità scalando le durate previste. Ad esempio, se [ 1, 8, 15, 3, 0, 17] viene raddoppiato, ci vorrà il doppio del tempo per dire la parola knight (a velocità 0.5x) e se viene moltiplicato per metà (arrotondato), ci vorrà la metà del tempo per pronunciare la parola (velocità 2x). È anche possibile cambiare solo la durata corrispondente a caratteri specifici (ad esempio, spazi) per controllare la durata della loro pronuncia (ad esempio, durata della pausa).

Formazione

Nella formazione, FastSpeech non predice le durate utilizzando il predittore di durate (non è allenato), ma predice le durate utilizzando le matrici di attenzione di un TTS Transformer allenato.

  • La cross-attenzione in quel trasformatore associa ciascun carattere e unità Mel Spectrogram con un punteggio di attenzione tramite una matrice di attenzione.
  • Quindi, per prevedere il numero di unità Mel Spectrogram (durata) di un carattere c durante la formazione di FastSpeech, conta il numero di unità Mel Spectrogram che hanno attenzione massima verso quel carattere utilizzando la matrice di cross-attenzione nel TTS Transformer.
  • Poiché la cross-attenzione coinvolge più matrici di attenzione (una per ogni testa), fa questa operazione sulla matrice di attenzione che è più “diagonale”. Potrebbe essere che ciò garantisca un’allineamento realistico tra i caratteri e le unità Mel Spectrogram.
  • Utilizza questa durata anche per addestrare il predittore di durate (semplice compito di regressione). In questo modo non abbiamo bisogno di questo modello di insegnante durante l’inf inferenza.

Decodificatore

Il decodificatore riceve questa nuova rappresentazione e mira a predire il contenuto in frequenza (vettore) di ciascuna unità Mel Spectrogram. Questo è equivalente a predire l’intero spettrogramma corrispondente al testo che può essere trasformato in audio utilizzando un vocoder.

Il decodificatore segue un’architettura simile all’encoder. Sostituisce semplicemente il primo blocco (strato di embedding) con uno strato lineare come ultimo blocco. Questo strato è ciò che produce i vettori di frequenza per ciascuna unità Mel Spectrogram utilizzando rappresentazioni di caratteristiche complesse che i blocchi FFT precedenti nel decodificatore hanno formato per le unità Mel Spectrogram.

Il numero delle frequenze n_mels è un iperparametro di questo strato. Viene impostato come 80 nel documento.

Un moderno Futuristico Transformer che programma un computer, dipinto in stile Van Gogh — — Generato dall'autore utilizzando Canva

Implementazione

Figura dell'architettura FastSpeech dal paper FastSpeech

Strategia

L’architettura di FastSpeech corrisponde a

Cominceremo implementando:

e

poi possiamo implementare l’encoder e il decodificatore poiché la loro composizione è

Adesso ci manca solo il regolatore di lunghezza

“`

perché una volta completato l’ultimo passo è

Implementazione completa

Per evitare lo spam in questo articolo con molti codici, ho preparato in precedenza un notebook annotato con una versione organizzata, ottimizzata per il codice e adatta all’apprendimento di un’implementazione originale, a scopo di inferenza. Puoi trovarlo su Github o Google Colab. Si prega di notare che il suono non verrà riprodotto su Google Colab (devi scaricare ed eseguire il notebook offline). È altamente consigliato comprendere i diversi componenti trovati nell’architettura del trasformatore prima di passare all’implementazione.

A Modern Futuristic Jet Flying Towards the Stars Painted in Van Gogh style — Generated by Author using Canva

Spero che la spiegazione fornita in questa storia sia stata utile per migliorare la comprensione di FastSpeech e della sua architettura, guidandoti su come puoi implementarla da zero. Fino alla prossima volta, au revoir.