Add OWSM v4 models and documentation
Browse files- .gitattributes +8 -0
- OWSM-GGUF/README.md +176 -0
- OWSM-GGUF/owsm-v4-base-102m-f32.gguf +3 -0
- OWSM-GGUF/owsm-v4-base-102m-q8_0.gguf +3 -0
- OWSM-GGUF/owsm-v4-medium-1b-f32.gguf +3 -0
- OWSM-GGUF/owsm-v4-medium-1b-q4_k.gguf +3 -0
- OWSM-GGUF/owsm-v4-medium-1b-q8_0.gguf +3 -0
- OWSM-GGUF/owsm-v4-small-370m-f32.gguf +3 -0
- OWSM-GGUF/owsm-v4-small-370m-q4_k.gguf +3 -0
- OWSM-GGUF/owsm-v4-small-370m-q8_0.gguf +3 -0
.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
|