Skip to main content

async_openai/types/realtime/
session.rs

1use serde::{Deserialize, Serialize};
2
3use crate::types::{
4    mcp::MCPTool,
5    responses::{Prompt, ToolChoiceFunction, ToolChoiceMCP, ToolChoiceOptions},
6};
7
8/// Controls how long the model waits before emitting transcription text.
9#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
10#[serde(rename_all = "lowercase")]
11pub enum AudioTranscriptionDelay {
12    Minimal,
13    Low,
14    Medium,
15    High,
16    #[serde(rename = "xhigh")]
17    XHigh,
18}
19
20#[derive(Debug, Default, Serialize, Deserialize, Clone)]
21pub struct AudioTranscription {
22    /// The language of the input audio. Supplying the input language in
23    /// [ISO-639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) (e.g. `en`) format will improve accuracy and latency.
24    #[serde(skip_serializing_if = "Option::is_none")]
25    pub language: Option<String>,
26    /// The model to use for transcription. Current options are `whisper-1`, `gpt-transcribe`, `gpt-live-
27    /// transcribe`, `gpt-4o-mini-transcribe`, `gpt-4o-mini-transcribe-2025-12-15`, `gpt-4o-transcribe`,
28    /// `gpt-4o-transcribe-diarize`, and `gpt-realtime-whisper`. Use `gpt-4o-transcribe-diarize` when you
29    /// need diarization with speaker labels.
30    #[serde(skip_serializing_if = "Option::is_none")]
31    pub model: Option<String>,
32    /// An optional text to guide the model's style or continue a previous audio segment.
33    /// For `whisper-1`, the [prompt is a list of keywords](https://platform.openai.com/docs/guides/speech-to-text#prompting). For `gpt-4o-transcribe` models
34    /// (excluding gpt-4o-transcribe-diarize), the prompt is a free text string, for example
35    /// "expect words related to technology".
36    /// Prompt is not supported with `gpt-realtime-whisper` in GA Realtime sessions.
37    #[serde(skip_serializing_if = "Option::is_none")]
38    pub prompt: Option<String>,
39    /// Controls how long the model waits before emitting transcription text.
40    /// Higher values can improve transcription accuracy at the cost of latency.
41    /// Only supported with `gpt-realtime-whisper` in GA Realtime sessions.
42    #[serde(skip_serializing_if = "Option::is_none")]
43    pub delay: Option<AudioTranscriptionDelay>,
44    /// Possible languages of the input audio, in
45    /// [ISO-639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) format. Supported by `gpt-
46    /// transcribe` and `gpt-live-transcribe`.
47    #[serde(skip_serializing_if = "Option::is_none")]
48    pub languages: Option<Vec<String>>,
49
50    /// Words or phrases to guide transcription of the input audio. Supported by `gpt-transcribe` and `gpt-
51    /// live-transcribe`.
52    #[serde(skip_serializing_if = "Option::is_none")]
53    pub keywords: Option<Vec<String>>,
54}
55
56/// Configuration of the transcription model returned by the server.
57#[derive(Debug, Default, Serialize, Deserialize, Clone)]
58pub struct AudioTranscriptionResponse {
59    /// The language of the input audio.
60    #[serde(skip_serializing_if = "Option::is_none")]
61    pub language: Option<String>,
62    /// The model used for transcription. Current options are `whisper-1`, `gpt-transcribe`, `gpt-live-
63    /// transcribe`, `gpt-4o-mini-transcribe`, `gpt-4o-mini-transcribe-2025-12-15`, `gpt-4o-transcribe`,
64    /// `gpt-4o-transcribe-diarize`, and `gpt-realtime-whisper`.
65    #[serde(skip_serializing_if = "Option::is_none")]
66    pub model: Option<String>,
67    /// The prompt configured for input audio transcription, when present.
68    #[serde(skip_serializing_if = "Option::is_none")]
69    pub prompt: Option<String>,
70    /// The possible input audio languages configured for transcription, in
71    /// [ISO-639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) format.
72    #[serde(skip_serializing_if = "Option::is_none")]
73    pub languages: Option<Vec<String>>,
74    /// Words or phrases configured to guide transcription of the input audio.
75    #[serde(skip_serializing_if = "Option::is_none")]
76    pub keywords: Option<Vec<String>>,
77}
78
79#[derive(Debug, Serialize, Deserialize, Clone)]
80#[serde(tag = "type")]
81pub enum RealtimeTurnDetection {
82    /// Server-side voice activity detection (VAD) which flips on when user speech is detected
83    /// and off after a period of silence.
84    #[serde(rename = "server_vad")]
85    ServerVAD {
86        /// Whether or not to automatically generate a response when a VAD stop event occurs. If
87        /// `interrupt_response` is set to `false` this may fail to create a response if the model is
88        /// already responding.
89        ///
90        /// If both `create_response` and `interrupt_response` are set to `false`, the model will
91        /// never respond automatically but VAD events will still be emitted.
92        #[serde(skip_serializing_if = "Option::is_none")]
93        create_response: Option<bool>,
94
95        /// Optional timeout after which a model response will be triggered automatically.
96        /// This is useful for situations in which a long pause from the user is unexpected,
97        /// such as a phone call. The model will effectively prompt the user to continue the
98        /// conversation based on the current context.
99        ///
100        /// The timeout value will be applied after the last model response's audio has finished
101        /// playing, i.e. it's set to the response.done time plus audio playback duration.
102        ///
103        /// An input_audio_buffer.timeout_triggered event (plus events associated with the Response)
104        ///  will be emitted when the timeout is reached. Idle timeout is currently only supported
105        /// for server_vad mode.
106        #[serde(skip_serializing_if = "Option::is_none")]
107        idle_timeout_ms: Option<u32>,
108
109        /// Whether or not to automatically interrupt (cancel) any ongoing response with output to the
110        /// default conversation (i.e. `conversation` of `auto`) when a VAD start event occurs. If `true` then
111        /// the response will be cancelled, otherwise it will continue until complete.
112        ///
113        /// If both `create_response` and `interrupt_response` are set to `false`, the model will
114        /// never respond automatically but VAD events will still be emitted.
115        #[serde(skip_serializing_if = "Option::is_none")]
116        interrupt_response: Option<bool>,
117
118        /// Used only for server_vad mode. Amount of audio to include before the VAD detected speech
119        /// (in milliseconds). Defaults to 300ms.
120        prefix_padding_ms: u32,
121        /// Used only for server_vad mode. Duration of silence to detect speech stop
122        /// (in milliseconds). Defaults to 500ms. With shorter values the model will respond
123        ///  more quickly, but may jump in on short pauses from the user.
124        silence_duration_ms: u32,
125
126        /// Used only for server_vad mode. Activation threshold for VAD (0.0 to 1.0),
127        /// this defaults to 0.5. A higher threshold will require louder audio to activate
128        /// the model, and thus might perform better in noisy environments.
129        threshold: f32,
130    },
131
132    /// Server-side semantic turn detection which uses a model to determine when the user has
133    ///  finished speaking.
134    #[serde(rename = "semantic_vad")]
135    SemanticVAD {
136        /// Whether or not to automatically generate a response when a VAD stop event occurs.
137        #[serde(skip_serializing_if = "Option::is_none", default)]
138        create_response: Option<bool>,
139
140        /// Used only for `semantic_vad` mode. The eagerness of the model to respond.
141        /// `low` will wait longer for the user to continue speaking, `high` will respond more
142        /// quickly. `auto` is the default and is equivalent to `medium`. `low`, `medium`, and `high`
143        /// have max timeouts of 8s, 4s, and 2s respectively.
144        eagerness: String,
145
146        /// Whether or not to automatically interrupt any ongoing response with output to
147        /// the default conversation (i.e. `conversation` of `auto`) when a VAD start event occurs.
148        #[serde(skip_serializing_if = "Option::is_none", default)]
149        interrupt_response: Option<bool>,
150    },
151}
152
153#[derive(Debug, Serialize, Deserialize, Clone)]
154pub enum MaxOutputTokens {
155    #[serde(rename = "inf")]
156    Inf,
157    #[serde(untagged)]
158    Num(u16),
159}
160
161#[derive(Debug, Serialize, Deserialize, Clone, Default)]
162pub struct RealtimeFunctionTool {
163    /// The name of the function.
164    pub name: String,
165    /// The description of the function, including guidance on when and how to call it,
166    /// and guidance about what to tell the user when calling (if anything).
167    pub description: String,
168    /// Parameters of the function in JSON Schema.
169    pub parameters: serde_json::Value,
170}
171
172#[derive(Debug, Serialize, Deserialize, Clone)]
173#[serde(tag = "type")]
174pub enum RealtimeTool {
175    #[serde(rename = "function")]
176    Function(RealtimeFunctionTool),
177    /// Give the model access to additional tools via remote Model Context Protocol (MCP) servers.
178    /// [Learn more about MCP](https://platform.openai.com/docs/guides/tools-remote-mcp).
179    #[serde(rename = "mcp")]
180    MCP(MCPTool),
181}
182
183#[derive(Debug, Serialize, Deserialize, Clone)]
184#[serde(rename_all = "lowercase")]
185pub enum FunctionType {
186    Function,
187}
188
189#[derive(Debug, Serialize, Deserialize, Clone)]
190#[serde(tag = "type", rename_all = "snake_case")]
191pub enum ToolChoice {
192    /// Use this option to force the model to call a specific function.
193    Function(ToolChoiceFunction),
194    /// Use this option to force the model to call a specific tool on a remote MCP server.
195    Mcp(ToolChoiceMCP),
196
197    #[serde(untagged)]
198    Mode(ToolChoiceOptions),
199}
200
201#[derive(Debug, Serialize, Deserialize, Clone)]
202#[serde(rename_all = "lowercase")]
203pub enum RealtimeVoice {
204    Alloy,
205    Ash,
206    Ballad,
207    Coral,
208    Echo,
209    Sage,
210    Shimmer,
211    Verse,
212    Marin,
213    Cedar,
214    #[serde(untagged)]
215    Other(String),
216}
217
218#[derive(Debug, Serialize, Deserialize, Clone)]
219#[serde(tag = "type")]
220pub enum RealtimeAudioFormats {
221    /// The PCM audio format. Only a 24kHz sample rate is supported.
222    #[serde(rename = "audio/pcm")]
223    PCMAudioFormat {
224        /// The sample rate of the audio. Always 24000.
225        rate: u32,
226    },
227    /// The G.711 μ-law format.
228    #[serde(rename = "audio/pcmu")]
229    PCMUAudioFormat,
230    /// The G.711 A-law format.
231    #[serde(rename = "audio/pcma")]
232    PCMAAudioFormat,
233}
234
235#[derive(Debug, Serialize, Deserialize, Clone, Default)]
236pub struct G711ULAWAudioFormat {
237    pub sample_rate: u32,
238    pub channels: u32,
239}
240
241#[derive(Debug, Serialize, Deserialize, Clone)]
242pub struct AudioInput {
243    /// The format of the input audio.
244    pub format: RealtimeAudioFormats,
245    /// Configuration for input audio noise reduction. This can be set to null to turn off.
246    /// Noise reduction filters audio added to the input audio buffer before it is sent to VAD
247    /// and the model. Filtering the audio can improve VAD and turn detection accuracy
248    /// (reducing false positives) and model performance by improving perception of the
249    /// input audio.
250    pub noise_reduction: Option<RealtimeNoiseReduction>,
251    /// Configuration for input audio transcription, defaults to off and can be set to `null` to turn off once on.
252    /// Input audio transcription is not native to the model, since the model consumes audio directly.
253    /// Transcription runs asynchronously through [the /audio/transcriptions endpoint](https://platform.openai.com/docs/api-reference/audio/createTranscription)
254    /// and should be treated as guidance of input audio content rather than precisely what the model
255    /// heard. The client can optionally set the language and prompt for transcription,
256    /// these offer additional guidance to the transcription service.
257    pub transcription: Option<AudioTranscription>,
258
259    /// Configuration for turn detection, ether Server VAD or Semantic VAD. This can
260    /// be set to null to turn off, in which case the client must manually trigger model response.
261    ///
262    ///  Server VAD means that the model will detect the start and end of speech
263    /// based on audio volume and respond at the end of user speech.
264    ///
265    /// Semantic VAD is more advanced and uses a turn detection model (in conjunction with VAD)
266    /// to semantically estimate whether the user has finished speaking, then dynamically sets
267    /// a timeout based on this probability. For example, if user audio trails off with "uhhm",
268    /// the model will score a low probability of turn end and wait longer for the user to
269    /// continue speaking. This can be useful for more natural conversations, but may have a
270    /// higher latency.    
271    pub turn_detection: Option<RealtimeTurnDetection>,
272}
273
274#[derive(Debug, Serialize, Deserialize, Clone)]
275pub struct AudioOutput {
276    /// The format of the output audio.
277    pub format: RealtimeAudioFormats,
278    /// The speed of the model's spoken response as a multiple of the original speed.
279    /// 1.0 is the default speed. 0.25 is the minimum speed. 1.5 is the maximum speed.
280    /// This value can only be changed in between model turns, not while a response
281    /// is in progress.
282    ///
283    /// This parameter is a post-processing adjustment to the audio after it is generated,
284    /// it's also possible to prompt the model to speak faster or slower.
285    pub speed: f32,
286    /// The voice the model uses to respond. Supported built-in voices are `alloy`, `ash`, `ballad`,
287    /// `coral`, `echo`, `sage`, `shimmer`, `verse`, `marin`, and `cedar`. Voice cannot be changed during
288    /// the session once the model has responded with audio at least once. We recommend `marin` and `cedar`
289    /// for best quality.
290    pub voice: RealtimeVoice,
291}
292
293#[derive(Debug, Serialize, Deserialize, Clone)]
294pub struct Audio {
295    pub input: AudioInput,
296    pub output: AudioOutput,
297}
298
299#[derive(Debug, Serialize, Deserialize, Clone)]
300#[serde(rename_all = "lowercase")]
301pub enum Tracing {
302    /// Enables tracing and sets default values for tracing configuration options. Always `auto`.
303    Auto,
304
305    #[serde(untagged)]
306    Configuration(TracingConfiguration),
307}
308
309#[derive(Debug, Serialize, Deserialize, Clone, Default)]
310pub struct TracingConfiguration {
311    /// The group id to attach to this trace to enable filtering and grouping in the Traces Dashboard.
312    pub group_id: String,
313    /// The arbitrary metadata to attach to this trace to enable filtering in the Traces Dashboard.
314    pub metadata: serde_json::Value,
315    /// The name of the workflow to attach to this trace. This is used to name the trace in the Traces Dashboard.
316    pub workflow_name: String,
317}
318
319/// The truncation strategy to use for the session.
320#[derive(Debug, Serialize, Deserialize, Clone)]
321#[serde(rename_all = "lowercase")]
322pub enum RealtimeTruncation {
323    /// `auto` is the default truncation strategy.
324    Auto,
325    /// `disabled` will disable truncation and emit errors when the conversation exceeds the input
326    /// token limit.
327    Disabled,
328
329    /// Retain a fraction of the conversation tokens when the conversation exceeds the input token
330    /// limit. This allows you to amortize truncations across multiple turns, which can help improve
331    /// cached token usage.
332    #[serde(untagged)]
333    RetentionRatio(RetentionRatioTruncation),
334}
335
336#[derive(Debug, Serialize, Deserialize, Clone, Default)]
337pub struct RetentionRatioTruncation {
338    /// Fraction of post-instruction conversation tokens to retain (0.0 - 1.0) when the conversation
339    ///  exceeds the input token limit. Setting this to 0.8 means that messages will be dropped
340    /// until 80% of the maximum allowed tokens are used. This helps reduce the frequency of
341    /// truncations and improve cache rates.
342    pub retention_ratio: f32,
343
344    /// Use retention ratio truncation.
345    pub r#type: String,
346
347    /// Optional custom token limits for this truncation strategy. If not provided, the model's
348    ///  default token limits will be used.
349    #[serde(skip_serializing_if = "Option::is_none")]
350    pub token_limits: Option<TokenLimits>,
351}
352
353#[derive(Debug, Serialize, Deserialize, Clone, Default)]
354pub struct TokenLimits {
355    /// Maximum tokens allowed in the conversation after instructions (which including tool
356    /// definitions). For example, setting this to 5,000 would mean that truncation would occur
357    /// when the conversation exceeds 5,000 tokens after instructions. This cannot be higher
358    /// than the model's context window size minus the maximum output tokens.
359    pub post_instructions: u32,
360}
361
362#[derive(Debug, Serialize, Deserialize, Clone)]
363#[serde(tag = "type")]
364pub enum Session {
365    // Boxed as per clippy suggestion:
366    // https://rust-lang.github.io/rust -clippy/rust-1.91.0/index.html#large_enum_variant
367    // the largest variant contains at least 600 bytes, the second-largest variant contains at least 144 bytes
368    /// The type of session to create. Always `realtime` for the Realtime API.
369    #[serde(rename = "realtime")]
370    RealtimeSession(Box<RealtimeSession>),
371    /// The type of session to create. Always `transcription` for transcription sessions.
372    #[serde(rename = "transcription")]
373    RealtimeTranscriptionSession(Box<RealtimeTranscriptionSession>),
374}
375
376#[derive(Debug, Serialize, Deserialize, Clone)]
377#[serde(tag = "type")]
378pub enum RealtimeSessionConfiguration {
379    Realtime(RealtimeSession),
380}
381
382impl Default for RealtimeSessionConfiguration {
383    fn default() -> Self {
384        Self::Realtime(RealtimeSession::default())
385    }
386}
387
388/// Constrains effort on reasoning for reasoning-capable Realtime models such as `gpt-realtime-2`.
389#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq, Default)]
390#[serde(rename_all = "lowercase")]
391pub enum RealtimeReasoningEffort {
392    Minimal,
393    #[default]
394    Low,
395    Medium,
396    High,
397    #[serde(rename = "xhigh")]
398    XHigh,
399}
400
401/// Configuration for reasoning-capable Realtime models such as `gpt-realtime-2`.
402#[derive(Debug, Default, Serialize, Deserialize, Clone)]
403pub struct RealtimeReasoning {
404    #[serde(skip_serializing_if = "Option::is_none")]
405    pub effort: Option<RealtimeReasoningEffort>,
406}
407
408/// Realtime session object configuration.
409/// openapi spec type: RealtimeSessionCreateRequestGA
410#[derive(Debug, Serialize, Deserialize, Clone, Default)]
411pub struct RealtimeSession {
412    #[serde(skip_serializing_if = "Option::is_none")]
413    pub id: Option<String>,
414    #[serde(skip_serializing_if = "Option::is_none")]
415    pub expires_at: Option<u64>,
416    #[serde(skip_serializing_if = "Option::is_none")]
417    pub audio: Option<Audio>,
418
419    /// Additional fields to include in server outputs.
420    ///
421    /// `item.input_audio_transcription.logprobs`: Include logprobs for input audio transcription.
422    #[serde(skip_serializing_if = "Option::is_none")]
423    pub include: Option<Vec<String>>,
424
425    /// The default system instructions (i.e. system message) prepended to model calls.
426    /// This field allows the client to guide the model on desired responses.
427    /// The model can be instructed on response content and format,
428    /// (e.g. "be extremely succinct", "act friendly", "here are examples of good responses")
429    /// and on audio behavior (e.g. "talk quickly", "inject emotion into your voice",
430    /// "laugh frequently"). The instructions are not guaranteed to be followed by the model, but
431    /// they provide guidance to the model on the desired behavior.
432    ///
433    /// Note that the server sets default instructions which will be used if this field is not set
434    /// and are visible in the `session.created` event at the start of the session.
435    #[serde(skip_serializing_if = "Option::is_none")]
436    pub instructions: Option<String>,
437
438    /// Maximum number of output tokens for a single assistant response,
439    /// inclusive of tool calls. Provide an integer between 1 and 4096 to limit output tokens,
440    /// or `inf` for the maximum available tokens for a given model. Defaults to `inf`.
441    #[serde(skip_serializing_if = "Option::is_none")]
442    pub max_output_tokens: Option<MaxOutputTokens>,
443
444    /// The Realtime model used for this session.
445    #[serde(skip_serializing_if = "Option::is_none")]
446    pub model: Option<String>,
447
448    /// The set of modalities the model can respond with. It defaults to
449    /// `["audio"]`, indicating that the model will respond with audio plus a transcript. `["text"]`
450    /// can be used to make the model respond with text only. It is not possible to request both
451    /// `text` and `audio` at the same time.
452    #[serde(skip_serializing_if = "Option::is_none")]
453    pub output_modalities: Option<Vec<String>>,
454
455    /// Reference to a prompt template and its variables.
456    /// [Learn more](https://platform.openai.com/docs/guides/text?api-mode=responses#reusable-prompts).
457    #[serde(skip_serializing_if = "Option::is_none")]
458    pub prompt: Option<Prompt>,
459
460    /// How the model chooses tools. Provide one of the string modes or force a specific
461    /// function/MCP tool.
462    #[serde(skip_serializing_if = "Option::is_none")]
463    pub tool_choice: Option<ToolChoice>,
464
465    /// Tools available to the model.
466    #[serde(skip_serializing_if = "Option::is_none")]
467    pub tools: Option<Vec<RealtimeTool>>,
468
469    /// Realtime API can write session traces to the [Traces Dashboard](https://platform.openai.com/logs?api=traces).
470    /// Set to null to disable tracing. Once tracing is enabled for a session, the configuration cannot be modified.
471    ///
472    /// `auto` will create a trace for the session with default values for the workflow name,
473    ///  group id, and metadata.
474    #[serde(skip_serializing_if = "Option::is_none")]
475    pub tracing: Option<Tracing>,
476
477    /// When the number of tokens in a conversation exceeds the model's input token limit,
478    /// the conversation be truncated, meaning messages (starting from the oldest) will not be
479    /// included in the model's context. A 32k context model with 4,096 max output tokens can
480    /// only include 28,224 tokens in the context before truncation occurs. Clients can configure
481    /// truncation behavior to truncate with a lower max token limit, which is an effective way to
482    /// control token usage and cost. Truncation will reduce the number of cached tokens on the next
483    ///  turn (busting the cache), since messages are dropped from the beginning of the context.
484    /// However, clients can also configure truncation to retain messages up to a fraction of the
485    /// maximum context size, which will reduce the need for future truncations and thus improve
486    /// the cache rate. Truncation can be disabled entirely, which means the server will never
487    /// truncate but would instead return an error if the conversation exceeds the model's input
488    /// token limit.
489    #[serde(skip_serializing_if = "Option::is_none")]
490    pub truncation: Option<RealtimeTruncation>,
491
492    /// Whether the model may call multiple tools in parallel.
493    #[serde(skip_serializing_if = "Option::is_none")]
494    pub parallel_tool_calls: Option<bool>,
495
496    /// Configuration for reasoning-capable Realtime models such as `gpt-realtime-2`.
497    #[serde(skip_serializing_if = "Option::is_none")]
498    pub reasoning: Option<RealtimeReasoning>,
499}
500
501/// Type of noise reduction. `near_field` is for close-talking microphones such as
502/// headphones, `far_field` is for far-field microphones such as laptop or conference
503/// room microphones.
504#[derive(Debug, Serialize, Deserialize, Clone)]
505#[serde(tag = "type", rename_all = "snake_case")]
506pub enum NoiseReductionType {
507    NearField,
508    FarField,
509}
510
511#[derive(Debug, Serialize, Deserialize, Clone)]
512pub struct TranscriptionAudio {
513    pub input: AudioInput,
514}
515
516/// Realtime transcription session object configuration.
517/// openapi spec type: RealtimeTranscriptionSessionCreateRequestGA
518#[derive(Debug, Serialize, Deserialize, Clone)]
519pub struct RealtimeTranscriptionSession {
520    #[serde(skip_serializing_if = "Option::is_none")]
521    pub id: Option<String>,
522    #[serde(skip_serializing_if = "Option::is_none")]
523    pub expires_at: Option<u64>,
524    /// Configuration for input and output audio.
525    pub audio: TranscriptionAudio,
526
527    /// Additional fields to include in server outputs.
528    ///
529    /// `item.input_audio_transcription.logprobs`: Include logprobs for input audio transcription.
530    #[serde(skip_serializing_if = "Option::is_none")]
531    pub include: Option<Vec<String>>,
532}
533
534/// Input noise suppression strength. Higher values apply more suppression.
535/// Defaults to 1 when noise reduction is first enabled. Omitting strength
536/// from a session update preserves the current strength.
537pub type RealtimeNoiseReductionStrength = f64;
538
539/// Input noise suppression settings.
540#[derive(Debug, Clone, Serialize, Deserialize)]
541pub struct RealtimeNoiseReduction {
542    pub r#type: NoiseReductionType,
543    #[serde(skip_serializing_if = "Option::is_none")]
544    pub strength: Option<RealtimeNoiseReductionStrength>,
545}