gproxy_protocol/protocol/openai/audio/
requests.rs1use std::collections::BTreeMap;
2
3use serde::{Deserialize, Serialize};
4
5use super::super::common::{Extra, OpenAiModelId};
6use super::{
7 SpeechResponseFormat, SpeechStreamFormat, TimestampGranularity, TranscriptionInclude,
8 TranscriptionResponseFormat, TranslationResponseFormat,
9};
10use crate::protocol::openai::VoiceRef;
11
12#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
13#[non_exhaustive]
14pub struct SpeechRequest {
15 pub input: String,
16 pub model: OpenAiModelId,
17 pub voice: VoiceRef,
18 #[serde(skip_serializing_if = "Option::is_none")]
19 pub instructions: Option<String>,
20 #[serde(skip_serializing_if = "Option::is_none")]
21 pub response_format: Option<SpeechResponseFormat>,
22 #[serde(skip_serializing_if = "Option::is_none")]
23 pub speed: Option<f64>,
24 #[serde(skip_serializing_if = "Option::is_none")]
25 pub stream_format: Option<SpeechStreamFormat>,
26 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
27 pub extra: Extra,
28}
29
30#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
31#[non_exhaustive]
32pub struct TranscriptionRequest {
33 pub file: String,
36 pub model: OpenAiModelId,
37 #[serde(skip_serializing_if = "Option::is_none")]
38 pub chunking_strategy: Option<AudioChunkingStrategy>,
39 #[serde(skip_serializing_if = "Option::is_none")]
40 pub include: Option<Vec<TranscriptionInclude>>,
41 #[serde(skip_serializing_if = "Option::is_none")]
42 pub keywords: Option<Vec<String>>,
43 #[serde(skip_serializing_if = "Option::is_none")]
44 pub known_speaker_names: Option<Vec<String>>,
45 #[serde(skip_serializing_if = "Option::is_none")]
46 pub known_speaker_references: Option<Vec<String>>,
47 #[serde(skip_serializing_if = "Option::is_none")]
48 pub language: Option<String>,
49 #[serde(skip_serializing_if = "Option::is_none")]
50 pub languages: Option<Vec<String>>,
51 #[serde(skip_serializing_if = "Option::is_none")]
52 pub prompt: Option<String>,
53 #[serde(skip_serializing_if = "Option::is_none")]
54 pub response_format: Option<TranscriptionResponseFormat>,
55 #[serde(skip_serializing_if = "Option::is_none")]
56 pub stream: Option<bool>,
57 #[serde(skip_serializing_if = "Option::is_none")]
58 pub temperature: Option<f64>,
59 #[serde(skip_serializing_if = "Option::is_none")]
60 pub timestamp_granularities: Option<Vec<TimestampGranularity>>,
61 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
62 pub extra: Extra,
63}
64
65#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
66#[serde(untagged)]
67#[non_exhaustive]
68pub enum AudioChunkingStrategy {
69 Auto(AudioChunkingAuto),
70 ServerVad(ServerVadConfig),
71}
72
73#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
74#[non_exhaustive]
75pub enum AudioChunkingAuto {
76 #[serde(rename = "auto")]
77 Auto,
78}
79
80#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
81#[non_exhaustive]
82pub struct ServerVadConfig {
83 #[serde(rename = "type")]
84 pub type_: ServerVadType,
85 #[serde(skip_serializing_if = "Option::is_none")]
86 pub prefix_padding_ms: Option<u32>,
87 #[serde(skip_serializing_if = "Option::is_none")]
88 pub silence_duration_ms: Option<u32>,
89 #[serde(skip_serializing_if = "Option::is_none")]
90 pub threshold: Option<f64>,
91 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
92 pub extra: Extra,
93}
94
95#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
96#[non_exhaustive]
97pub enum ServerVadType {
98 #[serde(rename = "server_vad")]
99 ServerVad,
100}
101
102#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
103#[non_exhaustive]
104pub struct TranslationRequest {
105 pub file: String,
106 pub model: OpenAiModelId,
107 #[serde(skip_serializing_if = "Option::is_none")]
108 pub prompt: Option<String>,
109 #[serde(skip_serializing_if = "Option::is_none")]
110 pub response_format: Option<TranslationResponseFormat>,
111 #[serde(skip_serializing_if = "Option::is_none")]
112 pub temperature: Option<f64>,
113 #[serde(default, flatten, skip_serializing_if = "BTreeMap::is_empty")]
114 pub extra: Extra,
115}