Skip to main content

gproxy_protocol/openai/audio/
mod.rs

1//! OpenAI Audio wire models.
2//!
3//! The local Speech page documents its JSON request but not the SSE event
4//! payloads. The Transcription and Translation pages document responses and
5//! multipart examples but omit a complete body-parameter table; request-only
6//! fields not visible there are retained from the v2 public protocol model.
7
8mod request;
9mod response;
10mod stream;
11
12pub use request::*;
13pub use response::*;
14pub use stream::*;
15
16/// Binary bytes returned when speech uses `stream_format: "audio"`.
17pub type SpeechResponse = Vec<u8>;
18
19#[cfg(test)]
20mod tests {
21    use super::*;
22    use serde_json::json;
23
24    #[test]
25    fn audio_models_round_trip_unknown_fields_and_events() {
26        let request = json!({
27            "input": "hello",
28            "model": "tts-future",
29            "voice": {"id":"voice_1", "future_voice":true},
30            "response_format": "future_codec",
31            "future_request": 1
32        });
33        let parsed: SpeechRequest = serde_json::from_value(request.clone()).unwrap();
34        assert_eq!(serde_json::to_value(parsed).unwrap(), request);
35
36        let response = json!({
37            "text": "hello",
38            "usage": {"type":"duration", "seconds":1.5, "future_usage":2},
39            "future_response": {"x":1}
40        });
41        let parsed: TranscriptionResponse = serde_json::from_value(response.clone()).unwrap();
42        assert_eq!(serde_json::to_value(parsed).unwrap(), response);
43
44        let verbose = json!({
45            "task":"transcribe","language":"english","duration":1.5,
46            "text":"hello","segments":[]
47        });
48        let parsed: TranscriptionResponse = serde_json::from_value(verbose).unwrap();
49        assert!(matches!(parsed, TranscriptionResponse::Verbose(_)));
50
51        let event = json!({"type":"transcript.future", "delta":"x", "future_event":true});
52        let parsed: TranscriptionStreamEvent = serde_json::from_value(event.clone()).unwrap();
53        assert_eq!(serde_json::to_value(parsed).unwrap(), event);
54
55        let speech = json!({"type":"speech.audio.delta", "audio":"AAEC", "future":1});
56        let parsed: SpeechStreamEvent = serde_json::from_value(speech.clone()).unwrap();
57        assert_eq!(serde_json::to_value(parsed).unwrap(), speech);
58    }
59}