|
| 1 | +use crate::common::ModelError; |
| 2 | +use crate::tts::{Tts, TtsData, TtsError}; |
| 3 | +use async_trait::async_trait; |
| 4 | +use futures::Stream; |
| 5 | +use futures::executor::block_on; |
| 6 | +use std::pin::Pin; |
| 7 | +use std::thread; |
| 8 | +use tokio::sync::mpsc::channel; |
| 9 | +use tokio_stream::StreamExt; |
| 10 | +use tokio_stream::wrappers::ReceiverStream; |
| 11 | +use tracing::{debug, error}; |
| 12 | + |
| 13 | +pub struct TtsMute {} |
| 14 | + |
| 15 | +impl TtsMute { |
| 16 | + pub async fn new() -> Result<Self, anyhow::Error> { |
| 17 | + Ok(Self {}) |
| 18 | + } |
| 19 | +} |
| 20 | + |
| 21 | +#[async_trait] |
| 22 | +impl Tts for TtsMute { |
| 23 | + async fn stream( |
| 24 | + &self, |
| 25 | + mut text_stream: Pin< |
| 26 | + Box<dyn Stream<Item = core::result::Result<String, ModelError>> + Send + Sync>, |
| 27 | + >, |
| 28 | + ) -> Pin<Box<dyn Stream<Item = core::result::Result<TtsData, TtsError>> + Send + Sync>> { |
| 29 | + let (tx, rx) = channel(10); |
| 30 | + thread::spawn(move || { |
| 31 | + block_on(async move { |
| 32 | + while let Some(text) = text_stream.next().await { |
| 33 | + // let instance = instance.clone(); |
| 34 | + let tx = tx.clone(); |
| 35 | + match &text { |
| 36 | + Ok(text) => { |
| 37 | + debug!("[TTS] receive, text = {}", text); |
| 38 | + let data = TtsData { |
| 39 | + audio: None, |
| 40 | + text: text.to_string(), |
| 41 | + }; |
| 42 | + if let Err(e) = tx.send(Ok(data)).await { |
| 43 | + error!("output packet error = {}", e); |
| 44 | + break; |
| 45 | + } else { |
| 46 | + debug!("[TTS] encode and send audio success"); |
| 47 | + } |
| 48 | + } |
| 49 | + Err(e) => { |
| 50 | + error!("tts text stream error = {}", e.to_string()); |
| 51 | + if let Err(e) = tx.send(Err(TtsError::Text(e.to_string()))).await { |
| 52 | + error!("send error failure = {}", e); |
| 53 | + } |
| 54 | + break; |
| 55 | + } |
| 56 | + } |
| 57 | + } |
| 58 | + drop(tx); |
| 59 | + }) |
| 60 | + }); |
| 61 | + Box::pin(ReceiverStream::new(rx)) |
| 62 | + } |
| 63 | +} |
0 commit comments