On-device streaming speech recognition for Linux x86_64 + aarch64 — servers, containers, Pi 4/5, Jetson, Graviton
Project description
voxrt-asr
Streaming speech recognition for Linux x86_64 + aarch64. Custom Rust inference runtime, NeMo FastConformer (32 M parameters), 16 kHz mono PCM in, incremental UTF-8 text out. Cache-aware streaming with ~1.1 s emit cadence.
Runs on modern x86_64 servers (Haswell 2013+, Excavator 2015+) and aarch64 edge devices (Pi 4/5, Jetson, Graviton, industrial SBCs) on a glibc 2.17+ baseline. Measured streaming RTF ≈ 0.06-0.08 on an Intel WSL2 host (500-utterance LibriSpeech test-clean subset).
Companion to voxrt-asr-android (JitPack AAR) and voxrt-asr-ios (Swift Package Manager). Same runtime, same .vxrt model, same decoder schema.
Install
pip install voxrt-asr
One abi3 wheel covers Python 3.9 / 3.10 / 3.11 / 3.12 / 3.13 per arch.
Get the streaming ASR model:
curl -LO https://github.com/VoxRT/voxrt-asr-models/releases/download/v0.1.2/streaming_medium_pc.vxrt
SHA-256: <see-linked-repo>
Quick start — streaming
from voxrt_asr import AsrStreamingEngine, DecodeMode
# RNN-T is the SDK-wide recommended default (higher accuracy).
# Pass DecodeMode.CTC for the ~15 % cheaper head at ~1.6 pp higher WER.
engine = AsrStreamingEngine.from_path(
"streaming_medium_pc.vxrt",
mode=DecodeMode.RNNT,
)
for chunk in microphone_iter(): # list[float], 16 kHz mono, any length
text = engine.push_audio(chunk)
if text:
print(text, end="", flush=True)
final = engine.stop()
if final:
print(final)
Each push_audio returns the incremental text emitted by chunks
that completed during that call — often "" until ~1.12 s of audio
has accumulated, then a non-empty string every chunk boundary
(~1.12 s emit cadence, matching the streaming model's cache-aware
step). Concatenate the returned strings yourself if you need the full
utterance transcript.
Batch / whole-file transcription
The Linux SDK is streaming-only. To transcribe a pre-recorded file
in one shot (SRT / JSON export from a folder of WAVs, dataset
labelling, container transcription workers), push the whole buffer
through the streaming engine and flush with stop():
from voxrt_asr import AsrStreamingEngine, DecodeMode
engine = AsrStreamingEngine.from_path("streaming_medium_pc.vxrt")
parts = [engine.push_audio(pcm_float32_list)] # whole file at once
parts.append(engine.stop())
transcript = "".join(parts)
Reuse one engine across files — call reset() between them to clear
per-utterance state without reloading the weights.
Audio contract
- Sample rate: 16 000 Hz. No automatic resampling. Convert
from 44.1 / 48 kHz via
soundfile.resample,librosa.resample,torchaudio.resample, or ansox/ffmpegupstream stage. - Sample format:
list[float]PCM in[-1, 1](mono, native endian). If you haveint16samples frompyaudio/sounddevice/wave.readframes, divide by 32768.0 first. - Buffer size: any. The session buffers internally to its ~17 920-sample chunk boundary and emits text there.
- Latency: one chunk (~1.12 s) of inherent buffering.
Threading
The engine is a synchronous, stateful function — it does NOT own
a worker thread. Each push_audio blocks on the calling thread for
the duration of the inference work. Serialise push_audio / stop /
reset against each other on a given instance (single-thread-at-a-time
per handle). For multi-tenant serving, create one engine per stream —
they don't share state and the ~150 MB heap is per-session.
License
- Wrapper (this Python package): Apache-2.0.
- Compiled runtime
.sobundled inside the wheel: proprietary VoxRT Binary Use License, see LICENSE-BINARY. - Streaming ASR model weights: derived from
nvidia/stt_en_fastconformer_hybrid_medium_streaming_80ms_pc, CC-BY-4.0.
Commercial licensing for custom models, additional languages, on-premise fine-tuning, or bulk-device deployments: help@voxrt.com.
Links
- Umbrella README + full SDK docs: https://github.com/VoxRT/voxrt-asr-linux
- ASR model releases: https://github.com/VoxRT/voxrt-asr-models
- Android: https://github.com/VoxRT/voxrt-asr-android
- iOS: https://github.com/VoxRT/voxrt-asr-ios
- Bugs / questions: https://github.com/VoxRT/voxrt-asr-linux/issues
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file voxrt_asr-0.1.2-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: voxrt_asr-0.1.2-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 316.3 kB
- Tags: CPython 3.9+, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
299f15e8c68792100a7a5a25aba623643f915ed1cbe5bedea9e2bf16b8b0bb5e
|
|
| MD5 |
c5720b2fafb24cf4d4466510b0b15399
|
|
| BLAKE2b-256 |
a1828711854397c47766cdfa63c39066cfab712eddc7879d93675941c223c774
|
File details
Details for the file voxrt_asr-0.1.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.
File metadata
- Download URL: voxrt_asr-0.1.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
- Upload date:
- Size: 295.8 kB
- Tags: CPython 3.9+, manylinux: glibc 2.17+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f754e39cc72ac1c414dc5ebb15b1d4938a1b82fd486cf5d5915a2c2289b594f7
|
|
| MD5 |
32cc98186a017bf063ba7661a186e098
|
|
| BLAKE2b-256 |
73b225749f596497a341f25cef5654822f763904e23d24c3a93979ae5e80201b
|