1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
|
//! WebSocket and API message types for the makima server.
use serde::{Deserialize, Serialize};
use utoipa::ToSchema;
/// Audio encoding format for WebSocket streaming.
#[derive(Debug, Clone, Copy, Deserialize, Serialize, ToSchema)]
#[serde(rename_all = "lowercase")]
pub enum AudioEncoding {
/// 32-bit floating point PCM samples
Pcm32f,
/// 16-bit signed integer PCM samples
Pcm16,
/// Raw bytes (will be interpreted as PCM16)
Raw,
}
/// Initial handshake message from client specifying audio format.
#[derive(Debug, Clone, Deserialize, Serialize, ToSchema)]
#[serde(rename_all = "camelCase")]
pub struct StartMessage {
/// Audio sample rate in Hz (e.g., 16000, 44100, 48000)
pub sample_rate: u32,
/// Number of audio channels (1 for mono, 2 for stereo)
pub channels: u16,
/// Audio encoding format
pub encoding: AudioEncoding,
}
/// Stop message to terminate the session.
#[derive(Debug, Clone, Deserialize, Serialize, ToSchema)]
#[serde(rename_all = "camelCase")]
pub struct StopMessage {
/// Optional reason for stopping
pub reason: Option<String>,
}
/// Wrapper for all WebSocket messages from client to server.
#[derive(Debug, Clone, Deserialize)]
#[serde(tag = "type", rename_all = "camelCase")]
pub enum ClientMessage {
Start(StartMessage),
Stop(StopMessage),
}
/// Transcription result message sent from server to client.
#[derive(Debug, Clone, Serialize, ToSchema)]
#[serde(rename_all = "camelCase")]
pub struct TranscriptMessage {
/// Speaker identifier (e.g., "Speaker 0", "Speaker 1")
pub speaker: String,
/// Segment start time in seconds
pub start: f32,
/// Segment end time in seconds
pub end: f32,
/// Transcribed text
pub text: String,
/// Whether this is a final or interim result
pub is_final: bool,
}
/// Wrapper for all WebSocket messages from server to client.
#[derive(Debug, Clone, Serialize)]
#[serde(tag = "type", rename_all = "camelCase")]
pub enum ServerMessage {
/// Session is ready for audio streaming
Ready { session_id: String },
/// Transcription result
Transcript(TranscriptMessage),
/// Error occurred during processing
Error { code: String, message: String },
/// Session has been stopped
Stopped { reason: String },
}
/// Error response for HTTP API endpoints.
#[derive(Debug, Clone, Serialize, ToSchema)]
pub struct ApiError {
/// Error code for programmatic handling
pub code: String,
/// Human-readable error message
pub message: String,
}
impl ApiError {
pub fn new(code: impl Into<String>, message: impl Into<String>) -> Self {
Self {
code: code.into(),
message: message.into(),
}
}
}
|