Speech recognition directly from IMBE vocoder parameters — skip audio reconstruction entirely.
Evaluated on LibriSpeech-IMBE speaker-split validation (2,775 utterances). Input is 170-dim IMBE vocoder parameters at 4.4 kbps, not audio.
Conformer-CTC with character-level CTC decoding. Trained on ~1,220 hours of IMBE-encoded speech (LibriSpeech 960h + TEDLIUM 3 + GigaSpeech S), 30 epochs on 2x RTX 3090 Ti.
1import onnxruntime as ort, numpy as np
2
3session = ort.InferenceSession("model_int8.onnx")
4stats = np.load("stats.npz")
5features = ((raw_params - stats["mean"]) / stats["std"]).astype(np.float32)
6log_probs, out_lengths = session.run(None, {
7 "features": features.reshape(1, -1, 170),
8 "lengths": np.array([features.shape[0]], dtype=np.int64),
9})
1import onnxruntime as ort, numpy as np
2from pyctcdecode import build_ctcdecoder
3
4session = ort.InferenceSession("model_int8.onnx")
5stats = np.load("stats.npz")
6
7VOCAB = list(" ABCDEFGHIJKLMNOPQRSTUVWXYZ'")
8labels = [""] + VOCAB
9decoder = build_ctcdecoder(
10 labels=labels,
11 kenlm_model_path="lm/5gram.bin",
12 unigrams=open("lm/unigrams.txt").read().splitlines(),
13 alpha=0.7, # LM weight — tuned on LibriSpeech-IMBE
14 beta=2.0, # word insertion bonus
15)
16
17features = ((raw_params - stats["mean"]) / stats["std"]).astype(np.float32)
18log_probs, out_lengths = session.run(None, {
19 "features": features.reshape(1, -1, 170),
20 "lengths": np.array([features.shape[0]], dtype=np.int64),
21})
22text = decoder.decode(log_probs[0, :out_lengths[0]], beam_width=100)
P25 radio uses the IMBE vocoder (4.4 kbps, proprietary DVSI codec). The open-source libimbe is a reverse-engineered approximation. Standard ASR pipelines reconstruct audio from codec parameters then extract features — losing information at every step.
We skip reconstruction. The 170-dim vocoder parameters (f0, spectral amplitudes, voicing flags, harmonic mask) already encode phonetic information. A Conformer-CTC model learns to read them directly.
1@misc{imbe-asr-2026,
2 title={IMBE-ASR: Speech Recognition Directly from Vocoder Parameters},
3 url={https://github.com/trunk-reporter/imbe-asr},
4 year={2026}
5}