audio-cpp commited on
Commit
ba87e41
·
verified ·
1 Parent(s): 351dbab

Add OWSM v4 models and documentation

Browse files
.gitattributes CHANGED
@@ -122,3 +122,11 @@ KugelAudio-0-Open-GGUF/kugelaudio-0-open-q8_0.gguf filter=lfs diff=lfs merge=lfs
122
  CrisperWhisper2.0-GGUF/crisperwhisper-2-large-bf16.gguf filter=lfs diff=lfs merge=lfs -text
123
  CrisperWhisper2.0-GGUF/crisperwhisper-2-large-q4_k.gguf filter=lfs diff=lfs merge=lfs -text
124
  CrisperWhisper2.0-GGUF/crisperwhisper-2-large-q8_0.gguf filter=lfs diff=lfs merge=lfs -text
 
 
 
 
 
 
 
 
 
122
  CrisperWhisper2.0-GGUF/crisperwhisper-2-large-bf16.gguf filter=lfs diff=lfs merge=lfs -text
123
  CrisperWhisper2.0-GGUF/crisperwhisper-2-large-q4_k.gguf filter=lfs diff=lfs merge=lfs -text
124
  CrisperWhisper2.0-GGUF/crisperwhisper-2-large-q8_0.gguf filter=lfs diff=lfs merge=lfs -text
125
+ OWSM-GGUF/owsm-v4-base-102m-f32.gguf filter=lfs diff=lfs merge=lfs -text
126
+ OWSM-GGUF/owsm-v4-base-102m-q8_0.gguf filter=lfs diff=lfs merge=lfs -text
127
+ OWSM-GGUF/owsm-v4-medium-1b-f32.gguf filter=lfs diff=lfs merge=lfs -text
128
+ OWSM-GGUF/owsm-v4-medium-1b-q4_k.gguf filter=lfs diff=lfs merge=lfs -text
129
+ OWSM-GGUF/owsm-v4-medium-1b-q8_0.gguf filter=lfs diff=lfs merge=lfs -text
130
+ OWSM-GGUF/owsm-v4-small-370m-f32.gguf filter=lfs diff=lfs merge=lfs -text
131
+ OWSM-GGUF/owsm-v4-small-370m-q4_k.gguf filter=lfs diff=lfs merge=lfs -text
132
+ OWSM-GGUF/owsm-v4-small-370m-q8_0.gguf filter=lfs diff=lfs merge=lfs -text
OWSM-GGUF/README.md ADDED
@@ -0,0 +1,176 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ license: cc-by-4.0
3
+ tags:
4
+ - audio.cpp
5
+ - automatic-speech-recognition
6
+ - speech-translation
7
+ - gguf
8
+ ---
9
+
10
+ # OWSM GGUF
11
+
12
+ Self-contained OWSM v4 models for [audio.cpp](https://github.com/0xShug0/audio.cpp).
13
+ The tokenizer, feature normalization, runtime configuration, and model spec are
14
+ embedded in each GGUF.
15
+
16
+ The model family is `owsm`. Filenames identify the version, variant, parameter
17
+ count, and storage type, for example `owsm-v4-base-102m-f32.gguf`,
18
+ `owsm-v4-small-370m-q8_0.gguf`, and `owsm-v4-medium-1b-q4_k.gguf`.
19
+ Only v4 checkpoints are currently supported.
20
+
21
+ Upstream checkpoints:
22
+
23
+ - [Base 102M](https://huggingface.co/espnet/owsm_v4_base_102M), revision `96dbb52dba9e173a0a433b9adda6b52da71a53e4`.
24
+ - [Small 370M](https://huggingface.co/espnet/owsm_v4_small_370M), revision `adf541c613f1a2c90fdf972875c82d76888b099a`.
25
+ - [Medium 1B](https://huggingface.co/espnet/owsm_v4_medium_1B), revision `2e27c99d9be596ce188997d80d0e50408cae54a7`.
26
+
27
+ ## Warmed Long-Form Performance
28
+
29
+ - Hardware: AMD Ryzen 9 7900X and NVIDIA GeForce RTX 5090; eight CPU threads.
30
+ - Software: audio.cpp debug build; ESPnet 202610.post2 and PyTorch 2.11.0+cu128.
31
+ - C++ CPU measurements use a full-model CPU-only debug build with CUDA and
32
+ Vulkan disabled, native CPU instructions, OpenMP, and eight threads. GPU
33
+ measurements use the separate GPU-enabled build. Removing GPU backends
34
+ reduced Base F32 peak RSS by about 283 MiB in a paired check; the tables below
35
+ use the measured CPU-only results for every C++ CPU row.
36
+ - Both implementations use English transcription, utterance timestamps,
37
+ `beam_size=1`, and no previous-text conditioning. This compares matched greedy
38
+ decoding, not ESPnet's default beam size of five.
39
+ - Each measurement starts a fresh process, loads one model, runs a 3.505-second
40
+ warmup, then transcribes the same 327.6-second recording once. Runs are sequential.
41
+ - Inference time excludes model loading, file reading, and warmup. C++ reports
42
+ `session.wall_ms`; Python times `Speech2Text.decode_long`, with CUDA synchronized
43
+ before and after. RTF is inference seconds divided by 327.6; lower is better.
44
+ - Peak RAM is process RSS; peak VRAM is process GPU memory reported by NVML,
45
+ not PyTorch's allocated-tensor counter or total desktop GPU usage. Both are
46
+ sampled with the same monitor at a requested 20 ms interval across loading,
47
+ warmup, and inference. Sampling can miss brief peaks.
48
+ - Python uses its default F32 inference, without TF32, precision, or randomness
49
+ overrides. The F32 comparisons below use F32 GGUFs; quantized C++ packages are
50
+ reported separately. These performance runs are not controlled parity tests.
51
+
52
+ ### CPU: F32
53
+
54
+ | Model | C++ inference | Python inference | C++ RTF | Python RTF | C++ peak RSS | Python peak RSS |
55
+ | --- | ---: | ---: | ---: | ---: | ---: | ---: |
56
+ | Base | 10.124 s | 22.198 s | 0.03090 | 0.06776 | 1,099 MiB | 1,878 MiB |
57
+ | Small | 39.620 s | 63.378 s | 0.12094 | 0.19346 | 2,709 MiB | 3,850 MiB |
58
+ | Medium | 91.704 s | 167.318 s | 0.27993 | 0.51074 | 5,644 MiB | 8,840 MiB |
59
+
60
+ ### CUDA: F32
61
+
62
+ | Model | C++ inference | Python inference | C++ RTF | Python RTF | C++ peak VRAM | Python peak VRAM |
63
+ | --- | ---: | ---: | ---: | ---: | ---: | ---: |
64
+ | Base | 1.193 s | 5.083 s | 0.00364 | 0.01552 | 1,578 MiB | 1,882 MiB |
65
+ | Small | 1.986 s | 7.232 s | 0.00606 | 0.02208 | 3,142 MiB | 4,544 MiB |
66
+ | Medium | 3.986 s | 13.244 s | 0.01217 | 0.04043 | 6,052 MiB | 9,628 MiB |
67
+
68
+ CUDA process peak host RAM was 773 / 836 / 1,148 MiB for C++ and
69
+ 2,381 / 2,648 / 5,015 MiB for Python, in Base / Small / Medium order.
70
+
71
+ These are single warmed long-form measurements, not averages. Autoregressive
72
+ outputs can differ without numerical controls: Medium CUDA differed near the
73
+ end of this recording, including a repeated word and subsequent segment
74
+ boundaries. Do not interpret these timing tables as exact-parity guarantees.
75
+
76
+ ## Parity Checks
77
+
78
+ All long-form segment texts and start/end timestamps matched Python exactly:
79
+ 128 segments for Base, 116 for Small, and 112 for Medium. The variants can
80
+ segment the same recording differently. All three also matched Python on a
81
+ separate short recording. These are focused parity checks, not a multilingual
82
+ accuracy benchmark. This paragraph describes the separate CPU parity checks;
83
+ the performance methodology and memory measurements are listed above.
84
+
85
+ Base F32 also matched Python text and timestamps on five separate FLEURS
86
+ recordings: one each in English, Russian, Kazakh, Kyrgyz, and Uzbek.
87
+ All three F32 variants matched Python on the short English-to-German
88
+ speech-translation case.
89
+ With previous-text conditioning enabled, Base also matched all 41 Python
90
+ segments and timestamps on the same long recording.
91
+ With `beam_size=5`, Base matched all 133 Python segments and timestamps on that
92
+ recording, plus two short transcription cases and English-to-German translation.
93
+ The performance tables above use greedy decoding, not beam search.
94
+ With `language=auto`, Base matched official Python language identification and
95
+ the subsequent transcript and timestamps on all five FLEURS recordings. Both
96
+ implementations classified the Kyrgyz recording as Kazakh, so an explicit
97
+ language remains useful when it is known.
98
+
99
+ ## Quantized Performance
100
+
101
+ The same warmed long-form protocol gives the following results for the
102
+ distributed quantized packages. Compare each variant with its Python F32 row
103
+ in the corresponding CPU or CUDA table above; Python was not quantized.
104
+
105
+ ### CPU
106
+
107
+ The word-disagreement column comes from the separate CPU output comparison
108
+ against Python F32, using lowercase words with punctuation removed. It is not
109
+ error against a human transcript. The new performance runs retained exactly
110
+ the same quantized CPU outputs as that comparison.
111
+
112
+ | Model / storage | Inference | RTF | Peak RSS | Word disagreement with Python |
113
+ | --- | ---: | ---: | ---: | ---: |
114
+ | Base Q8_0 | 6.899 s | 0.02106 | 913 MiB | 1.21% |
115
+ | Small Q8_0 | 28.648 s | 0.08745 | 1,834 MiB | 0.22% |
116
+ | Small Q4_K | 26.340 s | 0.08040 | 1,704 MiB | 1.32% |
117
+ | Medium Q8_0 | 60.514 s | 0.18472 | 3,079 MiB | 0% |
118
+ | Medium Q4_K | 58.544 s | 0.17870 | 2,651 MiB | 1.87% |
119
+
120
+ ### CUDA
121
+
122
+ | Model / storage | Inference | RTF | Peak VRAM | Peak host RAM |
123
+ | --- | ---: | ---: | ---: | ---: |
124
+ | Base Q8_0 | 0.984 s | 0.00300 | 1,384 MiB | 823 MiB |
125
+ | Small Q8_0 | 1.587 s | 0.00484 | 2,300 MiB | 850 MiB |
126
+ | Small Q4_K | 1.557 s | 0.00475 | 2,170 MiB | 862 MiB |
127
+ | Medium Q8_0 | 2.989 s | 0.00912 | 3,466 MiB | 964 MiB |
128
+ | Medium Q4_K | 2.874 s | 0.00877 | 3,044 MiB | 950 MiB |
129
+
130
+ Quantization changes timestamp segmentation as well as some words; it is not
131
+ exact-parity. Base Q4_K is larger than Q8_0 because many 384-wide matrices cannot
132
+ use its 256-element blocks and remain F32. Q8_0 is the more promising Base CPU
133
+ trade-off, but these checks alone do not establish multilingual accuracy.
134
+ Medium Q8_0 CPU has identical normalized words on this recording, but 14 of 112
135
+ segments differ in timestamps or exact text formatting.
136
+
137
+ ### Backend Checks
138
+
139
+ Base F32 returned identical transcripts, German translation, and timestamps on
140
+ CPU, CUDA, and Vulkan for the short repeated-request sequence. This is targeted
141
+ backend coverage, not a full GPU accuracy or performance benchmark.
142
+ Small and Medium Q8_0 also matched their respective CPU results exactly on
143
+ CUDA and Vulkan for that sequence.
144
+
145
+ ## Autoregressive Usage
146
+
147
+ ```bash
148
+ audiocpp_cli --task asr --family owsm \
149
+ --model /path/to/OWSM-GGUF/owsm-v4-base-102m-f32.gguf --backend cpu --threads 8 \
150
+ --audio input.wav --request-option language=eng \
151
+ --request-option return_timestamps=true --segments-out segments.json \
152
+ --text-out transcript.txt --log
153
+ ```
154
+
155
+ For speech translation, add `--request-option target_language=deu`, for example,
156
+ to translate into German. Long recordings use timestamp-driven windows.
157
+ Use `--request-option language=auto` to identify the source language from the
158
+ first window without a second encoder pass.
159
+ Greedy decoding is the CPU-first default. Set `--request-option beam_size=5`
160
+ for the official Python default beam width; this trades additional computation
161
+ and host memory for a wider search.
162
+ Add `--mode streaming` for incremental text output from a complete audio file.
163
+ Greedy decoding emits token deltas; beam search and automatic long-form
164
+ continuation emit committed window text. This is not live microphone streaming.
165
+ For HTTP, configure a streaming model entry and use `stream=true` on
166
+ `/v1/audio/transcriptions`.
167
+ See the [model guide](https://github.com/0xShug0/audio.cpp/blob/main/docs/models/owsm.md)
168
+ for options and conversion instructions.
169
+
170
+ The published model weights are licensed under CC BY 4.0. Attribution belongs
171
+ to the upstream ESPnet OWSM authors. The unused CTC head is omitted from these
172
+ autoregressive inference packages.
173
+
174
+ Packages include F32 and Q8_0 for Base, Small, and Medium, plus Q4_K for Small
175
+ and Medium. Base Q4_K was evaluated but is not distributed for the size and
176
+ speed reasons above.
OWSM-GGUF/owsm-v4-base-102m-f32.gguf ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:70a3a977a380084b67e7a9804efa504bb5f0f3aa07f873a7ae046dc96e352d84
3
+ size 331785024
OWSM-GGUF/owsm-v4-base-102m-q8_0.gguf ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:7d4efb7188ca85f3bc85c8411cd97d1d667adb22fbb8084142eeb812e83461bc
3
+ size 118204672
OWSM-GGUF/owsm-v4-medium-1b-f32.gguf ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:1e9ab4491072ceda1f959543acc63465f510907bf585d1160f968c826f3fa3dd
3
+ size 3884745440
OWSM-GGUF/owsm-v4-medium-1b-q4_k.gguf ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:ae1bc39e7e3674dbb842256bc6e29589d81e75670542b08ca626baa3259b90a5
3
+ size 720126816
OWSM-GGUF/owsm-v4-medium-1b-q8_0.gguf ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:cd1afc17d28a91cc7d1c74f9088166b7675ee21c388433ea79da6d4b5dd85684
3
+ size 1160963936
OWSM-GGUF/owsm-v4-small-370m-f32.gguf ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:e62c2281e3b3607083d524d792c33ce3937c4bb9c5a33e705e1a818b2208e89a
3
+ size 1325740192
OWSM-GGUF/owsm-v4-small-370m-q4_k.gguf ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:f16181a97466266a46f81516282a7cba3ae65ded00c53f2392e2aed2fdc401b0
3
+ size 296337664
OWSM-GGUF/owsm-v4-small-370m-q8_0.gguf ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:08f76076a89c2dfa4a3c49bac5c86ad9ddbe2aac1bdbde08286636620df48eed
3
+ size 432323584