sabato 20 ottobre 2007

cosa e' (era) learph

Cercando in rete e' ancora possibile trovare, in qualche pagina che raccoglie informazioni sui sistemi di sintesi e riconoscimento vocale, un riferimento a "learph. Trainable text-to-phonemes software by Antonio Lucca" (che sarei io), e che risale al lontano '93.

(Il nome fa veramente schifo, avevo messo insieme la parola "learn" e "phonemes".
Considerando poi che l'inglese è una lingua che usa spesso parole onomatopeiche, lasciamo stare.)

Non è possibile scaricarlo perché il link non è più valido. Potrei ripubblicarlo ma non so se ne valga la pena.

Questo programma non sarebbe altro che una "demo", in C, utilizzabile in riga di comando, che "impara", a partire da un training set di esempi di parole inglesi associate alla loro corrispondente rappresentazione fonetica, le regole di traduzione da parola a fonemi, cioè sostanzialmente le regole del modo in cui si pronunciano.

Il training set era stato ottenuto banalmente prendendo un vocabolario ed applicando ad ogni sua parola un preesistente algoritmo di traduzione testo-fonemi.

Quindi in sostanza il progetto era di creare un sistema che, sulla base di esempi, impara ad eseguire un compito per il quale già esiste un algoritmo! :-)

(La descrizione è qui semplificata perché esiste la possibilita che un gruppo di lettere sia associato a più fonemi e viceversa, che una lettera sia muta e così via. Per gestire questo avevo modificato il training set un po' a mano aggiungendo queste informazioni, sulla base di decisioni sostanzialmente arbitrarie ma intuitivamente valide. Inoltre, per semplificare, avevo eliminato i simboli relativi all'intonazione/accento/stress)

Il progetto mi era venuto in mente per le seguenti motivazioni:
. ero un orgoglioso possessore del Commodore Amiga, che era uno dei pochi computer dotati di software per la sintesi vocale
. seguivo il corso di cibernetica e teoria dell'informazione, che trattava di temi come il computational learning, e ho scelto questo progetto come tesina
. avevo sentito dire che era stato implementato un sistema basato su reti neurali, chiamato NetTalk, che era stato concepito per quello scopo

Avevo dato un'occhiata al codice relativo ad algoritmi ad hoc per questo compito, e si tratta di algoritmi abbastanza "ingarbugliati", perché sostanzialmente non c'è una precisa regolarità nella pronuncia.

Tuttavia una metaregola generale banalmente c'è, su cui anche il "nettalk" è basato: il fatto che ogni lettera si pronuncia in modo diverso in funzione del suo contesto, cioè delle lettere vicine.

L'algoritmo che avevo implementato è basato su questo principio ed in particolare si comporta come segue:
memorizza ogni associazione singola lettera->fonema riscontrata negli esempi, ed assumi in prima istanza che questa associazione sia una regola generale, a meno che tu non trovi un esempio che contraddice questa regola
Quando trovi un esempio che contraddice questa regola, allora elimina la regola, e crea nuove regole in cui tieni conto delle informazioni di contesto del primo e del secondo caso, ovvero regole che associano non la lettera stessa al fonema, ma la lettera preceduta da una certa lettera e seguita da una certa altra lettera.

Naturalmente anche queste regole potrebbero essere in contraddizione tra loro, cioè no risolvere completamente l'ambiguità. In quel caso si espande l'ipotesi e si include nel contesto anche la lettera immediatamente precedente e successiva al quella "tripla".

E così via fino a che le regole risultano tutte consistenti rispetto al training set.

Una volta memorizzate le regole, l'algoritmo di pronuncia che associa ad una parola la sua rappresentazione fonetica non fa altro che parsare lettera per lettera la parola in ingresso, e fa un lookup sulle regole memorizzate, che dicono sostanzialmente come andrebbe pronunciata quella lettera in quel contesto.

Naturalmente questo significa che per le parole appartenenti al training set il sistema funziona perfettamente, mentre se ci sono parole non appartenenti al training set potrebbe esserci ancora qualche ambiguità. In quel caso non ricordo bene che scelta feci. Se non erro c'era un mix di euristica unita ad una scelta casuale, tra quelle possibili.

Comunque funzionava abbastanza bene, nel senso che il principio era sufficentemente semplice e generale, funzionava al 100% sul training set (mentre è noto che con le reti neurali questo di solito non avviene), la struttura dati contenente le regole era relativamente piccola, una sorta di albero di decisione, e consentiva una buona generalizzazione.

Questo progetto fu fatto nel lontano '93, ma non ricordo quando lo feci aggiungere al repository comp.speech, ne' so quante persone lo abbiano scaricato, visionato.

Nessun commento:

Informazioni personali

La mia foto
I have been coding from the old C64 times. Studied Computer Sciences at Milan University. I also worked there in technical operations. Many years of experiences in coding Java and C#, desktop and web applications, with practices like unit testing. I used to play with 3d graphics in architecture recently with Blender 3d. Now I look for support related to some projects I am working on, oriented in automation in tourism related services, using functional programming framework, specifically F# and Suave.IO. email
tonyx1 (at) gmail.com github https://github.com/tonyx