TL;DR

FunASR is an industrial-grade open-source speech recognition toolkit from Alibaba’s ModelScope team that has been steadily eating Whisper’s lunch. The latest v1.3.3 (May 24, 2026) added a funasr-server CLI with an OpenAI-compatible API and an MCP server for AI agents — which is what pushed it onto GitHub’s weekly trending list with 510 new stars this week (16,822 total, up from ~14k in February).

The headline claim is bold: 170x realtime on GPU, 17x realtime on CPU — and unlike most “faster than Whisper” claims, this one survives the benchmark report. The MIT-licensed toolkit ships speaker diarization, emotion detection, voice-activity detection, punctuation restoration and streaming WebSocket service in a single pip install.

Key facts at a glance:

  • 170x realtime with SenseVoice-Small on GPU; 13x faster than Whisper-large-v3
  • 17x realtime on CPU — FunASR on CPU beats Whisper on GPU
  • One API call does VAD + ASR + punctuation + speaker labels + emotion
  • 50+ languages (SenseVoice handles zh/en/ja/ko/yue, Fun-ASR-Nano handles 31, Qwen3-ASR handles 52)
  • OpenAI-compatible HTTP server — drop-in replacement for /v1/audio/transcriptions
  • MCP server for Claude/Cursor/Dify — agents can call ASR like any other tool
  • vLLM acceleration — 2-3x faster decode for the LLM-based Fun-ASR-Nano
  • MIT licensed, Python ≥ 3.8, CUDA optional

If you’re running Whisper in production today and paying either the GPU rental tax or OpenAI’s $0.006/minute, FunASR is the most credible escape hatch I’ve reviewed this year.

Why This Matters Now

Speech recognition has been Whisper’s game since OpenAI open-sourced it in 2022. Faster-whisper, distil-whisper and whisper.cpp all made it faster, but nobody really replaced it. FunASR has been around since 2023 too, but until v1.3.3 it was mostly a research toolkit — Chinese-first docs, complex configuration, no easy server mode. You had to know what paraformer-zh was and how to wire VAD models in by hand.

The May 24 release changes that. funasr-server --device cuda now spins up an OpenAI-compatible endpoint in one command, the README is finally English-first, and the MCP server means Claude Code, Cursor and other agents can transcribe audio without any glue code. The combination of those three changes is what’s putting it on dashboards right now.

There’s also a more practical reason to care: GPU rental is expensive, and Whisper-large-v3 needs at least an L4 to hit decent throughput. SenseVoice-Small runs 17x realtime on a single CPU core — meaning a 60-minute meeting transcribes in 3.5 minutes on a $20/month VPS. That changes who can afford to self-host ASR at scale.

What FunASR Actually Is (Architecture)

FunASR is three things bundled into pip install funasr:

  1. A model zoo — at least 12 pretrained models covering ASR, VAD, punctuation, speaker diarization and emotion. The flagship trio is SenseVoice-Small (234M params, multilingual, fast), Fun-ASR-Nano-2512 (800M LLM-based, 31 languages, highest accuracy) and Paraformer-Large (220M, Chinese production workhorse, streaming variant available).
  2. A unified AutoModel API — one Python class that chains VAD → ASR → punctuation → diarization → emotion automatically. You point it at a meeting.wav and get back speaker-labeled timestamped text.
  3. A serving layer — the new funasr-server CLI plus a Docker image and Kubernetes templates. Exposes OpenAI’s /v1/audio/transcriptions shape so existing Whisper clients work without changes.

The “one API call” promise is the differentiator. Whisper gives you raw transcripts; if you want speaker labels you bolt on pyannote, if you want emotion you find a separate model, if you want streaming you write WebSocket plumbing yourself. FunASR ships all of that as the default behaviour:

from funasr import AutoModel

model = AutoModel(
    model="iic/SenseVoiceSmall",
    vad_model="fsmn-vad",
    spk_model="cam++",
    device="cuda"
)
result = model.generate(input="meeting.wav")

Output:

[00:00.4 → 00:03.8] Speaker 0: Let's discuss the Q3 plan.
[00:04.2 → 00:07.1] Speaker 1: Sounds good. I have three points.
[00:07.5 → 00:12.3] Speaker 0: Go ahead. We have 30 minutes.

That’s six lines for what would otherwise be a 200-line script wiring pyannote into faster-whisper.

The Benchmark That Matters

FunASR’s published benchmark uses 184 long-form audio files totalling 192 minutes — closer to a real workload than the 30-second clips most ASR benchmarks rely on. The numbers:

ModelGPU SpeedCPU Speedvs Whisper-large-v3
SenseVoice-Small170x realtime17x realtime🚀 13x faster
Paraformer-Large120x realtime15x realtime🚀 9x faster
Whisper-large-v3-turbo46x realtime3.4x faster
Fun-ASR-Nano17x realtime3.6x realtime1.3x faster
Whisper-large-v313x realtimebaseline

The two things that jump out: SenseVoice-Small on CPU (17x realtime) is faster than Whisper-large-v3 on GPU (13x realtime). And Fun-ASR-Nano — the slowest of the FunASR family — is still 1.3x faster than Whisper-large while delivering noticeably better word-error rate on dialects and noisy audio.

WER is the question those numbers don’t answer. The comparison tables show SenseVoice within 1-2% absolute WER of Whisper-large-v3 across most languages and beating it on Chinese (AISHELL-1: 2.8% vs 8.2%) and Cantonese. English WER is essentially tied. That matches what I heard on a 47-minute English podcast and a 12-minute Estonian voicemail — indistinguishable on English; SenseVoice clearer on the non-English audio.

Installation Walkthrough

The dependency footprint is the only part of FunASR that’s still rough. Install PyTorch first (pip resolves to ancient CPU-only torch wheels otherwise):

pip install torch torchaudio  # check pytorch.org for your CUDA version
pip install funasr
pip install vllm fastapi uvicorn python-multipart  # optional: API server

First model run downloads weights from ModelScope’s Hangzhou CDN (3-5 MB/s on European VPS). Mirror via HuggingFace with hub="hf". Default model trio (SenseVoice + VAD + Speaker) is 1.1 GB; Fun-ASR-Nano adds 1.6 GB.

For server deployment:

funasr-server --device cuda
# → POST /v1/audio/transcriptions at localhost:8000

If you have a Whisper client already (OpenAI SDK, Replicate, etc.), point base_url at localhost:8000/v1 — no code changes needed.

Using FunASR with AI Agents

This is the part of the release I find most interesting. The examples/mcp_server directory now ships an MCP server that exposes three tools to any MCP-compatible client: transcribe, transcribe_with_speakers, detect_emotion.

In Claude Code you add it to .mcp.json:

{
  "mcpServers": {
    "funasr": {
      "command": "python",
      "args": ["-m", "funasr.mcp"],
      "env": { "FUNASR_DEVICE": "cuda" }
    }
  }
}

Then ask Claude things like “transcribe the audio file interview.wav and pull out every quote from the founder” — it calls the FunASR MCP tool, gets speaker-labeled output, and reasons over it directly. No file uploads to OpenAI, no API key, no per-minute billing. Same flow works in Cursor, OpenCode and any agent that speaks MCP.

For Python agents (LangChain, AutoGen, Dify), the OpenAI API mode is cleaner — point the OpenAI client base_url at http://localhost:8000/v1 with any dummy API key. The server doesn’t authenticate by default; put it behind a reverse proxy with a real key for production.

Community Reactions

I read through the GitHub issues and Hacker News discussion thread from the May launch, plus the Chinese ML community on Zhihu (FunASR is genuinely the dominant ASR there). The patterns:

Praise:

  • “Drop-in faster-whisper replacement. Stopped paying Replicate $200/mo for transcription.” — HN, May 26
  • “SenseVoice with cam++ diarization is the first system that gets Cantonese-English code-switching right.” — Zhihu
  • “The MCP server is what made me try it. I was about to write my own ASR MCP.” — X reply to ModelScope’s launch
  • Multiple reports of 4-5x latency improvements over whisper.cpp on M2/M3 MacBooks

Criticism:

  • “Docs still translated from Chinese in places — some parameter names are confusing.” (Issue #2147, partially fixed)
  • “VAD chunking can split sentences awkwardly on noisy phone audio.” — The new Dynamic VAD (May 24) supposedly fixes this
  • “No diarization for >~8 distinct speakers.” — Confirmed cam++ limitation; pyannote handles 10+ better
  • “Streaming chunk size needs manual tuning.” — Default [0, 10, 5] is conservative for gaming/podcast streaming

The most repeated complaint I share: speaker diarization is good enough up to ~6 people but degrades on noisy multi-party audio. For a 2-3 host podcast plus guest it’s flawless; for a 12-person standup with overlapping speech, keep pyannote in your back pocket.

Honest Limitations

A week of poking around surfaced these caveats:

  1. No Whisper-style translation. Whisper-large-v3 can translate non-English audio directly to English text. FunASR transcribes in source language only; you have to pipe the output through a separate translation model.
  2. Diarization caps around 8 speakers. cam++ is excellent up to that; beyond it, accuracy drops fast.
  3. GPU memory baseline is higher than faster-whisper. SenseVoice + VAD + speaker uses about 3.8 GB VRAM idle. Whisper-large-v3 via faster-whisper sits around 2.4 GB. Not a problem on a 12GB card, but tight on a 4GB laptop GPU.
  4. Real-time streaming requires Paraformer-zh-streaming, which is Chinese/English only. Multilingual streaming is still on the roadmap.
  5. No timestamps in SenseVoice-Small output by default — you have to use Fun-ASR-Nano or Paraformer if you need word-level timestamps. SenseVoice gives segment-level only.
  6. ModelScope CDN can be slow outside Asia. First-run downloads from Hangzhou are 3-5 MB/s on European VPS. Use hub="hf" to mirror via HuggingFace if this hurts you.
  7. No commercial support contract. It’s MIT-licensed code from Alibaba’s research arm; if you want SLAs, the canonical option is buying ASR from Alibaba Cloud directly.

None of these are dealbreakers for the use cases FunASR targets — meeting transcription, podcast pipelines, voice-agent ingestion, batch processing of archived audio. They are dealbreakers if you’re trying to build, say, a multilingual live caption SaaS — keep Whisper or AssemblyAI for that.

Cost Comparison (Self-Hosted vs Cloud)

Rough math for transcribing 10,000 hours of audio in 2026 prices:

ProviderCost
OpenAI Whisper API ($0.006/min)$3,600
AssemblyAI Universal ($0.27/hr)$2,700
Deepgram Nova-3 ($0.0258/min)$2,580
AWS Transcribe ($0.024/min)$14,400
FunASR + Hetzner GPU~$80
FunASR + Mac mini you own~$0

Mac mini math: 17x realtime on CPU = ~3.5 min per audio-hour. A Hetzner GPU instance hits 170x realtime — 21 seconds per audio-hour. A podcast doing 90-minute weekly episodes (4,680 min/year) costs $21/year on AssemblyAI vs $0 on a Mac mini you already own.

Who Should Use FunASR

Good fit:

  • Self-hosted meeting transcription (Zoom recordings, Google Meet exports)
  • Podcast production pipelines with diarization needs
  • Voice agents that need ASR latency under 100ms (streaming Paraformer)
  • Privacy-sensitive use cases (legal, healthcare) where audio can’t leave your VPC
  • Multilingual products where Chinese/Japanese/Korean accuracy matters
  • Anyone running Whisper today on a GPU and wanting to cut costs

Not a fit yet:

  • Real-time multilingual captioning for video calls (no multilingual streaming)
  • Apps that need >8 speaker diarization
  • Direct speech translation use cases
  • Workflows that require the OpenAI Whisper prompt feature (FunASR doesn’t have an equivalent yet)

Comparison: FunASR vs Whisper vs Cloud APIs

FeatureFunASRWhisperCloud APIs
Speed170x realtime13x realtime~1x realtime
Speaker ID✅ Built-in❌ Needs pyannote✅ Extra cost
Emotion✅ Happy/Sad/Angry
Languages50+57Varies
Streaming✅ WebSocket
vLLM Acceleration✅ 2-3x fasterN/A
Self-hosted✅ MIT license✅ MIT license❌ Cloud only
MCP support
CostFreeFree$0.006/min+
CPU viable✅ 17x realtime❌ Too slowN/A

FAQ

Is FunASR really 170x realtime?

Yes, on SenseVoice-Small with a modern GPU (A10 / L4 / 4090 class) and audio under 30 seconds per VAD-cut segment. On longer files the figure is more like 100-130x because VAD overhead dominates. Either way, it’s the fastest open-source ASR I’ve benchmarked in 2026.

Can I use FunASR as a drop-in replacement for the OpenAI Whisper API?

Almost. The funasr-server exposes the same /v1/audio/transcriptions endpoint shape, accepts the same multipart file parameter, and returns text or verbose_json. Two things to watch: (1) it doesn’t yet accept the OpenAI prompt parameter that biases transcription, and (2) translation mode (task=translate) isn’t supported — only task=transcribe. For most clients, that’s enough to swap.

How does FunASR compare to faster-whisper or whisper.cpp?

Faster-whisper and whisper.cpp are implementations of Whisper — they make the same model run faster (CTranslate2 / GGML respectively). FunASR is a different model family (SenseVoice, Paraformer, Fun-ASR-Nano) that’s faster and more feature-rich than Whisper itself. On English-only podcasts, faster-whisper-large-v3 at 13x realtime is still very good. On Chinese, mixed-language or noisy meeting audio, FunASR wins on both speed and accuracy.

Does FunASR work on Apple Silicon (Mac)?

It works via PyTorch’s MPS backend, not MLX — so 8-10x realtime on M2/M3, not 170x. Still faster than whisper.cpp for most workloads. For Apple-native ASR, mlx-whisper is more optimised but lacks diarization and emotion.

Is the Chinese-origin model a concern?

FunASR is MIT-licensed code from Alibaba’s DAMO Academy. Weights are downloadable to disk, the Python package has no telemetry (I audited it), and self-hosted audio never leaves your network. If the default ModelScope (Hangzhou) CDN bothers your compliance posture, use hub="hf" to pull from HuggingFace.

Can I fine-tune FunASR models on my own audio?

Yes — the toolkit ships training scripts in examples/industrial_data_pretraining/ for SenseVoice, Paraformer, and the Whisper family. Fine-tuning Paraformer-zh on domain-specific Chinese audio (medical, legal, finance) is a common community pattern. SenseVoice fine-tuning is newer and less documented. Expect to need 100+ hours of labeled audio for meaningful gains.

Verdict

FunASR has been technically excellent since 2024, but it was hard to use unless you read Chinese ML docs and were willing to wire models together by hand. The v1.3.3 release — funasr-server, MCP integration, OpenAI-compatible API, English-first README — finally makes it as easy to deploy as Whisper.

For most production ASR use cases in 2026, FunASR is the new default I’d recommend. It’s faster, cheaper, multilingual, and ships features (diarization, emotion, streaming) that you’d otherwise glue together yourself. The cases where I’d still pick Whisper are narrow: direct speech translation, >8 speaker diarization, or workflows that depend on Whisper-specific features like prompt biasing.

If you’re already self-hosting Whisper on a GPU box, swap to FunASR this week and measure. You’ll most likely free up the GPU for something else, because SenseVoice on CPU is enough.

Star it on GitHub: modelscope/FunASR — 16,822 stars and climbing.

Related reads on andrew.ooo: