piper-phoneme-streaming 0.1.1

A high-performance Rust library for streaming Text-to-Phoneme (G2P) conversion.
Documentation
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()
    }
}