use crate::G2pToken;
use crate::error::Result;
use crate::semantic::{Language, SentenceUnit};
use std::sync::Arc;
use super::{Entry, Renderer, load_phoneme_data, promote_clauses};
pub struct FullSentencePhonemeUpgrade {
language: Language,
phdata: Arc<crate::phoneme::PhonemeData>,
}
impl FullSentencePhonemeUpgrade {
pub fn new(language: Language) -> Result<Self> {
let phdata = load_phoneme_data(language)?;
Ok(Self { language, phdata })
}
pub fn upgrade(&self, units: &[SentenceUnit]) -> Vec<G2pToken> {
let upgraded = self.upgrade_units(units);
let mut renderer = Renderer::new(self.language);
let mut tokens = renderer.render(&upgraded, &self.phdata);
while let Some(last) = tokens.last() {
if last.token == '\n' {
tokens.pop();
} else {
break;
}
}
tokens
}
pub fn upgrade_units(&self, units: &[SentenceUnit]) -> Vec<SentenceUnit> {
let mut entries: Vec<Entry> = units.iter().map(Entry::from_sentence_unit).collect();
promote_clauses(&mut entries, &self.phdata, false);
entries
.into_iter()
.map(|entry| entry.convert_to_sentence_unit(self.language, &self.phdata))
.collect()
}
}