Skip to main content

gproxy_protocol/openai/realtime/
audio.rs

1use serde::{Deserialize, Serialize};
2use serde_json::Value;
3
4use crate::openai::common::Rest;
5
6#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
7#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
8pub struct RealtimeAudio {
9    #[serde(skip_serializing_if = "Option::is_none")]
10    pub input: Option<RealtimeAudioInput>,
11    #[serde(skip_serializing_if = "Option::is_none")]
12    pub output: Option<RealtimeAudioOutput>,
13    #[serde(default, flatten)]
14    pub rest: Rest,
15}
16
17pub type RealtimeAudioConfig = RealtimeAudio;
18
19#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
20#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
21pub struct RealtimeAudioInput {
22    #[serde(skip_serializing_if = "Option::is_none")]
23    pub format: Option<RealtimeAudioFormat>,
24    #[serde(skip_serializing_if = "Option::is_none")]
25    pub noise_reduction: Option<RealtimeNoiseReduction>,
26    #[serde(skip_serializing_if = "Option::is_none")]
27    pub transcription: Option<RealtimeTranscription>,
28    #[serde(skip_serializing_if = "Option::is_none")]
29    pub turn_detection: Option<RealtimeTurnDetectionSetting>,
30    #[serde(default, flatten)]
31    pub rest: Rest,
32}
33
34pub type RealtimeAudioInputConfig = RealtimeAudioInput;
35
36#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
37#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
38pub struct RealtimeAudioOutput {
39    #[serde(skip_serializing_if = "Option::is_none")]
40    pub format: Option<RealtimeAudioFormat>,
41    #[serde(skip_serializing_if = "Option::is_none")]
42    pub voice: Option<String>,
43    #[serde(skip_serializing_if = "Option::is_none")]
44    pub speed: Option<f64>,
45    #[serde(default, flatten)]
46    pub rest: Rest,
47}
48
49pub type RealtimeAudioOutputConfig = RealtimeAudioOutput;
50
51#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
52#[serde(untagged)]
53#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
54pub enum RealtimeAudioFormat {
55    Pcm(RealtimePcmFormat),
56    Pcmu(RealtimePcmuFormat),
57    Pcma(RealtimePcmaFormat),
58    Raw(Value),
59}
60
61#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
62#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
63pub struct RealtimePcmFormat {
64    #[serde(rename = "type")]
65    pub type_: RealtimePcmFormatType,
66    #[serde(skip_serializing_if = "Option::is_none")]
67    pub rate: Option<u32>,
68    #[serde(default, flatten)]
69    pub rest: Rest,
70}
71
72#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
73#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
74pub enum RealtimePcmFormatType {
75    #[serde(rename = "audio/pcm")]
76    Pcm,
77}
78
79#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
80#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
81pub struct RealtimePcmuFormat {
82    #[serde(rename = "type")]
83    pub type_: RealtimePcmuFormatType,
84    #[serde(default, flatten)]
85    pub rest: Rest,
86}
87
88#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
89#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
90pub enum RealtimePcmuFormatType {
91    #[serde(rename = "audio/pcmu")]
92    Pcmu,
93}
94
95#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
96#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
97pub struct RealtimePcmaFormat {
98    #[serde(rename = "type")]
99    pub type_: RealtimePcmaFormatType,
100    #[serde(default, flatten)]
101    pub rest: Rest,
102}
103
104#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
105#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
106pub enum RealtimePcmaFormatType {
107    #[serde(rename = "audio/pcma")]
108    Pcma,
109}
110
111#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
112#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
113pub struct RealtimeNoiseReduction {
114    #[serde(rename = "type", skip_serializing_if = "Option::is_none")]
115    pub type_: Option<RealtimeNoiseReductionType>,
116    #[serde(default, flatten)]
117    pub rest: Rest,
118}
119
120pub type NoiseReduction = RealtimeNoiseReduction;
121
122#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
123#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
124pub struct RealtimeTranscription {
125    #[serde(skip_serializing_if = "Option::is_none")]
126    pub model: Option<String>,
127    #[serde(skip_serializing_if = "Option::is_none")]
128    pub language: Option<String>,
129    #[serde(skip_serializing_if = "Option::is_none")]
130    pub prompt: Option<String>,
131    #[serde(default, flatten)]
132    pub rest: Rest,
133}
134
135pub type RealtimeTranscriptionConfig = RealtimeTranscription;
136
137#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
138#[serde(untagged)]
139#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
140pub enum RealtimeTurnDetectionSetting {
141    Disabled(()),
142    Vad(RealtimeTurnDetection),
143    Raw(Value),
144}
145
146#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
147#[serde(untagged)]
148#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
149pub enum RealtimeTurnDetection {
150    Server(RealtimeServerVad),
151    Semantic(RealtimeSemanticVad),
152    Raw(Value),
153}
154
155#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
156#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
157pub struct RealtimeServerVad {
158    #[serde(rename = "type")]
159    pub type_: RealtimeServerVadType,
160    #[serde(skip_serializing_if = "Option::is_none")]
161    pub threshold: Option<f64>,
162    #[serde(skip_serializing_if = "Option::is_none")]
163    pub prefix_padding_ms: Option<u32>,
164    #[serde(skip_serializing_if = "Option::is_none")]
165    pub silence_duration_ms: Option<u32>,
166    #[serde(skip_serializing_if = "Option::is_none")]
167    pub idle_timeout_ms: Option<u32>,
168    #[serde(skip_serializing_if = "Option::is_none")]
169    pub create_response: Option<bool>,
170    #[serde(skip_serializing_if = "Option::is_none")]
171    pub interrupt_response: Option<bool>,
172    #[serde(default, flatten)]
173    pub rest: Rest,
174}
175
176#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
177#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
178pub enum RealtimeServerVadType {
179    #[serde(rename = "server_vad")]
180    ServerVad,
181}
182
183#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
184#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
185pub struct RealtimeSemanticVad {
186    #[serde(rename = "type")]
187    pub type_: RealtimeSemanticVadType,
188    #[serde(skip_serializing_if = "Option::is_none")]
189    pub eagerness: Option<RealtimeVadEagerness>,
190    #[serde(skip_serializing_if = "Option::is_none")]
191    pub create_response: Option<bool>,
192    #[serde(skip_serializing_if = "Option::is_none")]
193    pub interrupt_response: Option<bool>,
194    #[serde(default, flatten)]
195    pub rest: Rest,
196}
197
198#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
199#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
200pub enum RealtimeSemanticVadType {
201    #[serde(rename = "semantic_vad")]
202    SemanticVad,
203}
204
205extensible_string!(RealtimeNoiseReductionType, KnownRealtimeNoiseReductionType {
206    NearField => "near_field", FarField => "far_field",
207});
208extensible_string!(RealtimeVadEagerness, KnownRealtimeVadEagerness {
209    Low => "low", Medium => "medium", High => "high", Auto => "auto",
210});