[zxspectrum] Re: ZX Spectrum ItaSpeak 1.0 - Demo WAV

  • From: Luca Alimandi <luca.alimandi62@xxxxxxxxxxx>
  • To: zxspectrum@xxxxxxxxxxxxx
  • Date: Thu, 29 Sep 2016 01:33:09 +0200



On Wed, Sep 28, 2016 at 12:12 PM +0800, "Giacomo Paganelli" <detonazione@xxxxxxxxx <mailto:detonazione@xxxxxxxxx>> wrote:

Hey Luca, questo e' fantastico, mi riporta indietro con la memoria!! :)


Mi fa molto  piacere!

Proprio come te, nell'83 (credo) creai un programma in assembly per far parlare in Italiano il mio beneamato Spectrum 48K. Usai lo Spectrum stesso per digitalizzare la via voce e, con mia grande sorpresa, nonostante la terribile qualita' del campionamento, la voce era intellegibile. Ovviamente scrissi una serie di regole per interpretare il parlato, per esempio l'uso della C come /k/ o /tʃ/.


Già, questa è la parte più complessa, in effetti!

Ho provato a rintracciare il programma anni fa ma, ahime', ho scoperto che la mia famiglia ha buttato via tutte le mie cassette, senza informarmi. Ho perso tutto :(


Ahi ahi, che peccato!!! :-( Sarebbe stato fantastico poter condividere quel lavoro oggi!

Ho ascoltato il tuo esempio e ho notato i gap tra i fonemi: ricordo che ebbi lo stesso problema!!!

Se ti puo' essere di aiuto, risolvetti questo problema eliminando la parte iniziale e finale dei fonemi - in pratica l'attack e decay - in particolare le per consonanti. Ogni taglio richiese parecchia pazienza.

Verissimo. Ho fatto lo stesso!


Il modo in cui verificai la qualita' dei fonemi "tagliati" fu di creare parole, vere o finte, con vocali e doppie consonanti e ascoltare se erano pronunciate correttamente.

Uno schema puo' essere: consonante-vocale-consonante-consonante-vocale

Per la lettera B, un esempio puo' essere "BEBBE". Se il fonema e' "tagliato" bene, non si sentira' il gap tra le doppie B/

All'incirca anche io faccio la stessa cosa... Se hai altra idee, fammi sapere, che mi interessa!


Spero che questo sia di aiuto! Fammi sapere se hai bisogno di altre info.

Ciao,
Giacomo

Mooolto interessante! Allora non sono l'unico pazzo che crede (o ha creduto) di poter "far parlare" lo Spectrum! :-)
Mi fa piacere che qualcun altro ha già tentato delle strade simili, e mi invoglia a condividere quello che sto facendo adesso (a distanza di ben 30 anni dai primi esperimenti!... Se non so' pazzi non li volemo!... :-D

Comunque, entrando un po' in particolari (sarò un po' lungo e mi dispiace per chi non è interessato!... Ma d'altra parte la lista è fatta proprio per condividere anche queste esperienze!...), il metodo di sintesi <https://it.wikipedia.org/wiki/Sintesi_vocale> che ho adottato io (perché il più semplice da realizzare) è quello "*concatenativo*" (mentre la maggior parte delle sintesi odierne usa quello "*per difoni*").

Al momento sto usando un misto di fonemi:
- alcuni sono derivanti dal progetto iniziale (all'epoca li ottenni *campionando* direttamente a 8 bit con lo Spectrum, come facesti tu, credo, attraverso un'*interfaccia di conversione A/D e D/A* - mi pare fosse un kit di "Nuova Elettronica" - che costruii in quegli anni - ecco un paio di foto <https://drive.google.com/file/d/0B2gTtPKDTuD_enRGQUJvLUJqLWc/view?usp=sharing> dell'attrezzo <https://drive.google.com/file/d/0B2gTtPKDTuD_c082OFNqWWhOZFk/view?usp=sharing>!)
- altri sono stati estrapolati da sintesi vocali per PC (ad esempio da "*It_flite*" dell'IRST di Trento e dell'ISTC di Padova, del 2004), rimaneggiati e riadattati a 8 bit e alla frequenza di campionamento che uso sullo Spectrum
- altri campionati sul PC con programmi tipo *Audacity *e *Wavosaur*.

Tra parentesi, la sintesi It_flite sono riuscito ad adattarla per essere usata senza istallazione, come programma *totalmente "portable"*, cosa non da poco per una sintesi vocale!

Devo dire che, in se stessi, i fonemi sono abbastanza curati (anche se ascoltando la sintesi non sembra, ci ho messo un sacco di tempo per raffinarli al livello a cui sono ora!).
Il problema adesso è che la loro concatenazione deve essere pilotata da un programma un po' più "*intelligente*" di quello attuale, che comunque applica già un'analisi abbastanza sofisticata; ma se si vuole ottenere qualcosa di ancora più comprensibile, occorre migliorare ancora, il che però comporta una complicazione della fase di analisi e quindi rischia di rallentare la fluidità del parlato.

L'analisi gestisce già abbastanza bene gli *spazi*, la *punteggiatura *e le *lettere accentate* (a fine parola). C'è anche un abbozzo di "*prosodia*" simulata (un andamento "ondulato" della frequenza di base, che diminuisce un po' l'effetto "cantilena", o "monotonico").

Il problema delle *consonanti doppie* <http://www.treccani.it/enciclopedia/lettere-doppie_%28Enciclopedia-dell%27Italiano%29/> è quasi risolto; ho individuato due tipi di doppie: io le ho definite "sonore" e "mute". Le prime sono consonanti che, quando presenti a coppia, producono un suono più lungo della consonante singola, ma non possono essere ottenute concatenando due volte lo stesso fonema (si sentirebbe una schifezza!...). Queste sono, ad esempio, le "mm", le "nn", le "rr", ecc.. Le seconde sono consonanti che danno luogo ad una sorta di "pausa" tra la consonante e la vocale immediatamente precedente. Ed esempio "tt", "pp", "dd", ecc..

L'analisi del testo individua quali consonanti doppie si presentano e nel primo caso utilizza un fonema specifico (la "doppia m", ecc..), nel secondo caso produce semplicemente una *breve pausa* prima di pronunciare la consonante.

Ora, l'effetto sgradevole di certe doppie nel file di esempio, l'ho corretto abbastanza bene semplicemente *tarando* meglio questa pausa, che era un po' troppo lunga.
Prossimamente condividerò un nuovo file per poter fare un confronto.

Non ho ancora trovato una soluzione al problema delle parole "sdrucciole <https://it.wikipedia.org/wiki/Parola_sdrucciola>" (o "bisdrucciole"), ossia con accento tonico sulla terzultima (o quartultima) vocale.
Data la rarità di tali parole, si potrebbe accettare il compromesso di non gestirle.

Altro problema sono il "dittongo <http://www.treccani.it/enciclopedia/dittongo_%28Enciclopedia-dell%27Italiano%29/>" e lo "iato <http://www.treccani.it/enciclopedia/iato_%28Enciclopedia-dell%27Italiano%29/>". Se nella mia parola si presentano due *vocali vicine*, come "ia" (di "piano"), "io" (di "gioco"), "ie" (di "miele"), ecc., la "i" deve avere una durata molto inferiore di una "i" "nornale" (per questo viene detta "semivocale <http://www.treccani.it/enciclopedia/semivocali_%28Enciclopedia-dell%27Italiano%29/>").

In pratica, secondo il principio dei "difoni" (usati nelle sintesi odierne) dovrei campionare l'intero dittongo, ma ottengo un risultato abbastanza soddisfacente anche utilizzando un fonema "i" più breve, ed è quello che faccio attualmente nella mia sintesi... Come immaginate, lo spazio a disposizione per i fonemi non è molto, e la RAM in uno Spectrum è una risorsa preziosa e va usata con molta parsimonia!.

Peccato che ci sono parole in cui le due vocali formano uno "iato", ossia le due vocali fanno parte di due sillabe diverse, e in tal caso vanno pronunciate entrambe come vocali "intere". Il problema è progettare l'analizzatore di testo in modo che possa distinguere un dittongo da uno iato, e pronunciare le due vocali nel modo corretto. Ma regole semplici e chiare per discernere questi casi non ce ne sono, purtroppo...

Di fatto, nella lingua italiana, lo iato è molto meno frequente del dittongo, per cui potrei chiudere un occhio (anzi, un orecchio! :-)) e accontentarmi di pronunciare i dittonghi sempre come... dittonghi. Ma alcune parole di uso frequente suonano proprio male! Ad esempio le parole "io", o "mio", se pronunciate come dittongo, nemmeno si capiscono (è un po' come pronunciare la parola "miò"!). In parte ho risolto la cosa scrivendo tali parole con la "ì" accentata. Così "mìo" viene pronunciato correttamente. Ma sarebbe bello che questa "correzione" fosse fatta automaticamente, non nel testo.

Una possibile soluzione è quella di fare un elenco delle parole più comuni contenenti uno iato e controllare se la parola da pronunciare sia una di esse, e comportarsi di conseguenza.

Altra questione difficile da gestire è la distinzione tra i due suoni della "*z **dolce*", come in "zaino", e della "*z **aspra*", come in "lenza".
Esistono delle regole <http://www.attori.com/dizione/Diz11.htm> (anche se con molte eccezioni), ma realizzare l'analisi è un po' complesso.
Semplificando un po', ci si potrebbe limitare a utilizzare la "z dolce" nelle parole in cui si trova "izz" seguito da "a", "o", "i", "ò", "are", "ato", "ati", "atore", "atori", "ando", "azione", ecc. (es. "organ*_izz_are*", "organ*_izz_azione*"), e usare la "z aspra" nelle parole in cui si trova "azz" oppure "ozz" seguito dalle stesse desinenze (es. "amm*_azz_ato*"). Per lo meno così si mettono a posto i verbi e i loro derivati! Quello che complica la cosa sono le molte eccezioni... Infatti tali regole non valgono sempre. Ad esempio "ammortizzare" e "raddrizzare" usano due diverse pronunce. Un casino, insomma!

Poi c'è tutta la questione delle parole "straniere", della lettura dei "numeri", delle "abbreviazioni", degli "acronimi", ecc..
Per ora ho solo espanso i numeri "1", "2", ecc. nel corrispettivo scritto "uno", "due", ecc.; ma anche qui occorre aggiungere maggiore logica per distinguere numeri con virgola, decine, centinaia, migliaia, milioni, e miliardi, numeri di telefono, ecc...

Insomma, è un lavoraccio! Ancora ne passerà prima di arrivare ad avere una sintesi "come si deve", ma non demordo, e un passettino alla volta, forse ci arriverò! ;-)


--

|_ /-\

Other related posts: