mirror of https://github.com/ndarilek/tts-rs.git
46 lines
1.2 KiB
Rust
46 lines
1.2 KiB
Rust
|
#[cfg(target_os = "linux")]
|
||
|
|
||
|
use std::u8;
|
||
|
|
||
|
use log::{info, trace};
|
||
|
use speech_dispatcher::*;
|
||
|
|
||
|
use crate::Backend;
|
||
|
|
||
|
pub struct SpeechDispatcher(Connection);
|
||
|
|
||
|
impl SpeechDispatcher {
|
||
|
pub fn new() -> impl Backend {
|
||
|
info!("Initializing SpeechDispatcher backend");
|
||
|
let connection = speech_dispatcher::Connection::open("tts", "tts", "tts", Mode::Single);
|
||
|
SpeechDispatcher(connection)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
impl Backend for SpeechDispatcher {
|
||
|
fn speak(&self, text: &str, interrupt: bool) {
|
||
|
trace!("speak({}, {})", text, interrupt);
|
||
|
if interrupt {
|
||
|
self.0.cancel();
|
||
|
}
|
||
|
self.0.say(Priority::Important, text);
|
||
|
}
|
||
|
|
||
|
fn get_rate(&self) -> u8 {
|
||
|
let rate = self.0.get_voice_rate() as f32;
|
||
|
trace!("get_voice_rate() = {}", rate);
|
||
|
let ratio: f32 = (rate + 100.) / 200.;
|
||
|
trace!("ratio = {}", ratio);
|
||
|
let rate = ratio * u8::MAX as f32;
|
||
|
trace!("rate = {}", rate);
|
||
|
rate as u8
|
||
|
}
|
||
|
|
||
|
fn set_rate(&self, rate: u8) {
|
||
|
trace!("set_rate({})", rate);
|
||
|
let ratio: f32 = rate as f32/u8::MAX as f32;
|
||
|
let rate = ratio * 200. - 100.;
|
||
|
self.0.set_voice_rate(rate as i32);
|
||
|
}
|
||
|
}
|