Skip to content

Add accurate on-device Cantonese speech-to-text (SenseVoice-Small) #582

Description

@hoishing

The problem: Cantonese users have no accurate on-device option today

Cantonese is spoken by tens of millions of people across Hong Kong, Macau, Guangdong, and the global diaspora, yet it is consistently underserved by mainstream speech recognition. In FluidVoice specifically, none of the current on-device engines handle it well:

  • Parakeet TDT (the default on Apple Silicon) targets European languages + Japanese — it does not support Cantonese at all.
  • Whisper large-v3 can transcribe Cantonese, but only at roughly ~10% CER, and it is comparatively heavy and slow for real-time dictation.
  • Apple Speech quality on Cantonese is inconsistent and locale-dependent.

So a Cantonese speaker who wants fast, private, offline dictation currently has no good choice in FluidVoice. This is the gap I'd like to close.

Why SenseVoice-Small is the right fit

SenseVoice-Small (FunASR) is, by open benchmarks, the strongest open-source Cantonese ASR available, and its architecture happens to be ideal for a local-first menu-bar app:

  • Accuracy — In an independent multi-domain evaluation (AlienKevin/cantonese_asr_eval) it ranks Fluid deemed not safe for OS to allow opening #1 among open Cantonese models (~9.2% average CER, best in every domain but code-switching). Other benchmarks put it at ~7% CER vs Whisper-large-v3's ~10%. It was trained on ~9,600 hours of Cantonese.
  • Speed & footprint — It is non-autoregressive (single CTC head), so it predicts all tokens in parallel. Peak RAM is only ~0.3–0.5 GB, it runs on the Apple Neural Engine via CoreML, and its real-time factor is far below 1 (transcription faster than playback). The int8 build is ~215 MB.
  • Fits FluidVoice's model — Fully on-device (private, offline), tiny download, and a ready-made CoreML export exists at FluidInference/sensevoice-small-coreml.

It also covers Mandarin, English, Japanese, and Korean, so the same download benefits CJK users broadly — but Cantonese is the primary motivation.

Proposal

Add SenseVoice-Small as a selectable Voice Engine model with a language selector (Cantonese / Mandarin / Auto). Apple Silicon only; Intel falls back to a not-available stub.

Testing / evidence

I have a working implementation and verified it end-to-end against real 16 kHz audio: Cantonese (including Cantonese-specific vocabulary like 喺度 / 嘅 / 靚) transcribes correctly, long recordings are chunked to fit the model's 30 s input window, and RTF ≈ 0.14. Implementation PR: #579.

Happy to move this to an Ideas Discussion if maintainers prefer that per CONTRIBUTING.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions