jpreprocess_core/pronunciation/
phoneme.rs

1use std::fmt::Display;
2
3use super::{Mora, MoraEnum};
4
5pub(crate) fn mora_to_phoneme(mora: &Mora) -> (Option<Consonant>, Option<Vowel>) {
6    let (consonant, vowel) = match mora.mora_enum {
7        MoraEnum::Vyo => (Some(Consonant::By), Some(Vowel::O)),
8        MoraEnum::Vyu => (Some(Consonant::By), Some(Vowel::U)),
9        MoraEnum::Vya => (Some(Consonant::By), Some(Vowel::A)),
10        MoraEnum::Vo => (Some(Consonant::V), Some(Vowel::O)),
11        MoraEnum::Ve => (Some(Consonant::V), Some(Vowel::E)),
12        MoraEnum::Vi => (Some(Consonant::V), Some(Vowel::I)),
13        MoraEnum::Va => (Some(Consonant::V), Some(Vowel::A)),
14        MoraEnum::Vu => (Some(Consonant::V), Some(Vowel::U)),
15        MoraEnum::N => (Some(Consonant::Nn), None),
16        MoraEnum::Wo => (None, Some(Vowel::O)),
17        MoraEnum::We => (None, Some(Vowel::E)),
18        MoraEnum::Wi => (None, Some(Vowel::I)),
19        MoraEnum::Wa => (Some(Consonant::W), Some(Vowel::A)),
20        MoraEnum::Xwa => (Some(Consonant::W), Some(Vowel::A)),
21        MoraEnum::Ro => (Some(Consonant::R), Some(Vowel::O)),
22        MoraEnum::Re => (Some(Consonant::R), Some(Vowel::E)),
23        MoraEnum::Ru => (Some(Consonant::R), Some(Vowel::U)),
24        MoraEnum::Ryo => (Some(Consonant::Ry), Some(Vowel::O)),
25        MoraEnum::Ryu => (Some(Consonant::Ry), Some(Vowel::U)),
26        MoraEnum::Rya => (Some(Consonant::Ry), Some(Vowel::A)),
27        MoraEnum::Rye => (Some(Consonant::Ry), Some(Vowel::E)),
28        MoraEnum::Ri => (Some(Consonant::R), Some(Vowel::I)),
29        MoraEnum::Ra => (Some(Consonant::R), Some(Vowel::A)),
30        MoraEnum::Yo => (Some(Consonant::Y), Some(Vowel::O)),
31        MoraEnum::Xyo => (Some(Consonant::Y), Some(Vowel::O)),
32        MoraEnum::Yu => (Some(Consonant::Y), Some(Vowel::U)),
33        MoraEnum::Xyu => (Some(Consonant::Y), Some(Vowel::U)),
34        MoraEnum::Ya => (Some(Consonant::Y), Some(Vowel::A)),
35        MoraEnum::Xya => (Some(Consonant::Y), Some(Vowel::A)),
36        MoraEnum::Mo => (Some(Consonant::M), Some(Vowel::O)),
37        MoraEnum::Me => (Some(Consonant::M), Some(Vowel::E)),
38        MoraEnum::Mu => (Some(Consonant::M), Some(Vowel::U)),
39        MoraEnum::Myo => (Some(Consonant::My), Some(Vowel::O)),
40        MoraEnum::Myu => (Some(Consonant::My), Some(Vowel::U)),
41        MoraEnum::Mya => (Some(Consonant::My), Some(Vowel::A)),
42        MoraEnum::Mye => (Some(Consonant::My), Some(Vowel::E)),
43        MoraEnum::Mi => (Some(Consonant::M), Some(Vowel::I)),
44        MoraEnum::Ma => (Some(Consonant::M), Some(Vowel::A)),
45        MoraEnum::Po => (Some(Consonant::P), Some(Vowel::O)),
46        MoraEnum::Bo => (Some(Consonant::B), Some(Vowel::O)),
47        MoraEnum::Ho => (Some(Consonant::H), Some(Vowel::O)),
48        MoraEnum::Pe => (Some(Consonant::P), Some(Vowel::E)),
49        MoraEnum::Be => (Some(Consonant::B), Some(Vowel::E)),
50        MoraEnum::He => (Some(Consonant::H), Some(Vowel::E)),
51        MoraEnum::Pu => (Some(Consonant::P), Some(Vowel::U)),
52        MoraEnum::Bu => (Some(Consonant::B), Some(Vowel::U)),
53        MoraEnum::Fo => (Some(Consonant::F), Some(Vowel::O)),
54        MoraEnum::Fe => (Some(Consonant::F), Some(Vowel::E)),
55        MoraEnum::Fi => (Some(Consonant::F), Some(Vowel::I)),
56        MoraEnum::Fa => (Some(Consonant::F), Some(Vowel::A)),
57        MoraEnum::Fu => (Some(Consonant::F), Some(Vowel::U)),
58        MoraEnum::Pyo => (Some(Consonant::Py), Some(Vowel::O)),
59        MoraEnum::Pyu => (Some(Consonant::Py), Some(Vowel::U)),
60        MoraEnum::Pya => (Some(Consonant::Py), Some(Vowel::A)),
61        MoraEnum::Pye => (Some(Consonant::Py), Some(Vowel::E)),
62        MoraEnum::Pi => (Some(Consonant::P), Some(Vowel::I)),
63        MoraEnum::Byo => (Some(Consonant::By), Some(Vowel::O)),
64        MoraEnum::Byu => (Some(Consonant::By), Some(Vowel::U)),
65        MoraEnum::Bya => (Some(Consonant::By), Some(Vowel::A)),
66        MoraEnum::Bye => (Some(Consonant::By), Some(Vowel::E)),
67        MoraEnum::Bi => (Some(Consonant::B), Some(Vowel::I)),
68        MoraEnum::Hyo => (Some(Consonant::Hy), Some(Vowel::O)),
69        MoraEnum::Hyu => (Some(Consonant::Hy), Some(Vowel::U)),
70        MoraEnum::Hya => (Some(Consonant::Hy), Some(Vowel::A)),
71        MoraEnum::Hye => (Some(Consonant::Hy), Some(Vowel::E)),
72        MoraEnum::Hi => (Some(Consonant::H), Some(Vowel::I)),
73        MoraEnum::Pa => (Some(Consonant::P), Some(Vowel::A)),
74        MoraEnum::Ba => (Some(Consonant::B), Some(Vowel::A)),
75        MoraEnum::Ha => (Some(Consonant::H), Some(Vowel::A)),
76        MoraEnum::No => (Some(Consonant::N), Some(Vowel::O)),
77        MoraEnum::Ne => (Some(Consonant::N), Some(Vowel::E)),
78        MoraEnum::Nu => (Some(Consonant::N), Some(Vowel::U)),
79        MoraEnum::Nyo => (Some(Consonant::Ny), Some(Vowel::O)),
80        MoraEnum::Nyu => (Some(Consonant::Ny), Some(Vowel::U)),
81        MoraEnum::Nya => (Some(Consonant::Ny), Some(Vowel::A)),
82        MoraEnum::Nye => (Some(Consonant::Ny), Some(Vowel::E)),
83        MoraEnum::Ni => (Some(Consonant::N), Some(Vowel::I)),
84        MoraEnum::Na => (Some(Consonant::N), Some(Vowel::A)),
85        MoraEnum::Dwu => (Some(Consonant::D), Some(Vowel::U)),
86        MoraEnum::Do => (Some(Consonant::D), Some(Vowel::O)),
87        MoraEnum::Twu => (Some(Consonant::T), Some(Vowel::U)),
88        MoraEnum::To => (Some(Consonant::T), Some(Vowel::O)),
89        MoraEnum::Dho => (Some(Consonant::Dy), Some(Vowel::O)),
90        MoraEnum::Dhu => (Some(Consonant::Dy), Some(Vowel::U)),
91        MoraEnum::Dha => (Some(Consonant::Dy), Some(Vowel::A)),
92        MoraEnum::Dhi => (Some(Consonant::D), Some(Vowel::I)),
93        MoraEnum::De => (Some(Consonant::D), Some(Vowel::E)),
94        MoraEnum::Tho => (Some(Consonant::Ty), Some(Vowel::O)),
95        MoraEnum::Thu => (Some(Consonant::Ty), Some(Vowel::U)),
96        MoraEnum::Tha => (Some(Consonant::Ty), Some(Vowel::A)),
97        MoraEnum::Thi => (Some(Consonant::T), Some(Vowel::I)),
98        MoraEnum::Te => (Some(Consonant::T), Some(Vowel::E)),
99        MoraEnum::Du => (Some(Consonant::Z), Some(Vowel::U)),
100        MoraEnum::Tso => (Some(Consonant::Ts), Some(Vowel::O)),
101        MoraEnum::Tse => (Some(Consonant::Ts), Some(Vowel::E)),
102        MoraEnum::Tsi => (Some(Consonant::Ts), Some(Vowel::I)),
103        MoraEnum::Tsa => (Some(Consonant::Ts), Some(Vowel::A)),
104        MoraEnum::Tsu => (Some(Consonant::Ts), Some(Vowel::U)),
105        MoraEnum::Xtsu => (Some(Consonant::Cl), None),
106        MoraEnum::Di => (Some(Consonant::J), Some(Vowel::I)),
107        MoraEnum::Cho => (Some(Consonant::Ch), Some(Vowel::O)),
108        MoraEnum::Chu => (Some(Consonant::Ch), Some(Vowel::U)),
109        MoraEnum::Cha => (Some(Consonant::Ch), Some(Vowel::A)),
110        MoraEnum::Che => (Some(Consonant::Ch), Some(Vowel::E)),
111        MoraEnum::Chi => (Some(Consonant::Ch), Some(Vowel::I)),
112        MoraEnum::Da => (Some(Consonant::D), Some(Vowel::A)),
113        MoraEnum::Ta => (Some(Consonant::T), Some(Vowel::A)),
114        MoraEnum::Zo => (Some(Consonant::Z), Some(Vowel::O)),
115        MoraEnum::So => (Some(Consonant::S), Some(Vowel::O)),
116        MoraEnum::Ze => (Some(Consonant::Z), Some(Vowel::E)),
117        MoraEnum::Se => (Some(Consonant::S), Some(Vowel::E)),
118        MoraEnum::Zwi => (Some(Consonant::Z), Some(Vowel::I)),
119        MoraEnum::Zu => (Some(Consonant::Z), Some(Vowel::U)),
120        MoraEnum::Swi => (Some(Consonant::S), Some(Vowel::I)),
121        MoraEnum::Su => (Some(Consonant::S), Some(Vowel::U)),
122        MoraEnum::Jo => (Some(Consonant::J), Some(Vowel::O)),
123        MoraEnum::Ju => (Some(Consonant::J), Some(Vowel::U)),
124        MoraEnum::Ja => (Some(Consonant::J), Some(Vowel::A)),
125        MoraEnum::Je => (Some(Consonant::J), Some(Vowel::E)),
126        MoraEnum::Ji => (Some(Consonant::J), Some(Vowel::I)),
127        MoraEnum::Sho => (Some(Consonant::Sh), Some(Vowel::O)),
128        MoraEnum::Shu => (Some(Consonant::Sh), Some(Vowel::U)),
129        MoraEnum::Sha => (Some(Consonant::Sh), Some(Vowel::A)),
130        MoraEnum::She => (Some(Consonant::Sh), Some(Vowel::E)),
131        MoraEnum::Shi => (Some(Consonant::Sh), Some(Vowel::I)),
132        MoraEnum::Za => (Some(Consonant::Z), Some(Vowel::A)),
133        MoraEnum::Sa => (Some(Consonant::S), Some(Vowel::A)),
134        MoraEnum::Go => (Some(Consonant::G), Some(Vowel::O)),
135        MoraEnum::Ko => (Some(Consonant::K), Some(Vowel::O)),
136        MoraEnum::Ge => (Some(Consonant::G), Some(Vowel::E)),
137        MoraEnum::Ke => (Some(Consonant::K), Some(Vowel::E)),
138        MoraEnum::Xke => (Some(Consonant::K), Some(Vowel::E)),
139        MoraEnum::Gwa => (Some(Consonant::Gw), Some(Vowel::A)),
140        MoraEnum::Gu => (Some(Consonant::G), Some(Vowel::U)),
141        MoraEnum::Kwa => (Some(Consonant::Kw), Some(Vowel::A)),
142        MoraEnum::Ku => (Some(Consonant::K), Some(Vowel::U)),
143        MoraEnum::Gyo => (Some(Consonant::Gy), Some(Vowel::O)),
144        MoraEnum::Gyu => (Some(Consonant::Gy), Some(Vowel::U)),
145        MoraEnum::Gya => (Some(Consonant::Gy), Some(Vowel::A)),
146        MoraEnum::Gye => (Some(Consonant::Gy), Some(Vowel::E)),
147        MoraEnum::Gi => (Some(Consonant::G), Some(Vowel::I)),
148        MoraEnum::Kyo => (Some(Consonant::Ky), Some(Vowel::O)),
149        MoraEnum::Kyu => (Some(Consonant::Ky), Some(Vowel::U)),
150        MoraEnum::Kya => (Some(Consonant::Ky), Some(Vowel::A)),
151        MoraEnum::Kye => (Some(Consonant::Ky), Some(Vowel::E)),
152        MoraEnum::Ki => (Some(Consonant::K), Some(Vowel::I)),
153        MoraEnum::Ga => (Some(Consonant::G), Some(Vowel::A)),
154        MoraEnum::Ka => (Some(Consonant::K), Some(Vowel::A)),
155        MoraEnum::O => (None, Some(Vowel::O)),
156        MoraEnum::Xo => (None, Some(Vowel::O)),
157        MoraEnum::E => (None, Some(Vowel::E)),
158        MoraEnum::Xe => (None, Some(Vowel::E)),
159        MoraEnum::Who => (Some(Consonant::W), Some(Vowel::O)),
160        MoraEnum::Whe => (Some(Consonant::W), Some(Vowel::E)),
161        MoraEnum::Whi => (Some(Consonant::W), Some(Vowel::I)),
162        MoraEnum::U => (None, Some(Vowel::U)),
163        MoraEnum::Xu => (None, Some(Vowel::U)),
164        MoraEnum::Ye => (Some(Consonant::Y), Some(Vowel::E)),
165        MoraEnum::I => (None, Some(Vowel::I)),
166        MoraEnum::Xi => (None, Some(Vowel::I)),
167        MoraEnum::A => (None, Some(Vowel::A)),
168        MoraEnum::Xa => (None, Some(Vowel::A)),
169
170        MoraEnum::Long => (Some(Consonant::Long), None),
171        MoraEnum::Touten | MoraEnum::Question => (None, None),
172    };
173    (
174        consonant,
175        vowel.map(|vowel| {
176            if mora.is_voiced {
177                vowel
178            } else {
179                vowel.into_unvoiced()
180            }
181        }),
182    )
183}
184
185#[derive(Clone, Copy, Debug)]
186pub enum Consonant {
187    V,
188    W,
189    R,
190    Ry,
191    Y,
192    M,
193    My,
194    P,
195    B,
196    H,
197    F,
198    Py,
199    By,
200    Hy,
201    N,
202    Ny,
203    D,
204    T,
205    Dy,
206    Ty,
207    Ts,
208    Ch,
209    Z,
210    S,
211    J,
212    Sh,
213    G,
214    K,
215    Gy,
216    Ky,
217    Gw,
218    Kw,
219
220    // Consonants without vowel
221    /// ン
222    Nn,
223    /// ッ
224    Cl,
225
226    // Consonant removed from output
227    /// ー
228    Long,
229}
230
231impl Display for Consonant {
232    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
233        let s = match self {
234            Self::V => "v",
235            Self::W => "w",
236            Self::R => "r",
237            Self::Ry => "ry",
238            Self::Y => "y",
239            Self::M => "m",
240            Self::My => "my",
241            Self::P => "p",
242            Self::B => "b",
243            Self::H => "h",
244            Self::F => "f",
245            Self::Py => "py",
246            Self::By => "by",
247            Self::Hy => "hy",
248            Self::N => "n",
249            Self::Ny => "ny",
250            Self::D => "d",
251            Self::T => "t",
252            Self::Dy => "dy",
253            Self::Ty => "ty",
254            Self::Ts => "ts",
255            Self::Ch => "ch",
256            Self::Z => "z",
257            Self::S => "s",
258            Self::J => "j",
259            Self::Sh => "sh",
260            Self::G => "g",
261            Self::K => "k",
262            Self::Gy => "gy",
263            Self::Ky => "ky",
264            Self::Gw => "gw",
265            Self::Kw => "kw",
266
267            Self::Nn => "N",
268            Self::Cl => "cl",
269
270            Self::Long => "-",
271        };
272        write!(f, "{}", s)
273    }
274}
275
276#[derive(Clone, Copy, Debug)]
277pub enum Vowel {
278    A,
279    I,
280    U,
281    E,
282    O,
283    AUnvoiced,
284    IUnvoiced,
285    UUnvoiced,
286    EUnvoiced,
287    OUnvoiced,
288}
289
290impl Vowel {
291    pub fn into_unvoiced(self) -> Self {
292        match self {
293            Self::A => Self::AUnvoiced,
294            Self::I => Self::IUnvoiced,
295            Self::U => Self::UUnvoiced,
296            Self::E => Self::EUnvoiced,
297            Self::O => Self::OUnvoiced,
298            rest => rest,
299        }
300    }
301}
302
303impl Display for Vowel {
304    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
305        let s = match self {
306            Self::A => "a",
307            Self::I => "i",
308            Self::U => "u",
309            Self::E => "e",
310            Self::O => "o",
311            Self::AUnvoiced => "A",
312            Self::IUnvoiced => "I",
313            Self::UUnvoiced => "U",
314            Self::EUnvoiced => "E",
315            Self::OUnvoiced => "O",
316        };
317        write!(f, "{}", s)
318    }
319}