Post-elaborazione in sistemi di riconoscimento vocale automatico

On By Pavel Pekichev7 Min Read
Post-processing in Automatic Speech Recognition systems

Introduzione

I sistemi di riconoscimento vocale automatico forniscono trascrizioni di testo. Di solito, si tratta di una sequenza di parole. Cisco utilizza sistemi ASR per fornire sottotitoli codificati in tempo reale nelle riunioni Webex. Un problema tipico è che potrebbe essere difficile leggere i sottotitoli senza punteggiatura e maiuscole/minuscole. Il modo in cui si comprende il significato di un testo può cambiare in base alla punteggiatura. Immagina la seguente sequenza di parole con due opzioni per la punteggiatura:

“grazie hai fatto una donazione a qualcuno e ora lavora”

Opzione A: “Grazie! Hai fatto una donazione a qualcuno e ora lavora.”

Opzione B: “Grazie! Hai fatto una donazione a qualcuno. E ora lavora!”

Un solo segno di punteggiatura fa una grande differenza.

Di seguito alcuni aspetti che vengono considerati durante lo sviluppo di un sistema di post-elaborazione:
  • Modelli di alta precisione per ripristino di punteggiatura e maiuscole/minuscole da testo non elaborato. Inferenza veloce su risultati temporanei: per mantenere l’allineamento a sottotitoli in tempo reale.
  • Utilizzo risorse ridotto: il riconoscimento vocale consuma molte risorse informatiche; non abbiamo bisogno che anche i nostri modelli di punteggiatura consumino un numero elevato di risorse informatiche.
  • Possibilità di elaborare termini non inclusi nel vocabolario: a volte, dobbiamo inserire punteggiatura o parole in maiuscolo/minuscolo che il nostro modello non ha mai visto prima.
Alcuni approcci classici basati su n-gram [1] offrono una qualità relativamente buona. Tuttavia, hanno i loro lati negativi. Sebbene i modelli n-gram abbiano un’inferenza veloce, anche i modelli 3-gram possono richiedere fino a diversi gigabyte di spazio su disco in base al vocabolario della lingua. Un altro svantaggio è la gestione di parole non incluse nel vocabolario. Se una parola non era presente nei dati di addestramento, un modello non può elaborarla in modo regolare, con un conseguente impatto sulla precisione. Gli approcci moderni utilizzano tecniche efficaci, ma con un consumo elevato di risorse informatiche, come RNN bidirezionale [3] o architetture di reti neurali basate su trasformatori e attenzione [2]. Questi modelli hanno una precisione elevata [2] ma potrebbero non essere adatti a casi d’uso di streaming in diretta, perché richiedono l’intera sequenza di input per eseguire l’inferenza. Ad esempio, quando disponi di un solo nuovo token di input per una RNN bidirezionale, devi aggiornare gli stati nascosti di tutti i token precedenti del modello (figura 1).
Calcoli sul passaggio indietro di una RNN bidirezionale

Figura 1. Calcoli sul passaggio indietro di una RNN bidirezionale. Per ogni nuovo input, tutti i precedenti stati nascosti devono essere aggiornati sequenzialmente.

  Alcuni approcci tentano di risolvere punteggiatura e maiuscole/minuscole sviluppando due diversi modelli [3][6], mentre altri combinano entrambi in un singolo modello perché gli output sono altamente correlati [4][2]. Anche parole che seguono immediatamente la punteggiatura dimostrano questa correlazione: le parole dopo i punti vengono probabilmente scritte con la maiuscola e le parole dopo virgole vengono probabilmente scritte con la minuscola. Esistono approcci che suggeriscono un’architettura con più output [4]: uno per attività, rispettivamente. Dimostrano che questa architettura offre prestazioni migliori rispetto ad architetture di punteggiatura e maiuscole/minuscole separate. Alla luce delle considerazioni precedenti, abbiamo scelto di utilizzare una singola rete neurale basata su GRU con due output per punteggiatura e maiuscole/minuscole. Per gestire le parole non incluse nel vocabolario, utilizziamo una tecnica simile a SentencePiece [6] che suddivide le parole sconosciute in token più piccoli oppure, in casi estremi, in caratteri. Di seguito una descrizione di dettagli e considerazioni.

TruncBiRNN

Intuizione e sperimentazioni dimostrano che è fondamentale disporre del contesto futuro quando si crea un modello di punteggiatura, perché è più difficile determinare i segni di punteggiatura in una posizione corrente senza conoscere le parole successive. Per utilizzare informazioni sui successivi token e non essere obbligati ad aggiornare tutti gli stati nascosti di tutti i token precedenti, abbiamo deciso di troncare la direzione indietro a una finestra fissa. In direzione avanti, è semplicemente una RNN regolare. In direzione indietro, consideriamo solo una finestra fissa in ciascun token, eseguendo l’RNN su questa finestra (figura 2). L’uso di questa finestra consente di ottenere inferenza a tempo costante per un nuovo token di input (sarà necessario calcolare un solo stato nascosto in direzione avanti e n+1 in direzione indietro).
Esempio di TruncBiRNN

Figura 2. In questo esempio, per ogni token corrente, solo i successivi due vengono considerati per calcolare lo stato nascosto in direzione indietro.

  Ora, per ogni token, abbiamo stati nascosti per direzioni avanti e indietro, rispettivamente. Chiamiamo questo strato TruncBiRNN o TruncBiGRU (poiché utilizziamo GRU). Questi stati nascosti possono essere calcolati a tempo costante, che non dipende dalla lunghezza dell’input. L’operazione a tempo costante è fondamentale per il modello al fine di mantenere l’allineamento ai sottotitoli in tempo reale.

Architettura

L’architettura consiste di strato di incorporamento, TruncBiGRU e strato GRU unidirezionale, e strato completamente connesso. Per l’output, utilizziamo due strati softmax per punteggiatura e maiuscole/minuscole, rispettivamente (figura 3).
Figura 3. Architettura di modelli con dimensione della finestra uguale a due token per TruncBiGRU

Figura 3. Architettura di modelli con dimensione finestra uguale a due token per TruncBiGRU.

  Per ogni parola, il modello prevede l’uso di maiuscole/minuscole e il segno di punteggiatura dopo la parola. Per sincronizzare meglio questi due output e prevedere l’uso di maiuscole/minuscole, dobbiamo conoscere anche l’incorporamento dal precedente token (per ripristinare il segno di punteggiatura dal passaggio precedente). Insieme a una funzione di perdita personalizzata (vedi la sezione seguente), ciò ci consente di evitare casi in cui venga prodotta una parola minuscola all’inizio di una frase. Per la previsione della punteggiatura, è utile anche ottenere la previsione di maiuscole/minuscole della parola seguente. Ecco perché concateniamo incorporamenti correnti e successivi. Uno strato di output per la punteggiatura prevede la distribuzione su tutti i segni di punteggiatura. Per il nostro modello, è impostato come segue:

punto: un punto al centro di una frase che non implica necessariamente che la parola seguente debba essere in maiuscolo (“a.m.”, “D.C.”, ecc.)

virgola

punto interrogativo

ellissi

due punti

trattino

punto di fine: un punto alla fine di una frase

  Per maiuscole/minuscole, sono disponibili quattro classi:

minuscolo

tutto maiuscolo: tutte le lettere vengono scritte in maiuscolo (“IEEE”, “NASA”, ecc.)

maiuscole

maiuscole_minuscole: per parole come “iPhone”

maiuscola iniziale: parole che iniziano una frase

Le classi aggiuntive, “maiuscola iniziale” e punto di fine” possono sembrare ridondanti a prima vista, ma aiutano ad aumentare la coerenza di risposte correlate a maiuscole/minuscole e punteggiatura. Il “punto di fine” implica che la successiva risposta di maiuscole/minuscole non possa essere “minuscolo”, mentre “maiuscola iniziale” significa che il segno di punteggiatura precedente è un “punto di fine” o un punto interrogativo. Queste classi svolgono un ruolo importante nella funzione di perdita. Funzione di perdita: Dobbiamo ottimizzare entrambi, maiuscole/minuscole e punteggiatura. Per raggiungere questo obiettivo, utilizziamo una somma della funzione di perdita logloss con un coefficiente: Funzione di perdita tuttavia, come detto in precedenza, gli output di una rete neurale potrebbero non essere perfettamente correlati. Ad esempio, la funzione di punteggiatura può prevedere un “punto di fine” per la parola corrente, ma la funzione di maiuscole/minuscole non prevede una “maiuscola iniziale” per il token successivo. Questo tipo di errore, sebbene raro, può essere molto eclatante. Per gestirlo, utilizziamo un termine di penalità aggiuntivo nella funzione di perdita che penalizza questo tipo di errore: sanzione disaccordo Il primo termine corrisponde alla probabilità di avere la “maiuscola iniziale” dopo un “punto non di fine” e il secondo corrisponde alla probabilità di non avere una “maiuscola iniziale” dopo il “punto di fine”.  Questa penalità si somma nei token in cui si verifica questo errore. Inoltre, passiamo due tensori consecutivi dallo strato precedente agli strati softmax. Con questi presupposti, possiamo ridurre in modo efficiente i termini di penalità. Infine, abbiamo la funzione di perdita: Funzione di perdita

Training

Per l’addestramento, utilizziamo trascrizioni di testo di un set di riunioni Webex interne e dati di testo di Wikipedia. In primo luogo, i dati di addestramento vengono puliti e suddivisi in frasi. Durante l’addestramento, ogni esempio viene generato da frasi consecutive e viene troncato a una lunghezza casuale da una distribuzione fissa. Ciò consente al modello di vedere frasi tagliate durante l’addestramento e di gestire risultati temporanei durante l’inferenza. Quindi, addestriamo il modello su circa 300 megabyte di testo Wikipedia e lo perfezioniamo su trascrizioni di riunioni Webex. Il pre-addestramento su Wikipedia aiuta a migliorare tutte le classi di punteggiatura, ma è particolarmente utile su classi di maiuscole/minuscole. Sospettiamo che questo sia dovuto al grande numero di nomi propri presenti in Wikipedia. Applichiamo la stessa preparazione di dati ai nostri set di valutazione concatenando frasi e troncandole in modo casuale. Ciò ci consente di misurare la precisione che vorremmo vedere negli stati di trascrizione temporanei.

Conclusione

Utilizzando tecniche relativamente semplici con personalizzazioni dell’architettura, come GRU troncato e una penalità aggiuntiva in una funzione di perdita, abbiamo costruito un modello che può essere eseguito online. L’esperienza di lettura di sottotitoli in diretta è significativamente migliorata con segni di punteggiatura e maiuscole/minuscole in tempo reale. Riferimenti [1] A. Gravano, M. Jansche e M. Bacchiani, “Restoring punctuation and capitalization in transcribed speech” in ICASSP 2009, 2009, pp. 4741–4744. [2] Monica Sunkara, Srikanth Ronanki, Kalpit Dixit, Sravan Bodapati, Katrin Kirchhoff, “Robust Prediction of Punctuation and Truecasing for Medical ASR” [3] Tilk, Ottokar & Alumäe, Tanel. (2016). Bidirectional Recurrent Neural Network with Attention Mechanism for Punctuation Restoration. 3047-3051. 10.21437/Interspeech.2016-1517. [4] Vardaan Pahuja, Anirban Laha, Shachar Mirkin, Vikas Raykar, Lili Kotlerman, Guy Lev “Joint Learning of Correlated Sequence Labelling Tasks Using Bidirectional Recurrent Neural Networks” [5] Wang, Peilu & Qian, Yao & Soong, Frank & He, Lei & Zhao, Hai. (2015). Part-of-Speech Tagging with Bidirectional Long Short-Term Memory Recurrent Neural Network. [6] Lita, Lucian & Ittycheriah, Abe & Roukos, Salim & Kambhatla, Nanda. (2003). tRuEcasIng. 10.3115/1075096.1075116. [7] https://github.com/google/sentencepiece Iscriviti a Webex Visita la nostra home page o contattaci direttamente per assistenza. Fai clic qui per ulteriori informazioni sulle offerte di Webex e per eseguire l’iscrizione a un account gratuito

About The Author

Pavel Pekichev
Pavel Pekichev Machine Learning Scientist Cisco
Pavel Pekichev is a Machine Learning Scientist at Cisco working on speech recognition systems.
Learn more

Topics


More like this