Treating schwa as a separate phone
This commit is contained in:
parent
1f6f6d6175
commit
503ba9104a
|
@ -22,6 +22,7 @@ EnumConverter<Phone>::member_data PhoneConverter::getMemberData() {
|
||||||
{ Phone::IH, "IH" },
|
{ Phone::IH, "IH" },
|
||||||
{ Phone::UH, "UH" },
|
{ Phone::UH, "UH" },
|
||||||
{ Phone::AH, "AH" },
|
{ Phone::AH, "AH" },
|
||||||
|
{ Phone::Schwa, "Schwa" },
|
||||||
{ Phone::AE, "AE" },
|
{ Phone::AE, "AE" },
|
||||||
{ Phone::EY, "EY" },
|
{ Phone::EY, "EY" },
|
||||||
{ Phone::AY, "AY" },
|
{ Phone::AY, "AY" },
|
||||||
|
|
|
@ -15,7 +15,8 @@ enum class Phone {
|
||||||
EH, // [ɛ] as in r[e]d, m[e]n
|
EH, // [ɛ] as in r[e]d, m[e]n
|
||||||
IH, // [ɪ] as in b[i]g, w[i]n
|
IH, // [ɪ] as in b[i]g, w[i]n
|
||||||
UH, // [ʊ] as in sh[ou]ld, c[ou]ld
|
UH, // [ʊ] as in sh[ou]ld, c[ou]ld
|
||||||
AH, // [ʌ, ə] as in b[u]t, s[u]n, [a]lone, disc[u]s
|
AH, // [ʌ] as in b[u]t, s[u]n
|
||||||
|
Schwa, // [ə] as in [a]lone, disc[u]s
|
||||||
AE, // [æ] as in [a]t, b[a]t
|
AE, // [æ] as in [a]t, b[a]t
|
||||||
|
|
||||||
// ... diphthongs
|
// ... diphthongs
|
||||||
|
|
|
@ -60,7 +60,8 @@ Timeline<Viseme> animate(optional<Phone> phone, centiseconds duration, centiseco
|
||||||
case Phone::EH: return single({ { C }, 20_cs, { D } });
|
case Phone::EH: return single({ { C }, 20_cs, { D } });
|
||||||
case Phone::IH: return single({ B });
|
case Phone::IH: return single({ B });
|
||||||
case Phone::UH: return single({ E });
|
case Phone::UH: return single({ E });
|
||||||
case Phone::AH: return single({ { B, C, D, E, F }, 6_cs, { C } }); // Heuristic: < 6_cs is schwa
|
case Phone::AH: return single({ C });
|
||||||
|
case Phone::Schwa: return single({ { B, C, D, E, F } });
|
||||||
case Phone::AE: return single({ D });
|
case Phone::AE: return single({ D });
|
||||||
case Phone::EY: return diphtong({ { C }, 20_cs, { D } }, { B });
|
case Phone::EY: return diphtong({ { C }, 20_cs, { D } }, { B });
|
||||||
case Phone::AY: return diphtong({ D }, { B });
|
case Phone::AY: return diphtong({ D }, { B });
|
||||||
|
|
|
@ -203,7 +203,12 @@ optional<Timeline<Phone>> getPhoneAlignment(
|
||||||
// Add entry
|
// Add entry
|
||||||
centiseconds start(phoneEntry->start);
|
centiseconds start(phoneEntry->start);
|
||||||
centiseconds duration(phoneEntry->duration);
|
centiseconds duration(phoneEntry->duration);
|
||||||
Timed<Phone> timedPhone(start, start + duration, PhoneConverter::get().parse(phoneName));
|
Phone phone = PhoneConverter::get().parse(phoneName);
|
||||||
|
if (phone == Phone::AH && duration < 6_cs) {
|
||||||
|
// Heuristic: < 6_cs is schwa. Pocketsphinx doesn't differentiate.
|
||||||
|
phone = Phone::Schwa;
|
||||||
|
}
|
||||||
|
Timed<Phone> timedPhone(start, start + duration, phone);
|
||||||
result.set(timedPhone);
|
result.set(timedPhone);
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
|
|
Loading…
Reference in New Issue