From 47521d5c1b830a4bcbfd1384e9e7aab2bccf43b0 Mon Sep 17 00:00:00 2001 From: cadlaxa Date: Sat, 22 Jun 2024 19:23:16 +0800 Subject: [PATCH 1/7] Fix [CV] validation --- .../ArpasingPlusPhonemizer.cs | 38 ++++++++++++++----- 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/OpenUtau.Plugin.Builtin/ArpasingPlusPhonemizer.cs b/OpenUtau.Plugin.Builtin/ArpasingPlusPhonemizer.cs index 4e21f13b2..957182aac 100644 --- a/OpenUtau.Plugin.Builtin/ArpasingPlusPhonemizer.cs +++ b/OpenUtau.Plugin.Builtin/ArpasingPlusPhonemizer.cs @@ -387,7 +387,7 @@ protected override List ProcessSyllable(Syllable syllable) { } else if ((HasOto($"{prevV} {v}", syllable.vowelTone) || HasOto(ValidateAlias($"{prevV} {v}"), syllable.vowelTone) && (!HasOto(v, syllable.vowelTone) && !HasOto(ValidateAlias(v), syllable.vowelTone)) && (!HasOto(ccv, syllable.vowelTone) && !HasOto(ValidateAlias(ccv), syllable.vowelTone)) && (!HasOto(crv, syllable.vowelTone) && !HasOto(ValidateAlias(crv), syllable.vowelTone)))) { basePhoneme = $"{prevV} {v}"; } else { - basePhoneme = $"{cc.Last()} {v}"; + basePhoneme = $"{cc.Last()}{v}"; } // TRY RCC [- CC] for (var i = cc.Length; i > 1; i--) { @@ -409,7 +409,7 @@ protected override List ProcessSyllable(Syllable syllable) { /// CV if (HasOto(crv, syllable.vowelTone) || HasOto(ValidateAlias(crv), syllable.vowelTone)) { basePhoneme = crv; - } else if ((HasOto(cv, syllable.vowelTone) || HasOto(ValidateAlias(cv), syllable.vowelTone)) && (HasOto(crv, syllable.vowelTone) && HasOto(ValidateAlias(crv), syllable.vowelTone))) { + } else if ((HasOto(cv, syllable.vowelTone) || HasOto(ValidateAlias(cv), syllable.vowelTone)) && (!HasOto(crv, syllable.vowelTone) && !HasOto(ValidateAlias(crv), syllable.vowelTone))) { basePhoneme = cv; /// C+V } else if ((HasOto(v, syllable.vowelTone) || HasOto(ValidateAlias(v), syllable.vowelTone)) && (!HasOto(cv, syllable.vowelTone) && !HasOto(ValidateAlias(cv), syllable.vowelTone)) && (!HasOto(crv, syllable.vowelTone) && !HasOto(ValidateAlias(crv), syllable.vowelTone))) { @@ -436,6 +436,9 @@ protected override List ProcessSyllable(Syllable syllable) { /// C-Last V } else if (syllable.CurrentWordCc.Length == 1 && syllable.PreviousWordCc.Length == 1) { basePhoneme = crv; + if ((HasOto(cv, syllable.vowelTone) || HasOto(ValidateAlias(cv), syllable.vowelTone)) && (!HasOto(crv, syllable.vowelTone)) || !HasOto(ValidateAlias(crv), syllable.vowelTone)) { + basePhoneme = cv; + } } } // try [V C], [V CC], [VC C], [V -][- C] @@ -479,8 +482,10 @@ protected override List ProcessSyllable(Syllable syllable) { for (var i = firstC; i < lastC; i++) { var ccv = $"{string.Join("", cc.Skip(i))} {v}"; + var ccv1 = $"{string.Join("", cc.Skip(i))}{v}"; var cc1 = $"{string.Join(" ", cc.Skip(i))}"; var lcv = $"{cc.Last()} {v}"; + var cv = $"{cc.Last()}{v}"; if (!HasOto(cc1, syllable.tone)) { cc1 = ValidateAlias(cc1); } @@ -510,8 +515,14 @@ protected override List ProcessSyllable(Syllable syllable) { basePhoneme = ccv; lastC = i; break; + } else if (HasOto(ccv1, syllable.vowelTone) || HasOto(ValidateAlias(ccv1), syllable.vowelTone) && !ccvException.Contains(cc[0])) { + basePhoneme = ccv1; + lastC = i; + break; } else if ((HasOto(lcv, syllable.vowelTone) || HasOto(ValidateAlias(lcv), syllable.vowelTone)) && HasOto(cc1, syllable.vowelTone) && !HasOto(ccv, syllable.vowelTone)) { basePhoneme = lcv; + } else if ((HasOto(cv, syllable.vowelTone) || HasOto(ValidateAlias(cv), syllable.vowelTone)) && HasOto(cc1, syllable.vowelTone) && !HasOto(lcv, syllable.vowelTone)) { + basePhoneme = cv; } // [C1 C2C3] if (HasOto($"{cc[i]} {string.Join("", cc.Skip(i + 1))}", syllable.tone)) { @@ -519,13 +530,16 @@ protected override List ProcessSyllable(Syllable syllable) { } } else if (syllable.CurrentWordCc.Length == 1 && syllable.PreviousWordCc.Length == 1) { basePhoneme = lcv; + if ((HasOto(cv, syllable.vowelTone) || HasOto(ValidateAlias(cv), syllable.vowelTone)) && (!HasOto(lcv, syllable.vowelTone)) || !HasOto(ValidateAlias(lcv), syllable.vowelTone)) { + basePhoneme = cv; + } // [C1 C2] if (!HasOto(cc1, syllable.tone)) { - cc1 = $"{cc[i]} {cc[i + 1]}"; + cc1 = $"{cc[i]} {cc[i + 1]}"; } } // C+V - if ((HasOto(v, syllable.vowelTone) || HasOto(ValidateAlias(v), syllable.vowelTone)) && (!HasOto(lcv, syllable.vowelTone) && !HasOto(ValidateAlias(lcv), syllable.vowelTone))) { + if ((HasOto(v, syllable.vowelTone) || HasOto(ValidateAlias(v), syllable.vowelTone)) && (!HasOto(lcv, syllable.vowelTone) && !HasOto(ValidateAlias(lcv), syllable.vowelTone) && (!HasOto(cv, syllable.vowelTone) && !HasOto(ValidateAlias(cv), syllable.vowelTone)))) { cPV_FallBack = true; basePhoneme = v; cc1 = ValidateAlias(cc1); @@ -556,28 +570,34 @@ protected override List ProcessSyllable(Syllable syllable) { basePhoneme = ccv; lastC = i; break; + } else if (HasOto(ccv1, syllable.vowelTone) || HasOto(ValidateAlias(ccv1), syllable.vowelTone) && !ccvException.Contains(cc[0])) { + basePhoneme = ccv1; + lastC = i; + break; } else if ((HasOto(lcv, syllable.vowelTone) || HasOto(ValidateAlias(lcv), syllable.vowelTone)) && HasOto(cc1, syllable.vowelTone) && !HasOto(ccv, syllable.vowelTone)) { basePhoneme = lcv; + } else if ((HasOto(cv, syllable.vowelTone) || HasOto(ValidateAlias(cv), syllable.vowelTone)) && HasOto(cc1, syllable.vowelTone) && !HasOto(lcv, syllable.vowelTone)) { + basePhoneme = cv; } // [C1 C2C3] if (HasOto($"{cc[i]} {string.Join("", cc.Skip(i + 1))}", syllable.tone)) { cc1 = $"{cc[i]} {string.Join("", cc.Skip(i + 1))}"; } - // [C1 C2C3...] - if (HasOto($"{cc[i]} {string.Join("", cc.Skip(i))}", syllable.tone)) { - cc1 = $"{cc[i]} {string.Join("", cc.Skip(i))}"; - } } else if (syllable.CurrentWordCc.Length == 1 && syllable.PreviousWordCc.Length == 1) { basePhoneme = lcv; + if ((HasOto(cv, syllable.vowelTone) || HasOto(ValidateAlias(cv), syllable.vowelTone)) && (!HasOto(lcv, syllable.vowelTone)) || !HasOto(ValidateAlias(lcv), syllable.vowelTone)) { + basePhoneme = cv; + } // [C1 C2] if (!HasOto(cc1, syllable.tone)) { cc1 = $"{cc[i]} {cc[i + 1]}"; } } // C+V - if ((HasOto(v, syllable.vowelTone) || HasOto(ValidateAlias(v), syllable.vowelTone)) && (!HasOto(lcv, syllable.vowelTone) && !HasOto(ValidateAlias(lcv), syllable.vowelTone))) { + if ((HasOto(v, syllable.vowelTone) || HasOto(ValidateAlias(v), syllable.vowelTone)) && (!HasOto(lcv, syllable.vowelTone) && !HasOto(ValidateAlias(lcv), syllable.vowelTone) && (!HasOto(cv, syllable.vowelTone) && !HasOto(ValidateAlias(cv), syllable.vowelTone)))) { cPV_FallBack = true; basePhoneme = v; + cc1 = ValidateAlias(cc1); } if (HasOto(cc1, syllable.tone) && HasOto(cc1, syllable.tone) && !cc1.Contains($"{string.Join("", cc.Skip(i))}")) { // like [V C1] [C1 C2] [C2 C3] [C3 ..] From 548f9360d10c4f516582b18a91712c441b5286cd Mon Sep 17 00:00:00 2001 From: cadlaxa Date: Sun, 14 Jul 2024 14:36:38 +0800 Subject: [PATCH 2/7] Fix [CV] and [C V] validation when there's a [CCV] --- .../ArpasingPlusPhonemizer.cs | 26 +++++++++++++------ 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/OpenUtau.Plugin.Builtin/ArpasingPlusPhonemizer.cs b/OpenUtau.Plugin.Builtin/ArpasingPlusPhonemizer.cs index 957182aac..9b658bdd7 100644 --- a/OpenUtau.Plugin.Builtin/ArpasingPlusPhonemizer.cs +++ b/OpenUtau.Plugin.Builtin/ArpasingPlusPhonemizer.cs @@ -386,6 +386,7 @@ protected override List ProcessSyllable(Syllable syllable) { basePhoneme = v; } else if ((HasOto($"{prevV} {v}", syllable.vowelTone) || HasOto(ValidateAlias($"{prevV} {v}"), syllable.vowelTone) && (!HasOto(v, syllable.vowelTone) && !HasOto(ValidateAlias(v), syllable.vowelTone)) && (!HasOto(ccv, syllable.vowelTone) && !HasOto(ValidateAlias(ccv), syllable.vowelTone)) && (!HasOto(crv, syllable.vowelTone) && !HasOto(ValidateAlias(crv), syllable.vowelTone)))) { basePhoneme = $"{prevV} {v}"; + } else { basePhoneme = $"{cc.Last()}{v}"; } @@ -412,10 +413,12 @@ protected override List ProcessSyllable(Syllable syllable) { } else if ((HasOto(cv, syllable.vowelTone) || HasOto(ValidateAlias(cv), syllable.vowelTone)) && (!HasOto(crv, syllable.vowelTone) && !HasOto(ValidateAlias(crv), syllable.vowelTone))) { basePhoneme = cv; /// C+V - } else if ((HasOto(v, syllable.vowelTone) || HasOto(ValidateAlias(v), syllable.vowelTone)) && (!HasOto(cv, syllable.vowelTone) && !HasOto(ValidateAlias(cv), syllable.vowelTone)) && (!HasOto(crv, syllable.vowelTone) && !HasOto(ValidateAlias(crv), syllable.vowelTone))) { + /* + } else if ((HasOto(v, syllable.vowelTone) || HasOto(ValidateAlias(v), syllable.vowelTone))) { basePhoneme = v; - } else if ((HasOto($"{prevV} {v}", syllable.vowelTone) || HasOto(ValidateAlias($"{prevV} {v}"), syllable.vowelTone) && (!HasOto(v, syllable.vowelTone) && !HasOto(ValidateAlias(v), syllable.vowelTone)) && (!HasOto(cv, syllable.vowelTone) && !HasOto(ValidateAlias(cv), syllable.vowelTone)) && (!HasOto(crv, syllable.vowelTone) && !HasOto(ValidateAlias(crv), syllable.vowelTone)))) { + } else if ((HasOto($"{prevV} {v}", syllable.vowelTone) || HasOto(ValidateAlias($"{prevV} {v}"), syllable.vowelTone) && (!HasOto(v, syllable.vowelTone) && !HasOto(ValidateAlias(v), syllable.vowelTone)))) { basePhoneme = $"{prevV} {v}"; + */ } else { basePhoneme = $"{cc.Last()} {v}"; } @@ -435,9 +438,12 @@ protected override List ProcessSyllable(Syllable syllable) { break; /// C-Last V } else if (syllable.CurrentWordCc.Length == 1 && syllable.PreviousWordCc.Length == 1) { - basePhoneme = crv; - if ((HasOto(cv, syllable.vowelTone) || HasOto(ValidateAlias(cv), syllable.vowelTone)) && (!HasOto(crv, syllable.vowelTone)) || !HasOto(ValidateAlias(crv), syllable.vowelTone)) { + if ((HasOto(crv, syllable.vowelTone) || HasOto(ValidateAlias(crv), syllable.vowelTone))) { + basePhoneme = crv; + } else if ((HasOto(cv, syllable.vowelTone) || HasOto(ValidateAlias(cv), syllable.vowelTone)) && !(HasOto(crv, syllable.vowelTone)) || HasOto(ValidateAlias(crv), syllable.vowelTone)) { basePhoneme = cv; + } else { + basePhoneme = crv; } } } @@ -521,7 +527,7 @@ protected override List ProcessSyllable(Syllable syllable) { break; } else if ((HasOto(lcv, syllable.vowelTone) || HasOto(ValidateAlias(lcv), syllable.vowelTone)) && HasOto(cc1, syllable.vowelTone) && !HasOto(ccv, syllable.vowelTone)) { basePhoneme = lcv; - } else if ((HasOto(cv, syllable.vowelTone) || HasOto(ValidateAlias(cv), syllable.vowelTone)) && HasOto(cc1, syllable.vowelTone) && !HasOto(lcv, syllable.vowelTone)) { + } else if ((HasOto(cv, syllable.vowelTone) || HasOto(ValidateAlias(cv), syllable.vowelTone)) && HasOto(cc1, syllable.vowelTone)) { basePhoneme = cv; } // [C1 C2C3] @@ -530,7 +536,7 @@ protected override List ProcessSyllable(Syllable syllable) { } } else if (syllable.CurrentWordCc.Length == 1 && syllable.PreviousWordCc.Length == 1) { basePhoneme = lcv; - if ((HasOto(cv, syllable.vowelTone) || HasOto(ValidateAlias(cv), syllable.vowelTone)) && (!HasOto(lcv, syllable.vowelTone)) || !HasOto(ValidateAlias(lcv), syllable.vowelTone)) { + if ((HasOto(cv, syllable.vowelTone) || HasOto(ValidateAlias(cv), syllable.vowelTone))) { basePhoneme = cv; } // [C1 C2] @@ -539,11 +545,13 @@ protected override List ProcessSyllable(Syllable syllable) { } } // C+V + if ((HasOto(v, syllable.vowelTone) || HasOto(ValidateAlias(v), syllable.vowelTone)) && (!HasOto(lcv, syllable.vowelTone) && !HasOto(ValidateAlias(lcv), syllable.vowelTone) && (!HasOto(cv, syllable.vowelTone) && !HasOto(ValidateAlias(cv), syllable.vowelTone)))) { cPV_FallBack = true; basePhoneme = v; cc1 = ValidateAlias(cc1); } + if (i + 1 < lastC) { if (!HasOto(cc1, syllable.tone)) { cc1 = ValidateAlias(cc1); @@ -576,7 +584,7 @@ protected override List ProcessSyllable(Syllable syllable) { break; } else if ((HasOto(lcv, syllable.vowelTone) || HasOto(ValidateAlias(lcv), syllable.vowelTone)) && HasOto(cc1, syllable.vowelTone) && !HasOto(ccv, syllable.vowelTone)) { basePhoneme = lcv; - } else if ((HasOto(cv, syllable.vowelTone) || HasOto(ValidateAlias(cv), syllable.vowelTone)) && HasOto(cc1, syllable.vowelTone) && !HasOto(lcv, syllable.vowelTone)) { + } else if ((HasOto(cv, syllable.vowelTone) || HasOto(ValidateAlias(cv), syllable.vowelTone)) && HasOto(cc1, syllable.vowelTone)) { basePhoneme = cv; } // [C1 C2C3] @@ -585,7 +593,7 @@ protected override List ProcessSyllable(Syllable syllable) { } } else if (syllable.CurrentWordCc.Length == 1 && syllable.PreviousWordCc.Length == 1) { basePhoneme = lcv; - if ((HasOto(cv, syllable.vowelTone) || HasOto(ValidateAlias(cv), syllable.vowelTone)) && (!HasOto(lcv, syllable.vowelTone)) || !HasOto(ValidateAlias(lcv), syllable.vowelTone)) { + if ((HasOto(cv, syllable.vowelTone) || HasOto(ValidateAlias(cv), syllable.vowelTone))) { basePhoneme = cv; } // [C1 C2] @@ -594,11 +602,13 @@ protected override List ProcessSyllable(Syllable syllable) { } } // C+V + if ((HasOto(v, syllable.vowelTone) || HasOto(ValidateAlias(v), syllable.vowelTone)) && (!HasOto(lcv, syllable.vowelTone) && !HasOto(ValidateAlias(lcv), syllable.vowelTone) && (!HasOto(cv, syllable.vowelTone) && !HasOto(ValidateAlias(cv), syllable.vowelTone)))) { cPV_FallBack = true; basePhoneme = v; cc1 = ValidateAlias(cc1); } + if (HasOto(cc1, syllable.tone) && HasOto(cc1, syllable.tone) && !cc1.Contains($"{string.Join("", cc.Skip(i))}")) { // like [V C1] [C1 C2] [C2 C3] [C3 ..] phonemes.Add(cc1); From 73ae975c69b300f1bd65d25aa7b94f791da5803e Mon Sep 17 00:00:00 2001 From: cadlaxa Date: Sat, 20 Jul 2024 18:08:43 +0800 Subject: [PATCH 3/7] Update vvExceptions to include two letter R-colored vowels --- OpenUtau.Plugin.Builtin/ArpasingPlusPhonemizer.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/OpenUtau.Plugin.Builtin/ArpasingPlusPhonemizer.cs b/OpenUtau.Plugin.Builtin/ArpasingPlusPhonemizer.cs index 9b658bdd7..ed7e473fb 100644 --- a/OpenUtau.Plugin.Builtin/ArpasingPlusPhonemizer.cs +++ b/OpenUtau.Plugin.Builtin/ArpasingPlusPhonemizer.cs @@ -111,6 +111,11 @@ public class ArpasingPlusPhonemizer : SyllableBasedPhonemizer { {"awn","n"}, {"awng","ng"}, {"el","l"}, + // r-colored vowel + {"ar","r"}, + {"or","r"}, + {"ir","r"}, + {"ur","r"}, }; private readonly Dictionary vvDiphthongExceptions = new Dictionary() { @@ -125,7 +130,7 @@ public class ArpasingPlusPhonemizer : SyllableBasedPhonemizer { private readonly string[] ccvException = { "ch", "dh", "dx", "fh", "gh", "hh", "jh", "kh", "ph", "ng", "sh", "th", "vh", "wh", "zh" }; private readonly string[] RomajiException = { "a", "e", "i", "o", "u" }; - private string[] tails = "-,R,RB".Split(','); + private string[] tails = "-,R".Split(','); protected override string[] GetSymbols(Note note) { string[] original = base.GetSymbols(note); From 2d82f29023f57de00a6bd42bc8765d4acf31ca9b Mon Sep 17 00:00:00 2001 From: cadlaxa Date: Wed, 24 Jul 2024 11:41:31 +0800 Subject: [PATCH 4/7] update r-colored vowel and l `vvExceptions` --- OpenUtau.Plugin.Builtin/ArpasingPlusPhonemizer.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/OpenUtau.Plugin.Builtin/ArpasingPlusPhonemizer.cs b/OpenUtau.Plugin.Builtin/ArpasingPlusPhonemizer.cs index ed7e473fb..01868c7f0 100644 --- a/OpenUtau.Plugin.Builtin/ArpasingPlusPhonemizer.cs +++ b/OpenUtau.Plugin.Builtin/ArpasingPlusPhonemizer.cs @@ -110,12 +110,15 @@ public class ArpasingPlusPhonemizer : SyllableBasedPhonemizer { {"uwr","r"}, {"awn","n"}, {"awng","ng"}, - {"el","l"}, - // r-colored vowel + // r-colored vowel and l {"ar","r"}, {"or","r"}, {"ir","r"}, {"ur","r"}, + {"ol","l"}, + {"il","l"}, + {"el","l"}, + {"ul","l"}, }; private readonly Dictionary vvDiphthongExceptions = new Dictionary() { From 5dece848fa89d018cb010c80ff92d1468388c4c0 Mon Sep 17 00:00:00 2001 From: cadlaxa Date: Fri, 2 Aug 2024 14:43:02 +0800 Subject: [PATCH 5/7] Vowel update --- OpenUtau.Plugin.Builtin/ArpasingPlusPhonemizer.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/OpenUtau.Plugin.Builtin/ArpasingPlusPhonemizer.cs b/OpenUtau.Plugin.Builtin/ArpasingPlusPhonemizer.cs index 01868c7f0..7376a4fd4 100644 --- a/OpenUtau.Plugin.Builtin/ArpasingPlusPhonemizer.cs +++ b/OpenUtau.Plugin.Builtin/ArpasingPlusPhonemizer.cs @@ -25,7 +25,7 @@ public class ArpasingPlusPhonemizer : SyllableBasedPhonemizer { "aan", "an", "axn", "aen", "ahn", "aon", "on", "awn", "aun", "ayn", "ain", "ehn", "en", "eyn", "ein", "ihn", "iyn", "in", "own", "oun", "oyn", "oin", "uhn", "uwn", "un", "aang", "ang", "axng", "aeng", "ahng", "aong", "ong", "awng", "aung", "ayng", "aing", "ehng", "eng", "eyng", "eing", "ihng", "iyng", "ing", "owng", "oung", "oyng", "oing", "uhng", "uwng", "ung", "aam", "am", "axm", "aem", "ahm", "aom", "om", "awm", "aum", "aym", "aim", "ehm", "em", "eym", "eim", "ihm", "iym", "im", "owm", "oum", "oym", "oim", "uhm", "uwm", "um", "oh", - "eu", "oe", "yw", "yx", "wx", "ox", "ex", "ea", "ia", "oa", "ua" + "eu", "oe", "yw", "yx", "wx", "ox", "ex", "ea", "ia", "oa", "ua", "ean", "eam", "eang" }; private readonly string[] consonants = "b,ch,d,dh,dr,dx,f,g,hh,jh,k,l,m,n,nx,ng,p,q,r,s,sh,t,th,tr,v,w,y,z,zh".Split(','); private readonly string[] affricates = "ch,jh,j".Split(','); @@ -110,11 +110,16 @@ public class ArpasingPlusPhonemizer : SyllableBasedPhonemizer { {"uwr","r"}, {"awn","n"}, {"awng","ng"}, + {"ean","n"}, + {"eam","m"}, + {"eang","ng"}, // r-colored vowel and l {"ar","r"}, {"or","r"}, + {"air","r"}, {"ir","r"}, {"ur","r"}, + {"al","l"}, {"ol","l"}, {"il","l"}, {"el","l"}, From 240f1c24f00ed55a09afbfdd81bcf8955e1ad9e9 Mon Sep 17 00:00:00 2001 From: cadlaxa Date: Sat, 3 Aug 2024 18:17:31 +0800 Subject: [PATCH 6/7] removed unnecessary code --- .../ArpasingPlusPhonemizer.cs | 228 ++++++------------ 1 file changed, 70 insertions(+), 158 deletions(-) diff --git a/OpenUtau.Plugin.Builtin/ArpasingPlusPhonemizer.cs b/OpenUtau.Plugin.Builtin/ArpasingPlusPhonemizer.cs index 7376a4fd4..ce4403ab8 100644 --- a/OpenUtau.Plugin.Builtin/ArpasingPlusPhonemizer.cs +++ b/OpenUtau.Plugin.Builtin/ArpasingPlusPhonemizer.cs @@ -816,108 +816,63 @@ protected override List ProcessEnding(Ending ending) { protected override string ValidateAlias(string alias) { //FALLBACKS - if (alias == "ng ao") { - return alias.Replace("ao", "ow"); - } else if (alias == "ch ao") { - return alias.Replace("ch ao", "sh ow"); - } else if (alias == "dh ao") { - return alias.Replace("ao", "ow"); - } else if (alias == "dh oy") { - return alias.Replace("oy", "ow"); - } else if (alias == "jh ao") { - return alias.Replace("ao", "oy"); - } else if (alias == "ao -") { - return alias.Replace("ao -", "aa -"); - } else if (alias == "v ao") { - return alias.Replace("v", "b"); - } else if (alias == "z ao") { - return alias.Replace("z", "s"); - } else if (alias == "ng eh") { - return alias.Replace("ng", "n"); - } else if (alias == "z eh") { - return alias.Replace("z", "s"); - } else if (alias == "jh er") { - return alias.Replace("jh", "z"); - } else if (alias == "ng er") { - return alias.Replace("ng", "n"); - } else if (alias == "r er") { - return alias.Replace("r er", "er"); - } else if (alias == "th er") { - return alias.Replace("th er", "th r"); - } else if (alias == "jh ey") { - return alias.Replace("ey", "ae"); - } else if (alias == "ng ey") { - return alias.Replace("ng", "n"); - } else if (alias == "th ey") { - return alias.Replace("ey", "ae"); - } else if (alias == "zh ey") { - return alias.Replace("zh ey", "jh ae"); - } else if (alias == "ch ow") { - return alias.Replace("ch", "sh"); - } else if (alias == "jh ow") { - return alias.Replace("ow", "oy"); - } else if (alias == "v ow") { - return alias.Replace("v", "b"); - } else if (alias == "th ow") { - return alias.Replace("th", "s"); - } else if (alias == "z ow") { - return alias.Replace("z", "s"); - } else if (alias == "ch oy") { - return alias.Replace("ch oy", "sh ow"); - } else if (alias == "th oy") { - return alias.Replace("th oy", "s ao"); - } else if (alias == "v oy") { - return alias.Replace("v", "b"); - } else if (alias == "w oy") { - return alias.Replace("oy", "ao"); - } else if (alias == "z oy") { - return alias.Replace("oy", "aa"); - } else if (alias == "ch uh") { - return alias.Replace("ch", "sh"); - } else if (alias == "dh uh") { - return alias.Replace("dh uh", "d uw"); - } else if (alias == "jh uh") { - return alias.Replace("jh", "sh"); - } else if (alias == "ng uh") { - return alias.Replace("ng uh", "n uw"); - } else if (alias == "th uh") { - return alias.Replace("th uh", "f uw"); - } else if (alias == "v uh") { - return alias.Replace("v", "b"); - } else if (alias == "z uh") { - return alias.Replace("z", "s"); - } else if (alias == "ch uw") { - return alias.Replace("ch", "sh"); - } else if (alias == "dh uw") { - return alias.Replace("dh", "d"); - } else if (alias == "g uw") { - return alias.Replace("g", "k"); - } else if (alias == "jh uw") { - return alias.Replace("jh", "sh"); - } else if (alias == "ng uw") { - return alias.Replace("ng", "n"); - } else if (alias == "th uw") { - return alias.Replace("th uw", "f uw"); - } else if (alias == "v uw") { - return alias.Replace("v", "b"); - } else if (alias == "z uw") { - return alias.Replace("z", "s"); - } else if (alias == "zh aa") { - return alias.Replace("zh", "sh"); - } else if (alias == "zh ao") { - return alias.Replace("zh", "sh"); - } else if (alias == "zh ae") { - return alias.Replace("zh ae", "sh ah"); - } else if (alias == "ng oy") { - return alias.Replace("oy", "ow"); - } else if (alias == "sh ao") { - return alias.Replace("ao", "ow"); - } else if (alias == "z uh") { - return alias.Replace("z uh", "s uw"); - } else if (alias == "r uh") { - return alias.Replace("uh", "uw"); - } else if (alias == "sh oy") { - return alias.Replace("oy", "ow"); + var cvFallbacks = new Dictionary { + {"ng ao", "ng ow"}, + {"ch ao", "sh ow"}, + {"dh ao", "dh ow"}, + {"dh oy", "dh ow"}, + {"jh ao", "jh oy"}, + {"ao -", "aa -"}, + {"v ao", "b ao"}, + {"z ao", "s ao"}, + {"ng eh", "n eh"}, + {"z eh", "s eh"}, + {"jh er", "z er"}, + {"ng er", "n er"}, + {"r er", "er"}, + {"th er", "th r"}, + {"jh ey", "jh ae"}, + {"ng ey", "n ey"}, + {"th ey", "th ae"}, + {"zh ey", "jh ae"}, + {"ch ow", "sh ow"}, + {"jh ow", "jh oy"}, + {"v ow", "b ow"}, + {"th ow", "s ow"}, + {"z ow", "s ow"}, + {"ch oy", "sh ow"}, + {"th oy", "s ao"}, + {"v oy", "b oy"}, + {"w oy", "w ao"}, + {"z oy", "z aa"}, + {"ch uh", "sh uh"}, + {"dh uh", "d uw"}, + {"jh uh", "sh uh"}, + {"ng uh", "n uw"}, + {"th uh", "f uw"}, + {"v uh", "b uh"}, + {"z uh", "s uh"}, + {"ch uw", "sh uw"}, + {"dh uw", "d uw"}, + {"g uw", "k uw"}, + {"jh uw", "sh uw"}, + {"ng uw", "n uw"}, + {"th uw", "f uw"}, + {"v uw", "b uw"}, + {"z uw", "s uw"}, + {"zh aa", "sh aa"}, + {"zh ao", "sh ao"}, + {"zh ae", "sh ah"}, + {"ng oy", "ng ow"}, + {"sh ao", "sh ow"}, + {"z uh", "s uw"}, + {"r uh", "r uw"}, + {"sh oy", "sh ow"} + }; + + // Apply CV fallbacks + if (cvFallbacks.TryGetValue(alias, out var replacement)) { + return replacement; } // VALIDATE ALIAS DEPENDING ON METHOD @@ -947,23 +902,21 @@ protected override string ValidateAlias(string alias) { } } - Dictionary> vvReplacements = new Dictionary> - { //VV (diphthongs) some - { "ay ay", new List { "y ah" } }, - { "ey ey", new List { "iy ey" } }, - { "oy oy", new List { "y ow" } }, - { "er er", new List { "er" } }, - { "aw aw", new List { "w ae" } }, - { "ow ow", new List { "w ao" } }, - { "uw uw", new List { "w uw" } }, + var vvReplacements = new Dictionary> { + { "ay ay", new List { "y ah" } }, + { "ey ey", new List { "iy ey" } }, + { "oy oy", new List { "y ow" } }, + { "er er", new List { "er" } }, + { "aw aw", new List { "w ae" } }, + { "ow ow", new List { "w ao" } }, + { "uw uw", new List { "w uw" } } }; - foreach (var kvp in vvReplacements) { - var originalValue = kvp.Key; - var replacementOptions = kvp.Value; - foreach (var replacement in replacementOptions) { - alias = alias.Replace(originalValue, replacement); + // Apply VV replacements + foreach (var (originalValue, replacementOptions) in vvReplacements) { + foreach (var replacementOption in replacementOptions) { + alias = alias.Replace(originalValue, replacementOption); } } //VC (diphthongs) @@ -1272,18 +1225,12 @@ protected override string ValidateAlias(string alias) { if (ccSpecific) { //CC (b) //CC (b specific) - if (alias == "b ch") { - return alias.Replace("b ch", "t ch"); - } if (alias == "b dh") { return alias.Replace("b ch", "p dh"); } if (alias == "b ng") { return alias.Replace("b ng", "ng"); } - if (alias == "b th") { - return alias.Replace("b th", "t th"); - } if (alias == "b zh") { return alias.Replace("zh", "z"); } @@ -1306,23 +1253,14 @@ protected override string ValidateAlias(string alias) { } //CC (d specific) - if (alias == "d ch") { - return alias.Replace("d", "t"); - } if (alias == "d ng") { return alias.Replace("ng", "n"); } - if (alias == "d th") { - return alias.Replace("d th", "t th"); - } if (alias == "d zh") { return alias.Replace("zh", "z"); } //CC (dh specific) - if (alias == "dh ch") { - return alias.Replace("dh ch", "t ch"); - } if (alias == "dh dh") { return alias.Replace("dh dh", "dh d"); } @@ -1349,9 +1287,6 @@ protected override string ValidateAlias(string alias) { } //CC (g specific) - if (alias == "g ch") { - return alias.Replace("g ch", "t ch"); - } if (alias == "g dh") { return alias.Replace("g", "d"); } @@ -1366,9 +1301,7 @@ protected override string ValidateAlias(string alias) { if (alias == "hh y") { return alias.Replace("hh", "f"); } - if (alias == "hh -") { - return alias.Replace("hh -", "- hh"); - } + //CC (jh specific) if (alias == "jh r") { @@ -1396,9 +1329,6 @@ protected override string ValidateAlias(string alias) { if (alias == "l b") { return alias.Replace("b", "d"); } - if (alias == "l hh") { - return alias.Replace("l", "r"); - } if (alias == "l jh") { return alias.Replace("jh", "d"); } @@ -1478,17 +1408,11 @@ protected override string ValidateAlias(string alias) { if (alias == "ng ng") { return alias.Replace("ng", "n"); } - if (alias == "ng v") { - return alias.Replace("ng v", "ng s"); - } if (alias == "ng zh") { return alias.Replace("zh", "z"); } //CC (p specific) - if (alias == "p dx") { - return alias.Replace("p dx", "t d"); - } if (alias == "p z") { return alias.Replace("z", "s"); } @@ -1517,9 +1441,6 @@ protected override string ValidateAlias(string alias) { if (alias == "s ch") { return alias.Replace("ch", "t"); } - if (alias == "s dx") { - return alias.Replace("dx", "d"); - } if (alias == "s ng") { return alias.Replace("ng", "n"); } @@ -1557,9 +1478,6 @@ protected override string ValidateAlias(string alias) { } //CC (t specific) - if (alias == "t z") { - return alias.Replace("t", "g"); - } if (alias == "t zh") { return alias.Replace("t zh", "g z"); } @@ -1579,12 +1497,6 @@ protected override string ValidateAlias(string alias) { if (alias == "v th") { return alias.Replace("v th", "th"); } - if (alias == "v s") { - return alias.Replace("v", "s"); - } - if (alias == "v z") { - return alias.Replace("v z", "s s"); - } // CC (w C) foreach (var c2 in consonants) { if (!(alias.Contains($"aw {c2}") || alias.Contains($"ew {c2}") || alias.Contains($"iw {c2}") || alias.Contains($"ow {c2}") || alias.Contains($"uw {c2}"))) { From 71fb45e9860ffa6680b2f086422f866afae26803 Mon Sep 17 00:00:00 2001 From: cadlaxa Date: Sun, 4 Aug 2024 07:13:59 +0800 Subject: [PATCH 7/7] fixes --- .../ArpasingPlusPhonemizer.cs | 178 +++++++++++------- 1 file changed, 111 insertions(+), 67 deletions(-) diff --git a/OpenUtau.Plugin.Builtin/ArpasingPlusPhonemizer.cs b/OpenUtau.Plugin.Builtin/ArpasingPlusPhonemizer.cs index ce4403ab8..4ea909f41 100644 --- a/OpenUtau.Plugin.Builtin/ArpasingPlusPhonemizer.cs +++ b/OpenUtau.Plugin.Builtin/ArpasingPlusPhonemizer.cs @@ -135,7 +135,6 @@ public class ArpasingPlusPhonemizer : SyllableBasedPhonemizer { {"oy","ao"}, }; - private readonly string[] ccvException = { "ch", "dh", "dx", "fh", "gh", "hh", "jh", "kh", "ph", "ng", "sh", "th", "vh", "wh", "zh" }; private readonly string[] RomajiException = { "a", "e", "i", "o", "u" }; private string[] tails = "-,R".Split(','); @@ -815,64 +814,109 @@ protected override List ProcessEnding(Ending ending) { } protected override string ValidateAlias(string alias) { - //FALLBACKS - var cvFallbacks = new Dictionary { - {"ng ao", "ng ow"}, - {"ch ao", "sh ow"}, - {"dh ao", "dh ow"}, - {"dh oy", "dh ow"}, - {"jh ao", "jh oy"}, - {"ao -", "aa -"}, - {"v ao", "b ao"}, - {"z ao", "s ao"}, - {"ng eh", "n eh"}, - {"z eh", "s eh"}, - {"jh er", "z er"}, - {"ng er", "n er"}, - {"r er", "er"}, - {"th er", "th r"}, - {"jh ey", "jh ae"}, - {"ng ey", "n ey"}, - {"th ey", "th ae"}, - {"zh ey", "jh ae"}, - {"ch ow", "sh ow"}, - {"jh ow", "jh oy"}, - {"v ow", "b ow"}, - {"th ow", "s ow"}, - {"z ow", "s ow"}, - {"ch oy", "sh ow"}, - {"th oy", "s ao"}, - {"v oy", "b oy"}, - {"w oy", "w ao"}, - {"z oy", "z aa"}, - {"ch uh", "sh uh"}, - {"dh uh", "d uw"}, - {"jh uh", "sh uh"}, - {"ng uh", "n uw"}, - {"th uh", "f uw"}, - {"v uh", "b uh"}, - {"z uh", "s uh"}, - {"ch uw", "sh uw"}, - {"dh uw", "d uw"}, - {"g uw", "k uw"}, - {"jh uw", "sh uw"}, - {"ng uw", "n uw"}, - {"th uw", "f uw"}, - {"v uw", "b uw"}, - {"z uw", "s uw"}, - {"zh aa", "sh aa"}, - {"zh ao", "sh ao"}, - {"zh ae", "sh ah"}, - {"ng oy", "ng ow"}, - {"sh ao", "sh ow"}, - {"z uh", "s uw"}, - {"r uh", "r uw"}, - {"sh oy", "sh ow"} - }; - - // Apply CV fallbacks - if (cvFallbacks.TryGetValue(alias, out var replacement)) { - return replacement; + //CV FALLBACKS + if (alias == "ng ao") { + return alias.Replace("ao", "ow"); + } else if (alias == "ch ao") { + return alias.Replace("ch ao", "sh ow"); + } else if (alias == "dh ao") { + return alias.Replace("ao", "ow"); + } else if (alias == "dh oy") { + return alias.Replace("oy", "ow"); + } else if (alias == "jh ao") { + return alias.Replace("ao", "oy"); + } else if (alias == "ao -") { + return alias.Replace("ao -", "aa -"); + } else if (alias == "v ao") { + return alias.Replace("v", "b"); + } else if (alias == "z ao") { + return alias.Replace("z", "s"); + } else if (alias == "ng eh") { + return alias.Replace("ng", "n"); + } else if (alias == "z eh") { + return alias.Replace("z", "s"); + } else if (alias == "jh er") { + return alias.Replace("jh", "z"); + } else if (alias == "ng er") { + return alias.Replace("ng", "n"); + } else if (alias == "r er") { + return alias.Replace("r er", "er"); + } else if (alias == "th er") { + return alias.Replace("th er", "th r"); + } else if (alias == "jh ey") { + return alias.Replace("ey", "ae"); + } else if (alias == "ng ey") { + return alias.Replace("ng", "n"); + } else if (alias == "th ey") { + return alias.Replace("ey", "ae"); + } else if (alias == "zh ey") { + return alias.Replace("zh ey", "jh ae"); + } else if (alias == "ch ow") { + return alias.Replace("ch", "sh"); + } else if (alias == "jh ow") { + return alias.Replace("ow", "oy"); + } else if (alias == "v ow") { + return alias.Replace("v", "b"); + } else if (alias == "th ow") { + return alias.Replace("th", "s"); + } else if (alias == "z ow") { + return alias.Replace("z", "s"); + } else if (alias == "ch oy") { + return alias.Replace("ch oy", "sh ow"); + } else if (alias == "th oy") { + return alias.Replace("th oy", "s ao"); + } else if (alias == "v oy") { + return alias.Replace("v", "b"); + } else if (alias == "w oy") { + return alias.Replace("oy", "ao"); + } else if (alias == "z oy") { + return alias.Replace("oy", "aa"); + } else if (alias == "ch uh") { + return alias.Replace("ch", "sh"); + } else if (alias == "dh uh") { + return alias.Replace("dh uh", "d uw"); + } else if (alias == "jh uh") { + return alias.Replace("jh", "sh"); + } else if (alias == "ng uh") { + return alias.Replace("ng uh", "n uw"); + } else if (alias == "th uh") { + return alias.Replace("th uh", "f uw"); + } else if (alias == "v uh") { + return alias.Replace("v", "b"); + } else if (alias == "z uh") { + return alias.Replace("z", "s"); + } else if (alias == "ch uw") { + return alias.Replace("ch", "sh"); + } else if (alias == "dh uw") { + return alias.Replace("dh", "d"); + } else if (alias == "g uw") { + return alias.Replace("g", "k"); + } else if (alias == "jh uw") { + return alias.Replace("jh", "sh"); + } else if (alias == "ng uw") { + return alias.Replace("ng", "n"); + } else if (alias == "th uw") { + return alias.Replace("th uw", "f uw"); + } else if (alias == "v uw") { + return alias.Replace("v", "b"); + } else if (alias == "z uw") { + return alias.Replace("z", "s"); + } else if (alias == "zh aa") { + return alias.Replace("zh", "sh"); + } else if (alias == "zh ao") { + return alias.Replace("zh", "sh"); + } else if (alias == "zh ae") { + return alias.Replace("zh ae", "sh ah"); + } else if (alias == "ng oy") { + return alias.Replace("oy", "ow"); + } else if (alias == "sh ao") { + return alias.Replace("ao", "ow"); + } else if (alias == "z uh") { + return alias.Replace("z uh", "s uw"); + } else if (alias == "r uh") { + return alias.Replace("uh", "uw"); + } else if (alias == "sh oy") { + return alias.Replace("oy", "ow"); } // VALIDATE ALIAS DEPENDING ON METHOD @@ -883,14 +927,14 @@ protected override string ValidateAlias(string alias) { } var CVMappings = new Dictionary { - { "ao", new[] { "ow" } }, - { "oy", new[] { "ow" } }, - { "aw", new[] { "ah" } }, - { "ay", new[] { "ah" } }, - { "eh", new[] { "ae" } }, - { "ey", new[] { "eh" } }, - { "ow", new[] { "ao" } }, - { "uh", new[] { "uw" } }, + { "ao", new[] { "ow" } }, + { "oy", new[] { "ow" } }, + { "aw", new[] { "ah" } }, + { "ay", new[] { "ah" } }, + { "eh", new[] { "ae" } }, + { "ey", new[] { "eh" } }, + { "ow", new[] { "ao" } }, + { "uh", new[] { "uw" } }, }; foreach (var kvp in CVMappings) { var v1 = kvp.Key;