Skip to main content

aria_kit/synthesis/
speak.rs

1//! Speaking synthesized audio through the default output device.
2
3use super::SpeakerOutput;
4use crate::cancel::CancelToken;
5
6use super::{Engine, SpeakingRate, SpeechText, Synthesis, SynthesisError, Voice, stream};
7
8impl<T: Engine> Synthesis<T> {
9    /// Speaks with the engine's default voice at its natural pace and waits
10    /// until the utterance has been heard.
11    pub fn speak(&self, text: &SpeechText) -> Result<(), SynthesisError> {
12        self.speak_with(text, None, SpeakingRate::standard(), &CancelToken::never())
13    }
14
15    /// Speaks one utterance and waits until it has been heard.
16    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}