use std::collections::HashMap;
use crate::config::PhonemeIdMap;
use crate::error::PiperError;
pub use piper_plus_g2p::G2pError;
pub use piper_plus_g2p::PhonemeIdMap as G2pPhonemeIdMap;
pub mod adapter;
pub mod chinese;
pub use piper_plus_g2p::custom_dict;
pub mod english;
pub mod french;
#[cfg(feature = "japanese")]
pub mod japanese;
pub mod korean;
pub use piper_plus_g2p::multilingual;
pub mod portuguese;
pub mod spanish;
pub use piper_plus_g2p::token_map;
#[derive(Debug, Clone, Copy)]
pub struct ProsodyInfo {
pub a1: i32,
pub a2: i32,
pub a3: i32,
}
pub type ProsodyFeature = [i32; 3];
pub trait Phonemizer: Send + Sync {
fn phonemize_with_prosody(
&self,
text: &str,
) -> Result<(Vec<String>, Vec<Option<ProsodyInfo>>), PiperError>;
fn get_phoneme_id_map(&self) -> Option<&PhonemeIdMap>;
fn post_process_ids(
&self,
ids: Vec<i64>,
prosody: Vec<Option<ProsodyFeature>>,
id_map: &PhonemeIdMap,
) -> (Vec<i64>, Vec<Option<ProsodyFeature>>);
fn language_code(&self) -> &str;
fn detect_primary_language(&self, _text: &str) -> &str {
self.language_code()
}
}
pub struct PhonemizerRegistry {
registry: HashMap<String, Box<dyn Phonemizer>>,
}
impl PhonemizerRegistry {
pub fn new() -> Self {
Self {
registry: HashMap::new(),
}
}
pub fn register(&mut self, lang_code: &str, phonemizer: Box<dyn Phonemizer>) {
self.registry.insert(lang_code.to_string(), phonemizer);
}
pub fn get(&self, lang_code: &str) -> Option<&dyn Phonemizer> {
self.registry.get(lang_code).map(|p| p.as_ref())
}
pub fn available_languages(&self) -> Vec<&str> {
self.registry.keys().map(|s| s.as_str()).collect()
}
}
impl Default for PhonemizerRegistry {
fn default() -> Self {
Self::new()
}
}