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.
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). 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). 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: 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: 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: