use std::os::unix::prelude::AsRawFd;
use bitflags::bitflags;
use crate::utils::StringFromCPtr;
use crate::{bindings, utils};
#[derive(Clone, Copy)]
pub enum PhonemeGenOptions<'a> {
Standard {
text_mode: TextMode,
phoneme_mode: PhonemeMode,
},
Mbrola,
MbrolaFile(&'a dyn AsRawFd),
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
#[repr(u32)]
pub enum TextMode {
#[default]
Utf8 = 1,
}
bitflags! {
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub struct PhonemeMode: u32 {
const IncludeTies = 1;
const IncludeZeroWidthJoiners = 2;
const SeparateWithUnderscores = 4;
}
}
#[derive(Debug, PartialEq, Eq, Copy, Clone, strum_macros::FromRepr)]
#[repr(u8)]
pub enum Gender {
Male = 1,
Female = 2,
}
#[derive(Debug, PartialEq, Eq, Clone)]
pub struct Language {
pub name: String,
pub priority: i8,
}
#[derive(Debug, PartialEq, Eq, Clone)]
#[non_exhaustive] pub struct Voice {
pub name: String,
pub filename: String,
pub languages: Vec<Language>,
pub gender: Option<Gender>,
pub age: u8,
}
impl From<bindings::espeak_VOICE> for Voice {
fn from(voice: bindings::espeak_VOICE) -> Self {
unsafe {
Self {
age: voice.age,
name: String::from_cptr(voice.name),
filename: String::from_cptr(voice.identifier),
gender: Gender::from_repr(voice.gender),
languages: utils::parse_lang_array(voice.languages),
}
}
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
#[repr(u32)]
pub enum Parameter {
Rate = 1,
Volume = 2,
Pitch = 3,
Range = 4,
Punctuation = 5,
Capitals = 6,
Wordgap = 7,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
#[repr(u32)]
pub enum PunctationType {
None = 0,
All = 1,
Some = 2,
}