Skip to main content

async_openai/types/audio/
stream.rs

1use serde::{Deserialize, Serialize};
2
3use crate::types::audio::{LogProbProperties, TranscriptTextUsageTokens};
4
5#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
6#[serde(tag = "type", rename_all = "snake_case")]
7pub enum CreateSpeechResponseStreamEvent {
8    /// Emitted for each chunk of audio data generated during speech synthesis.
9    #[serde(rename = "speech.audio.delta")]
10    SpeechAudioDelta(SpeechAudioDeltaEvent),
11    /// Emitted when the speech synthesis is complete and all audio has been streamed.
12    #[serde(rename = "speech.audio.done")]
13    SpeechAudioDone(SpeechAudioDoneEvent),
14}
15
16#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
17pub struct SpeechAudioDeltaEvent {
18    /// A chunk of Base64-encoded audio data.
19    pub audio: String,
20}
21
22#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
23pub struct SpeechUsage {
24    /// Number of input tokens in the prompt.
25    pub input_tokens: u32,
26    /// Number of output tokens generated.
27    pub output_tokens: u32,
28    /// Total number of tokens used (input + output).
29    pub total_tokens: u32,
30}
31
32#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
33pub struct SpeechAudioDoneEvent {
34    /// Token usage statistics for the request.
35    pub usage: SpeechUsage,
36}
37
38#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
39pub struct TranscriptionTextSegmentEvent {
40    /// Unique identifier for the segment.
41    pub id: String,
42    /// Start timestamp of the segment in seconds.
43    pub start: f32,
44    /// End timestamp of the segment in seconds.
45    pub end: f32,
46    /// Transcript text for this segment.
47    pub text: String,
48    /// Speaker label for this segment.
49    pub speaker: String,
50}
51
52#[derive(Debug, Serialize, Deserialize, Clone)]
53pub struct TranscriptionTextDeltaEvent {
54    /// The text delta that was additionally transcribed.
55    pub delta: String,
56    /// The log probabilities of the individual tokens in the transcription.
57    /// Only included if you [create a transcription](https://platform.openai.com/docs/api-reference/audio/create-transcription) with
58    /// the `include[]` parameter set to `logprobs`.
59    pub logprobs: Option<Vec<LogProbProperties>>,
60    /// Identifier of the diarized segment that this delta belongs to. Only present when using
61    /// `gpt-4o-transcribe-diarize`.
62    pub segment_id: Option<String>,
63}
64
65#[derive(Debug, Serialize, Deserialize, Clone)]
66pub struct TranscriptionTextDoneEvent {
67    /// The text that was transcribed.
68    pub text: String,
69    /// The log probabilities of the individual tokens in the transcription.
70    /// Only included if you [create a transcription](https://platform.openai.com/docs/api-reference/audio/create-transcription) with
71    /// the `include[]` parameter set to `logprobs`.
72    pub logprobs: Option<Vec<LogProbProperties>>,
73    /// Usage statistics for models billed by token usage.
74    pub usage: TranscriptTextUsageTokens,
75    /// The languages detected in the audio. Returned by `gpt-transcribe`.
76    /// An empty array indicates that no language could be reliably detected.
77    #[serde(skip_serializing_if = "Option::is_none")]
78    pub languages: Option<Vec<crate::types::audio::TranscriptionLanguage>>,
79}
80
81#[derive(Debug, Serialize, Deserialize, Clone)]
82#[serde(tag = "type")]
83pub enum CreateTranscriptionResponseStreamEvent {
84    /// Emitted when a diarized transcription returns a completed segment with speaker information. Only
85    /// emitted when you [create a transcription](https://platform.openai.com/docs/api-reference/audio/create-transcription) with
86    /// `stream` set to `true` and `response_format` set to `diarized_json`.
87    #[serde(rename = "transcript.text.segment")]
88    TranscriptTextSegment(TranscriptionTextSegmentEvent),
89    #[serde(rename = "transcript.text.delta")]
90    TranscriptTextDelta(TranscriptionTextDeltaEvent),
91    /// Emitted when the transcription is complete. Contains the complete transcription text. Only emitted
92    /// when you [create a transcription](https://platform.openai.com/docs/api-reference/audio/create-transcription) with the
93    /// `Stream` parameter set to `true`.
94    #[serde(rename = "transcript.text.done")]
95    TranscriptTextDone(TranscriptionTextDoneEvent),
96}
97
98#[cfg(feature = "_api")]
99pub type TranscriptionResponseStream =
100    crate::types::stream::StreamResponse<CreateTranscriptionResponseStreamEvent>;
101
102/// Stream of response events
103#[cfg(feature = "_api")]
104pub type SpeechResponseStream =
105    crate::types::stream::StreamResponse<CreateSpeechResponseStreamEvent>;
106
107#[cfg(feature = "_api")]
108macro_rules! impl_event_type {
109    ($($ty:ty => $event_type:expr),* $(,)?) => {
110        $(
111            impl crate::traits::EventType for $ty {
112                fn event_type(&self) -> &'static str {
113                    $event_type
114                }
115            }
116        )*
117    };
118}
119
120#[cfg(feature = "_api")]
121impl_event_type! {
122    SpeechAudioDeltaEvent => "speech.audio.delta",
123    SpeechAudioDoneEvent => "speech.audio.done",
124    TranscriptionTextSegmentEvent => "transcript.text.segment",
125    TranscriptionTextDeltaEvent => "transcript.text.delta",
126    TranscriptionTextDoneEvent => "transcript.text.done",
127}
128
129#[cfg(feature = "_api")]
130impl crate::traits::EventType for CreateSpeechResponseStreamEvent {
131    fn event_type(&self) -> &'static str {
132        match self {
133            CreateSpeechResponseStreamEvent::SpeechAudioDelta(event) => event.event_type(),
134            CreateSpeechResponseStreamEvent::SpeechAudioDone(event) => event.event_type(),
135        }
136    }
137}
138
139#[cfg(feature = "_api")]
140impl crate::traits::EventType for CreateTranscriptionResponseStreamEvent {
141    fn event_type(&self) -> &'static str {
142        match self {
143            CreateTranscriptionResponseStreamEvent::TranscriptTextSegment(event) => {
144                event.event_type()
145            }
146            CreateTranscriptionResponseStreamEvent::TranscriptTextDelta(event) => {
147                event.event_type()
148            }
149            CreateTranscriptionResponseStreamEvent::TranscriptTextDone(event) => event.event_type(),
150        }
151    }
152}