tts-rs/src/lib.rs

138 lines
3.3 KiB
Rust
Raw Normal View History

2018-12-28 15:39:50 +00:00
/*!
* a Text-To-Speech (TTS) library providing high-level interfaces to a variety of backends.
2018-12-30 17:20:03 +00:00
* Currently supported backends are:
* * [Speech Dispatcher](https://freebsoft.org/speechd) (Linux)
* * WebAssembly
2018-12-28 15:39:50 +00:00
*/
2018-12-14 19:35:49 +00:00
use std::boxed::Box;
2018-12-30 17:13:48 +00:00
use std::convert;
use std::fmt;
use std::io;
use failure::Fail;
2018-12-14 19:35:49 +00:00
mod backends;
pub enum Backends {
#[cfg(target_os = "linux")]
SpeechDispatcher,
2018-12-30 17:13:48 +00:00
#[cfg(target_arch = "wasm32")]
Web,
}
#[derive(Debug, Fail)]
pub struct Error(String);
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> {
write!(f, "{}", self.0)?;
Ok(())
}
}
impl convert::From<Error> for io::Error {
fn from(e: Error) -> io::Error {
io::Error::new(io::ErrorKind::Other, e.0)
}
2018-12-14 19:35:49 +00:00
}
trait Backend {
2018-12-30 17:13:48 +00:00
fn speak(&self, text: &str, interrupt: bool) -> Result<(), Error>;
fn stop(&self) -> Result<(), Error>;
fn get_rate(&self) -> Result<u8, Error>;
fn set_rate(&mut self, rate: u8) -> Result<(), Error>;
fn get_pitch(&self) -> Result<u8, Error>;
fn set_pitch(&mut self, pitch: u8) -> Result<(), Error>;
fn get_volume(&self) -> Result<u8, Error>;
fn set_volume(&mut self, volume: u8) -> Result<(), Error>;
2018-12-14 19:35:49 +00:00
}
pub struct TTS(Box<Backend>);
impl TTS {
2018-12-28 15:39:50 +00:00
/**
* Create a new `TTS` instance with the specified backend.
2019-01-03 16:16:54 +00:00
*/
2018-12-30 17:13:48 +00:00
pub fn new(backend: Backends) -> Result<TTS, Error> {
2018-12-14 19:35:49 +00:00
match backend {
#[cfg(target_os = "linux")]
2018-12-30 17:13:48 +00:00
Backends::SpeechDispatcher => Ok(TTS(Box::new(backends::SpeechDispatcher::new()))),
#[cfg(target_arch = "wasm32")]
Backends::Web => {
let tts = backends::Web::new()?;
Ok(TTS(Box::new(tts)))
2019-01-03 16:16:54 +00:00
}
2018-12-14 19:35:49 +00:00
}
}
2018-12-30 17:13:48 +00:00
pub fn default() -> Result<TTS, Error> {
#[cfg(target_os = "linux")]
let tts = TTS::new(Backends::SpeechDispatcher);
#[cfg(target_arch = "wasm32")]
let tts = TTS::new(Backends::Web);
tts
}
2018-12-28 15:39:50 +00:00
/**
* Speaks the specified text, optionally interrupting current speech.
2019-01-03 16:16:54 +00:00
*/
2018-12-30 17:13:48 +00:00
pub fn speak<S: Into<String>>(&self, text: S, interrupt: bool) -> Result<&Self, Error> {
self.0.speak(text.into().as_str(), interrupt)?;
Ok(self)
2018-12-14 19:35:49 +00:00
}
2018-12-28 15:39:50 +00:00
/**
* Stops current speech.
2019-01-03 16:16:54 +00:00
*/
2018-12-30 17:13:48 +00:00
pub fn stop(&self) -> Result<&Self, Error> {
self.0.stop()?;
Ok(self)
2018-12-28 14:49:02 +00:00
}
2018-12-28 15:39:50 +00:00
/**
* Gets the current speech rate.
2019-01-03 16:16:54 +00:00
*/
2018-12-30 17:13:48 +00:00
pub fn get_rate(&self) -> Result<u8, Error> {
2018-12-14 19:35:49 +00:00
self.0.get_rate()
}
2018-12-28 15:39:50 +00:00
/**
* Sets the desired speech rate.
2019-01-03 16:16:54 +00:00
*/
2018-12-30 17:13:48 +00:00
pub fn set_rate(&mut self, rate: u8) -> Result<&Self, Error> {
self.0.set_rate(rate)?;
Ok(self)
2018-12-14 19:35:49 +00:00
}
2018-12-15 15:56:13 +00:00
2018-12-28 15:39:50 +00:00
/**
* Gets the current speech pitch.
2019-01-03 16:16:54 +00:00
*/
2018-12-30 17:13:48 +00:00
pub fn get_pitch(&self) -> Result<u8, Error> {
2018-12-15 15:56:13 +00:00
self.0.get_pitch()
}
2018-12-28 15:39:50 +00:00
/**
* Sets the desired speech pitch.
2019-01-03 16:16:54 +00:00
*/
2018-12-30 17:13:48 +00:00
pub fn set_pitch(&mut self, pitch: u8) -> Result<&Self, Error> {
self.0.set_pitch(pitch)?;
Ok(self)
2018-12-15 15:56:13 +00:00
}
2018-12-28 15:39:50 +00:00
/**
* Gets the current speech volume.
2019-01-03 16:16:54 +00:00
*/
2018-12-30 17:13:48 +00:00
pub fn get_volume(&self) -> Result<u8, Error> {
2018-12-15 15:56:13 +00:00
self.0.get_volume()
}
2018-12-28 15:39:50 +00:00
/**
* Sets the desired speech volume.
2019-01-03 16:16:54 +00:00
*/
2018-12-30 17:13:48 +00:00
pub fn set_volume(&mut self, volume: u8) -> Result<&Self, Error> {
self.0.set_volume(volume)?;
Ok(self)
2018-12-14 19:35:49 +00:00
}
}