VibeVoice-ASR-BitNet / litertlm_manifest.json
mlboydaisuke's picture
manifest 0.1.3: capabilities.thinking.control = never (what the bundle's template does about thinking, derived from the template inside the bundle)
a4099fc verified
Raw History Blame Contribute Delete
6.31 kB
{
"manifest_schema": "0.1.3",
"repo": "litert-community/VibeVoice-ASR-BitNet",
"generated": "2026-10-07",
"generator": "make_manifest.py",
"model": {
"display_name": "VibeVoice-ASR-BitNet (speech-to-text LLM, 24 kHz audio in)",
"base_model": "microsoft/VibeVoice-ASR-BitNet",
"architecture": "VibeVoice-ASR: σ-VAE acoustic encoder + semantic encoder (SEANet/ConvNeXt-1d, 24 kHz -> 7.5 Hz latents) -> projector -> Qwen2.5-1.5B-shaped BitNet (ternary) LM; LiteRT-LM generic audio path (raw-waveform frames, no mel)",
"parameters_b": 2.2,
"license": "mit",
"context_length": 2048,
"capabilities": {
"vision": false,
"audio": true,
"thinking": {
"declared": false,
"control": "never"
}
}
},
"variants": [
{
"file": "VibeVoice-ASR-BitNet.litertlm",
"sha256": "5ca907b0343d3e6bd9ec3dbf8aecbcc99b733633ef007a78a7e0f3502010af1b",
"size_bytes": 1983019248,
"sections": [
{
"type": "LlmMetadataProto",
"size_bytes": 1648
},
{
"type": "HF_Tokenizer_Zlib",
"size_bytes": 2141931
},
{
"type": "TFLiteModel",
"size_bytes": 237024176,
"model_type": "tf_lite_embedder"
},
{
"type": "TFLiteModel",
"size_bytes": 792689088,
"model_type": "tf_lite_prefill_decode"
},
{
"type": "TFLiteModel",
"size_bytes": 951122160,
"model_type": "tf_lite_audio_encoder_hw"
}
],
"quantization": "LM: per-tensor ternary weights (VibeASR.cpp absmean, applied at conversion) stored as int4 blockwise-128 min-max (exact for a ternary tensor), int8 embedding; audio encoder: int8 dynamic on linears, fp32 convs, 30 s (225-frame) window",
"backends": [
"cpu",
"gpu"
],
"default_backend": "cpu",
"min_runtime_version": "0.16.1",
"recommended": [
{
"platform": "macos",
"backend": "gpu",
"reason": "LM on Metal: 2045 tok/s prefill / 139 tok/s decode vs 357 / 59 on CPU; the audio encoder stays on CPU (audio_backend cpu) — on Metal/WebGPU the 30 s window exceeds the 65535 workgroup dispatch limit"
},
{
"platform": "android",
"backend": "gpu",
"reason": "Galaxy S26: LM on OpenCL 652 tok/s prefill / 36 tok/s decode vs 163 / 35 on CPU, transcripts match the Mac GPU run; the audio encoder must stay on CPU (audio_backend cpu) — on the GPU delegate it returns an empty transcript"
}
],
"requirements": {
"peak_ram_mb": 3227,
"platform_notes": [
"Audio only through the runtime's generic audio path: send the clip as an audio content item (wav/mp3/flac; any sample rate — the engine resamples to 24 kHz) plus the text 'This is a X.XX seconds audio, please transcribe it.' (X.XX = clip length); with no text the bundle's template sends 'Please transcribe it.' (+0.9 pp WER on the fixture set)",
"audio_backend must be cpu (--audio_backend=cpu / audio_backend=CPU()); the LM may run on gpu",
"The encoder window is 30 s; longer clips are chunked by the engine with a context reset at each 30 s boundary",
"Accuracy: 20 LibriSpeech dev-clean clips (448 words): WER 2.68 % on macOS CPU and 2.46 % LM-on-GPU (fp32 PyTorch reference 2.68 %), 3.12 % Galaxy S26 CPU, 2.46 % Galaxy S26 LM-on-GPU; vendor card Libri-clean 2.41 % (full test set, VibeASR.cpp)",
"Peak private footprint on Galaxy S26: 3227 MB CPU/CPU, 2268 MB LM-on-GPU (--report_peak_memory_footprint, 5.9 s clip)"
]
},
"measured": [
{
"device": "Apple M4 Max",
"os": "macOS",
"backend": "cpu",
"runtime": "litert-lm 0.16.0",
"prompt_tokens": 256,
"decode_tokens": 256,
"prefill_tps": 357.33,
"decode_tps": 59.29,
"ttft_s": 0.81,
"cache": "no",
"runs": 3,
"date": "2026-09-04",
"source": "litert-lm benchmark -p 256 -d 256 --runs 3 --cache no --backend cpu (text prompt; LM only)"
},
{
"device": "Apple M4 Max",
"os": "macOS",
"backend": "gpu",
"runtime": "litert-lm 0.16.0",
"prompt_tokens": 256,
"decode_tokens": 256,
"prefill_tps": 2044.72,
"decode_tps": 138.57,
"ttft_s": 0.13,
"load_s": 1.4,
"cache": "no",
"runs": 3,
"date": "2026-09-04",
"source": "litert-lm benchmark -p 256 -d 256 --runs 3 --cache no --backend gpu (text prompt; LM only; rested >= 300 s)"
},
{
"device": "Galaxy S26 (SM-S942Q)",
"os": "Android 16",
"backend": "cpu",
"runtime": "litert_lm_advanced_main v0.16.1 tag build",
"prompt_tokens": 264,
"prefill_tps": 163.01,
"decode_tps": 35.43,
"ttft_s": 1.65,
"peak_memory_mb": 3227,
"runs": 1,
"date": "2026-09-04",
"source": "--benchmark with a 264-token text prompt, one reading (LM only)"
},
{
"device": "Galaxy S26 (SM-S942Q)",
"os": "Android 16",
"backend": "gpu",
"runtime": "litert_lm_advanced_main v0.16.1 tag build",
"prompt_tokens": 264,
"prefill_tps": 652.54,
"decode_tps": 36.12,
"ttft_s": 0.43,
"peak_memory_mb": 2268,
"runs": 1,
"date": "2026-09-04",
"source": "--benchmark with a 264-token text prompt, one reading (LM only; audio encoder on CPU)"
}
],
"known_issues": [
"Audio encoder does not run on the GPU delegates: on Metal/WebGPU the 30 s window dispatches 90001+ workgroups per stem kernel (limit 65535); on Adreno (OpenCL, all 1857 nodes delegated) the fp16 path returns an empty transcript; keep audio_backend=cpu",
"Audio placeholder tokens <|object_ref_start|>/<|object_ref_end|>/<|box_start|> are added to the bundled tokenizer.json (ids 151646/151647/151648, the ids the model was trained with); the upstream tokenizer.json has no string for them"
]
}
]
}