mirror of https://github.com/ndarilek/tts-rs.git
Support setting voice with Speech Dispatcher, and clarify features to indicate where getting current voice isn't supported.
This commit is contained in:
parent
142f2e6b3a
commit
51cd84a6cd
|
@ -82,7 +82,8 @@ impl Backend for SpeechDispatcher {
|
||||||
pitch: true,
|
pitch: true,
|
||||||
volume: true,
|
volume: true,
|
||||||
is_speaking: true,
|
is_speaking: true,
|
||||||
voices: false,
|
voice: true,
|
||||||
|
get_voice: false,
|
||||||
utterance_callbacks: true,
|
utterance_callbacks: true,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -201,8 +202,14 @@ impl Backend for SpeechDispatcher {
|
||||||
unimplemented!()
|
unimplemented!()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn set_voice(&mut self, voice: &str) -> Result<(), Error> {
|
fn set_voice(&mut self, voice: &Voice) -> Result<(), Error> {
|
||||||
unimplemented!()
|
for v in self.0.list_synthesis_voices()? {
|
||||||
|
if v.name == voice.name {
|
||||||
|
self.0.set_synthesis_voice(&v)?;
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Err(Error::OperationFailed)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
24
src/lib.rs
24
src/lib.rs
|
@ -166,7 +166,8 @@ pub struct Features {
|
||||||
pub rate: bool,
|
pub rate: bool,
|
||||||
pub stop: bool,
|
pub stop: bool,
|
||||||
pub utterance_callbacks: bool,
|
pub utterance_callbacks: bool,
|
||||||
pub voices: bool,
|
pub voice: bool,
|
||||||
|
pub get_voice: bool,
|
||||||
pub volume: bool,
|
pub volume: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -232,7 +233,7 @@ pub trait Backend: Clone {
|
||||||
fn is_speaking(&self) -> Result<bool, Error>;
|
fn is_speaking(&self) -> Result<bool, Error>;
|
||||||
fn voices(&self) -> Result<Vec<Voice>, Error>;
|
fn voices(&self) -> Result<Vec<Voice>, Error>;
|
||||||
fn voice(&self) -> Result<String, Error>;
|
fn voice(&self) -> Result<String, Error>;
|
||||||
fn set_voice(&mut self, voice: &str) -> Result<(), Error>;
|
fn set_voice(&mut self, voice: &Voice) -> Result<(), Error>;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
|
@ -565,15 +566,20 @@ impl Tts {
|
||||||
* Returns list of available voices.
|
* Returns list of available voices.
|
||||||
*/
|
*/
|
||||||
pub fn voices(&self) -> Result<Vec<Voice>, Error> {
|
pub fn voices(&self) -> Result<Vec<Voice>, Error> {
|
||||||
self.0.read().unwrap().voices()
|
let Features { voice, .. } = self.supported_features();
|
||||||
|
if voice {
|
||||||
|
self.0.read().unwrap().voices()
|
||||||
|
} else {
|
||||||
|
Err(Error::UnsupportedFeature)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return the current speaking voice.
|
* Return the current speaking voice.
|
||||||
*/
|
*/
|
||||||
pub fn voice(&self) -> Result<String, Error> {
|
pub fn voice(&self) -> Result<String, Error> {
|
||||||
let Features { voices, .. } = self.supported_features();
|
let Features { get_voice, .. } = self.supported_features();
|
||||||
if voices {
|
if get_voice {
|
||||||
self.0.read().unwrap().voice()
|
self.0.read().unwrap().voice()
|
||||||
} else {
|
} else {
|
||||||
Err(Error::UnsupportedFeature)
|
Err(Error::UnsupportedFeature)
|
||||||
|
@ -583,13 +589,13 @@ impl Tts {
|
||||||
/**
|
/**
|
||||||
* Set speaking voice.
|
* Set speaking voice.
|
||||||
*/
|
*/
|
||||||
pub fn set_voice<S: Into<String>>(&mut self, voice: S) -> Result<(), Error> {
|
pub fn set_voice(&mut self, voice: &Voice) -> Result<(), Error> {
|
||||||
let Features {
|
let Features {
|
||||||
voices: voices_feature,
|
voice: voice_feature,
|
||||||
..
|
..
|
||||||
} = self.supported_features();
|
} = self.supported_features();
|
||||||
if voices_feature {
|
if voice_feature {
|
||||||
self.0.write().unwrap().set_voice(voice.into().as_str())
|
self.0.write().unwrap().set_voice(voice)
|
||||||
} else {
|
} else {
|
||||||
Err(Error::UnsupportedFeature)
|
Err(Error::UnsupportedFeature)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue