Skip to main content

whisper_macos_cli/model/
registry.rs

1pub 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}