elevenlabs_api/apis/
tts.rs1use crate::{ApiResult, Elevenlabs};
7use serde::{Deserialize, Serialize};
8
9use super::{requests::Requests, TEXT_TO_SPEECH};
10
11#[derive(Debug, Serialize, Deserialize)]
12pub struct TtsBody {
13 #[serde(skip_serializing_if = "Option::is_none")]
16 pub model_id: Option<String>,
17 pub text: String,
19 #[serde(skip_serializing_if = "Option::is_none")]
23 pub voice_settings: Option<VoiceSettings>,
24}
25
26#[derive(Debug, Serialize, Deserialize)]
27pub struct VoiceSettings {
28 pub stability: f32,
30 pub similarity_boost: f32,
32}
33
34pub trait TtsApi {
35 fn tts(&self, voice_settings: &TtsBody, voice_id: impl AsRef<str>) -> ApiResult<Vec<u8>>;
37}
38
39impl TtsApi for Elevenlabs {
40 fn tts(&self, tts_body: &TtsBody, voice_id: impl AsRef<str>) -> ApiResult<Vec<u8>> {
41 let request_body = serde_json::to_value(tts_body).unwrap();
42 self.post(
43 format!("{}/{}", TEXT_TO_SPEECH, voice_id.as_ref()).as_str(),
44 request_body,
45 )
46 }
47}
48
49#[cfg(test)]
50mod tests {
51 use crate::tts::*;
52 use crate::*;
53
54 #[test]
55 fn test_tts() {
56 let auth = Auth::from_env().unwrap();
57 let elevenlabs = Elevenlabs::new(auth, "https://api.elevenlabs.io/v1/");
58
59 let tts_body = TtsBody {
60 model_id: None,
61 text: "Hello world".to_string(),
62 voice_settings: None,
63 };
64
65 let tts_result = elevenlabs.tts(&tts_body, "yoZ06aMxZJJ28mfd3POQ");
66 let bytes = tts_result.unwrap();
67 assert!(bytes.len() > 0);
68 }
69}