use piper_plus_g2p::Phonemizer as G2pPhonemizer;
use super::{Phonemizer, ProsodyFeature, ProsodyInfo};
use crate::config::PhonemeIdMap;
use crate::error::PiperError;
use piper_plus_g2p::multilingual::default_post_process_ids;
pub struct G2pAdapter {
inner: Box<dyn G2pPhonemizer>,
is_japanese: bool,
}
impl G2pAdapter {
pub fn new(inner: Box<dyn G2pPhonemizer>) -> Self {
let is_japanese = inner.language_code() == "ja";
Self { inner, is_japanese }
}
}
impl Phonemizer for G2pAdapter {
fn phonemize_with_prosody(
&self,
text: &str,
) -> Result<(Vec<String>, Vec<Option<ProsodyInfo>>), PiperError> {
let (tokens, prosody) = self.inner.phonemize_with_prosody(text)?;
let prosody = prosody
.into_iter()
.map(|opt| {
opt.map(|p| ProsodyInfo {
a1: p.a1,
a2: p.a2,
a3: p.a3,
})
})
.collect();
Ok((tokens, prosody))
}
fn get_phoneme_id_map(&self) -> Option<&PhonemeIdMap> {
None }
fn post_process_ids(
&self,
ids: Vec<i64>,
prosody: Vec<Option<ProsodyFeature>>,
id_map: &PhonemeIdMap,
) -> (Vec<i64>, Vec<Option<ProsodyFeature>>) {
if self.is_japanese {
(ids, prosody)
} else {
default_post_process_ids(ids, prosody, id_map, "$")
}
}
fn language_code(&self) -> &str {
self.inner.language_code()
}
fn detect_primary_language(&self, text: &str) -> &str {
self.inner.detect_primary_language(text)
}
}