espeak-ng 0.1.1

Pure Rust port of eSpeak NG text-to-speech
Documentation
fn main() {
    use std::path::Path;
    use espeak_ng::phoneme::PhonemeData;
    use espeak_ng::translate::Translator;
    use espeak_ng::{Synthesizer, VoiceParams};
    
    let data_path = Path::new("/usr/share/espeak-ng-data");
    let mut phdata = PhonemeData::load(data_path).unwrap();
    phdata.select_table_by_name("en").unwrap();
    
    let translator = Translator::new_default("en").unwrap();
    
    for word in &["ah", "hello", "the"] {
        let codes = translator.translate_to_codes(word).unwrap();
        println!("{}: codes={:?}", word, codes.iter().map(|c| (c.code, c.is_boundary)).collect::<Vec<_>>());
        
        let synth = Synthesizer::new(VoiceParams::default());
        let pcm = synth.synthesize_codes(&codes, &phdata).unwrap();
        let rms = if pcm.is_empty() { 0.0 } else {
            (pcm.iter().map(|&x| (x as f64).powi(2)).sum::<f64>() / pcm.len() as f64).sqrt()
        };
        println!("  pcm len={}, peak={}, rms={:.1}",
            pcm.len(),
            pcm.iter().map(|&x| x.unsigned_abs()).max().unwrap_or(0),
            rms);
    }
}