06.05.2004 CZR_Synteza reci ============================================================================== Vasim ukolem bude sestrojit jednoduchy TTS pro syntezu cislic. na webu Mate k dispozici nachystane nasledujici skripty pro textovou a fonetickou analyzu: - prevod na cisla: csnumber2txt.pl - prevod na fonemy (jednoducha pravidla) gr2phn_czr.pl - prevod do Sampy: sampify_czr.pl (http://moon.feld.cvut.cz/sampa/) Trosku si s tim pohrajte Podivejte se dovnitr (jak to funguje) PRIKLAD: echo 132456,7 | csnumber2txt.pl | gr2phn_czr.pl | sampify_czr.pl ============================================================================== V matlabu se pokuste udelat konkatenativni syntezu Opet k dispozici mate: - retezec fonemu, ktery si vygenerujete pomoci vyse uvedenych skiptu - corpus - recovou databazi (V10?.wav). - indexacni soubor: phonemes.list - obsahuje foneticky popis signalovych souboru (tzv. Forced Alignment) - pomocnou funkci pro matlab: findcstr.m v poli cells najde indexy vyskytu hledaneho retezce (fonemu) Nacist indexacni soubor muzete treba takto FS=16000; transc='phonemes.list'; [SigFileName,Beg,End,Phn,Like] = textread(transc,'%s%f%f%s%f'); % convert that to samples Beg = round(Beg * 100e-9 * FS); End = round(End * 100e-9 * FS); Textova a foneticka analyza se z matlabu provest napriklad takto a = '3267890,12'; cmd = ['echo ' a ' | csnumber2txt.pl | gr2phn_czr.pl | sampify_czr.pl > kkk' ]; system (cmd); aa=textread('kkk','%s','emptyvalue',1); A priklad te nejjednodussi konkatenativni syntezy je tady Synth=[]; %SynthSignal Shift=0; %Shift - pro pripad ze by indexy a wavka nesedely uplne presne for Phoneme=1:length(aa) disp(['Fonem cislo: ',num2str(Phoneme),' -> ',cell2mat(aa(Phoneme))]); if ~strcmp(aa(Phoneme),'pau') IndexArr=findcstr(Phn,aa(Phoneme)); namesig = [cell2mat(SigFileName(IndexArr(1))),'.wav'] sig=wavread(namesig); Synth=[Synth,(sig(Beg(IndexArr(1)+Shift):End(IndexArr(1))+Shift))']; end end % musime zapsat do souboru, protoze Linux-Matlab neumi hrat 16k Synth = 0.99 * Synth / max (abs(Synth)); wavwrite (Synth,16000,16,'kkk.wav'); % a nebo ... ggg = decimate(Synth,2); soundsc(ggg); =================================================================================================== Vasim ukolem je si s tim pohrat, pridat generovani ticha pro pauzy, muzete zmenit vyber jednotek (nyni se bere prvni nalezena), udelat prizpusobeni energie, muzete zkusit zmenit vyhledavaci funkci, tak aby hledala i podle kontextu Preji prijemnou zabavu ;) Igor