Skip to content

Commit 72d38e1

Browse files
authored
Merge pull request #783 from The-UTAU-Black-Supermarket/en-to-ja-tests
EN to JA test suite and fixes
2 parents db972e4 + d2d4494 commit 72d38e1

File tree

6 files changed

+331
-18
lines changed

6 files changed

+331
-18
lines changed

OpenUtau.Plugin.Builtin/ENtoJAPhonemizer.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -423,15 +423,19 @@ protected override List<string> ProcessEnding(Ending ending) {
423423
cons = "r";
424424
} else if (cons == "ly") {
425425
cons = "ry";
426+
} else {
427+
cons = StartingConsonant[cons];
426428
}
427429

428430
var vc = $"{vowel} {cons}";
429431
var altVc = $"{vowel} {cons[0]}";
430-
432+
431433
if (HasOto(vc, tone)) {
432434
phonemes.Add(vc);
433435
} else if (HasOto(altVc, tone)) {
434436
phonemes.Add(altVc);
437+
} else {
438+
return (false, new string[0]);
435439
}
436440

437441
if (affricates.Contains(cons) && cc > 1) {
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
name=ja_cv
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
text_file_encoding: shift_jis

OpenUtau.Test/Files/ja_cv/oto.ini

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
audio.wav=あ,0,0,0,0,0
2+
audio.wav=い,0,0,0,0,0
3+
audio.wav=う,0,0,0,0,0
4+
audio.wav=え,0,0,0,0,0
5+
audio.wav=お,0,0,0,0,0
6+
audio.wav=か,0,0,0,0,0
7+
audio.wav=き,0,0,0,0,0
8+
audio.wav=く,0,0,0,0,0
9+
audio.wav=け,0,0,0,0,0
10+
audio.wav=こ,0,0,0,0,0
11+
audio.wav=きゃ,0,0,0,0,0
12+
audio.wav=きゅ,0,0,0,0,0
13+
audio.wav=きょ,0,0,0,0,0
14+
audio.wav=が,0,0,0,0,0
15+
audio.wav=ぎ,0,0,0,0,0
16+
audio.wav=ぐ,0,0,0,0,0
17+
audio.wav=げ,0,0,0,0,0
18+
audio.wav=ご,0,0,0,0,0
19+
audio.wav=ぎゃ,0,0,0,0,0
20+
audio.wav=ぎゅ,0,0,0,0,0
21+
audio.wav=ぎょ,0,0,0,0,0
22+
audio.wav=さ,0,0,0,0,0
23+
audio.wav=し,0,0,0,0,0
24+
audio.wav=す,0,0,0,0,0
25+
audio.wav=せ,0,0,0,0,0
26+
audio.wav=そ,0,0,0,0,0
27+
audio.wav=しゃ,0,0,0,0,0
28+
audio.wav=しゅ,0,0,0,0,0
29+
audio.wav=しょ,0,0,0,0,0
30+
audio.wav=ざ,0,0,0,0,0
31+
audio.wav=じ,0,0,0,0,0
32+
audio.wav=ず,0,0,0,0,0
33+
audio.wav=ぜ,0,0,0,0,0
34+
audio.wav=ぞ,0,0,0,0,0
35+
audio.wav=じゃ,0,0,0,0,0
36+
audio.wav=じゅ,0,0,0,0,0
37+
audio.wav=じょ,0,0,0,0,0
38+
audio.wav=た,0,0,0,0,0
39+
audio.wav=ち,0,0,0,0,0
40+
audio.wav=つ,0,0,0,0,0
41+
audio.wav=て,0,0,0,0,0
42+
audio.wav=と,0,0,0,0,0
43+
audio.wav=ちゃ,0,0,0,0,0
44+
audio.wav=ちゅ,0,0,0,0,0
45+
audio.wav=ちょ,0,0,0,0,0
46+
audio.wav=だ,0,0,0,0,0
47+
audio.wav=で,0,0,0,0,0
48+
audio.wav=ど,0,0,0,0,0
49+
audio.wav=な,0,0,0,0,0
50+
audio.wav=に,0,0,0,0,0
51+
audio.wav=ぬ,0,0,0,0,0
52+
audio.wav=ね,0,0,0,0,0
53+
audio.wav=の,0,0,0,0,0
54+
audio.wav=にゃ,0,0,0,0,0
55+
audio.wav=にゅ,0,0,0,0,0
56+
audio.wav=にょ,0,0,0,0,0
57+
audio.wav=は,0,0,0,0,0
58+
audio.wav=ひ,0,0,0,0,0
59+
audio.wav=ふ,0,0,0,0,0
60+
audio.wav=へ,0,0,0,0,0
61+
audio.wav=ほ,0,0,0,0,0
62+
audio.wav=ひゃ,0,0,0,0,0
63+
audio.wav=ひゅ,0,0,0,0,0
64+
audio.wav=ひょ,0,0,0,0,0
65+
audio.wav=ば,0,0,0,0,0
66+
audio.wav=び,0,0,0,0,0
67+
audio.wav=ぶ,0,0,0,0,0
68+
audio.wav=べ,0,0,0,0,0
69+
audio.wav=ぼ,0,0,0,0,0
70+
audio.wav=びゃ,0,0,0,0,0
71+
audio.wav=びゅ,0,0,0,0,0
72+
audio.wav=びょ,0,0,0,0,0
73+
audio.wav=ぱ,0,0,0,0,0
74+
audio.wav=ぴ,0,0,0,0,0
75+
audio.wav=ぷ,0,0,0,0,0
76+
audio.wav=ぺ,0,0,0,0,0
77+
audio.wav=ぽ,0,0,0,0,0
78+
audio.wav=ぴゃ,0,0,0,0,0
79+
audio.wav=ぴゅ,0,0,0,0,0
80+
audio.wav=ぴょ,0,0,0,0,0
81+
audio.wav=ま,0,0,0,0,0
82+
audio.wav=み,0,0,0,0,0
83+
audio.wav=む,0,0,0,0,0
84+
audio.wav=め,0,0,0,0,0
85+
audio.wav=も,0,0,0,0,0
86+
audio.wav=みゃ,0,0,0,0,0
87+
audio.wav=みゅ,0,0,0,0,0
88+
audio.wav=みょ,0,0,0,0,0
89+
audio.wav=や,0,0,0,0,0
90+
audio.wav=ゆ,0,0,0,0,0
91+
audio.wav=よ,0,0,0,0,0
92+
audio.wav=ら,0,0,0,0,0
93+
audio.wav=り,0,0,0,0,0
94+
audio.wav=る,0,0,0,0,0
95+
audio.wav=れ,0,0,0,0,0
96+
audio.wav=ろ,0,0,0,0,0
97+
audio.wav=りゃ,0,0,0,0,0
98+
audio.wav=りゅ,0,0,0,0,0
99+
audio.wav=りょ,0,0,0,0,0
100+
audio.wav=わ,0,0,0,0,0
101+
audio.wav=を,0,0,0,0,0
102+
audio.wav=ん,0,0,0,0,0
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
DO NOT add oto.ini entries to this voicebank.
2+
This is used for automated tests of voicebanks with absolutely 0 extra samples.
3+
4+
oto.ini�ɉ����Ȃ��ł��������B
5+
���̉����͗]���ȋL�����Ȃ��e�X�g�̂��߂ɑ��݂��܂��B
Lines changed: 217 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
using System.Xml.Linq;
2+
using System;
13
using OpenUtau.Api;
24
using OpenUtau.Plugin.Builtin;
35
using Xunit;
@@ -12,36 +14,234 @@ protected override Phonemizer CreatePhonemizer() {
1214

1315
[Theory]
1416
[InlineData("ja_cvvc",
15-
new string[] { "test", "words" },
16-
new string[] { "", "", },
17-
new string[] { "C3", "C3" },
18-
new string[] { "", "", },
19-
new string[] { "て_A3", "e s_A3", "と_A3", "うぉ_A3", "o d_A3", "ず_A3" })]
20-
public void BasicPhonemizingTest(string singerName, string[] lyrics, string[] alts, string[] tones, string[] colors, string[] aliases) {
21-
RunPhonemizeTest(singerName, lyrics, alts, tones, colors, aliases);
17+
new string[] { "て_C4", "e s_C4", "と_C4", "うぉ_C4", "o d_C4", "ず_C4" })]
18+
[InlineData("ja_vcv",
19+
new string[] { "- てA3", "e すA3", "u とA3", "o うぉA3", "o どA3", "o ずA3" })]
20+
[InlineData("ja_cv",
21+
new string[] { "て", "す", "と", "を", "ど", "ず" })]
22+
public void BasicPhonemizingTest(string singerName, string[] aliases) {
23+
SameAltsTonesColorsTest(singerName, aliases,
24+
new string[] { "test", "words" });
2225
}
2326

2427
[Theory]
2528
[InlineData("ja_cvvc",
26-
new string[] { "test", "words" },
27-
new string[] { "", "", },
2829
new string[] { "C3", "C4" },
29-
new string[] { "", "", },
3030
new string[] { "て_A3", "e s_A3", "と_A3", "うぉ_C4", "o d_C4", "ず_C4" })]
31-
public void MultipitchTest(string singerName, string[] lyrics, string[] alts, string[] tones, string[] colors, string[] aliases) {
32-
RunPhonemizeTest(singerName, lyrics, alts, tones, colors, aliases);
31+
[InlineData("ja_vcv",
32+
new string[] { "C4", "C5" },
33+
new string[] { "- てA3", "e すA3", "u とA3", "o うぉC5", "o どC5", "o ずC5" })]
34+
public void MultipitchTest(string singerName, string[] tones, string[] aliases) {
35+
RunPhonemizeTest(singerName, new string[] { "test", "words" },
36+
RepeatString(2, ""), tones, RepeatString(2, ""), aliases);
3337
}
3438

3539
[Theory]
3640
[InlineData("ja_cvvc",
37-
new string[] { "test", "words" },
38-
new string[] { "", "", },
39-
new string[] { "C4", "C4" },
4041
new string[] { "", "強", },
4142
new string[] { "て_C4", "e s_強B3", "と_C4", "うぉ_C4", "o d_C4", "ず_C4" })]
43+
[InlineData("ja_vcv",
44+
new string[] { "", "Clear", },
45+
new string[] { "- てA3", "e すCA3", "u とA3", "o うぉA3", "o どA3", "o ずA3" })]
4246
// Colors are per-phoneme
43-
public void VoiceColorTest(string singerName, string[] lyrics, string[] alts, string[] tones, string[] colors, string[] aliases) {
44-
RunPhonemizeTest(singerName, lyrics, alts, tones, colors, aliases);
47+
public void VoiceColorTest(string singerName, string[] colors, string[] aliases) {
48+
RunPhonemizeTest(singerName, new string[] { "test", "words" },
49+
RepeatString(2, ""), RepeatString(2, "C4"), colors, aliases);
50+
}
51+
52+
[Theory]
53+
[InlineData("ja_cvvc",
54+
new string[] { "て_C4", "e s_C4", "て_C4", "e n_C4" })]
55+
[InlineData("ja_vcv",
56+
new string[] { "- てA3", "e すA3", "u てA3", "e んA3", "n RA3" })]
57+
[InlineData("ja_cv",
58+
new string[] { "て", "す", "て", "ん" })]
59+
// Should have one て only, not become てえ
60+
public void SyllableExtendTest(string singerName, string[] aliases) {
61+
SameAltsTonesColorsTest(singerName, aliases,
62+
new string[] { "testing", "+*", "+", "+" });
63+
}
64+
65+
[Theory]
66+
[InlineData("ja_cvvc",
67+
new string[] { "- お_C4", "o ry_C4", "りゅ_C4", "u ky_C4", "きゅ_C4", "u ts_C4", "つ_C4", "u n_C4" })]
68+
[InlineData("ja_vcv",
69+
new string[] { "- おA3", "o りゅA3", "u きゅA3", "u つA3", "u んA3", "n RA3" })]
70+
[InlineData("ja_cv",
71+
new string[] { "お", "りゅ", "きゅ", "つ", "ん" })]
72+
public void SyllableSpecialClusterTest(string singerName, string[] aliases) {
73+
SameAltsTonesColorsTest(singerName, aliases,
74+
new string[] { "all", "you", "cute", "soon" });
75+
}
76+
77+
[Theory]
78+
[InlineData("ja_cvvc",
79+
new string[] { "- あ_C4", "a s_C4", "た_C4", "a w_C4" })]
80+
[InlineData("ja_vcv",
81+
new string[] { "- あA3", "a すA3", "u たA3", "a うA3" })]
82+
[InlineData("ja_cv",
83+
new string[] { "あ", "す", "た", "う" })]
84+
public void SyllableClusterTest(string singerName, string[] aliases) {
85+
SameAltsTonesColorsTest(singerName, aliases,
86+
new string[] { "a", "star" });
87+
}
88+
89+
[Theory]
90+
[InlineData("ja_cvvc",
91+
new string[] { "ヴ_C4" })]
92+
[InlineData("ja_vcv",
93+
new string[] { "- ヴA3", "u RA3" })]
94+
[InlineData("ja_cv",
95+
new string[] { "ふ" })]
96+
public void SyllableConditionalAltTest(string singerName, string[] aliases) {
97+
SameAltsTonesColorsTest(singerName, aliases,
98+
new string[] { "vu" });
99+
}
100+
101+
[Theory]
102+
[InlineData("ja_cvvc",
103+
new string[] { "てぃ_C4" })]
104+
[InlineData("ja_vcv",
105+
new string[] { "- てぃA3", "i RA3" })]
106+
[InlineData("ja_cv",
107+
new string[] { "て", "い" })]
108+
public void SyllableExtraCvTest(string singerName, string[] aliases) {
109+
SameAltsTonesColorsTest(singerName, aliases,
110+
new string[] { "tea" });
111+
}
112+
113+
[Theory]
114+
[InlineData("ja_cvvc",
115+
new string[] { "- あ_C4" })]
116+
[InlineData("ja_vcv",
117+
new string[] { "- あA3", "a RA3" })]
118+
[InlineData("ja_cv",
119+
new string[] { "あ" })]
120+
public void EndingVowelTest(string singerName, string[] aliases) {
121+
SameAltsTonesColorsTest(singerName, aliases,
122+
new string[] { "a" });
123+
}
124+
125+
[Theory]
126+
[InlineData("ja_cvvc",
127+
new string[] { "- え_C4", "e n_C4" })]
128+
[InlineData("ja_vcv",
129+
new string[] { "- えA3", "e んA3", "n RA3" })]
130+
[InlineData("ja_cv",
131+
new string[] { "え", "ん" })]
132+
public void EndingNasalTest(string singerName, string[] aliases) {
133+
SameAltsTonesColorsTest(singerName, aliases,
134+
new string[] { "an" });
135+
}
136+
137+
[Theory]
138+
[InlineData("ja_cvvc",
139+
new string[] { "ば_C4", "a w_C4", "- ん_C4" })]
140+
[InlineData("ja_vcv",
141+
new string[] { "- ばA3", "a うA3", "u んA3", "n RA3" })]
142+
[InlineData("ja_cv",
143+
new string[] { "ば", "う", "ん" })]
144+
public void EndingClusterNasalTest(string singerName, string[] aliases) {
145+
SameAltsTonesColorsTest(singerName, aliases,
146+
new string[] { "barn" });
147+
}
148+
149+
[Theory]
150+
[InlineData("ja_cvvc",
151+
new string[] { "- あ_C4", "a p_C4" })]
152+
[InlineData("ja_vcv",
153+
new string[] { "- あA3", "a ぷA3" })]
154+
[InlineData("ja_cv",
155+
new string[] { "あ", "ぷ" })]
156+
public void EndingSingleConsonantTest(string singerName, string[] aliases) {
157+
SameAltsTonesColorsTest(singerName, aliases,
158+
new string[] { "up" });
159+
}
160+
161+
[Theory]
162+
[InlineData("ja_cvvc",
163+
new string[] { "- あ_C4", "a v_C4" })]
164+
[InlineData("ja_vcv",
165+
new string[] { "- あA3", "a ヴA3" })]
166+
[InlineData("ja_cv",
167+
new string[] { "あ", "ふ" })]
168+
public void EndingConditionalAltTest(string singerName, string[] aliases) {
169+
SameAltsTonesColorsTest(singerName, aliases,
170+
new string[] { "of" });
171+
}
172+
173+
[Theory]
174+
[InlineData("ja_cvvc",
175+
new string[] { "- あ_C4", "a n_C4", "ど_C4" })]
176+
[InlineData("ja_vcv",
177+
new string[] { "- あA3", "a んA3", "n どA3" })]
178+
[InlineData("ja_cv",
179+
new string[] { "あ", "ん", "ど" })]
180+
public void EndingClusterTest(string singerName, string[] aliases) {
181+
SameAltsTonesColorsTest(singerName, aliases,
182+
new string[] { "and" });
183+
}
184+
185+
[Theory]
186+
[InlineData("ja_cvvc",
187+
new string[] { "- え_C4", "e ts_C4", "つ_C4" })]
188+
[InlineData("ja_vcv",
189+
new string[] { "- えA3", "e つA3" })]
190+
[InlineData("ja_cv",
191+
new string[] { "え", "つ" })]
192+
public void EndingSpecialClusterTest(string singerName, string[] aliases) {
193+
SameAltsTonesColorsTest(singerName, aliases,
194+
new string[] { "its" });
195+
}
196+
197+
[Theory]
198+
[InlineData("ja_vcv",
199+
new string[] { "its", "its" },
200+
new string[] { "- えA3", "e つぇA3", "e つA3" })]
201+
[InlineData("ja_vcv",
202+
new string[] { "itch", "itch" },
203+
new string[] { "- えA3", "e ちぇA3", "e ちゅA3" })]
204+
[InlineData("ja_vcv",
205+
new string[] { "age", "age" },
206+
new string[] { "- えA3", "e いA3", "i じぇA3", "e いA3", "i じゅA3" })]
207+
public void EndingVcvAffricateTest(string singerName, string[] lyrics, string[] aliases) {
208+
SameAltsTonesColorsTest(singerName, aliases, lyrics);
209+
}
210+
211+
[Theory]
212+
[InlineData(
213+
new string[] { "a", "the" },
214+
new string[] { "- あ_C4", "a d_C4", "だ_C4" })]
215+
[InlineData(
216+
new string[] { "a", "thin" },
217+
new string[] { "- あ_C4", "a s_C4", "せ_C4", "e n_C4" })]
218+
[InlineData(
219+
new string[] { "a", "zha" },
220+
new string[] { "- あ_C4", "a sh_C4", "しゃ_C4" })]
221+
[InlineData(
222+
new string[] { "a", "ra" },
223+
new string[] { "- あ_C4", "a w_C4", "わ_C4" })]
224+
[InlineData(
225+
new string[] { "a", "la" },
226+
new string[] { "- あ_C4", "a r_C4", "ら_C4" })]
227+
[InlineData(
228+
new string[] { "all", "you" },
229+
new string[] { "- お_C4", "o ry_C4", "りゅ_C4" })]
230+
public void SyllableDigraphVCTest(string[] lyrics, string[] aliases) {
231+
SameAltsTonesColorsTest("ja_cvvc", aliases, lyrics);
232+
}
233+
234+
private void SameAltsTonesColorsTest(string singerName, string[] aliases, string[] lyrics) {
235+
RunPhonemizeTest(singerName, lyrics,
236+
RepeatString(lyrics.Length, ""),
237+
RepeatString(lyrics.Length, "C4"),
238+
RepeatString(lyrics.Length, ""), aliases);
239+
}
240+
241+
private string[] RepeatString(int count, string s) {
242+
string[] array = new string[count];
243+
Array.Fill(array, s);
244+
return array;
45245
}
46246
}
47247
}

0 commit comments

Comments
 (0)