whisper_macos_cli/model/
registry.rs1pub struct ModelInfo {
2 pub name: &'static str,
3 pub filename: &'static str,
4 pub url: &'static str,
5 pub size_bytes: u64,
6 pub description: &'static str,
7 pub min_size_bytes: u64,
8}
9
10static MODELS: &[ModelInfo] = &[
11 ModelInfo {
12 name: "tiny",
13 filename: "ggml-tiny.bin",
14 url: "https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-tiny.bin",
15 size_bytes: 75_687_065,
16 min_size_bytes: 70_000_000,
17 description: "Fastest, lowest accuracy",
18 },
19 ModelInfo {
20 name: "base",
21 filename: "ggml-base.bin",
22 url: "https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-base.bin",
23 size_bytes: 142_356_480,
24 min_size_bytes: 135_000_000,
25 description: "Fast, basic accuracy",
26 },
27 ModelInfo {
28 name: "small",
29 filename: "ggml-small.bin",
30 url: "https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-small.bin",
31 size_bytes: 466_041_792,
32 min_size_bytes: 440_000_000,
33 description: "Balanced speed/accuracy",
34 },
35 ModelInfo {
36 name: "medium",
37 filename: "ggml-medium.bin",
38 url: "https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-medium.bin",
39 size_bytes: 1_524_630_880,
40 min_size_bytes: 1_400_000_000,
41 description: "High accuracy",
42 },
43 ModelInfo {
44 name: "large-v3",
45 filename: "ggml-large-v3.bin",
46 url: "https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-large-v3.bin",
47 size_bytes: 3_095_033_856,
48 min_size_bytes: 2_900_000_000,
49 description: "Maximum accuracy (default)",
50 },
51];
52
53pub fn get_model(name: &str) -> Option<&'static ModelInfo> {
54 MODELS.iter().find(|m| m.name == name)
55}
56
57pub fn default_model() -> &'static ModelInfo {
58 match get_model("large-v3") {
59 Some(m) => m,
60 None => &MODELS[MODELS.len() - 1],
61 }
62}
63
64pub fn all_models() -> &'static [ModelInfo] {
65 MODELS
66}
67
68#[cfg(test)]
69mod tests {
70 use super::*;
71
72 #[test]
73 fn default_model_is_large_v3() {
74 assert_eq!(default_model().name, "large-v3");
75 }
76
77 #[test]
78 fn get_model_tiny_returns_some() {
79 assert!(get_model("tiny").is_some());
80 }
81
82 #[test]
83 fn get_model_nonexistent_returns_none() {
84 assert!(get_model("nonexistent").is_none());
85 }
86
87 #[test]
88 fn all_models_returns_five() {
89 assert_eq!(all_models().len(), 5);
90 }
91
92 #[test]
93 fn min_size_is_less_than_total_size() {
94 for m in all_models() {
95 assert!(
96 m.min_size_bytes < m.size_bytes,
97 "min_size must be smaller than expected size for {}",
98 m.name
99 );
100 }
101 }
102}