From 05e8a671c1caf54a0ec8f8e0db4d786e87d24055 Mon Sep 17 00:00:00 2001 From: yemaozi88 <428968@gmail.com> Date: Sun, 13 Jan 2019 23:36:02 +0100 Subject: [PATCH] forced alignment by novoapi is performed. --- .vs/acoustic_model/v15/.suo | Bin 84480 -> 71168 bytes acoustic_model/check_novoapi.py | 69 +++++++++++++++++++++++++++- acoustic_model/novoapi_functions.py | 21 ++++++++- 3 files changed, 87 insertions(+), 3 deletions(-) diff --git a/.vs/acoustic_model/v15/.suo b/.vs/acoustic_model/v15/.suo index 9fe1f2136ee18d47f8e6c82b824e73835098274b..f5fd7886def8bd17ad70bdd8dbb5b128a60a9480 100644 GIT binary patch delta 4289 zcmeH}YfzNe8OPt}WkD8LSp@;*w!i`_thmcXRVHcJ0z*(FW1ZStYh zFFiZIJj%mF1adDC)MS#0QLqo`da>@x;syy1e^z`=*9(|t{qSn*E zJ#r5<@GW_WJbWu6v!M*t7!yo2kmrF|p#7)%WXLl@QG*aJP+7`1{8wu zIFZjmxef?bi1ZNT*}w%#z$}33u|xF`8o=V=ilG&~uEHHFQCJ1mhAM+o;BOtu>%j)l z_O-TllsADMum!k5ClF)1L%EQ5Kzq^jW zgwP5)dR?j7M8LNxE!Puw#%-4u68{z1Jd||v*r_Xvwuu7<$rm&8|LQ1g5nM)n|;1tE*dJ0Ls zJHC_T(XdhK9%VrhIaEhRfchr5!y_%?l6<0(HLEr_wzy}yS1-=gsfx9P~eoVdX(f$IBf3EDe$i6%yg(~g-Qca)PEz1i??W{dV ze5RyQ^%Q%^XFsE*Xp9~O_`nGh-?Z0h#5uv9GBdj?_x0JFq3%<=i1O6WQ$~?*nUkHx zm|>ZhRQ>X6d7TLc<_HUL?P9qN~0XsPqPbE3}cHxs= z=kDFJBS~C1!Ee6#M6#x~ytqb?UiYf z%Aa&;Pe1ccWlkODkQOK4GLpaCGh8j0)a@&Fk+0Y}qI<5MQ^V$lM4q!ImfsspXV2^a z9~?;MgPweDNl)b8tV!afzc1(gYf}A(qkQ#&WXnj}w$*AgTej9VwQOnL&2Oy9K+kNw zyLpSdvAMN#-R8E|jm@oYu1+7%js{Phut7W!R|zk_kU8#g2J>S4*Ry&AaS>xnmm-KviZ(h{a(h{?^3{}?vFPmO>f9>DQ$>Nya90}^EgoLg-rCX9A}%_ikt=7i z4po!aI?wrLS?&id=|`>}xs<#rOD`J3_WL*s_ZqI>-MD&9IA#jUB_K;KvqR|YG)6Y4cf#3m4ZQHgNwvyytdF-pEqOs(HX{$sMQ z^|N~;>tDyh{hT~j#yXe9*J0hEm!IS8;~CEdj#G>{KjFW4zj4#xl=xN6tD8Dn+>P#y z?e~O4gzt=r54|}W9S2Cuje{T1EWUnvlHVuum5Zrz!Az8F+;&0FZ(p#n<6>-*8eCBP znF8nV4~BJi*oNQ{!C6(e9T_4wY{TFYDXHPtDI`3ugfRp_n zJ;L5VBp(^j@#`N=ACc3~J9Tr=^NXO}@&oUvn?BLd*x{GAm^kF?HC$bq!WlQ#vg4|Q zv(l5eZom=T?VUjr|LF7$-=Bx5hz+F%e!1VE2Cg~ikeveTx?=U6i9b|{XL|gZ@vIrh z*CpUPL~v>G;C90WOYi{v1Pb1QxBAD(-LaC?kM?a)?iQI*1nEj06a8M&>=49y? zqi@*L`mLYN<+>aTTLaDb)>QUf?TP7Xvd&*19$ymYUbaUsc~86;QCN4`#-3{?Q~gTU z)Q&D^`=Yt+r7eXUEQKvI>ZX@Xe)Pj%nx?;0`+h%tJpP^F#Mdt$_ur7&*E^sN9JWXD z*c)!BATa`m183ejK?jtqLh9z*8HuB!V`|F6yX2aT#gW$o_c43){aMqpIW86%paMh!xMQ;kY;l zcP$IL{=0{TBa&8a9Q+9d{aZXK#M1)L^1!>0#ohFu{ChK4b}Zd90h6ry=d6k-!9_wq=9e;-_+9Ph>cR4GA4$`!=qLp zex#UKaeDCXYn3DMp;(O+3=sb9^C|kT2ZLI7{kW_gF;Y@UYkb?1p=2AWOL>+^bE+Vp zS_#gz_Gim2ME|=`QCt&ghVs0XmML}PNF$CdWzY;yt}s)YVkji9Qg5Km$`=K&xj$(C sQ)oXQ+`DpjG6M4PQ0UE9ypt)4)(Ur9$P2SYl;;bFQ)ZY@5&qVH07$}MVgLXD delta 7179 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 diff --git a/acoustic_model/check_novoapi.py b/acoustic_model/check_novoapi.py index 178706b..1814a6b 100644 --- a/acoustic_model/check_novoapi.py +++ b/acoustic_model/check_novoapi.py @@ -139,6 +139,71 @@ df_per_word = pd.DataFrame(index=[], columns=df_samples.keys()) for word in word_list: df_samples_ = df_samples[df_samples['word']==word] - df_samples_ = df_samples_[df_samples_['frequency']>1] + df_samples_ = df_samples_[df_samples_['frequency']>2] df_per_word = df_per_word.append(df_samples_, ignore_index=True) -df_per_word.to_excel(os.path.join(default.stimmen_dir, 'pronunciation_variants_novo70.xlsx'), encoding="utf-8") \ No newline at end of file +#df_per_word.to_excel(os.path.join(default.stimmen_dir, 'pronunciation_variants_novo70.xlsx'), encoding="utf-8") + + +## ===== forced alignment ===== +if forced_alignment: + Results = pd.DataFrame(index=[], + columns=['filename', 'ipa', 'word', 'result_ipa', 'result_novo70', 'llh']) + for word in word_list: + #for word in ['Oor']: + # pronunciation variants top 3 + df_per_word_ = df_per_word[df_per_word['word']==word] + df_per_word_ = df_per_word_.sort_values('frequency', ascending=False) + if len(df_per_word_) < 3: # pauw, rozen + pronunciation_ipa = list(df_per_word_['ipa']) + elif word=='Reuzenrad': + pronunciation_ipa = [ + df_per_word_.iloc[0]['ipa'], + df_per_word_.iloc[1]['ipa'], + df_per_word_.iloc[2]['ipa'], + df_per_word_.iloc[3]['ipa']] + else: + # oog, oor, reus, roeiboot + pronunciation_ipa = [ + df_per_word_.iloc[0]['ipa'], + df_per_word_.iloc[1]['ipa'], + df_per_word_.iloc[2]['ipa']] + #print("{0}: {1}".format(word, pronunciation_ipa)) + + # samples for the word + df_ = df[df['word']==word] + + # samples in which all pronunciations are written in novo70. + samples = df_.query("ipa in @pronunciation_ipa") + + results = pd.DataFrame(index=[], + columns=['filename', 'ipa', 'word', 'result_ipa', 'result_novo70', 'llh']) + + #j = 0 + for i in range(0, len(samples)): + sample = samples.iloc[i] + wav_file = os.path.join(default.stimmen_wav_dir, sample['filename']) + if os.path.exists(wav_file): + #j += 1 + #print('{0} - {1}'.format(word, i)) + pronunciation_ipa_ = [ipa.replace(':', 'ː') for ipa in pronunciation_ipa] + result = novoapi_functions.forced_alignment(wav_file, word, pronunciation_ipa_) + result_ipa, result_novo70, llh = novoapi_functions.result2pronunciation(result, word) + result_ = pd.Series([ + sample['filename'], + sample['ipa'], + sample['word'], + ' '.join(result_ipa), + ' '.join(result_novo70), + llh + ], index=results.columns) + results = results.append(result_, ignore_index = True) + print('{0}/{1}: answer {2} - prediction {3}'.format( + i+1, len(samples), result_['ipa'], result_['result_ipa'])) + + if len(results) > 0: + Results = Results.append(results, ignore_index = True) + Results.to_excel(os.path.join(default.stimmen_dir, 'Results.xlsx'), encoding="utf-8") +else: + Results_xlsx = pd.ExcelFile(os.path.join(default.stimmen_dir, 'Results.xlsx'), encoding="utf-8") + R = pd.read_excel(Results_xlsx, 'Sheet1') + diff --git a/acoustic_model/novoapi_functions.py b/acoustic_model/novoapi_functions.py index bbf44ff..c8640c0 100644 --- a/acoustic_model/novoapi_functions.py +++ b/acoustic_model/novoapi_functions.py @@ -36,10 +36,29 @@ def load_phonset(): phoneset_novo70.append(novo70) translation_key_ipa2novo70[ipa] = novo70 translation_key_novo702ipa[novo70] = ipa + + # As per Nederlandse phoneset_aki.xlsx recieved from David + # [ɔː] oh / ohr # from ipa->novo70, only oh is used. + # [ɪː] ih / ihr # from ipa->novo70, only ih is used. + # [iː] iy + # [œː] uh + # [ɛː] eh + # [w] wv in IPA written as ʋ. + extra_ipa = ['ɔː', 'ɪː', 'iː', 'œː', 'ɛː', 'ʋ'] + extra_novo70 = ['oh', 'ih', 'iy', 'uh', 'eh', 'wv'] + for ipa, novo70 in zip(extra_ipa, extra_novo70): + phoneset_ipa.append(ipa) + phoneset_novo70.append(novo70) + translation_key_ipa2novo70[ipa] = novo70 + translation_key_novo702ipa[novo70] = ipa + + translation_key_novo702ipa['ohr'] = 'ɔː' + translation_key_novo702ipa['ihr'] = 'ɪː' + phoneset_ipa = np.unique(phoneset_ipa) phoneset_novo70 = np.unique(phoneset_novo70) - return + return phoneset_ipa, phoneset_novo70, translation_key_ipa2novo70, translation_key_novo702ipa def multi_character_tokenize(line, multi_character_tokens):