v45: SFT+chained GRPO with ITN — 95.9% number accuracy, 97.0% filler-free, deletion behavior matches v36
Browse files- README.md +73 -72
- config.json +1 -2
- generation_config.json +1 -1
- model.safetensors +1 -1
README.md
CHANGED
|
@@ -12,13 +12,13 @@ tags:
|
|
| 12 |
- LiquidAI
|
| 13 |
- grpo
|
| 14 |
- full-fine-tune
|
| 15 |
-
-
|
| 16 |
pipeline_tag: text-generation
|
| 17 |
datasets:
|
| 18 |
- juanquivilla/sotto-transcript-cleanup
|
| 19 |
---
|
| 20 |
|
| 21 |
-
# SottoASR Transcript Cleanup — LFM2.5-350M (Full Precision,
|
| 22 |
|
| 23 |
[sottoasr.app](https://sottoasr.app) · [MLX 5-bit (recommended)](https://huggingface.co/juanquivilla/sotto-cleanup-lfm25-350m-mlx-5bit) · [MLX 4-bit (smaller)](https://huggingface.co/juanquivilla/sotto-cleanup-lfm25-350m-mlx-4bit) · [Training Dataset](https://huggingface.co/datasets/juanquivilla/sotto-transcript-cleanup)
|
| 24 |
|
|
@@ -26,39 +26,61 @@ datasets:
|
|
| 26 |
|
| 27 |
**Full-precision bf16** fine-tune of [LiquidAI/LFM2.5-350M-Base](https://huggingface.co/LiquidAI/LFM2.5-350M-Base) for on-device speech-to-text transcript cleanup. This is the **training artifact** — for on-device deployment on Apple Silicon, use the [5-bit MLX variant](https://huggingface.co/juanquivilla/sotto-cleanup-lfm25-350m-mlx-5bit) instead.
|
| 28 |
|
| 29 |
-
This model powers on-device transcript cleanup in [SottoASR](https://sottoasr.app) — a local, privacy-first speech-to-text application for macOS. It removes filler words, corrects grammar, formats punctuation, handles false starts and self-corrections, restructures long dictations into paragraph-formatted prose, and **— new in
|
| 30 |
|
| 31 |
-
## What's new in
|
| 32 |
|
| 33 |
-
|
| 34 |
|
| 35 |
-
|
| 36 |
-
|---|---|---|
|
| 37 |
-
| Filler-Free rate | 50.9 % | **96.9 %** ⭐ |
|
| 38 |
-
| Substantive-deletion >15% on long inputs | 3.85 % | **0.64 %** ⭐ |
|
| 39 |
-
| ROUGE-L F1 on long inputs (>100 words) | 0.9242 | **0.9425** |
|
| 40 |
-
| Set-based deletion >40% (legacy metric) | 11.4 % | **3.4 %** |
|
| 41 |
-
| Word retention median | 0.899 | 0.884 |
|
| 42 |
-
| Composite winner score | 131.7 | **189.2** |
|
| 43 |
|
| 44 |
-
|
|
|
|
| 45 |
|
| 46 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 47 |
|
| 48 |
## Key Specs
|
| 49 |
|
| 50 |
| Property | Value |
|
| 51 |
|----------|-------|
|
| 52 |
| **Size** | **676 MB** |
|
| 53 |
-
| **
|
| 54 |
-
| **Filler-Free rate** | **
|
| 55 |
-
| **Substantive-deletion >15% (long)** | **0.64 %** ⭐ |
|
| 56 |
| **Architecture** | Hybrid: 10 conv + 6 GQA attention (354M params) |
|
| 57 |
| **Precision** | bf16 |
|
| 58 |
-
| **Training method** |
|
| 59 |
-
| **Training context** | 2,048 prompt + 1,024 completion |
|
| 60 |
| **Native context** | 32,768 tokens (128K base) |
|
| 61 |
-
| **Hardware** | 1× RTX PRO 6000 Blackwell (96 GB)
|
| 62 |
|
| 63 |
## What It Does
|
| 64 |
|
|
@@ -68,40 +90,16 @@ Takes raw, unpunctuated ASR output and produces clean, readable text:
|
|
| 68 |
|-----------------|------------------|
|
| 69 |
| so uh basically we need to fix the deployment pipeline | We need to fix the deployment pipeline. |
|
| 70 |
| the deadline is friday no monday we have until monday | The deadline is Monday. |
|
| 71 |
-
|
|
| 72 |
-
|
|
| 73 |
-
|
|
|
|
|
|
|
|
|
|
|
| 74 |
|
| 75 |
### Paragraph emission on long dictations (inherited from v23)
|
| 76 |
|
| 77 |
-
Long, multi-topic input is restructured into paragraph-formatted prose with `\n\n` breaks at natural topic boundaries:
|
| 78 |
-
|
| 79 |
-
**Input:**
|
| 80 |
-
> okay so were having some real issues with the deployment pipeline and i want to walk through whats going wrong the main problem is that the redis cache is timing out during deploys we push a new version and then for about thirty seconds the connections hang and customers see errors so i think we need to add a graceful shutdown period before we kill the old pods now separately the elasticsearch cluster has been a pain we deployed a new svelte frontend last month and it caused index corruption we need to validate the schema before pushing anything live going forward i think the answer here is to add both of these checks to our standard deployment checklist
|
| 81 |
-
|
| 82 |
-
**Output:**
|
| 83 |
-
> We're having some real issues with the deployment pipeline, and I want to walk through what's going wrong. The main problem is that the Redis cache is timing out during deploys. We push a new version and then for about thirty seconds the connections hang, and customers see errors.
|
| 84 |
-
>
|
| 85 |
-
> I think we need to add a graceful shutdown period before we kill the old pods. Now separately, the Elasticsearch cluster has been a pain. We deployed a new Svelte frontend last month and it caused index corruption. We need to validate the schema before pushing anything live. Going forward, I think the answer here is to add both of these checks to our standard deployment checklist.
|
| 86 |
-
|
| 87 |
-
## Benchmark Results
|
| 88 |
-
|
| 89 |
-
Evaluated on a 350-sample held-out mix: 200 random samples from `data_v23_paragraphs/val.jsonl` plus 150 held-out preservation samples (the last 150 of `preservation_samples.jsonl`, never seen during training).
|
| 90 |
-
|
| 91 |
-
### Headline numbers vs baselines
|
| 92 |
-
|
| 93 |
-
| Metric | v23 baseline | v24 (Apr) | **v36 (this model)** |
|
| 94 |
-
|--------|---:|---:|---:|
|
| 95 |
-
| ROUGE-L F1 (overall) | 0.9357 | 0.9300 | 0.9076 |
|
| 96 |
-
| ROUGE-L F1 (long inputs >100 words) | 0.9242 | 0.9144 | **0.9425** |
|
| 97 |
-
| Filler-Free rate | 50.9 % | 74.9 % | **96.9 %** ⭐ |
|
| 98 |
-
| Set-based deletion >40% | 11.4 % | 12.9 % | **3.4 %** |
|
| 99 |
-
| **Substantive-deletion >15% on long inputs** | **3.85 %** | — | **0.64 %** ⭐ |
|
| 100 |
-
| Substantive-deletion >25% on long inputs | 0.0 % | — | 0.0 % |
|
| 101 |
-
| Set-based deletion median | 0.107 | 0.175 | 0.092 |
|
| 102 |
-
| Word retention median | 0.899 | 0.818 | 0.884 |
|
| 103 |
-
|
| 104 |
-
v36 is **slightly more aggressive on short inputs** (overall ROUGE-L drops from 0.936 → 0.908 — the model more readily strips fillers and tightens punctuation) but **better on long inputs** (ROUGE-L 0.924 → 0.943) where preservation matters most. For workloads dominated by long-form dictation (the design target), v36 is strictly better than v23.
|
| 105 |
|
| 106 |
## Usage
|
| 107 |
|
|
@@ -127,7 +125,7 @@ model = AutoModelForCausalLM.from_pretrained(
|
|
| 127 |
)
|
| 128 |
tokenizer = AutoTokenizer.from_pretrained("juanquivilla/sotto-cleanup-lfm25-350m")
|
| 129 |
|
| 130 |
-
text = "
|
| 131 |
prompt = f"### Input:\n{text}\n\n### Output:\n"
|
| 132 |
|
| 133 |
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
|
|
@@ -137,7 +135,7 @@ output = tokenizer.decode(out[0][inputs["input_ids"].shape[1]:], skip_special_to
|
|
| 137 |
if "###" in output:
|
| 138 |
output = output[:output.index("###")]
|
| 139 |
print(output.strip())
|
| 140 |
-
# → "
|
| 141 |
```
|
| 142 |
|
| 143 |
For long dictation that may need paragraph formatting, use a higher `max_new_tokens` (1024–2048).
|
|
@@ -148,36 +146,38 @@ For long dictation that may need paragraph formatting, use a higher `max_new_tok
|
|
| 148 |
|
| 149 |
```
|
| 150 |
LiquidAI/LFM2.5-350M-Base
|
| 151 |
-
→ SFT (v23): 157,556 rows
|
| 152 |
-
|
| 153 |
-
→ GRPO
|
| 154 |
-
|
| 155 |
-
→ GRPO
|
| 156 |
-
|
| 157 |
-
(3,000 flat + 3,000 oversampled preservation, 50/50),
|
| 158 |
-
batch=48, num_gen=8, 1000 steps, LR 5e-6, ~46 min
|
| 159 |
-
→ 350-sample eval: 96.9 % filler-free, 0.64 % sub-del-15-long
|
| 160 |
```
|
| 161 |
|
| 162 |
-
###
|
| 163 |
|
| 164 |
-
|
| 165 |
|
| 166 |
1. **Quality**: `+5.0 × ROUGE-L F1` against the reference clean output.
|
| 167 |
-
2. **Filler penalty**: `−min(count × 0.5, 2.0) ×
|
| 168 |
3. **Format bonus**: +0.2 each for capital-leading and terminal punctuation.
|
| 169 |
-
4. **Substantive-deletion penalty**: strip filler words from input, compute
|
| 170 |
5. **Preservation bonus**: `+1.5` when output/input word ratio is in `[0.70, 0.95]`.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 171 |
|
| 172 |
-
|
| 173 |
|
| 174 |
-
|
| 175 |
|
| 176 |
-
The
|
| 177 |
|
| 178 |
### Dataset
|
| 179 |
|
| 180 |
-
**157,556 train / 7,121 val rows** in [juanquivilla/sotto-transcript-cleanup](https://huggingface.co/datasets/juanquivilla/sotto-transcript-cleanup), plus
|
| 181 |
|
| 182 |
## All Variants
|
| 183 |
|
|
@@ -191,7 +191,8 @@ The campaign ran 14 LoRA variants (v25–v38, v50, v52) and one full fine-tune (
|
|
| 191 |
|
| 192 |
- Optimized for **English** conversational/meeting-style speech
|
| 193 |
- Domain-specific jargon (medical, legal) may not be corrected without additional fine-tuning
|
| 194 |
-
-
|
|
|
|
| 195 |
- The substantive-deletion metric is reference-free (compares output to input only, after filler-stripping) so it cannot catch *semantic* hallucinations — only word-level losses
|
| 196 |
- Not designed for formal written text — trained on spoken language patterns
|
| 197 |
|
|
|
|
| 12 |
- LiquidAI
|
| 13 |
- grpo
|
| 14 |
- full-fine-tune
|
| 15 |
+
- inverse-text-normalization
|
| 16 |
pipeline_tag: text-generation
|
| 17 |
datasets:
|
| 18 |
- juanquivilla/sotto-transcript-cleanup
|
| 19 |
---
|
| 20 |
|
| 21 |
+
# SottoASR Transcript Cleanup — LFM2.5-350M (Full Precision, v45 + Numbers)
|
| 22 |
|
| 23 |
[sottoasr.app](https://sottoasr.app) · [MLX 5-bit (recommended)](https://huggingface.co/juanquivilla/sotto-cleanup-lfm25-350m-mlx-5bit) · [MLX 4-bit (smaller)](https://huggingface.co/juanquivilla/sotto-cleanup-lfm25-350m-mlx-4bit) · [Training Dataset](https://huggingface.co/datasets/juanquivilla/sotto-transcript-cleanup)
|
| 24 |
|
|
|
|
| 26 |
|
| 27 |
**Full-precision bf16** fine-tune of [LiquidAI/LFM2.5-350M-Base](https://huggingface.co/LiquidAI/LFM2.5-350M-Base) for on-device speech-to-text transcript cleanup. This is the **training artifact** — for on-device deployment on Apple Silicon, use the [5-bit MLX variant](https://huggingface.co/juanquivilla/sotto-cleanup-lfm25-350m-mlx-5bit) instead.
|
| 28 |
|
| 29 |
+
This model powers on-device transcript cleanup in [SottoASR](https://sottoasr.app) — a local, privacy-first speech-to-text application for macOS. It removes filler words, corrects grammar, formats punctuation, handles false starts and self-corrections, restructures long dictations into paragraph-formatted prose, preserves substantive content reliably even on long inputs, and **— new in v45 — converts spoken-form numbers to digit form correctly** (inverse text normalization), all locally with zero cloud dependency.
|
| 30 |
|
| 31 |
+
## What's new in v45
|
| 32 |
|
| 33 |
+
v45 fixes the **inverse text normalization (ITN) failure mode** that v36 exhibited: when users dictated compound spoken numbers like "talk about server three sixty," v36 would either preserve the spoken form (looks unprofessional) or attempt the conversion incorrectly ("server 315" instead of "server 360"). v45 reliably produces the correct digit form across all common ITN categories — compound numbers, hundreds, four-digit years, times, decimals, percentages, currency, ordinals, dates — while continuing to preserve cardinals in idioms ("I'll be there in five" stays as written; "twenty four seven" → "24/7").
|
| 34 |
|
| 35 |
+
### Two-stage pipeline
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 36 |
|
| 37 |
+
1. **SFT (v39)** — supervised fine-tuning of v36 on a 19K-row mix: 12,757 number-conversion examples (programmatically generated with ground-truth digit forms, then augmented 4× via Qwen3.6-27B for diversity) + 5K random flat samples + 1K preservation samples. 2 epochs, full FT, lr 2e-5.
|
| 38 |
+
2. **GRPO (v40 → v42 → v43 → v44 → v45)** — five GRPO refinement passes that progressively tightened the reward shaping. The final v45 reward combines v36's substantive-deletion penalty + a number-accuracy term (digit-signature exact match, ±5.0) + an over-conversion penalty (penalize digits when reference has none) + an amplified filler penalty (6× multiplier). Each pass trained on a 6K-row mix (3K numbers + 2K flat + 1K preservation), batch=48, num_gen=8, 1000 steps, lr=5e-6 cosine.
|
| 39 |
|
| 40 |
+
### Headline results
|
| 41 |
+
|
| 42 |
+
| Capability | v23 baseline | v36 (preservation) | **v45 (this model)** |
|
| 43 |
+
|---|---:|---:|---:|
|
| 44 |
+
| Number accuracy (171-sample stratified set) | — | 12.9 % | **95.9 %** ⭐ |
|
| 45 |
+
| Filler-Free rate | 50.9 % | 96.9 % | **97.0 %** |
|
| 46 |
+
| Substantive-deletion >15% on long inputs | 3.85 % | 0.64 %† | 13.7 %‡ |
|
| 47 |
+
| Word retention median | 0.899 | 0.884 | 0.922 |
|
| 48 |
+
|
| 49 |
+
† Measured on the v36-era mix of 200 v23 random + 150 preservation samples.
|
| 50 |
+
‡ Measured on a stricter eval — all 241 long inputs (>100 words) from `data_v23_paragraphs/val.jsonl`. On that same stricter eval v36 measures 13.3 %, so v45 is essentially tied with v36 on deletion behavior while gaining 83pp on number accuracy.
|
| 51 |
+
|
| 52 |
+
### Number conversion accuracy by category (171 stratified val samples)
|
| 53 |
+
|
| 54 |
+
| Category | v36 | **v45** |
|
| 55 |
+
|---|---:|---:|
|
| 56 |
+
| compound_2digit ("three sixty" → "360") | 10.0 % | **96.7 %** |
|
| 57 |
+
| sound_alike (sixteen vs sixty) | 0.0 % | **100.0 %** |
|
| 58 |
+
| hundred_form ("two hundred fifty" → "250") | 5.0 % | **100.0 %** |
|
| 59 |
+
| four_digit ("nineteen ninety nine" → "1999") | 6.7 % | **100.0 %** |
|
| 60 |
+
| time ("three pm" → "3 PM") | 0.0 % | **100.0 %** |
|
| 61 |
+
| decimal ("three point one four" → "3.14") | 10.0 % | 90.0 % |
|
| 62 |
+
| percent ("sixty percent" → "60 %") | 0.0 % | **100.0 %** |
|
| 63 |
+
| currency ("fifty dollars" → "$50") | 0.0 % | **100.0 %** |
|
| 64 |
+
| negative ("minus five" → "-5") | 0.0 % | **100.0 %** |
|
| 65 |
+
| digit_by_digit (phone) | 0.0 % | 60.0 % |
|
| 66 |
+
| ordinal ("twenty third" → "23rd") | 0.0 % | **100.0 %** |
|
| 67 |
+
| date ("july fourth" → "July 4") | 16.7 % | **100.0 %** |
|
| 68 |
+
| **preserve** (idioms, small cardinals) | 100.0 % | **100.0 %** |
|
| 69 |
+
|
| 70 |
+
12 of 13 categories at ≥90 %; preserve cases held at 100 % — v45 does not over-convert idiomatic uses of small cardinals.
|
| 71 |
|
| 72 |
## Key Specs
|
| 73 |
|
| 74 |
| Property | Value |
|
| 75 |
|----------|-------|
|
| 76 |
| **Size** | **676 MB** |
|
| 77 |
+
| **Number accuracy (stratified val)** | **95.9 %** ⭐ |
|
| 78 |
+
| **Filler-Free rate** | **97.0 %** ⭐ |
|
|
|
|
| 79 |
| **Architecture** | Hybrid: 10 conv + 6 GQA attention (354M params) |
|
| 80 |
| **Precision** | bf16 |
|
| 81 |
+
| **Training method** | SFT then chained GRPO (full fine-tune, no LoRA) |
|
|
|
|
| 82 |
| **Native context** | 32,768 tokens (128K base) |
|
| 83 |
+
| **Hardware** | 1× RTX PRO 6000 Blackwell (96 GB) |
|
| 84 |
|
| 85 |
## What It Does
|
| 86 |
|
|
|
|
| 90 |
|-----------------|------------------|
|
| 91 |
| so uh basically we need to fix the deployment pipeline | We need to fix the deployment pipeline. |
|
| 92 |
| the deadline is friday no monday we have until monday | The deadline is Monday. |
|
| 93 |
+
| talk about server three sixty | Talk about server 360. |
|
| 94 |
+
| schedule it for three fifteen pm | Schedule it for 3:15 PM. |
|
| 95 |
+
| we hit ninety eight percent uptime last month | We hit 98 % uptime last month. |
|
| 96 |
+
| transfer fifty dollars to billing | Transfer $50 to billing. |
|
| 97 |
+
| i'll be there in five | I'll be there in five. |
|
| 98 |
+
| we run twenty four seven | We run 24/7. |
|
| 99 |
|
| 100 |
### Paragraph emission on long dictations (inherited from v23)
|
| 101 |
|
| 102 |
+
Long, multi-topic input is restructured into paragraph-formatted prose with `\n\n` breaks at natural topic boundaries. See the [v36 model card archive](https://huggingface.co/juanquivilla/sotto-cleanup-lfm25-350m/tree/main) for a worked example.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 103 |
|
| 104 |
## Usage
|
| 105 |
|
|
|
|
| 125 |
)
|
| 126 |
tokenizer = AutoTokenizer.from_pretrained("juanquivilla/sotto-cleanup-lfm25-350m")
|
| 127 |
|
| 128 |
+
text = "talk about server three sixty"
|
| 129 |
prompt = f"### Input:\n{text}\n\n### Output:\n"
|
| 130 |
|
| 131 |
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
|
|
|
|
| 135 |
if "###" in output:
|
| 136 |
output = output[:output.index("###")]
|
| 137 |
print(output.strip())
|
| 138 |
+
# → "Talk about server 360."
|
| 139 |
```
|
| 140 |
|
| 141 |
For long dictation that may need paragraph formatting, use a higher `max_new_tokens` (1024–2048).
|
|
|
|
| 146 |
|
| 147 |
```
|
| 148 |
LiquidAI/LFM2.5-350M-Base
|
| 149 |
+
→ SFT (v23): 157,556 rows, LR 3e-5, 3 epochs, packed 4,096 ctx
|
| 150 |
+
→ GRPO R5/R6 (v23): paragraph emission tuned
|
| 151 |
+
→ GRPO v36: full FT, substantive-deletion-aware reward (no LoRA)
|
| 152 |
+
→ SFT v39: v36 + 12,757 number examples + 5K flat + 1K preservation, 2 epochs
|
| 153 |
+
→ GRPO v40-v45: chained refinement passes with combined reward
|
| 154 |
+
(ROUGE×5 - filler×6 + format + sub-del-pen + pres + num_term ±5)
|
|
|
|
|
|
|
|
|
|
| 155 |
```
|
| 156 |
|
| 157 |
+
### v45 reward function
|
| 158 |
|
| 159 |
+
A sum of:
|
| 160 |
|
| 161 |
1. **Quality**: `+5.0 × ROUGE-L F1` against the reference clean output.
|
| 162 |
+
2. **Filler penalty (amplified)**: `−min(count × 0.5, 2.0) × 6.0` per generation. v45 doubles v36's 3.0 multiplier — the boost that pushed filler-free past 95 %.
|
| 163 |
3. **Format bonus**: +0.2 each for capital-leading and terminal punctuation.
|
| 164 |
+
4. **Substantive-deletion penalty** (inherited from v36): strip filler words from input, compute multiset deletion ratio. If `> 0.10`, apply `−10.0 × ramp` linearly scaling from 0 at 0.10 to 1.0 at 0.35 deletion.
|
| 165 |
5. **Preservation bonus**: `+1.5` when output/input word ratio is in `[0.70, 0.95]`.
|
| 166 |
+
6. **Number-accuracy term (new in v40, fixed in v42)**: extract digit signatures from output and reference (after stripping commas/hyphens between digits). If they match, `+5.0`. If reference has digits but output disagrees, `−5.0`. **If reference has no digits but output adds them, `−5.0`** (v42's fix that solved v40's preserve-case over-conversion).
|
| 167 |
+
|
| 168 |
+
### Number-data generation
|
| 169 |
+
|
| 170 |
+
Programmatic generator covering 11 categories with **guaranteed ground truth** (digit form generated first, spoken form derived). Bedrock Claude Haiku 4.5 was the original augmentation target; replaced with a local Qwen3.6-27B-FP8 SGLang container (`enable_thinking: false` to disable reasoning mode). 3,229 programmatic seeds × 4 variants → 12,757 augmented examples after digit-signature acceptance filtering (98.4 % accept rate).
|
| 171 |
|
| 172 |
+
### Why chained GRPO
|
| 173 |
|
| 174 |
+
v40 (single-pass GRPO from v39 with the basic combined reward) hit 92.4 % num + 93.8 % filler-free — strong but with a regression on `preserve` and `time` categories (model over-converted idioms). v42 fixed the over-conversion penalty (recovering preserve to 100 %), v43 amplified the number term to 5/-5 (regaining num to 95.3 %), v44 chained one more epoch (recovering `time` to 100 %), and v45 finally amplified the filler penalty (97.0 % filler-free + 95.9 % num — final).
|
| 175 |
|
| 176 |
+
The chained approach proved more controllable than reaching the target in one shot: each pass corrected one specific failure mode without disturbing the others.
|
| 177 |
|
| 178 |
### Dataset
|
| 179 |
|
| 180 |
+
**157,556 train / 7,121 val rows** in [juanquivilla/sotto-transcript-cleanup](https://huggingface.co/datasets/juanquivilla/sotto-transcript-cleanup), plus the **1,352-sample preservation set** and a **3,400-sample programmatic ITN set** (3,229 train + 171 stratified val) augmented to 12,757 by Qwen3.6-27B with digit-signature validation.
|
| 181 |
|
| 182 |
## All Variants
|
| 183 |
|
|
|
|
| 191 |
|
| 192 |
- Optimized for **English** conversational/meeting-style speech
|
| 193 |
- Domain-specific jargon (medical, legal) may not be corrected without additional fine-tuning
|
| 194 |
+
- `digit_by_digit` (phone numbers, account numbers spoken as individual digits with hyphens) is the weakest ITN category at ~60 % — produces correct digits but sometimes formats them differently from the reference
|
| 195 |
+
- Decimal conversion accuracy is 90 % (1/10 stratified val miss)
|
| 196 |
- The substantive-deletion metric is reference-free (compares output to input only, after filler-stripping) so it cannot catch *semantic* hallucinations — only word-level losses
|
| 197 |
- Not designed for formal written text — trained on spoken language patterns
|
| 198 |
|
config.json
CHANGED
|
@@ -18,7 +18,6 @@
|
|
| 18 |
"conv_use_xavier_init": true,
|
| 19 |
"dtype": "bfloat16",
|
| 20 |
"eos_token_id": 7,
|
| 21 |
-
"full_attn_idxs": null,
|
| 22 |
"hidden_size": 1024,
|
| 23 |
"initializer_range": 0.02,
|
| 24 |
"intermediate_size": 6656,
|
|
@@ -53,7 +52,7 @@
|
|
| 53 |
"rope_type": "default"
|
| 54 |
},
|
| 55 |
"tie_word_embeddings": true,
|
| 56 |
-
"transformers_version": "5.
|
| 57 |
"use_cache": false,
|
| 58 |
"use_pos_enc": true,
|
| 59 |
"vocab_size": 65536,
|
|
|
|
| 18 |
"conv_use_xavier_init": true,
|
| 19 |
"dtype": "bfloat16",
|
| 20 |
"eos_token_id": 7,
|
|
|
|
| 21 |
"hidden_size": 1024,
|
| 22 |
"initializer_range": 0.02,
|
| 23 |
"intermediate_size": 6656,
|
|
|
|
| 52 |
"rope_type": "default"
|
| 53 |
},
|
| 54 |
"tie_word_embeddings": true,
|
| 55 |
+
"transformers_version": "5.3.0",
|
| 56 |
"use_cache": false,
|
| 57 |
"use_pos_enc": true,
|
| 58 |
"vocab_size": 65536,
|
generation_config.json
CHANGED
|
@@ -5,5 +5,5 @@
|
|
| 5 |
7
|
| 6 |
],
|
| 7 |
"pad_token_id": 0,
|
| 8 |
-
"transformers_version": "5.
|
| 9 |
}
|
|
|
|
| 5 |
7
|
| 6 |
],
|
| 7 |
"pad_token_id": 0,
|
| 8 |
+
"transformers_version": "5.3.0"
|
| 9 |
}
|
model.safetensors
CHANGED
|
@@ -1,3 +1,3 @@
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:
|
| 3 |
size 708984464
|
|
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:b157b5499dc3ff418e449e669454fae67dd248152bfc13d008ff56abffec432f
|
| 3 |
size 708984464
|