Skip to content

[Feature]: Expand the local STT model catalog — researched candidates beyond Plan-More-Models.md #200

Description

@Mr-Sunglasses

Summary

Plan-More-Models.md Phase 4 already sketches a tiered catalog expansion. This issue records fresh research (August 2026) into what has shipped in the ecosystem since that plan was written, what the bundled runtimes can already load today, and a concrete, ordered candidate list for both platforms. Nothing here changes architecture: every model is a runtime download against pinned SHA-256s, so APK/IPA size is unaffected.

Current state: Android 44 models (32 whisper.cpp GGML + 12 sherpa-onnx), iOS 35 models (23 WhisperKit Core ML + 12 sherpa-onnx). Catalog sources:

  • android/app/src/main/java/com/vocahq/vocaphone/local/LocalModelCatalog.kt and SherpaModelCatalog.kt
  • ios/VocaPhoneShared/LocalModelCatalog.swift + ios/VocaPhoneApp/Models/local_model_pins.json / sherpa_model_pins.json

Prerequisite stays Phase 0: pins are hand-assembled; tools/pin-model.py must exist before any bulk expansion.


What the bundled runtimes already support (verified in-tree)

Both platforms bundle sherpa-onnx v1.13.6, which is much more capable than the 7 wired families suggest.

Family Wired? Android iOS
nemoTransducer, senseVoice, moonshine, dolphinCtc, canary, nemoCtc, paraformer yes
zipformerCtc, wenetCtc, omnilingualAsrCtc, medasr, fireRedAsr, fireRedAsrCtc, funASRNano, qwen3Asr no Kotlin config classes exist (com/k2fsa/sherpa/onnx/OfflineRecognizer.kt:37–86), JNI symbols confirmed in libsherpa-onnx-jni.so structs exist in vendored c-api.h:937–1079
cohereTranscribe no config class exists (OfflineRecognizer.kt:105) absent from v1.13.6 c-api.h → needs a runtime bump

Cost per new family remains as the plan says (~20 lines of C + ~8 lines Kotlin + one enum case each side), with the greedy_search default rule (exit(-1) hazard) applying to every non-transducer family.


Tier A — new models in already-wired families (catalog rows only)

These need no engine code on either platform, only pins (+ descriptor + language claims):

  1. NeMo FastConformer CTC multilingual (~133 MB, 10 languages) — be/de/en/es/fr/hr/it/pl/ru/uk; plus per-language FastConformer CTC builds (de/es/pt, ~132 MB each). Lands in the wired nemoCtc family. Fills Slavic/Balkan coverage the catalog has zero entries for today.
  2. Moonshine multilingual tiny/base quantized — useful-sensors shipped JA/KO/ZH/ES/AR/UK/VI builds (tiny ≈ 73 MB ja/ko, base ≈ 142 MB). If they load through the wired moonshine family (verify per export), this gives the catalog its first sub-100 MB Japanese/Korean options.
  3. GigaAM v3 Russian — successor to the shipped giga-am-ctc-ru; ONNX exports available (istupakov/gigaam-v3-onnx, k2-fsa mirrors). Same NeMo families.
  4. SenseVoice Nano int8 (~265 MB) — same zh/en/ja/ko/yue set as SenseVoice with better reported accuracy. Verify whether it loads via the wired sense_voice family or needs funASR-nano config before pinning.
  5. Android whisper.cpp: enumerate missing GGML builds at the pinned revision (e.g. large-v1, missing quantizations) — mechanical, as planned (Plan-More-Models.md §8 Tier 1).
  6. iOS WhisperKit: enumerate remaining compressed variants at the pinned revision — note upstream argmaxinc/whisperkit-coreml HEAD is still the revision we already pin (97a5bf9…), so there are no new upstream variants; growth is purely within-repo enumeration.

Tier B — one new family each (bridge code + catalog rows)

  1. Omnilingual ASR CTC 300M int8 — highest strategic value. Meta's model covers 1,600+ languages (many with no other on-device option); official k2-fsa export csukuangfj/sherpa-onnx-omnilingual-asr-1600-languages-300M-ctc-int8-2025-11-12 is 348 MB, greedy-search CTC, auto-detecting, Apache-2.0. An improved v2 export exists (Feb 2026). Family struct present in both bundled runtimes. Coverage exceeds the picker's table → intersect and note surplus, exactly as Plan-More-Models.md §8 Tier 2 anticipates.
  2. Qwen3-ASR 0.6B int8 (~940 MB) — multilingual LLM-decoder recognizer; supported since sherpa-onnx 1.13.4, so both bundled runtimes can run it. Official export csukuangfj2/sherpa-onnx-qwen3-asr-0.6B-int8-2026-03-25. This updates Plan-More-Models.md §8 Tier 3: the plan expected to decline qwen3ASR on size grounds, but a 0.6B int8 now exists — it should move to "evaluate on flagship RAM floor" (likely ≥ 8 GB floor given CPU decode speed).
  3. FireRedASR2 CTC v2 (zh/en, Feb 2026)sherpa-onnx-fire-red-asr2-ctc-zh_en-int8-2026-02-25; stronger Mandarin than paraformer-zh-small. fireRedAsrCtc case exists in both runtimes.
  4. Zipformer transducers for thinly-covered languages — Vietnamese 30M int8 (35 MB!), Korean, Thai, Cantonese, bilingual zh-en, plus newly exported X-ASR non-streaming zipformer transducer models. Needs the single zipformerTransducer enum case (model_type left empty — see comment at LocalModelCatalog.kt:19). Best size-to-value ratio in the entire list.
  5. Zipformer CTC per-language models — unlocks another large per-language family; zipformerCtc case exists in both runtimes.
  6. WenetCtc — additional Mandarin coverage (already in plan).

Tier C — evaluate, likely decline for now

  1. Canary-1B-v2 (25 EU languages + X↔English AST, ~978M params) — would extend translation well beyond the 180M-flash four-way matrix, but the only sherpa-onnx int8 export is a community conversion (Sarphix/canary-1b-v2-sherpa-onnx-int8, Jul 2026) requiring non-obvious export fixes; k2-fsa has no official package (Canary 1b k2-fsa/sherpa-onnx#1767). Given our supply-chain posture (pinned SHA-256s, privacy docs' review requirement), decline until an official export lands. Revisit: it also needs a RAM floor around 6 GB.
  2. Cohere Transcribe 14-lang int8 (~2 GB, Apache-2.0) — SOTA-class accuracy but phone-hostile size; and the iOS bundled runtime lacks the family struct entirely. Decline now; revisit after any sherpa-onnx bump.
  3. Qwen3-ASR 1.7B int8 (~1.8 GB) — superseded by the 0.6B for phones.
  4. Voxtral Mini 4B — no sherpa-onnx export; WebGPU-class size (~2.3 GB at q4). Out of scope for these engines.

Suggested order

  1. Land tools/pin-model.py (Phase 0 gate).
  2. Tier A rows (no code) — start with FastConformer multilingual + whisper.cpp/WhisperKit enumeration.
  3. zipformerTransducer case + Zipformer vi/korean/thai/cantonese (smallest, biggest coverage win per byte).
  4. Omnilingual CTC 300M int8 (needs LanguageCoverage.only-exceeds-picker resolution + device pass).
  5. Qwen3-ASR 0.6B on flagship floor; FireRedASR2 CTC; wenetCtc last.
  6. Canary-1B-v2 / Cohere deferred pending official exports / runtime bump.

Every addition still requires: pinned revision + per-file SHA-256, honest languageCodes/detectsLanguage, RAM floors, a physical-device transcription pass, closed-vocabulary telemetry tests staying green, and fdroid flavor remaining whisper-only by construction (sherpaAvailable).

Verification

  • tools/pin-model.py --verify clean after each pin
  • just android ci / just ios ci
  • Device pass per model (app, OS, sequence in PR)

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions