--- license: apache-2.0 language: [en] base_model: google/flan-t5-large pipeline_tag: text2text-generation library_name: transformers tags: - speech-to-text - transcript-formatting - asr-post-processing - dictation - knowledge-distillation --- # Flan-T5-Large Transcript Formatter (distilled, < 1 GB target) Raw speech-to-text transcript **in** → clean, formatted transcript **out** (punctuation, casing, filler/disfluency removal, ITN, homophones, proper nouns, URLs/emails, and layout). The model takes the **raw transcript as its only input** (no system prompt) and emits the formatted transcript. ## Distillation - **Teacher:** GPT-OSS-120B → Phase-1 distilled **GPT-OSS-20B** formatter, which reproduces the L0–L5 + RL curriculum behaviour at ~99.5% adjusted accuracy. - **Student:** `google/flan-t5-large` (783M, encoder–decoder). - **Method:** off-policy / sequence-level knowledge distillation (prompt distillation). Trained on **(raw → formatted)** pairs using the curriculum **gold** targets (cleaner than propagating the teacher's residual errors). ## Data Sampled from the layered curriculum (L0–L5 + RL), de-duplicated latest-layer-wins, with the per-layer val splits held out and made disjoint from train: **18,129 train / 2,713 validation** pairs, 21 formatting categories. ## Training | | | |---|---| | Hardware | 1× RTX 5090 (32 GB), bf16 | | Optimizer | Adafactor, lr 1e-4, warmup_ratio 0.03 | | Batch | 8 × grad-accum 2 = effective 16 | | Seq length | max 640 tokens (covers the longest pair, 552 tok; zero truncation) | | Regularization | gradient checkpointing; early stopping (patience 3), best-checkpoint by val loss | | Result | best **val loss 0.005784 @ step 2250 (~epoch 2.0)**; early-stopped at step 3000 | ![loss curves](loss_curves.png) ## Usage ```python from transformers import AutoTokenizer, AutoModelForSeq2SeqLM tok = AutoTokenizer.from_pretrained("Akash-Sakala/flan-t5-large-transcript-formatter") model = AutoModelForSeq2SeqLM.from_pretrained("Akash-Sakala/flan-t5-large-transcript-formatter") raw = "i went to the the store yesterday it was closed so i couldnt get the milk" ids = tok(raw, return_tensors="pt") print(tok.decode(model.generate(**ids, max_new_tokens=640, num_beams=1)[0], skip_special_tokens=True)) ``` ## Limitations A 783M student shows a capacity step-down from the 20B teacher on the hardest **L4 layout** cases (long email/list blocks); T5 was pretrained mostly at 512 tokens. For an int8, CPU-only deployment (< 1 GB) convert with CTranslate2. License Apache-2.0 (matches the `openai/gpt-oss` base and the curriculum dataset).