Whisper Small Public Safety v2 (FINAL)
Fine-tuned OpenAI Whisper Small model adapted for public safety, dispatch, police, fire, and EMS radio transmissions.
This model was trained as part of the ScanScribe ecosystem for real-time dispatch audio transcription and incident intelligence.
Model Highlights & Domain Optimizations
- Base Architecture:
sepiaapps/whisper-small.en-police-radio - Numeric Inverse Text Normalization (ITN): Emits numbers as raw numeric digits (
193,1300,10-42) rather than spelled-out words (one-nine-three,thirteen-hundred), eliminating ambiguity for downstream CAD and dispatch parsers. - 10-Code Recognition: Specialized on standard police/fire 10-codes (e.g.
10-4,10-42,10-97). - Local Unit & Troop Identifiers: Trained on highway patrol and county radio callouts (e.g.
Troop-C). - Acoustic Adaptation: Tuned on authentic radio traffic with repeater clicks, squelch tails, and background static.
Evaluation Results
- Validation Word Error Rate (WER): 40.48% (evaluated against raw, unnormalized domain transcripts)
- Exact Sequence Accuracy: 10.77%
Usage
import torch
from transformers import WhisperForConditionalGeneration, WhisperProcessor
model_id = "xxbubziexx/whisper-small-public-safety-v2-FINAL"
processor = WhisperProcessor.from_pretrained(model_id)
model = WhisperForConditionalGeneration.from_pretrained(model_id)
# For police/fire dispatch, using an initial prompt helps guide formatting:
prompt = "10-4, Unit 119, 1300, Troop-C, Engine 4, en route."
prompt_ids = processor.get_prompt_ids(prompt)
# Transcribe audio array (16kHz mono float32)
# inputs = processor(audio, sampling_rate=16000, return_tensors="pt")
# predicted_ids = model.generate(inputs.input_features, prompt_ids=prompt_ids)
# transcription = processor.batch_decode(predicted_ids, skip_special_tokens=True)[0]