CFSWString syllabify2(CFSWString s) { CFSWString res; for (INTPTR i = 0; i < s.GetLength(); i++) { CFSWString c = s.GetAt(i); if (is_consonant(c) && is_vowel(s.GetAt(i - 1)) && is_vowel(s.GetAt(i + 1))) res += d; if (is_vowel(c) && is_vowel(s.GetAt(i - 1)) && is_vowel(s.GetAt(i + 1)) && c.ToLower() == s.GetAt(i + 1)) res += d; if (is_consonant(c) && is_consonant(s.GetAt(i - 1)) && is_vowel(s.GetAt(i + 1)) && has_vowel(res)) //küsitav res += d; res += c; } return res; }
CFSArray<CFSWString> do_all(CFSWString utt, bool print_label, bool print_utt) { CFSArray<CFSWString> res; CFSArray<CPTWord> PTW; utterance_struct u; u.s = utt.ToLower(); u.syl_c = 0; u.phone_c = 0; u.phra_c = do_phrases(u); INTPTR word_count = 0; if (print_utt) fprintf(stderr, "%s\n", ccstr(utt)); for (INTPTR i = 0; i < u.phr_vector.GetSize(); i++) { u.phr_vector[i].utt_p = i; phrase2words(u.phr_vector[i], PTW); word_count += u.phr_vector[i].word_c; } CFSArray<CMorphInfo> words; for (INTPTR i = 0; i < PTW.GetSize(); i++) { CMorphInfo MI; MI.m_szRoot = PTW[i].m_szWord; words.AddItem(MI); } u.word_c = words.GetSize(); word_struct w; INTPTR utt_phone_c = 1; INTPTR syl_utt_p = 1; INTPTR phone_utt_p = 1; for (INTPTR i = 0; i < u.phr_vector.GetSize(); i++) { u.phr_vector[i].utt_p = i + 1; INTPTR syl_phr_p = 1; INTPTR phone_phr_p = 1; INTPTR phrase_pho_c = 1; for (INTPTR i1 = 0; i1 < u.phr_vector[i].word_c; i1++) { w.utt_p = utt_phone_c++; w.phr_p = i1 + 1; w.mi = words[0]; w.mi.m_szRoot += make_char_string(w.mi.m_szEnding) + w.mi.m_szClitic; w.mi.m_szRoot = w.mi.m_szRoot.ToLower(); do_syls(w); u.phr_vector[i].word_vector.AddItem(w); INTPTR phone_word_p = 1; INTPTR word_pho_c = 1; for (INTPTR i2 = 0; i2 < u.phr_vector[i].word_vector[i1].syl_vector.GetSize(); i2++) { u.syl_c++; u.phr_vector[i].syl_c++; u.phr_vector[i].word_vector[i1].syl_c++; u.phr_vector[i].word_vector[i1].syl_vector[i2].phr_p = syl_phr_p++; u.phr_vector[i].word_vector[i1].syl_vector[i2].utt_p = syl_utt_p++; INTPTR syl_phone_c = 1; do_phones(u.phr_vector[i].word_vector[i1].syl_vector[i2]); for (INTPTR i3 = 0; i3 < u.phr_vector[i].word_vector[i1].syl_vector[i2].phone_vector.GetSize(); i3++) { u.phone_c++; u.phr_vector[i].phone_c = phrase_pho_c++; u.phr_vector[i].word_vector[i1].phone_c = word_pho_c++; u.phr_vector[i].word_vector[i1].syl_vector[i2].phone_c = syl_phone_c++; phone_struct p = u.phr_vector[i].word_vector[i1].syl_vector[i2].phone_vector[i3]; p.utt_p = phone_utt_p++; p.phr_p = phone_phr_p++; p.word_p = phone_word_p++; u.phr_vector[i].word_vector[i1].syl_vector[i2].phone_vector[i3] = p; } } words.RemoveItem(0, 1); } } if (print_label) print_u(u); res = do_label(u); return res; }
CFSWString the_shift(CFSWString s) { /* On mingi võimalus, et lihtsustus tuleb teha kahes astmes. LQ-ta ja LQ-ga (vt shift_pattern). Kõik seotud sellega, et pole vältenihutusreeglitest lõpuni aru saanud. Eksisteerib Mihkla versioon ja ametlik versioon. Tänud Mihklale, kes kala asemel annab tattninale õnge, see õpetab ujuma. Maadlesin õngega pikalt. */ CFSWString res; CFSWString code; INTPTR pos; INTPTR i = 0; INTPTR x; while (s.GetLength() > 0) { CFSWString c = s.GetAt(0); s.Delete(0, 1); if (is_uvowel(c)) { c = c.ToLower(); code += shift_pattern(c); res += c; pos = i; } else if (c == d && code.GetLength() > 0) { res += c; code += c; CFSWString t_code = code; t_code += shift_pattern(s.GetAt(0)); x = pattern_lookup(t_code); //orig üle silbipiiri if (x > -1) { x += pos; if (x > res.GetLength()) { // kui kargab järgmisse silpi x = x - res.GetLength(); s.Insert(x, colon); } else res.Insert(x, colon); i++; } else { t_code = simplify_pattern(t_code); x = pattern_lookup(t_code); //liht üle silbipiiri if (x > -1) { x += pos; if (x > res.GetLength()) { // kui kargab järgmisse silpi x = x - res.GetLength(); s.Insert(x, colon); } else res.Insert(x, colon); i++; } else { x = pattern_lookup(code); //orig if (x > -1) { x += pos; res.Insert(x, colon); i++; } else { code = simplify_pattern(code); x = pattern_lookup(code); //liht if (x > -1) { x += pos; res.Insert(x, colon); i++; } } } } code = empty_str; } else { res += c; if (code.GetLength() > 0) { code += shift_pattern(c); } } i++; } //while // sõna lõpus if (code.GetLength() > 0) { code += L"#"; //imelik koht ainult "lonksu" pärast if ((code.Left(3) == L"VLQ") && ((code.GetAt(3) == L's') || (code.GetAt(3) == L'h') || (code.GetAt(3) == L'v') || (code.GetAt(3) == L'j'))) { code = L"VLQC#"; } INTPTR x = pattern_lookup(code); if (x > -1) { x += pos; res.Insert(x, colon); } else { code = simplify_pattern(code); x = pattern_lookup(code); if (x > -1) { x += pos; res.Insert(x, colon); } } code = empty_str; } return res; }