Skip to main content

outfox_openai/spec/audio/
form.rs

1use crate::error::OpenAIError;
2use crate::spec::audio::{
3    CreateTranscriptionRequest, CreateTranslationRequest, CreateVoiceConsentRequest,
4    CreateVoiceRequest, TranscriptionChunkingStrategy,
5};
6use crate::traits::AsyncTryFrom;
7use crate::util::create_file_part;
8
9impl AsyncTryFrom<CreateTranscriptionRequest> for reqwest::multipart::Form {
10    type Error = OpenAIError;
11
12    async fn try_from(request: CreateTranscriptionRequest) -> Result<Self, Self::Error> {
13        let audio_part = create_file_part(request.file.source).await?;
14
15        let mut form = reqwest::multipart::Form::new()
16            .part("file", audio_part)
17            .text("model", request.model);
18
19        if let Some(language) = request.language {
20            form = form.text("language", language);
21        }
22
23        if let Some(prompt) = request.prompt {
24            form = form.text("prompt", prompt);
25        }
26
27        if let Some(response_format) = request.response_format {
28            form = form.text("response_format", response_format.to_string())
29        }
30
31        if let Some(temperature) = request.temperature {
32            form = form.text("temperature", temperature.to_string())
33        }
34
35        if let Some(include) = request.include {
36            for inc in include {
37                form = form.text("include[]", inc.to_string());
38            }
39        }
40
41        if let Some(timestamp_granularities) = request.timestamp_granularities {
42            for tg in timestamp_granularities {
43                form = form.text("timestamp_granularities[]", tg.to_string());
44            }
45        }
46
47        if let Some(stream) = request.stream {
48            form = form.text("stream", stream.to_string());
49        }
50
51        if let Some(chunking_strategy) = request.chunking_strategy {
52            match chunking_strategy {
53                TranscriptionChunkingStrategy::Auto => {
54                    form = form.text("chunking_strategy", "auto");
55                }
56                TranscriptionChunkingStrategy::ServerVad(vad_config) => {
57                    form = form.text(
58                        "chunking_strategy",
59                        serde_json::to_string(&vad_config).unwrap().to_string(),
60                    );
61                }
62            }
63        }
64
65        if let Some(known_speaker_names) = request.known_speaker_names {
66            for kn in known_speaker_names {
67                form = form.text("known_speaker_names[]", kn.to_string());
68            }
69        }
70
71        if let Some(known_speaker_references) = request.known_speaker_references {
72            for kn in known_speaker_references {
73                form = form.text("known_speaker_references[]", kn.to_string());
74            }
75        }
76
77        Ok(form)
78    }
79}
80
81impl AsyncTryFrom<CreateTranslationRequest> for reqwest::multipart::Form {
82    type Error = OpenAIError;
83
84    async fn try_from(request: CreateTranslationRequest) -> Result<Self, Self::Error> {
85        let audio_part = create_file_part(request.file.source).await?;
86
87        let mut form = reqwest::multipart::Form::new()
88            .part("file", audio_part)
89            .text("model", request.model);
90
91        if let Some(prompt) = request.prompt {
92            form = form.text("prompt", prompt);
93        }
94
95        if let Some(response_format) = request.response_format {
96            form = form.text("response_format", response_format.to_string())
97        }
98
99        if let Some(temperature) = request.temperature {
100            form = form.text("temperature", temperature.to_string())
101        }
102        Ok(form)
103    }
104}
105
106impl AsyncTryFrom<CreateVoiceConsentRequest> for reqwest::multipart::Form {
107    type Error = OpenAIError;
108
109    async fn try_from(request: CreateVoiceConsentRequest) -> Result<Self, Self::Error> {
110        let recording_part = create_file_part(request.recording.source).await?;
111
112        let form = reqwest::multipart::Form::new()
113            .part("recording", recording_part)
114            .text("name", request.name)
115            .text("language", request.language);
116
117        Ok(form)
118    }
119}
120
121impl AsyncTryFrom<CreateVoiceRequest> for reqwest::multipart::Form {
122    type Error = OpenAIError;
123
124    async fn try_from(request: CreateVoiceRequest) -> Result<Self, Self::Error> {
125        let audio_sample_part = create_file_part(request.audio_sample.source).await?;
126
127        let form = reqwest::multipart::Form::new()
128            .part("audio_sample", audio_sample_part)
129            .text("name", request.name)
130            .text("consent", request.consent);
131
132        Ok(form)
133    }
134}