aria_kit/synthesis/
speak.rs1use super::SpeakerOutput;
4use crate::cancel::CancelToken;
5
6use super::{Engine, SpeakingRate, SpeechText, Synthesis, SynthesisError, Voice, stream};
7
8impl<T: Engine> Synthesis<T> {
9 pub fn speak(&self, text: &SpeechText) -> Result<(), SynthesisError> {
12 self.speak_with(text, None, SpeakingRate::standard(), &CancelToken::never())
13 }
14
15 pub fn speak_with(
17 &self,
18 text: &SpeechText,
19 voice: Option<&Voice>,
20 rate: SpeakingRate,
21 cancel: &CancelToken,
22 ) -> Result<(), SynthesisError> {
23 if cancel.is_cancelled() {
24 return Err(SynthesisError::Cancelled);
25 }
26
27 if self.engine.plays_audio_itself() {
28 let (writer, speech) = stream(self.engine.sample_rate());
29 let outcome = self
30 .engine
31 .synthesize_with(text, voice, rate, writer, cancel);
32 drop(speech);
33 return outcome;
34 }
35
36 let output = SpeakerOutput::new().map_err(|source| SynthesisError::Playback { source })?;
37 self.start_with(text, voice, rate, cancel)?
38 .play_on(&output, || {})
39 }
40}