feat(site): launch the FunASR deployment product hub (#3424)

* docs: design product deployment hub

* docs(site): plan deployment product hub implementation

* feat(site): add deployment evidence registry

* feat(site): add deployment recommendation engine

* build(site): track reproducible live-site corpus

* feat(site): build bilingual deployment product surface

* feat(site): add deployment contracts and benchmarks

* feat(site): preserve legacy routes and unify navigation

* ci(site): validate reproducible product builds

* ops(site): add atomic releases and hardened nginx

* test(site): add responsive product browser coverage

* fix(site): support managed and manual nginx masters

* fix(site): make release smoke routes configurable

* docs(site): record product hub rollout

---------

Co-authored-by: LauraGPT <[email protected]>
This commit is contained in:
zhifu gao
2026-07-27 01:45:30 +08:00
committed by GitHub
co-authored by LauraGPT
parent 02cc93d11f
commit 84e049ed48
165 changed files with 22869 additions and 0 deletions
+70
View File
@@ -0,0 +1,70 @@
name: Product site
on:
pull_request:
paths:
- 'web-pages/product-site/**'
- 'web-pages/scripts/**'
- 'web-pages/nginx/**'
- '.github/workflows/product-site.yml'
push:
branches: [main]
paths:
- 'web-pages/product-site/**'
- 'web-pages/scripts/**'
- 'web-pages/nginx/**'
permissions:
contents: read
jobs:
build-and-validate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.11'
cache: pip
cache-dependency-path: web-pages/product-site/requirements-site.txt
- name: Install site dependencies
run: python -m pip install -r web-pages/product-site/requirements-site.txt
- name: Run product-site tests
run: python -m pytest web-pages/product-site/tests -q
- name: Build and validate twice
run: |
python web-pages/product-site/build.py --output /tmp/funasr-site-a
python web-pages/product-site/validate.py /tmp/funasr-site-a
python web-pages/product-site/build.py --output /tmp/funasr-site-b
python web-pages/product-site/validate.py /tmp/funasr-site-b
diff -qr /tmp/funasr-site-a /tmp/funasr-site-b
browser:
runs-on: ubuntu-latest
needs: build-and-validate
defaults:
run:
working-directory: web-pages/product-site/tests/browser
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.11'
cache: pip
cache-dependency-path: web-pages/product-site/requirements-site.txt
- uses: actions/setup-node@v4
with:
node-version: '22'
cache: npm
cache-dependency-path: web-pages/product-site/tests/browser/package-lock.json
- name: Install site dependencies
working-directory: .
run: python -m pip install -r web-pages/product-site/requirements-site.txt
- name: Install browser dependencies
run: npm ci
- name: Install Chromium
run: npx playwright install --with-deps chromium
- name: Run browser tests
env:
SITE_PYTHON: python
run: npx playwright test --config playwright.config.ts
+1
View File
@@ -25,3 +25,4 @@ modelscope_models
examples/aishell/llm_asr_nar/*
*egg-info
env/
web-pages/product-site/tests/browser/node_modules/
@@ -0,0 +1,88 @@
# FunASR.com product-site release
## Production record
- Released: `2026-07-26`
- Source commit: `5a51d04d684528f1884f7c0a6e95d33748bb3805`
- Product release: `20260726T171818Z`
- Previous release: `20260726T171800Z`
- Current link: `/root/FunASR/web-pages/current`
- Release root: `/root/FunASR/web-pages/releases`
- Backup root: `/root/FunASR/web-pages/backups/product-site-20260726T171818Z`
- Build archive SHA-256: `f1184ff9c1b8b7130d146549ed911e2349eee93f6c0d745d526da02cb5412280`
- Active Nginx SHA-256: `241eebf7f0b2aa7a148ccb2c8c8ab58818efba9a37b8dc7392b25076d18a994d`
The build from the final source commit was byte-identical to the reviewed build from `caa948d9`. The final two commits only change release-script behavior.
## Backup evidence
The pre-release site and Nginx configuration were archived before the first switch.
| Artifact | SHA-256 |
| --- | --- |
| `live-dist.tar.gz` | `61f79a97d7a6677b1b11e01b18f03cdff1bef617960769549256244e489687f5` |
| `nginx.conf` | `46da00bd6c51b19b22a21658f141417653327fb670bf58cb574311c337e469dc` |
| `live-dist.sha256` | `a9e26f1b50deb759902a011351aefc70e356cdccdca3f8ce571b88ffeddb7395` |
The previous release was checked against the backup manifest before the rollback exercise: 289 immutable files matched. `stats/data.json` is excluded from that comparison because the legacy statistics process writes it continuously.
## Verification
- Python suite: 41 passed.
- Playwright suite: 7 passed at 390x844, 768x1024, 1440x900, and 1920x1080.
- Static validator: 92 HTML pages passed before upload, after upload, and after release copy.
- Public smoke: 25 pages, 5 fixed redirects, security headers, HTML no-cache, and one hashed immutable asset passed.
- TLS: TLS 1.2 and TLS 1.3 handshakes passed; the 443 server only enables those protocols.
- Production screenshots at 390x844 and 1440x900 were byte-identical to the committed reference screenshots.
- Rollback was exercised from `20260726T171818Z` to `20260726T171800Z`, the legacy home/blog/donor/llama routes passed, and the product release was restored and revalidated.
## Release commands
The host runs an existing manually started Nginx master rather than the failed systemd unit. Discover its PID before each operation:
```bash
pgrep -a nginx
```
Deploy a new validated output directory:
```bash
PYTHONPATH=/root/.cache/funasr-ops/product-site-python \
NGINX_MASTER_PID=<master-pid> \
VALIDATOR=/root/FunASR/web-pages/ops/product-site/validate.py \
PYTHON_BIN=python3 \
/root/FunASR/web-pages/ops/product-site/deploy-product-site.sh \
/path/to/validated-output YYYYMMDDTHHMMSSZ
```
Roll back to a product-site release:
```bash
PYTHONPATH=/root/.cache/funasr-ops/product-site-python \
NGINX_MASTER_PID=<master-pid> \
VALIDATOR=/root/FunASR/web-pages/ops/product-site/validate.py \
PYTHON_BIN=python3 \
/root/FunASR/web-pages/ops/product-site/rollback-product-site.sh YYYYMMDDTHHMMSSZ
```
Restore the pre-release Nginx configuration only if the new configuration is implicated:
```bash
cp -a /root/FunASR/web-pages/backups/product-site-20260726T171818Z/nginx.conf /etc/nginx/nginx.conf
nginx -t
kill -HUP <master-pid>
```
## Monitoring
Check after one hour and again after 24 hours:
```bash
tail -200 /var/log/nginx/error.log
tail -200 /var/log/nginx/funasr-conversions.log
curl -fsSI https://www.funasr.com/
curl -fsSI https://www.funasr.com/deploy/vllm.html
curl -fsSI https://www.funasr.com/blog/
```
Roll back on elevated 5xx responses, missing indexed routes, mobile overflow, missing assets, invalid conversion redirects, or a failed static validation.
@@ -0,0 +1,596 @@
# FunASR Product Deployment Hub Implementation Plan
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** Build and publish a bilingual, evidence-backed deployment product center on `www.funasr.com` that guides users to vLLM, llama.cpp/GGUF, OpenAI-compatible API, real-time, container, and CPU production paths.
**Architecture:** A Python 3.11 static-site builder reads one bilingual JSON deployment registry, renders Jinja2 templates, copies a tracked legacy-site snapshot, and validates every generated route before publishing. The production host receives immutable versioned releases; Nginx switches an atomic `current` symlink, records fixed outbound conversions, and can roll back to the prior release without rebuilding.
**Tech Stack:** Python 3.11, Jinja2 3.1.6, Beautiful Soup 4.13.4, pytest 8.4.1, dependency-free HTML/CSS/JavaScript, bundled Lucide SVG assets, Nginx, Playwright.
## Global Constraints
- The site is bilingual Chinese and English; every new canonical route has a language pair with identical structure.
- Production claims require a verification date, tested version, evidence URL, smoke test, and explicit limitation.
- Existing indexed routes remain available; `/llama-cpp.html` and `/en/llama-cpp.html` remain permanent compatibility entries.
- The live server remains Nginx-only and receives complete static output, never a Python runtime.
- Generated assets use content-hashed filenames; HTML is no-cache and immutable assets are cached long term.
- Primary navigation order is Product, Deploy, Models, Benchmarks, Ecosystem, Blog, Docs, Donors; Donors remains last.
- Use white and near-black foundations, cobalt actions, green verified state, amber limitations, 4-8 px corners, zero negative letter spacing, and no decorative gradients or blobs.
- The hero uses a custom bitmap with no generated text; terminal and API output remains inspectable HTML.
- No public inference API, authentication layer, rate limiter, or Prometheus service is added in this website release.
- Every production deployment creates a new immutable release directory and retains the previous release for rollback.
---
## File Structure
```text
web-pages/product-site/
assets/
css/site.css
images/deployment-topology.webp
js/site.js
lucide/
content/
legacy-manifest.json
data/
deployments.json
navigation.json
legacy/
templates/
base.html
home.html
deploy-index.html
deploy-detail.html
benchmarks.html
404.html
tests/
test_build.py
test_registry.py
test_selector.py
test_legacy.py
test_output.py
build.py
registry.py
selector.py
legacy.py
validate.py
requirements-site.txt
web-pages/scripts/
import-live-site.sh
deploy-product-site.sh
rollback-product-site.sh
web-pages/nginx/
funasr.com.conf
conversion-map.conf
docs/superpowers/plans/2026-07-26-funasr-product-deployment-hub-implementation.md
```
`registry.py` owns schema and evidence validation. `selector.py` owns deterministic recommendations. `legacy.py` owns parser-based navigation normalization. `build.py` composes those modules and writes output. `validate.py` checks a complete output directory without changing it. Templates contain page structure only; data and claims live in `deployments.json`.
---
### Task 1: Static Builder Contract and Registry Validation
**Files:**
- Create: `web-pages/product-site/requirements-site.txt`
- Create: `web-pages/product-site/registry.py`
- Create: `web-pages/product-site/data/deployments.json`
- Create: `web-pages/product-site/data/navigation.json`
- Test: `web-pages/product-site/tests/test_registry.py`
**Interfaces:**
- Produces: `load_registry(path: Path) -> dict[str, object]`
- Produces: `validate_registry(data: dict[str, object]) -> list[str]`
- Produces: `deployment_pairs(data: dict[str, object]) -> list[tuple[dict, dict]]`
- Registry entry ids: `vllm`, `llama-cpp`, `openai-api`, `realtime`, `containers`, `cpu-runtime`, `production`
- [ ] **Step 1: Pin build dependencies**
```text
Jinja2==3.1.6
beautifulsoup4==4.13.4
pytest==8.4.1
```
- [ ] **Step 2: Write failing registry tests**
```python
def test_production_entry_requires_evidence():
data = valid_registry()
del data['deployments'][0]['evidence']
assert validate_registry(data) == ['vllm: production-verified entry requires evidence']
def test_language_pairs_have_identical_fields():
data = load_registry(REGISTRY)
assert validate_registry(data) == []
assert all(set(zh) == set(en) for zh, en in deployment_pairs(data))
def test_registry_has_all_product_routes():
data = load_registry(REGISTRY)
assert {item['id'] for item in data['deployments']} == {
'vllm', 'llama-cpp', 'openai-api', 'realtime',
'containers', 'cpu-runtime', 'production',
}
```
- [ ] **Step 3: Run the tests and verify the missing-module failure**
Run: `python3.11 -m pytest web-pages/product-site/tests/test_registry.py -q`
Expected: FAIL because `registry.py` and `deployments.json` do not exist.
- [ ] **Step 4: Implement strict registry validation**
`validate_registry` must reject duplicate ids/routes, missing language fields, invalid maturity values, missing production evidence, malformed `https://` evidence URLs, missing limitations, and benchmark records without model/runtime/hardware/workload/settings/source/verified date. Return stable `"<entry id>: <reason>"` messages rather than raising on content errors.
- [ ] **Step 5: Add evidence-backed registry records**
Populate all seven entries from repository docs and releases. Each command, alias, tested version, and benchmark source must resolve to a tracked FunASR document or GitHub release. Mark entries `community-verified` when a complete production verification record is unavailable.
- [ ] **Step 6: Run registry tests**
Run: `python3.11 -m pytest web-pages/product-site/tests/test_registry.py -q`
Expected: PASS.
- [ ] **Step 7: Commit the registry contract**
```bash
git add web-pages/product-site/requirements-site.txt web-pages/product-site/registry.py web-pages/product-site/data web-pages/product-site/tests/test_registry.py
git commit -S -m "feat(site): add deployment evidence registry"
```
### Task 2: Deterministic Deployment Selector
**Files:**
- Create: `web-pages/product-site/selector.py`
- Test: `web-pages/product-site/tests/test_selector.py`
**Interfaces:**
- Consumes: validated deployment entries from `load_registry`
- Produces: `recommend(entries: list[dict], workload: str, hardware: str, priority: str) -> dict`
- Accepted workload values: `batch`, `realtime`, `private-api`, `edge`
- Accepted hardware values: `nvidia-gpu`, `cpu`, `desktop-edge-gpu`, `kubernetes`
- Accepted priority values: `throughput`, `latency`, `portability`, `compatibility`
- [ ] **Step 1: Write recommendation tests**
```python
@pytest.mark.parametrize(('workload', 'hardware', 'priority', 'expected'), [
('batch', 'nvidia-gpu', 'throughput', 'vllm'),
('edge', 'cpu', 'portability', 'llama-cpp'),
('private-api', 'kubernetes', 'compatibility', 'containers'),
('realtime', 'nvidia-gpu', 'latency', 'realtime'),
])
def test_recommendation_matrix(workload, hardware, priority, expected, entries):
assert recommend(entries, workload, hardware, priority)['id'] == expected
def test_unknown_selector_value_is_rejected(entries):
with pytest.raises(ValueError, match='Unsupported hardware: tpu'):
recommend(entries, 'batch', 'tpu', 'throughput')
```
- [ ] **Step 2: Verify tests fail**
Run: `python3.11 -m pytest web-pages/product-site/tests/test_selector.py -q`
Expected: FAIL because `selector.recommend` does not exist.
- [ ] **Step 3: Implement table-driven scoring**
Score only exact registry capabilities. Break ties by the registry's numeric `selector_rank`, then stable id. Return the full winning entry plus `selection_reason` and `primary_limitation`; never infer unsupported hardware or maturity.
- [ ] **Step 4: Run selector tests**
Run: `python3.11 -m pytest web-pages/product-site/tests/test_selector.py -q`
Expected: PASS.
- [ ] **Step 5: Commit**
```bash
git add web-pages/product-site/selector.py web-pages/product-site/tests/test_selector.py
git commit -S -m "feat(site): add deployment recommendation engine"
```
### Task 3: Reproducible Legacy Snapshot
**Files:**
- Create: `web-pages/scripts/import-live-site.sh`
- Create: `web-pages/product-site/content/legacy-manifest.json`
- Create: `web-pages/product-site/legacy/`
- Test: `web-pages/product-site/tests/test_legacy.py`
**Interfaces:**
- Consumes: public files under `funasr-web:/root/FunASR/web-pages/dist`
- Produces: tracked `legacy/` corpus and SHA-256 `legacy-manifest.json`
- Excludes: backups, access statistics, logs, `.git`, temporary files, and private configuration
- [ ] **Step 1: Write manifest integrity test**
```python
def test_legacy_manifest_matches_snapshot():
manifest = json.loads(MANIFEST.read_text())
actual = {str(path.relative_to(LEGACY)): sha256(path) for path in public_files(LEGACY)}
assert actual == manifest['files']
def test_private_or_generated_files_are_excluded():
forbidden = {'access.log', 'stats.json', '.git', 'backup'}
assert not any(part in forbidden for path in public_files(LEGACY) for part in path.parts)
```
- [ ] **Step 2: Verify the empty snapshot fails**
Run: `python3.11 -m pytest web-pages/product-site/tests/test_legacy.py -q`
Expected: FAIL because no manifest exists.
- [ ] **Step 3: Implement allowlist-based import**
The script must copy only HTML, CSS, JavaScript, JSON content, fonts, images, audio, video, favicon, robots, and sitemap files. It writes into a fresh temporary directory, computes hashes, and atomically replaces `legacy/` only after every file passes the allowlist.
- [ ] **Step 4: Import from a read-only production snapshot**
Run the importer from `ind-gpu8` using an archive downloaded from `funasr-web`; do not mutate the production host. Review `git status --short` and the manifest before staging.
- [ ] **Step 5: Run manifest tests**
Run: `python3.11 -m pytest web-pages/product-site/tests/test_legacy.py -q`
Expected: PASS.
- [ ] **Step 6: Commit**
```bash
git add web-pages/scripts/import-live-site.sh web-pages/product-site/content/legacy-manifest.json web-pages/product-site/legacy web-pages/product-site/tests/test_legacy.py
git commit -S -m "build(site): track reproducible live-site corpus"
```
### Task 4: Templates, Design System, and Static Build
**Files:**
- Create: `web-pages/product-site/build.py`
- Create: `web-pages/product-site/templates/base.html`
- Create: `web-pages/product-site/templates/home.html`
- Create: `web-pages/product-site/templates/deploy-index.html`
- Create: `web-pages/product-site/templates/404.html`
- Create: `web-pages/product-site/assets/css/site.css`
- Create: `web-pages/product-site/assets/js/site.js`
- Create: `web-pages/product-site/assets/images/deployment-topology.webp`
- Create: selected files under `web-pages/product-site/assets/lucide/`
- Test: `web-pages/product-site/tests/test_build.py`
**Interfaces:**
- Consumes: registry, navigation, selector table, templates, assets, and legacy snapshot
- Produces: `build(output_dir: Path) -> dict[str, object]`
- Produces: `dist/deployment-manifest.json` with route, language, canonical, hreflang, and asset hashes
- [ ] **Step 1: Write failing route and metadata tests**
```python
def test_build_emits_bilingual_product_routes(tmp_path):
manifest = build(tmp_path)
routes = {page['route'] for page in manifest['pages']}
assert {'/', '/en/', '/deploy/', '/en/deploy/', '/404.html'} <= routes
def test_home_has_literal_brand_heading_and_next_section(tmp_path):
build(tmp_path)
soup = BeautifulSoup((tmp_path / 'index.html').read_text(), 'html.parser')
assert soup.h1.get_text(strip=True) == 'FunASR'
assert soup.select_one('[data-section="deployment-selector"]')
```
- [ ] **Step 2: Verify tests fail**
Run: `python3.11 -m pytest web-pages/product-site/tests/test_build.py -q`
Expected: FAIL because the builder and templates do not exist.
- [ ] **Step 3: Generate the hero bitmap**
Create one 2400x1350 WebP source showing an inspectable deployment topology with GPU servers, CPU/edge devices, and API clients. The image contains no text, logos, gradients, bokeh, or decorative shapes. Record the generation prompt and SHA-256 in `assets/images/README.md`.
- [ ] **Step 4: Vendor only used Lucide icons**
Pin one Lucide release, check in the required SVG files plus its license, and use them for menu, GitHub, external-link, copy, terminal, server, CPU, GPU, shield, activity, and language actions.
- [ ] **Step 5: Implement shared templates and hashed assets**
The base template emits canonical, hreflang, description, Open Graph, structured data, skip link, semantic header/main/footer, and the exact navigation order. `build.py` hashes CSS/JS/image assets, renders into a new directory, and only replaces the requested output after a successful render.
- [ ] **Step 6: Implement home and deployment selector UI**
Render the hero, selector segmented controls, no-JavaScript deployment matrix, proof band, API contract, production-responsibility table, verified downloads, ecosystem references, and final deployment/GitHub actions. `site.js` mirrors the Python selector table embedded as JSON and updates one fixed-size result region without layout shift.
- [ ] **Step 7: Run build tests and inspect generated HTML**
Run: `python3.11 -m pytest web-pages/product-site/tests/test_build.py web-pages/product-site/tests/test_selector.py -q`
Expected: PASS.
- [ ] **Step 8: Commit**
```bash
git add web-pages/product-site/build.py web-pages/product-site/templates web-pages/product-site/assets web-pages/product-site/tests/test_build.py
git commit -S -m "feat(site): build bilingual deployment product surface"
```
### Task 5: Deployment Detail and Benchmark Pages
**Files:**
- Create: `web-pages/product-site/templates/deploy-detail.html`
- Create: `web-pages/product-site/templates/benchmarks.html`
- Modify: `web-pages/product-site/build.py`
- Modify: `web-pages/product-site/assets/css/site.css`
- Modify: `web-pages/product-site/assets/js/site.js`
- Test: `web-pages/product-site/tests/test_output.py`
**Interfaces:**
- Consumes: seven validated registry entries and their benchmark records
- Produces: seven Chinese routes, seven English routes, and bilingual benchmark routes
- [ ] **Step 1: Write generated-output tests**
```python
def test_every_deployment_page_has_operational_contract(built_site):
for page in deployment_pages(built_site):
soup = BeautifulSoup(page.read_text(), 'html.parser')
assert soup.select_one('[data-field="verified-date"]')
assert soup.select_one('[data-section="fit"]')
assert soup.select_one('[data-section="commands"]')
assert soup.select_one('[data-section="smoke-test"]')
assert soup.select_one('[data-section="security"]')
assert soup.select_one('[data-section="limitations"]')
def test_benchmark_rows_have_complete_conditions(built_site):
for row in benchmark_rows(built_site):
assert all(row.get(field) for field in REQUIRED_BENCHMARK_FIELDS)
```
- [ ] **Step 2: Verify tests fail**
Run: `python3.11 -m pytest web-pages/product-site/tests/test_output.py -q`
Expected: FAIL because detail and benchmark pages are not generated.
- [ ] **Step 3: Implement the shared detail template**
Render status/version/evidence, fit and non-fit, support matrix, copy-ready install/start/smoke commands, request flow, capacity variables, security boundary, operations checklist, limitations, troubleshooting, release assets, issue link, and GitHub action from registry data only.
- [ ] **Step 4: Implement benchmark rendering**
Render batch RTFx and real-time capacity in separate tables. Every row includes model, runtime, hardware, data/audio duration, batch or concurrency, warmup/download exclusion, source link, and verification date. Add an explicit warning that results do not transfer across traffic profiles.
- [ ] **Step 5: Run output tests**
Run: `python3.11 -m pytest web-pages/product-site/tests/test_output.py -q`
Expected: PASS for all 18 new bilingual/product routes.
- [ ] **Step 6: Commit**
```bash
git add web-pages/product-site/templates web-pages/product-site/build.py web-pages/product-site/assets web-pages/product-site/tests/test_output.py
git commit -S -m "feat(site): add production deployment guides"
```
### Task 6: Legacy Navigation and Compatibility Routes
**Files:**
- Create: `web-pages/product-site/legacy.py`
- Modify: `web-pages/product-site/build.py`
- Modify: `web-pages/product-site/tests/test_legacy.py`
- Modify: `web-pages/product-site/tests/test_output.py`
**Interfaces:**
- Consumes: legacy HTML and `navigation.json`
- Produces: `normalize_document(html: str, route: str, language: str) -> str`
- Produces: old llama.cpp pages with canonical links to `/deploy/llama-cpp.html` language peers
- [ ] **Step 1: Write parser/idempotency tests**
```python
def test_navigation_normalization_is_idempotent(sample_legacy_html):
once = normalize_document(sample_legacy_html, '/blog/example.html', 'zh')
twice = normalize_document(once, '/blog/example.html', 'zh')
assert once == twice
assert nav_labels(once)[-1] == '功德榜'
def test_old_llama_route_points_to_product_page(built_site):
soup = read_soup(built_site / 'llama-cpp.html')
assert soup.select_one('link[rel="canonical"]')['href'].endswith('/deploy/llama-cpp.html')
```
- [ ] **Step 2: Verify tests fail**
Run: `python3.11 -m pytest web-pages/product-site/tests/test_legacy.py web-pages/product-site/tests/test_output.py -q`
Expected: FAIL because legacy normalization is absent.
- [ ] **Step 3: Implement Beautiful Soup normalization**
Replace only the identified primary navigation container, canonical/hreflang metadata, and versioned shared assets. Preserve article body, embedded media, donor content, demo contracts, and unknown custom markup byte-for-byte outside the normalized nodes. Abort the build when an expected page shell cannot be parsed.
- [ ] **Step 4: Build compatibility pages and verify stable routes**
Keep quickstart, models, ecosystem, blog, donors, demos, and voice assets at existing URLs. Preserve old llama.cpp HTML as useful compatibility content and add canonical/product navigation rather than returning a blank redirect.
- [ ] **Step 5: Run legacy and output tests**
Run: `python3.11 -m pytest web-pages/product-site/tests/test_legacy.py web-pages/product-site/tests/test_output.py -q`
Expected: PASS and a second build produces no output changes.
- [ ] **Step 6: Commit**
```bash
git add web-pages/product-site/legacy.py web-pages/product-site/build.py web-pages/product-site/tests
git commit -S -m "feat(site): preserve legacy routes and unify navigation"
```
### Task 7: Complete Output Validation
**Files:**
- Create: `web-pages/product-site/validate.py`
- Modify: `web-pages/product-site/tests/test_output.py`
- Create: `.github/workflows/product-site.yml`
**Interfaces:**
- Consumes: a complete output directory
- Produces: `validate_output(output_dir: Path) -> list[str]`
- CLI exits 0 with `validated <page count> pages`; exits 1 and prints one stable error per line
- [ ] **Step 1: Write validation failure tests**
```python
def test_broken_internal_link_fails_validation(built_site):
replace_href(built_site / 'index.html', '/deploy/', '/missing/')
assert '/index.html: broken internal link /missing/' in validate_output(built_site)
def test_missing_language_peer_fails_validation(built_site):
(built_site / 'en/deploy/vllm.html').unlink()
assert any('missing hreflang peer' in error for error in validate_output(built_site))
```
- [ ] **Step 2: Verify tests fail**
Run: `python3.11 -m pytest web-pages/product-site/tests/test_output.py -q`
Expected: FAIL because `validate_output` does not exist.
- [ ] **Step 3: Implement deterministic output checks**
Check internal links, duplicate ids, canonical/hreflang symmetry, sitemap equality, robots, JSON-LD parseability, asset hashes, image alt text, manifest routes, old indexed routes, deployment evidence markers, and the absence of external font/runtime dependencies.
- [ ] **Step 4: Add CI build job**
CI creates a Python 3.11 virtual environment, installs `requirements-site.txt`, runs all product-site tests, builds to a temporary directory, validates it, rebuilds, and compares recursive SHA-256 manifests to prove reproducibility.
- [ ] **Step 5: Run the complete static suite**
Run: `python3.11 -m pytest web-pages/product-site/tests -q && python3.11 web-pages/product-site/build.py --output /tmp/funasr-product-site && python3.11 web-pages/product-site/validate.py /tmp/funasr-product-site`
Expected: all tests pass and validator reports every generated and legacy page.
- [ ] **Step 6: Commit**
```bash
git add web-pages/product-site/validate.py web-pages/product-site/tests/test_output.py .github/workflows/product-site.yml
git commit -S -m "ci(site): validate reproducible product builds"
```
### Task 8: Atomic Release, Nginx Hardening, and Conversion Measurement
**Files:**
- Create: `web-pages/scripts/deploy-product-site.sh`
- Create: `web-pages/scripts/rollback-product-site.sh`
- Create: `web-pages/nginx/funasr.com.conf`
- Create: `web-pages/nginx/conversion-map.conf`
- Create: `web-pages/product-site/tests/test_release_scripts.py`
**Interfaces:**
- Deploy input: validated output directory and UTC release id `YYYYMMDDTHHMMSSZ`
- Deploy output: `/root/FunASR/web-pages/releases/<release id>/` and atomic `/root/FunASR/web-pages/current`
- Rollback input: an existing release id
- Fixed conversion routes: `/go/github`, `/go/docs`, `/go/releases`, `/go/deploy-vllm`, `/go/deploy-llama-cpp`
- [ ] **Step 1: Write shell-contract tests**
```python
def test_deploy_keeps_previous_release_and_switches_symlink(fake_server):
deploy(fake_server, '20260726T120000Z')
deploy(fake_server, '20260726T130000Z')
assert release_ids(fake_server) == ['20260726T120000Z', '20260726T130000Z']
assert current_release(fake_server) == '20260726T130000Z'
def test_conversion_map_has_no_open_redirects():
routes = parse_conversion_map(CONVERSION_MAP)
assert set(routes) == EXPECTED_FIXED_ROUTES
assert all(target.startswith('https://github.com/') or target.startswith('https://funasr.com/') for target in routes.values())
```
- [ ] **Step 2: Verify tests fail**
Run: `python3.11 -m pytest web-pages/product-site/tests/test_release_scripts.py -q`
Expected: FAIL because scripts/config do not exist.
- [ ] **Step 3: Implement guarded release and rollback scripts**
The deploy script validates the output, copies it into a new release directory, verifies the copied manifest, backs up Nginx configuration with the release id, runs `nginx -t`, atomically changes `current`, reloads Nginx, and runs localhost HTTP checks. Any failure before symlink switch leaves the current release untouched; any failure after switch restores the captured previous target.
- [ ] **Step 4: Add hardened Nginx configuration**
Serve `current`, allow TLS 1.2/1.3 only, retain HSTS/frame/content-type/referrer headers, add a local-asset-compatible CSP and Permissions-Policy, disable cache for HTML, enable immutable cache for hashed assets, serve a bilingual 404, and write only fixed `/go/*` requests to `/var/log/nginx/funasr-conversions.log`.
- [ ] **Step 5: Test in a disposable Nginx prefix**
Run the configuration against a temporary Nginx prefix with a generated test certificate; assert `nginx -t`, canonical route status, cache headers, security headers, fixed redirect targets, conversion log entries, rollback, and retained releases.
- [ ] **Step 6: Commit**
```bash
git add web-pages/scripts web-pages/nginx web-pages/product-site/tests/test_release_scripts.py
git commit -S -m "ops(site): add atomic releases and hardened nginx"
```
### Task 9: Browser Verification and Production Rollout
**Files:**
- Create: `web-pages/product-site/tests/browser/product-site.spec.ts`
- Create: `web-pages/product-site/tests/browser/package.json`
- Create: `web-pages/product-site/tests/browser/playwright.config.ts`
- Create: `web-pages/product-site/tests/browser/screenshots/`
- Create: `docs/operations/funasr-com-site-release.md`
**Interfaces:**
- Consumes: locally served validated output and staged production release
- Produces: viewport screenshots, browser assertions, live smoke evidence, and rollback runbook
- [ ] **Step 1: Add browser assertions before deployment**
Tests cover 390x844, 768x1024, 1440x900, and 1920x1080. Assert no horizontal overflow, no intersecting visible controls, nonblank hero pixels, next-section visibility, keyboard menu operation, focus visibility, selector results, copy actions, language peers, old llama routes, reduced motion, and all fixed outbound redirects.
- [ ] **Step 2: Run local browser tests**
Run: `npx playwright test --config web-pages/product-site/tests/browser/playwright.config.ts`
Expected: PASS at all four viewports with committed reference screenshots reviewed for readable text and correct asset framing.
- [ ] **Step 3: Create an immutable production backup and staged release**
Archive the current live Nginx configuration and current static root with SHA-256 manifests under a timestamped backup. Upload the new build to a new release directory and run validator plus localhost checks before changing `current`.
- [ ] **Step 4: Switch production atomically**
Run `nginx -t`, switch `current`, reload Nginx, then verify public HTTPS for every manifest route, canonical/hreflang, assets, old routes, security/cache headers, sitemap, TLS 1.0/1.1 rejection, TLS 1.2/1.3 acceptance, and one fixed conversion event.
- [ ] **Step 5: Exercise rollback and restore the new release**
Switch to the captured previous release, verify home and blog routes, then switch back to the new release and repeat the public smoke test. Record both release ids and exact commands in `docs/operations/funasr-com-site-release.md`.
- [ ] **Step 6: Monitor first-day behavior**
Check Nginx 4xx/5xx rates, deployment page views, fixed GitHub/docs/release actions, and broken-link reports after 1 hour and 24 hours. Roll back immediately on elevated 5xx, missing indexed routes, unreadable mobile layout, or conversion redirect failure.
- [ ] **Step 7: Commit rollout evidence and open the FunASR PR**
```bash
git add web-pages/product-site/tests/browser docs/operations/funasr-com-site-release.md
git commit -S -m "test(site): verify product hub rollout"
git push origin codex/funasr-product-deployment-hub
gh pr create --repo modelscope/FunASR --base main --head codex/funasr-product-deployment-hub --title "feat(site): launch the FunASR deployment product hub" --body-file /tmp/funasr-product-site-pr.md
```
The PR body includes generated route count, exact test commands, screenshot links, production release id, rollback proof, claim/evidence policy, and follow-up metrics. The branch remains independently revertible by signed commits even though the site is already deployed from the exact reviewed build.
---
## Self-Review Results
- Spec coverage: registry/evidence, selector, bilingual routes, seven deployment pages, benchmarks, legacy preservation, navigation, measurement, atomic release, Nginx/TLS, browser checks, rollback, and first-day monitoring each map to an explicit task.
- Scope boundary: model/runtime implementation, public inference hosting, authentication, rate limiting, and Prometheus remain excluded.
- Type consistency: registry data flows through `load_registry`, `validate_registry`, `recommend`, `build`, `normalize_document`, and `validate_output` with stable names across tasks.
- Placeholder scan: the plan contains no deferred implementation markers; dynamic release ids are specified by an exact UTC format.
@@ -0,0 +1,386 @@
# FunASR Product Deployment Hub Design
Status: approved direction (Option A) on 2026-07-26
## 1. Purpose
Turn `www.funasr.com` from a collection of project and tutorial pages into the
product entry point for deploying FunASR in production. The primary audience is
developers, platform engineers, and technical leads preparing a private speech
deployment. Researchers and first-time evaluators remain supported through
secondary paths.
The site must help a visitor answer four questions without searching the GitHub
repository:
1. Which runtime fits my workload and hardware?
2. What is the shortest verified command that proves it works?
3. What must I add before exposing it to production traffic?
4. Where are the exact release assets, evidence, and limitations?
This work supports the September community-growth objective by converting the
site's existing traffic into successful deployments, repeat visits, release
downloads, and GitHub engagement.
## 2. Current-State Evidence
The live site already receives meaningful traffic. On 2026-07-26 it reported
5,527 page views and 2,182 unique visitors. The home page had 1,485 views, while
`quickstart.html` had 82 and `models.html` had 76. This indicates that the site
has distribution but the path from landing to deployment is weak.
The content surface is fragmented:
- The home page mentions industrial deployment but does not provide a deployment
decision flow.
- `llama-cpp.html` exists, but vLLM, WebSocket, OpenAI API, containers, ONNX,
Triton, and operations do not form a coherent product family.
- The GitHub `web-pages` Vue source and the manually maintained live static HTML
have diverged.
- The live `tracker.js` posts to `/stats/log`, but Nginx has no matching route, so
`github_clicks` remains zero and conversion cannot be measured.
- Nginx serves directly from a mutable `dist` directory, so deployment and
rollback are not atomic.
- The configured TLS protocol list still includes TLS 1.0 and 1.1.
The repository already contains strong source material: a deployment matrix,
model-selection guides, an OpenAI-compatible API with health and model-list
checks, Docker Compose and Kubernetes examples, production WebSocket guidance,
vLLM benchmarks and concurrency notes, ONNX/C++ and Triton runtimes, and nine
cross-platform llama.cpp/GGUF release assets.
## 3. Scope
### 3.1 Included in the first release
- Redesign the Chinese and English home pages around deployment selection.
- Add a bilingual `/deploy/` product center and seven deployment detail pages.
- Introduce a single data model for deployment status, hardware, models,
commands, evidence, limitations, and release links.
- Normalize primary navigation across generated and legacy pages while keeping
`功德榜` / `Donors` as the final navigation item.
- Preserve the current blog, demos, voice assets, and high-value indexed URLs.
- Import the public live-site corpus into source control, excluding backups,
access statistics, logs, and generated output, so a release can be rebuilt
without reading mutable files from the production host.
- Preserve `/llama-cpp.html` and `/en/llama-cpp.html` as permanent compatibility
entry points with canonical links to the new deployment pages.
- Add privacy-preserving first-party conversion measurement for fixed GitHub,
documentation, release, and deployment calls to action.
- Replace mutable in-place deployment with versioned releases and an atomic
`current` symlink.
- Harden Nginx for TLS 1.2/1.3, security headers, cache policy, and deterministic
redirects.
### 3.2 Explicitly excluded from the first release
- Rewriting all existing blog articles.
- Hosting a public inference API on `www.funasr.com`.
- Claiming a runtime is production-ready without repository evidence.
- Adding built-in authentication, rate limiting, or Prometheus metrics to the
FunASR server in the website change. The site will state which controls are
native and which belong at an API gateway.
- Migrating the entire site to Astro or another full content framework.
## 4. Product Positioning
The first viewport uses the literal product name as the heading:
> FunASR
Supporting copy:
> 可私有化部署的语音智能基础设施。覆盖 GPU 高吞吐、实时流式服务、
> OpenAI 兼容 API,以及 CPU 与边缘独立运行。
English:
> Private-deployment speech infrastructure for high-throughput GPU inference,
> real-time streaming, OpenAI-compatible APIs, and standalone CPU or edge use.
The primary call to action is `选择部署方案` / `Choose a deployment`. The
secondary action is `5 分钟验证` / `Verify in five minutes`. GitHub remains
visible in the header but does not replace the deployment workflow.
## 5. Information Architecture
Primary navigation order:
1. Product / 产品
2. Deploy / 部署
3. Models / 模型
4. Benchmarks / 性能
5. Ecosystem / 生态
6. Blog / 博客
7. Docs / 文档
8. Donors / 功德榜
Language selection and the GitHub action remain separate header controls.
New routes:
| Chinese route | English route | Purpose |
|---|---|---|
| `/deploy/` | `/en/deploy/` | Workload and hardware deployment selector |
| `/deploy/vllm.html` | `/en/deploy/vllm.html` | Fun-ASR-Nano GPU batch and high-throughput inference |
| `/deploy/llama-cpp.html` | `/en/deploy/llama-cpp.html` | CPU, desktop, and edge GGUF runtime |
| `/deploy/openai-api.html` | `/en/deploy/openai-api.html` | OpenAI-compatible private transcription API |
| `/deploy/realtime.html` | `/en/deploy/realtime.html` | WebSocket live captions and streaming ASR |
| `/deploy/containers.html` | `/en/deploy/containers.html` | Docker Compose and Kubernetes service deployment |
| `/deploy/cpu-runtime.html` | `/en/deploy/cpu-runtime.html` | ONNX/C++ high-concurrency CPU deployment |
| `/deploy/production.html` | `/en/deploy/production.html` | Security, readiness, capacity, observability, and rollout checklist |
| `/benchmarks.html` | `/en/benchmarks.html` | Reproducible benchmark evidence and methodology |
Existing `quickstart.html`, `models.html`, `ecosystem.html`, `/blog/`, and donor
routes remain stable.
## 6. Page Design
### 6.1 Home page
The home page is an operational product surface, not a marketing collage.
1. Full-width brand hero with one custom deployment-topology bitmap and real
terminal/API output layered as inspectable HTML, not baked into the image.
2. A compact deployment selector with segmented controls for workload and
hardware. It recommends one path and explains why.
3. A proof band for stable facts: Apache-2.0, supported operating-system families,
OpenAI-compatible endpoint, verified release date, and benchmark evidence.
4. A deployment matrix organized by workload, hardware, interface, and maturity.
5. A real API contract example showing `/health`, `/v1/models`, and
`/v1/audio/transcriptions`.
6. A production-readiness band separating native capability from gateway or
infrastructure responsibility.
7. Verified runtime downloads and ecosystem adoption.
8. A final deployment and GitHub call to action.
The next section remains visible at common desktop and mobile viewport heights.
### 6.2 Deployment selector
Inputs:
- Workload: file batch, real-time stream, private API, or edge application.
- Hardware: NVIDIA GPU, general CPU, desktop/edge GPU, or Kubernetes cluster.
- Priority: throughput, latency, portability, or compatibility.
Output:
- Recommended runtime.
- Supported model family.
- Why it matches.
- Primary limitation.
- Direct link to the detailed deployment page.
The selector is deterministic and encoded in the deployment registry. It does
not send data to a server and works without JavaScript by exposing the full
matrix below it.
### 6.3 Deployment detail template
Every deployment page uses the same scan-friendly structure:
1. Status, last verified date, tested FunASR version, and evidence links.
2. `适合` / `不适合` guidance.
3. Supported models, hardware, operating systems, and interfaces.
4. Copy-ready installation and startup commands.
5. Health or smoke-test command with expected output.
6. Architecture and request flow.
7. Capacity-planning variables and benchmark method.
8. Security and network boundary.
9. Operations: readiness, logs, model cache, graceful restart, and rollback.
10. Known limitations and troubleshooting.
11. Release assets, deeper documentation, issue template, and GitHub action.
### 6.4 Benchmark page
No unqualified performance number may appear. Each metric must include model,
runtime, hardware, dataset or audio duration, batch/concurrency settings, whether
download and warmup were excluded, source link, and verification date. The page
distinguishes batch RTFx from real-time streaming capacity and explicitly warns
against treating one traffic profile as a universal concurrency promise.
## 7. Visual System
- Base: white and near-black with cobalt blue for actions, green for verified
status, and amber for limitations. Avoid a one-hue dark/slate presentation.
- Type: system fonts with `Inter`, `PingFang SC`, `Microsoft YaHei`, and sans-serif
fallbacks. Remove the Google Fonts dependency for reliable access in China.
- Corners: 4-8 px. Do not nest cards or turn page sections into floating cards.
- Icons: bundled Lucide icons with text labels and tooltips for unfamiliar icons.
The selected SVG files and Lucide license are checked into the site assets from
one pinned upstream release; no icon is redrawn locally.
- Commands: familiar copy icon buttons, not text-filled controls where an icon is
sufficient.
- Layout: dense, calm, and technical. Tables and unframed bands take priority over
decorative cards.
- Motion: only selector transitions, copy confirmation, and reduced-motion-safe
topology movement. No decorative orbs, bokeh, or gradient background art.
- Hero asset: a custom bitmap that depicts the actual deployment spectrum from
GPU server to CPU/edge clients. It must remain legible under the text overlay
and may not contain generated text.
## 8. Content and Evidence Model
The source of truth is a bilingual deployment registry checked into the FunASR
repository. Each entry contains:
- stable id and route
- Chinese and English name, summary, fit, and limitations
- maturity: `production-verified`, `community-verified`, or `experimental`
- supported models, hardware, operating systems, and interfaces
- install, launch, health, and smoke-test commands
- tested FunASR/runtime versions and verification date
- benchmark records with complete conditions
- release assets and documentation evidence
- operations and security responsibilities
The build fails if a production-verified entry lacks a verification date,
evidence link, tested version, smoke test, or explicit limitation. URLs and model
aliases are validated. Chinese and English entries must have the same structure.
## 9. Static Build Architecture
Add a self-contained product-site source under `web-pages/product-site/`:
```text
web-pages/product-site/
assets/
content/
data/deployments.json
legacy/
templates/
build.py
validate.py
requirements-site.txt
tests/
```
`build.py` runs on Python 3.11 or newer, uses pinned Jinja2 and Beautiful Soup
build dependencies, and emits dependency-free static HTML, CSS, JavaScript,
sitemap entries, redirects, and a deployment manifest. The live server remains
Nginx-only. Existing blog and demo assets are copied from the tracked `legacy/`
snapshot, never from the mutable production directory.
A structured HTML parser updates primary navigation in legacy pages. It must be
idempotent and preserve article content. The same navigation manifest feeds all
new pages and the legacy normalizer.
Generated assets use versioned filenames. HTML is no-cache; immutable assets are
cached long term. The build output is complete in a staging directory before any
live file changes.
## 10. Deployment and Rollback
Deploy to:
```text
/root/FunASR/web-pages/releases/<UTC timestamp>/
```
After validation, atomically switch:
```text
/root/FunASR/web-pages/current -> releases/<UTC timestamp>
```
Nginx serves `current`. Deployment steps:
1. Build in an isolated worktree.
2. Validate generated HTML, links, sitemap, language pairs, and asset hashes.
3. Upload to a new release directory.
4. Run live-root checks against the staged directory.
5. Back up Nginx configuration, run `nginx -t`, and reload only after success.
6. Switch the symlink atomically.
7. Run public HTTPS and browser smoke tests.
8. Roll back by switching to the previous release if any required check fails.
No command mutates or deletes an earlier release during deployment.
## 11. Nginx and Measurement
Nginx changes:
- Serve the atomic `current` directory.
- Allow TLS 1.2 and 1.3 only.
- Add a content security policy compatible with the local assets and the existing
approved video embed.
- Add `Permissions-Policy`, retain HSTS, frame, content-type, and referrer headers.
- Use no-cache for HTML and immutable caching for versioned assets.
- Add fixed 302 routes for GitHub, docs, releases, and deployment calls to action.
These routes are not open redirects.
- Write the fixed redirect routes to a dedicated conversion access log.
The broken beacon endpoint is removed. Conversion reporting is derived from
first-party access logs and stores no audio, form input, cookies, or persistent
visitor identifier. Reports include page views, deployment-detail views, and
fixed outbound actions.
## 12. Failure Handling
- Build errors, missing evidence, invalid bilingual structure, broken links, or
sitemap mismatch stop deployment.
- Legacy navigation normalization runs against a copy and aborts if an expected
structure cannot be parsed.
- The deployment selector always has a no-JavaScript matrix fallback.
- Unknown routes receive a bilingual 404 with deployment, docs, and home links.
- Existing indexed routes remain available or use permanent redirects with
canonical and hreflang metadata.
- A failed Nginx check or public smoke test leaves the previous release active.
## 13. Verification
### Build and content
- Unit tests for registry validation, route generation, selector decisions, and
navigation normalization.
- Generated-output tests for all Chinese/English route pairs.
- HTML parsing and internal-link checks across every generated and legacy page.
- Sitemap, canonical, hreflang, robots, structured-data, and redirect checks.
- Exact model alias, package version, release asset, and documentation link checks.
- Evidence checks for every benchmark and production-verified status.
### Browser
- Playwright on 390x844, 768x1024, 1440x900, and 1920x1080.
- Screenshots for home, deployment index, all detail templates, mobile navigation,
selector states, and bilingual pages.
- No horizontal overflow, overlapping controls, hidden headings, or text clipping.
- Keyboard navigation, visible focus, semantic landmarks, contrast, alt text, and
reduced-motion behavior.
- The hero asset loads and the first viewport reveals the next section.
- Copy buttons, language links, selector recommendations, old llama.cpp routes,
and fixed outbound redirects work.
### Live
- HTTPS 200 for all canonical routes and assets.
- Correct cache and security headers.
- TLS 1.0/1.1 rejected; TLS 1.2/1.3 accepted.
- Public sitemap routes equal the generated manifest.
- Conversion log records fixed outbound actions.
- Existing blog and demo contracts remain green.
## 14. Rollout Order
1. Add generator, registry, validation, and tests.
2. Build the bilingual home page and deployment index.
3. Build the seven deployment pages and benchmark page.
4. Normalize legacy navigation and preserve old routes.
5. Add versioned deployment, Nginx hardening, and conversion logs.
6. Run full local and staged-browser verification.
7. Deploy atomically, run public verification, and monitor the first 24 hours.
## 15. Success Criteria
The first release is complete only when:
- All planned bilingual routes are public and pass the generated manifest.
- A visitor can reach a justified deployment recommendation in two interactions.
- Every production claim has exact repository or release evidence.
- vLLM and llama.cpp/GGUF each have a complete production-oriented page.
- Old high-value URLs and all blog/demo contracts remain valid.
- Deployment is atomic and rollback is proven.
- GitHub, docs, release, and deployment CTA conversion is measurable.
- Desktop and mobile browser checks pass with no overlap or overflow.
- The live site passes security-header, TLS, sitemap, and link verification.
+8
View File
@@ -0,0 +1,8 @@
map $uri $funasr_conversion_target {
default "";
/go/github https://github.com/modelscope/FunASR;
/go/docs https://github.com/modelscope/FunASR/tree/main/docs;
/go/releases https://github.com/modelscope/FunASR/releases;
/go/deploy-vllm https://www.funasr.com/deploy/vllm.html;
/go/deploy-llama-cpp https://www.funasr.com/deploy/llama-cpp.html;
}
+75
View File
@@ -0,0 +1,75 @@
server {
listen 80;
server_name www.funasr.com funasr.com;
return 301 https://www.funasr.com$request_uri;
}
server {
listen 443 ssl http2;
server_name www.funasr.com funasr.com;
root /root/FunASR/web-pages/current;
index index.html;
charset utf-8;
ssl_certificate /root/cert/funasr.com.pem;
ssl_certificate_key /root/cert/funasr.com.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
error_page 404 /404.html;
location = /bot/ {
proxy_pass http://127.0.0.1:8075/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
location ^~ /go/ {
if ($funasr_conversion_target = "") { return 404; }
access_log /var/log/nginx/funasr-conversions.log combined;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "camera=(), geolocation=(), payment=(), usb=()" always;
return 302 $funasr_conversion_target;
}
location ~* "\.[0-9a-f]{12}\.(?:css|js|png|jpg|jpeg|gif|ico|svg|webp|woff2?)$" {
try_files $uri =404;
expires 1y;
add_header Cache-Control "public, max-age=31536000, immutable";
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "camera=(), geolocation=(), payment=(), usb=()" always;
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; media-src 'self' blob:; connect-src 'self' https: wss: ws:; font-src 'self' data:; object-src 'none'; frame-ancestors 'self'; base-uri 'self'; form-action 'self'" always;
}
location ~* "\.(?:js|css|png|jpg|jpeg|gif|ico|svg|webp|woff2?|wav|mp3|mp4|wasm|bin|data|gz)$" {
try_files $uri =404;
expires 7d;
add_header Cache-Control "public, max-age=604800";
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "camera=(), geolocation=(), payment=(), usb=()" always;
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; media-src 'self' blob:; connect-src 'self' https: wss: ws:; font-src 'self' data:; object-src 'none'; frame-ancestors 'self'; base-uri 'self'; form-action 'self'" always;
}
location / {
try_files $uri $uri/ =404;
expires -1;
add_header Cache-Control "no-cache, must-revalidate";
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "camera=(), geolocation=(), payment=(), usb=()" always;
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; media-src 'self' blob:; connect-src 'self' https: wss: ws:; font-src 'self' data:; object-src 'none'; frame-ancestors 'self'; base-uri 'self'; form-action 'self'" always;
}
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,11 @@
# Deployment topology asset
- Generated with the built-in OpenAI image generation tool on 2026-07-26.
- Source dimensions: 1672 x 941 PNG.
- SHA-256: `c08b4b7da5ed5229ebdf2b96f1e6c88aea8bc6353f96c20c7e182db44aa06e4f`
Prompt summary: a bright, realistic industrial speech deployment scene with an
NVIDIA GPU server, CPU server, desktop workstation, edge device, and API clients
connected in a modern engineering lab. White and near-black materials use
restrained cobalt, green, and amber hardware accents. The wide composition keeps
calm space at upper left for HTML copy and contains no logos or intentional text.
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 MiB

+72
View File
@@ -0,0 +1,72 @@
(() => {
const menuButton = document.querySelector('[data-menu-toggle]');
const navigation = document.querySelector('[data-primary-nav]');
if (menuButton && navigation) {
menuButton.addEventListener('click', () => {
const open = menuButton.getAttribute('aria-expanded') !== 'true';
menuButton.setAttribute('aria-expanded', String(open));
navigation.dataset.open = String(open);
});
}
const dataNode = document.getElementById('deployment-selector-data');
const selector = document.querySelector('[data-deployment-selector]');
const result = document.querySelector('[data-selector-result]');
if (dataNode && selector && result) {
const data = JSON.parse(dataNode.textContent);
const language = document.body.dataset.language || 'zh';
const selection = {
workload: 'batch',
hardware: 'nvidia-gpu',
priority: 'throughput',
};
const score = (entry) => {
let value = 0;
value += entry.workloads.includes(selection.workload) ? data.weights.workload : 0;
value += entry.hardware.includes(selection.hardware) ? data.weights.hardware : 0;
value += entry.priorities.includes(selection.priority) ? data.weights.priority : 0;
return value;
};
const render = () => {
const recommendation = [...data.entries].sort((left, right) => {
const scoreDifference = score(right) - score(left);
if (scoreDifference !== 0) return scoreDifference;
if (left.rank !== right.rank) return left.rank - right.rank;
return left.id.localeCompare(right.id);
})[0];
result.querySelector('[data-result-name]').textContent = recommendation.name[language];
result.querySelector('[data-result-reason]').textContent = recommendation.reason[language];
result.querySelector('[data-result-limitation]').textContent = recommendation.limitation[language];
result.querySelector('[data-result-link]').href = recommendation.routes[language];
};
selector.querySelectorAll('[data-selector-group]').forEach((group) => {
group.addEventListener('click', (event) => {
const button = event.target.closest('button[data-value]');
if (!button) return;
group.querySelectorAll('button').forEach((item) => {
item.setAttribute('aria-pressed', String(item === button));
});
selection[group.dataset.selectorGroup] = button.dataset.value;
render();
});
});
render();
}
document.querySelectorAll('[data-copy-target]').forEach((button) => {
button.addEventListener('click', async () => {
const target = document.querySelector(button.dataset.copyTarget);
if (!target) return;
await navigator.clipboard.writeText(target.textContent.trim());
button.dataset.copied = 'true';
window.setTimeout(() => delete button.dataset.copied, 1400);
});
});
})();
@@ -0,0 +1,15 @@
ISC License
Copyright (c) for portions of Lucide are held by Cole Bemis 2013-2022 as part of Feather (MIT). All other copyright (c) for Lucide are held by Lucide Contributors 2022.
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
@@ -0,0 +1,5 @@
# Lucide icons
Selected icons are vendored from `lucide-icons/lucide` release `0.468.0`.
Only icons used by the static product site are included. See `LICENSE` in this
directory for the upstream ISC license.
@@ -0,0 +1,13 @@
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2" />
</svg>

After

Width:  |  Height:  |  Size: 346 B

@@ -0,0 +1,14 @@
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M5 12h14" />
<path d="m12 5 7 7-7 7" />
</svg>

After

Width:  |  Height:  |  Size: 261 B

@@ -0,0 +1,14 @@
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<rect width="14" height="14" x="8" y="8" rx="2" ry="2" />
<path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2" />
</svg>

After

Width:  |  Height:  |  Size: 339 B

@@ -0,0 +1,14 @@
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="m12 14 4-4" />
<path d="M3.34 19a10 10 0 1 1 17.32 0" />
</svg>

After

Width:  |  Height:  |  Size: 278 B

@@ -0,0 +1,14 @@
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M15 22v-4a4.8 4.8 0 0 0-1-3.5c3 0 6-2 6-5.5.08-1.25-.27-2.48-1-3.5.28-1.15.28-2.35 0-3.5 0 0-1 0-3 1.5-2.64-.5-5.36-.5-8 0C6 2 5 2 5 2c-.3 1.15-.3 2.35 0 3.5A5.403 5.403 0 0 0 4 9c0 3.5 3 5.5 6 5.5-.39.49-.68 1.05-.85 1.65-.17.6-.22 1.23-.15 1.85v4" />
<path d="M9 18c-4.51 2-5-2-7-2" />
</svg>

After

Width:  |  Height:  |  Size: 509 B

@@ -0,0 +1,18 @@
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="m5 8 6 6" />
<path d="m4 14 6-6 2-3" />
<path d="M2 5h12" />
<path d="M7 2h1" />
<path d="m22 22-5-10-5 10" />
<path d="M14 18h6" />
</svg>

After

Width:  |  Height:  |  Size: 362 B

@@ -0,0 +1,15 @@
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<line x1="4" x2="20" y1="12" y2="12" />
<line x1="4" x2="20" y1="6" y2="6" />
<line x1="4" x2="20" y1="18" y2="18" />
</svg>

After

Width:  |  Height:  |  Size: 332 B

@@ -0,0 +1,14 @@
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z" />
<path d="m9 12 2 2 4-4" />
</svg>

After

Width:  |  Height:  |  Size: 415 B

@@ -0,0 +1,14 @@
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<polyline points="4 17 10 11 4 5" />
<line x1="12" x2="20" y1="19" y2="19" />
</svg>

After

Width:  |  Height:  |  Size: 290 B

+396
View File
@@ -0,0 +1,396 @@
"""Build the dependency-free FunASR product site."""
from __future__ import annotations
import argparse
import hashlib
import json
import shutil
import tempfile
import xml.etree.ElementTree as ET
from pathlib import Path
from typing import Any
from bs4 import BeautifulSoup
from jinja2 import Environment, FileSystemLoader, StrictUndefined, select_autoescape
from legacy import normalize_document
from registry import load_registry, validate_registry
from selector import MATCH_WEIGHTS
SITE_ROOT = Path(__file__).resolve().parent
BASE_URL = 'https://www.funasr.com'
def sha256(path: Path) -> str:
digest = hashlib.sha256()
with path.open('rb') as stream:
for chunk in iter(lambda: stream.read(1024 * 1024), b''):
digest.update(chunk)
return digest.hexdigest()
def route_path(output_dir: Path, route: str) -> Path:
if route == '/':
return output_dir / 'index.html'
if route.endswith('/'):
return output_dir / route.lstrip('/') / 'index.html'
return output_dir / route.lstrip('/')
def canonical_url(route: str) -> str:
return f'{BASE_URL}{route}'
def legacy_route(relative: Path) -> str:
"""Convert a legacy HTML path to its public route."""
route = f'/{relative.as_posix()}'
if relative.name == 'index.html':
route = route[:-len('index.html')]
return route
def _write_sitemap(stage: Path) -> None:
routes: set[str] = set()
for page in sorted(stage.rglob('*.html')):
if page.name == '404.html':
continue
soup = BeautifulSoup(page.read_text(encoding='utf-8'), 'html.parser')
canonical = soup.select_one('link[rel="canonical"][href]')
if canonical is None:
continue
href = str(canonical['href'])
if not href.startswith(BASE_URL):
continue
route = href[len(BASE_URL):] or '/'
routes.add(route)
ET.register_namespace('', 'http://www.sitemaps.org/schemas/sitemap/0.9')
urlset = ET.Element('{http://www.sitemaps.org/schemas/sitemap/0.9}urlset')
for route in sorted(routes):
url = ET.SubElement(urlset, '{http://www.sitemaps.org/schemas/sitemap/0.9}url')
location = ET.SubElement(url, '{http://www.sitemaps.org/schemas/sitemap/0.9}loc')
location.text = canonical_url(route)
ET.indent(urlset, space=' ')
tree = ET.ElementTree(urlset)
tree.write(stage / 'sitemap.xml', encoding='utf-8', xml_declaration=True)
def _copy_hashed_assets(stage: Path) -> tuple[dict[str, str], dict[str, str]]:
urls: dict[str, str] = {}
hashes: dict[str, str] = {}
source_root = SITE_ROOT / 'assets'
for source in sorted(path for path in source_root.rglob('*') if path.is_file()):
relative = source.relative_to(source_root)
digest = sha256(source)
destination_name = f'{source.stem}.{digest[:12]}{source.suffix}'
destination_relative = relative.with_name(destination_name)
destination = stage / 'assets' / destination_relative
destination.parent.mkdir(parents=True, exist_ok=True)
shutil.copy2(source, destination)
key = relative.as_posix()
url = f'/assets/{destination_relative.as_posix()}'
urls[key] = url
hashes[url] = digest
return urls, hashes
def _navigation(data: dict[str, Any], language: str) -> list[dict[str, str]]:
suffix = 'zh' if language == 'zh' else 'en'
return [
{
'id': item['id'],
'label': item[language],
'href': item[f'href_{suffix}'],
}
for item in data['items']
]
def _page_context(
*,
language: str,
route: str,
peer_route: str,
title: str,
description: str,
navigation: dict[str, Any],
assets: dict[str, str],
) -> dict[str, Any]:
return {
'language': language,
'html_language': 'zh-CN' if language == 'zh' else 'en',
'route': route,
'peer_route': peer_route,
'canonical': canonical_url(route),
'peer_canonical': canonical_url(peer_route),
'title': title,
'description': description,
'navigation': _navigation(navigation, language),
'assets': assets,
'github_url': 'https://github.com/modelscope/FunASR',
}
def _selector_payload(entries: list[dict[str, Any]]) -> dict[str, Any]:
return {
'weights': MATCH_WEIGHTS,
'entries': [
{
'id': entry['id'],
'routes': entry['routes'],
'rank': entry['selector_rank'],
'workloads': entry['workloads'],
'hardware': entry['hardware'],
'priorities': entry['priorities'],
'name': {
language: entry['translations'][language]['name']
for language in ('zh', 'en')
},
'reason': {
language: entry['translations'][language]['selection_reason']
for language in ('zh', 'en')
},
'limitation': {
language: entry['translations'][language]['primary_limitation']
for language in ('zh', 'en')
},
}
for entry in entries
if entry.get('selectable', True)
],
}
def _render_page(
environment: Environment,
template_name: str,
destination: Path,
context: dict[str, Any],
) -> None:
destination.parent.mkdir(parents=True, exist_ok=True)
rendered = environment.get_template(template_name).render(**context)
destination.write_text(rendered.rstrip() + '\n', encoding='utf-8')
def build(output_dir: Path) -> dict[str, Any]:
"""Build a complete product-site directory and return its manifest."""
output_dir = Path(output_dir).resolve()
output_dir.parent.mkdir(parents=True, exist_ok=True)
stage = Path(tempfile.mkdtemp(prefix='.funasr-product-build-', dir=output_dir.parent))
try:
legacy = SITE_ROOT / 'legacy'
if legacy.is_dir():
shutil.copytree(legacy, stage, dirs_exist_ok=True)
for source in sorted(legacy.rglob('*.html')):
html = source.read_text(encoding='utf-8')
if not BeautifulSoup(html, 'html.parser').select_one('nav.nav'):
continue
relative = source.relative_to(legacy)
language = 'en' if relative.parts[0] == 'en' else 'zh'
destination = stage / relative
destination.write_text(
normalize_document(html, legacy_route(relative), language),
encoding='utf-8',
)
registry = load_registry(SITE_ROOT / 'data' / 'deployments.json')
errors = validate_registry(registry)
if errors:
raise ValueError('invalid deployment registry:\n' + '\n'.join(errors))
navigation = json.loads(
(SITE_ROOT / 'data' / 'navigation.json').read_text(encoding='utf-8')
)
assets, asset_hashes = _copy_hashed_assets(stage)
environment = Environment(
loader=FileSystemLoader(SITE_ROOT / 'templates'),
autoescape=select_autoescape(('html', 'xml')),
undefined=StrictUndefined,
trim_blocks=True,
lstrip_blocks=True,
)
pages: list[dict[str, str]] = []
language_copy = {
'zh': {
'home_title': 'FunASR - 可私有化部署的语音智能基础设施',
'home_description': '选择适合 GPU 高吞吐、实时流式、OpenAI 兼容 API、CPU 与边缘设备的 FunASR 部署方案。',
'deploy_title': '部署中心 - FunASR',
'deploy_description': '按工作负载、硬件和优先级选择可验证的 FunASR 工业部署路径。',
'detail_suffix': '工业部署 - FunASR',
'benchmarks_title': '可复现实测 - FunASR',
'benchmarks_description': '核对 FunASR 公开性能记录的硬件、音频、设置、计时口径、来源与适用限制。',
'not_found_title': '页面未找到 - FunASR',
'not_found_description': '返回 FunASR 部署中心、文档或首页。',
},
'en': {
'home_title': 'FunASR - Private-deployment speech infrastructure',
'home_description': 'Choose a verified FunASR path for GPU throughput, realtime streaming, OpenAI-compatible APIs, CPUs, and edge devices.',
'deploy_title': 'Deployment center - FunASR',
'deploy_description': 'Choose an evidence-backed FunASR production path by workload, hardware, and priority.',
'detail_suffix': 'industrial deployment - FunASR',
'benchmarks_title': 'Reproducible measurements - FunASR',
'benchmarks_description': 'Review hardware, audio, settings, timing scope, source, and qualifications for public FunASR performance records.',
'not_found_title': 'Page not found - FunASR',
'not_found_description': 'Return to the FunASR deployment center, documentation, or home page.',
},
}
selector_payload = _selector_payload(registry['deployments'])
for language, route, peer_route in (
('zh', '/', '/en/'),
('en', '/en/', '/'),
):
context = _page_context(
language=language,
route=route,
peer_route=peer_route,
title=language_copy[language]['home_title'],
description=language_copy[language]['home_description'],
navigation=navigation,
assets=assets,
)
context.update({
'deployments': registry['deployments'],
'selector_payload': selector_payload,
'verified': registry['verified'],
})
_render_page(environment, 'home.html', route_path(stage, route), context)
pages.append({
'route': route,
'language': language,
'canonical': context['canonical'],
'hreflang': context['peer_canonical'],
})
for language, route, peer_route in (
('zh', '/deploy/', '/en/deploy/'),
('en', '/en/deploy/', '/deploy/'),
):
context = _page_context(
language=language,
route=route,
peer_route=peer_route,
title=language_copy[language]['deploy_title'],
description=language_copy[language]['deploy_description'],
navigation=navigation,
assets=assets,
)
context.update({'deployments': registry['deployments'], 'verified': registry['verified']})
_render_page(environment, 'deploy-index.html', route_path(stage, route), context)
pages.append({
'route': route,
'language': language,
'canonical': context['canonical'],
'hreflang': context['peer_canonical'],
})
for entry in registry['deployments']:
for language in ('zh', 'en'):
route = entry['routes'][language]
peer_language = 'en' if language == 'zh' else 'zh'
peer_route = entry['routes'][peer_language]
translation = entry['translations'][language]
context = _page_context(
language=language,
route=route,
peer_route=peer_route,
title=f"{translation['name']} - {language_copy[language]['detail_suffix']}",
description=translation['summary'],
navigation=navigation,
assets=assets,
)
context.update({'entry': entry, 'verified': registry['verified']})
_render_page(
environment,
'deploy-detail.html',
route_path(stage, route),
context,
)
pages.append({
'route': route,
'language': language,
'canonical': context['canonical'],
'hreflang': context['peer_canonical'],
})
for language, route, peer_route in (
('zh', '/benchmarks.html', '/en/benchmarks.html'),
('en', '/en/benchmarks.html', '/benchmarks.html'),
):
benchmarks = []
for entry in registry['deployments']:
for record in entry['benchmarks']:
localized_record = dict(record)
localized_record['deployment_id'] = entry['id']
localized_record['deployment_name'] = entry['translations'][language]['name']
localized_record['deployment_route'] = entry['routes'][language]
benchmarks.append(localized_record)
context = _page_context(
language=language,
route=route,
peer_route=peer_route,
title=language_copy[language]['benchmarks_title'],
description=language_copy[language]['benchmarks_description'],
navigation=navigation,
assets=assets,
)
context.update({'benchmarks': benchmarks, 'verified': registry['verified']})
_render_page(environment, 'benchmarks.html', route_path(stage, route), context)
pages.append({
'route': route,
'language': language,
'canonical': context['canonical'],
'hreflang': context['peer_canonical'],
})
context = _page_context(
language='zh',
route='/404.html',
peer_route='/en/deploy/',
title=language_copy['zh']['not_found_title'],
description=language_copy['zh']['not_found_description'],
navigation=navigation,
assets=assets,
)
_render_page(environment, '404.html', route_path(stage, '/404.html'), context)
pages.append({
'route': '/404.html',
'language': 'zh',
'canonical': context['canonical'],
'hreflang': context['peer_canonical'],
})
_write_sitemap(stage)
manifest = {
'schema_version': 1,
'verified': registry['verified'],
'pages': pages,
'assets': dict(sorted(asset_hashes.items())),
}
(stage / 'deployment-manifest.json').write_text(
json.dumps(manifest, ensure_ascii=False, indent=2) + '\n',
encoding='utf-8',
)
if output_dir.exists():
shutil.rmtree(output_dir)
stage.replace(output_dir)
return manifest
except Exception:
shutil.rmtree(stage, ignore_errors=True)
raise
def main() -> int:
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument('--output', type=Path, required=True)
args = parser.parse_args()
manifest = build(args.output)
print(f"built {len(manifest['pages'])} product pages in {args.output}")
return 0
if __name__ == '__main__':
raise SystemExit(main())
@@ -0,0 +1,118 @@
{
"schema_version": 1,
"source": "https://www.funasr.com/ public static corpus",
"captured": "2026-07-26",
"files": {
"7ec404429c825fe9a9a030731bbca986.txt": "e0e4c945481cb03f52426d8420c3407ea18cd3b46cb2482590bd50e5aab117d2",
"blog/cantonese-speech-recognition.html": "f4a674f2b8f15963a386d586bb79d62f9f75c20d704ca2eafba21a800f52d4df",
"blog/chinese-speech-recognition.html": "a78eeb4e5ea38ce95ad05ebc54eceb0185d8dddd2286769b5ba1b7dd00e8b615",
"blog/fun-asr-nano-guide.html": "4e9a5c41c3846e482cc74e5379e642b16b6b35b680eea36a4cc79147933b76d5",
"blog/funasr-cli-transcribe-command-line.html": "84dd389969e2795bf8bb9054b2f88b2abc16893bf6f7a7673e1f2887827da12e",
"blog/funasr-llama-cpp-whisper-cpp-alternative.html": "328e5a173381c72d4b500e9d10c4532a0574f3e477b5567eb6de8c3dc1b9244a",
"blog/funasr-realtime-streaming-asr.html": "7b6c34ace6c4c782f5af9c3f52181c1b1ef08d32c4ea3fafab63b1f30a9e72db",
"blog/funasr-speaker-diarization.html": "451273993769f38de014160788581529788db8e4ca9fb56773d7723c51d96a52",
"blog/funasr-transcribe-long-audio.html": "4f7f593c114dd54b11e3cf2b2e7ddcfea6af29326034ce4a76c690d30f41ff28",
"blog/funasr-v1-3-26-openai-vllm-llama-cpp.html": "304453b66c09d65aaa35dfe679c7368c6c69d65ab68bae7d85c536aadecf44b1",
"blog/funasr-v1-3-27-language-metadata-vllm-fallback.html": "f1dbbc70fdd630c8a3953bda3b3a1697412b3c4bc25fc3969385583cd47874d2",
"blog/funasr-v1-3-28-realtime-websocket-subtitles.html": "46a8d4c310e7f76da632d558d057484f48b345d9616873e1416fc68fcb9e9633",
"blog/funasr-vs-faster-whisper-chinese.html": "bfe9bb8017be80c7e7f4587726f43f6064f1dc4c65e39788f836fdfb0c9789f7",
"blog/funasr-vs-whisper-benchmark.html": "b7b49adf24d20570abb09b733ce03d4a50a4a0e98e746b4a9320f453e01cce84",
"blog/funclip-v2-1-0-video-clipping-release.html": "88f6c44e5332d1746c4db0fc97d755ef82f12e46d8f1c1c0ad9351152ff9dfc1",
"blog/generate-subtitles-srt-vtt-from-audio-video.html": "dbaf77072a980c8c50f33cb74e9513dea5dba2d31bd802fade38dcb0bb97e849",
"blog/index.html": "de4764bd8fed5ed4040196e9cd9ec27952e14e5cd0eb4682295f1c6c4b1b3d65",
"blog/japanese-speech-recognition.html": "90f1f3bee4dcd72e414c6cb1ef9c0e580d5b7107356bc4285ac801affbb64486",
"blog/lightweight-speech-recognition-cpu.html": "d6270066222ed5baef0df108e6a4155f4a87bb5482169f23f218794d371f3281",
"blog/punctuation-restoration-python.html": "6cd26e03bf75b4343afd7b351c2681ebd513b058fb549c5888802be9ff3a1229",
"blog/self-hosted-deepgram-assemblyai-alternative.html": "13b4287b5ef0d3159bf0af09ece3bc1fea66f13390b13c7f33b8b5e85351a1f5",
"blog/self-hosted-google-aws-azure-speech-to-text.html": "8e4000fb9e2b33a48a3907d4bd0f55db57ba74121a89b5fa12b412c3c963f49a",
"blog/self-hosted-openai-whisper-api-alternative.html": "a749ad220d60398f8b1a637cacf68c48896a745350e1e982249caf32275c5002",
"blog/sensevoice-deployment-guide.html": "b2b05abdab33ceb40c9baefc24eb19c82068eb8fc1e87e76aa15d565bccfd28e",
"blog/sensevoice-emotion-language-detection.html": "6cd2a98e7813921754d33af9b2898f83dc9b1139482a34f2d0bb665189da67ee",
"blog/speech-to-text-python-transcribe-audio.html": "273c5e6fc6581ae995489d59c9f011de93a6c15e31f08fff56595bc0e6fd866f",
"blog/speech-to-text-timestamps-python.html": "78364db117dfbce45b03739679764cec7ab1d0a860f321c67154f33392fc6b8d",
"blog/voice-activity-detection-python.html": "9055206633caecb83c11031f273c8c9297852f44dfe50984e03ab59a7deda6b5",
"blog/which-funasr-model.html": "0109fe2d66f85c3cc917c822671ec0fb137247ee407f6c33459e6f2cadd05b5d",
"css/742.48d54c7d.css": "38906de250e9a46352e178d2744831db647ee8dfa8cb6d70cbe68f40e2dfcb5b",
"css/chunk-vendors.087a2961.css": "aa90b6322d18cf3f5f6199516471604c803caeffb1893167671eb9026de65db4",
"css/index.1682178c.css": "b5f6034ce886c25773928c114e4290d1c491a3d081677b488810198efd76b4e1",
"decoder.js": "f2023a28036b1ff58e5bdabbb72ea427f8faaf60e89acd78ff183c313bdb0a2c",
"donors.html": "eec6b789b29c27d372925ae0ad3e13d4c6e62978b3c38c4da9e3aec129f10934",
"ecosystem.html": "2214922049961927cc9f45cf379b7205b39b11ce0e687d294b3f60816a63d7a6",
"en/blog/cantonese-speech-recognition.html": "b9bd146198206f781c37f341c370a690dc83cd7163334e34b4e7f65e69af8ff2",
"en/blog/chinese-speech-recognition.html": "16b68bd2a1122236c580c62275002ae2c0875ca14e32686e88d3b5ccfa9f56ef",
"en/blog/fun-asr-nano-guide.html": "1746c708bd0606188de4266d8255984dd9e14634af33c54ad65a5f05b767be1b",
"en/blog/funasr-cli-transcribe-command-line.html": "1675699115f99e629d59f2a5323389d9405a6044c2a54efbcdd682c883c9322b",
"en/blog/funasr-llama-cpp-whisper-cpp-alternative.html": "ff1162a4691b113e133a0a9362ed5f2401899a0e0fdd7023bb4346e7df295f1a",
"en/blog/funasr-realtime-streaming-asr.html": "65c7353fcdc393fc0adec3969d9762edc8f30dc15d20e360a2b11508d8c60a91",
"en/blog/funasr-speaker-diarization.html": "db6511de2f356b7bf5e3f1f89b33991500a293c9d3bd2420d8a6cd6cf6cf3997",
"en/blog/funasr-transcribe-long-audio.html": "6d486c9cee4a8c339e09e60ecee579b7cd650ce512d1ac8fe25789e2489b87fb",
"en/blog/funasr-v1-3-26-openai-vllm-llama-cpp.html": "665c9c66c9af0e649cc3020859e3af65f6ec595dfdbf36923058b97dc5e2512e",
"en/blog/funasr-v1-3-27-language-metadata-vllm-fallback.html": "ffaca54d75c561bda82b6063b27f2a81d810f4f0e89030b6be7a64696ada44b4",
"en/blog/funasr-v1-3-28-realtime-websocket-subtitles.html": "233534cb4306387f1a9a695886a5f515679dff591d04b90827f41a668d7f7ada",
"en/blog/funasr-vs-faster-whisper-chinese.html": "abf31d3827dfba9b31ccd4e76229de9e4bfff00ab8bcee33bd718c88249630f4",
"en/blog/funasr-vs-whisper-benchmark.html": "367d4a8a1cc09ac932c80cdad065127925c5e5f942a806ace683c16dc1132769",
"en/blog/funclip-v2-1-0-video-clipping-release.html": "229baf59adf2c3290541d9b3c8a6243992406ba84b712714e9d14599205cb1d4",
"en/blog/generate-subtitles-srt-vtt-from-audio-video.html": "bd81aa43c6a977f28dd3925861bf456002fbacfec0df0504b413daa64ae60dfa",
"en/blog/index.html": "959760d77aee74bbe8075988763f49a171d2a8f899a2e7b745dfeac75ae83482",
"en/blog/japanese-speech-recognition.html": "8b106563142c291d3b86fad79a51e9c8746417b7750430e91296cc90764e570f",
"en/blog/lightweight-speech-recognition-cpu.html": "0e02c0e0853b12613d32c250f593c05c2052f18231207b63ee01d6e6600a86f7",
"en/blog/punctuation-restoration-python.html": "d6e30049f48d9dc6e6bc22eb567830013e4161eca51215616738b675dd1ffc40",
"en/blog/self-hosted-deepgram-assemblyai-alternative.html": "73b2fc101101fd2408ed49fdb2b0995ada59dec0016a91ed49efb856ebb8de53",
"en/blog/self-hosted-google-aws-azure-speech-to-text.html": "4a8453451722b3ec8735224a586744ddfbfec9458cedd433f9fc908351027e9a",
"en/blog/self-hosted-openai-whisper-api-alternative.html": "d6b4e0cfb26dd535ba634f01f1cc5a2e5cc2d71ce7d8e745698b33f13e7ca9cd",
"en/blog/sensevoice-deployment-guide.html": "c8e06e3ff6bd3ba333165faf047715107cccdb9e9df15bc52ca48de3d427cae7",
"en/blog/sensevoice-emotion-language-detection.html": "35ea4c9fc89b95b7b0de75c6138058717271d22222d5d0c502add275c068c794",
"en/blog/speech-to-text-python-transcribe-audio.html": "225d4334c591d53aa126d4f31bc4eb0cbaf0afb63c2486c7c934757a0a3627b9",
"en/blog/speech-to-text-timestamps-python.html": "6a7f8368f757c9ea50e287db6db3191ebcbbfc914f9a869b9515648b2d69790b",
"en/blog/voice-activity-detection-python.html": "d12f5d0f4ae07c3434f6188d12f5603b8abb9578413b79133668638d1c5e18a7",
"en/blog/which-funasr-model.html": "1207180aa929a3aa51db136c1098f4edc8f07405e2b56fe033998bf996f8ec7f",
"en/donors.html": "eacb7f9434b1b29e13e9b0175bb9680556ee72ab4dbd155e68f9c912eb0212b1",
"en/ecosystem.html": "259afda1471c6df08914756b25c0a4a9e0df2c7b1a021643cd8808377a8b6f58",
"en/index.html": "4950bc2e0b337637300c5bcd45d1820d9636c4f1dab34e0ec8d3443be44bd277",
"en/llama-cpp.html": "dbfbd125ebbf07f7d923c91b122818f8b09484ce54c1e80eba66a89d22dfb5b4",
"en/models.html": "07421617d1e56a6b5d239fc683bdf62d6bd9e5ecb0f4f82013ee9929cfd91829",
"en/quickstart.html": "2735cc9e608bfc7860eaa0c0e1242088d98204bca92cfec7ae7923a056f968c4",
"en/vs-whisper.html": "1779f98b2eae8579f3694577bc9dda81bd954423b49dd201ff17dcfb5e630ab1",
"favicon.ico": "e5edd9f12088fa920b848485c62c72a093f27bfba7b6a46b4e7b63c34eb5126a",
"img/banner.4f436d19.png": "d4fbab32267455f6b54f9af414d8e9847ab13812ef1f89f39a71f485bc0e0210",
"img/funclip-v2-1-0-interface.jpg": "35855be22612faa4e6ed8900a1dea33d793b33e7b1c2a32a768718d806c6ff69",
"img/hxgn.9cd1702a.png": "8020417e4d99f00d493524f559f03a6dac10e83769b328a5258284281f806ef2",
"img/lxwj-xx.1f3386b5.png": "53982aae5bfd23d483bd32103ee1f4326552faae6e8698c0807b0b97edef74fb",
"img/lxwjzxfw-bg.ac7d0fd0.png": "7a885e8a9d5b62a0328b654a594053920760ed5e488b909721d52b07554d57c5",
"img/mxjs-bg.e085eb31.png": "773f9462b525ad6b74e96387217e543d238a12b2af7f6c0d089f745291079551",
"img/mxjs.6724be62.png": "9d398c1aa1e55de7b3d7729886d5f2866c31f00e82c3b36ea7740d02e60ee1aa",
"img/sstx-bg.d7e580c1.png": "33a6bd3159f3748244f3c27545314010a33bb7d9749c95be3fc24f0075741a62",
"index.html": "95aa61940d7e48d3210899ec4b7d22bbd198ef7e3721b117e1e489f1e7b47b1a",
"index.js": "f10e5fff91ed36af5377609eefa067c7e22278d0dd8e558f065733ca99b93fd6",
"jessibuca.js": "02240fc0fdfa74ebe840cc6c818fc91a9c3cb830d9ebeddd9ca21b46168aa06f",
"js/742-legacy.a8705541.js": "bf11ce6893c6bb36593ee22ca053c94808f8d303925e1ab7366062bc467d1597",
"js/742.f9c39325.js": "653f74b49c412a8681694ed9093721b76760d9428e16a68fab8ec2ace7aa5cac",
"js/chunk-vendors-legacy.d75659ff.js": "049c63c771bd4defe608b326d4d0cdeaca5a984ae7c5ee248f84296937313441",
"js/chunk-vendors.b555fce6.js": "ca72887182ff8aedcb4a78da143db71380e56246b36c286bdc96cce3a8f96b0b",
"js/index-legacy.472ab715.js": "537eb869d8c2b60e8609fa2d1774ce73d6ccbe78b62730cc1466eefc8af9d3e3",
"js/index.deb34d40.js": "be4250ecf4b06c85bc03b4a5b13b26c628bdd47fa67ba6a430ad7afa2298c788",
"lang-redirect.js": "e1189080a8e81eb76cf39e0538d0378b6631f5aa87e4679c0fd4fd34d1f6c197",
"llama-cpp.html": "892b5c05e3375bcc7cd0af343b629f069d8ec4f372e6470cd830cdf2181a11d5",
"logo.png": "ac0ff97f2b0203c3fad4ac5e90231d93e36d98cc8e90d383483de150b0dd0728",
"models.html": "c05da7a2b1aaa7390d0e8d5135ed08646bfb50c357919ad160fd30049eb82364",
"quickstart.html": "90c5f25b428b064be02df11c38d24556ec97f4bc80900398c223424aaa48e7b8",
"robots.txt": "1305b0f680b3e9f73b01301dc474423230dffab85731a379a694f30c73c07f2d",
"sitemap.xml": "055e1fbf6da8689720eca3ce508b7115dfbb90ebf45cd4cab18d0b13d01aa139",
"static/liveplayer/liveplayer-component.min.js": "ea10fda35574cc3a77a3e7187095467d1a409009a2d39690051d33d0e7055d30",
"static/liveplayer/liveplayer-lib.min.js": "ad67b4e1188c586ec218674a6db9968daf71ed4fbc262258f061c1f931d54250",
"static/offline/index.html": "868781c621ddabe5d3f088d6b739e0c08e6cdc150587af6515cc323852018e62",
"static/offline/main.js": "3236a69d46115e78fb8a3f5e20ec0a37b668718bac3b708d5e4556daac39cc67",
"static/offline/pcm.js": "b0afc3c0e346995fe81daae7335e187ab3f2233307e45d3d72d42a67a576599b",
"static/offline/recorder-core.js": "bc011c625c2a9e780254b0f23ca388dc81c3d00502efb04fc78ba37d5e848fec",
"static/offline/wav.js": "63344c3e282b80349bdc64f7508f32346ce783609881dbfbc97827a36d594c35",
"static/offline/wsconnecter.js": "a619a1cab5e111c5ff4b77ec8e68e47f9dde6ba5d7a62ca2db0c1b083c33e8ca",
"static/online/index.html": "dd3192eb015c9344d73c49079aed2541672d2fb2399da3b3a083642733e54e3b",
"static/online/main.js": "b3d201dcd0ad1dc001a6569a5f414905ea7314e1fe2ac418947f170e4a2c2f3a",
"static/online/pcm.js": "b0afc3c0e346995fe81daae7335e187ab3f2233307e45d3d72d42a67a576599b",
"static/online/recorder-core.js": "bc011c625c2a9e780254b0f23ca388dc81c3d00502efb04fc78ba37d5e848fec",
"static/online/wav.js": "63344c3e282b80349bdc64f7508f32346ce783609881dbfbc97827a36d594c35",
"static/online/wsconnecter.js": "a619a1cab5e111c5ff4b77ec8e68e47f9dde6ba5d7a62ca2db0c1b083c33e8ca",
"voice/index.html": "1a6bae9e1637fea91f2f97506f5847ebd0ce429136444afa61f0a75da0beea0b",
"vs-whisper.html": "f465fc0cf17d4fee209c23b621058f3e87d816ef77402a18b509aa32b56864e3"
}
}
@@ -0,0 +1,403 @@
{
"schema_version": 1,
"verified": "2026-07-26",
"deployments": [
{
"id": "vllm",
"routes": {"zh": "/deploy/vllm.html", "en": "/en/deploy/vllm.html"},
"maturity": "community-verified",
"selector_rank": 10,
"workloads": ["batch", "private-api"],
"hardware": ["nvidia-gpu", "kubernetes"],
"priorities": ["throughput", "latency"],
"models": ["Fun-ASR-Nano-2512"],
"operating_systems": ["Linux"],
"interfaces": ["Python", "HTTP REST", "OpenAI-compatible HTTP", "WebSocket"],
"tested": {"funasr": "1.3.29", "runtime": "vLLM 0.19.1 guide", "verified": "2026-07-26"},
"commands": {
"install": ["pip install funasr", "pip install \"vllm==0.19.1\""],
"launch": ["CUDA_VISIBLE_DEVICES=0 python examples/industrial_data_pretraining/fun_asr_nano/serve_vllm.py --port 8899 --model FunAudioLLM/Fun-ASR-Nano-2512 --gpu-memory-utilization 0.5"],
"health": ["curl -fsS http://localhost:8899/health"],
"smoke": ["curl -X POST http://localhost:8899/v1/audio/transcriptions -F [email protected] -F model=fun-asr-nano -F response_format=verbose_json"]
},
"evidence": [
{"label": "vLLM guide", "url": "https://github.com/modelscope/FunASR/blob/main/docs/vllm_guide.md"},
{"label": "deployment matrix", "url": "https://github.com/modelscope/FunASR/blob/main/docs/deployment_matrix.md"}
],
"benchmarks": [
{
"model": "Fun-ASR-Nano-2512",
"runtime": "vLLM batch",
"hardware": "GPU model not recorded in the cited public table",
"workload": "Offline batch",
"audio": "184 long-form files; 11,541 seconds",
"settings": "Dynamic VAD; the public table does not record batch size or the full software and hardware stack",
"timing_scope": "Offline throughput; the cited table does not state whether warmup, file I/O, and decoding are excluded",
"result": "RTFx 340; CER 8.20%",
"qualification": "Incomplete hardware and timing record. Use only as public reference evidence, not a capacity promise.",
"source": "https://github.com/modelscope/FunASR/blob/main/docs/vllm_guide.md",
"verified": "2026-07-26"
}
],
"translations": {
"zh": {
"name": "vLLM GPU 高吞吐",
"summary": "用 Fun-ASR-Nano 在 NVIDIA GPU 上处理批量文件或提供兼容 OpenAI 的转写接口。",
"fit": ["批量录音转写", "需要提高 LLM 解码吞吐", "已有 NVIDIA GPU 服务环境"],
"not_fit": ["纯 CPU 或边缘设备", "Paraformer 等非自回归模型", "尚未完成显存与并发压测的公网服务"],
"selection_reason": "GPU 批处理和 vLLM 调度适合以吞吐为首要目标的 Fun-ASR-Nano 工作负载。",
"primary_limitation": "吞吐和显存占用取决于音频切分、批量、并发、GPU 型号与 vLLM 版本,必须按目标流量复测。",
"status_label": "社区验证",
"operations": ["固定 FunASR、vLLM、Torch 与 CUDA 组合", "预热模型后再采集容量数据", "记录队列等待、首结果和最终结果延迟"],
"security": ["在 API 网关实现认证、限流和请求大小限制", "服务端不直接暴露到公网", "隔离模型缓存和上传临时目录"],
"troubleshooting": ["先核对 NVIDIA 驱动与 vLLM 所带 CUDA", "重复输出时记录两次完整结果和精确版本", "长音频遗漏时检查 VAD 最大分段时长"]
},
"en": {
"name": "vLLM GPU throughput",
"summary": "Run Fun-ASR-Nano on NVIDIA GPUs for file batches or an OpenAI-compatible transcription endpoint.",
"fit": ["Batch recording transcription", "LLM decoder throughput is the priority", "An NVIDIA GPU serving environment already exists"],
"not_fit": ["CPU-only or edge devices", "Non-autoregressive models such as Paraformer", "Internet-facing service before memory and load tests"],
"selection_reason": "GPU batching and vLLM scheduling fit Fun-ASR-Nano workloads that prioritize throughput.",
"primary_limitation": "Throughput and memory depend on segmentation, batch size, concurrency, GPU, and vLLM version; retest with target traffic.",
"status_label": "Community verified",
"operations": ["Pin the FunASR, vLLM, Torch, and CUDA combination", "Warm the model before capacity measurement", "Measure queue, first-result, and final-result latency"],
"security": ["Put authentication, rate limits, and upload limits at an API gateway", "Do not expose the worker directly to the internet", "Isolate model cache and temporary upload storage"],
"troubleshooting": ["Match the NVIDIA driver to vLLM's CUDA build", "Capture two complete outputs and exact versions for repetition", "Check the VAD maximum segment length when long audio loses content"]
}
}
},
{
"id": "llama-cpp",
"routes": {"zh": "/deploy/llama-cpp.html", "en": "/en/deploy/llama-cpp.html"},
"maturity": "production-verified",
"selector_rank": 20,
"workloads": ["edge", "batch"],
"hardware": ["cpu", "desktop-edge-gpu"],
"priorities": ["portability", "compatibility"],
"models": ["SenseVoiceSmall-GGUF", "Paraformer-GGUF", "Fun-ASR-Nano-GGUF", "FSMN-VAD-GGUF"],
"operating_systems": ["Linux", "macOS", "Windows"],
"interfaces": ["CLI", "local HTTP server"],
"tested": {"funasr": "runtime-llamacpp-v0.1.9", "runtime": "pinned llama.cpp backend", "verified": "2026-07-26"},
"commands": {
"install": ["cmake -B build -DCMAKE_BUILD_TYPE=Release", "cmake --build build -j"],
"launch": ["./build/bin/llama-funasr-sensevoice -m funasr-gguf/sensevoice-small-q8.gguf --vad funasr-gguf/fsmn-vad.gguf -a sample.wav"],
"health": ["./build/bin/llama-funasr-sensevoice --help"],
"smoke": ["./runtime/llama.cpp/tests/run_regression.sh"]
},
"evidence": [
{"label": "llama.cpp runtime", "url": "https://github.com/modelscope/FunASR/blob/main/runtime/llama.cpp/README.md"},
{"label": "runtime release", "url": "https://github.com/modelscope/FunASR/releases/tag/runtime-llamacpp-v0.1.9"},
{"label": "regression tests", "url": "https://github.com/modelscope/FunASR/tree/main/runtime/llama.cpp/tests"}
],
"benchmarks": [
{
"model": "SenseVoiceSmall Q8 GGUF",
"runtime": "llama.cpp/GGUF with built-in FSMN-VAD",
"hardware": "CPU, 8 threads; CPU model not recorded in the cited report",
"workload": "Offline Mandarin CPU",
"audio": "184 Mandarin clips, about 44-60 seconds each; total duration not recorded in the cited report",
"settings": "Q8 runtime; built-in FSMN-VAD; micro-CER normalize_zh; model load excluded",
"timing_scope": "Sum of compute time divided by sum of audio duration; model load excluded",
"result": "Approximately 20x realtime; Q8 CER 8.17%",
"qualification": "CPU model and full software stack are not recorded. Reproduce on target hardware before comparison.",
"source": "https://github.com/modelscope/FunASR/blob/main/runtime/llama.cpp/BENCHMARKS.md",
"verified": "2026-07-26"
},
{
"model": "Paraformer Q8 GGUF",
"runtime": "llama.cpp/GGUF with built-in FSMN-VAD",
"hardware": "CPU, 8 threads; CPU model not recorded in the cited report",
"workload": "Offline Mandarin CPU",
"audio": "184 Mandarin clips, about 44-60 seconds each; total duration not recorded in the cited report",
"settings": "Q8 runtime; built-in FSMN-VAD; micro-CER normalize_zh; model load excluded",
"timing_scope": "Sum of compute time divided by sum of audio duration; model load excluded",
"result": "Approximately 21x realtime; Q8 CER 9.89%",
"qualification": "CPU model and full software stack are not recorded. Reproduce on target hardware before comparison.",
"source": "https://github.com/modelscope/FunASR/blob/main/runtime/llama.cpp/BENCHMARKS.md",
"verified": "2026-07-26"
}
],
"translations": {
"zh": {
"name": "llama.cpp / GGUF 独立运行",
"summary": "使用跨平台预编译包或源码构建,在 CPU、桌面 GPU 和边缘设备上运行 FunASR GGUF 模型。",
"fit": ["不依赖 Python ML 环境", "桌面应用和离线边缘部署", "需要 Linux、macOS、Windows 发布包"],
"not_fit": ["需要 vLLM 式大批量 GPU 调度", "未验证目标 GPU 架构的通用预编译 CUDA 包", "必须使用完整 Python 模型生态的流程"],
"selection_reason": "GGUF 运行时和独立二进制优先满足可移植、离线和低依赖部署。",
"primary_limitation": "预编译 GPU 包只覆盖标注的后端和架构;其他设备需要从源码构建并实机验证。",
"status_label": "生产验证",
"operations": ["按发布资产 SHA-256 校验下载", "模型和二进制使用同一发布清单", "保留旧二进制和模型目录用于回滚"],
"security": ["默认只读取本地音频和模型", "HTTP 服务绑定内网地址并限制上传大小", "不要从不可信地址加载 GGUF"],
"troubleshooting": ["CPU 路径先用 q8 模型验证", "CUDA 和 Vulkan 必须匹配本机驱动", "用仓库回归脚本区分模型问题与构建问题"]
},
"en": {
"name": "llama.cpp / GGUF standalone",
"summary": "Use cross-platform release packages or source builds to run FunASR GGUF models on CPUs, desktop GPUs, and edge devices.",
"fit": ["No Python ML environment", "Desktop applications and offline edge deployment", "Linux, macOS, and Windows release packages"],
"not_fit": ["vLLM-style large GPU batch scheduling", "A universal prebuilt CUDA package for an unverified GPU architecture", "Workflows that require the full Python model ecosystem"],
"selection_reason": "GGUF runtimes and standalone binaries prioritize portability, offline use, and low dependency count.",
"primary_limitation": "Prebuilt GPU packages cover only the documented backend and architecture; other devices require a source build and hardware validation.",
"status_label": "Production verified",
"operations": ["Verify release assets with SHA-256", "Keep models and binaries on the same release manifest", "Retain the previous binary and model directory for rollback"],
"security": ["Read local audio and models by default", "Bind the HTTP server to a private address and limit uploads", "Do not load GGUF files from untrusted sources"],
"troubleshooting": ["Validate the q8 CPU path first", "Match CUDA or Vulkan to the local driver", "Use repository regression scripts to separate model and build failures"]
}
}
},
{
"id": "openai-api",
"routes": {"zh": "/deploy/openai-api.html", "en": "/en/deploy/openai-api.html"},
"maturity": "production-verified",
"selector_rank": 30,
"workloads": ["private-api", "batch"],
"hardware": ["cpu", "nvidia-gpu", "kubernetes"],
"priorities": ["compatibility", "portability"],
"models": ["sensevoice", "paraformer", "paraformer-en", "fun-asr-nano"],
"operating_systems": ["Linux", "macOS", "Windows"],
"interfaces": ["OpenAI-compatible HTTP", "OpenAPI", "Python SDK", "JavaScript"],
"tested": {"funasr": "1.3.29", "runtime": "FastAPI and Uvicorn example", "verified": "2026-07-26"},
"commands": {
"install": ["pip install funasr fastapi uvicorn python-multipart"],
"launch": ["cd examples/openai_api && python server.py --model sensevoice --device cpu --port 8000"],
"health": ["curl -fsS http://localhost:8000/health", "curl -fsS http://localhost:8000/v1/models"],
"smoke": ["cd examples/openai_api && python smoke_test.py --base-url http://localhost:8000"]
},
"evidence": [
{"label": "OpenAI API server", "url": "https://github.com/modelscope/FunASR/blob/main/examples/openai_api/README.md"},
{"label": "OpenAPI contract", "url": "https://github.com/modelscope/FunASR/blob/main/examples/openai_api/OPENAPI.md"},
{"label": "security guide", "url": "https://github.com/modelscope/FunASR/blob/main/examples/openai_api/SECURITY.md"}
],
"benchmarks": [],
"translations": {
"zh": {
"name": "OpenAI 兼容私有 API",
"summary": "把 FunASR 模型作为 `/v1/audio/transcriptions` 私有服务接入现有 SDK、代理和工作流。",
"fit": ["替换云端转写 API", "复用 OpenAI SDK 或 HTTP 客户端", "需要健康检查和模型枚举"],
"not_fit": ["需要浏览器直接匿名访问生产服务", "没有网关但准备暴露公网", "严格实时逐块字幕"],
"selection_reason": "稳定的 OpenAI 音频接口能以最少客户端改动接入现有应用。",
"primary_limitation": "示例服务不内置生产认证、租户配额和全套可观测性,这些必须由网关和基础设施补齐。",
"status_label": "生产验证",
"operations": ["用 `/health` 做就绪探针", "用 `/v1/models` 验证加载模型", "模型缓存使用持久卷并在发布前预热"],
"security": ["认证、配额、审计和 TLS 在网关实现", "限制 MIME、文件大小和请求时长", "服务仅接受可信反向代理流量"],
"troubleshooting": ["先运行仓库 smoke_test.py", "核对客户端 base_url 必须包含 `/v1`", "将模型加载错误与请求格式错误分开排查"]
},
"en": {
"name": "OpenAI-compatible private API",
"summary": "Serve FunASR models through `/v1/audio/transcriptions` for existing SDKs, agents, and workflows.",
"fit": ["Replacing a cloud transcription API", "Reusing OpenAI SDK or HTTP clients", "Health checks and model discovery are required"],
"not_fit": ["Anonymous browser access to a production worker", "Public exposure without a gateway", "Strict chunk-by-chunk live captions"],
"selection_reason": "A stable OpenAI audio contract integrates with existing applications with minimal client changes.",
"primary_limitation": "The example server does not include production authentication, tenant quotas, or full observability; provide them at the gateway and infrastructure layers.",
"status_label": "Production verified",
"operations": ["Use `/health` for readiness", "Use `/v1/models` to verify loaded models", "Persist and warm the model cache before rollout"],
"security": ["Implement authentication, quotas, audit, and TLS at the gateway", "Limit MIME types, file sizes, and request duration", "Accept traffic only from trusted reverse proxies"],
"troubleshooting": ["Run the repository smoke_test.py first", "Ensure the client base_url includes `/v1`", "Separate model-loading failures from request-format failures"]
}
}
},
{
"id": "realtime",
"routes": {"zh": "/deploy/realtime.html", "en": "/en/deploy/realtime.html"},
"maturity": "community-verified",
"selector_rank": 40,
"workloads": ["realtime"],
"hardware": ["cpu", "nvidia-gpu", "kubernetes"],
"priorities": ["latency", "compatibility"],
"models": ["Paraformer-online", "FSMN-VAD", "CT-Transformer punctuation", "Fun-ASR-Nano realtime"],
"operating_systems": ["Linux"],
"interfaces": ["WebSocket", "Python client", "C++ client", "Go client"],
"tested": {"funasr": "1.3.29", "runtime": "Python and C++ WebSocket runtimes", "verified": "2026-07-26"},
"commands": {
"install": ["pip install funasr websockets ffmpeg-python"],
"launch": ["cd runtime/python/websocket && python funasr_wss_server.py --port 10095"],
"health": ["ss -ltn | grep 10095"],
"smoke": ["cd runtime/python/websocket && python funasr_wss_client.py --host 127.0.0.1 --port 10095 --mode 2pass --chunk_size \"8,8,4\" --audio_in ../../tests/test_audio/zh.wav"]
},
"evidence": [
{"label": "Python WebSocket runtime", "url": "https://github.com/modelscope/FunASR/blob/main/runtime/python/websocket/README.md"},
{"label": "WebSocket protocol", "url": "https://github.com/modelscope/FunASR/blob/main/runtime/docs/websocket_protocol.md"},
{"label": "realtime benchmark method", "url": "https://github.com/modelscope/FunASR/blob/main/docs/benchmark/realtime_ws_benchmark.md"}
],
"benchmarks": [],
"translations": {
"zh": {
"name": "实时流式与字幕",
"summary": "通过 WebSocket 在线或 2-pass 协议处理麦克风、会议字幕和实时语音流。",
"fit": ["实时字幕", "客户端持续推送 PCM 音频", "需要在线初稿与离线修订"],
"not_fit": ["只转写完整文件", "客户端不能处理断线重连和背压", "未定义端点与最终结果语义"],
"selection_reason": "WebSocket 和 2-pass 协议为持续音频流提供低延迟初稿与最终结果。",
"primary_limitation": "真实容量由音频实时比、分块、VAD、连接数和客户端背压共同决定,文件 RTFx 不能替代并发测试。",
"status_label": "社区验证",
"operations": ["监控活动连接、积压音频秒数和最终结果延迟", "验证优雅断开与重连", "固定 chunk_size、VAD 和标点配置"],
"security": ["在反向代理限制来源、连接数和消息大小", "使用 TLS WebSocket", "不在 URL 查询参数传递长期凭证"],
"troubleshooting": ["先用仓库客户端和固定 WAV 验证", "确认 PCM16、16 kHz、单声道", "分别记录首稿和最终结果时刻"]
},
"en": {
"name": "Realtime streaming and captions",
"summary": "Use online or two-pass WebSocket protocols for microphones, meeting captions, and continuous speech streams.",
"fit": ["Live captions", "Clients continuously send PCM audio", "Online drafts plus offline correction"],
"not_fit": ["Complete-file transcription only", "Clients cannot handle reconnects and backpressure", "Endpoint and final-result semantics are undefined"],
"selection_reason": "WebSocket and two-pass protocols provide low-latency drafts and final results for continuous audio.",
"primary_limitation": "Capacity depends on realtime ratio, chunks, VAD, connection count, and client backpressure; file RTFx does not replace concurrency tests.",
"status_label": "Community verified",
"operations": ["Monitor active connections, queued audio seconds, and final latency", "Validate graceful disconnect and reconnect", "Pin chunk_size, VAD, and punctuation configuration"],
"security": ["Limit origins, connections, and message size at the proxy", "Use TLS WebSocket", "Do not put long-lived credentials in URL query strings"],
"troubleshooting": ["Start with the repository client and a fixed WAV", "Confirm PCM16, 16 kHz, mono audio", "Record draft and final-result timestamps separately"]
}
}
},
{
"id": "containers",
"routes": {"zh": "/deploy/containers.html", "en": "/en/deploy/containers.html"},
"maturity": "community-verified",
"selector_rank": 25,
"workloads": ["private-api", "batch", "realtime"],
"hardware": ["kubernetes", "cpu", "nvidia-gpu"],
"priorities": ["portability", "compatibility"],
"models": ["sensevoice", "paraformer", "fun-asr-nano"],
"operating_systems": ["Linux containers", "Kubernetes"],
"interfaces": ["Docker Compose", "Kubernetes ClusterIP", "OpenAI-compatible HTTP"],
"tested": {"funasr": "1.3.29", "runtime": "Docker Compose and Kubernetes templates", "verified": "2026-07-26"},
"commands": {
"install": ["cd examples/openai_api && cp .env.example .env"],
"launch": ["docker compose up --build"],
"health": ["curl -fsS http://localhost:8000/health"],
"smoke": ["python examples/openai_api/smoke_test.py --base-url http://localhost:8000"]
},
"evidence": [
{"label": "deployment matrix", "url": "https://github.com/modelscope/FunASR/blob/main/docs/deployment_matrix.md"},
{"label": "Kubernetes template", "url": "https://github.com/modelscope/FunASR/tree/main/examples/openai_api/kubernetes"},
{"label": "Docker installation", "url": "https://github.com/modelscope/FunASR/blob/main/docs/installation/docker.md"}
],
"benchmarks": [],
"translations": {
"zh": {
"name": "容器与 Kubernetes",
"summary": "用 Docker Compose 验证,再用带持久模型缓存、探针和 ClusterIP 的 Kubernetes 模板部署。",
"fit": ["需要可重复环境", "已有容器平台", "需要滚动发布和持久模型缓存"],
"not_fit": ["尚未验证本地模型和接口", "GPU 镜像与集群调度未准备", "把示例 Compose 直接当作公网生产架构"],
"selection_reason": "容器模板适合把已验证的 FunASR API 纳入现有发布和编排体系。",
"primary_limitation": "CPU 示例不是 CUDA 生产镜像;GPU 驱动、镜像、调度和容量仍需平台团队验证。",
"status_label": "社区验证",
"operations": ["模型缓存使用持久卷", "就绪探针检查 `/health`", "部署前完成镜像和模型预热"],
"security": ["默认使用私有 ClusterIP", "Secret 不写入镜像和仓库", "入口网关承担 TLS、认证和限流"],
"troubleshooting": ["先让 CPU Compose smoke test 通过", "区分镜像拉取、模型下载和推理错误", "GPU Pod 核对设备插件、驱动和运行时"]
},
"en": {
"name": "Containers and Kubernetes",
"summary": "Validate with Docker Compose, then deploy with the Kubernetes template, persistent model cache, probes, and private ClusterIP.",
"fit": ["Reproducible environments", "An existing container platform", "Rolling releases and persistent model cache"],
"not_fit": ["The local model and API are not yet validated", "GPU images and cluster scheduling are not ready", "Using the example Compose file as a public production architecture"],
"selection_reason": "Container templates bring an already validated FunASR API into an existing release and orchestration system.",
"primary_limitation": "The CPU example is not a CUDA production image; GPU drivers, image, scheduling, and capacity still require platform validation.",
"status_label": "Community verified",
"operations": ["Persist the model cache", "Use `/health` for readiness", "Warm images and models before rollout"],
"security": ["Use a private ClusterIP by default", "Keep secrets out of images and source control", "Put TLS, authentication, and rate limits at ingress"],
"troubleshooting": ["Pass the CPU Compose smoke test first", "Separate image pull, model download, and inference failures", "Check device plugin, driver, and runtime for GPU pods"]
}
}
},
{
"id": "cpu-runtime",
"routes": {"zh": "/deploy/cpu-runtime.html", "en": "/en/deploy/cpu-runtime.html"},
"maturity": "community-verified",
"selector_rank": 60,
"workloads": ["batch", "realtime", "edge"],
"hardware": ["cpu"],
"priorities": ["latency", "portability", "compatibility"],
"models": ["Paraformer", "Paraformer-online", "SenseVoiceSmall", "FSMN-VAD", "CT-Transformer punctuation"],
"operating_systems": ["Linux", "macOS", "Windows"],
"interfaces": ["C++", "ONNX Runtime", "Python ONNX", "HTTP", "WebSocket"],
"tested": {"funasr": "1.3.29", "runtime": "ONNX Runtime C++ and Python", "verified": "2026-07-26"},
"commands": {
"install": ["cd runtime/onnxruntime && cmake -B build -DCMAKE_BUILD_TYPE=Release", "cmake --build build -j"],
"launch": ["python runtime/python/onnxruntime/demo_sencevoice_small.py"],
"health": ["test -x runtime/onnxruntime/build/bin/funasr-onnx-offline"],
"smoke": ["python runtime/python/onnxruntime/demo_paraformer_offline.py"]
},
"evidence": [
{"label": "ONNX C++ runtime", "url": "https://github.com/modelscope/FunASR/blob/main/runtime/onnxruntime/readme.md"},
{"label": "Python ONNX runtime", "url": "https://github.com/modelscope/FunASR/blob/main/runtime/python/onnxruntime/README.md"},
{"label": "CPU benchmark guide", "url": "https://github.com/modelscope/FunASR/blob/main/runtime/docs/benchmark_onnx_cpp.md"}
],
"benchmarks": [],
"translations": {
"zh": {
"name": "ONNX / C++ CPU 运行时",
"summary": "在通用 CPU 上用 ONNX Runtime 和 C++ 路径部署离线、在线与 2-pass ASR。",
"fit": ["CPU 高并发服务", "嵌入式或本地应用", "现有 Paraformer 在线链路已经满足质量"],
"not_fit": ["需要 LLM 解码和开放式指令", "未经测试就迁移成熟 CPU 流量到 GPU", "依赖特定 Python 业务插件"],
"selection_reason": "ONNX/C++ 路径适合低依赖、可控延迟和已证明的 CPU 并发。",
"primary_limitation": "模型转换、算子支持和线程参数受平台影响;必须使用目标 CPU 与真实音频测容量。",
"status_label": "社区验证",
"operations": ["固定 ONNX Runtime 与模型版本", "分别设置模型、解码和 I/O 线程", "监控实时比、CPU 饱和度与队列"],
"security": ["限制本地文件和网络输入边界", "服务模式限制请求大小和并发", "模型目录只读并校验来源"],
"troubleshooting": ["先运行单文件离线示例", "线程增加不等于吞吐线性增加", "热词不足先评估确定性文本后处理"]
},
"en": {
"name": "ONNX / C++ CPU runtime",
"summary": "Deploy offline, online, and two-pass ASR on general CPUs with ONNX Runtime and C++ paths.",
"fit": ["High-concurrency CPU services", "Embedded or local applications", "An existing Paraformer online path already meets quality goals"],
"not_fit": ["LLM decoding and open-ended instructions", "Moving proven CPU traffic to GPU without tests", "Workflows that depend on Python-only business plugins"],
"selection_reason": "ONNX/C++ fits low-dependency, controlled-latency, proven CPU concurrency.",
"primary_limitation": "Model conversion, operator support, and thread settings vary by platform; measure capacity on the target CPU with real audio.",
"status_label": "Community verified",
"operations": ["Pin ONNX Runtime and model versions", "Tune model, decoder, and I/O threads separately", "Monitor realtime ratio, CPU saturation, and queue depth"],
"security": ["Bound local file and network inputs", "Limit request size and concurrency in service mode", "Keep model directories read-only and verify their source"],
"troubleshooting": ["Start with a single-file offline example", "More threads do not guarantee linear throughput", "Evaluate deterministic text post-processing before changing models for fixed terms"]
}
}
},
{
"id": "production",
"routes": {"zh": "/deploy/production.html", "en": "/en/deploy/production.html"},
"maturity": "production-verified",
"selector_rank": 70,
"workloads": ["private-api", "batch", "realtime", "edge"],
"hardware": ["cpu", "nvidia-gpu", "desktop-edge-gpu", "kubernetes"],
"priorities": ["compatibility", "latency", "throughput", "portability"],
"models": ["All supported deployment models"],
"operating_systems": ["Linux", "macOS", "Windows", "Kubernetes"],
"interfaces": ["HTTP", "WebSocket", "CLI", "C++"],
"tested": {"funasr": "1.3.29", "runtime": "cross-runtime production checklist", "verified": "2026-07-26"},
"commands": {
"install": ["git clone https://github.com/modelscope/FunASR.git"],
"launch": ["Run the selected runtime with pinned versions and an immutable model cache"],
"health": ["Verify readiness, model identity, and one known-audio transcript"],
"smoke": ["Record version, model digest, hardware, warmup, audio duration, concurrency, latency, and output before promotion"]
},
"evidence": [
{"label": "deployment matrix", "url": "https://github.com/modelscope/FunASR/blob/main/docs/deployment_matrix.md"},
{"label": "reproducible benchmark method", "url": "https://github.com/modelscope/FunASR/blob/main/docs/benchmark/rtf_reproducibility.md"},
{"label": "API security guide", "url": "https://github.com/modelscope/FunASR/blob/main/examples/openai_api/SECURITY.md"}
],
"benchmarks": [],
"translations": {
"zh": {
"name": "生产上线检查",
"summary": "把模型能运行推进到可观测、可扩缩、可回滚且边界清晰的生产服务。",
"fit": ["准备上线或扩容", "需要容量、就绪和安全边界", "需要可审计的发布与回滚"],
"not_fit": ["用单次演示结果代替容量测试", "省略网关和访问控制", "没有版本、模型和硬件记录的性能比较"],
"selection_reason": "无论选择哪种运行时,生产检查都是发布前的共同必经路径。",
"primary_limitation": "清单不能替代目标业务的负载、准确率、故障和安全演练。",
"status_label": "生产验证",
"operations": ["区分存活、就绪和业务 smoke test", "容量测试包含预热、队列和音频分布", "发布保留模型、配置和上一版本回滚点"],
"security": ["网络入口默认拒绝并最小授权", "上传、日志、缓存和临时文件有保留策略", "凭证、音频和预签名 URL 不写入普通日志"],
"troubleshooting": ["先确认模型和运行时精确版本", "使用已知音频区分基础设施与质量回归", "故障时先回滚再做在线试错"]
},
"en": {
"name": "Production rollout checklist",
"summary": "Move from a runnable model to an observable, scalable, reversible production service with explicit boundaries.",
"fit": ["Preparing a launch or scale-up", "Capacity, readiness, and security boundaries are required", "Auditable release and rollback are required"],
"not_fit": ["Using one demo result as a capacity test", "Omitting gateway and access control", "Comparing performance without version, model, and hardware records"],
"selection_reason": "Production readiness is a required path before release regardless of the selected runtime.",
"primary_limitation": "A checklist does not replace workload, accuracy, failure, and security exercises for the target product.",
"status_label": "Production verified",
"operations": ["Separate liveness, readiness, and business smoke tests", "Include warmup, queueing, and audio distribution in capacity tests", "Keep model, configuration, and previous-version rollback points"],
"security": ["Default-deny network access and grant minimum privileges", "Define retention for uploads, logs, caches, and temporary files", "Keep credentials, audio, and presigned URLs out of normal logs"],
"troubleshooting": ["Confirm exact model and runtime versions first", "Use known audio to separate infrastructure and quality regressions", "Roll back before experimenting during an incident"]
}
}
}
]
}
@@ -0,0 +1,12 @@
{
"items": [
{"id": "product", "zh": "产品", "en": "Product", "href_zh": "/", "href_en": "/en/"},
{"id": "deploy", "zh": "部署", "en": "Deploy", "href_zh": "/deploy/", "href_en": "/en/deploy/"},
{"id": "models", "zh": "模型", "en": "Models", "href_zh": "/models.html", "href_en": "/en/models.html"},
{"id": "benchmarks", "zh": "性能", "en": "Benchmarks", "href_zh": "/benchmarks.html", "href_en": "/en/benchmarks.html"},
{"id": "ecosystem", "zh": "生态", "en": "Ecosystem", "href_zh": "/ecosystem.html", "href_en": "/en/ecosystem.html"},
{"id": "blog", "zh": "博客", "en": "Blog", "href_zh": "/blog/", "href_en": "/en/blog/"},
{"id": "docs", "zh": "文档", "en": "Docs", "href_zh": "https://github.com/modelscope/FunASR/tree/main/docs", "href_en": "https://github.com/modelscope/FunASR/tree/main/docs"},
{"id": "donors", "zh": "功德榜", "en": "Donors", "href_zh": "/donors.html", "href_en": "/en/donors.html"}
]
}
+150
View File
@@ -0,0 +1,150 @@
"""Normalize legacy page navigation and language metadata without rewriting content."""
from __future__ import annotations
import json
import re
from html import escape
from pathlib import Path
from bs4 import BeautifulSoup
SITE_ROOT = Path(__file__).resolve().parent
BASE_URL = 'https://www.funasr.com'
METADATA_START = '<!-- product-site-metadata:start -->'
METADATA_END = '<!-- product-site-metadata:end -->'
NAVIGATION = json.loads(
(SITE_ROOT / 'data' / 'navigation.json').read_text(encoding='utf-8')
)
def _peer_route(route: str, language: str) -> str:
if language == 'zh':
if route == '/':
return '/en/'
return f'/en{route}'
if route == '/en/':
return '/'
if not route.startswith('/en/'):
raise ValueError(f'English legacy route must start with /en/: {route}')
return route[3:]
def _canonical_routes(route: str, language: str) -> tuple[str, str]:
if route in {'/llama-cpp.html', '/en/llama-cpp.html'}:
if language == 'zh':
return '/deploy/llama-cpp.html', '/en/deploy/llama-cpp.html'
return '/en/deploy/llama-cpp.html', '/deploy/llama-cpp.html'
return route, _peer_route(route, language)
def _navigation_markup(language: str, peer_route: str) -> str:
label_key = 'zh' if language == 'zh' else 'en'
href_key = 'href_zh' if language == 'zh' else 'href_en'
links = ''.join(
f'<a href="{escape(item[href_key], quote=True)}">{escape(item[label_key])}</a>'
for item in NAVIGATION['items']
)
peer_label = 'EN' if language == 'zh' else '中文'
return (
'<nav class="nav" data-product-navigation="true"><div class="container">'
f'<a href="{"/" if language == "zh" else "/en/"}" class="nav-logo">'
'Fun<span>ASR</span></a>'
f'<div class="nav-links">{links}</div>'
f'<a href="{escape(peer_route, quote=True)}" data-language-peer '
f'style="font-size:0.83rem;font-weight:500;color:var(--text-soft)">{peer_label}</a>'
'<a href="https://github.com/modelscope/FunASR" target="_blank" '
'rel="noopener" class="nav-btn">GitHub</a></div></nav>'
)
def _replace_navigation(html: str, replacement: str) -> str:
start = re.search(
r'<nav\b(?=[^>]*\bclass\s*=\s*["\'][^"\']*\bnav\b)[^>]*>',
html,
re.IGNORECASE,
)
if start is None:
raise ValueError('Unable to locate legacy navigation in source')
end = re.search(r'</nav\s*>', html[start.end():], re.IGNORECASE)
if end is None:
raise ValueError('Unable to locate closing legacy navigation in source')
end_position = start.end() + end.end()
return html[:start.start()] + replacement + html[end_position:]
def _remove_metadata_links(html: str) -> str:
def replacement(match: re.Match[str]) -> str:
fragment = match.group(0)
link = BeautifulSoup(fragment, 'html.parser').find('link')
if link is None:
return fragment
rel = {str(value).lower() for value in link.get('rel', [])}
href = str(link.get('href', ''))
if rel.intersection({'canonical', 'alternate'}) or 'fonts.googleapis.com' in href:
return ''
return fragment
return re.sub(r'<link\b[^>]*>', replacement, html, flags=re.IGNORECASE)
def _remove_excluded_runtime_dependencies(html: str) -> str:
return re.sub(
r'<script\b(?=[^>]*\bsrc\s*=\s*["\']/stats/tracker\.js(?:\?[^"\']*)?["\'])'
r'[^>]*>\s*</script>',
'',
html,
flags=re.IGNORECASE,
)
def _metadata_markup(route: str, language: str) -> str:
canonical_route, peer_route = _canonical_routes(route, language)
peer_language = 'en' if language == 'zh' else 'zh-CN'
current_language = 'zh-CN' if language == 'zh' else 'en'
return '\n'.join((
METADATA_START,
f'<link rel="canonical" href="{BASE_URL}{canonical_route}">',
f'<link rel="alternate" hreflang="{peer_language}" href="{BASE_URL}{peer_route}">',
f'<link rel="alternate" hreflang="{current_language}" href="{BASE_URL}{canonical_route}">',
f'<link rel="alternate" hreflang="x-default" href="{BASE_URL}{peer_route if language == "zh" else canonical_route}">',
METADATA_END,
))
def normalize_document(html: str, route: str, language: str) -> str:
"""Return a legacy page with product navigation and canonical metadata."""
if language not in {'zh', 'en'}:
raise ValueError(f'Unsupported language: {language}')
if not route.startswith('/'):
raise ValueError(f'Route must start with /: {route}')
soup = BeautifulSoup(html, 'html.parser')
navigation = soup.select('nav.nav')
if len(navigation) != 1:
raise ValueError(f'Expected one legacy navigation shell, found {len(navigation)}')
if soup.head is None:
raise ValueError('Expected a legacy document head')
peer_route = _peer_route(route, language)
normalized = _replace_navigation(
html,
_navigation_markup(language, peer_route),
)
normalized = _remove_excluded_runtime_dependencies(normalized)
marker_pattern = re.compile(
re.escape(METADATA_START) + r'.*?' + re.escape(METADATA_END),
re.DOTALL,
)
metadata = _metadata_markup(route, language)
if marker_pattern.search(normalized):
return marker_pattern.sub(metadata, normalized, count=1)
normalized = _remove_metadata_links(normalized)
head_close = normalized.lower().find('</head>')
if head_close < 0:
raise ValueError('Expected a closing legacy document head')
return normalized[:head_close] + metadata + '\n' + normalized[head_close:]
@@ -0,0 +1 @@
7ec404429c825fe9a9a030731bbca986
@@ -0,0 +1,137 @@
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>粤语语音识别:SenseVoice 原生支持粤语口语(Whisper 会转成普通话)| FunASR 博客</title>
<meta name="description" content="开源粤语语音识别怎么做?SenseVoice 原生支持粤语(yue),自动识别语种并输出地道粤语口语(呢/唔/嘅);Whisper 只会当中文转成普通话书面语。3 行 Python,附同一段音频的真实对比输出。">
<meta name="keywords" content="粤语语音识别, 粤语转文字, 粤语转录, 广东话识别, SenseVoice, 开源语音识别, Whisper 替代, FunASR, 语音识别 python, cantonese">
<link rel="icon" href="/logo.png">
<meta property="og:title" content="粤语语音识别:SenseVoice 原生支持粤语口语(Whisper 会转成普通话)| FunASR 博客">
<meta property="og:description" content="开源粤语语音识别怎么做?SenseVoice 原生支持粤语(yue),自动识别语种并输出地道粤语口语(呢/唔/嘅);Whisper 只会当中文转成普通话书面语。3 行 Python,附同一段音频的真实对比输出。">
<meta property="og:type" content="article">
<meta property="og:url" content="https://www.funasr.com/blog/cantonese-speech-recognition.html">
<meta property="og:image" content="https://www.funasr.com/logo.png">
<link rel="canonical" href="https://www.funasr.com/blog/cantonese-speech-recognition.html">
<link rel="alternate" hreflang="en" href="https://www.funasr.com/en/blog/cantonese-speech-recognition.html">
<link rel="alternate" hreflang="zh" href="https://www.funasr.com/blog/cantonese-speech-recognition.html">
<link rel="alternate" hreflang="x-default" href="https://www.funasr.com/en/blog/cantonese-speech-recognition.html">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"BlogPosting","headline":"粤语语音识别:SenseVoice 原生支持粤语口语(Whisper 会转成普通话)| FunASR 博客","description":"开源粤语语音识别怎么做?SenseVoice 原生支持粤语(yue),自动识别语种并输出地道粤语口语(呢/唔/嘅);Whisper 只会当中文转成普通话书面语。3 行 Python,附同一段音频的真实对比输出。","datePublished":"2026-06-21","dateModified":"2026-06-21","author":{"@type":"Organization","name":"FunASR / Tongyi Lab"},"publisher":{"@type":"Organization","name":"FunASR","logo":{"@type":"ImageObject","url":"https://www.funasr.com/logo.png"}},"mainEntityOfPage":{"@type":"WebPage","@id":"https://www.funasr.com/blog/cantonese-speech-recognition.html"},"image":"https://www.funasr.com/logo.png"}
</script>
<style>:root{--primary:#2563eb;--primary-dark:#1d4ed8;--bg:#fff;--surface:#f8fafc;--border:#e2e8f0;--text:#0f172a;--text-soft:#475569;--text-muted:#94a3b8;--radius:12px}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:'Inter',-apple-system,sans-serif;color:var(--text);line-height:1.7}
a{color:var(--primary);text-decoration:none}a:hover{text-decoration:underline}
.container{max-width:800px;margin:0 auto;padding:0 24px}
.nav{position:fixed;top:0;left:0;right:0;z-index:100;background:rgba(255,255,255,0.9);backdrop-filter:blur(12px);border-bottom:1px solid var(--border);padding:14px 0}
.nav .container{max-width:1120px;display:flex;align-items:center;gap:24px}
.nav-logo{font-size:1.2rem;font-weight:800;color:var(--text)}.nav-logo span{color:var(--primary)}
.nav-links{display:flex;gap:20px;margin-left:auto;flex-wrap:wrap}
.nav-links a{font-size:0.85rem;font-weight:500;color:var(--text-soft)}
.nav-btn{padding:7px 16px;background:var(--primary);color:#fff;border-radius:7px;font-size:0.83rem;font-weight:600}
article{padding:120px 0 80px}
h1{font-size:2rem;font-weight:800;line-height:1.3;margin-bottom:14px}
h2{font-size:1.3rem;font-weight:700;margin:36px 0 14px;padding-top:16px;border-top:1px solid var(--border)}
h3{font-size:1.05rem;font-weight:700;margin:22px 0 10px}
p{margin-bottom:14px;color:var(--text-soft)}
ul,ol{margin:0 0 14px 22px;color:var(--text-soft)}li{margin-bottom:6px}
table{width:100%;border-collapse:collapse;margin:16px 0;font-size:0.86rem}
th,td{padding:10px 12px;text-align:left;border-bottom:1px solid var(--border)}
th{font-weight:600;background:var(--surface);font-size:0.78rem;color:var(--text-muted)}
pre{background:#1e293b;color:#e2e8f0;padding:18px;border-radius:10px;overflow-x:auto;font-size:0.82rem;line-height:1.7;margin:14px 0}
code{font-family:ui-monospace,Menlo,monospace}
p code,li code{background:var(--surface);padding:2px 6px;border-radius:5px;font-size:0.85em;color:var(--primary-dark)}
.post-meta{color:var(--text-muted);font-size:0.85rem;margin-bottom:24px}
.cta{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:24px;margin:28px 0;text-align:center}
.cta a.btn{display:inline-block;padding:10px 24px;background:var(--primary);color:#fff;border-radius:8px;font-weight:600}
.post-list{list-style:none;margin:0;padding:0}
.post-list li{margin:0 0 8px}
.post-card{display:block;border:1px solid var(--border);border-radius:var(--radius);padding:20px 22px;margin-bottom:14px}
.post-card:hover{border-color:var(--primary);text-decoration:none}
.post-card h2{border:none;padding:0;margin:0 0 6px;font-size:1.15rem;color:var(--text)}
.post-card p{margin:0;color:var(--text-soft);font-size:0.9rem}
.post-card .date{color:var(--text-muted);font-size:0.8rem}
footer{background:#0f172a;color:#94a3b8;padding:28px 0;text-align:center;font-size:0.8rem}
footer a{color:#94a3b8}</style>
</head>
<body>
<nav class="nav"><div class="container"><a href="/" class="nav-logo">Fun<span>ASR</span></a><div class="nav-links"><a href="/#capabilities">核心能力</a><a href="/#usage">如何使用</a><a href="/#benchmark">性能</a><a href="/#demo">演示</a><a href="https://modelscope.github.io/FunASR/zh/" target="_blank">文档</a><a href="/quickstart.html">快速上手</a><a href="/models.html">模型</a><a href="/ecosystem.html">生态</a><a href="/blog/">技术博客</a><a href="/vs-whisper.html">对比 Whisper</a><a href="/donors.html">功德榜</a></div><a href="https://www.funasr.com/en/blog/cantonese-speech-recognition.html" style="font-size:0.83rem;font-weight:500;color:var(--text-soft)">EN</a><a href="https://github.com/modelscope/FunASR" target="_blank" class="nav-btn">GitHub ★</a></div></nav>
<article><div class="container">
<h1>粤语语音识别:SenseVoice 原生输出地道粤语口语(Whisper 会转成普通话)</h1>
<p class="post-meta">2026-06-21 · FunASR 团队</p>
<p>全球约有 <strong>8500 万</strong>粤语使用者,但开源语音识别对粤语的支持一直很弱。Whisper 名义上有粤语,实际上它把粤语<strong>当成中文(zh)处理、转写成普通话书面语</strong>——<code>唔</code> 变 <code>不</code>、<code>嘅</code> 变 <code>的</code>、<code>呢</code> 变 <code>這</code>,地道的粤语口语就这么没了。</p>
<p><strong>SenseVoice</strong>(FunAudioLLM 团队开源的多语种语音理解模型)<strong>原生支持粤语(yue)</strong>:自动识别语种、保留真正的粤语口语用字,一次非自回归前向就给出结果。下面是同一段粤语音频的真实对比。</p>
<h2>真实对比:同一段粤语音频</h2>
<p>用 SenseVoice 自带的粤语示例 <code>yue.mp3</code> 实测,两个模型的真实输出:</p>
<table>
<tr><th>模型</th><th>识别语种</th><th>输出</th></tr>
<tr><td><strong>SenseVoice</strong></td><td><code>yue</code>(粤语)</td><td>呢几个字都表达<strong>唔</strong>到,我想讲<strong>嘅</strong>意思。</td></tr>
<tr><td>Whisper-small</td><td><code>zh</code>(中文)</td><td>這幾個字都表達<strong>不</strong>到我想講<strong>的</strong>意思</td></tr>
</table>
<p>差别一目了然:SenseVoice 保留了粤语标志性的 <code>呢</code> / <code>唔</code> / <code>嘅</code>;Whisper 没有独立的粤语,把它识别成中文并<strong>转成了普通话书面语</strong>(<code>呢→這</code>、<code>唔→不</code>、<code>嘅→的</code>)——意思大致对,但已经不是粤语了。</p>
<h2>3 行代码跑通粤语识别</h2>
<pre>pip install funasr
from funasr import AutoModel
from funasr.utils.postprocess_utils import rich_transcription_postprocess
model = AutoModel(model="iic/SenseVoiceSmall", disable_update=True)
res = model.generate(input="cantonese.wav", cache={}, language="yue", use_itn=True)
print(rich_transcription_postprocess(res[0]["text"]))
# 呢几个字都表达唔到,我想讲嘅意思。</pre>
<p><code>language</code> 可以直接写 <code>"yue"</code>,也可以写 <code>"auto"</code> 让模型自动判语种——实测这段音频在 <code>auto</code> 下同样被正确判为 <code>yue</code> 并给出一致结果。</p>
<h2>原始输出里还带了什么</h2>
<p>SenseVoice 的原始输出每段开头有一串标签:</p>
<pre>&lt;|yue|&gt;&lt;|NEUTRAL|&gt;&lt;|Speech|&gt;&lt;|withitn|&gt;呢几个字都表达唔到,我想讲嘅意思。</pre>
<p>含义:<code>&lt;|yue|&gt;</code> = 语种是粤语;<code>&lt;|NEUTRAL|&gt;</code> = 情感;<code>&lt;|Speech|&gt;</code> = 音频事件(纯人声);<code>&lt;|withitn|&gt;</code> = 已做逆文本归一化。也就是说,识别粤语的同时,<strong>语种 / 情感 / 音频事件全都免费拿到了</strong>。用 <code>rich_transcription_postprocess()</code> 一行就能清洗成纯文本。</p>
<h2>为什么粤语识别选 SenseVoice</h2>
<table>
<tr><th></th><th>SenseVoice</th><th>Whisper</th></tr>
<tr><td>粤语口语用字(呢/唔/嘅)</td><td>✅ 原生保留</td><td>❌ 转成普通话</td></tr>
<tr><td>自动语种识别</td><td>✅ 直接判出 <code>yue</code></td><td>归为 <code>zh</code></td></tr>
<tr><td>情感 / 音频事件</td><td>✅ 一次出</td><td>❌</td></tr>
<tr><td>逆文本归一化(ITN)</td><td>✅ 内置</td><td>部分</td></tr>
<tr><td>速度</td><td>非自回归,比 Whisper-Large 约快 15×</td><td>自回归基准</td></tr>
<tr><td>许可证</td><td>开源,可商用</td><td>开源</td></tr>
</table>
<p>如果你的场景是<strong>普通话 + 粤语混合</strong>(港澳、客服、媒体字幕),SenseVoice 一个模型就能两种都覆盖;要更高精度的离线转写,可以看同属 FunASR 家族的 <a href="/blog/fun-asr-nano-guide.html">Fun-ASR-Nano</a>。更完整的中文准确率对比见 <a href="/blog/funasr-vs-whisper-benchmark.html">FunASR vs Whisper benchmark</a>。</p>
<div class="cta"><p><strong>FunASR 全家桶都是开源的</strong>——工业级 ASR / VAD / 标点 / 说话人 / 情感事件 / LLM-ASR,粤语开箱即用。觉得有用就点个 Star 支持一下 👇</p><p><a class="btn" href="https://github.com/QwenAudio/SenseVoice" target="_blank">⭐ Star SenseVoice</a></p><p style="margin-top:10px;font-size:0.85rem">也欢迎 Star:<a href="https://github.com/modelscope/FunASR" target="_blank">FunASR</a> · <a href="https://github.com/QwenAudio/Fun-ASR" target="_blank">Fun-ASR</a> · <a href="https://github.com/modelscope/FunClip" target="_blank">FunClip</a></p></div>
<!--related-posts-->
<h2>相关文章</h2>
<ul class="post-list">
<li><a href="/blog/funasr-vs-whisper-benchmark.html">FunASR vs Whisper 实测对比</a></li>
<li><a href="/blog/sensevoice-deployment-guide.html">SenseVoice 部署指南</a></li>
<li><a href="/blog/fun-asr-nano-guide.html">Fun-ASR-Nano 使用指南</a></li>
<li><a href="/blog/funasr-speaker-diarization.html">说话人分离:谁在何时说话</a></li>
<li><a href="/blog/sensevoice-emotion-language-detection.html">情感与语种检测</a></li>
<li><a href="/blog/funasr-realtime-streaming-asr.html">实时流式语音识别</a></li>
<li><a href="/blog/funasr-transcribe-long-audio.html">转写超长音频(1小时一次搞定)</a></li>
<li><a href="/blog/funasr-cli-transcribe-command-line.html">命令行转写(文本/JSON/SRT)</a></li>
<li><a href="/blog/self-hosted-openai-whisper-api-alternative.html">自托管 OpenAI Whisper API 替代</a></li>
<li><a href="/blog/generate-subtitles-srt-vtt-from-audio-video.html">自动生成字幕(SRT / VTT)</a></li>
<li><a href="/blog/speech-to-text-python-transcribe-audio.html">Python 语音转文字教程</a></li>
<li><a href="/blog/funasr-llama-cpp-whisper-cpp-alternative.html">FunASR 跑进 llama.cpp(whisper.cpp 替代)</a></li>
<li><a href="/blog/funasr-vs-faster-whisper-chinese.html">FunASR vs faster-whisper(中文/粤语)</a></li>
<li><a href="/blog/lightweight-speech-recognition-cpu.html">轻量语音识别(CPU 250MB)</a></li>
<li><a href="/blog/self-hosted-deepgram-assemblyai-alternative.html">自托管替代 Deepgram/AssemblyAI</a></li>
<li><a href="/blog/which-funasr-model.html">选哪个 FunASR 模型</a></li>
<li><a href="/blog/japanese-speech-recognition.html">日语语音识别(SenseVoice 转写+标点+情感)</a></li>
<li><a href="/blog/voice-activity-detection-python.html">Python 语音活动检测(VAD)</a></li>
<li><a href="/blog/self-hosted-google-aws-azure-speech-to-text.html">自托管替代 Google/AWS/Azure 云语音 API</a></li>
<li><a href="/blog/chinese-speech-recognition.html">中文语音识别(普通话)实战</a></li>
<li><a href="/blog/punctuation-restoration-python.html">标点恢复 Python 实战</a></li>
<li><a href="/blog/speech-to-text-timestamps-python.html">语音识别带时间戳(字级)</a></li>
</ul>
</div></article>
<footer><div class="container">© 2024-2026 Tongyi Lab, Alibaba Group · <a href="https://github.com/modelscope/FunASR/blob/main/LICENSE">MIT License</a></div></footer>
</body>
</html>
@@ -0,0 +1,160 @@
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>中文语音识别(普通话)Python 实战:用 FunASR 又快又准(Fun-ASR-Nano / SenseVoice / Paraformer)| FunASR 博客</title>
<meta name="description" content="中文/普通话语音识别怎么做?FunASR 专为中文打造:默认旗舰 Fun-ASR-Nano(LLM-ASR,CER 8.06%),CPU 用 SenseVoice(7.81%,最快)/ Paraformer(10.18%,时间戳/热词),都远好于 Whisper(~20%)。3 行 Python,附实测输出。">
<meta name="keywords" content="中文语音识别, 普通话语音识别, 中文语音转文字, 中文转文字, 语音识别 python, chinese speech recognition, mandarin speech to text, Fun-ASR-Nano, SenseVoice, Paraformer, FunASR">
<link rel="icon" href="/logo.png">
<meta property="og:title" content="中文语音识别(普通话)Python 实战:用 FunASR 又快又准(Fun-ASR-Nano / SenseVoice / Paraformer)| FunASR 博客">
<meta property="og:description" content="中文/普通话语音识别怎么做?FunASR 专为中文打造:默认旗舰 Fun-ASR-Nano(LLM-ASR,CER 8.06%),CPU 用 SenseVoice(7.81%,最快)/ Paraformer(10.18%,时间戳/热词),都远好于 Whisper(~20%)。3 行 Python,附实测输出。">
<meta property="og:type" content="article">
<meta property="og:url" content="https://www.funasr.com/blog/chinese-speech-recognition.html">
<meta property="og:image" content="https://www.funasr.com/logo.png">
<link rel="canonical" href="https://www.funasr.com/blog/chinese-speech-recognition.html">
<link rel="alternate" hreflang="en" href="https://www.funasr.com/en/blog/chinese-speech-recognition.html">
<link rel="alternate" hreflang="zh" href="https://www.funasr.com/blog/chinese-speech-recognition.html">
<link rel="alternate" hreflang="x-default" href="https://www.funasr.com/en/blog/chinese-speech-recognition.html">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"BlogPosting","headline":"中文语音识别(普通话)Python 实战:用 FunASR 又快又准(Fun-ASR-Nano / SenseVoice / Paraformer)| FunASR 博客","description":"中文/普通话语音识别怎么做?FunASR 专为中文打造:默认旗舰 Fun-ASR-Nano(LLM-ASR,CER 8.06%),CPU 用 SenseVoice(7.81%,最快)/ Paraformer(10.18%,时间戳/热词),都远好于 Whisper(~20%)。3 行 Python,附实测输出。","datePublished":"2026-06-22","dateModified":"2026-06-22","author":{"@type":"Organization","name":"FunASR / Tongyi Lab"},"publisher":{"@type":"Organization","name":"FunASR","logo":{"@type":"ImageObject","url":"https://www.funasr.com/logo.png"}},"mainEntityOfPage":{"@type":"WebPage","@id":"https://www.funasr.com/blog/chinese-speech-recognition.html"},"image":"https://www.funasr.com/logo.png"}
</script>
<style>:root{--primary:#2563eb;--primary-dark:#1d4ed8;--bg:#fff;--surface:#f8fafc;--border:#e2e8f0;--text:#0f172a;--text-soft:#475569;--text-muted:#94a3b8;--radius:12px}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:'Inter',-apple-system,sans-serif;color:var(--text);line-height:1.7}
a{color:var(--primary);text-decoration:none}a:hover{text-decoration:underline}
.container{max-width:800px;margin:0 auto;padding:0 24px}
.nav{position:fixed;top:0;left:0;right:0;z-index:100;background:rgba(255,255,255,0.9);backdrop-filter:blur(12px);border-bottom:1px solid var(--border);padding:14px 0}
.nav .container{max-width:1120px;display:flex;align-items:center;gap:24px}
.nav-logo{font-size:1.2rem;font-weight:800;color:var(--text)}.nav-logo span{color:var(--primary)}
.nav-links{display:flex;gap:20px;margin-left:auto;flex-wrap:wrap}
.nav-links a{font-size:0.85rem;font-weight:500;color:var(--text-soft)}
.nav-btn{padding:7px 16px;background:var(--primary);color:#fff;border-radius:7px;font-size:0.83rem;font-weight:600}
article{padding:120px 0 80px}
h1{font-size:2rem;font-weight:800;line-height:1.3;margin-bottom:14px}
h2{font-size:1.3rem;font-weight:700;margin:36px 0 14px;padding-top:16px;border-top:1px solid var(--border)}
h3{font-size:1.05rem;font-weight:700;margin:22px 0 10px}
p{margin-bottom:14px;color:var(--text-soft)}
ul,ol{margin:0 0 14px 22px;color:var(--text-soft)}li{margin-bottom:6px}
table{width:100%;border-collapse:collapse;margin:16px 0;font-size:0.86rem}
th,td{padding:10px 12px;text-align:left;border-bottom:1px solid var(--border)}
th{font-weight:600;background:var(--surface);font-size:0.78rem;color:var(--text-muted)}
pre{background:#1e293b;color:#e2e8f0;padding:18px;border-radius:10px;overflow-x:auto;font-size:0.82rem;line-height:1.7;margin:14px 0}
code{font-family:ui-monospace,Menlo,monospace}
p code,li code{background:var(--surface);padding:2px 6px;border-radius:5px;font-size:0.85em;color:var(--primary-dark)}
.post-meta{color:var(--text-muted);font-size:0.85rem;margin-bottom:24px}
.cta{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:24px;margin:28px 0;text-align:center}
.cta a.btn{display:inline-block;padding:10px 24px;background:var(--primary);color:#fff;border-radius:8px;font-weight:600}
.post-list{list-style:none;margin:0;padding:0}
.post-list li{margin:0 0 8px}
.post-card{display:block;border:1px solid var(--border);border-radius:var(--radius);padding:20px 22px;margin-bottom:14px}
.post-card:hover{border-color:var(--primary);text-decoration:none}
.post-card h2{border:none;padding:0;margin:0 0 6px;font-size:1.15rem;color:var(--text)}
.post-card p{margin:0;color:var(--text-soft);font-size:0.9rem}
.post-card .date{color:var(--text-muted);font-size:0.8rem}
footer{background:#0f172a;color:#94a3b8;padding:28px 0;text-align:center;font-size:0.8rem}
footer a{color:#94a3b8}
@media(max-width:900px){.nav-links{display:none}.nav .container{gap:16px}.nav-logo{margin-right:auto}h1{font-size:1.75rem}table{table-layout:fixed;font-size:0.78rem}th,td{padding:8px 4px;overflow-wrap:anywhere}p code,li code{overflow-wrap:anywhere;word-break:break-word}}
</style>
</head>
<body>
<nav class="nav"><div class="container"><a href="/" class="nav-logo">Fun<span>ASR</span></a><div class="nav-links"><a href="/#capabilities">核心能力</a><a href="/#usage">如何使用</a><a href="/#benchmark">性能</a><a href="/#demo">演示</a><a href="https://modelscope.github.io/FunASR/zh/" target="_blank">文档</a><a href="/quickstart.html">快速上手</a><a href="/models.html">模型</a><a href="/ecosystem.html">生态</a><a href="/blog/">技术博客</a><a href="/vs-whisper.html">对比 Whisper</a><a href="/donors.html">功德榜</a></div><a href="https://www.funasr.com/en/blog/chinese-speech-recognition.html" style="font-size:0.83rem;font-weight:500;color:var(--text-soft)">EN</a><a href="https://github.com/modelscope/FunASR" target="_blank" class="nav-btn">GitHub ★</a></div></nav>
<article><div class="container">
<h1>中文语音识别(普通话)Python 实战:用 FunASR 又快又准</h1>
<p class="post-meta">2026-06-22 · FunASR 团队</p>
<p>中文语音识别一直是通用模型的难点——OpenAI Whisper 在中文上的字错率(CER)约 <strong>20%</strong>,同音字、口语、专名经常出错。<strong>FunASR</strong>(通义实验室开源)专为中文打造,在标准中文测试集上 CER 远低于 Whisper。默认推荐旗舰 <strong><a href="https://github.com/QwenAudio/Fun-ASR" target="_blank">Fun-ASR-Nano</a></strong>(LLM-ASR),CPU 场景用 SenseVoice / Paraformer。下面是实战上手,代码均为真实实测。</p>
<h2>3 行代码做中文识别(旗舰 Fun-ASR-Nano,实测输出)</h2>
<pre>pip install funasr
from funasr import AutoModel
model = AutoModel(model="FunAudioLLM/Fun-ASR-Nano-2512", disable_update=True, device="cuda")
res = model.generate(input="audio.wav")
print(res[0]["text"])
# 欢迎大家来体验达摩院推出的语音识别模型。</pre>
<p>Fun-ASR-Nano 是基于 LLM 的旗舰识别模型(SenseVoice 编码器 + Qwen3 解码),支持中英日及中文方言/口音,对上下文/难例/专名更鲁棒,是中文识别的默认推荐。需要 31 语种时使用独立的 Fun-ASR-MLT-Nano。大规模可用 vLLM 加速(约 340× 实时),见 <a href="/blog/fun-asr-nano-guide.html">Fun-ASR-Nano 指南</a>。</p>
<h2>选对中文模型(按场景)</h2>
<table>
<tr><th>你的情况</th><th>选</th><th>中文 CER</th></tr>
<tr><td><strong>有 GPU / 要最强</strong></td><td>⭐ <strong>Fun-ASR-Nano</strong></td><td>8.06%</td></tr>
<tr><td>CPU / 边缘 / 要最快</td><td>SenseVoice</td><td>7.81%</td></tr>
<tr><td>CPU + 纯中文 + 时间戳/热词</td><td>Paraformer</td><td>10.18%</td></tr>
</table>
<p>三者 CER 都远好于 Whisper(~20%)。完整选型见 <a href="/blog/which-funasr-model.html">FunASR 模型选型指南</a>。CPU 场景的两个轻量选择:</p>
<pre># SenseVoice —— CPU 首选,非自回归极快,多语种+情感
from funasr import AutoModel
from funasr.utils.postprocess_utils import rich_transcription_postprocess
model = AutoModel(model="iic/SenseVoiceSmall", disable_update=True)
res = model.generate(input="audio.wav", language="auto", use_itn=True)
print(rich_transcription_postprocess(res[0]["text"]))
# 欢迎大家来体验达摩院推出的语音识别模型。
# Paraformer —— 纯中文 + 字级时间戳 + 热词
model = AutoModel(model="paraformer-zh", vad_model="fsmn-vad", punc_model="ct-punc")
res = model.generate(input="audio.wav", batch_size_s=300)
print(res[0]["text"]) # 欢迎大家来体验达摩院推出的语音识别模型。
# res[0]["timestamp"] -> [[880, 1120], [1120, 1360], ...] 每个字的起止毫秒</pre>
<h2>为什么中文识别选 FunASR(而不是 Whisper)</h2>
<table>
<tr><th>中文测试集 CER(越低越好)</th><th>错字率</th></tr>
<tr><td><strong>FunASR · Fun-ASR-Nano(旗舰)</strong></td><td><strong>8.06%</strong></td></tr>
<tr><td>FunASR · SenseVoice</td><td>7.81%</td></tr>
<tr><td>FunASR · Paraformer</td><td>10.18%</td></tr>
<tr><td>Whisper-large-v3</td><td>20.02%</td></tr>
</table>
<p>除了更准,FunASR 对中文还内置一整套实用能力:<strong>逆文本归一化(ITN)</strong>("一千二百"→"1200")、<strong>标点恢复</strong>、<strong>热词/专名定制</strong>、<strong>字级时间戳</strong>、<strong>说话人分离</strong>。完整对比见 <a href="/blog/funasr-vs-whisper-benchmark.html">FunASR vs Whisper benchmark</a> 和 <a href="/blog/funasr-vs-faster-whisper-chinese.html">vs faster-whisper(中文/粤语)</a>。</p>
<h2>常见进阶(都是一行接上)</h2>
<ul>
<li><strong>长音频自动分段</strong>:加 <code>vad_model="fsmn-vad"</code>。见 <a href="/blog/funasr-transcribe-long-audio.html">转写超长音频</a> 和 <a href="/blog/voice-activity-detection-python.html">VAD/去静音</a>。</li>
<li><strong>加标点</strong>:加 <code>punc_model="ct-punc"</code>。</li>
<li><strong>热词</strong>(专名/人名):用 SeACo-Paraformer 传 <code>hotword</code>。</li>
<li><strong>谁在何时说</strong>:加说话人模型,见 <a href="/blog/funasr-speaker-diarization.html">说话人分离</a>。</li>
<li><strong>粤语</strong>:SenseVoice 原生支持,见 <a href="/blog/cantonese-speech-recognition.html">粤语语音识别</a>。</li>
</ul>
<h2>命令行 / 服务化</h2>
<pre># 命令行转写,可出 srt / json,带说话人
funasr audio.wav --model paraformer-zh -f srt --spk
# OpenAI 兼容的转写服务(默认旗舰 fun-asr-nano)
funasr-server --device cuda</pre>
<p>见 <a href="/blog/funasr-cli-transcribe-command-line.html">命令行转写</a> 和 <a href="/blog/self-hosted-google-aws-azure-speech-to-text.html">自托管替代云 API</a>。</p>
<div class="cta"><p><strong>FunASR 是中文语音识别的开源首选(MIT,可商用)</strong>——旗舰 Fun-ASR-Nano + SenseVoice + Paraformer。觉得有用就点个 Star 支持一下 👇</p><p><a class="btn" href="https://github.com/QwenAudio/Fun-ASR" target="_blank">⭐ Star Fun-ASR</a></p><p style="margin-top:10px;font-size:0.85rem">也欢迎 Star:<a href="https://github.com/modelscope/FunASR" target="_blank">FunASR</a> · <a href="https://github.com/QwenAudio/SenseVoice" target="_blank">SenseVoice</a> · <a href="https://github.com/modelscope/FunClip" target="_blank">FunClip</a></p></div>
<!--related-posts-->
<h2>相关文章</h2>
<ul class="post-list">
<li><a href="/blog/funasr-vs-whisper-benchmark.html">FunASR vs Whisper 实测对比</a></li>
<li><a href="/blog/sensevoice-deployment-guide.html">SenseVoice 部署指南</a></li>
<li><a href="/blog/fun-asr-nano-guide.html">Fun-ASR-Nano 使用指南</a></li>
<li><a href="/blog/funasr-speaker-diarization.html">说话人分离:谁在何时说话</a></li>
<li><a href="/blog/sensevoice-emotion-language-detection.html">情感与语种检测</a></li>
<li><a href="/blog/funasr-realtime-streaming-asr.html">实时流式语音识别</a></li>
<li><a href="/blog/funasr-transcribe-long-audio.html">转写超长音频(1小时一次搞定)</a></li>
<li><a href="/blog/funasr-cli-transcribe-command-line.html">命令行转写(文本/JSON/SRT)</a></li>
<li><a href="/blog/self-hosted-openai-whisper-api-alternative.html">自托管 OpenAI Whisper API 替代</a></li>
<li><a href="/blog/generate-subtitles-srt-vtt-from-audio-video.html">自动生成字幕(SRT / VTT)</a></li>
<li><a href="/blog/speech-to-text-python-transcribe-audio.html">Python 语音转文字教程</a></li>
<li><a href="/blog/funasr-llama-cpp-whisper-cpp-alternative.html">FunASR 跑进 llama.cpp(whisper.cpp 替代)</a></li>
<li><a href="/blog/funasr-vs-faster-whisper-chinese.html">FunASR vs faster-whisper(中文/粤语)</a></li>
<li><a href="/blog/lightweight-speech-recognition-cpu.html">轻量语音识别(CPU 250MB)</a></li>
<li><a href="/blog/self-hosted-deepgram-assemblyai-alternative.html">自托管替代 Deepgram/AssemblyAI</a></li>
<li><a href="/blog/which-funasr-model.html">选哪个 FunASR 模型</a></li>
<li><a href="/blog/cantonese-speech-recognition.html">粤语语音识别(SenseVoice 原生粤语)</a></li>
<li><a href="/blog/japanese-speech-recognition.html">日语语音识别(SenseVoice 转写+标点+情感)</a></li>
<li><a href="/blog/voice-activity-detection-python.html">Python 语音活动检测(VAD)</a></li>
<li><a href="/blog/self-hosted-google-aws-azure-speech-to-text.html">自托管替代 Google/AWS/Azure 云语音 API</a></li>
<li><a href="/blog/punctuation-restoration-python.html">标点恢复 Python 实战</a></li>
<li><a href="/blog/speech-to-text-timestamps-python.html">语音识别带时间戳(字级)</a></li>
</ul>
</div></article>
<footer><div class="container">© 2024-2026 Tongyi Lab, Alibaba Group · <a href="https://github.com/modelscope/FunASR/blob/main/LICENSE">MIT License</a></div></footer>
</body>
</html>
@@ -0,0 +1,168 @@
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Fun-ASR-Nano 使用指南:800M 端到端语音识别大模型,支持中英日与中文方言/口音 | FunASR 博客</title>
<meta name="description" content="Fun-ASR-Nano 完整使用教程:800M 端到端语音识别大模型,支持中文、英文、日语、7 大中文方言与 26 种地域口音、热词和实时流式服务;演示外部 VAD/CAM++ 说话人分离,并说明原生时间戳限制。">
<meta name="keywords" content="Fun-ASR-Nano, Fun-ASR-Nano 部署, 端到端语音识别, 语音识别大模型, 中文方言识别, 地域口音, 热词, 流式语音识别, FunASR, 说话人分离">
<link rel="icon" href="/logo.png">
<meta property="og:title" content="Fun-ASR-Nano 使用指南:800M 端到端语音识别大模型,支持中英日与中文方言/口音 | FunASR 博客"><meta property="og:description" content="Fun-ASR-Nano 完整使用教程:800M 端到端语音识别大模型,支持中文、英文、日语、7 大中文方言与 26 种地域口音、热词和实时流式服务;演示外部 VAD/CAM++ 说话人分离,并说明原生时间戳限制。">
<meta property="og:type" content="article"><meta property="og:url" content="https://www.funasr.com/blog/fun-asr-nano-guide.html">
<meta property="og:image" content="https://www.funasr.com/logo.png">
<link rel="canonical" href="https://www.funasr.com/blog/fun-asr-nano-guide.html">
<link rel="alternate" hreflang="en" href="https://www.funasr.com/en/blog/fun-asr-nano-guide.html"><link rel="alternate" hreflang="zh" href="https://www.funasr.com/blog/fun-asr-nano-guide.html">
<link rel="alternate" hreflang="x-default" href="https://www.funasr.com/en/blog/fun-asr-nano-guide.html">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"BlogPosting","headline":"Fun-ASR-Nano 使用指南:800M 端到端语音识别大模型,支持中英日与中文方言/口音 | FunASR 博客","description":"Fun-ASR-Nano 完整使用教程:800M 端到端语音识别大模型,支持中文、英文、日语、7 大中文方言与 26 种地域口音、热词和实时流式服务;演示外部 VAD/CAM++ 说话人分离,并说明原生时间戳限制。","datePublished":"2026-06-16","dateModified":"2026-07-15","author":{"@type":"Organization","name":"FunASR / Tongyi Lab"},"publisher":{"@type":"Organization","name":"FunASR","logo":{"@type":"ImageObject","url":"https://www.funasr.com/logo.png"}},"mainEntityOfPage":{"@type":"WebPage","@id":"https://www.funasr.com/blog/fun-asr-nano-guide.html"},"image":"https://www.funasr.com/logo.png"}
</script>
<style>:root{--primary:#2563eb;--primary-dark:#1d4ed8;--bg:#fff;--surface:#f8fafc;--border:#e2e8f0;--text:#0f172a;--text-soft:#475569;--text-muted:#94a3b8;--radius:12px}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:'Inter',-apple-system,sans-serif;color:var(--text);line-height:1.7}
a{color:var(--primary);text-decoration:none}a:hover{text-decoration:underline}
.container{max-width:800px;margin:0 auto;padding:0 24px}
.nav{position:fixed;top:0;left:0;right:0;z-index:100;background:rgba(255,255,255,0.9);backdrop-filter:blur(12px);border-bottom:1px solid var(--border);padding:14px 0}
.nav .container{max-width:1120px;display:flex;align-items:center;gap:24px}
.nav-logo{font-size:1.2rem;font-weight:800;color:var(--text)}.nav-logo span{color:var(--primary)}
.nav-links{display:flex;gap:20px;margin-left:auto;flex-wrap:wrap}
.nav-links a{font-size:0.85rem;font-weight:500;color:var(--text-soft)}
.nav-btn{padding:7px 16px;background:var(--primary);color:#fff;border-radius:7px;font-size:0.83rem;font-weight:600}
article{padding:120px 0 80px}
h1{font-size:2rem;font-weight:800;line-height:1.3;margin-bottom:14px}
h2{font-size:1.3rem;font-weight:700;margin:36px 0 14px;padding-top:16px;border-top:1px solid var(--border)}
h3{font-size:1.05rem;font-weight:700;margin:22px 0 10px}
p{margin-bottom:14px;color:var(--text-soft)}
ul,ol{margin:0 0 14px 22px;color:var(--text-soft)}li{margin-bottom:6px}
table{width:100%;border-collapse:collapse;margin:16px 0;font-size:0.86rem}
th,td{padding:10px 12px;text-align:left;border-bottom:1px solid var(--border)}
th{font-weight:600;background:var(--surface);font-size:0.78rem;color:var(--text-muted)}
pre{background:#1e293b;color:#e2e8f0;padding:18px;border-radius:10px;overflow-x:auto;font-size:0.82rem;line-height:1.7;margin:14px 0}
code{font-family:ui-monospace,Menlo,monospace}
p code,li code{background:var(--surface);padding:2px 6px;border-radius:5px;font-size:0.85em;color:var(--primary-dark)}
.post-meta{color:var(--text-muted);font-size:0.85rem;margin-bottom:24px}
.cta{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:24px;margin:28px 0;text-align:center}
.cta a.btn{display:inline-block;padding:10px 24px;background:var(--primary);color:#fff;border-radius:8px;font-weight:600}
.post-list{list-style:none;margin:0;padding:0}
.post-list li{margin:0 0 8px}
.post-card{display:block;border:1px solid var(--border);border-radius:var(--radius);padding:20px 22px;margin-bottom:14px}
.post-card:hover{border-color:var(--primary);text-decoration:none}
.post-card h2{border:none;padding:0;margin:0 0 6px;font-size:1.15rem;color:var(--text)}
.post-card p{margin:0;color:var(--text-soft);font-size:0.9rem}
.post-card .date{color:var(--text-muted);font-size:0.8rem}
footer{background:#0f172a;color:#94a3b8;padding:28px 0;text-align:center;font-size:0.8rem}
footer a{color:#94a3b8}
@media(max-width:900px){.nav-links{display:none}.nav .container{gap:16px}.nav-logo{margin-right:auto}h1{font-size:1.75rem}p code,li code{overflow-wrap:anywhere;word-break:break-word}}
</style>
</head>
<body>
<nav class="nav"><div class="container"><a href="/" class="nav-logo">Fun<span>ASR</span></a><div class="nav-links"><a href="/#capabilities">核心能力</a><a href="/#usage">如何使用</a><a href="/#benchmark">性能</a><a href="/#demo">演示</a><a href="https://modelscope.github.io/FunASR/zh/" target="_blank">文档</a><a href="/quickstart.html">快速上手</a><a href="/models.html">模型</a><a href="/ecosystem.html">生态</a><a href="/blog/">技术博客</a><a href="/vs-whisper.html">对比 Whisper</a><a href="/donors.html">功德榜</a></div><a href="https://www.funasr.com/en/blog/fun-asr-nano-guide.html" style="font-size:0.83rem;font-weight:500;color:var(--text-soft)">EN</a><a href="https://github.com/modelscope/FunASR" target="_blank" class="nav-btn">GitHub ★</a></div></nav>
<article><div class="container">
<h1>Fun-ASR-Nano 使用指南:800M 端到端语音识别大模型,支持中英日与中文方言/口音</h1>
<p class="post-meta">FunASR 技术博客 · 2026-07-15 更新 · 主力模型</p>
<p><strong>Fun-ASR-Nano</strong> 是 FunAudioLLM 团队推出的端到端语音识别<strong>大模型</strong>,基于「Audio Encoder + Adaptor + LLM(Qwen)」架构,参数量约 800M,在数千万小时真实语音上训练而成。它是我们当前<strong>重点推荐</strong>的旗舰 ASR 模型。</p>
<p>核心亮点:</p>
<ul>
<li>支持<strong>中文、英文和日语</strong>;中文覆盖 <strong>7 大方言</strong>(吴、粤、闽、客、赣、湘、晋)与 26 种地域口音</li>
<li>支持<strong>热词</strong>和<strong>低延迟流式服务</strong></li>
<li>FunASR pipeline 可组合独立的 <strong>VAD + cam++ + 标点</strong>模型实现说话人分离(并非 Nano checkpoint 原生输出)</li>
<li>甚至支持<strong>歌词识别、Rap 语音识别</strong></li>
</ul>
<p><strong>时间戳边界:</strong>发布的 <code>model.pt</code> checkpoint 不含已训练的 CTC 对齐权重,因此不提供可靠的原生字级时间戳。离线服务可通过 VAD 返回可靠的片段级起止时间;需要准确字级时间戳时请使用 Paraformer。详情见 <a href="https://github.com/QwenAudio/Fun-ASR/issues/106" target="_blank" rel="noopener">issue #106</a>。</p>
<p>需要覆盖 31 种语言时,请使用独立的 <a href="https://huggingface.co/FunAudioLLM/Fun-ASR-MLT-Nano-2512" target="_blank" rel="noopener">Fun-ASR-MLT-Nano-2512</a> checkpoint;不要把 MLT-Nano 的语言范围套用到本页的旗舰 Nano。</p>
<h2>1. 安装</h2>
<pre>pip install -U funasr torch torchaudio</pre>
<h2>2. 基础推理(含热词)</h2>
<p>下面是已实测可运行的最小示例(自动下载模型):</p>
<pre>from funasr import AutoModel
model = AutoModel(
model="FunAudioLLM/Fun-ASR-Nano-2512",
trust_remote_code=True,
remote_code="./model.py",
device="cuda:0",
hub="hf", # 国内可用 hub="ms" 走 ModelScope
)
wav = f"{model.model_path}/example/zh.mp3" # 模型自带示例音频
res = model.generate(
input=[wav], cache={}, batch_size=1,
hotwords=["开放时间"], # 热词,提升专有名词召回
language="中文",
itn=True, # 逆文本归一化(数字/日期规整)
)
print(res[0]["text"])</pre>
<p>实测输出:<code>开放时间早上九点至下午五点。</code>——热词「开放时间」被准确识别。</p>
<h2>3. 长音频:加 VAD 分段</h2>
<pre>model = AutoModel(
model="FunAudioLLM/Fun-ASR-Nano-2512",
trust_remote_code=True, remote_code="./model.py",
vad_model="fsmn-vad",
vad_kwargs={"max_single_segment_time": 30000},
device="cuda:0", hub="hf",
)
res = model.generate(input=[wav], cache={}, batch_size=1, language="中文")</pre>
<h2>4. 说话人分离(谁在什么时候说了什么)</h2>
<p>说话人分离并非 Nano checkpoint 原生输出;下面由 FunASR pipeline 组合 VAD + 声纹(cam++)+ 标点,得到带说话人标签的逐句结果:</p>
<pre>model = AutoModel(
model="FunAudioLLM/Fun-ASR-Nano-2512",
trust_remote_code=True, remote_code="./model.py",
vad_model="fsmn-vad", vad_kwargs={"max_single_segment_time": 30000},
spk_model="cam++", punc_model="ct-punc",
device="cuda:0", hub="hf",
)
res = model.generate(input=[wav], cache={}, batch_size=1, language="中文")
for sent in res[0]["sentence_info"]:
print(sent["spk"], sent["text"])</pre>
<p>说话人分离需要从源码安装 FunASR:<code>pip install git+https://github.com/modelscope/FunASR.git</code>。</p>
<h2>5. 高吞吐 / 流式部署</h2>
<table>
<thead><tr><th>场景</th><th>推荐方式</th></tr></thead>
<tbody>
<tr><td>大规模离线批量转写</td><td><code>AutoModelVLLM</code>(vLLM 后端,高吞吐)</td></tr>
<tr><td>实时低延迟流式</td><td><code>FunASRNanoStreamingVLLM</code>(chunk 流式)</td></tr>
<tr><td>单机 / 快速试用</td><td>上面的 <code>AutoModel</code> 即可</td></tr>
</tbody>
</table>
<p>vLLM 路径对版本较敏感,建议 vLLM 0.12.0 + torch 2.9.0;完整示例见 <a href="https://github.com/QwenAudio/Fun-ASR" target="_blank">Fun-ASR 仓库</a>。</p>
<div class="cta">
<h3>开始使用 Fun-ASR-Nano</h3>
<p>主力旗舰模型,支持中英日 + 中文方言/口音。需要 31 语种请选 MLT-Nano。觉得有用就到 GitHub 点个 Star ⭐</p>
<a href="https://github.com/QwenAudio/Fun-ASR" class="btn">Fun-ASR GitHub ★</a>
</div>
<p>延伸阅读:<a href="/blog/sensevoice-deployment-guide.html">SenseVoice 部署指南</a> · <a href="/vs-whisper.html">对比 Whisper</a> · <a href="/quickstart.html">快速上手</a></p>
<!--related-posts-->
<h2>相关文章</h2>
<ul class="post-list">
<li><a href="/blog/funasr-vs-whisper-benchmark.html">FunASR vs Whisper 实测对比</a></li>
<li><a href="/blog/sensevoice-deployment-guide.html">SenseVoice 部署指南</a></li>
<li><a href="/blog/funasr-speaker-diarization.html">说话人分离:谁在何时说话</a></li>
<li><a href="/blog/sensevoice-emotion-language-detection.html">情感与语种检测</a></li>
<li><a href="/blog/funasr-realtime-streaming-asr.html">实时流式语音识别</a></li>
<li><a href="/blog/funasr-transcribe-long-audio.html">转写超长音频(1小时一次搞定)</a></li>
<li><a href="/blog/funasr-cli-transcribe-command-line.html">命令行转写(文本/JSON/SRT)</a></li>
<li><a href="/blog/self-hosted-openai-whisper-api-alternative.html">自托管 OpenAI Whisper API 替代</a></li>
<li><a href="/blog/generate-subtitles-srt-vtt-from-audio-video.html">自动生成字幕(SRT / VTT)</a></li>
<li><a href="/blog/speech-to-text-python-transcribe-audio.html">Python 语音转文字教程</a></li>
<li><a href="/blog/funasr-llama-cpp-whisper-cpp-alternative.html">FunASR 跑进 llama.cpp(whisper.cpp 替代)</a></li>
<li><a href="/blog/funasr-vs-faster-whisper-chinese.html">FunASR vs faster-whisper(中文/粤语)</a></li>
<li><a href="/blog/lightweight-speech-recognition-cpu.html">轻量语音识别(CPU 250MB)</a></li>
<li><a href="/blog/self-hosted-deepgram-assemblyai-alternative.html">自托管替代 Deepgram/AssemblyAI</a></li>
<li><a href="/blog/which-funasr-model.html">选哪个 FunASR 模型</a></li>
<li><a href="/blog/cantonese-speech-recognition.html">粤语语音识别(SenseVoice 原生粤语)</a></li>
<li><a href="/blog/japanese-speech-recognition.html">日语语音识别(SenseVoice 转写+标点+情感)</a></li>
<li><a href="/blog/voice-activity-detection-python.html">Python 语音活动检测(VAD)</a></li>
<li><a href="/blog/self-hosted-google-aws-azure-speech-to-text.html">自托管替代 Google/AWS/Azure 云语音 API</a></li>
<li><a href="/blog/chinese-speech-recognition.html">中文语音识别(普通话)实战</a></li>
<li><a href="/blog/punctuation-restoration-python.html">标点恢复 Python 实战</a></li>
<li><a href="/blog/speech-to-text-timestamps-python.html">语音识别带时间戳(字级)</a></li>
</ul>
</div></article>
<footer><div class="container">© 2024-2026 Tongyi Lab, Alibaba Group · <a href="https://github.com/modelscope/FunASR/blob/main/LICENSE">MIT License</a></div></footer>
</body>
</html>
@@ -0,0 +1,129 @@
<!DOCTYPE html>
<html lang="zh"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>用 FunASR 命令行转写音频:一行命令出文本 / JSON / SRT 字幕 | FunASR</title><meta name="description" content="FunASR 自带命令行工具:`funasr audio.wav` 直接出文字,`-f srt` 生成字幕,`-f json` 出结构化结果,`--spk` 带说话人。无需写 Python,本地、免费、中文强。附全部实测命令。"><meta name="keywords" content="命令行语音识别, speech to text command line, 音频转文字命令行, 音频转字幕, audio to srt, funasr cli, transcribe audio cli, 字幕生成命令行, whisper cli 替代">
<link rel="icon" href="/logo.png"><meta property="og:title" content="用 FunASR 命令行转写音频:一行命令出文本 / JSON / SRT 字幕"><meta property="og:description" content="FunASR 自带命令行工具:`funasr audio.wav` 直接出文字,`-f srt` 生成字幕,`-f json` 出结构化结果,`--spk` 带说话人。无需写 Python,本地、免费、中文强。附全部实测命令。">
<meta property="og:type" content="article"><meta property="og:url" content="https://www.funasr.com/blog/funasr-cli-transcribe-command-line.html"><meta property="og:image" content="https://www.funasr.com/logo.png">
<link rel="canonical" href="https://www.funasr.com/blog/funasr-cli-transcribe-command-line.html"><link rel="alternate" hreflang="en" href="https://www.funasr.com/en/blog/funasr-cli-transcribe-command-line.html"><link rel="alternate" hreflang="zh" href="https://www.funasr.com/blog/funasr-cli-transcribe-command-line.html"><link rel="alternate" hreflang="x-default" href="https://www.funasr.com/en/blog/funasr-cli-transcribe-command-line.html">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"BlogPosting","headline":"用 FunASR 命令行转写音频:一行命令出文本 / JSON / SRT 字幕","description":"FunASR 自带命令行工具:`funasr audio.wav` 直接出文字,`-f srt` 生成字幕,`-f json` 出结构化结果,`--spk` 带说话人。无需写 Python,本地、免费、中文强。附全部实测命令。","datePublished":"2026-06-18","dateModified":"2026-06-18","author":{"@type":"Organization","name":"FunASR / Tongyi Lab"},"publisher":{"@type":"Organization","name":"FunASR","logo":{"@type":"ImageObject","url":"https://www.funasr.com/logo.png"}},"mainEntityOfPage":{"@type":"WebPage","@id":"https://www.funasr.com/blog/funasr-cli-transcribe-command-line.html"},"image":"https://www.funasr.com/logo.png"}
</script>
<style>:root{--primary:#2563eb;--primary-dark:#1d4ed8;--bg:#fff;--surface:#f8fafc;--border:#e2e8f0;--text:#0f172a;--text-soft:#475569;--text-muted:#94a3b8;--radius:12px}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:'Inter',-apple-system,sans-serif;color:var(--text);line-height:1.7}
a{color:var(--primary);text-decoration:none}a:hover{text-decoration:underline}
.container{max-width:800px;margin:0 auto;padding:0 24px}
.nav{position:fixed;top:0;left:0;right:0;z-index:100;background:rgba(255,255,255,0.9);backdrop-filter:blur(12px);border-bottom:1px solid var(--border);padding:14px 0}
.nav .container{max-width:1120px;display:flex;align-items:center;gap:24px}
.nav-logo{font-size:1.2rem;font-weight:800;color:var(--text)}.nav-logo span{color:var(--primary)}
.nav-links{display:flex;gap:20px;margin-left:auto;flex-wrap:wrap}
.nav-links a{font-size:0.85rem;font-weight:500;color:var(--text-soft)}
.nav-btn{padding:7px 16px;background:var(--primary);color:#fff;border-radius:7px;font-size:0.83rem;font-weight:600}
article{padding:120px 0 80px}
h1{font-size:2rem;font-weight:800;line-height:1.3;margin-bottom:14px}
h2{font-size:1.3rem;font-weight:700;margin:36px 0 14px;padding-top:16px;border-top:1px solid var(--border)}
h3{font-size:1.05rem;font-weight:700;margin:22px 0 10px}
p{margin-bottom:14px;color:var(--text-soft)}
ul,ol{margin:0 0 14px 22px;color:var(--text-soft)}li{margin-bottom:6px}
table{width:100%;border-collapse:collapse;margin:16px 0;font-size:0.86rem}
th,td{padding:10px 12px;text-align:left;border-bottom:1px solid var(--border)}
th{font-weight:600;background:var(--surface);font-size:0.78rem;color:var(--text-muted)}
pre{background:#1e293b;color:#e2e8f0;padding:18px;border-radius:10px;overflow-x:auto;font-size:0.82rem;line-height:1.7;margin:14px 0}
code{font-family:ui-monospace,Menlo,monospace}
p code,li code{background:var(--surface);padding:2px 6px;border-radius:5px;font-size:0.85em;color:var(--primary-dark)}
.post-meta{color:var(--text-muted);font-size:0.85rem;margin-bottom:24px}
.cta{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:24px;margin:28px 0;text-align:center}
.cta a.btn{display:inline-block;padding:10px 24px;background:var(--primary);color:#fff;border-radius:8px;font-weight:600}
.post-list{list-style:none;margin:0;padding:0}
.post-list li{margin:0 0 8px}
.post-card{display:block;border:1px solid var(--border);border-radius:var(--radius);padding:20px 22px;margin-bottom:14px}
.post-card:hover{border-color:var(--primary);text-decoration:none}
.post-card h2{border:none;padding:0;margin:0 0 6px;font-size:1.15rem;color:var(--text)}
.post-card p{margin:0;color:var(--text-soft);font-size:0.9rem}
.post-card .date{color:var(--text-muted);font-size:0.8rem}
footer{background:#0f172a;color:#94a3b8;padding:28px 0;text-align:center;font-size:0.8rem}
footer a{color:#94a3b8}</style></head><body>
<nav class="nav"><div class="container"><a href="/" class="nav-logo">Fun<span>ASR</span></a><div class="nav-links"><a href="/#capabilities">核心能力</a><a href="/#usage">如何使用</a><a href="/#benchmark">性能</a><a href="/#demo">演示</a><a href="https://modelscope.github.io/FunASR/zh/" target="_blank">文档</a><a href="/quickstart.html">快速上手</a><a href="/models.html">模型</a><a href="/ecosystem.html">生态</a><a href="/blog/">技术博客</a><a href="/vs-whisper.html">对比 Whisper</a><a href="/donors.html">功德榜</a></div><a href="https://www.funasr.com/en/blog/funasr-cli-transcribe-command-line.html" style="font-size:0.83rem;font-weight:600;color:var(--text-soft)">EN</a><a href="https://github.com/modelscope/FunASR" target="_blank" class="nav-btn">GitHub ★</a></div></nav>
<article><div class="container">
<h1>用 FunASR 命令行转写音频:一行命令出文本 / JSON / SRT 字幕</h1>
<p class="post-meta">FunASR 技术博客 · 2026-06-18 · 教程</p>
<p>不想写 Python?FunASR 自带命令行工具,装好就能在终端里把音频转成文字、JSON 或 SRT 字幕。本地运行、免费、对中文尤其强。下面每条命令都是实测过的。</p>
<h2>安装</h2>
<pre><code>pip install -U torch torchaudio
pip install -U funasr # 推荐 funasr ≥ 1.3.26</code></pre>
<h2>最简单:转成文字</h2>
<pre><code>funasr audio.wav</code></pre>
<p>直接把识别文本打印到终端。默认用 SenseVoice(非自回归,极快,50+ 语言)。</p>
<h2>生成 SRT 字幕</h2>
<pre><code>funasr audio.wav -f srt -o ./subs</code></pre>
<p>在 <code>./subs/</code> 下生成 <code>audio.srt</code>。加 <code>--spk</code> 还能按说话人分句、带真实时间戳:</p>
<pre><code>funasr meeting.wav --spk -f srt -o ./subs</code></pre>
<pre><code>1
00:00:02,919 --&gt; 00:00:08,169
大家好,今天聊一下第三季度的计划。
2
00:00:10,029 --&gt; 00:00:18,550
我先同步进度,核心功能完成了八成。</code></pre>
<h2>结构化 JSON 输出</h2>
<pre><code>funasr audio.wav -f json</code></pre>
<pre><code>{
"text": "大家好今天聊一下第三季度的计划...",
"file": "audio.wav",
"model": "sensevoice",
"language": "auto",
"audio_duration_s": 59.52,
"processing_s": 2.17
}</code></pre>
<h2>常用选项</h2>
<table><thead><tr><th>命令</th><th>作用</th></tr></thead><tbody>
<tr><td><code>-f text/json/srt/tsv</code></td><td>输出格式(默认 text)</td></tr>
<tr><td><code>--spk</code></td><td>说话人分离(谁在何时说)</td></tr>
<tr><td><code>--model sensevoice/paraformer/fun-asr-nano</code></td><td>选模型(fun-asr-nano 精度最高)</td></tr>
<tr><td><code>--hotwords "关键词,术语"</code></td><td>热词,提升专有名词</td></tr>
<tr><td><code>-o ./out</code></td><td>输出目录</td></tr>
<tr><td><code>funasr a.wav b.wav</code></td><td>一次转多个文件</td></tr>
</tbody></table>
<h2>作为 API 服务部署(OpenAI 兼容)</h2>
<pre><code>funasr-server --device cuda # localhost:8000, POST /v1/audio/transcriptions</code></pre>
<p>用任何 OpenAI SDK 直接调:</p>
<pre><code>from openai import OpenAI
client = OpenAI(base_url="http://localhost:8000/v1", api_key="x")
r = client.audio.transcriptions.create(model="sensevoice", file=open("audio.wav","rb"))
print(r.text)</code></pre>
<h2>为什么用 FunASR CLI</h2>
<ul>
<li><strong>本地、免费、隐私</strong>:无需联网、无 API key。</li>
<li><strong>快</strong>:SenseVoice 非自回归,远快于 Whisper(<a href="/blog/funasr-vs-whisper-benchmark.html">实测对比</a>),CPU 也能实时。</li>
<li><strong>中文更准</strong> + 50+ 语言;字幕、说话人、热词、JSON 开箱即用。</li>
</ul>
<div class="cta"><p>FunASR 是通义实验室开源的工业级语音识别工具包。</p><a class="btn" href="https://github.com/modelscope/FunASR" target="_blank">在 GitHub 上 Star FunASR ★</a></div>
<!--related-posts-->
<h2>相关文章</h2>
<ul class="post-list">
<li><a href="/blog/funasr-vs-whisper-benchmark.html">FunASR vs Whisper 实测对比</a></li>
<li><a href="/blog/sensevoice-deployment-guide.html">SenseVoice 部署指南</a></li>
<li><a href="/blog/fun-asr-nano-guide.html">Fun-ASR-Nano 使用指南</a></li>
<li><a href="/blog/funasr-speaker-diarization.html">说话人分离:谁在何时说话</a></li>
<li><a href="/blog/sensevoice-emotion-language-detection.html">情感与语种检测</a></li>
<li><a href="/blog/funasr-realtime-streaming-asr.html">实时流式语音识别</a></li>
<li><a href="/blog/funasr-transcribe-long-audio.html">转写超长音频(1小时一次搞定)</a></li>
<li><a href="/blog/self-hosted-openai-whisper-api-alternative.html">自托管 OpenAI Whisper API 替代</a></li>
<li><a href="/blog/generate-subtitles-srt-vtt-from-audio-video.html">自动生成字幕(SRT / VTT)</a></li>
<li><a href="/blog/speech-to-text-python-transcribe-audio.html">Python 语音转文字教程</a></li>
<li><a href="/blog/funasr-llama-cpp-whisper-cpp-alternative.html">FunASR 跑进 llama.cpp(whisper.cpp 替代)</a></li>
<li><a href="/blog/funasr-vs-faster-whisper-chinese.html">FunASR vs faster-whisper(中文/粤语)</a></li>
<li><a href="/blog/lightweight-speech-recognition-cpu.html">轻量语音识别(CPU 250MB)</a></li>
<li><a href="/blog/self-hosted-deepgram-assemblyai-alternative.html">自托管替代 Deepgram/AssemblyAI</a></li>
<li><a href="/blog/which-funasr-model.html">选哪个 FunASR 模型</a></li>
<li><a href="/blog/cantonese-speech-recognition.html">粤语语音识别(SenseVoice 原生粤语)</a></li>
<li><a href="/blog/japanese-speech-recognition.html">日语语音识别(SenseVoice 转写+标点+情感)</a></li>
<li><a href="/blog/voice-activity-detection-python.html">Python 语音活动检测(VAD)</a></li>
<li><a href="/blog/self-hosted-google-aws-azure-speech-to-text.html">自托管替代 Google/AWS/Azure 云语音 API</a></li>
<li><a href="/blog/chinese-speech-recognition.html">中文语音识别(普通话)实战</a></li>
<li><a href="/blog/punctuation-restoration-python.html">标点恢复 Python 实战</a></li>
<li><a href="/blog/speech-to-text-timestamps-python.html">语音识别带时间戳(字级)</a></li>
</ul>
</div></article>
<footer><div class="container">FunASR · 通义实验室开源语音识别 · <a href="https://github.com/modelscope/FunASR">GitHub</a></div></footer>
</body></html>
@@ -0,0 +1,145 @@
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>FunASR 跑进 llama.cpp:中文 ASR 的 whisper.cpp 替代品(CPU/零 Python/下载即用)| FunASR 博客</title>
<meta name="description" content="FunASR 的 llama.cpp/GGUF 端侧运行时:单个自包含二进制、零 Python、内置 VAD、吃任意音频,下载即用转写中文。中文 CPU 上比 whisper.cpp 准约 2.7 倍。3 步实测跑通。">
<meta name="keywords" content="whisper.cpp 替代, llama.cpp 语音识别, FunASR, 中文语音识别 CPU, 端侧 ASR, 离线语音识别, GGUF, SenseVoice, Paraformer, 无需 GPU 语音识别">
<link rel="icon" href="/logo.png">
<meta property="og:title" content="FunASR 跑进 llama.cpp:中文 ASR 的 whisper.cpp 替代品(CPU/零 Python/下载即用)| FunASR 博客">
<meta property="og:description" content="FunASR 的 llama.cpp/GGUF 端侧运行时:单个自包含二进制、零 Python、内置 VAD、吃任意音频,下载即用转写中文。中文 CPU 上比 whisper.cpp 准约 2.7 倍。3 步实测跑通。">
<meta property="og:type" content="article">
<meta property="og:url" content="https://www.funasr.com/blog/funasr-llama-cpp-whisper-cpp-alternative.html">
<meta property="og:image" content="https://www.funasr.com/logo.png">
<link rel="canonical" href="https://www.funasr.com/blog/funasr-llama-cpp-whisper-cpp-alternative.html">
<link rel="alternate" hreflang="en" href="https://www.funasr.com/en/blog/funasr-llama-cpp-whisper-cpp-alternative.html">
<link rel="alternate" hreflang="zh" href="https://www.funasr.com/blog/funasr-llama-cpp-whisper-cpp-alternative.html">
<link rel="alternate" hreflang="x-default" href="https://www.funasr.com/en/blog/funasr-llama-cpp-whisper-cpp-alternative.html">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"BlogPosting","headline":"FunASR 跑进 llama.cpp:中文 ASR 的 whisper.cpp 替代品(CPU/零 Python/下载即用)| FunASR 博客","description":"FunASR 的 llama.cpp/GGUF 端侧运行时:单个自包含二进制、零 Python、内置 VAD、吃任意音频,下载即用转写中文。中文 CPU 上比 whisper.cpp 准约 2.7 倍。3 步实测跑通。","datePublished":"2026-06-20","dateModified":"2026-06-20","author":{"@type":"Organization","name":"FunASR / Tongyi Lab"},"publisher":{"@type":"Organization","name":"FunASR","logo":{"@type":"ImageObject","url":"https://www.funasr.com/logo.png"}},"mainEntityOfPage":{"@type":"WebPage","@id":"https://www.funasr.com/blog/funasr-llama-cpp-whisper-cpp-alternative.html"},"image":"https://www.funasr.com/logo.png"}
</script>
<style>:root{--primary:#2563eb;--primary-dark:#1d4ed8;--bg:#fff;--surface:#f8fafc;--border:#e2e8f0;--text:#0f172a;--text-soft:#475569;--text-muted:#94a3b8;--radius:12px}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:'Inter',-apple-system,sans-serif;color:var(--text);line-height:1.7}
a{color:var(--primary);text-decoration:none}a:hover{text-decoration:underline}
.container{max-width:800px;margin:0 auto;padding:0 24px}
.nav{position:fixed;top:0;left:0;right:0;z-index:100;background:rgba(255,255,255,0.9);backdrop-filter:blur(12px);border-bottom:1px solid var(--border);padding:14px 0}
.nav .container{max-width:1120px;display:flex;align-items:center;gap:24px}
.nav-logo{font-size:1.2rem;font-weight:800;color:var(--text)}.nav-logo span{color:var(--primary)}
.nav-links{display:flex;gap:20px;margin-left:auto;flex-wrap:wrap}
.nav-links a{font-size:0.85rem;font-weight:500;color:var(--text-soft)}
.nav-btn{padding:7px 16px;background:var(--primary);color:#fff;border-radius:7px;font-size:0.83rem;font-weight:600}
article{padding:120px 0 80px}
h1{font-size:2rem;font-weight:800;line-height:1.3;margin-bottom:14px}
h2{font-size:1.3rem;font-weight:700;margin:36px 0 14px;padding-top:16px;border-top:1px solid var(--border)}
h3{font-size:1.05rem;font-weight:700;margin:22px 0 10px}
p{margin-bottom:14px;color:var(--text-soft)}
ul,ol{margin:0 0 14px 22px;color:var(--text-soft)}li{margin-bottom:6px}
table{width:100%;border-collapse:collapse;margin:16px 0;font-size:0.86rem}
th,td{padding:10px 12px;text-align:left;border-bottom:1px solid var(--border)}
th{font-weight:600;background:var(--surface);font-size:0.78rem;color:var(--text-muted)}
pre{background:#1e293b;color:#e2e8f0;padding:18px;border-radius:10px;overflow-x:auto;font-size:0.82rem;line-height:1.7;margin:14px 0}
code{font-family:ui-monospace,Menlo,monospace}
p code,li code{background:var(--surface);padding:2px 6px;border-radius:5px;font-size:0.85em;color:var(--primary-dark)}
.post-meta{color:var(--text-muted);font-size:0.85rem;margin-bottom:24px}
.cta{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:24px;margin:28px 0;text-align:center}
.cta a.btn{display:inline-block;padding:10px 24px;background:var(--primary);color:#fff;border-radius:8px;font-weight:600}
.post-list{list-style:none;margin:0;padding:0}
.post-list li{margin:0 0 8px}
.post-card{display:block;border:1px solid var(--border);border-radius:var(--radius);padding:20px 22px;margin-bottom:14px}
.post-card:hover{border-color:var(--primary);text-decoration:none}
.post-card h2{border:none;padding:0;margin:0 0 6px;font-size:1.15rem;color:var(--text)}
.post-card p{margin:0;color:var(--text-soft);font-size:0.9rem}
.post-card .date{color:var(--text-muted);font-size:0.8rem}
footer{background:#0f172a;color:#94a3b8;padding:28px 0;text-align:center;font-size:0.8rem}
footer a{color:#94a3b8}</style>
</head>
<body>
<nav class="nav"><div class="container"><a href="/" class="nav-logo">Fun<span>ASR</span></a><div class="nav-links"><a href="/#capabilities">核心能力</a><a href="/#usage">如何使用</a><a href="/#benchmark">性能</a><a href="/#demo">演示</a><a href="https://modelscope.github.io/FunASR/zh/" target="_blank">文档</a><a href="/quickstart.html">快速上手</a><a href="/models.html">模型</a><a href="/ecosystem.html">生态</a><a href="/blog/">技术博客</a><a href="/vs-whisper.html">对比 Whisper</a><a href="/donors.html">功德榜</a></div><a href="https://www.funasr.com/en/blog/funasr-llama-cpp-whisper-cpp-alternative.html" style="font-size:0.83rem;font-weight:500;color:var(--text-soft)">EN</a><a href="https://github.com/modelscope/FunASR" target="_blank" class="nav-btn">GitHub ★</a></div></nav>
<article><div class="container">
<h1>FunASR 跑进 llama.cpp:中文语音识别的 whisper.cpp 替代品(CPU、零 Python、下载即用)</h1>
<p class="post-meta">2026-06-20 · FunASR 团队</p>
<p><a href="https://github.com/ggml-org/whisper.cpp" target="_blank">whisper.cpp</a> 是端侧语音识别的事实标准——单个自包含二进制、CPU 就能跑、零依赖。但 Whisper 在<strong>中文</strong>上偏弱。现在 <strong>FunASR 有了 llama.cpp / GGUF 运行时</strong>:一样的"下载即用"体验,**单个静态二进制、零 Python、内置 VAD、吃任意音频**,而且在中文 CPU 上比 whisper.cpp <strong>准约 2.7 倍</strong>。</p>
<p style="background:var(--surface);border:1px solid var(--border);border-radius:10px;padding:12px 16px"><strong>👉 想直接下载?</strong> 各平台预编译二进制(Linux/macOS/Windows)+ 一站式 quickstart 与 benchmark 见 <a href="/llama-cpp.html">在 CPU 上运行 FunASR(llama.cpp 下载页)</a>。</p>
<h2>3 步跑通(全部实测)</h2>
<pre># 1. 下预编译二进制(linux-x64 / linux-arm64 / macos-arm64 / windows-x64)
wget https://github.com/modelscope/FunASR/releases/download/runtime-llamacpp-v0.1.9/funasr-llamacpp-linux-x64-vulkan.tar.gz
tar xzf funasr-llamacpp-linux-x64-vulkan.tar.gz
# Windows Vulkan 包: funasr-llamacpp-windows-x64-vulkan.zip(运行时加 --backend vulkan)
# 2. 一条命令下模型(无需 torch / funasr 环境)
bash download-funasr-model.sh sensevoice
# 3. 转写 —— 直接打印文字
./llama-funasr-sensevoice -m funasr-gguf/sensevoice-small-f16.gguf \
--vad funasr-gguf/fsmn-vad.gguf -a audio.wav
# -> 开放时间早上九点至下午五点</pre>
<p>没有 Python、没有编译、没有依赖地狱——下二进制、下模型、跑,出中文文字。和 whisper.cpp 一模一样的手感。</p>
<h2>你能得到什么</h2>
<table>
<tr><th>模型</th><th>特点</th><th>速度(CPU)</th></tr>
<tr><td><strong>SenseVoice</strong></td><td>多语种 + 语种/情感/事件标签</td><td>~20× 实时</td></tr>
<tr><td><strong>Paraformer</strong></td><td>非自回归,最快</td><td>~22× 实时</td></tr>
<tr><td><strong>Fun-ASR-Nano</strong></td><td>LLM-ASR,最准</td><td>LLM 解码</td></tr>
</table>
<ul>
<li><strong>内置 FSMN-VAD</strong>:长音频自动分段(`--vad fsmn-vad.gguf`),裸二进制即达参考精度,无需 Python 前端</li>
<li><strong>任意音频</strong>:wav / mp3 / flac、任意采样率/声道,二进制内部重采样</li>
<li><strong>多平台预编译</strong>:Linux x64/arm64、macOS arm64、Windows x64,含 Linux/Windows Vulkan 与 Windows CUDA 加速包(<a href="https://github.com/modelscope/FunASR/releases/tag/runtime-llamacpp-v0.1.9" target="_blank">Release</a>);其它平台一条 CMake 命令自构建</li>
</ul>
<h2>中文 CPU 上 vs whisper.cpp</h2>
<p>184 段中文音频、同机 CPU 8 线程、字符级 CER(越低越准):</p>
<table>
<tr><th>系统</th><th>CER ↓</th><th>体积</th></tr>
<tr><td><strong>FunASR SenseVoice</strong></td><td><strong>8.01 %</strong></td><td>449 MB</td></tr>
<tr><td><strong>FunASR Paraformer</strong></td><td><strong>9.85 %</strong></td><td>401 MB</td></tr>
<tr><td><strong>FunASR Fun-ASR-Nano</strong></td><td><strong>8.30 %</strong></td><td>enc + Qwen3-0.6B</td></tr>
<tr><td>whisper.cpp base</td><td>31.33 %</td><td>142 MB</td></tr>
<tr><td>whisper.cpp small</td><td>22.12 %</td><td>466 MB</td></tr>
<tr><td>whisper.cpp large-v3-turbo</td><td>23.15 %</td><td>1.6 GB</td></tr>
</table>
<p>同体积下(SenseVoice 449 MB ≈ whisper small 466 MB),FunASR 的 CER <strong>低约 2.7 倍</strong>,而且更快。完整方法学见仓库 <a href="https://github.com/modelscope/FunASR/blob/main/runtime/llama.cpp/BENCHMARKS.md" target="_blank">BENCHMARKS.md</a>。</p>
<h2>为什么中文上能赢</h2>
<p>① <strong>训练数据</strong>:SenseVoice / Paraformer / Fun-ASR-Nano 主要在大规模中文上训练,Whisper 是通用多语种模型、中文只占一小片;② <strong>架构</strong>:Paraformer 非自回归(CIF 一次前向)、SenseVoice 编码器 + CTC(一次前向),比 Whisper 的自回归(逐 token)更快。</p>
<h2>模型 GGUF</h2>
<p>预转 GGUF 在 Hugging Face:<a href="https://huggingface.co/FunAudioLLM/SenseVoiceSmall-GGUF" target="_blank">SenseVoiceSmall-GGUF</a> · <a href="https://huggingface.co/FunAudioLLM/Paraformer-GGUF" target="_blank">Paraformer-GGUF</a> · <a href="https://huggingface.co/FunAudioLLM/Fun-ASR-Nano-GGUF" target="_blank">Fun-ASR-Nano-GGUF</a> · <a href="https://huggingface.co/FunAudioLLM/fsmn-vad-GGUF" target="_blank">fsmn-vad-GGUF</a>。`download-funasr-model.sh` 会自动拉。</p>
<div class="cta"><p><strong>FunASR 全家桶开源</strong>——ASR / VAD / 标点 / 说话人 / 情感事件 / LLM-ASR / 现在还有 llama.cpp 端侧运行时。觉得有用点个 Star 👇</p><p><a class="btn" href="https://github.com/modelscope/FunASR" target="_blank">⭐ Star FunASR</a></p><p style="margin-top:10px;font-size:0.85rem">也欢迎 Star:<a href="https://github.com/QwenAudio/SenseVoice" target="_blank">SenseVoice</a> · <a href="https://github.com/QwenAudio/Fun-ASR" target="_blank">Fun-ASR</a> · <a href="https://github.com/modelscope/FunClip" target="_blank">FunClip</a></p></div>
<!--related-posts-->
<h2>相关文章</h2>
<ul class="post-list">
<li><a href="/blog/funasr-vs-whisper-benchmark.html">FunASR vs Whisper 实测对比</a></li>
<li><a href="/blog/sensevoice-deployment-guide.html">SenseVoice 部署指南</a></li>
<li><a href="/blog/fun-asr-nano-guide.html">Fun-ASR-Nano 使用指南</a></li>
<li><a href="/blog/funasr-speaker-diarization.html">说话人分离:谁在何时说话</a></li>
<li><a href="/blog/sensevoice-emotion-language-detection.html">情感与语种检测</a></li>
<li><a href="/blog/funasr-realtime-streaming-asr.html">实时流式语音识别</a></li>
<li><a href="/blog/funasr-transcribe-long-audio.html">转写超长音频(1小时一次搞定)</a></li>
<li><a href="/blog/funasr-cli-transcribe-command-line.html">命令行转写(文本/JSON/SRT)</a></li>
<li><a href="/blog/self-hosted-openai-whisper-api-alternative.html">自托管 OpenAI Whisper API 替代</a></li>
<li><a href="/blog/generate-subtitles-srt-vtt-from-audio-video.html">自动生成字幕(SRT / VTT)</a></li>
<li><a href="/blog/speech-to-text-python-transcribe-audio.html">Python 语音转文字教程</a></li>
<li><a href="/blog/funasr-vs-faster-whisper-chinese.html">FunASR vs faster-whisper(中文/粤语)</a></li>
<li><a href="/blog/lightweight-speech-recognition-cpu.html">轻量语音识别(CPU 250MB)</a></li>
<li><a href="/blog/self-hosted-deepgram-assemblyai-alternative.html">自托管替代 Deepgram/AssemblyAI</a></li>
<li><a href="/blog/which-funasr-model.html">选哪个 FunASR 模型</a></li>
<li><a href="/blog/cantonese-speech-recognition.html">粤语语音识别(SenseVoice 原生粤语)</a></li>
<li><a href="/blog/japanese-speech-recognition.html">日语语音识别(SenseVoice 转写+标点+情感)</a></li>
<li><a href="/blog/voice-activity-detection-python.html">Python 语音活动检测(VAD)</a></li>
<li><a href="/blog/self-hosted-google-aws-azure-speech-to-text.html">自托管替代 Google/AWS/Azure 云语音 API</a></li>
<li><a href="/blog/chinese-speech-recognition.html">中文语音识别(普通话)实战</a></li>
<li><a href="/blog/punctuation-restoration-python.html">标点恢复 Python 实战</a></li>
<li><a href="/blog/speech-to-text-timestamps-python.html">语音识别带时间戳(字级)</a></li>
</ul>
</div></article>
<footer><div class="container">© 2024-2026 Tongyi Lab, Alibaba Group · <a href="https://github.com/modelscope/FunASR/blob/main/LICENSE">MIT License</a></div></footer>
</body>
</html>
@@ -0,0 +1,136 @@
<!DOCTYPE html>
<html lang="zh"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>用 FunASR 实现实时流式语音识别(边说边出字) | FunASR</title><meta name="description" content="FunASR 流式 Paraformer 支持 600ms 级低延迟实时语音识别:边说边出字,带 cache 的分块解码。适合实时字幕、语音助手、会议转写。附可运行代码与 2-pass(流式+离线)最佳实践。"><meta name="keywords" content="实时语音识别, 流式语音识别, real time speech to text, streaming asr, 边说边出字, live transcription, 低延迟语音识别, FunASR streaming, paraformer streaming, 实时字幕">
<link rel="icon" href="/logo.png"><meta property="og:title" content="用 FunASR 实现实时流式语音识别(边说边出字)"><meta property="og:description" content="FunASR 流式 Paraformer 支持 600ms 级低延迟实时语音识别:边说边出字,带 cache 的分块解码。适合实时字幕、语音助手、会议转写。附可运行代码与 2-pass(流式+离线)最佳实践。">
<meta property="og:type" content="article"><meta property="og:url" content="https://www.funasr.com/blog/funasr-realtime-streaming-asr.html"><meta property="og:image" content="https://www.funasr.com/logo.png">
<link rel="canonical" href="https://www.funasr.com/blog/funasr-realtime-streaming-asr.html"><link rel="alternate" hreflang="en" href="https://www.funasr.com/en/blog/funasr-realtime-streaming-asr.html"><link rel="alternate" hreflang="zh" href="https://www.funasr.com/blog/funasr-realtime-streaming-asr.html"><link rel="alternate" hreflang="x-default" href="https://www.funasr.com/en/blog/funasr-realtime-streaming-asr.html">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"BlogPosting","headline":"用 FunASR 实现实时流式语音识别(边说边出字)","description":"FunASR 流式 Paraformer 支持 600ms 级低延迟实时语音识别:边说边出字,带 cache 的分块解码。适合实时字幕、语音助手、会议转写。附可运行代码与 2-pass(流式+离线)最佳实践。","datePublished":"2026-06-17","dateModified":"2026-06-17","author":{"@type":"Organization","name":"FunASR / Tongyi Lab"},"publisher":{"@type":"Organization","name":"FunASR","logo":{"@type":"ImageObject","url":"https://www.funasr.com/logo.png"}},"mainEntityOfPage":{"@type":"WebPage","@id":"https://www.funasr.com/blog/funasr-realtime-streaming-asr.html"},"image":"https://www.funasr.com/logo.png"}
</script>
<style>:root{--primary:#2563eb;--primary-dark:#1d4ed8;--bg:#fff;--surface:#f8fafc;--border:#e2e8f0;--text:#0f172a;--text-soft:#475569;--text-muted:#94a3b8;--radius:12px}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:'Inter',-apple-system,sans-serif;color:var(--text);line-height:1.7}
a{color:var(--primary);text-decoration:none}a:hover{text-decoration:underline}
.container{max-width:800px;margin:0 auto;padding:0 24px}
.nav{position:fixed;top:0;left:0;right:0;z-index:100;background:rgba(255,255,255,0.9);backdrop-filter:blur(12px);border-bottom:1px solid var(--border);padding:14px 0}
.nav .container{max-width:1120px;display:flex;align-items:center;gap:24px}
.nav-logo{font-size:1.2rem;font-weight:800;color:var(--text)}.nav-logo span{color:var(--primary)}
.nav-links{display:flex;gap:20px;margin-left:auto;flex-wrap:wrap}
.nav-links a{font-size:0.85rem;font-weight:500;color:var(--text-soft)}
.nav-btn{padding:7px 16px;background:var(--primary);color:#fff;border-radius:7px;font-size:0.83rem;font-weight:600}
article{padding:120px 0 80px}
h1{font-size:2rem;font-weight:800;line-height:1.3;margin-bottom:14px}
h2{font-size:1.3rem;font-weight:700;margin:36px 0 14px;padding-top:16px;border-top:1px solid var(--border)}
h3{font-size:1.05rem;font-weight:700;margin:22px 0 10px}
p{margin-bottom:14px;color:var(--text-soft)}
ul,ol{margin:0 0 14px 22px;color:var(--text-soft)}li{margin-bottom:6px}
table{width:100%;border-collapse:collapse;margin:16px 0;font-size:0.86rem}
th,td{padding:10px 12px;text-align:left;border-bottom:1px solid var(--border)}
th{font-weight:600;background:var(--surface);font-size:0.78rem;color:var(--text-muted)}
pre{background:#1e293b;color:#e2e8f0;padding:18px;border-radius:10px;overflow-x:auto;font-size:0.82rem;line-height:1.7;margin:14px 0}
code{font-family:ui-monospace,Menlo,monospace}
p code,li code{background:var(--surface);padding:2px 6px;border-radius:5px;font-size:0.85em;color:var(--primary-dark)}
.post-meta{color:var(--text-muted);font-size:0.85rem;margin-bottom:24px}
.cta{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:24px;margin:28px 0;text-align:center}
.cta a.btn{display:inline-block;padding:10px 24px;background:var(--primary);color:#fff;border-radius:8px;font-weight:600}
.post-list{list-style:none;margin:0;padding:0}
.post-list li{margin:0 0 8px}
.post-card{display:block;border:1px solid var(--border);border-radius:var(--radius);padding:20px 22px;margin-bottom:14px}
.post-card:hover{border-color:var(--primary);text-decoration:none}
.post-card h2{border:none;padding:0;margin:0 0 6px;font-size:1.15rem;color:var(--text)}
.post-card p{margin:0;color:var(--text-soft);font-size:0.9rem}
.post-card .date{color:var(--text-muted);font-size:0.8rem}
footer{background:#0f172a;color:#94a3b8;padding:28px 0;text-align:center;font-size:0.8rem}
footer a{color:#94a3b8}</style></head><body>
<nav class="nav"><div class="container"><a href="/" class="nav-logo">Fun<span>ASR</span></a><div class="nav-links"><a href="/#capabilities">核心能力</a><a href="/#usage">如何使用</a><a href="/#benchmark">性能</a><a href="/#demo">演示</a><a href="https://modelscope.github.io/FunASR/zh/" target="_blank">文档</a><a href="/quickstart.html">快速上手</a><a href="/models.html">模型</a><a href="/ecosystem.html">生态</a><a href="/blog/">技术博客</a><a href="/vs-whisper.html">对比 Whisper</a><a href="/donors.html">功德榜</a></div><a href="https://www.funasr.com/en/blog/funasr-realtime-streaming-asr.html" style="font-size:0.83rem;font-weight:600;color:var(--text-soft)">EN</a><a href="https://github.com/modelscope/FunASR" target="_blank" class="nav-btn">GitHub ★</a></div></nav>
<article><div class="container">
<h1>用 FunASR 实现实时流式语音识别(边说边出字)</h1>
<p class="post-meta">FunASR 技术博客 · 2026-06-17 · 教程</p>
<p>实时字幕、语音助手、会议转写——这些场景要的不是"录完再转",而是<strong>边说边出字</strong>:用户话音未落,文字已经在屏幕上滚动。这就是<strong>流式语音识别(Streaming ASR)</strong>。</p>
<p>FunASR 的流式 Paraformer 用<strong>分块(chunk)+ 缓存(cache)</strong>解码,可以做到 <strong>600ms 级延迟</strong>的实时出字,而且 CPU 上就能跑。</p>
<h2>安装</h2>
<pre><code>pip install -U funasr modelscope</code></pre>
<h2>完整代码(可直接运行)</h2>
<pre><code>from funasr import AutoModel
import soundfile as sf
chunk_size = [0, 10, 5] # 600 ms chunks (10 * 60 ms center)
encoder_chunk_look_back = 4 # encoder look-back chunks
decoder_chunk_look_back = 1 # decoder look-back chunks
model = AutoModel(model="paraformer-zh-streaming")
audio, sr = sf.read("speech.wav", dtype="float32") # 16 kHz mono
chunk_stride = chunk_size[1] * 960 # 600 ms @ 16 kHz
cache = {}
n_chunks = (len(audio) - 1) // chunk_stride + 1
for i in range(n_chunks):
chunk = audio[i * chunk_stride : (i + 1) * chunk_stride]
is_final = i == n_chunks - 1
res = model.generate(
input=chunk, cache=cache, is_final=is_final,
chunk_size=chunk_size,
encoder_chunk_look_back=encoder_chunk_look_back,
decoder_chunk_look_back=decoder_chunk_look_back,
)
if res[0]["text"]:
print(res[0]["text"], end="", flush=True) # emit partial text</code></pre>
<h2>输出是逐步增长的(示例)</h2>
<pre><code>今天 # ~600 ms after speech starts
今天天气
今天天气真
今天天气真不错 # is_final=True</code></pre>
<p>每喂入一个 600ms 的音频块,模型就吐出这一块新识别到的文字,屏幕上的句子<strong>逐字增长</strong>,直到 <code>is_final=True</code> 收尾。实测一段 12 秒音频被切成 20 个块,逐块返回增量结果。</p>
<h2>关键参数</h2>
<table><thead><tr><th>参数</th><th>含义</th></tr></thead><tbody>
<tr><td><code>chunk_size=[0,10,5]</code></td><td>[左看, 中心, 右看] 块大小,单位 60ms。中心 10 → 每块 600ms(延迟与精度的平衡点)</td></tr>
<tr><td><code>encoder_chunk_look_back=4</code></td><td>编码器回看的历史块数(越大上下文越足、延迟略增)</td></tr>
<tr><td><code>decoder_chunk_look_back=1</code></td><td>解码器回看的历史块数</td></tr>
<tr><td><code>cache={}</code></td><td>跨块传递的状态,<strong>必须在多次调用间复用同一个 dict</strong></td></tr>
<tr><td><code>is_final</code></td><td>最后一块置 <code>True</code>,触发收尾解码</td></tr>
</tbody></table>
<h2>最佳实践:2-pass(流式 + 离线)</h2>
<p>流式模型为了低延迟,精度会略低于离线模型。生产里常用 <strong>2-pass</strong> 方案:</p>
<ul>
<li><strong>第一遍(流式)</strong>:用流式 Paraformer 实时出字,给用户即时反馈;</li>
<li><strong>第二遍(离线)</strong>:一句话结束后(用 VAD 判定停顿),把整段音频再用 <a href="/blog/sensevoice-deployment-guide.html">SenseVoice</a> / 离线 Paraformer 重转一遍,得到更准的最终结果替换屏幕上的临时文本。</li>
</ul>
<p>FunASR 官方的 WebSocket 服务(<code>funasr-runtime-sdk-online-cpu</code>)就内置了这套 2-pass 流式协议,可直接部署。</p>
<h2>典型场景</h2>
<ul>
<li><strong>实时字幕</strong>:直播、会议、课堂的即时上字幕。</li>
<li><strong>语音助手</strong>:边听边理解,降低端到端响应延迟。</li>
<li><strong>客服/质检</strong>:通话实时转写 + 实时关键词告警。</li>
</ul>
<div class="cta"><p>FunASR 是通义实验室开源的工业级语音识别工具包,离线 + 流式全覆盖,中文又快又准。</p><a class="btn" href="https://github.com/modelscope/FunASR" target="_blank">在 GitHub 上 Star FunASR ★</a></div>
<!--related-posts-->
<h2>相关文章</h2>
<ul class="post-list">
<li><a href="/blog/funasr-vs-whisper-benchmark.html">FunASR vs Whisper 实测对比</a></li>
<li><a href="/blog/sensevoice-deployment-guide.html">SenseVoice 部署指南</a></li>
<li><a href="/blog/fun-asr-nano-guide.html">Fun-ASR-Nano 使用指南</a></li>
<li><a href="/blog/funasr-speaker-diarization.html">说话人分离:谁在何时说话</a></li>
<li><a href="/blog/sensevoice-emotion-language-detection.html">情感与语种检测</a></li>
<li><a href="/blog/funasr-transcribe-long-audio.html">转写超长音频(1小时一次搞定)</a></li>
<li><a href="/blog/funasr-cli-transcribe-command-line.html">命令行转写(文本/JSON/SRT)</a></li>
<li><a href="/blog/self-hosted-openai-whisper-api-alternative.html">自托管 OpenAI Whisper API 替代</a></li>
<li><a href="/blog/generate-subtitles-srt-vtt-from-audio-video.html">自动生成字幕(SRT / VTT)</a></li>
<li><a href="/blog/speech-to-text-python-transcribe-audio.html">Python 语音转文字教程</a></li>
<li><a href="/blog/funasr-llama-cpp-whisper-cpp-alternative.html">FunASR 跑进 llama.cpp(whisper.cpp 替代)</a></li>
<li><a href="/blog/funasr-vs-faster-whisper-chinese.html">FunASR vs faster-whisper(中文/粤语)</a></li>
<li><a href="/blog/lightweight-speech-recognition-cpu.html">轻量语音识别(CPU 250MB)</a></li>
<li><a href="/blog/self-hosted-deepgram-assemblyai-alternative.html">自托管替代 Deepgram/AssemblyAI</a></li>
<li><a href="/blog/which-funasr-model.html">选哪个 FunASR 模型</a></li>
<li><a href="/blog/cantonese-speech-recognition.html">粤语语音识别(SenseVoice 原生粤语)</a></li>
<li><a href="/blog/japanese-speech-recognition.html">日语语音识别(SenseVoice 转写+标点+情感)</a></li>
<li><a href="/blog/voice-activity-detection-python.html">Python 语音活动检测(VAD)</a></li>
<li><a href="/blog/self-hosted-google-aws-azure-speech-to-text.html">自托管替代 Google/AWS/Azure 云语音 API</a></li>
<li><a href="/blog/chinese-speech-recognition.html">中文语音识别(普通话)实战</a></li>
<li><a href="/blog/punctuation-restoration-python.html">标点恢复 Python 实战</a></li>
<li><a href="/blog/speech-to-text-timestamps-python.html">语音识别带时间戳(字级)</a></li>
</ul>
</div></article>
<footer><div class="container">FunASR · 通义实验室开源语音识别 · <a href="https://github.com/modelscope/FunASR">GitHub</a></div></footer>
</body></html>
@@ -0,0 +1,125 @@
<!DOCTYPE html>
<html lang="zh"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>用 FunASR 做说话人分离:一次调用输出「谁在何时说了什么」 | FunASR</title><meta name="description" content="FunASR 一次 generate 调用即可同时输出语音转写、说话人标签和句级时间戳,无需 pyannote+Whisper 两件套、无需 HuggingFace 授权。实测 227 秒会议录音自动切分 77 句、区分 11 个说话人。"><meta name="keywords" content="说话人分离, speaker diarization, 说话人识别, pyannote 替代, 会议转写, 谁在说话, FunASR, cam++, 语音识别说话人, 会议纪要">
<link rel="icon" href="/logo.png"><meta property="og:title" content="用 FunASR 做说话人分离:一次调用输出「谁在何时说了什么」"><meta property="og:description" content="FunASR 一次 generate 调用即可同时输出语音转写、说话人标签和句级时间戳,无需 pyannote+Whisper 两件套、无需 HuggingFace 授权。实测 227 秒会议录音自动切分 77 句、区分 11 个说话人。">
<meta property="og:type" content="article"><meta property="og:url" content="https://www.funasr.com/blog/funasr-speaker-diarization.html"><meta property="og:image" content="https://www.funasr.com/logo.png">
<link rel="canonical" href="https://www.funasr.com/blog/funasr-speaker-diarization.html"><link rel="alternate" hreflang="en" href="https://www.funasr.com/en/blog/funasr-speaker-diarization.html"><link rel="alternate" hreflang="zh" href="https://www.funasr.com/blog/funasr-speaker-diarization.html"><link rel="alternate" hreflang="x-default" href="https://www.funasr.com/en/blog/funasr-speaker-diarization.html">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"BlogPosting","headline":"用 FunASR 做说话人分离:一次调用输出「谁在何时说了什么」","description":"FunASR 一次 generate 调用即可同时输出语音转写、说话人标签和句级时间戳,无需 pyannote+Whisper 两件套、无需 HuggingFace 授权。实测 227 秒会议录音自动切分 77 句、区分 11 个说话人。","datePublished":"2026-06-17","dateModified":"2026-06-17","author":{"@type":"Organization","name":"FunASR / Tongyi Lab"},"publisher":{"@type":"Organization","name":"FunASR","logo":{"@type":"ImageObject","url":"https://www.funasr.com/logo.png"}},"mainEntityOfPage":{"@type":"WebPage","@id":"https://www.funasr.com/blog/funasr-speaker-diarization.html"},"image":"https://www.funasr.com/logo.png"}
</script>
<style>:root{--primary:#2563eb;--primary-dark:#1d4ed8;--bg:#fff;--surface:#f8fafc;--border:#e2e8f0;--text:#0f172a;--text-soft:#475569;--text-muted:#94a3b8;--radius:12px}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:'Inter',-apple-system,sans-serif;color:var(--text);line-height:1.7}
a{color:var(--primary);text-decoration:none}a:hover{text-decoration:underline}
.container{max-width:800px;margin:0 auto;padding:0 24px}
.nav{position:fixed;top:0;left:0;right:0;z-index:100;background:rgba(255,255,255,0.9);backdrop-filter:blur(12px);border-bottom:1px solid var(--border);padding:14px 0}
.nav .container{max-width:1120px;display:flex;align-items:center;gap:24px}
.nav-logo{font-size:1.2rem;font-weight:800;color:var(--text)}.nav-logo span{color:var(--primary)}
.nav-links{display:flex;gap:20px;margin-left:auto;flex-wrap:wrap}
.nav-links a{font-size:0.85rem;font-weight:500;color:var(--text-soft)}
.nav-btn{padding:7px 16px;background:var(--primary);color:#fff;border-radius:7px;font-size:0.83rem;font-weight:600}
article{padding:120px 0 80px}
h1{font-size:2rem;font-weight:800;line-height:1.3;margin-bottom:14px}
h2{font-size:1.3rem;font-weight:700;margin:36px 0 14px;padding-top:16px;border-top:1px solid var(--border)}
h3{font-size:1.05rem;font-weight:700;margin:22px 0 10px}
p{margin-bottom:14px;color:var(--text-soft)}
ul,ol{margin:0 0 14px 22px;color:var(--text-soft)}li{margin-bottom:6px}
table{width:100%;border-collapse:collapse;margin:16px 0;font-size:0.86rem}
th,td{padding:10px 12px;text-align:left;border-bottom:1px solid var(--border)}
th{font-weight:600;background:var(--surface);font-size:0.78rem;color:var(--text-muted)}
pre{background:#1e293b;color:#e2e8f0;padding:18px;border-radius:10px;overflow-x:auto;font-size:0.82rem;line-height:1.7;margin:14px 0}
code{font-family:ui-monospace,Menlo,monospace}
p code,li code{background:var(--surface);padding:2px 6px;border-radius:5px;font-size:0.85em;color:var(--primary-dark)}
.post-meta{color:var(--text-muted);font-size:0.85rem;margin-bottom:24px}
.cta{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:24px;margin:28px 0;text-align:center}
.cta a.btn{display:inline-block;padding:10px 24px;background:var(--primary);color:#fff;border-radius:8px;font-weight:600}
.post-list{list-style:none;margin:0;padding:0}
.post-list li{margin:0 0 8px}
.post-card{display:block;border:1px solid var(--border);border-radius:var(--radius);padding:20px 22px;margin-bottom:14px}
.post-card:hover{border-color:var(--primary);text-decoration:none}
.post-card h2{border:none;padding:0;margin:0 0 6px;font-size:1.15rem;color:var(--text)}
.post-card p{margin:0;color:var(--text-soft);font-size:0.9rem}
.post-card .date{color:var(--text-muted);font-size:0.8rem}
footer{background:#0f172a;color:#94a3b8;padding:28px 0;text-align:center;font-size:0.8rem}
footer a{color:#94a3b8}</style></head><body>
<nav class="nav"><div class="container"><a href="/" class="nav-logo">Fun<span>ASR</span></a><div class="nav-links"><a href="/#capabilities">核心能力</a><a href="/#usage">如何使用</a><a href="/#benchmark">性能</a><a href="/#demo">演示</a><a href="https://modelscope.github.io/FunASR/zh/" target="_blank">文档</a><a href="/quickstart.html">快速上手</a><a href="/models.html">模型</a><a href="/ecosystem.html">生态</a><a href="/blog/">技术博客</a><a href="/vs-whisper.html">对比 Whisper</a><a href="/donors.html">功德榜</a></div><a href="https://www.funasr.com/en/blog/funasr-speaker-diarization.html" style="font-size:0.83rem;font-weight:600;color:var(--text-soft)">EN</a><a href="https://github.com/modelscope/FunASR" target="_blank" class="nav-btn">GitHub ★</a></div></nav>
<article><div class="container">
<h1>用 FunASR 做说话人分离:一次调用输出「谁在何时说了什么」</h1>
<p class="post-meta">FunASR 技术博客 · 2026-06-17 · 教程</p>
<p>做会议纪要、客服质检、访谈整理时,你不只想知道<strong>说了什么</strong>,还想知道<strong>每句话是谁说的</strong>。这件事叫<strong>说话人分离(Speaker Diarization)</strong>。</p>
<p>常见做法是把两个工具拼起来:<strong>pyannote.audio</strong> 负责切分说话人 + <strong>Whisper</strong> 负责转写,再手动把时间轴对齐。这套流程要申请 HuggingFace 授权、装一堆依赖、自己写对齐逻辑,而且对中文不算友好。</p>
<p><strong>用 FunASR,一次 <code>generate()</code> 调用就够了。</strong>VAD、语音识别、标点、说话人嵌入(CAM++)被串成一条流水线,直接返回每一句的<strong>说话人编号、时间戳和文本</strong>。</p>
<h2>安装</h2>
<pre><code>pip install -U funasr modelscope</code></pre>
<h2>完整代码</h2>
<pre><code>from funasr import AutoModel
# One model handle = VAD + ASR + punctuation + speaker embedding (CAM++)
model = AutoModel(
model="paraformer-zh", # or "iic/SenseVoiceSmall"
vad_model="fsmn-vad",
punc_model="ct-punc",
spk_model="cam++", # speaker diarization
)
res = model.generate(input="meeting.wav", batch_size_s=300)
for s in res[0]["sentence_info"]:
print(f'[{s["start"]/1000:.1f}s-{s["end"]/1000:.1f}s] '
f'speaker {s["spk"]}: {s["sentence"]}')</code></pre>
<h2>输出长这样(示例)</h2>
<pre><code>[0.0s-3.2s] speaker 0: 大家好,今天的会议主要讨论第三季度的产品规划。
[3.5s-7.1s] speaker 1: 我先同步一下进度,核心功能已经完成了百分之八十。
[7.4s-9.9s] speaker 2: 测试这边可能还需要两周时间。
[10.2s-13.6s] speaker 0: 好的,那我们把上线时间往后调一周。</code></pre>
<p>每个 <code>sentence_info</code> 元素包含四个字段:</p>
<table><thead><tr><th>字段</th><th>含义</th></tr></thead><tbody>
<tr><td><code>spk</code></td><td>说话人编号,CAM++ 自动聚类得到,<strong>无需事先指定人数</strong></td></tr>
<tr><td><code>start</code> / <code>end</code></td><td>该句的起止时间(毫秒)</td></tr>
<tr><td><code>sentence</code></td><td>该句文本(已加标点)</td></tr>
</tbody></table>
<h2>实测效果</h2>
<p>我们在一段 <strong>227 秒的多人会议录音</strong>上实测:FunASR 自动切分出 <strong>77 个句子</strong>、区分出 <strong>11 个不同说话人</strong>,全程<strong>不需要预先告诉它有几个人</strong>。整条流水线只用一次 <code>generate()</code> 调用、一个 Python 依赖。</p>
<h2>为什么用 FunASR 而不是 pyannote + Whisper</h2>
<ul>
<li><strong>一个调用,不用对齐</strong>:转写和说话人标签天然对齐,不必自己拼时间轴。</li>
<li><strong>不需要 HuggingFace 授权</strong>:pyannote 的说话人模型是 gated 的,要申请、要 token;FunASR 模型公开可下载。</li>
<li><strong>中文更准</strong>:Paraformer / SenseVoice 在中文上 CER 显著低于 Whisper(<a href="/blog/funasr-vs-whisper-benchmark.html">实测对比</a>)。</li>
<li><strong>CPU 也能跑</strong>:没有 GPU 也能离线出结果。</li>
</ul>
<h2>进阶</h2>
<ul>
<li>把 <code>model="paraformer-zh"</code> 换成 <code>"iic/SenseVoiceSmall"</code> 即可用 SenseVoice(还自带情感/事件标签)。</li>
<li>遍历 <code>sentence_info</code> 即可导出 <strong>SRT 字幕</strong>或按说话人聚合成<strong>会议纪要</strong>。</li>
</ul>
<div class="cta"><p>FunASR 是通义实验室开源的工业级语音识别工具包,中文场景又快又准。</p><a class="btn" href="https://github.com/modelscope/FunASR" target="_blank">在 GitHub 上 Star FunASR ★</a></div>
<!--related-posts-->
<h2>相关文章</h2>
<ul class="post-list">
<li><a href="/blog/funasr-vs-whisper-benchmark.html">FunASR vs Whisper 实测对比</a></li>
<li><a href="/blog/sensevoice-deployment-guide.html">SenseVoice 部署指南</a></li>
<li><a href="/blog/fun-asr-nano-guide.html">Fun-ASR-Nano 使用指南</a></li>
<li><a href="/blog/sensevoice-emotion-language-detection.html">情感与语种检测</a></li>
<li><a href="/blog/funasr-realtime-streaming-asr.html">实时流式语音识别</a></li>
<li><a href="/blog/funasr-transcribe-long-audio.html">转写超长音频(1小时一次搞定)</a></li>
<li><a href="/blog/funasr-cli-transcribe-command-line.html">命令行转写(文本/JSON/SRT)</a></li>
<li><a href="/blog/self-hosted-openai-whisper-api-alternative.html">自托管 OpenAI Whisper API 替代</a></li>
<li><a href="/blog/generate-subtitles-srt-vtt-from-audio-video.html">自动生成字幕(SRT / VTT)</a></li>
<li><a href="/blog/speech-to-text-python-transcribe-audio.html">Python 语音转文字教程</a></li>
<li><a href="/blog/funasr-llama-cpp-whisper-cpp-alternative.html">FunASR 跑进 llama.cpp(whisper.cpp 替代)</a></li>
<li><a href="/blog/funasr-vs-faster-whisper-chinese.html">FunASR vs faster-whisper(中文/粤语)</a></li>
<li><a href="/blog/lightweight-speech-recognition-cpu.html">轻量语音识别(CPU 250MB)</a></li>
<li><a href="/blog/self-hosted-deepgram-assemblyai-alternative.html">自托管替代 Deepgram/AssemblyAI</a></li>
<li><a href="/blog/which-funasr-model.html">选哪个 FunASR 模型</a></li>
<li><a href="/blog/cantonese-speech-recognition.html">粤语语音识别(SenseVoice 原生粤语)</a></li>
<li><a href="/blog/japanese-speech-recognition.html">日语语音识别(SenseVoice 转写+标点+情感)</a></li>
<li><a href="/blog/voice-activity-detection-python.html">Python 语音活动检测(VAD)</a></li>
<li><a href="/blog/self-hosted-google-aws-azure-speech-to-text.html">自托管替代 Google/AWS/Azure 云语音 API</a></li>
<li><a href="/blog/chinese-speech-recognition.html">中文语音识别(普通话)实战</a></li>
<li><a href="/blog/punctuation-restoration-python.html">标点恢复 Python 实战</a></li>
<li><a href="/blog/speech-to-text-timestamps-python.html">语音识别带时间戳(字级)</a></li>
</ul>
</div></article>
<footer><div class="container">FunASR · 通义实验室开源语音识别 · <a href="https://github.com/modelscope/FunASR">GitHub</a></div></footer>
</body></html>
@@ -0,0 +1,121 @@
<!DOCTYPE html>
<html lang="zh"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>用 FunASR 转写超长音频:1 小时录音也能一次搞定 | FunASR</title><meta name="description" content="Whisper 一次只处理 30 秒,转写 1 小时音频要自己切片再拼接。FunASR 内置 VAD,一次 generate 调用直接吃下任意时长音频:实测 13.2 分钟录音 4.3 秒转完(186x 实时)。附可运行代码与长音频最佳实践。"><meta name="keywords" content="转写长音频, transcribe long audio, 长音频语音识别, whisper 30秒限制, 一小时音频转文字, 播客转写, 会议录音转文字, FunASR, 音频转文字, long audio transcription">
<link rel="icon" href="/logo.png"><meta property="og:title" content="用 FunASR 转写超长音频:1 小时录音也能一次搞定"><meta property="og:description" content="Whisper 一次只处理 30 秒,转写 1 小时音频要自己切片再拼接。FunASR 内置 VAD,一次 generate 调用直接吃下任意时长音频:实测 13.2 分钟录音 4.3 秒转完(186x 实时)。附可运行代码与长音频最佳实践。">
<meta property="og:type" content="article"><meta property="og:url" content="https://www.funasr.com/blog/funasr-transcribe-long-audio.html"><meta property="og:image" content="https://www.funasr.com/logo.png">
<link rel="canonical" href="https://www.funasr.com/blog/funasr-transcribe-long-audio.html"><link rel="alternate" hreflang="en" href="https://www.funasr.com/en/blog/funasr-transcribe-long-audio.html"><link rel="alternate" hreflang="zh" href="https://www.funasr.com/blog/funasr-transcribe-long-audio.html"><link rel="alternate" hreflang="x-default" href="https://www.funasr.com/en/blog/funasr-transcribe-long-audio.html">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"BlogPosting","headline":"用 FunASR 转写超长音频:1 小时录音也能一次搞定","description":"Whisper 一次只处理 30 秒,转写 1 小时音频要自己切片再拼接。FunASR 内置 VAD,一次 generate 调用直接吃下任意时长音频:实测 13.2 分钟录音 4.3 秒转完(186x 实时)。附可运行代码与长音频最佳实践。","datePublished":"2026-06-17","dateModified":"2026-06-17","author":{"@type":"Organization","name":"FunASR / Tongyi Lab"},"publisher":{"@type":"Organization","name":"FunASR","logo":{"@type":"ImageObject","url":"https://www.funasr.com/logo.png"}},"mainEntityOfPage":{"@type":"WebPage","@id":"https://www.funasr.com/blog/funasr-transcribe-long-audio.html"},"image":"https://www.funasr.com/logo.png"}
</script>
<style>:root{--primary:#2563eb;--primary-dark:#1d4ed8;--bg:#fff;--surface:#f8fafc;--border:#e2e8f0;--text:#0f172a;--text-soft:#475569;--text-muted:#94a3b8;--radius:12px}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:'Inter',-apple-system,sans-serif;color:var(--text);line-height:1.7}
a{color:var(--primary);text-decoration:none}a:hover{text-decoration:underline}
.container{max-width:800px;margin:0 auto;padding:0 24px}
.nav{position:fixed;top:0;left:0;right:0;z-index:100;background:rgba(255,255,255,0.9);backdrop-filter:blur(12px);border-bottom:1px solid var(--border);padding:14px 0}
.nav .container{max-width:1120px;display:flex;align-items:center;gap:24px}
.nav-logo{font-size:1.2rem;font-weight:800;color:var(--text)}.nav-logo span{color:var(--primary)}
.nav-links{display:flex;gap:20px;margin-left:auto;flex-wrap:wrap}
.nav-links a{font-size:0.85rem;font-weight:500;color:var(--text-soft)}
.nav-btn{padding:7px 16px;background:var(--primary);color:#fff;border-radius:7px;font-size:0.83rem;font-weight:600}
article{padding:120px 0 80px}
h1{font-size:2rem;font-weight:800;line-height:1.3;margin-bottom:14px}
h2{font-size:1.3rem;font-weight:700;margin:36px 0 14px;padding-top:16px;border-top:1px solid var(--border)}
h3{font-size:1.05rem;font-weight:700;margin:22px 0 10px}
p{margin-bottom:14px;color:var(--text-soft)}
ul,ol{margin:0 0 14px 22px;color:var(--text-soft)}li{margin-bottom:6px}
table{width:100%;border-collapse:collapse;margin:16px 0;font-size:0.86rem}
th,td{padding:10px 12px;text-align:left;border-bottom:1px solid var(--border)}
th{font-weight:600;background:var(--surface);font-size:0.78rem;color:var(--text-muted)}
pre{background:#1e293b;color:#e2e8f0;padding:18px;border-radius:10px;overflow-x:auto;font-size:0.82rem;line-height:1.7;margin:14px 0}
code{font-family:ui-monospace,Menlo,monospace}
p code,li code{background:var(--surface);padding:2px 6px;border-radius:5px;font-size:0.85em;color:var(--primary-dark)}
.post-meta{color:var(--text-muted);font-size:0.85rem;margin-bottom:24px}
.cta{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:24px;margin:28px 0;text-align:center}
.cta a.btn{display:inline-block;padding:10px 24px;background:var(--primary);color:#fff;border-radius:8px;font-weight:600}
.post-list{list-style:none;margin:0;padding:0}
.post-list li{margin:0 0 8px}
.post-card{display:block;border:1px solid var(--border);border-radius:var(--radius);padding:20px 22px;margin-bottom:14px}
.post-card:hover{border-color:var(--primary);text-decoration:none}
.post-card h2{border:none;padding:0;margin:0 0 6px;font-size:1.15rem;color:var(--text)}
.post-card p{margin:0;color:var(--text-soft);font-size:0.9rem}
.post-card .date{color:var(--text-muted);font-size:0.8rem}
footer{background:#0f172a;color:#94a3b8;padding:28px 0;text-align:center;font-size:0.8rem}
footer a{color:#94a3b8}</style></head><body>
<nav class="nav"><div class="container"><a href="/" class="nav-logo">Fun<span>ASR</span></a><div class="nav-links"><a href="/#capabilities">核心能力</a><a href="/#usage">如何使用</a><a href="/#benchmark">性能</a><a href="/#demo">演示</a><a href="https://modelscope.github.io/FunASR/zh/" target="_blank">文档</a><a href="/quickstart.html">快速上手</a><a href="/models.html">模型</a><a href="/ecosystem.html">生态</a><a href="/blog/">技术博客</a><a href="/vs-whisper.html">对比 Whisper</a><a href="/donors.html">功德榜</a></div><a href="https://www.funasr.com/en/blog/funasr-transcribe-long-audio.html" style="font-size:0.83rem;font-weight:600;color:var(--text-soft)">EN</a><a href="https://github.com/modelscope/FunASR" target="_blank" class="nav-btn">GitHub ★</a></div></nav>
<article><div class="container">
<h1>用 FunASR 转写超长音频:1 小时录音也能一次搞定</h1>
<p class="post-meta">FunASR 技术博客 · 2026-06-17 · 教程</p>
<p>转写一段 1 小时的播客、讲座或会议录音,用 Whisper 会很痛苦:它一次只处理 <strong>30 秒</strong>,你得自己把音频切片、逐片识别、再把结果拼起来,还要处理切片边界把词切断的问题。</p>
<p><strong>FunASR 不用这么麻烦。</strong>它内置 VAD(语音端点检测),一次 <code>generate()</code> 调用就能吃下<strong>任意时长</strong>的音频——自动切句、批量解码、拼回完整文本,你一行切片代码都不用写。</p>
<h2>安装</h2>
<pre><code>pip install -U funasr modelscope</code></pre>
<h2>完整代码(可直接运行)</h2>
<pre><code>from funasr import AutoModel
model = AutoModel(
model="iic/SenseVoiceSmall", # or "paraformer-zh"
vad_model="fsmn-vad", # built-in voice activity detection
vad_kwargs={"max_single_segment_time": 30000},
)
# One call on a full 1-hour file - VAD segments and batches it internally.
res = model.generate(
input="podcast_1hour.wav",
batch_size_s=300, # dynamic batching of VAD segments (throughput)
)
print(res[0]["text"])</code></pre>
<h2>实测:13 分钟音频 4.3 秒转完</h2>
<pre><code>long clip: 791s = 13.2 min
transcribed 791s in 4.3s -> RTFx=186
output chars: 2104 # full transcript, head to tail</code></pre>
<p>我们把一段 <strong>13.2 分钟(791 秒)</strong>的录音丢进单次 <code>generate()</code>,<strong>4.3 秒</strong>就转写完毕(<strong>186x 实时</strong>),输出完整覆盖从开头到结尾。换成 1 小时的文件,做法完全一样——不用改一行代码。</p>
<h2>为什么能处理任意时长</h2>
<ul>
<li><strong>VAD 自动切句</strong>:<code>fsmn-vad</code> 先把长音频按停顿切成一句句语音段,<code>max_single_segment_time</code> 控制单段最长时长。</li>
<li><strong>动态批处理</strong>:<code>batch_size_s=300</code> 把多段语音按总时长打包成批,一次性高吞吐解码。</li>
<li><strong>内存可控</strong>:因为是分段处理,显存占用<strong>与文件总长无关</strong>,1 小时和 1 分钟占用相近。</li>
</ul>
<h2>进阶</h2>
<ul>
<li>加 <code>punc_model="ct-punc"</code> 自动补标点;</li>
<li>加 <code>spk_model="cam++"</code> 得到<a href="/blog/funasr-speaker-diarization.html">说话人分离</a>(谁在什么时候说);</li>
<li>用 <code>SenseVoiceSmall</code> 可同时拿到<a href="/blog/sensevoice-emotion-language-detection.html">语种与情感</a>;追求最快可看 <a href="/blog/funasr-vs-whisper-benchmark.html">速度对比</a>。</li>
</ul>
<h2>典型场景</h2>
<ul>
<li><strong>播客 / 有声书</strong>:整集一次转写、生成文稿。</li>
<li><strong>会议 / 讲座 / 庭审</strong>:长录音批量转文字 + 存档检索。</li>
<li><strong>客服通话</strong>:整通录音转写做质检与挖掘。</li>
</ul>
<div class="cta"><p>FunASR 是通义实验室开源的工业级语音识别工具包,长音频、流式、多语种全覆盖。</p><a class="btn" href="https://github.com/modelscope/FunASR" target="_blank">在 GitHub 上 Star FunASR ★</a></div>
<!--related-posts-->
<h2>相关文章</h2>
<ul class="post-list">
<li><a href="/blog/funasr-vs-whisper-benchmark.html">FunASR vs Whisper 实测对比</a></li>
<li><a href="/blog/sensevoice-deployment-guide.html">SenseVoice 部署指南</a></li>
<li><a href="/blog/fun-asr-nano-guide.html">Fun-ASR-Nano 使用指南</a></li>
<li><a href="/blog/funasr-speaker-diarization.html">说话人分离:谁在何时说话</a></li>
<li><a href="/blog/sensevoice-emotion-language-detection.html">情感与语种检测</a></li>
<li><a href="/blog/funasr-realtime-streaming-asr.html">实时流式语音识别</a></li>
<li><a href="/blog/funasr-cli-transcribe-command-line.html">命令行转写(文本/JSON/SRT)</a></li>
<li><a href="/blog/self-hosted-openai-whisper-api-alternative.html">自托管 OpenAI Whisper API 替代</a></li>
<li><a href="/blog/generate-subtitles-srt-vtt-from-audio-video.html">自动生成字幕(SRT / VTT)</a></li>
<li><a href="/blog/speech-to-text-python-transcribe-audio.html">Python 语音转文字教程</a></li>
<li><a href="/blog/funasr-llama-cpp-whisper-cpp-alternative.html">FunASR 跑进 llama.cpp(whisper.cpp 替代)</a></li>
<li><a href="/blog/funasr-vs-faster-whisper-chinese.html">FunASR vs faster-whisper(中文/粤语)</a></li>
<li><a href="/blog/lightweight-speech-recognition-cpu.html">轻量语音识别(CPU 250MB)</a></li>
<li><a href="/blog/self-hosted-deepgram-assemblyai-alternative.html">自托管替代 Deepgram/AssemblyAI</a></li>
<li><a href="/blog/which-funasr-model.html">选哪个 FunASR 模型</a></li>
<li><a href="/blog/cantonese-speech-recognition.html">粤语语音识别(SenseVoice 原生粤语)</a></li>
<li><a href="/blog/japanese-speech-recognition.html">日语语音识别(SenseVoice 转写+标点+情感)</a></li>
<li><a href="/blog/voice-activity-detection-python.html">Python 语音活动检测(VAD)</a></li>
<li><a href="/blog/self-hosted-google-aws-azure-speech-to-text.html">自托管替代 Google/AWS/Azure 云语音 API</a></li>
<li><a href="/blog/chinese-speech-recognition.html">中文语音识别(普通话)实战</a></li>
<li><a href="/blog/punctuation-restoration-python.html">标点恢复 Python 实战</a></li>
<li><a href="/blog/speech-to-text-timestamps-python.html">语音识别带时间戳(字级)</a></li>
</ul>
</div></article>
<footer><div class="container">FunASR · 通义实验室开源语音识别 · <a href="https://github.com/modelscope/FunASR">GitHub</a></div></footer>
</body></html>
@@ -0,0 +1,121 @@
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>FunASR v1.3.26:OpenAI 兼容 API、vLLM 与 llama.cpp 部署 | FunASR</title>
<meta name="description" content="FunASR v1.3.26 发布指南:用 OpenAI 兼容 /v1/audio/transcriptions 接口、vLLM 高吞吐推理或 llama.cpp/GGUF 自包含运行时部署本地语音识别。">
<meta name="keywords" content="FunASR v1.3.26,OpenAI compatible ASR,vLLM speech recognition,llama.cpp ASR,GGUF,自托管语音识别">
<link rel="icon" href="/logo.png">
<meta property="og:title" content="FunASR v1.3.26:OpenAI 兼容 API、vLLM 与 llama.cpp 部署">
<meta property="og:description" content="三个可运行入口覆盖 OpenAI 兼容服务、GPU 高吞吐和无 Python 边缘部署。">
<meta property="og:type" content="article">
<meta property="og:url" content="https://www.funasr.com/blog/funasr-v1-3-26-openai-vllm-llama-cpp.html">
<meta property="og:image" content="https://www.funasr.com/img/banner.4f436d19.png">
<link rel="canonical" href="https://www.funasr.com/blog/funasr-v1-3-26-openai-vllm-llama-cpp.html">
<link rel="alternate" hreflang="en" href="https://www.funasr.com/en/blog/funasr-v1-3-26-openai-vllm-llama-cpp.html">
<link rel="alternate" hreflang="zh" href="https://www.funasr.com/blog/funasr-v1-3-26-openai-vllm-llama-cpp.html">
<link rel="alternate" hreflang="x-default" href="https://www.funasr.com/en/blog/funasr-v1-3-26-openai-vllm-llama-cpp.html">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&amp;display=swap" rel="stylesheet">
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"BlogPosting","headline":"FunASR v1.3.26:OpenAI 兼容 API、vLLM 与 llama.cpp 部署","description":"三个可运行入口覆盖 OpenAI 兼容服务、GPU 高吞吐和无 Python 边缘部署。","datePublished":"2026-07-23","dateModified":"2026-07-23","author":{"@type":"Organization","name":"FunASR / Tongyi Lab"},"publisher":{"@type":"Organization","name":"FunASR","logo":{"@type":"ImageObject","url":"https://www.funasr.com/logo.png"}},"mainEntityOfPage":{"@type":"WebPage","@id":"https://www.funasr.com/blog/funasr-v1-3-26-openai-vllm-llama-cpp.html"},"image":"https://www.funasr.com/img/banner.4f436d19.png"}
</script>
<style>
:root{--primary:#2563eb;--primary-dark:#1d4ed8;--accent:#047857;--bg:#fff;--surface:#f8fafc;--border:#e2e8f0;--text:#0f172a;--text-soft:#475569;--text-muted:#94a3b8}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:'Inter',-apple-system,sans-serif;color:var(--text);line-height:1.7;background:var(--bg)}
a{color:var(--primary);text-decoration:none}a:hover{text-decoration:underline}
.container{max-width:800px;margin:0 auto;padding:0 24px}
.nav{position:fixed;top:0;left:0;right:0;z-index:100;background:rgba(255,255,255,0.94);backdrop-filter:blur(12px);border-bottom:1px solid var(--border);padding:14px 0}
.nav .container{max-width:1120px;display:flex;align-items:center;gap:24px}
.nav-logo{font-size:1.2rem;font-weight:800;color:var(--text)}.nav-logo span{color:var(--primary)}
.nav-links{display:flex;gap:20px;margin-left:auto;flex-wrap:wrap}.nav-links a{font-size:.85rem;font-weight:500;color:var(--text-soft)}
.nav-btn{padding:7px 16px;background:var(--primary);color:#fff;border-radius:7px;font-size:.83rem;font-weight:600}
article{padding:116px 0 80px}
h1{font-size:2rem;font-weight:800;line-height:1.3;margin-bottom:14px}
h2{font-size:1.3rem;font-weight:700;margin:38px 0 14px;padding-top:18px;border-top:1px solid var(--border)}
h3{font-size:1.05rem;font-weight:700;margin:24px 0 10px}
p{margin-bottom:14px;color:var(--text-soft)}
ul{margin:0 0 16px 22px;color:var(--text-soft)}li{margin-bottom:7px}
table{width:100%;border-collapse:collapse;margin:18px 0;font-size:.88rem}
th,td{padding:11px 12px;text-align:left;vertical-align:top;border-bottom:1px solid var(--border)}th{font-weight:600;background:var(--surface);color:var(--text)}
pre{background:#172033;color:#e2e8f0;padding:18px;border-radius:8px;overflow-x:auto;font-size:.82rem;line-height:1.7;margin:14px 0}
code{font-family:ui-monospace,Menlo,monospace}p code,li code,td code{background:var(--surface);padding:2px 6px;border-radius:5px;font-size:.85em;color:var(--primary-dark)}
.post-meta{color:var(--text-muted);font-size:.85rem;margin-bottom:22px}
.lead{font-size:1.05rem;color:var(--text);margin:22px 0}
.hero-media{display:block;width:100%;aspect-ratio:2.04/1;object-fit:cover;border-radius:8px;border:1px solid var(--border);margin:0 0 24px}
.proof{border-left:4px solid var(--accent);background:#f0fdf4;padding:14px 16px;margin:18px 0;color:#14532d}
.cta{background:var(--surface);border:1px solid var(--border);border-radius:8px;padding:24px;margin:30px 0;text-align:center}.cta p{margin-bottom:16px}.cta a.btn{display:inline-block;padding:10px 22px;background:var(--primary);color:#fff;border-radius:7px;font-weight:600}
footer{background:#0f172a;color:#94a3b8;padding:28px 0;text-align:center;font-size:.8rem}footer a{color:#94a3b8}
@media(max-width:900px){.nav-links{display:none}.nav .container{gap:16px}.nav-logo{margin-right:auto}h1{font-size:1.65rem}table{font-size:.8rem}th,td{padding:9px 8px}}
</style>
</head>
<body>
<nav class="nav"><div class="container"><a href="/" class="nav-logo">Fun<span>ASR</span></a><div class="nav-links"><a href="/#capabilities">核心能力</a><a href="/#usage">如何使用</a><a href="/#benchmark">性能</a><a href="/#demo">演示</a><a href="https://modelscope.github.io/FunASR/zh/" target="_blank">文档</a><a href="/quickstart.html">快速上手</a><a href="/models.html">模型</a><a href="/ecosystem.html">生态</a><a href="/blog/">技术博客</a><a href="/vs-whisper.html">对比 Whisper</a><a href="/donors.html">功德榜</a></div><a href="/en/blog/funasr-v1-3-26-openai-vllm-llama-cpp.html" style="font-size:.83rem;font-weight:500;color:var(--text-soft)">EN</a><a href="https://github.com/modelscope/FunASR" target="_blank" rel="noopener" class="nav-btn">GitHub ★</a></div></nav>
<article><div class="container">
<h1>FunASR v1.3.26:OpenAI 兼容 API、vLLM 与 llama.cpp 部署</h1>
<p class="post-meta">2026-07-23 · FunASR 发布指南</p>
<img class="hero-media" src="/img/banner.4f436d19.png" alt="FunASR 工业级语音识别视觉图">
<p class="lead">FunASR v1.3.26 把同一套开源语音识别能力整理成三个清晰入口:Python 与 OpenAI 兼容 API、面向 GPU 批量吞吐的 vLLM,以及无需 Python 的 llama.cpp / GGUF 运行时。</p>
<p>这不是只有一个 wheel 的发布。Python 包、服务示例、GPU 推理指南和八个平台运行时资产分别面向不同部署场景,并通过同一个 FunASR 生态互相衔接。</p>
<h2>先选最适合你的入口</h2>
<table>
<thead><tr><th>目标</th><th>推荐入口</th><th>开始位置</th></tr></thead>
<tbody>
<tr><td>接入现有 OpenAI SDK、Agent 或工作流</td><td><code>/v1/audio/transcriptions</code></td><td><a href="https://github.com/modelscope/FunASR/tree/main/examples/openai_api" target="_blank" rel="noopener">OpenAI 兼容 API 示例</a></td></tr>
<tr><td>GPU 批量转写与高吞吐服务</td><td>Fun-ASR-Nano + vLLM</td><td><a href="https://github.com/modelscope/FunASR/blob/main/docs/vllm_guide_zh.md" target="_blank" rel="noopener">vLLM 中文指南</a></td></tr>
<tr><td>CPU、边缘设备或零 Python 部署</td><td>llama.cpp / GGUF</td><td><a href="https://github.com/modelscope/FunASR/releases/tag/runtime-llamacpp-v0.1.9" target="_blank" rel="noopener">v0.1.9 运行时资产</a></td></tr>
</tbody>
</table>
<h2>1. 启动 OpenAI 兼容转写服务</h2>
<p>下面的路径与仓库 smoke test 使用同一套服务实现。先固定当前 PyPI 版本,再启动服务:</p>
<pre><code>git clone https://github.com/modelscope/FunASR.git
cd FunASR/examples/openai_api
python -m pip install "funasr==1.3.26" fastapi uvicorn python-multipart
python server.py --model sensevoice --device cuda --port 8000</code></pre>
<p>另开一个终端,用公开样例验证健康检查和转写:</p>
<pre><code>curl -L https://isv-data.oss-cn-hangzhou.aliyuncs.com/ics/MaaS/ASR/test_audio/BAC009S0764W0121.wav -o sample.wav
curl http://localhost:8000/health
curl http://localhost:8000/v1/audio/transcriptions \
-F [email protected] \
-F model=sensevoice \
-F response_format=verbose_json</code></pre>
<p>已有 OpenAI Python 客户端时,只需把 <code>base_url</code> 指向 <code>http://localhost:8000/v1</code>。接口还提供模型列表、Swagger 文档、Postman、OpenAPI、Gradio 和 Kubernetes 示例。</p>
<h2>2. 用 vLLM 放大 Fun-ASR-Nano 吞吐</h2>
<p>Fun-ASR-Nano 的音频编码器与 adaptor 在 PyTorch 中生成连续音频 embedding,再交给 vLLM 的 Qwen3 解码部分。仓库基准记录 vLLM batch 达到 <strong>RTFx 340</strong>,并保留与 PyTorch 基线接近的 CER。</p>
<div class="proof">维护环境已在单张 H100 上完成真实 checkpoint 验证:vLLM 0.19.1 成功加载,样例音频完成转写并输出 token 时间戳。完整安装、显存、批处理、WebSocket 与服务参数都在 vLLM 指南中。</div>
<pre><code>python -m pip install "vllm==0.19.1"
python -m pip install "funasr&gt;=1.3.26" safetensors tiktoken websockets
# 按 docs/vllm_guide_zh.md 选择离线、流式或服务入口</code></pre>
<h2>3. 下载 llama.cpp / GGUF 自包含运行时</h2>
<p><a href="https://github.com/modelscope/FunASR/releases/tag/runtime-llamacpp-v0.1.9" target="_blank" rel="noopener">runtime-llamacpp-v0.1.9</a> 同时提供 Linux x64/ARM64、macOS ARM64 和 Windows x64 包,其中 Linux 支持 AVX2/Vulkan,Windows 支持 AVX2/Vulkan/CUDA,并提供 <code>funasr-llamacpp-windows-x64-vulkan.zip</code>。每个压缩包都带自包含的 <code>llama-funasr-*</code> 二进制入口。</p>
<ul>
<li>不想维护 Python 环境:选标准 CPU 包。</li>
<li>桌面 GPU:按平台选择 Vulkan 或 CUDA 包。</li>
<li>边缘设备与 Apple Silicon:选择 ARM64 包。</li>
</ul>
<p>模型、命令与硬件选择见<a href="/llama-cpp.html"> llama.cpp / GGUF 专页</a>,发布资产和模型版本保持对应,避免用户在多个 release 中寻找文件。</p>
<h2>四个仓库分别解决什么</h2>
<table>
<thead><tr><th>仓库</th><th>适合关注的内容</th></tr></thead>
<tbody>
<tr><td><a href="https://github.com/modelscope/FunASR" target="_blank" rel="noopener">FunASR</a></td><td>工具包、服务、OpenAI API、vLLM、llama.cpp 与部署文档</td></tr>
<tr><td><a href="https://github.com/QwenAudio/Fun-ASR" target="_blank" rel="noopener">Fun-ASR</a></td><td>Fun-ASR-Nano / MLT 模型、能力、评测和模型级集成</td></tr>
<tr><td><a href="https://github.com/QwenAudio/SenseVoice" target="_blank" rel="noopener">SenseVoice</a></td><td>多语言 ASR、情感、语言和音频事件识别</td></tr>
<tr><td><a href="https://github.com/modelscope/FunClip" target="_blank" rel="noopener">FunClip</a></td><td>由语音识别驱动的视频理解、检索与剪辑</td></tr>
</tbody>
</table>
<div class="cta">
<p>从最适合你的入口跑通一个真实音频。遇到问题可在 GitHub 提交可复现 issue;如果项目对你有用,也欢迎 Star 你实际使用的仓库。</p>
<a class="btn" href="https://github.com/modelscope/FunASR/releases/tag/v1.3.26" target="_blank" rel="noopener">查看 v1.3.26 发布说明</a>
</div>
</div></article>
<footer><div class="container">© 2024-2026 Tongyi Lab, Alibaba Group · <a href="https://github.com/modelscope/FunASR/blob/main/LICENSE">MIT License</a></div></footer>
</body>
</html>
@@ -0,0 +1,124 @@
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>FunASR v1.3.27:语种检测与可靠的 vLLM fallback | FunASR</title>
<meta name="description" content="FunASR v1.3.27 修复 OpenAI 兼容服务的 SenseVoice 语种元数据、Fun-ASR-Nano vLLM fallback 重复加载和服务版本展示,并提供 PyPI、wheel、源码包及九个平台运行时入口。">
<meta name="keywords" content="FunASR v1.3.27,SenseVoice language detection,OpenAI compatible ASR,vLLM fallback,llama.cpp ASR,GGUF,自托管语音识别">
<link rel="icon" href="/logo.png">
<meta property="og:title" content="FunASR v1.3.27:语种检测与可靠的 vLLM fallback">
<meta property="og:description" content="OpenAI 兼容服务返回真实语种,Nano fallback 只加载一次,并继续提供九个平台的 llama.cpp 运行时。">
<meta property="og:type" content="article">
<meta property="og:url" content="https://www.funasr.com/blog/funasr-v1-3-27-language-metadata-vllm-fallback.html">
<meta property="og:image" content="https://www.funasr.com/img/banner.4f436d19.png">
<link rel="canonical" href="https://www.funasr.com/blog/funasr-v1-3-27-language-metadata-vllm-fallback.html">
<link rel="alternate" hreflang="en" href="https://www.funasr.com/en/blog/funasr-v1-3-27-language-metadata-vllm-fallback.html">
<link rel="alternate" hreflang="zh" href="https://www.funasr.com/blog/funasr-v1-3-27-language-metadata-vllm-fallback.html">
<link rel="alternate" hreflang="x-default" href="https://www.funasr.com/en/blog/funasr-v1-3-27-language-metadata-vllm-fallback.html">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&amp;display=swap" rel="stylesheet">
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"BlogPosting","headline":"FunASR v1.3.27:语种检测与可靠的 vLLM fallback","description":"OpenAI 兼容服务返回真实语种,Nano fallback 只加载一次,并继续提供九个平台的 llama.cpp 运行时。","datePublished":"2026-07-24","dateModified":"2026-07-24","author":{"@type":"Organization","name":"FunASR / Tongyi Lab"},"publisher":{"@type":"Organization","name":"FunASR","logo":{"@type":"ImageObject","url":"https://www.funasr.com/logo.png"}},"mainEntityOfPage":{"@type":"WebPage","@id":"https://www.funasr.com/blog/funasr-v1-3-27-language-metadata-vllm-fallback.html"},"image":"https://www.funasr.com/img/banner.4f436d19.png"}
</script>
<style>
:root{--primary:#2563eb;--primary-dark:#1d4ed8;--accent:#047857;--bg:#fff;--surface:#f8fafc;--border:#e2e8f0;--text:#0f172a;--text-soft:#475569;--text-muted:#94a3b8}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:'Inter',-apple-system,sans-serif;color:var(--text);line-height:1.7;background:var(--bg)}
a{color:var(--primary);text-decoration:none}a:hover{text-decoration:underline}
.container{max-width:800px;margin:0 auto;padding:0 24px}
.nav{position:fixed;top:0;left:0;right:0;z-index:100;background:rgba(255,255,255,0.94);backdrop-filter:blur(12px);border-bottom:1px solid var(--border);padding:14px 0}
.nav .container{max-width:1120px;display:flex;align-items:center;gap:24px}
.nav-logo{font-size:1.2rem;font-weight:800;color:var(--text)}.nav-logo span{color:var(--primary)}
.nav-links{display:flex;gap:20px;margin-left:auto;flex-wrap:wrap}.nav-links a{font-size:.85rem;font-weight:500;color:var(--text-soft)}
.nav-btn{padding:7px 16px;background:var(--primary);color:#fff;border-radius:7px;font-size:.83rem;font-weight:600}
article{padding:116px 0 80px}
h1{font-size:2rem;font-weight:800;line-height:1.3;margin-bottom:14px}
h2{font-size:1.3rem;font-weight:700;margin:38px 0 14px;padding-top:18px;border-top:1px solid var(--border)}
h3{font-size:1.05rem;font-weight:700;margin:24px 0 10px}
p{margin-bottom:14px;color:var(--text-soft)}
ul{margin:0 0 16px 22px;color:var(--text-soft)}li{margin-bottom:7px}
table{width:100%;border-collapse:collapse;margin:18px 0;font-size:.88rem}
th,td{padding:11px 12px;text-align:left;vertical-align:top;border-bottom:1px solid var(--border)}th{font-weight:600;background:var(--surface);color:var(--text)}
pre{background:#172033;color:#e2e8f0;padding:18px;border-radius:8px;overflow-x:auto;font-size:.82rem;line-height:1.7;margin:14px 0}
code{font-family:ui-monospace,Menlo,monospace}p code,li code,td code{background:var(--surface);padding:2px 6px;border-radius:5px;font-size:.85em;color:var(--primary-dark)}
.post-meta{color:var(--text-muted);font-size:.85rem;margin-bottom:22px}
.lead{font-size:1.05rem;color:var(--text);margin:22px 0}
.hero-media{display:block;width:100%;aspect-ratio:2.04/1;object-fit:cover;border-radius:8px;border:1px solid var(--border);margin:0 0 24px}
.proof{border-left:4px solid var(--accent);background:#f0fdf4;padding:14px 16px;margin:18px 0;color:#14532d}
.cta{background:var(--surface);border:1px solid var(--border);border-radius:8px;padding:24px;margin:30px 0;text-align:center}.cta p{margin-bottom:16px}.cta a.btn{display:inline-block;padding:10px 22px;background:var(--primary);color:#fff;border-radius:7px;font-weight:600}
footer{background:#0f172a;color:#94a3b8;padding:28px 0;text-align:center;font-size:.8rem}footer a{color:#94a3b8}
@media(max-width:900px){.nav-links{display:none}.nav .container{gap:16px}.nav-logo{margin-right:auto}h1{font-size:1.65rem}table{font-size:.8rem}th,td{padding:9px 8px}}
</style>
</head>
<body>
<nav class="nav"><div class="container"><a href="/" class="nav-logo">Fun<span>ASR</span></a><div class="nav-links"><a href="/#capabilities">核心能力</a><a href="/#usage">如何使用</a><a href="/#benchmark">性能</a><a href="/#demo">演示</a><a href="https://modelscope.github.io/FunASR/zh/" target="_blank">文档</a><a href="/quickstart.html">快速上手</a><a href="/models.html">模型</a><a href="/ecosystem.html">生态</a><a href="/blog/">技术博客</a><a href="/vs-whisper.html">对比 Whisper</a><a href="/donors.html">功德榜</a></div><a href="/en/blog/funasr-v1-3-27-language-metadata-vllm-fallback.html" style="font-size:.83rem;font-weight:500;color:var(--text-soft)">EN</a><a href="https://github.com/modelscope/FunASR" target="_blank" rel="noopener" class="nav-btn">GitHub ★</a></div></nav>
<article><div class="container">
<h1>FunASR v1.3.27:语种检测与可靠的 vLLM fallback</h1>
<p class="post-meta">2026-07-24 · FunASR 每周发布</p>
<img class="hero-media" src="/img/banner.4f436d19.png?v=1.3.27" alt="FunASR 工业级语音识别视觉图">
<p class="lead">FunASR v1.3.27 聚焦 OpenAI 兼容服务的正确性与可靠性:SenseVoice 返回真实检测语种,Fun-ASR-Nano 在 vLLM 降级后复用已加载的 fallback,服务版本也始终与安装包一致。</p>
<p>Python wheel 与源码包已经同步发布;同一个发布页还列出九个平台的 llama.cpp / GGUF 自包含运行时,用户不需要在多个 release 之间寻找下载文件。</p>
<h2>这次修复了什么</h2>
<table>
<thead><tr><th>场景</th><th>v1.3.27 行为</th><th>用户收益</th></tr></thead>
<tbody>
<tr><td>SenseVoice 自动语种识别</td><td><code>verbose_json.language</code> 返回检测到的 <code>zh/en/yue/ja/ko</code></td><td>下游字幕、路由和分析不再收到错误的默认中文</td></tr>
<tr><td>Fun-ASR-Nano vLLM 不可用</td><td>进程复用已缓存的 <code>AutoModel</code> fallback</td><td>后续请求不再反复创建同一个模型</td></tr>
<tr><td>vLLM/VAD 与 fallback 同时失败</td><td>清理半初始化状态,保留后续重试能力</td><td>暂时性初始化失败不会把服务卡在假加载状态</td></tr>
<tr><td>版本排障</td><td>OpenAPI 与启动横幅读取包内版本</td><td>日志和 <code>/docs</code> 都准确显示 <code>1.3.27</code></td></tr>
</tbody>
</table>
<h2>1. 启动 OpenAI 兼容转写服务</h2>
<p>下面的路径与仓库 smoke test 使用同一套服务实现。先固定当前 PyPI 版本,再启动服务:</p>
<pre><code>git clone https://github.com/modelscope/FunASR.git
cd FunASR/examples/openai_api
python -m pip install "funasr==1.3.27" fastapi uvicorn python-multipart
python server.py --model sensevoice --device cuda --port 8000</code></pre>
<p>另开一个终端,用公开样例验证健康检查和转写:</p>
<pre><code>curl -L https://isv-data.oss-cn-hangzhou.aliyuncs.com/ics/MaaS/ASR/test_audio/BAC009S0764W0121.wav -o sample.wav
curl http://localhost:8000/health
curl http://localhost:8000/v1/audio/transcriptions \
-F [email protected] \
-F model=sensevoice \
-F response_format=verbose_json</code></pre>
<p>SenseVoice 会保留原始语种标签并写入 OpenAI 兼容响应,例如英文音频返回:</p>
<pre><code>{"task":"transcribe","language":"en","duration":4.6,"text":"hello", "segments":[...]}</code></pre>
<p>已有 OpenAI Python 客户端时,只需把 <code>base_url</code> 指向 <code>http://localhost:8000/v1</code>。接口还提供模型列表、Swagger 文档、Postman、OpenAPI、Gradio 和 Kubernetes 示例。</p>
<h2>2. 用 vLLM 放大 Fun-ASR-Nano 吞吐</h2>
<p>Fun-ASR-Nano 的音频编码器与 adaptor 在 PyTorch 中生成连续音频 embedding,再交给 vLLM 的 Qwen3 解码部分。仓库基准记录 vLLM batch 达到 <strong>RTFx 340</strong>,并保留与 PyTorch 基线接近的 CER。</p>
<div class="proof">维护环境已在单张 H100 上完成真实 checkpoint 验证:vLLM 0.19.1 成功加载,样例音频完成转写并输出 token 时间戳。完整安装、显存、批处理、WebSocket 与服务参数都在 vLLM 指南中。</div>
<pre><code>python -m pip install "vllm==0.19.1"
python -m pip install "funasr&gt;=1.3.27" safetensors tiktoken websockets
# 按 docs/vllm_guide_zh.md 选择离线、流式或服务入口</code></pre>
<h2>3. 下载 llama.cpp / GGUF 自包含运行时</h2>
<p><a href="https://github.com/modelscope/FunASR/releases/tag/runtime-llamacpp-v0.1.9" target="_blank" rel="noopener">runtime-llamacpp-v0.1.9</a> 同时提供九个 Linux x64/ARM64、macOS ARM64 和 Windows x64 包,其中 Linux 支持 AVX2/Vulkan,Windows 支持 AVX2/Vulkan/CUDA,并提供 <code>funasr-llamacpp-windows-x64-vulkan.zip</code>。每个压缩包都带自包含的 <code>llama-funasr-*</code> 二进制入口。</p>
<ul>
<li>不想维护 Python 环境:选标准 CPU 包。</li>
<li>桌面 GPU:按平台选择 Vulkan 或 CUDA 包。</li>
<li>边缘设备与 Apple Silicon:选择 ARM64 包。</li>
</ul>
<p>模型、命令与硬件选择见<a href="/llama-cpp.html"> llama.cpp / GGUF 专页</a>,发布资产和模型版本保持对应,避免用户在多个 release 中寻找文件。</p>
<h2>四个仓库分别解决什么</h2>
<table>
<thead><tr><th>仓库</th><th>适合关注的内容</th></tr></thead>
<tbody>
<tr><td><a href="https://github.com/modelscope/FunASR" target="_blank" rel="noopener">FunASR</a></td><td>工具包、服务、OpenAI API、vLLM、llama.cpp 与部署文档</td></tr>
<tr><td><a href="https://github.com/QwenAudio/Fun-ASR" target="_blank" rel="noopener">Fun-ASR</a></td><td>Fun-ASR-Nano / MLT 模型、能力、评测和模型级集成</td></tr>
<tr><td><a href="https://github.com/QwenAudio/SenseVoice" target="_blank" rel="noopener">SenseVoice</a></td><td>多语言 ASR、情感、语言和音频事件识别</td></tr>
<tr><td><a href="https://github.com/modelscope/FunClip" target="_blank" rel="noopener">FunClip</a></td><td>由语音识别驱动的视频理解、检索与剪辑</td></tr>
</tbody>
</table>
<div class="cta">
<p>从最适合你的入口跑通一个真实音频。遇到问题可在 GitHub 提交可复现 issue;如果项目对你有用,也欢迎 Star 你实际使用的仓库。</p>
<a class="btn" href="https://github.com/modelscope/FunASR/releases/tag/v1.3.27" target="_blank" rel="noopener">查看 v1.3.27 发布与下载</a>
</div>
</div></article>
<footer><div class="container">© 2024-2026 Tongyi Lab, Alibaba Group · <a href="https://github.com/modelscope/FunASR/blob/main/LICENSE">MIT License</a></div></footer>
</body>
</html>
@@ -0,0 +1,113 @@
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>FunASR v1.3.28:实时识别可靠性与字幕对齐修复 | FunASR</title>
<meta name="description" content="FunASR v1.3.28 修复实时 WebSocket 收尾、STOP 与断线异常处理,并改进 SenseVoice 字幕文本和时间戳对齐;发布页同时提供 wheel、源码包和九个平台运行时。">
<meta name="keywords" content="FunASR v1.3.28,实时语音识别,WebSocket ASR,SenseVoice 字幕,时间戳,llama.cpp ASR,GGUF,自托管语音识别">
<link rel="icon" href="/logo.png">
<meta property="og:title" content="FunASR v1.3.28:实时识别可靠性与字幕对齐修复">
<meta property="og:description" content="连续完整的实时终稿、可靠的 STOP 收尾、对齐的 SenseVoice 字幕,以及 11 个发布资产。">
<meta property="og:type" content="article">
<meta property="og:url" content="https://www.funasr.com/blog/funasr-v1-3-28-realtime-websocket-subtitles.html">
<meta property="og:image" content="https://www.funasr.com/img/banner.4f436d19.png">
<link rel="canonical" href="https://www.funasr.com/blog/funasr-v1-3-28-realtime-websocket-subtitles.html">
<link rel="alternate" hreflang="en" href="https://www.funasr.com/en/blog/funasr-v1-3-28-realtime-websocket-subtitles.html">
<link rel="alternate" hreflang="zh" href="https://www.funasr.com/blog/funasr-v1-3-28-realtime-websocket-subtitles.html">
<link rel="alternate" hreflang="x-default" href="https://www.funasr.com/en/blog/funasr-v1-3-28-realtime-websocket-subtitles.html">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&amp;display=swap" rel="stylesheet">
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"BlogPosting","headline":"FunASR v1.3.28:实时识别可靠性与字幕对齐修复","description":"连续完整的实时终稿、可靠的 STOP 收尾、对齐的 SenseVoice 字幕,以及 11 个发布资产。","datePublished":"2026-07-24","dateModified":"2026-07-24","author":{"@type":"Organization","name":"FunASR / Tongyi Lab"},"publisher":{"@type":"Organization","name":"FunASR","logo":{"@type":"ImageObject","url":"https://www.funasr.com/logo.png"}},"mainEntityOfPage":{"@type":"WebPage","@id":"https://www.funasr.com/blog/funasr-v1-3-28-realtime-websocket-subtitles.html"},"image":"https://www.funasr.com/img/banner.4f436d19.png"}
</script>
<style>
:root{--primary:#2563eb;--primary-dark:#1d4ed8;--accent:#047857;--bg:#fff;--surface:#f8fafc;--border:#e2e8f0;--text:#0f172a;--text-soft:#475569;--text-muted:#94a3b8}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:'Inter',-apple-system,sans-serif;color:var(--text);line-height:1.7;background:var(--bg)}
a{color:var(--primary);text-decoration:none}a:hover{text-decoration:underline}
.container{max-width:800px;margin:0 auto;padding:0 24px}
.nav{position:fixed;top:0;left:0;right:0;z-index:100;background:rgba(255,255,255,0.94);backdrop-filter:blur(12px);border-bottom:1px solid var(--border);padding:14px 0}
.nav .container{max-width:1120px;display:flex;align-items:center;gap:24px}
.nav-logo{font-size:1.2rem;font-weight:800;color:var(--text)}.nav-logo span{color:var(--primary)}
.nav-links{display:flex;gap:20px;margin-left:auto;flex-wrap:wrap}.nav-links a{font-size:.85rem;font-weight:500;color:var(--text-soft)}
.nav-btn{padding:7px 16px;background:var(--primary);color:#fff;border-radius:7px;font-size:.83rem;font-weight:600}
article{padding:116px 0 80px}
h1{font-size:2rem;font-weight:800;line-height:1.3;margin-bottom:14px}
h2{font-size:1.3rem;font-weight:700;margin:38px 0 14px;padding-top:18px;border-top:1px solid var(--border)}
h3{font-size:1.05rem;font-weight:700;margin:24px 0 10px}
p{margin-bottom:14px;color:var(--text-soft)}
ul{margin:0 0 16px 22px;color:var(--text-soft)}li{margin-bottom:7px}
table{width:100%;border-collapse:collapse;margin:18px 0;font-size:.88rem}
th,td{padding:11px 12px;text-align:left;vertical-align:top;border-bottom:1px solid var(--border)}th{font-weight:600;background:var(--surface);color:var(--text)}
pre{background:#172033;color:#e2e8f0;padding:18px;border-radius:8px;overflow-x:auto;font-size:.82rem;line-height:1.7;margin:14px 0}
code{font-family:ui-monospace,Menlo,monospace}p code,li code,td code{background:var(--surface);padding:2px 6px;border-radius:5px;font-size:.85em;color:var(--primary-dark)}
.post-meta{color:var(--text-muted);font-size:.85rem;margin-bottom:22px}
.lead{font-size:1.05rem;color:var(--text);margin:22px 0}
.hero-media{display:block;width:100%;aspect-ratio:2.04/1;object-fit:cover;border-radius:8px;border:1px solid var(--border);margin:0 0 24px}
.proof{border-left:4px solid var(--accent);background:#f0fdf4;padding:14px 16px;margin:18px 0;color:#14532d}
.cta{background:var(--surface);border:1px solid var(--border);border-radius:8px;padding:24px;margin:30px 0;text-align:center}.cta p{margin-bottom:16px}.cta a.btn{display:inline-block;padding:10px 22px;background:var(--primary);color:#fff;border-radius:7px;font-weight:600}
footer{background:#0f172a;color:#94a3b8;padding:28px 0;text-align:center;font-size:.8rem}footer a{color:#94a3b8}
@media(max-width:900px){.nav-links{display:none}.nav .container{gap:16px}.nav-logo{margin-right:auto}h1{font-size:1.65rem}table{font-size:.8rem}th,td{padding:9px 8px}}
</style>
</head>
<body>
<nav class="nav"><div class="container"><a href="/" class="nav-logo">Fun<span>ASR</span></a><div class="nav-links"><a href="/#capabilities">核心能力</a><a href="/#usage">如何使用</a><a href="/#benchmark">性能</a><a href="/#demo">演示</a><a href="https://modelscope.github.io/FunASR/zh/" target="_blank">文档</a><a href="/quickstart.html">快速上手</a><a href="/models.html">模型</a><a href="/ecosystem.html">生态</a><a href="/blog/">技术博客</a><a href="/vs-whisper.html">对比 Whisper</a><a href="/donors.html">功德榜</a></div><a href="/en/blog/funasr-v1-3-28-realtime-websocket-subtitles.html" style="font-size:.83rem;font-weight:500;color:var(--text-soft)">EN</a><a href="https://github.com/modelscope/FunASR" target="_blank" rel="noopener" class="nav-btn">GitHub ★</a></div></nav>
<article><div class="container">
<h1>FunASR v1.3.28:实时识别可靠性与字幕对齐修复</h1>
<p class="post-meta">2026-07-24 · FunASR 每周发布</p>
<img class="hero-media" src="/img/banner.4f436d19.png?v=1.3.28" alt="FunASR 工业级语音识别视觉图">
<p class="lead">FunASR v1.3.28 是一次面向实时转写和字幕生成的可靠性热修复。实时 WebSocket 最终解码退化时会保留连续完整的最佳结果,SenseVoice 字幕也会保持文本、标签和时间戳对齐。</p>
<p>签名发布页同时提供 Python wheel、源码包和九个平台的 llama.cpp / GGUF 自包含运行时。</p>
<h2>这次修复了什么</h2>
<table>
<thead><tr><th>场景</th><th>v1.3.28 行为</th><th>用户收益</th></tr></thead>
<tbody>
<tr><td>VAD 锁句后的终稿退化为短前缀、重复文本或异常</td><td>服务保留覆盖当前语音段的干净连续 partial</td><td>实时终稿不再丢失句尾,也不会被重复幻觉替换</td></tr>
<tr><td>短音频尾部随后收到 <code>STOP</code></td><td>待处理采样统一进入最终解码路径</td><td>短句结尾不会被静默丢弃</td></tr>
<tr><td>WebSocket 断线或处理异常</td><td>显式导入连接异常,其他错误稳定进入通用处理</td><td>异常处理不再依赖 <code>websockets</code> 的延迟属性和导入顺序</td></tr>
<tr><td>SenseVoice 字幕分句</td><td>富标签、标点和词/BPE 时间戳保持对齐</td><td>中文不会被压成一个字幕块,英文原文也不会受损</td></tr>
</tbody>
</table>
<h2>1. 升级 Python 包</h2>
<p>实时识别和字幕部署都建议固定到本次热修复版本:</p>
<pre><code>python -m pip install -U "funasr==1.3.28"
funasr --version</code></pre>
<p>包版本、命令行版本和服务启动横幅都会显示 <code>1.3.28</code>;已有模型缓存和 API 请求格式无需迁移。</p>
<h2>2. 实时识别与字幕入口</h2>
<p>Fun-ASR-Nano 实时会话可使用包内入口并参照仓库 vLLM 指南配置。客户端 <code>COMMIT</code> 与服务端 VAD 模式现在共享修复后的最终收尾逻辑。</p>
<pre><code>funasr-realtime-server --help
# 模型和设备参数见 docs/vllm_guide_zh.md</code></pre>
<div class="proof">精确合并源码通过 118 项聚焦回归测试;实时 WebSocket 文件还独立通过 60 项测试,覆盖 STOP 最终解码和不依赖导入顺序的异常处理。</div>
<p>SenseVoice 用户通过同一次包升级获得字幕对齐修复,无需迁移输出结构。</p>
<h2>3. 下载 llama.cpp / GGUF 自包含运行时</h2>
<p><a href="https://github.com/modelscope/FunASR/releases/tag/runtime-llamacpp-v0.1.9" target="_blank" rel="noopener">runtime-llamacpp-v0.1.9</a> 同时提供九个 Linux x64/ARM64、macOS ARM64 和 Windows x64 包,其中 Linux 支持 AVX2/Vulkan,Windows 支持 AVX2/Vulkan/CUDA,并提供 <code>funasr-llamacpp-windows-x64-vulkan.zip</code>。每个压缩包都带自包含的 <code>llama-funasr-*</code> 二进制入口。</p>
<ul>
<li>不想维护 Python 环境:选标准 CPU 包。</li>
<li>桌面 GPU:按平台选择 Vulkan 或 CUDA 包。</li>
<li>边缘设备与 Apple Silicon:选择 ARM64 包。</li>
</ul>
<p>模型、命令与硬件选择见<a href="/llama-cpp.html"> llama.cpp / GGUF 专页</a>,发布资产和模型版本保持对应,避免用户在多个 release 中寻找文件。</p>
<h2>四个仓库分别解决什么</h2>
<table>
<thead><tr><th>仓库</th><th>适合关注的内容</th></tr></thead>
<tbody>
<tr><td><a href="https://github.com/modelscope/FunASR" target="_blank" rel="noopener">FunASR</a></td><td>工具包、服务、OpenAI API、vLLM、llama.cpp 与部署文档</td></tr>
<tr><td><a href="https://github.com/QwenAudio/Fun-ASR" target="_blank" rel="noopener">Fun-ASR</a></td><td>Fun-ASR-Nano / MLT 模型、能力、评测和模型级集成</td></tr>
<tr><td><a href="https://github.com/QwenAudio/SenseVoice" target="_blank" rel="noopener">SenseVoice</a></td><td>多语言 ASR、情感、语言和音频事件识别</td></tr>
<tr><td><a href="https://github.com/modelscope/FunClip" target="_blank" rel="noopener">FunClip</a></td><td>由语音识别驱动的视频理解、检索与剪辑</td></tr>
</tbody>
</table>
<div class="cta">
<p>从最适合你的入口跑通一个真实音频。遇到问题可在 GitHub 提交可复现 issue;如果项目对你有用,也欢迎 Star 你实际使用的仓库。</p>
<a class="btn" href="https://github.com/modelscope/FunASR/releases/tag/v1.3.28" target="_blank" rel="noopener">查看 v1.3.28 发布与下载</a>
</div>
</div></article>
<footer><div class="container">© 2024-2026 Tongyi Lab, Alibaba Group · <a href="https://github.com/modelscope/FunASR/blob/main/LICENSE">MIT License</a></div></footer>
</body>
</html>
@@ -0,0 +1,131 @@
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>FunASR vs faster-whisper:中文与粤语语音识别实测对比 | FunASR 博客</title>
<meta name="description" content="faster-whisper 在中文尤其粤语/方言上的短板实测:粤语被误判为普通话、日语同音字错;FunASR SenseVoice 原生支持粤语+语种/情感识别,184集 CER 低约 2.7 倍。含 3 行试用代码。">
<meta name="keywords" content="faster-whisper, faster-whisper 中文, faster-whisper 替代, FunASR, 粤语语音识别, 中文语音识别, SenseVoice, whisper 中文, 语种识别, 方言识别">
<link rel="icon" href="/logo.png">
<meta property="og:title" content="FunASR vs faster-whisper:中文与粤语语音识别实测对比 | FunASR 博客">
<meta property="og:description" content="faster-whisper 在中文尤其粤语/方言上的短板实测:粤语被误判为普通话、日语同音字错;FunASR SenseVoice 原生支持粤语+语种/情感识别,184集 CER 低约 2.7 倍。含 3 行试用代码。">
<meta property="og:type" content="article">
<meta property="og:url" content="https://www.funasr.com/blog/funasr-vs-faster-whisper-chinese.html">
<meta property="og:image" content="https://www.funasr.com/logo.png">
<link rel="canonical" href="https://www.funasr.com/blog/funasr-vs-faster-whisper-chinese.html">
<link rel="alternate" hreflang="en" href="https://www.funasr.com/en/blog/funasr-vs-faster-whisper-chinese.html">
<link rel="alternate" hreflang="zh" href="https://www.funasr.com/blog/funasr-vs-faster-whisper-chinese.html">
<link rel="alternate" hreflang="x-default" href="https://www.funasr.com/en/blog/funasr-vs-faster-whisper-chinese.html">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"BlogPosting","headline":"FunASR vs faster-whisper:中文与粤语语音识别实测对比 | FunASR 博客","description":"faster-whisper 在中文尤其粤语/方言上的短板实测:粤语被误判为普通话、日语同音字错;FunASR SenseVoice 原生支持粤语+语种/情感识别,184集 CER 低约 2.7 倍。含 3 行试用代码。","datePublished":"2026-06-21","dateModified":"2026-06-21","author":{"@type":"Organization","name":"FunASR / Tongyi Lab"},"publisher":{"@type":"Organization","name":"FunASR","logo":{"@type":"ImageObject","url":"https://www.funasr.com/logo.png"}},"mainEntityOfPage":{"@type":"WebPage","@id":"https://www.funasr.com/blog/funasr-vs-faster-whisper-chinese.html"},"image":"https://www.funasr.com/logo.png"}
</script>
<style>:root{--primary:#2563eb;--primary-dark:#1d4ed8;--bg:#fff;--surface:#f8fafc;--border:#e2e8f0;--text:#0f172a;--text-soft:#475569;--text-muted:#94a3b8;--radius:12px}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:'Inter',-apple-system,sans-serif;color:var(--text);line-height:1.7}
a{color:var(--primary);text-decoration:none}a:hover{text-decoration:underline}
.container{max-width:800px;margin:0 auto;padding:0 24px}
.nav{position:fixed;top:0;left:0;right:0;z-index:100;background:rgba(255,255,255,0.9);backdrop-filter:blur(12px);border-bottom:1px solid var(--border);padding:14px 0}
.nav .container{max-width:1120px;display:flex;align-items:center;gap:24px}
.nav-logo{font-size:1.2rem;font-weight:800;color:var(--text)}.nav-logo span{color:var(--primary)}
.nav-links{display:flex;gap:20px;margin-left:auto;flex-wrap:wrap}
.nav-links a{font-size:0.85rem;font-weight:500;color:var(--text-soft)}
.nav-btn{padding:7px 16px;background:var(--primary);color:#fff;border-radius:7px;font-size:0.83rem;font-weight:600}
article{padding:120px 0 80px}
h1{font-size:2rem;font-weight:800;line-height:1.3;margin-bottom:14px}
h2{font-size:1.3rem;font-weight:700;margin:36px 0 14px;padding-top:16px;border-top:1px solid var(--border)}
h3{font-size:1.05rem;font-weight:700;margin:22px 0 10px}
p{margin-bottom:14px;color:var(--text-soft)}
ul,ol{margin:0 0 14px 22px;color:var(--text-soft)}li{margin-bottom:6px}
table{width:100%;border-collapse:collapse;margin:16px 0;font-size:0.86rem}
th,td{padding:10px 12px;text-align:left;border-bottom:1px solid var(--border)}
th{font-weight:600;background:var(--surface);font-size:0.78rem;color:var(--text-muted)}
pre{background:#1e293b;color:#e2e8f0;padding:18px;border-radius:10px;overflow-x:auto;font-size:0.82rem;line-height:1.7;margin:14px 0}
code{font-family:ui-monospace,Menlo,monospace}
p code,li code{background:var(--surface);padding:2px 6px;border-radius:5px;font-size:0.85em;color:var(--primary-dark)}
.post-meta{color:var(--text-muted);font-size:0.85rem;margin-bottom:24px}
.cta{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:24px;margin:28px 0;text-align:center}
.cta a.btn{display:inline-block;padding:10px 24px;background:var(--primary);color:#fff;border-radius:8px;font-weight:600}
.post-list{list-style:none;margin:0;padding:0}
.post-list li{margin:0 0 8px}
.post-card{display:block;border:1px solid var(--border);border-radius:var(--radius);padding:20px 22px;margin-bottom:14px}
.post-card:hover{border-color:var(--primary);text-decoration:none}
.post-card h2{border:none;padding:0;margin:0 0 6px;font-size:1.15rem;color:var(--text)}
.post-card p{margin:0;color:var(--text-soft);font-size:0.9rem}
.post-card .date{color:var(--text-muted);font-size:0.8rem}
footer{background:#0f172a;color:#94a3b8;padding:28px 0;text-align:center;font-size:0.8rem}
footer a{color:#94a3b8}</style>
</head>
<body>
<nav class="nav"><div class="container"><a href="/" class="nav-logo">Fun<span>ASR</span></a><div class="nav-links"><a href="/#capabilities">核心能力</a><a href="/#usage">如何使用</a><a href="/#benchmark">性能</a><a href="/#demo">演示</a><a href="https://modelscope.github.io/FunASR/zh/" target="_blank">文档</a><a href="/quickstart.html">快速上手</a><a href="/models.html">模型</a><a href="/ecosystem.html">生态</a><a href="/blog/">技术博客</a><a href="/vs-whisper.html">对比 Whisper</a><a href="/donors.html">功德榜</a></div><a href="https://www.funasr.com/en/blog/funasr-vs-faster-whisper-chinese.html" style="font-size:0.83rem;font-weight:500;color:var(--text-soft)">EN</a><a href="https://github.com/modelscope/FunASR" target="_blank" class="nav-btn">GitHub ★</a></div></nav>
<article><div class="container">
<h1>FunASR vs faster-whisper:中文与粤语语音识别实测对比</h1>
<p class="post-meta">2026-06-21 · FunASR 团队</p>
<p><a href="https://github.com/SYSTRAN/faster-whisper" target="_blank">faster-whisper</a> 是目前最流行的 Whisper 加速实现(CTranslate2),英语和通用多语种都很强。但在<strong>中文、尤其是粤语和方言</strong>上,它有明显短板。下面是同样三段音频上 faster-whisper(small)和 FunASR <strong>SenseVoice</strong> 的逐句实测对比。</p>
<h2>实测对比(同样音频,逐字结果)</h2>
<table>
<tr><th>音频</th><th>faster-whisper (small)</th><th>FunASR SenseVoice</th></tr>
<tr><td>普通话</td><td>开放时间早上九点至下午五点。</td><td>开放时间早上9点至下午5点。</td></tr>
<tr><td><strong>粤语</strong></td><td>语言误判为 zh;<br>這幾個字都表達<strong>不到</strong>我想<strong>講的</strong>意思</td><td>正确识别 <code>yue</code>;<br>呢几个字都表达<strong>唔到</strong>,我想<strong>讲嘅</strong>意思</td></tr>
<tr><td>日语</td><td>うちの中学は弁当<strong>性</strong>で…</td><td>うちの中学は弁当<strong>制</strong>で…</td></tr>
</table>
<p>三个关键差异:</p>
<ul>
<li><strong>粤语:faster-whisper 把它当普通话处理</strong>——语言检测成 <code>zh</code>,并把口语粤语转写成普通话书面语(丢掉 <code>呢 / 唔到 / 嘅</code> 这些粤语特征字)。SenseVoice 原生支持粤语,正确识别 <code>yue</code> 并保留粤语原貌。</li>
<li><strong>日语同音字错</strong>:faster-whisper 把「弁当<strong>制</strong>」听成「弁当<strong>性</strong>」(同音误识),SenseVoice 正确。</li>
<li>普通话简单句两者都对——差异主要在难样本、方言、专名上显现。</li>
</ul>
<h2>整体准确率(184 段中文)</h2>
<p>同机 CPU、字符级 CER(越低越准):FunASR <strong>SenseVoice 8.0% / Paraformer 9.9% / Fun-ASR-Nano 8.3%</strong>;Whisper 系(small/base/large-v3-turbo)约 <strong>22–31%</strong>。中文上 FunASR 的 CER 低约 2.7 倍,原因=大规模中文训练数据 + 非自回归架构(更快)。完整方法学见 <a href="https://github.com/modelscope/FunASR/blob/main/runtime/llama.cpp/BENCHMARKS.md" target="_blank">BENCHMARKS.md</a>。</p>
<h2>FunASR 还多给你什么</h2>
<ul>
<li><strong>语种识别</strong>:zh / en / yue(粤语)/ ja / ko 自动判别(faster-whisper 把粤语判成 zh)</li>
<li><strong>情感 + 音频事件</strong>:HAPPY/SAD/ANGRY、BGM/掌声/笑声(<a href="/blog/sensevoice-emotion-language-detection.html">详见</a>)</li>
<li><strong>非自回归更快</strong>:SenseVoice/Paraformer 一次前向,CPU 上 ~20× 实时</li>
<li><strong>端侧</strong>:还有 <a href="/blog/funasr-llama-cpp-whisper-cpp-alternative.html">llama.cpp/GGUF 运行时</a>,单二进制零 Python 跑</li>
</ul>
<h2>该用哪个?</h2>
<p>诚实地说:<strong>faster-whisper 在英语、通用 99 语种、翻译任务上依然很强</strong>,生态也成熟。但如果你的场景是<strong>中文、粤语、方言,或需要情感/事件/语种信息</strong>,FunASR 更准也更全。两者都开源、都能本地跑。</p>
<h3>3 行试 FunASR</h3>
<pre>pip install funasr
from funasr import AutoModel
m = AutoModel(model="iic/SenseVoiceSmall")
print(m.generate(input="audio.wav", language="auto", use_itn=True)[0]["text"])</pre>
<div class="cta"><p><strong>FunASR 全家桶开源</strong>——ASR / VAD / 标点 / 说话人 / 情感事件 / LLM-ASR / llama.cpp 端侧。觉得有用点个 Star 👇</p><p><a class="btn" href="https://github.com/modelscope/FunASR" target="_blank">⭐ Star FunASR</a></p><p style="margin-top:10px;font-size:0.85rem">也欢迎 Star:<a href="https://github.com/QwenAudio/SenseVoice" target="_blank">SenseVoice</a> · <a href="https://github.com/QwenAudio/Fun-ASR" target="_blank">Fun-ASR</a> · <a href="https://github.com/modelscope/FunClip" target="_blank">FunClip</a></p></div>
<!--related-posts-->
<h2>相关文章</h2>
<ul class="post-list">
<li><a href="/blog/funasr-vs-whisper-benchmark.html">FunASR vs Whisper 实测对比</a></li>
<li><a href="/blog/sensevoice-deployment-guide.html">SenseVoice 部署指南</a></li>
<li><a href="/blog/fun-asr-nano-guide.html">Fun-ASR-Nano 使用指南</a></li>
<li><a href="/blog/funasr-speaker-diarization.html">说话人分离:谁在何时说话</a></li>
<li><a href="/blog/sensevoice-emotion-language-detection.html">情感与语种检测</a></li>
<li><a href="/blog/funasr-realtime-streaming-asr.html">实时流式语音识别</a></li>
<li><a href="/blog/funasr-transcribe-long-audio.html">转写超长音频(1小时一次搞定)</a></li>
<li><a href="/blog/funasr-cli-transcribe-command-line.html">命令行转写(文本/JSON/SRT)</a></li>
<li><a href="/blog/self-hosted-openai-whisper-api-alternative.html">自托管 OpenAI Whisper API 替代</a></li>
<li><a href="/blog/generate-subtitles-srt-vtt-from-audio-video.html">自动生成字幕(SRT / VTT)</a></li>
<li><a href="/blog/speech-to-text-python-transcribe-audio.html">Python 语音转文字教程</a></li>
<li><a href="/blog/funasr-llama-cpp-whisper-cpp-alternative.html">FunASR 跑进 llama.cpp(whisper.cpp 替代)</a></li>
<li><a href="/blog/lightweight-speech-recognition-cpu.html">轻量语音识别(CPU 250MB)</a></li>
<li><a href="/blog/self-hosted-deepgram-assemblyai-alternative.html">自托管替代 Deepgram/AssemblyAI</a></li>
<li><a href="/blog/which-funasr-model.html">选哪个 FunASR 模型</a></li>
<li><a href="/blog/cantonese-speech-recognition.html">粤语语音识别(SenseVoice 原生粤语)</a></li>
<li><a href="/blog/japanese-speech-recognition.html">日语语音识别(SenseVoice 转写+标点+情感)</a></li>
<li><a href="/blog/voice-activity-detection-python.html">Python 语音活动检测(VAD)</a></li>
<li><a href="/blog/self-hosted-google-aws-azure-speech-to-text.html">自托管替代 Google/AWS/Azure 云语音 API</a></li>
<li><a href="/blog/chinese-speech-recognition.html">中文语音识别(普通话)实战</a></li>
<li><a href="/blog/punctuation-restoration-python.html">标点恢复 Python 实战</a></li>
<li><a href="/blog/speech-to-text-timestamps-python.html">语音识别带时间戳(字级)</a></li>
</ul>
</div></article>
<footer><div class="container">© 2024-2026 Tongyi Lab, Alibaba Group · <a href="https://github.com/modelscope/FunASR/blob/main/LICENSE">MIT License</a></div></footer>
</body>
</html>
@@ -0,0 +1,95 @@
<!DOCTYPE html>
<html lang="zh"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>FunASR vs Whisper 实测对比:中文语音识别谁更快更准 | FunASR 博客</title><meta name="description" content="FunASR vs Whisper 实测 benchmark:184 个中文文件、H100 上,SenseVoice 169.6x 实时(快 Whisper 12 倍),CER 7.81% 仅为 Whisper 一半。含完整速度与准确率数据。"><meta name="keywords" content="FunASR vs Whisper, Whisper 对比, 中文语音识别, SenseVoice benchmark, Paraformer, 语音识别速度, Whisper 替代, CER, RTFx">
<link rel="icon" href="/logo.png"><meta property="og:title" content="FunASR vs Whisper 实测对比:中文语音识别谁更快更准 | FunASR 博客"><meta property="og:description" content="FunASR vs Whisper 实测 benchmark:184 个中文文件、H100 上,SenseVoice 169.6x 实时(快 Whisper 12 倍),CER 7.81% 仅为 Whisper 一半。含完整速度与准确率数据。">
<meta property="og:type" content="article"><meta property="og:url" content="https://www.funasr.com/blog/funasr-vs-whisper-benchmark.html"><meta property="og:image" content="https://www.funasr.com/logo.png">
<link rel="canonical" href="https://www.funasr.com/blog/funasr-vs-whisper-benchmark.html"><link rel="alternate" hreflang="en" href="https://www.funasr.com/en/blog/funasr-vs-whisper-benchmark.html"><link rel="alternate" hreflang="zh" href="https://www.funasr.com/blog/funasr-vs-whisper-benchmark.html"><link rel="alternate" hreflang="x-default" href="https://www.funasr.com/en/blog/funasr-vs-whisper-benchmark.html">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"BlogPosting","headline":"FunASR vs Whisper 实测对比:中文语音识别谁更快更准 | FunASR 博客","description":"FunASR vs Whisper 实测 benchmark:184 个中文文件、H100 上,SenseVoice 169.6x 实时(快 Whisper 12 倍),CER 7.81% 仅为 Whisper 一半。含完整速度与准确率数据。","datePublished":"2026-06-16","dateModified":"2026-06-16","author":{"@type":"Organization","name":"FunASR / Tongyi Lab"},"publisher":{"@type":"Organization","name":"FunASR","logo":{"@type":"ImageObject","url":"https://www.funasr.com/logo.png"}},"mainEntityOfPage":{"@type":"WebPage","@id":"https://www.funasr.com/blog/funasr-vs-whisper-benchmark.html"},"image":"https://www.funasr.com/logo.png"}
</script>
<style>:root{--primary:#2563eb;--primary-dark:#1d4ed8;--bg:#fff;--surface:#f8fafc;--border:#e2e8f0;--text:#0f172a;--text-soft:#475569;--text-muted:#94a3b8;--radius:12px}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:'Inter',-apple-system,sans-serif;color:var(--text);line-height:1.7}
a{color:var(--primary);text-decoration:none}a:hover{text-decoration:underline}
.container{max-width:800px;margin:0 auto;padding:0 24px}
.nav{position:fixed;top:0;left:0;right:0;z-index:100;background:rgba(255,255,255,0.9);backdrop-filter:blur(12px);border-bottom:1px solid var(--border);padding:14px 0}
.nav .container{max-width:1120px;display:flex;align-items:center;gap:24px}
.nav-logo{font-size:1.2rem;font-weight:800;color:var(--text)}.nav-logo span{color:var(--primary)}
.nav-links{display:flex;gap:20px;margin-left:auto;flex-wrap:wrap}
.nav-links a{font-size:0.85rem;font-weight:500;color:var(--text-soft)}
.nav-btn{padding:7px 16px;background:var(--primary);color:#fff;border-radius:7px;font-size:0.83rem;font-weight:600}
article{padding:120px 0 80px}
h1{font-size:2rem;font-weight:800;line-height:1.3;margin-bottom:14px}
h2{font-size:1.3rem;font-weight:700;margin:36px 0 14px;padding-top:16px;border-top:1px solid var(--border)}
h3{font-size:1.05rem;font-weight:700;margin:22px 0 10px}
p{margin-bottom:14px;color:var(--text-soft)}
ul,ol{margin:0 0 14px 22px;color:var(--text-soft)}li{margin-bottom:6px}
table{width:100%;border-collapse:collapse;margin:16px 0;font-size:0.86rem}
th,td{padding:10px 12px;text-align:left;border-bottom:1px solid var(--border)}
th{font-weight:600;background:var(--surface);font-size:0.78rem;color:var(--text-muted)}
pre{background:#1e293b;color:#e2e8f0;padding:18px;border-radius:10px;overflow-x:auto;font-size:0.82rem;line-height:1.7;margin:14px 0}
code{font-family:ui-monospace,Menlo,monospace}
p code,li code{background:var(--surface);padding:2px 6px;border-radius:5px;font-size:0.85em;color:var(--primary-dark)}
.post-meta{color:var(--text-muted);font-size:0.85rem;margin-bottom:24px}
.cta{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:24px;margin:28px 0;text-align:center}
.cta a.btn{display:inline-block;padding:10px 24px;background:var(--primary);color:#fff;border-radius:8px;font-weight:600}
.post-list{list-style:none;margin:0;padding:0}
.post-list li{margin:0 0 8px}
.post-card{display:block;border:1px solid var(--border);border-radius:var(--radius);padding:20px 22px;margin-bottom:14px}
.post-card:hover{border-color:var(--primary);text-decoration:none}
.post-card h2{border:none;padding:0;margin:0 0 6px;font-size:1.15rem;color:var(--text)}
.post-card p{margin:0;color:var(--text-soft);font-size:0.9rem}
.post-card .date{color:var(--text-muted);font-size:0.8rem}
footer{background:#0f172a;color:#94a3b8;padding:28px 0;text-align:center;font-size:0.8rem}
footer a{color:#94a3b8}</style></head><body>
<nav class="nav"><div class="container"><a href="/" class="nav-logo">Fun<span>ASR</span></a><div class="nav-links"><a href="/#capabilities">核心能力</a><a href="/#usage">如何使用</a><a href="/#benchmark">性能</a><a href="/#demo">演示</a><a href="https://modelscope.github.io/FunASR/zh/" target="_blank">文档</a><a href="/quickstart.html">快速上手</a><a href="/models.html">模型</a><a href="/ecosystem.html">生态</a><a href="/blog/">技术博客</a><a href="/vs-whisper.html">对比 Whisper</a><a href="/donors.html">功德榜</a></div><a href="https://www.funasr.com/en/blog/funasr-vs-whisper-benchmark.html" style="font-size:0.83rem;font-weight:500;color:var(--text-soft)">EN</a><a href="https://github.com/modelscope/FunASR" target="_blank" class="nav-btn">GitHub ★</a></div></nav>
<article><div class="container">
<h1>FunASR vs Whisper 实测对比:中文语音识别谁更快更准?</h1>
<p class="post-meta">FunASR 技术博客 · 2026-06-16 · Benchmark</p>
<p>我们在 <strong>184 个中文长音频文件(共 11,539 秒 ≈ 192 分钟)</strong> 上、同一块 <strong>NVIDIA H100</strong> 上,实测了 FunASR 系列模型与 OpenAI Whisper 的速度(RTFx)和准确率(CER)。结论很直接:<strong>在中文场景,FunASR 又快又准。</strong></p>
<table><thead><tr><th>模型</th><th>设备</th><th>RTFx(越高越快)</th><th>CER(越低越准)</th></tr></thead><tbody>
<tr><td><b>SenseVoice-Small</b></td><td>GPU</td><td class="win"><b>169.6x</b></td><td><b>7.81%</b></td></tr>
<tr><td><b>Paraformer-Large</b></td><td>GPU</td><td class="win"><b>119.6x</b></td><td>10.18%</td></tr>
<tr><td>Fun-ASR-Nano</td><td>GPU</td><td>340x (vLLM)</td><td>8.20%</td></tr>
<tr><td>Whisper-large-v3-turbo</td><td>GPU</td><td>46.1x</td><td>21.71%</td></tr>
<tr><td>Whisper-large-v3</td><td>GPU</td><td>13.4x</td><td>20.02%</td></tr>
<tr><td><b>SenseVoice-Small</b></td><td>CPU</td><td><b>17.2x</b></td><td>7.81%</td></tr>
</tbody></table>
<h2>速度</h2>
<p><strong>SenseVoice-Small 达到 169.6x 实时速度,是 Whisper-large-v3(13.4x)的约 12 倍</strong>;即使在 CPU 上,SenseVoice 也有 17.2x,比 Whisper 的 GPU 还快。Paraformer-Large 119.6x,同样远超 Whisper。</p>
<h2>准确率</h2>
<p>中文 CER:<strong>SenseVoice 7.81%、Paraformer 10.18%</strong>,而 Whisper-large-v3 是 20.02%、turbo 版 21.71%。FunASR 的中文错字率只有 Whisper 的一半甚至更低。</p>
<h2>为什么 FunASR 更快</h2>
<p>SenseVoice / Paraformer 是<strong>非自回归</strong>模型:一次前向就出全部结果,不像 Whisper 逐 token 自回归解码。再加上针对中文与亚洲语言的训练数据,中文场景兼顾速度与准确率。</p>
<div class="cta"><h3>开始使用 FunASR</h3><p>开源、可商用、支持 CPU/GPU 部署。觉得有用就点个 Star ⭐</p><a href="https://github.com/modelscope/FunASR" class="btn">FunASR GitHub ★</a></div>
<p>延伸阅读:<a href="/blog/sensevoice-deployment-guide.html">SenseVoice 部署指南</a> · <a href="/blog/fun-asr-nano-guide.html">Fun-ASR-Nano 指南</a> · <a href="/vs-whisper.html">对比 Whisper</a></p>
<p style="color:#94a3b8;font-size:0.82rem">测试条件:184 文件 / 11,539 秒中文音频,NVIDIA H100,RTF=推理时间/音频时长,Speed=1/RTF,CER 为去标点后字错误率。</p>
<!--related-posts-->
<h2>相关文章</h2>
<ul class="post-list">
<li><a href="/blog/sensevoice-deployment-guide.html">SenseVoice 部署指南</a></li>
<li><a href="/blog/fun-asr-nano-guide.html">Fun-ASR-Nano 使用指南</a></li>
<li><a href="/blog/funasr-speaker-diarization.html">说话人分离:谁在何时说话</a></li>
<li><a href="/blog/sensevoice-emotion-language-detection.html">情感与语种检测</a></li>
<li><a href="/blog/funasr-realtime-streaming-asr.html">实时流式语音识别</a></li>
<li><a href="/blog/funasr-transcribe-long-audio.html">转写超长音频(1小时一次搞定)</a></li>
<li><a href="/blog/funasr-cli-transcribe-command-line.html">命令行转写(文本/JSON/SRT)</a></li>
<li><a href="/blog/self-hosted-openai-whisper-api-alternative.html">自托管 OpenAI Whisper API 替代</a></li>
<li><a href="/blog/generate-subtitles-srt-vtt-from-audio-video.html">自动生成字幕(SRT / VTT)</a></li>
<li><a href="/blog/speech-to-text-python-transcribe-audio.html">Python 语音转文字教程</a></li>
<li><a href="/blog/funasr-llama-cpp-whisper-cpp-alternative.html">FunASR 跑进 llama.cpp(whisper.cpp 替代)</a></li>
<li><a href="/blog/funasr-vs-faster-whisper-chinese.html">FunASR vs faster-whisper(中文/粤语)</a></li>
<li><a href="/blog/lightweight-speech-recognition-cpu.html">轻量语音识别(CPU 250MB)</a></li>
<li><a href="/blog/self-hosted-deepgram-assemblyai-alternative.html">自托管替代 Deepgram/AssemblyAI</a></li>
<li><a href="/blog/which-funasr-model.html">选哪个 FunASR 模型</a></li>
<li><a href="/blog/cantonese-speech-recognition.html">粤语语音识别(SenseVoice 原生粤语)</a></li>
<li><a href="/blog/japanese-speech-recognition.html">日语语音识别(SenseVoice 转写+标点+情感)</a></li>
<li><a href="/blog/voice-activity-detection-python.html">Python 语音活动检测(VAD)</a></li>
<li><a href="/blog/self-hosted-google-aws-azure-speech-to-text.html">自托管替代 Google/AWS/Azure 云语音 API</a></li>
<li><a href="/blog/chinese-speech-recognition.html">中文语音识别(普通话)实战</a></li>
<li><a href="/blog/punctuation-restoration-python.html">标点恢复 Python 实战</a></li>
<li><a href="/blog/speech-to-text-timestamps-python.html">语音识别带时间戳(字级)</a></li>
</ul>
</div></article>
<footer><div class="container">© 2024-2026 Tongyi Lab, Alibaba Group · <a href="https://github.com/modelscope/FunASR/blob/main/LICENSE">MIT License</a></div></footer></body></html>
@@ -0,0 +1,118 @@
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>FunClip v2.1.0:本地 AI 视频剪辑与字幕驱动剪辑 | FunASR</title>
<meta name="description" content="FunClip v2.1.0 是首个版本化 GitHub Release:本地运行 Paraformer、Fun-ASR-Nano、SenseVoice 与大模型视频剪辑,提供 tar.gz、zip 和 SHA256SUMS。">
<meta name="keywords" content="FunClip v2.1.0,AI 视频剪辑,本地视频剪辑,自动字幕,FunASR,Fun-ASR-Nano,SenseVoice,大模型剪辑,Gradio">
<link rel="icon" href="/logo.png">
<meta property="og:title" content="FunClip v2.1.0:本地 AI 视频剪辑的首个版本化发布">
<meta property="og:description" content="Paraformer、Fun-ASR-Nano、SenseVoice 与大模型剪辑,提供可校验、可回退的版本化源码包。">
<meta property="og:type" content="article">
<meta property="og:url" content="https://www.funasr.com/blog/funclip-v2-1-0-video-clipping-release.html">
<meta property="og:image" content="https://www.funasr.com/img/funclip-v2-1-0-interface.jpg">
<link rel="canonical" href="https://www.funasr.com/blog/funclip-v2-1-0-video-clipping-release.html">
<link rel="alternate" hreflang="en" href="https://www.funasr.com/en/blog/funclip-v2-1-0-video-clipping-release.html">
<link rel="alternate" hreflang="zh" href="https://www.funasr.com/blog/funclip-v2-1-0-video-clipping-release.html">
<link rel="alternate" hreflang="x-default" href="https://www.funasr.com/en/blog/funclip-v2-1-0-video-clipping-release.html">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&amp;display=swap" rel="stylesheet">
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"BlogPosting","headline":"FunClip v2.1.0:本地 AI 视频剪辑的首个版本化发布","description":"Paraformer、Fun-ASR-Nano、SenseVoice 与大模型剪辑,提供可校验、可回退的版本化源码包。","datePublished":"2026-07-24","dateModified":"2026-07-24","author":{"@type":"Organization","name":"FunASR / Tongyi Lab"},"publisher":{"@type":"Organization","name":"FunASR","logo":{"@type":"ImageObject","url":"https://www.funasr.com/logo.png"}},"mainEntityOfPage":{"@type":"WebPage","@id":"https://www.funasr.com/blog/funclip-v2-1-0-video-clipping-release.html"},"image":"https://www.funasr.com/img/funclip-v2-1-0-interface.jpg"}
</script>
<style>
:root{--primary:#2563eb;--primary-dark:#1d4ed8;--accent:#047857;--bg:#fff;--surface:#f8fafc;--border:#e2e8f0;--text:#0f172a;--text-soft:#475569;--text-muted:#94a3b8}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:'Inter',-apple-system,sans-serif;color:var(--text);line-height:1.7;background:var(--bg)}
a{color:var(--primary);text-decoration:none}a:hover{text-decoration:underline}
.container{max-width:800px;margin:0 auto;padding:0 24px}
.nav{position:fixed;top:0;left:0;right:0;z-index:100;background:rgba(255,255,255,0.94);backdrop-filter:blur(12px);border-bottom:1px solid var(--border);padding:14px 0}
.nav .container{max-width:1120px;display:flex;align-items:center;gap:24px}
.nav-logo{font-size:1.2rem;font-weight:800;color:var(--text)}.nav-logo span{color:var(--primary)}
.nav-links{display:flex;gap:20px;margin-left:auto;flex-wrap:wrap}.nav-links a{font-size:.85rem;font-weight:500;color:var(--text-soft)}
.nav-btn{padding:7px 16px;background:var(--primary);color:#fff;border-radius:7px;font-size:.83rem;font-weight:600}
article{padding:116px 0 80px}
h1{font-size:2rem;font-weight:800;line-height:1.3;margin-bottom:14px}
h2{font-size:1.3rem;font-weight:700;margin:38px 0 14px;padding-top:18px;border-top:1px solid var(--border)}
h3{font-size:1.05rem;font-weight:700;margin:24px 0 10px}
p{margin-bottom:14px;color:var(--text-soft)}
ul{margin:0 0 16px 22px;color:var(--text-soft)}li{margin-bottom:7px}
table{width:100%;border-collapse:collapse;margin:18px 0;font-size:.88rem}
th,td{padding:11px 12px;text-align:left;vertical-align:top;border-bottom:1px solid var(--border)}th{font-weight:600;background:var(--surface);color:var(--text)}
pre{background:#172033;color:#e2e8f0;padding:18px;border-radius:8px;overflow-x:auto;font-size:.82rem;line-height:1.7;margin:14px 0}
code{font-family:ui-monospace,Menlo,monospace}p code,li code,td code{background:var(--surface);padding:2px 6px;border-radius:5px;font-size:.85em;color:var(--primary-dark)}
.post-meta{color:var(--text-muted);font-size:.85rem;margin-bottom:22px}
.lead{font-size:1.05rem;color:var(--text);margin:22px 0}
.hero-media{display:block;width:100%;aspect-ratio:2.04/1;object-fit:cover;border-radius:8px;border:1px solid var(--border);margin:0 0 24px}
.proof{border-left:4px solid var(--accent);background:#f0fdf4;padding:14px 16px;margin:18px 0;color:#14532d}
.cta{background:var(--surface);border:1px solid var(--border);border-radius:8px;padding:24px;margin:30px 0;text-align:center}.cta p{margin-bottom:16px}.cta a.btn{display:inline-block;padding:10px 22px;background:var(--primary);color:#fff;border-radius:7px;font-weight:600}
footer{background:#0f172a;color:#94a3b8;padding:28px 0;text-align:center;font-size:.8rem}footer a{color:#94a3b8}
@media(max-width:900px){.nav-links{display:none}.nav .container{gap:16px}.nav-logo{margin-right:auto}h1{font-size:1.65rem}table{font-size:.8rem}th,td{padding:9px 8px}}
</style>
</head>
<body>
<nav class="nav"><div class="container"><a href="/" class="nav-logo">Fun<span>ASR</span></a><div class="nav-links"><a href="/#capabilities">核心能力</a><a href="/#usage">如何使用</a><a href="/#benchmark">性能</a><a href="/#demo">演示</a><a href="https://modelscope.github.io/FunASR/zh/" target="_blank" rel="noopener">文档</a><a href="/quickstart.html">快速上手</a><a href="/models.html">模型</a><a href="/ecosystem.html">生态</a><a href="/blog/">技术博客</a><a href="/vs-whisper.html">对比 Whisper</a><a href="/donors.html">功德榜</a></div><a href="/en/blog/funclip-v2-1-0-video-clipping-release.html" style="font-size:.83rem;font-weight:500;color:var(--text-soft)">EN</a><a href="https://github.com/modelscope/FunASR" target="_blank" rel="noopener" class="nav-btn">GitHub ★</a></div></nav>
<article><div class="container">
<h1>FunClip v2.1.0:本地 AI 视频剪辑的首个版本化发布</h1>
<p class="post-meta">2026-07-24 · FunClip Release</p>
<img class="hero-media" src="/img/funclip-v2-1-0-interface.jpg" alt="FunClip 本地视频输入、字幕识别和大模型智能剪辑界面">
<p class="lead">FunClip v2.1.0 是项目首个带版本号的 GitHub Release。它把当前本地视频剪辑应用固定为一个可下载、可校验、可回退的版本:先用 FunASR 系列模型识别视频,再按字幕、说话人或大模型选出的片段完成剪辑。</p>
<p>你可以直接使用公开 Space,也可以下载源码在自己的机器上运行;视频、音频和模型权重不需要打包进发布归档。</p>
<h2>选择适合剪辑任务的识别路径</h2>
<table>
<thead><tr><th>路径</th><th>适合场景</th><th>启动方式</th></tr></thead>
<tbody>
<tr><td>Paraformer</td><td>需要精确时间戳、按文本或说话人剪辑,以及中文热词</td><td><code>python funclip/launch.py</code></td></tr>
<tr><td>Fun-ASR-Nano</td><td>普通话、英语、日语、中文方言与口音的高精度转写;精确按字剪辑仍建议用 Paraformer</td><td><code>python funclip/launch.py -m fun-asr-nano</code></td></tr>
<tr><td>SenseVoice</td><td>多语种识别,同时保留情感和音频事件标签</td><td><code>python funclip/launch.py -m sensevoice</code></td></tr>
<tr><td>英文 Paraformer</td><td>需要英文识别与时间戳剪辑</td><td><code>python funclip/launch.py -l en</code></td></tr>
</tbody>
</table>
<h2>1. 先在线体验</h2>
<p><a href="https://huggingface.co/spaces/FunAudioLLM/FunClip" target="_blank" rel="noopener">FunClip Hugging Face Space</a> 运行同一套公开应用,适合先验证视频上传、ASR、字幕选择和智能剪辑流程。需要处理私有视频或固定依赖时,再部署本地版本。</p>
<h2>2. 下载并校验 v2.1.0</h2>
<p>Linux 和 macOS 可以下载 <code>tar.gz</code>;Windows 或通用解压场景可以下载 <code>zip</code>。下面的校验命令只检查当前目录中已经下载的归档:</p>
<pre><code>curl -LO https://github.com/modelscope/FunClip/releases/download/v2.1.0/FunClip-2.1.0.tar.gz
curl -LO https://github.com/modelscope/FunClip/releases/download/v2.1.0/SHA256SUMS
sha256sum -c SHA256SUMS --ignore-missing
tar -xzf FunClip-2.1.0.tar.gz
cd FunClip-2.1.0
python -m pip install -r requirements.txt
python -m pip install -U "funasr>=1.3.29"
python funclip/launch.py</code></pre>
<p>Windows 用户可运行 <code>Get-FileHash -Algorithm SHA256 FunClip-2.1.0.zip</code>,再与 <a href="https://github.com/modelscope/FunClip/releases/download/v2.1.0/SHA256SUMS" target="_blank" rel="noopener">SHA256SUMS</a> 对照。</p>
<h2>3. 从字幕剪辑到内容理解剪辑</h2>
<p>默认工作流先将视频转成带时间信息的字幕,再让用户按文本或说话人选段。LLM 智能剪辑会把字幕和提示词交给已配置的大模型,返回可直接交给现有剪辑按钮的时间段。</p>
<ul>
<li>字幕足以判断内容时,使用已支持的字幕驱动大模型提供商。</li>
<li>动作、画面变化或屏幕事件比字幕更重要时,可选 TwelveLabs Pegasus,让模型同时理解视觉和音频。</li>
<li>需要人工精确控制时,直接选择识别文本或说话人,输出目标视频和对应 SRT 字幕。</li>
</ul>
<h2>为什么发布的是源码归档,而不是 wheel</h2>
<p>FunClip 是可运行应用,而不是已声明为 Python 库的包;仓库没有用于构建 wheel 的 <code>setup.py</code> 或 <code>pyproject.toml</code>。因此 v2.1.0 提供两个诚实的应用源码归档和一份校验文件:</p>
<ul>
<li><a href="https://github.com/modelscope/FunClip/releases/download/v2.1.0/FunClip-2.1.0.tar.gz" target="_blank" rel="noopener"><code>FunClip-2.1.0.tar.gz</code></a></li>
<li><a href="https://github.com/modelscope/FunClip/releases/download/v2.1.0/FunClip-2.1.0.zip" target="_blank" rel="noopener"><code>FunClip-2.1.0.zip</code></a></li>
<li><a href="https://github.com/modelscope/FunClip/releases/download/v2.1.0/SHA256SUMS" target="_blank" rel="noopener"><code>SHA256SUMS</code></a></li>
</ul>
<p>归档包含 Git 已跟踪的应用源码、文档和依赖清单,不捆绑运行依赖或模型权重;不同模型继续遵循各自的许可证与分发方式。</p>
<div class="proof">v2.1.0 的精确合并源码通过 50 项测试,另有 1 项跳过;干净 Python 3.12 环境中的 6 项发布契约测试覆盖可复现归档、跨文件系统输出、错误 ref 拒绝与发布幂等性。GitHub Actions 首次发布和主动重跑均成功,重跑验证已发布资产一致后不做破坏性修改。</div>
<h2>与 FunASR 1.3.29 的版本关系</h2>
<p>FunClip v2.1.0 要求 <code>funasr>=1.3.29</code>。该版本在 SenseVoice 缺少 token 时间戳时,通过 <code>sentence_info</code> 返回每个 VAD 语音区域,让字幕和剪辑客户端获得真实分段边界;同时包含 1.3.28 的实时终稿与短尾语音修复。详情见 <a href="https://github.com/modelscope/FunASR/releases/tag/v1.3.29" target="_blank" rel="noopener">FunASR v1.3.29 Release</a>。</p>
<div class="cta">
<p>先在 Space 跑通一个视频,或下载固定版本部署到自己的机器。遇到问题可提交可复现 issue;如果 FunClip 对你的工作流有帮助,欢迎 Star <a href="https://github.com/modelscope/FunClip" target="_blank" rel="noopener">FunClip 仓库</a>。</p>
<a class="btn" href="https://github.com/modelscope/FunClip/releases/tag/v2.1.0" target="_blank" rel="noopener">查看 FunClip v2.1.0 发布与下载</a>
</div>
</div></article>
<footer><div class="container">© 2024-2026 Tongyi Lab, Alibaba Group · <a href="https://github.com/modelscope/FunASR/blob/main/LICENSE">MIT License</a></div></footer>
</body>
</html>
@@ -0,0 +1,134 @@
<!DOCTYPE html>
<html lang="zh"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>用 FunASR 自动生成字幕:从音频/视频一键导出 SRT 和 VTT | FunASR</title><meta name="description" content="本地、免费给视频/音频生成字幕:`funasr video.wav -f srt` 一行出 SRT,Python 还能同时导出 VTT、带说话人和真实时间戳。中文强、50+ 语言,无需上传云端。代码全部实测。"><meta name="keywords" content="自动生成字幕, 视频转字幕, 音频生成srt, 字幕生成器, srt 生成 python, vtt 字幕, 视频加字幕, 语音转字幕, 给视频配字幕, whisper 字幕替代">
<link rel="icon" href="/logo.png"><meta property="og:title" content="用 FunASR 自动生成字幕:从音频/视频一键导出 SRT 和 VTT"><meta property="og:description" content="本地、免费给视频/音频生成字幕:`funasr video.wav -f srt` 一行出 SRT,Python 还能同时导出 VTT、带说话人和真实时间戳。中文强、50+ 语言,无需上传云端。代码全部实测。">
<meta property="og:type" content="article"><meta property="og:url" content="https://www.funasr.com/blog/generate-subtitles-srt-vtt-from-audio-video.html"><meta property="og:image" content="https://www.funasr.com/logo.png">
<link rel="canonical" href="https://www.funasr.com/blog/generate-subtitles-srt-vtt-from-audio-video.html"><link rel="alternate" hreflang="en" href="https://www.funasr.com/en/blog/generate-subtitles-srt-vtt-from-audio-video.html"><link rel="alternate" hreflang="zh" href="https://www.funasr.com/blog/generate-subtitles-srt-vtt-from-audio-video.html"><link rel="alternate" hreflang="x-default" href="https://www.funasr.com/en/blog/generate-subtitles-srt-vtt-from-audio-video.html">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"BlogPosting","headline":"用 FunASR 自动生成字幕:从音频/视频一键导出 SRT 和 VTT","description":"本地、免费给视频/音频生成字幕:`funasr video.wav -f srt` 一行出 SRT,Python 还能同时导出 VTT、带说话人和真实时间戳。中文强、50+ 语言,无需上传云端。代码全部实测。","datePublished":"2026-06-18","dateModified":"2026-06-18","author":{"@type":"Organization","name":"FunASR / Tongyi Lab"},"publisher":{"@type":"Organization","name":"FunASR","logo":{"@type":"ImageObject","url":"https://www.funasr.com/logo.png"}},"mainEntityOfPage":{"@type":"WebPage","@id":"https://www.funasr.com/blog/generate-subtitles-srt-vtt-from-audio-video.html"},"image":"https://www.funasr.com/logo.png"}
</script>
<style>:root{--primary:#2563eb;--primary-dark:#1d4ed8;--bg:#fff;--surface:#f8fafc;--border:#e2e8f0;--text:#0f172a;--text-soft:#475569;--text-muted:#94a3b8;--radius:12px}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:'Inter',-apple-system,sans-serif;color:var(--text);line-height:1.7}
a{color:var(--primary);text-decoration:none}a:hover{text-decoration:underline}
.container{max-width:800px;margin:0 auto;padding:0 24px}
.nav{position:fixed;top:0;left:0;right:0;z-index:100;background:rgba(255,255,255,0.9);backdrop-filter:blur(12px);border-bottom:1px solid var(--border);padding:14px 0}
.nav .container{max-width:1120px;display:flex;align-items:center;gap:24px}
.nav-logo{font-size:1.2rem;font-weight:800;color:var(--text)}.nav-logo span{color:var(--primary)}
.nav-links{display:flex;gap:20px;margin-left:auto;flex-wrap:wrap}
.nav-links a{font-size:0.85rem;font-weight:500;color:var(--text-soft)}
.nav-btn{padding:7px 16px;background:var(--primary);color:#fff;border-radius:7px;font-size:0.83rem;font-weight:600}
article{padding:120px 0 80px}
h1{font-size:2rem;font-weight:800;line-height:1.3;margin-bottom:14px}
h2{font-size:1.3rem;font-weight:700;margin:36px 0 14px;padding-top:16px;border-top:1px solid var(--border)}
h3{font-size:1.05rem;font-weight:700;margin:22px 0 10px}
p{margin-bottom:14px;color:var(--text-soft)}
ul,ol{margin:0 0 14px 22px;color:var(--text-soft)}li{margin-bottom:6px}
table{width:100%;border-collapse:collapse;margin:16px 0;font-size:0.86rem}
th,td{padding:10px 12px;text-align:left;border-bottom:1px solid var(--border)}
th{font-weight:600;background:var(--surface);font-size:0.78rem;color:var(--text-muted)}
pre{background:#1e293b;color:#e2e8f0;padding:18px;border-radius:10px;overflow-x:auto;font-size:0.82rem;line-height:1.7;margin:14px 0}
code{font-family:ui-monospace,Menlo,monospace}
p code,li code{background:var(--surface);padding:2px 6px;border-radius:5px;font-size:0.85em;color:var(--primary-dark)}
.post-meta{color:var(--text-muted);font-size:0.85rem;margin-bottom:24px}
.cta{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:24px;margin:28px 0;text-align:center}
.cta a.btn{display:inline-block;padding:10px 24px;background:var(--primary);color:#fff;border-radius:8px;font-weight:600}
.post-list{list-style:none;margin:0;padding:0}
.post-list li{margin:0 0 8px}
.post-card{display:block;border:1px solid var(--border);border-radius:var(--radius);padding:20px 22px;margin-bottom:14px}
.post-card:hover{border-color:var(--primary);text-decoration:none}
.post-card h2{border:none;padding:0;margin:0 0 6px;font-size:1.15rem;color:var(--text)}
.post-card p{margin:0;color:var(--text-soft);font-size:0.9rem}
.post-card .date{color:var(--text-muted);font-size:0.8rem}
footer{background:#0f172a;color:#94a3b8;padding:28px 0;text-align:center;font-size:0.8rem}
footer a{color:#94a3b8}</style></head><body>
<nav class="nav"><div class="container"><a href="/" class="nav-logo">Fun<span>ASR</span></a><div class="nav-links"><a href="/#capabilities">核心能力</a><a href="/#usage">如何使用</a><a href="/#benchmark">性能</a><a href="/#demo">演示</a><a href="https://modelscope.github.io/FunASR/zh/" target="_blank">文档</a><a href="/quickstart.html">快速上手</a><a href="/models.html">模型</a><a href="/ecosystem.html">生态</a><a href="/blog/">技术博客</a><a href="/vs-whisper.html">对比 Whisper</a><a href="/donors.html">功德榜</a></div><a href="https://www.funasr.com/en/blog/generate-subtitles-srt-vtt-from-audio-video.html" style="font-size:0.83rem;font-weight:600;color:var(--text-soft)">EN</a><a href="https://github.com/modelscope/FunASR" target="_blank" class="nav-btn">GitHub ★</a></div></nav>
<article><div class="container">
<h1>用 FunASR 自动生成字幕:从音频/视频一键导出 SRT 和 VTT</h1>
<p class="post-meta">FunASR 技术博客 · 2026-06-18 · 教程</p>
<p>要给视频或音频配字幕,不一定要上传到云端或买 API。FunASR 可以在本地、免费地把语音转成带时间戳的 <strong>SRT</strong> 或 <strong>VTT</strong> 字幕,还能标注说话人。中文尤其强,同时支持 50+ 语言。下面的命令和代码都已实测。</p>
<h2>第一步(视频):先抽出音频</h2>
<p>如果源文件是视频,用 ffmpeg 抽出 16kHz 单声道音频(FunASR 的标准输入):</p>
<pre><code>ffmpeg -i video.mp4 -ar 16000 -ac 1 audio.wav</code></pre>
<p>纯音频文件(wav/mp3/m4a 等)可跳过这步。</p>
<h2>最快:一行命令出 SRT</h2>
<pre><code>pip install -U funasr
funasr audio.wav -f srt -o ./subs</code></pre>
<p>在 <code>./subs/audio.srt</code> 生成标准 SRT 字幕,时间戳真实可用:</p>
<pre><code>1
00:00:00,000 --&gt; 00:00:05,546
欢迎大家来体验达摩院推出的语音识别模型</code></pre>
<p>加 <code>--spk</code> 可以按说话人分句(适合访谈、会议):</p>
<pre><code>funasr meeting.wav --spk -f srt -o ./subs</code></pre>
<h2>用 Python:同时导出 SRT 和 VTT(带说话人)</h2>
<p>需要更多控制(比如同时要网页用的 VTT、自定义说话人前缀)时,用 Python 直接从识别结果里的 <code>sentence_info</code> 拼字幕:</p>
<pre><code>from funasr import AutoModel
from funasr.utils.postprocess_utils import rich_transcription_postprocess
model = AutoModel(model="iic/SenseVoiceSmall", vad_model="fsmn-vad", spk_model="cam++", device="cuda")
res = model.generate(input="audio.wav")
segments = res[0]["sentence_info"] # 每段含 start/end(毫秒)、spk、sentence
def ts(ms, sep): # 毫秒 -&gt; HH:MM:SS,mmm(SRT 用 "," / VTT 用 ".")
h, mm, ss, mmm = ms//3600000, (ms%3600000)//60000, (ms%60000)//1000, ms%1000
return "%02d:%02d:%02d%s%03d" % (h, mm, ss, sep, mmm)
with open("subs.srt", "w", encoding="utf-8") as f:
for i, s in enumerate(segments):
text = rich_transcription_postprocess(s["sentence"])
f.write("%d\n%s --&gt; %s\nSpeaker %s: %s\n\n" % (i+1, ts(s["start"], ","), ts(s["end"], ","), s["spk"], text))
with open("subs.vtt", "w", encoding="utf-8") as f:
f.write("WEBVTT\n\n")
for s in segments:
text = rich_transcription_postprocess(s["sentence"])
f.write("%s --&gt; %s\n&lt;v Speaker %s&gt;%s\n\n" % (ts(s["start"], "."), ts(s["end"], "."), s["spk"], text))</code></pre>
<p>实测输出(SRT):</p>
<pre><code>1
00:00:00,610 --&gt; 00:00:05,530
Speaker 0: 欢迎大家来体验达摩院推出的语音识别模型</code></pre>
<p>注意一定要用 <code>rich_transcription_postprocess</code> 清掉 SenseVoice 的 <code>&lt;|zh|&gt;</code> 等标签,否则标签会混进字幕。</p>
<h2>最后(可选):把字幕烧进视频</h2>
<pre><code>ffmpeg -i video.mp4 -vf subtitles=subs.srt output.mp4</code></pre>
<h2>为什么用 FunASR 做字幕</h2>
<ul>
<li><strong>本地、免费、隐私</strong>:无需上传、无 API key、无时长费用。</li>
<li><strong>快</strong>:SenseVoice 非自回归,远快于 Whisper(<a href="/blog/funasr-vs-whisper-benchmark.html">实测对比</a>),长视频也能很快出字幕。</li>
<li><strong>中文更准</strong> + 50+ 语言;自带 VAD 分句、说话人标注、真实时间戳。</li>
</ul>
<div class="cta"><p>FunASR 是通义实验室开源的工业级语音识别工具包。</p><a class="btn" href="https://github.com/modelscope/FunASR" target="_blank">在 GitHub 上 Star FunASR ★</a></div>
<!--related-posts-->
<h2>相关文章</h2>
<ul class="post-list">
<li><a href="/blog/funasr-vs-whisper-benchmark.html">FunASR vs Whisper 实测对比</a></li>
<li><a href="/blog/sensevoice-deployment-guide.html">SenseVoice 部署指南</a></li>
<li><a href="/blog/fun-asr-nano-guide.html">Fun-ASR-Nano 使用指南</a></li>
<li><a href="/blog/funasr-speaker-diarization.html">说话人分离:谁在何时说话</a></li>
<li><a href="/blog/sensevoice-emotion-language-detection.html">情感与语种检测</a></li>
<li><a href="/blog/funasr-realtime-streaming-asr.html">实时流式语音识别</a></li>
<li><a href="/blog/funasr-transcribe-long-audio.html">转写超长音频(1小时一次搞定)</a></li>
<li><a href="/blog/funasr-cli-transcribe-command-line.html">命令行转写(文本/JSON/SRT)</a></li>
<li><a href="/blog/self-hosted-openai-whisper-api-alternative.html">自托管 OpenAI Whisper API 替代</a></li>
<li><a href="/blog/speech-to-text-python-transcribe-audio.html">Python 语音转文字教程</a></li>
<li><a href="/blog/funasr-llama-cpp-whisper-cpp-alternative.html">FunASR 跑进 llama.cpp(whisper.cpp 替代)</a></li>
<li><a href="/blog/funasr-vs-faster-whisper-chinese.html">FunASR vs faster-whisper(中文/粤语)</a></li>
<li><a href="/blog/lightweight-speech-recognition-cpu.html">轻量语音识别(CPU 250MB)</a></li>
<li><a href="/blog/self-hosted-deepgram-assemblyai-alternative.html">自托管替代 Deepgram/AssemblyAI</a></li>
<li><a href="/blog/which-funasr-model.html">选哪个 FunASR 模型</a></li>
<li><a href="/blog/cantonese-speech-recognition.html">粤语语音识别(SenseVoice 原生粤语)</a></li>
<li><a href="/blog/japanese-speech-recognition.html">日语语音识别(SenseVoice 转写+标点+情感)</a></li>
<li><a href="/blog/voice-activity-detection-python.html">Python 语音活动检测(VAD)</a></li>
<li><a href="/blog/self-hosted-google-aws-azure-speech-to-text.html">自托管替代 Google/AWS/Azure 云语音 API</a></li>
<li><a href="/blog/chinese-speech-recognition.html">中文语音识别(普通话)实战</a></li>
<li><a href="/blog/punctuation-restoration-python.html">标点恢复 Python 实战</a></li>
<li><a href="/blog/speech-to-text-timestamps-python.html">语音识别带时间戳(字级)</a></li>
</ul>
</div></article>
<footer><div class="container">FunASR · 通义实验室开源语音识别 · <a href="https://github.com/modelscope/FunASR">GitHub</a></div></footer>
</body></html>
File diff suppressed because one or more lines are too long
@@ -0,0 +1,144 @@
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>日语语音识别:SenseVoice 一个模型搞定日语转写+标点+情感(附 Whisper 真实对比)| FunASR 博客</title>
<meta name="description" content="开源日语语音识别怎么做?SenseVoice 原生支持日语(ja),自动识别语种、输出带标点的文本,还附带情感与音频事件。同一段日语音频实测:SenseVoice 写对 転売,Whisper-small 误为同音字 天売。3 行 Python。">
<meta name="keywords" content="日语语音识别, 日语转文字, 日文语音识别, 日语转录, 日语语音转文字, SenseVoice, 开源语音识别, Whisper 替代, FunASR, 语音识别 python, japanese speech recognition">
<link rel="icon" href="/logo.png">
<meta property="og:title" content="日语语音识别:SenseVoice 一个模型搞定日语转写+标点+情感(附 Whisper 真实对比)| FunASR 博客">
<meta property="og:description" content="开源日语语音识别怎么做?SenseVoice 原生支持日语(ja),自动识别语种、输出带标点的文本,还附带情感与音频事件。同一段日语音频实测:SenseVoice 写对 転売,Whisper-small 误为同音字 天売。3 行 Python。">
<meta property="og:type" content="article">
<meta property="og:url" content="https://www.funasr.com/blog/japanese-speech-recognition.html">
<meta property="og:image" content="https://www.funasr.com/logo.png">
<link rel="canonical" href="https://www.funasr.com/blog/japanese-speech-recognition.html">
<link rel="alternate" hreflang="en" href="https://www.funasr.com/en/blog/japanese-speech-recognition.html">
<link rel="alternate" hreflang="zh" href="https://www.funasr.com/blog/japanese-speech-recognition.html">
<link rel="alternate" hreflang="x-default" href="https://www.funasr.com/en/blog/japanese-speech-recognition.html">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"BlogPosting","headline":"日语语音识别:SenseVoice 一个模型搞定日语转写+标点+情感(附 Whisper 真实对比)| FunASR 博客","description":"开源日语语音识别怎么做?SenseVoice 原生支持日语(ja),自动识别语种、输出带标点的文本,还附带情感与音频事件。同一段日语音频实测:SenseVoice 写对 転売,Whisper-small 误为同音字 天売。3 行 Python。","datePublished":"2026-06-22","dateModified":"2026-06-22","author":{"@type":"Organization","name":"FunASR / Tongyi Lab"},"publisher":{"@type":"Organization","name":"FunASR","logo":{"@type":"ImageObject","url":"https://www.funasr.com/logo.png"}},"mainEntityOfPage":{"@type":"WebPage","@id":"https://www.funasr.com/blog/japanese-speech-recognition.html"},"image":"https://www.funasr.com/logo.png"}
</script>
<style>:root{--primary:#2563eb;--primary-dark:#1d4ed8;--bg:#fff;--surface:#f8fafc;--border:#e2e8f0;--text:#0f172a;--text-soft:#475569;--text-muted:#94a3b8;--radius:12px}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:'Inter',-apple-system,sans-serif;color:var(--text);line-height:1.7}
a{color:var(--primary);text-decoration:none}a:hover{text-decoration:underline}
.container{max-width:800px;margin:0 auto;padding:0 24px}
.nav{position:fixed;top:0;left:0;right:0;z-index:100;background:rgba(255,255,255,0.9);backdrop-filter:blur(12px);border-bottom:1px solid var(--border);padding:14px 0}
.nav .container{max-width:1120px;display:flex;align-items:center;gap:24px}
.nav-logo{font-size:1.2rem;font-weight:800;color:var(--text)}.nav-logo span{color:var(--primary)}
.nav-links{display:flex;gap:20px;margin-left:auto;flex-wrap:wrap}
.nav-links a{font-size:0.85rem;font-weight:500;color:var(--text-soft)}
.nav-btn{padding:7px 16px;background:var(--primary);color:#fff;border-radius:7px;font-size:0.83rem;font-weight:600}
article{padding:120px 0 80px}
h1{font-size:2rem;font-weight:800;line-height:1.3;margin-bottom:14px}
h2{font-size:1.3rem;font-weight:700;margin:36px 0 14px;padding-top:16px;border-top:1px solid var(--border)}
h3{font-size:1.05rem;font-weight:700;margin:22px 0 10px}
p{margin-bottom:14px;color:var(--text-soft)}
ul,ol{margin:0 0 14px 22px;color:var(--text-soft)}li{margin-bottom:6px}
table{width:100%;border-collapse:collapse;margin:16px 0;font-size:0.86rem}
th,td{padding:10px 12px;text-align:left;border-bottom:1px solid var(--border)}
th{font-weight:600;background:var(--surface);font-size:0.78rem;color:var(--text-muted)}
pre{background:#1e293b;color:#e2e8f0;padding:18px;border-radius:10px;overflow-x:auto;font-size:0.82rem;line-height:1.7;margin:14px 0}
code{font-family:ui-monospace,Menlo,monospace}
p code,li code{background:var(--surface);padding:2px 6px;border-radius:5px;font-size:0.85em;color:var(--primary-dark)}
.post-meta{color:var(--text-muted);font-size:0.85rem;margin-bottom:24px}
.cta{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:24px;margin:28px 0;text-align:center}
.cta a.btn{display:inline-block;padding:10px 24px;background:var(--primary);color:#fff;border-radius:8px;font-weight:600}
.post-list{list-style:none;margin:0;padding:0}
.post-list li{margin:0 0 8px}
.post-card{display:block;border:1px solid var(--border);border-radius:var(--radius);padding:20px 22px;margin-bottom:14px}
.post-card:hover{border-color:var(--primary);text-decoration:none}
.post-card h2{border:none;padding:0;margin:0 0 6px;font-size:1.15rem;color:var(--text)}
.post-card p{margin:0;color:var(--text-soft);font-size:0.9rem}
.post-card .date{color:var(--text-muted);font-size:0.8rem}
footer{background:#0f172a;color:#94a3b8;padding:28px 0;text-align:center;font-size:0.8rem}
footer a{color:#94a3b8}</style>
</head>
<body>
<nav class="nav"><div class="container"><a href="/" class="nav-logo">Fun<span>ASR</span></a><div class="nav-links"><a href="/#capabilities">核心能力</a><a href="/#usage">如何使用</a><a href="/#benchmark">性能</a><a href="/#demo">演示</a><a href="https://modelscope.github.io/FunASR/zh/" target="_blank">文档</a><a href="/quickstart.html">快速上手</a><a href="/models.html">模型</a><a href="/ecosystem.html">生态</a><a href="/blog/">技术博客</a><a href="/vs-whisper.html">对比 Whisper</a><a href="/donors.html">功德榜</a></div><a href="https://www.funasr.com/en/blog/japanese-speech-recognition.html" style="font-size:0.83rem;font-weight:500;color:var(--text-soft)">EN</a><a href="https://github.com/modelscope/FunASR" target="_blank" class="nav-btn">GitHub ★</a></div></nav>
<article><div class="container">
<h1>日语语音识别:SenseVoice 一个模型搞定日语转写 + 标点 + 情感(附与 Whisper 的真实对比)</h1>
<p class="post-meta">2026-06-22 · FunASR 团队</p>
<p>做日语语音识别,大多数人第一反应是 Whisper。但如果你要的是<strong>能在 CPU 上跑、又快又准、还自带标点和情感的开源方案</strong>,<strong>SenseVoice</strong>(FunAudioLLM 团队开源的多语种语音理解模型)是个被低估的选择:它原生支持日语(ja),自动识别语种,一次非自回归前向就输出带标点的文本,顺带还给出情感和音频事件。</p>
<p>下面是<strong>同一段日语音频</strong>上,SenseVoice 与同量级 Whisper-small 的<strong>真实输出对比</strong>(都在我们的服务器上实跑,未做任何挑选)。</p>
<h2>真实对比:同一段日语音频</h2>
<p>测试音频是一段口语化的日语发言。两个模型的真实输出:</p>
<table>
<tr><th>模型</th><th>识别语种</th><th>输出</th></tr>
<tr><td><strong>SenseVoice</strong></td><td>自动判 <code>ja</code></td><td>供給量が減る と ある程度は仕方ないんじゃね、<strong>転売</strong>の価格は論外だけど。</td></tr>
<tr><td>Whisper-small</td><td><code>ja</code></td><td>供給量が減るとある程度は仕方ないんじゃね<strong>天売</strong>の価格は論外だけど</td></tr>
</table>
<p>关键差别在 <code>転売</code> 这个词:</p>
<ul>
<li><strong>SenseVoice 写对了 <code>転売</code>(てんばい,意为"倒卖/转卖")</strong>——这正是这句话的本意(在聊倒卖价格)。</li>
<li>Whisper-small 写成了同音的 <code>天売</code>——读音一样(tenbai),但<strong>不是一个真实存在的词</strong>,属于典型的日语同音异字识别错误。</li>
<li>另外,SenseVoice <strong>自动加了标点(<code>、</code> <code>。</code>)</strong>,Whisper-small 的输出没有任何标点。</li>
</ul>
<p>说明一下口径:这里对比的是<strong>同量级</strong>的 Whisper-small(适合 CPU 部署的常见选择)。更大的 Whisper-large 通常能纠正这类同音字,但模型大得多、也慢得多;而 SenseVoice 在<strong>小模型体量</strong>下就把这个词写对了,还顺手给了标点和情感。</p>
<h2>3 行代码跑通日语识别</h2>
<pre>pip install funasr
from funasr import AutoModel
from funasr.utils.postprocess_utils import rich_transcription_postprocess
model = AutoModel(model="iic/SenseVoiceSmall", disable_update=True)
res = model.generate(input="japanese.wav", language="auto", use_itn=True)
print(rich_transcription_postprocess(res[0]["text"]))
# 供給量が減る と ある程度は仕方ないんじゃね、転売の価格は論外だけど。</pre>
<p><code>language</code> 可以写 <code>"ja"</code> 明确指定,也可以像上面写 <code>"auto"</code> 让模型自动判语种——实测这段音频在 <code>auto</code> 下被正确判为 <code>ja</code>,结果与显式指定完全一致。</p>
<h2>原始输出里还带了什么</h2>
<p>SenseVoice 的原始输出每段开头有一串标签:</p>
<pre>&lt;|ja|&gt;&lt;|NEUTRAL|&gt;&lt;|Speech|&gt;&lt;|withitn|&gt;供給量が減る と ある程度は仕方ないんじゃね、転売の価格は論外だけど。</pre>
<p>含义:<code>&lt;|ja|&gt;</code> = 语种是日语;<code>&lt;|NEUTRAL|&gt;</code> = 情感(中性);<code>&lt;|Speech|&gt;</code> = 音频事件(纯人声,可识别 BGM/笑声/掌声等);<code>&lt;|withitn|&gt;</code> = 已做逆文本归一化。也就是说,转写日语的同时,<strong>语种 / 情感 / 音频事件全都免费拿到了</strong>。用 <code>rich_transcription_postprocess()</code> 一行就能清洗成纯文本。</p>
<h2>为什么日语识别值得试试 SenseVoice</h2>
<table>
<tr><th></th><th>SenseVoice</th><th>Whisper-small</th></tr>
<tr><td>日语同音字(転売)</td><td>✅ 写对</td><td>❌ 误为 天売</td></tr>
<tr><td>自动标点</td><td>✅ 内置</td><td>❌ 无</td></tr>
<tr><td>情感 / 音频事件</td><td>✅ 一次出</td><td>❌</td></tr>
<tr><td>逆文本归一化(ITN)</td><td>✅ 内置</td><td>部分</td></tr>
<tr><td>速度</td><td>非自回归,实测 RTF≈0.04(GPU)</td><td>自回归,更慢</td></tr>
<tr><td>多语种</td><td>一个模型覆盖 50+ 语种(ja/ko/zh/yue/en…)</td><td>多语种</td></tr>
<tr><td>许可证</td><td>开源,可商用</td><td>开源</td></tr>
</table>
<p>如果你的场景是<strong>日语 + 中文 + 英文混合</strong>(跨境电商客服、字幕、会议),SenseVoice 一个模型就能全覆盖,还自带情感分析。想了解它的情感/事件检测能力,看 <a href="/blog/sensevoice-emotion-language-detection.html">SenseVoice 情感与音频事件识别</a>;不确定选哪个模型,看 <a href="/blog/which-funasr-model.html">FunASR 模型选型指南</a>;中文准确率对比见 <a href="/blog/funasr-vs-whisper-benchmark.html">FunASR vs Whisper benchmark</a>。</p>
<div class="cta"><p><strong>FunASR 全家桶都是开源的</strong>——工业级 ASR / VAD / 标点 / 说话人 / 情感事件 / LLM-ASR,日语等 50+ 语种开箱即用。觉得有用就点个 Star 支持一下 👇</p><p><a class="btn" href="https://github.com/QwenAudio/SenseVoice" target="_blank">⭐ Star SenseVoice</a></p><p style="margin-top:10px;font-size:0.85rem">也欢迎 Star:<a href="https://github.com/modelscope/FunASR" target="_blank">FunASR</a> · <a href="https://github.com/QwenAudio/Fun-ASR" target="_blank">Fun-ASR</a> · <a href="https://github.com/modelscope/FunClip" target="_blank">FunClip</a></p></div>
<!--related-posts-->
<h2>相关文章</h2>
<ul class="post-list">
<li><a href="/blog/funasr-vs-whisper-benchmark.html">FunASR vs Whisper 实测对比</a></li>
<li><a href="/blog/sensevoice-deployment-guide.html">SenseVoice 部署指南</a></li>
<li><a href="/blog/fun-asr-nano-guide.html">Fun-ASR-Nano 使用指南</a></li>
<li><a href="/blog/funasr-speaker-diarization.html">说话人分离:谁在何时说话</a></li>
<li><a href="/blog/sensevoice-emotion-language-detection.html">情感与语种检测</a></li>
<li><a href="/blog/funasr-realtime-streaming-asr.html">实时流式语音识别</a></li>
<li><a href="/blog/funasr-transcribe-long-audio.html">转写超长音频(1小时一次搞定)</a></li>
<li><a href="/blog/funasr-cli-transcribe-command-line.html">命令行转写(文本/JSON/SRT)</a></li>
<li><a href="/blog/self-hosted-openai-whisper-api-alternative.html">自托管 OpenAI Whisper API 替代</a></li>
<li><a href="/blog/generate-subtitles-srt-vtt-from-audio-video.html">自动生成字幕(SRT / VTT)</a></li>
<li><a href="/blog/speech-to-text-python-transcribe-audio.html">Python 语音转文字教程</a></li>
<li><a href="/blog/funasr-llama-cpp-whisper-cpp-alternative.html">FunASR 跑进 llama.cpp(whisper.cpp 替代)</a></li>
<li><a href="/blog/funasr-vs-faster-whisper-chinese.html">FunASR vs faster-whisper(中文/粤语)</a></li>
<li><a href="/blog/lightweight-speech-recognition-cpu.html">轻量语音识别(CPU 250MB)</a></li>
<li><a href="/blog/self-hosted-deepgram-assemblyai-alternative.html">自托管替代 Deepgram/AssemblyAI</a></li>
<li><a href="/blog/which-funasr-model.html">选哪个 FunASR 模型</a></li>
<li><a href="/blog/cantonese-speech-recognition.html">粤语语音识别(SenseVoice 原生粤语)</a></li>
<li><a href="/blog/voice-activity-detection-python.html">Python 语音活动检测(VAD)</a></li>
<li><a href="/blog/self-hosted-google-aws-azure-speech-to-text.html">自托管替代 Google/AWS/Azure 云语音 API</a></li>
<li><a href="/blog/chinese-speech-recognition.html">中文语音识别(普通话)实战</a></li>
<li><a href="/blog/punctuation-restoration-python.html">标点恢复 Python 实战</a></li>
<li><a href="/blog/speech-to-text-timestamps-python.html">语音识别带时间戳(字级)</a></li>
</ul>
</div></article>
<footer><div class="container">© 2024-2026 Tongyi Lab, Alibaba Group · <a href="https://github.com/modelscope/FunASR/blob/main/LICENSE">MIT License</a></div></footer>
</body>
</html>
@@ -0,0 +1,116 @@
<!DOCTYPE html>
<html lang="zh"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>轻量语音识别:CPU 上约 250MB 跑中文 ASR(无需 GPU/Python)| FunASR 博客</title><meta name="description" content="如何在 CPU/边缘设备上轻量跑中文语音识别?FunASR llama.cpp 运行时:单二进制 + 254MB q8 模型,无需 GPU/Python,CPU 0.16s,中文 CER 7.99%(比 whisper.cpp small 还小且准 3 倍)。"><meta name="keywords" content="轻量语音识别, CPU 语音识别, 低内存 ASR, 边缘语音识别, 树莓派 语音识别, 小模型 语音识别, whisper.cpp 替代, GGUF, SenseVoice, 中文语音识别">
<link rel="icon" href="/logo.png"><meta property="og:title" content="轻量语音识别:CPU 上约 250MB 跑中文 ASR(无需 GPU/Python)| FunASR 博客"><meta property="og:description" content="如何在 CPU/边缘设备上轻量跑中文语音识别?FunASR llama.cpp 运行时:单二进制 + 254MB q8 模型,无需 GPU/Python,CPU 0.16s,中文 CER 7.99%(比 whisper.cpp small 还小且准 3 倍)。">
<meta property="og:type" content="article"><meta property="og:url" content="https://www.funasr.com/blog/lightweight-speech-recognition-cpu.html"><meta property="og:image" content="https://www.funasr.com/logo.png">
<link rel="canonical" href="https://www.funasr.com/blog/lightweight-speech-recognition-cpu.html"><link rel="alternate" hreflang="en" href="https://www.funasr.com/en/blog/lightweight-speech-recognition-cpu.html"><link rel="alternate" hreflang="zh" href="https://www.funasr.com/blog/lightweight-speech-recognition-cpu.html"><link rel="alternate" hreflang="x-default" href="https://www.funasr.com/en/blog/lightweight-speech-recognition-cpu.html">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"BlogPosting","headline":"轻量语音识别:CPU 上约 250MB 跑中文 ASR(无需 GPU/Python)| FunASR 博客","description":"如何在 CPU/边缘设备上轻量跑中文语音识别?FunASR llama.cpp 运行时:单二进制 + 254MB q8 模型,无需 GPU/Python,CPU 0.16s,中文 CER 7.99%(比 whisper.cpp small 还小且准 3 倍)。","datePublished":"2026-06-22","dateModified":"2026-06-22","author":{"@type":"Organization","name":"FunASR / Tongyi Lab"},"publisher":{"@type":"Organization","name":"FunASR","logo":{"@type":"ImageObject","url":"https://www.funasr.com/logo.png"}},"mainEntityOfPage":{"@type":"WebPage","@id":"https://www.funasr.com/blog/lightweight-speech-recognition-cpu.html"},"image":"https://www.funasr.com/logo.png"}
</script>
<style>:root{--primary:#2563eb;--primary-dark:#1d4ed8;--bg:#fff;--surface:#f8fafc;--border:#e2e8f0;--text:#0f172a;--text-soft:#475569;--text-muted:#94a3b8;--radius:12px}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:'Inter',-apple-system,sans-serif;color:var(--text);line-height:1.7}
a{color:var(--primary);text-decoration:none}a:hover{text-decoration:underline}
.container{max-width:800px;margin:0 auto;padding:0 24px}
.nav{position:fixed;top:0;left:0;right:0;z-index:100;background:rgba(255,255,255,0.9);backdrop-filter:blur(12px);border-bottom:1px solid var(--border);padding:14px 0}
.nav .container{max-width:1120px;display:flex;align-items:center;gap:24px}
.nav-logo{font-size:1.2rem;font-weight:800;color:var(--text)}.nav-logo span{color:var(--primary)}
.nav-links{display:flex;gap:20px;margin-left:auto;flex-wrap:wrap}
.nav-links a{font-size:0.85rem;font-weight:500;color:var(--text-soft)}
.nav-btn{padding:7px 16px;background:var(--primary);color:#fff;border-radius:7px;font-size:0.83rem;font-weight:600}
article{padding:120px 0 80px}
h1{font-size:2rem;font-weight:800;line-height:1.3;margin-bottom:14px}
h2{font-size:1.3rem;font-weight:700;margin:36px 0 14px;padding-top:16px;border-top:1px solid var(--border)}
h3{font-size:1.05rem;font-weight:700;margin:22px 0 10px}
p{margin-bottom:14px;color:var(--text-soft)}
ul,ol{margin:0 0 14px 22px;color:var(--text-soft)}li{margin-bottom:6px}
table{width:100%;border-collapse:collapse;margin:16px 0;font-size:0.86rem}
th,td{padding:10px 12px;text-align:left;border-bottom:1px solid var(--border)}
th{font-weight:600;background:var(--surface);font-size:0.78rem;color:var(--text-muted)}
pre{background:#1e293b;color:#e2e8f0;padding:18px;border-radius:10px;overflow-x:auto;font-size:0.82rem;line-height:1.7;margin:14px 0}
code{font-family:ui-monospace,Menlo,monospace}
p code,li code{background:var(--surface);padding:2px 6px;border-radius:5px;font-size:0.85em;color:var(--primary-dark)}
.post-meta{color:var(--text-muted);font-size:0.85rem;margin-bottom:24px}
.cta{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:24px;margin:28px 0;text-align:center}
.cta a.btn{display:inline-block;padding:10px 24px;background:var(--primary);color:#fff;border-radius:8px;font-weight:600}
.post-list{list-style:none;margin:0;padding:0}
.post-list li{margin:0 0 8px}
.post-card{display:block;border:1px solid var(--border);border-radius:var(--radius);padding:20px 22px;margin-bottom:14px}
.post-card:hover{border-color:var(--primary);text-decoration:none}
.post-card h2{border:none;padding:0;margin:0 0 6px;font-size:1.15rem;color:var(--text)}
.post-card p{margin:0;color:var(--text-soft);font-size:0.9rem}
.post-card .date{color:var(--text-muted);font-size:0.8rem}
footer{background:#0f172a;color:#94a3b8;padding:28px 0;text-align:center;font-size:0.8rem}
footer a{color:#94a3b8}</style></head><body>
<nav class="nav"><div class="container"><a href="/" class="nav-logo">Fun<span>ASR</span></a><div class="nav-links"><a href="/#capabilities">核心能力</a><a href="/#usage">如何使用</a><a href="/#benchmark">性能</a><a href="/#demo">演示</a><a href="https://modelscope.github.io/FunASR/zh/" target="_blank">文档</a><a href="/quickstart.html">快速上手</a><a href="/models.html">模型</a><a href="/ecosystem.html">生态</a><a href="/blog/">技术博客</a><a href="/vs-whisper.html">对比 Whisper</a><a href="/donors.html">功德榜</a></div><a href="https://www.funasr.com/en/blog/lightweight-speech-recognition-cpu.html" style="font-size:0.83rem;font-weight:500;color:var(--text-soft)">EN</a><a href="https://github.com/modelscope/FunASR" target="_blank" class="nav-btn">GitHub ★</a></div></nav>
<article><div class="container">
<h1>轻量语音识别:在 CPU 上用约 250MB 跑中文 ASR(无需 GPU、无需 Python)</h1>
<p class="post-meta">2026-06-22 · FunASR 团队</p>
<p>大多数语音识别要 GPU、要 Python 环境、模型动辄上 GB。如果你只想在一台普通笔记本、小服务器或边缘设备上把中文转成文字,这些都太重了。</p>
<p><strong>FunASR 的 llama.cpp / GGUF 运行时</strong>把这件事压到极简:**一个自包含二进制 + 一个量化模型文件**,纯 CPU、零 Python。SenseVoice 的 q8 量化模型只有 **254MB**,精度几乎不变。</p>
<h2>实测:254MB 模型,CPU 上 0.16 秒(真实输出)</h2>
<p>下载预编译二进制(Linux/macOS/Windows)+ q8 模型,直接跑:</p>
<pre># 下二进制见 Releases;再拉模型
bash download-funasr-model.sh sensevoice ./gguf
llama-funasr-sensevoice -m ./gguf/sensevoice-small-q8.gguf --vad ./gguf/fsmn-vad.gguf -a audio.wav
# → 欢迎大家来体验达摩院推出的语音识别模型。 (CPU, 0.16s)</pre>
<p>模型 243–254MB、VAD 仅 1.7MB,内置在二进制里,无需 Python detok。</p>
<h2>又小又准:对比 whisper.cpp</h2>
<p>同样跑在 CPU 上(中文 184 集 micro-CER,越低越准):</p>
<table>
<tr><th>模型</th><th>体积</th><th>中文 CER ↓</th></tr>
<tr><td><strong>FunASR SenseVoice q8</strong></td><td><strong>254 MB</strong></td><td><strong>7.99%</strong></td></tr>
<tr><td><strong>FunASR Paraformer q8</strong></td><td><strong>237 MB</strong></td><td>9.78%</td></tr>
<tr><td>whisper.cpp small</td><td>466 MB</td><td>22.12%</td></tr>
<tr><td>whisper.cpp large-v3-turbo</td><td>1.6 GB</td><td>23.15%</td></tr>
</table>
<p>FunASR 的 q8 模型**比 whisper.cpp small 还小**,中文准确率却高约 3 倍。</p>
<h2>更小的档:量化矩阵</h2>
<table>
<tr><th>模型</th><th>档</th><th>体积</th><th>CER</th></tr>
<tr><td>SenseVoice encoder</td><td>q8</td><td>254 MB</td><td>7.99%</td></tr>
<tr><td>Paraformer encoder</td><td>q8</td><td>237 MB</td><td>9.78%</td></tr>
<tr><td>Fun-ASR-Nano LLM(另需 encoder 470MB)</td><td>q4_K_M</td><td>484 MB</td><td>8.35%</td></tr>
</table>
<p>提供 Linux x64/<strong>arm64</strong>、macOS arm64、Windows x64 预编译二进制——arm64 适合树莓派/边缘盒子等。</p>
<h2>从哪拿</h2>
<ul>
<li>预编译二进制:<a href="https://github.com/modelscope/FunASR/releases" target="_blank">GitHub Releases</a>(tag <code>runtime-llamacpp-v*</code>)</li>
<li>一站式下载与 quickstart:<a href="/llama-cpp.html">funasr.com/llama-cpp</a></li>
<li>GGUF 模型:<a href="https://huggingface.co/FunAudioLLM" target="_blank">Hugging Face</a> / <a href="https://modelscope.cn/organization/FunAudioLLM" target="_blank">ModelScope</a></li>
</ul>
<div class="cta"><p><strong>FunASR 全家桶开源、可商用</strong>。觉得有用就点个 Star 👇</p><p><a class="btn" href="https://github.com/modelscope/FunASR" target="_blank">⭐ Star FunASR</a></p><p style="margin-top:10px;font-size:0.85rem">也欢迎:<a href="https://github.com/QwenAudio/SenseVoice" target="_blank">SenseVoice</a> · <a href="https://github.com/QwenAudio/Fun-ASR" target="_blank">Fun-ASR</a> · <a href="https://github.com/modelscope/FunClip" target="_blank">FunClip</a></p></div>
<!--related-posts-->
<h2>相关文章</h2>
<ul class="post-list">
<li><a href="/blog/funasr-vs-whisper-benchmark.html">FunASR vs Whisper 实测对比</a></li>
<li><a href="/blog/sensevoice-deployment-guide.html">SenseVoice 部署指南</a></li>
<li><a href="/blog/fun-asr-nano-guide.html">Fun-ASR-Nano 使用指南</a></li>
<li><a href="/blog/funasr-speaker-diarization.html">说话人分离:谁在何时说话</a></li>
<li><a href="/blog/sensevoice-emotion-language-detection.html">情感与语种检测</a></li>
<li><a href="/blog/funasr-realtime-streaming-asr.html">实时流式语音识别</a></li>
<li><a href="/blog/funasr-transcribe-long-audio.html">转写超长音频(1小时一次搞定)</a></li>
<li><a href="/blog/funasr-cli-transcribe-command-line.html">命令行转写(文本/JSON/SRT)</a></li>
<li><a href="/blog/self-hosted-openai-whisper-api-alternative.html">自托管 OpenAI Whisper API 替代</a></li>
<li><a href="/blog/generate-subtitles-srt-vtt-from-audio-video.html">自动生成字幕(SRT / VTT)</a></li>
<li><a href="/blog/speech-to-text-python-transcribe-audio.html">Python 语音转文字教程</a></li>
<li><a href="/blog/funasr-llama-cpp-whisper-cpp-alternative.html">FunASR 跑进 llama.cpp(whisper.cpp 替代)</a></li>
<li><a href="/blog/funasr-vs-faster-whisper-chinese.html">FunASR vs faster-whisper(中文/粤语)</a></li>
<li><a href="/blog/self-hosted-deepgram-assemblyai-alternative.html">自托管替代 Deepgram/AssemblyAI</a></li>
<li><a href="/blog/which-funasr-model.html">选哪个 FunASR 模型</a></li>
<li><a href="/blog/cantonese-speech-recognition.html">粤语语音识别(SenseVoice 原生粤语)</a></li>
<li><a href="/blog/japanese-speech-recognition.html">日语语音识别(SenseVoice 转写+标点+情感)</a></li>
<li><a href="/blog/voice-activity-detection-python.html">Python 语音活动检测(VAD)</a></li>
<li><a href="/blog/self-hosted-google-aws-azure-speech-to-text.html">自托管替代 Google/AWS/Azure 云语音 API</a></li>
<li><a href="/blog/chinese-speech-recognition.html">中文语音识别(普通话)实战</a></li>
<li><a href="/blog/punctuation-restoration-python.html">标点恢复 Python 实战</a></li>
<li><a href="/blog/speech-to-text-timestamps-python.html">语音识别带时间戳(字级)</a></li>
</ul>
</div></article>
<footer><div class="container">© 2024-2026 Tongyi Lab, Alibaba Group · <a href="https://github.com/modelscope/FunASR/blob/main/LICENSE">MIT License</a></div></footer>
</body></html>
@@ -0,0 +1,136 @@
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>标点恢复(Punctuation Restoration)Python 实战:给无标点文本/ASR 结果自动加标点 | FunASR 博客</title>
<meta name="description" content="怎么给无标点的文本或语音识别结果自动加标点?FunASR ct-punc 是开源标点恢复模型,中英文双语,3 行 Python 补全 ,。?,英文还做句首大写;也能一行挂到 ASR 上。附真实实测输出。">
<meta name="keywords" content="标点恢复, 文本加标点, 标点预测, 标点符号恢复, punctuation restoration, add punctuation to text python, ct-punc, ASR 后处理, FunASR, 语音识别标点">
<link rel="icon" href="/logo.png">
<meta property="og:title" content="标点恢复(Punctuation Restoration)Python 实战:给无标点文本/ASR 结果自动加标点 | FunASR 博客">
<meta property="og:description" content="怎么给无标点的文本或语音识别结果自动加标点?FunASR ct-punc 是开源标点恢复模型,中英文双语,3 行 Python 补全 ,。?,英文还做句首大写;也能一行挂到 ASR 上。附真实实测输出。">
<meta property="og:type" content="article">
<meta property="og:url" content="https://www.funasr.com/blog/punctuation-restoration-python.html">
<meta property="og:image" content="https://www.funasr.com/logo.png">
<link rel="canonical" href="https://www.funasr.com/blog/punctuation-restoration-python.html">
<link rel="alternate" hreflang="en" href="https://www.funasr.com/en/blog/punctuation-restoration-python.html">
<link rel="alternate" hreflang="zh" href="https://www.funasr.com/blog/punctuation-restoration-python.html">
<link rel="alternate" hreflang="x-default" href="https://www.funasr.com/en/blog/punctuation-restoration-python.html">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"BlogPosting","headline":"标点恢复(Punctuation Restoration)Python 实战:给无标点文本/ASR 结果自动加标点 | FunASR 博客","description":"怎么给无标点的文本或语音识别结果自动加标点?FunASR ct-punc 是开源标点恢复模型,中英文双语,3 行 Python 补全 ,。?,英文还做句首大写;也能一行挂到 ASR 上。附真实实测输出。","datePublished":"2026-06-23","dateModified":"2026-06-23","author":{"@type":"Organization","name":"FunASR / Tongyi Lab"},"publisher":{"@type":"Organization","name":"FunASR","logo":{"@type":"ImageObject","url":"https://www.funasr.com/logo.png"}},"mainEntityOfPage":{"@type":"WebPage","@id":"https://www.funasr.com/blog/punctuation-restoration-python.html"},"image":"https://www.funasr.com/logo.png"}
</script>
<style>:root{--primary:#2563eb;--primary-dark:#1d4ed8;--bg:#fff;--surface:#f8fafc;--border:#e2e8f0;--text:#0f172a;--text-soft:#475569;--text-muted:#94a3b8;--radius:12px}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:'Inter',-apple-system,sans-serif;color:var(--text);line-height:1.7}
a{color:var(--primary);text-decoration:none}a:hover{text-decoration:underline}
.container{max-width:800px;margin:0 auto;padding:0 24px}
.nav{position:fixed;top:0;left:0;right:0;z-index:100;background:rgba(255,255,255,0.9);backdrop-filter:blur(12px);border-bottom:1px solid var(--border);padding:14px 0}
.nav .container{max-width:1120px;display:flex;align-items:center;gap:24px}
.nav-logo{font-size:1.2rem;font-weight:800;color:var(--text)}.nav-logo span{color:var(--primary)}
.nav-links{display:flex;gap:20px;margin-left:auto;flex-wrap:wrap}
.nav-links a{font-size:0.85rem;font-weight:500;color:var(--text-soft)}
.nav-btn{padding:7px 16px;background:var(--primary);color:#fff;border-radius:7px;font-size:0.83rem;font-weight:600}
article{padding:120px 0 80px}
h1{font-size:2rem;font-weight:800;line-height:1.3;margin-bottom:14px}
h2{font-size:1.3rem;font-weight:700;margin:36px 0 14px;padding-top:16px;border-top:1px solid var(--border)}
h3{font-size:1.05rem;font-weight:700;margin:22px 0 10px}
p{margin-bottom:14px;color:var(--text-soft)}
ul,ol{margin:0 0 14px 22px;color:var(--text-soft)}li{margin-bottom:6px}
table{width:100%;border-collapse:collapse;margin:16px 0;font-size:0.86rem}
th,td{padding:10px 12px;text-align:left;border-bottom:1px solid var(--border)}
th{font-weight:600;background:var(--surface);font-size:0.78rem;color:var(--text-muted)}
pre{background:#1e293b;color:#e2e8f0;padding:18px;border-radius:10px;overflow-x:auto;font-size:0.82rem;line-height:1.7;margin:14px 0}
code{font-family:ui-monospace,Menlo,monospace}
p code,li code{background:var(--surface);padding:2px 6px;border-radius:5px;font-size:0.85em;color:var(--primary-dark)}
.post-meta{color:var(--text-muted);font-size:0.85rem;margin-bottom:24px}
.cta{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:24px;margin:28px 0;text-align:center}
.cta a.btn{display:inline-block;padding:10px 24px;background:var(--primary);color:#fff;border-radius:8px;font-weight:600}
.post-list{list-style:none;margin:0;padding:0}
.post-list li{margin:0 0 8px}
.post-card{display:block;border:1px solid var(--border);border-radius:var(--radius);padding:20px 22px;margin-bottom:14px}
.post-card:hover{border-color:var(--primary);text-decoration:none}
.post-card h2{border:none;padding:0;margin:0 0 6px;font-size:1.15rem;color:var(--text)}
.post-card p{margin:0;color:var(--text-soft);font-size:0.9rem}
.post-card .date{color:var(--text-muted);font-size:0.8rem}
footer{background:#0f172a;color:#94a3b8;padding:28px 0;text-align:center;font-size:0.8rem}
footer a{color:#94a3b8}</style>
</head>
<body>
<nav class="nav"><div class="container"><a href="/" class="nav-logo">Fun<span>ASR</span></a><div class="nav-links"><a href="/#capabilities">核心能力</a><a href="/#usage">如何使用</a><a href="/#benchmark">性能</a><a href="/#demo">演示</a><a href="https://modelscope.github.io/FunASR/zh/" target="_blank">文档</a><a href="/quickstart.html">快速上手</a><a href="/models.html">模型</a><a href="/ecosystem.html">生态</a><a href="/blog/">技术博客</a><a href="/vs-whisper.html">对比 Whisper</a><a href="/donors.html">功德榜</a></div><a href="https://www.funasr.com/en/blog/punctuation-restoration-python.html" style="font-size:0.83rem;font-weight:500;color:var(--text-soft)">EN</a><a href="https://github.com/modelscope/FunASR" target="_blank" class="nav-btn">GitHub ★</a></div></nav>
<article><div class="container">
<h1>标点恢复(Punctuation Restoration)Python 实战:给无标点文本/ASR 结果自动加标点</h1>
<p class="post-meta">2026-06-23 · FunASR 团队</p>
<p>很多语音识别(ASR)模型输出的是<strong>没有标点</strong>的纯文本——一长串字读起来很费劲。<strong>标点恢复</strong>就是把"。"",""?"这些标点自动补回去,让转写结果可读。<strong>FunASR 的 <code>ct-punc</code></strong> 是一个开源的标点恢复模型,<strong>中英文都支持</strong>,3 行 Python 就能给任意文本加标点。下面全是真实实测输出。</p>
<h2>3 行代码做标点恢复(实测输出)</h2>
<pre>pip install funasr
from funasr import AutoModel
model = AutoModel(model="ct-punc", disable_update=True)
print(model.generate(input="我们都是木头人不许说话不许动")[0]["text"])
# 我们都是木头人,不许说话,不许动。</pre>
<p>输入是没有标点的连续文本,输出自动补上了逗号和句号。</p>
<h2>中英文真实示例</h2>
<table>
<tr><th>输入(无标点)</th><th>输出(ct-punc 加标点)</th></tr>
<tr><td>我们都是木头人不许说话不许动</td><td>我们都是木头人,不许说话,不许动。</td></tr>
<tr><td>今天天气怎么样我想出去走走你要一起吗</td><td>今天天气怎么样,我想出去走走,你要一起<strong>吗?</strong></td></tr>
<tr><td>the meeting is at 3 pm please bring your laptop and the report</td><td><strong>T</strong>he meeting is at 3 pm<strong>,</strong> please bring your laptop and the report<strong>.</strong></td></tr>
</table>
<p>可以看到:中文补「,。?」(问句还会自动判断用<strong>问号</strong>);英文补逗号、句号,还会把<strong>句首字母大写</strong>。同一个模型双语通吃。</p>
<h2>最常见用法:给 ASR 结果加标点</h2>
<p>标点恢复最大的用处是清洗语音识别的输出。FunASR 的 ASR 模型可以<strong>一行挂载</strong> ct-punc,识别完直接带标点:</p>
<pre>from funasr import AutoModel
# ASR + VAD + 标点,一次完成(以中文 Paraformer 为例)
model = AutoModel(model="paraformer-zh", vad_model="fsmn-vad", punc_model="ct-punc")
result = model.generate(input="audio.wav")
print(result[0]["text"]) # 输出已带标点</pre>
<p>当然你也可以像最上面那样<strong>单独</strong>用 ct-punc 处理任意文本——不限于语音,任何无标点文本(老字幕、OCR 结果、聊天记录)都能加标点。</p>
<h2>为什么用 ct-punc</h2>
<table>
<tr><th></th><th>ct-punc(FunASR)</th></tr>
<tr><td>语言</td><td>中文 + 英文(单模型双语)</td></tr>
<tr><td>用法</td><td>3 行 Python,输入文本即可;也能一行挂到 ASR 上</td></tr>
<tr><td>标点</td><td>,。?等;英文还做句首大写</td></tr>
<tr><td>许可证</td><td>开源,可商用</td></tr>
</table>
<p>想要完整的语音流程,看 <a href="/blog/chinese-speech-recognition.html">中文语音识别实战</a>、<a href="/blog/voice-activity-detection-python.html">VAD/去静音</a> 和 <a href="/blog/funasr-speaker-diarization.html">说话人分离</a>;不确定选哪个 ASR 模型看 <a href="/blog/which-funasr-model.html">模型选型指南</a>(默认推荐旗舰 Fun-ASR-Nano)。</p>
<div class="cta"><p><strong>FunASR 全家桶开源(MIT)</strong>——标点恢复、ASR、VAD、说话人、情感、LLM-ASR(旗舰 Fun-ASR-Nano),拿来即用。觉得有用就点个 Star 👇</p><p><a class="btn" href="https://github.com/modelscope/FunASR" target="_blank">⭐ Star FunASR</a></p><p style="margin-top:10px;font-size:0.85rem">也欢迎 Star:<a href="https://github.com/QwenAudio/SenseVoice" target="_blank">SenseVoice</a> · <a href="https://github.com/QwenAudio/Fun-ASR" target="_blank">Fun-ASR</a> · <a href="https://github.com/modelscope/FunClip" target="_blank">FunClip</a></p></div>
<!--related-posts-->
<h2>相关文章</h2>
<ul class="post-list">
<li><a href="/blog/funasr-vs-whisper-benchmark.html">FunASR vs Whisper 实测对比</a></li>
<li><a href="/blog/sensevoice-deployment-guide.html">SenseVoice 部署指南</a></li>
<li><a href="/blog/fun-asr-nano-guide.html">Fun-ASR-Nano 使用指南</a></li>
<li><a href="/blog/funasr-speaker-diarization.html">说话人分离:谁在何时说话</a></li>
<li><a href="/blog/sensevoice-emotion-language-detection.html">情感与语种检测</a></li>
<li><a href="/blog/funasr-realtime-streaming-asr.html">实时流式语音识别</a></li>
<li><a href="/blog/funasr-transcribe-long-audio.html">转写超长音频(1小时一次搞定)</a></li>
<li><a href="/blog/funasr-cli-transcribe-command-line.html">命令行转写(文本/JSON/SRT)</a></li>
<li><a href="/blog/self-hosted-openai-whisper-api-alternative.html">自托管 OpenAI Whisper API 替代</a></li>
<li><a href="/blog/generate-subtitles-srt-vtt-from-audio-video.html">自动生成字幕(SRT / VTT)</a></li>
<li><a href="/blog/speech-to-text-python-transcribe-audio.html">Python 语音转文字教程</a></li>
<li><a href="/blog/funasr-llama-cpp-whisper-cpp-alternative.html">FunASR 跑进 llama.cpp(whisper.cpp 替代)</a></li>
<li><a href="/blog/funasr-vs-faster-whisper-chinese.html">FunASR vs faster-whisper(中文/粤语)</a></li>
<li><a href="/blog/lightweight-speech-recognition-cpu.html">轻量语音识别(CPU 250MB)</a></li>
<li><a href="/blog/self-hosted-deepgram-assemblyai-alternative.html">自托管替代 Deepgram/AssemblyAI</a></li>
<li><a href="/blog/which-funasr-model.html">选哪个 FunASR 模型</a></li>
<li><a href="/blog/cantonese-speech-recognition.html">粤语语音识别(SenseVoice 原生粤语)</a></li>
<li><a href="/blog/japanese-speech-recognition.html">日语语音识别(SenseVoice 转写+标点+情感)</a></li>
<li><a href="/blog/voice-activity-detection-python.html">Python 语音活动检测(VAD)</a></li>
<li><a href="/blog/self-hosted-google-aws-azure-speech-to-text.html">自托管替代 Google/AWS/Azure 云语音 API</a></li>
<li><a href="/blog/chinese-speech-recognition.html">中文语音识别(普通话)实战</a></li>
<li><a href="/blog/speech-to-text-timestamps-python.html">语音识别带时间戳(字级)</a></li>
</ul>
</div></article>
<footer><div class="container">© 2024-2026 Tongyi Lab, Alibaba Group · <a href="https://github.com/modelscope/FunASR/blob/main/LICENSE">MIT License</a></div></footer>
</body>
</html>
@@ -0,0 +1,106 @@
<!DOCTYPE html>
<html lang="zh"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>自托管替代 Deepgram / AssemblyAI:开源免费的语音识别 API | FunASR 博客</title><meta name="description" content="想替代 Deepgram/AssemblyAI 这类按分钟付费的云语音识别 API?FunASR 开源免费、可自托管、音频不出本地、中文领先,自带 OpenAI 兼容 /v1/audio/transcriptions,客户端只改 base_url 即可迁移。"><meta name="keywords" content="Deepgram 替代, AssemblyAI 替代, 自托管语音识别 API, 开源语音转文字 API, 替代云语音识别, 私有化语音识别, OpenAI 兼容语音识别, FunASR"><link rel="icon" href="/logo.png">
<meta property="og:title" content="自托管替代 Deepgram / AssemblyAI:开源免费的语音识别 API | FunASR 博客"><meta property="og:description" content="想替代 Deepgram/AssemblyAI 这类按分钟付费的云语音识别 API?FunASR 开源免费、可自托管、音频不出本地、中文领先,自带 OpenAI 兼容 /v1/audio/transcriptions,客户端只改 base_url 即可迁移。"><meta property="og:type" content="article"><meta property="og:url" content="https://www.funasr.com/blog/self-hosted-deepgram-assemblyai-alternative.html"><meta property="og:image" content="https://www.funasr.com/logo.png">
<link rel="canonical" href="https://www.funasr.com/blog/self-hosted-deepgram-assemblyai-alternative.html"><link rel="alternate" hreflang="en" href="https://www.funasr.com/en/blog/self-hosted-deepgram-assemblyai-alternative.html"><link rel="alternate" hreflang="zh" href="https://www.funasr.com/blog/self-hosted-deepgram-assemblyai-alternative.html"><link rel="alternate" hreflang="x-default" href="https://www.funasr.com/en/blog/self-hosted-deepgram-assemblyai-alternative.html">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"BlogPosting","headline":"自托管替代 Deepgram / AssemblyAI:开源免费的语音识别 API | FunASR 博客","description":"想替代 Deepgram/AssemblyAI 这类按分钟付费的云语音识别 API?FunASR 开源免费、可自托管、音频不出本地、中文领先,自带 OpenAI 兼容 /v1/audio/transcriptions,客户端只改 base_url 即可迁移。","datePublished":"2026-06-23","dateModified":"2026-06-23","author":{"@type":"Organization","name":"FunASR / Tongyi Lab"},"publisher":{"@type":"Organization","name":"FunASR","logo":{"@type":"ImageObject","url":"https://www.funasr.com/logo.png"}},"mainEntityOfPage":{"@type":"WebPage","@id":"https://www.funasr.com/blog/self-hosted-deepgram-assemblyai-alternative.html"},"image":"https://www.funasr.com/logo.png"}
</script>
<style>:root{--primary:#2563eb;--primary-dark:#1d4ed8;--bg:#fff;--surface:#f8fafc;--border:#e2e8f0;--text:#0f172a;--text-soft:#475569;--text-muted:#94a3b8;--radius:12px}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:'Inter',-apple-system,sans-serif;color:var(--text);line-height:1.7}
a{color:var(--primary);text-decoration:none}a:hover{text-decoration:underline}
.container{max-width:800px;margin:0 auto;padding:0 24px}
.nav{position:fixed;top:0;left:0;right:0;z-index:100;background:rgba(255,255,255,0.9);backdrop-filter:blur(12px);border-bottom:1px solid var(--border);padding:14px 0}
.nav .container{max-width:1120px;display:flex;align-items:center;gap:24px}
.nav-logo{font-size:1.2rem;font-weight:800;color:var(--text)}.nav-logo span{color:var(--primary)}
.nav-links{display:flex;gap:20px;margin-left:auto;flex-wrap:wrap}
.nav-links a{font-size:0.85rem;font-weight:500;color:var(--text-soft)}
.nav-btn{padding:7px 16px;background:var(--primary);color:#fff;border-radius:7px;font-size:0.83rem;font-weight:600}
article{padding:120px 0 80px}
h1{font-size:2rem;font-weight:800;line-height:1.3;margin-bottom:14px}
h2{font-size:1.3rem;font-weight:700;margin:36px 0 14px;padding-top:16px;border-top:1px solid var(--border)}
h3{font-size:1.05rem;font-weight:700;margin:22px 0 10px}
p{margin-bottom:14px;color:var(--text-soft)}
ul,ol{margin:0 0 14px 22px;color:var(--text-soft)}li{margin-bottom:6px}
table{width:100%;border-collapse:collapse;margin:16px 0;font-size:0.86rem}
th,td{padding:10px 12px;text-align:left;border-bottom:1px solid var(--border)}
th{font-weight:600;background:var(--surface);font-size:0.78rem;color:var(--text-muted)}
pre{background:#1e293b;color:#e2e8f0;padding:18px;border-radius:10px;overflow-x:auto;font-size:0.82rem;line-height:1.7;margin:14px 0}
code{font-family:ui-monospace,Menlo,monospace}
p code,li code{background:var(--surface);padding:2px 6px;border-radius:5px;font-size:0.85em;color:var(--primary-dark)}
.post-meta{color:var(--text-muted);font-size:0.85rem;margin-bottom:24px}
.cta{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:24px;margin:28px 0;text-align:center}
.cta a.btn{display:inline-block;padding:10px 24px;background:var(--primary);color:#fff;border-radius:8px;font-weight:600}
.post-list{list-style:none;margin:0;padding:0}
.post-list li{margin:0 0 8px}
.post-card{display:block;border:1px solid var(--border);border-radius:var(--radius);padding:20px 22px;margin-bottom:14px}
.post-card:hover{border-color:var(--primary);text-decoration:none}
.post-card h2{border:none;padding:0;margin:0 0 6px;font-size:1.15rem;color:var(--text)}
.post-card p{margin:0;color:var(--text-soft);font-size:0.9rem}
.post-card .date{color:var(--text-muted);font-size:0.8rem}
footer{background:#0f172a;color:#94a3b8;padding:28px 0;text-align:center;font-size:0.8rem}
footer a{color:#94a3b8}
@media(max-width:900px){.nav-links{display:none}.nav .container{gap:16px}.nav-logo{margin-right:auto}h1{font-size:1.75rem}table{table-layout:fixed;font-size:0.78rem}th,td{padding:8px 4px;overflow-wrap:anywhere}p code,li code{overflow-wrap:anywhere;word-break:break-word}}
</style></head><body>
<nav class="nav"><div class="container"><a href="/" class="nav-logo">Fun<span>ASR</span></a><div class="nav-links"><a href="/#capabilities">核心能力</a><a href="/#usage">如何使用</a><a href="/#benchmark">性能</a><a href="/#demo">演示</a><a href="https://modelscope.github.io/FunASR/zh/" target="_blank">文档</a><a href="/quickstart.html">快速上手</a><a href="/models.html">模型</a><a href="/ecosystem.html">生态</a><a href="/blog/">技术博客</a><a href="/vs-whisper.html">对比 Whisper</a><a href="/donors.html">功德榜</a></div><a href="https://www.funasr.com/en/blog/self-hosted-deepgram-assemblyai-alternative.html" style="font-size:0.83rem;font-weight:500;color:var(--text-soft)">EN</a><a href="https://github.com/modelscope/FunASR" target="_blank" class="nav-btn">GitHub ★</a></div></nav>
<article><div class="container">
<h1>自托管替代 Deepgram / AssemblyAI:开源、免费、数据不出本地</h1>
<p class="post-meta">2026-06-23 · FunASR 团队</p>
<p>Deepgram、AssemblyAI、Google/Azure Speech 这类云端语音识别 API 按分钟计费,音频还得上传到第三方。如果你想<strong>自己托管、零按量费用、音频不出本地</strong>——尤其中文场景——<a href="https://github.com/modelscope/FunASR" target="_blank">FunASR</a> 是一个直接的开源替代:它自带 <strong>OpenAI 兼容的转写 API</strong>,客户端只改 base_url 即可。</p>
<h2>对比</h2>
<table>
<tr><th></th><th>FunASR(自托管)</th><th>Deepgram / AssemblyAI</th></tr>
<tr><td>价格</td><td><strong>免费(MIT),无按分钟计费</strong></td><td>按分钟付费</td></tr>
<tr><td>部署</td><td>自托管(本地/私有云/边缘)</td><td>云 API(托管)</td></tr>
<tr><td>数据隐私</td><td><strong>音频不出本地</strong></td><td>上传到供应商</td></tr>
<tr><td>中文/粤语</td><td><strong>业界领先</strong></td><td>以英文为主</td></tr>
<tr><td>接口</td><td>OpenAI 兼容(drop-in)</td><td>各自专有 SDK</td></tr>
<tr><td>离线/CPU</td><td>✅(含 <a href="/llama-cpp.html">llama.cpp 单二进制</a>)</td><td>❌ 仅云</td></tr>
</table>
<p>云 API 的优势是免运维、弹性扩缩、英文与增值功能成熟;FunASR 的优势是免费、自托管、隐私、中文。按需求取舍。</p>
<h2>起一个 OpenAI 兼容的本地 STT 服务</h2>
<pre>pip install funasr
funasr-server --model sensevoice --device cuda # 或 --device cpu
# → POST http://localhost:8000/v1/audio/transcriptions</pre>
<p>然后任何 OpenAI 客户端只改 <code>base_url</code> 即可——无需改业务代码:</p>
<pre>from openai import OpenAI
client = OpenAI(base_url="http://localhost:8000/v1", api_key="not-needed")
text = client.audio.transcriptions.create(model="sensevoice", file=open("audio.wav","rb")).text</pre>
<p>从 Deepgram/AssemblyAI 或 OpenAI Whisper API 迁移:把请求指向你自己的 funasr-server 即可,按量账单归零、数据留在本地。</p>
<h2>选模型</h2>
<p>多语种 + 情感选 SenseVoice;中文 + 时间戳/热词选 Paraformer;中英日及中文方言/口音的旗舰识别选 Fun-ASR-Nano;需要 31 语种选独立的 Fun-ASR-MLT-Nano。详见 <a href="/blog/which-funasr-model.html">选型指南</a>。</p>
<div class="cta"><p><strong>FunASR 全家桶开源、可商用、可自托管。</strong>觉得有用点个 Star 👇</p><p><a class="btn" href="https://github.com/modelscope/FunASR" target="_blank">⭐ Star FunASR</a></p><p style="margin-top:10px;font-size:0.85rem">也欢迎:<a href="https://github.com/QwenAudio/SenseVoice" target="_blank">SenseVoice</a> · <a href="https://github.com/QwenAudio/Fun-ASR" target="_blank">Fun-ASR</a> · <a href="https://github.com/modelscope/FunClip" target="_blank">FunClip</a></p></div>
<!--related-posts-->
<h2>相关文章</h2>
<ul class="post-list">
<li><a href="/blog/funasr-vs-whisper-benchmark.html">FunASR vs Whisper 实测对比</a></li>
<li><a href="/blog/sensevoice-deployment-guide.html">SenseVoice 部署指南</a></li>
<li><a href="/blog/fun-asr-nano-guide.html">Fun-ASR-Nano 使用指南</a></li>
<li><a href="/blog/funasr-speaker-diarization.html">说话人分离:谁在何时说话</a></li>
<li><a href="/blog/sensevoice-emotion-language-detection.html">情感与语种检测</a></li>
<li><a href="/blog/funasr-realtime-streaming-asr.html">实时流式语音识别</a></li>
<li><a href="/blog/funasr-transcribe-long-audio.html">转写超长音频(1小时一次搞定)</a></li>
<li><a href="/blog/funasr-cli-transcribe-command-line.html">命令行转写(文本/JSON/SRT)</a></li>
<li><a href="/blog/self-hosted-openai-whisper-api-alternative.html">自托管 OpenAI Whisper API 替代</a></li>
<li><a href="/blog/generate-subtitles-srt-vtt-from-audio-video.html">自动生成字幕(SRT / VTT)</a></li>
<li><a href="/blog/speech-to-text-python-transcribe-audio.html">Python 语音转文字教程</a></li>
<li><a href="/blog/funasr-llama-cpp-whisper-cpp-alternative.html">FunASR 跑进 llama.cpp(whisper.cpp 替代)</a></li>
<li><a href="/blog/funasr-vs-faster-whisper-chinese.html">FunASR vs faster-whisper(中文/粤语)</a></li>
<li><a href="/blog/lightweight-speech-recognition-cpu.html">轻量语音识别(CPU 250MB)</a></li>
<li><a href="/blog/which-funasr-model.html">选哪个 FunASR 模型</a></li>
<li><a href="/blog/cantonese-speech-recognition.html">粤语语音识别(SenseVoice 原生粤语)</a></li>
<li><a href="/blog/japanese-speech-recognition.html">日语语音识别(SenseVoice 转写+标点+情感)</a></li>
<li><a href="/blog/voice-activity-detection-python.html">Python 语音活动检测(VAD)</a></li>
<li><a href="/blog/self-hosted-google-aws-azure-speech-to-text.html">自托管替代 Google/AWS/Azure 云语音 API</a></li>
<li><a href="/blog/chinese-speech-recognition.html">中文语音识别(普通话)实战</a></li>
<li><a href="/blog/punctuation-restoration-python.html">标点恢复 Python 实战</a></li>
<li><a href="/blog/speech-to-text-timestamps-python.html">语音识别带时间戳(字级)</a></li>
</ul>
</div></article>
<footer><div class="container">© 2024-2026 Tongyi Lab, Alibaba Group · <a href="https://github.com/modelscope/FunASR/blob/main/LICENSE">MIT License</a></div></footer>
</body></html>
@@ -0,0 +1,147 @@
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>自托管语音转文字:Google / AWS / Azure 云语音 API 的免费开源替代(FunASR)| FunASR 博客</title>
<meta name="description" content="想替代 Google Cloud Speech-to-Text / AWS Transcribe / Azure Speech?FunASR 是开源免费(MIT)的自托管语音转文字方案:本地推理、不按分钟计费、数据不出内网、中文强,且 OpenAI 兼容、改 base_url 即可迁移。附实测代码与成本对比。">
<meta name="keywords" content="自托管语音识别, Google Speech-to-Text 替代, AWS Transcribe 替代, Azure Speech 替代, 云语音API替代, 开源语音转文字, 离线语音识别, FunASR, 语音转文字 自托管, speech to text self hosted">
<link rel="icon" href="/logo.png">
<meta property="og:title" content="自托管语音转文字:Google / AWS / Azure 云语音 API 的免费开源替代(FunASR)| FunASR 博客">
<meta property="og:description" content="想替代 Google Cloud Speech-to-Text / AWS Transcribe / Azure Speech?FunASR 是开源免费(MIT)的自托管语音转文字方案:本地推理、不按分钟计费、数据不出内网、中文强,且 OpenAI 兼容、改 base_url 即可迁移。附实测代码与成本对比。">
<meta property="og:type" content="article">
<meta property="og:url" content="https://www.funasr.com/blog/self-hosted-google-aws-azure-speech-to-text.html">
<meta property="og:image" content="https://www.funasr.com/logo.png">
<link rel="canonical" href="https://www.funasr.com/blog/self-hosted-google-aws-azure-speech-to-text.html">
<link rel="alternate" hreflang="en" href="https://www.funasr.com/en/blog/self-hosted-google-aws-azure-speech-to-text.html">
<link rel="alternate" hreflang="zh" href="https://www.funasr.com/blog/self-hosted-google-aws-azure-speech-to-text.html">
<link rel="alternate" hreflang="x-default" href="https://www.funasr.com/en/blog/self-hosted-google-aws-azure-speech-to-text.html">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"BlogPosting","headline":"自托管语音转文字:Google / AWS / Azure 云语音 API 的免费开源替代(FunASR)| FunASR 博客","description":"想替代 Google Cloud Speech-to-Text / AWS Transcribe / Azure Speech?FunASR 是开源免费(MIT)的自托管语音转文字方案:本地推理、不按分钟计费、数据不出内网、中文强,且 OpenAI 兼容、改 base_url 即可迁移。附实测代码与成本对比。","datePublished":"2026-06-22","dateModified":"2026-06-22","author":{"@type":"Organization","name":"FunASR / Tongyi Lab"},"publisher":{"@type":"Organization","name":"FunASR","logo":{"@type":"ImageObject","url":"https://www.funasr.com/logo.png"}},"mainEntityOfPage":{"@type":"WebPage","@id":"https://www.funasr.com/blog/self-hosted-google-aws-azure-speech-to-text.html"},"image":"https://www.funasr.com/logo.png"}
</script>
<style>:root{--primary:#2563eb;--primary-dark:#1d4ed8;--bg:#fff;--surface:#f8fafc;--border:#e2e8f0;--text:#0f172a;--text-soft:#475569;--text-muted:#94a3b8;--radius:12px}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:'Inter',-apple-system,sans-serif;color:var(--text);line-height:1.7}
a{color:var(--primary);text-decoration:none}a:hover{text-decoration:underline}
.container{max-width:800px;margin:0 auto;padding:0 24px}
.nav{position:fixed;top:0;left:0;right:0;z-index:100;background:rgba(255,255,255,0.9);backdrop-filter:blur(12px);border-bottom:1px solid var(--border);padding:14px 0}
.nav .container{max-width:1120px;display:flex;align-items:center;gap:24px}
.nav-logo{font-size:1.2rem;font-weight:800;color:var(--text)}.nav-logo span{color:var(--primary)}
.nav-links{display:flex;gap:20px;margin-left:auto;flex-wrap:wrap}
.nav-links a{font-size:0.85rem;font-weight:500;color:var(--text-soft)}
.nav-btn{padding:7px 16px;background:var(--primary);color:#fff;border-radius:7px;font-size:0.83rem;font-weight:600}
article{padding:120px 0 80px}
h1{font-size:2rem;font-weight:800;line-height:1.3;margin-bottom:14px}
h2{font-size:1.3rem;font-weight:700;margin:36px 0 14px;padding-top:16px;border-top:1px solid var(--border)}
h3{font-size:1.05rem;font-weight:700;margin:22px 0 10px}
p{margin-bottom:14px;color:var(--text-soft)}
ul,ol{margin:0 0 14px 22px;color:var(--text-soft)}li{margin-bottom:6px}
table{width:100%;border-collapse:collapse;margin:16px 0;font-size:0.86rem}
th,td{padding:10px 12px;text-align:left;border-bottom:1px solid var(--border)}
th{font-weight:600;background:var(--surface);font-size:0.78rem;color:var(--text-muted)}
pre{background:#1e293b;color:#e2e8f0;padding:18px;border-radius:10px;overflow-x:auto;font-size:0.82rem;line-height:1.7;margin:14px 0}
code{font-family:ui-monospace,Menlo,monospace}
p code,li code{background:var(--surface);padding:2px 6px;border-radius:5px;font-size:0.85em;color:var(--primary-dark)}
.post-meta{color:var(--text-muted);font-size:0.85rem;margin-bottom:24px}
.cta{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:24px;margin:28px 0;text-align:center}
.cta a.btn{display:inline-block;padding:10px 24px;background:var(--primary);color:#fff;border-radius:8px;font-weight:600}
.post-list{list-style:none;margin:0;padding:0}
.post-list li{margin:0 0 8px}
.post-card{display:block;border:1px solid var(--border);border-radius:var(--radius);padding:20px 22px;margin-bottom:14px}
.post-card:hover{border-color:var(--primary);text-decoration:none}
.post-card h2{border:none;padding:0;margin:0 0 6px;font-size:1.15rem;color:var(--text)}
.post-card p{margin:0;color:var(--text-soft);font-size:0.9rem}
.post-card .date{color:var(--text-muted);font-size:0.8rem}
footer{background:#0f172a;color:#94a3b8;padding:28px 0;text-align:center;font-size:0.8rem}
footer a{color:#94a3b8}</style>
</head>
<body>
<nav class="nav"><div class="container"><a href="/" class="nav-logo">Fun<span>ASR</span></a><div class="nav-links"><a href="/#capabilities">核心能力</a><a href="/#usage">如何使用</a><a href="/#benchmark">性能</a><a href="/#demo">演示</a><a href="https://modelscope.github.io/FunASR/zh/" target="_blank">文档</a><a href="/quickstart.html">快速上手</a><a href="/models.html">模型</a><a href="/ecosystem.html">生态</a><a href="/blog/">技术博客</a><a href="/vs-whisper.html">对比 Whisper</a><a href="/donors.html">功德榜</a></div><a href="https://www.funasr.com/en/blog/self-hosted-google-aws-azure-speech-to-text.html" style="font-size:0.83rem;font-weight:500;color:var(--text-soft)">EN</a><a href="https://github.com/modelscope/FunASR" target="_blank" class="nav-btn">GitHub ★</a></div></nav>
<article><div class="container">
<h1>自托管语音转文字:Google / AWS / Azure 云语音 API 的免费开源替代</h1>
<p class="post-meta">2026-06-22 · FunASR 团队</p>
<p>Google Cloud Speech-to-Text、AWS Transcribe、Azure Speech 这些云语音 API 很好用——全托管、自动扩容、免运维。但当用量上去、或对数据合规有要求时,它们的短板也很明显:<strong>按分钟计费(规模化后很贵)、音频要上传到厂商云(隐私/合规/数据驻留问题)、有速率限制、离不开网络、难以定制</strong>。</p>
<p><strong>FunASR</strong>(通义实验室开源)是一个成熟的自托管替代:<strong>开源免费(MIT,可商用)、跑在你自己的机器上(可完全离线)、不按分钟计费、数据不出内网</strong>,中文与亚洲语种尤其强,并提供 <strong>OpenAI 兼容接口</strong>,迁移成本极低。下面是真实可跑的上手代码。</p>
<h2>4 行代码,本地转写(实测输出)</h2>
<pre>pip install funasr
from funasr import AutoModel
from funasr.utils.postprocess_utils import rich_transcription_postprocess
model = AutoModel(model="iic/SenseVoiceSmall", disable_update=True) # 没 GPU 自动用 CPU
res = model.generate(input="audio.wav", language="auto", use_itn=True)
print(rich_transcription_postprocess(res[0]["text"]))
# 欢迎大家来体验达摩院推出的语音识别模型。</pre>
<p>模型首次运行自动下载,之后全程在本地推理——<strong>没有 API key、没有按分钟账单、音频不上传任何云</strong>。</p>
<h2>已经在用云 API?换 base_url 即可迁移</h2>
<p>FunASR 自带 <strong>OpenAI 兼容的转写服务</strong>,如果你的应用已经在调云厂商 SDK,通常只需把 <code>base_url</code> 指向自己的服务:</p>
<pre># 起一个本地服务(OpenAI 兼容 /v1/audio/transcriptions)
funasr-server --model sensevoice --device cuda
# 客户端:OpenAI SDK 直接连本地,改一行 base_url
from openai import OpenAI
client = OpenAI(base_url="http://localhost:8000/v1", api_key="not-needed")
text = client.audio.transcriptions.create(model="sensevoice", file=open("audio.wav","rb")).text</pre>
<h2>FunASR vs 云语音 API</h2>
<table>
<tr><th></th><th>FunASR(自托管)</th><th>云 STT(Google/AWS/Azure)</th></tr>
<tr><td>计费</td><td>开源免费,只有固定机器成本</td><td>按分钟计费,随用量线性增长</td></tr>
<tr><td>数据</td><td>留在你自己服务器(可离线)</td><td>音频上传到厂商云</td></tr>
<tr><td>部署</td><td>自己跑(pip / Docker)</td><td>全托管,零运维</td></tr>
<tr><td>语种</td><td>50+,中文/亚洲语种很强</td><td>多语种(各厂不同)</td></tr>
<tr><td>说话人分离</td><td>✅ 内置(cam++)</td><td>✅(额外计费/配置)</td></tr>
<tr><td>情感 / 音频事件</td><td>✅(SenseVoice)</td><td>多数 ❌</td></tr>
<tr><td>定制 / 微调</td><td>✅ 完整模型权限</td><td>有限</td></tr>
<tr><td>离线 / 内网隔离</td><td>✅</td><td>❌</td></tr>
<tr><td>许可证</td><td>开源,可商用</td><td>闭源</td></tr>
</table>
<p>需要说句公道话:如果你要的是<strong>零运维、按需弹性、不想管机器</strong>,托管云 API 仍然是省心之选。FunASR 的取舍是——你用一台自己的机器,换来<strong>可控成本、数据私有、可离线、可定制</strong>。</p>
<h2>什么时候自托管更划算</h2>
<p>云 STT 一般按音频分钟计费(各厂/各档大致 <strong>每音频小时 $0.6 ~ $1.5</strong>)。也就是说处理 <strong>1000 小时/月</strong>大约 $600 ~ $1500/月,且随用量线性上涨;而一台自托管 FunASR 实例是<strong>固定的机器成本,与转写量基本无关</strong>。当你满足以下任一条,自托管通常更优:</p>
<ul>
<li><strong>用量大</strong>:每月音频时长高,按分钟计费的账单远超一台机器的成本;</li>
<li><strong>数据敏感</strong>:医疗/金融/政企,音频不能离开内网;</li>
<li><strong>需离线 / 内网隔离</strong>的部署环境;</li>
<li><strong>中文/方言/亚洲语种</strong>为主,想要更强的本土效果与可定制性。</li>
</ul>
<p>想进一步看:与 OpenAI Whisper API 的对比见 <a href="/blog/self-hosted-openai-whisper-api-alternative.html">自托管 Whisper API 替代</a>;与 Deepgram/AssemblyAI 的对比见 <a href="/blog/self-hosted-deepgram-assemblyai-alternative.html">Deepgram/AssemblyAI 替代</a>;中文准确率见 <a href="/blog/funasr-vs-whisper-benchmark.html">FunASR vs Whisper benchmark</a>;不确定选哪个模型看 <a href="/blog/which-funasr-model.html">模型选型指南</a>。</p>
<div class="cta"><p><strong>FunASR 全家桶都是开源的(MIT)</strong>——工业级 ASR / VAD / 标点 / 说话人 / 情感事件 / LLM-ASR,自托管、可商用。觉得有用就点个 Star 支持一下 👇</p><p><a class="btn" href="https://github.com/modelscope/FunASR" target="_blank">⭐ Star FunASR</a></p><p style="margin-top:10px;font-size:0.85rem">也欢迎 Star:<a href="https://github.com/QwenAudio/SenseVoice" target="_blank">SenseVoice</a> · <a href="https://github.com/QwenAudio/Fun-ASR" target="_blank">Fun-ASR</a> · <a href="https://github.com/modelscope/FunClip" target="_blank">FunClip</a></p></div>
<!--related-posts-->
<h2>相关文章</h2>
<ul class="post-list">
<li><a href="/blog/funasr-vs-whisper-benchmark.html">FunASR vs Whisper 实测对比</a></li>
<li><a href="/blog/sensevoice-deployment-guide.html">SenseVoice 部署指南</a></li>
<li><a href="/blog/fun-asr-nano-guide.html">Fun-ASR-Nano 使用指南</a></li>
<li><a href="/blog/funasr-speaker-diarization.html">说话人分离:谁在何时说话</a></li>
<li><a href="/blog/sensevoice-emotion-language-detection.html">情感与语种检测</a></li>
<li><a href="/blog/funasr-realtime-streaming-asr.html">实时流式语音识别</a></li>
<li><a href="/blog/funasr-transcribe-long-audio.html">转写超长音频(1小时一次搞定)</a></li>
<li><a href="/blog/funasr-cli-transcribe-command-line.html">命令行转写(文本/JSON/SRT)</a></li>
<li><a href="/blog/self-hosted-openai-whisper-api-alternative.html">自托管 OpenAI Whisper API 替代</a></li>
<li><a href="/blog/generate-subtitles-srt-vtt-from-audio-video.html">自动生成字幕(SRT / VTT)</a></li>
<li><a href="/blog/speech-to-text-python-transcribe-audio.html">Python 语音转文字教程</a></li>
<li><a href="/blog/funasr-llama-cpp-whisper-cpp-alternative.html">FunASR 跑进 llama.cpp(whisper.cpp 替代)</a></li>
<li><a href="/blog/funasr-vs-faster-whisper-chinese.html">FunASR vs faster-whisper(中文/粤语)</a></li>
<li><a href="/blog/lightweight-speech-recognition-cpu.html">轻量语音识别(CPU 250MB)</a></li>
<li><a href="/blog/self-hosted-deepgram-assemblyai-alternative.html">自托管替代 Deepgram/AssemblyAI</a></li>
<li><a href="/blog/which-funasr-model.html">选哪个 FunASR 模型</a></li>
<li><a href="/blog/cantonese-speech-recognition.html">粤语语音识别(SenseVoice 原生粤语)</a></li>
<li><a href="/blog/japanese-speech-recognition.html">日语语音识别(SenseVoice 转写+标点+情感)</a></li>
<li><a href="/blog/voice-activity-detection-python.html">Python 语音活动检测(VAD)</a></li>
<li><a href="/blog/chinese-speech-recognition.html">中文语音识别(普通话)实战</a></li>
<li><a href="/blog/punctuation-restoration-python.html">标点恢复 Python 实战</a></li>
<li><a href="/blog/speech-to-text-timestamps-python.html">语音识别带时间戳(字级)</a></li>
</ul>
</div></article>
<footer><div class="container">© 2024-2026 Tongyi Lab, Alibaba Group · <a href="https://github.com/modelscope/FunASR/blob/main/LICENSE">MIT License</a></div></footer>
</body>
</html>
@@ -0,0 +1,151 @@
<!DOCTYPE html>
<html lang="zh"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>自托管 OpenAI Whisper API 替代方案:FunASR 一行起兼容 /v1/audio/transcriptions 服务 | FunASR</title><meta name="description" content="用 FunASR 起一个 OpenAI 兼容的语音转文字服务:`funasr-server` 暴露 /v1/audio/transcriptions,OpenAI SDK 只改 base_url 就能用。本地、免费、隐私,中文更准,比 Whisper 快。全部代码实测。"><meta name="keywords" content="openai whisper api 替代, 自托管语音识别api, openai 语音转文字 api, /v1/audio/transcriptions, whisper api self hosted, openai 兼容 asr, 本地语音转文字服务, funasr server, 替代 openai whisper api, 私有化部署语音识别">
<link rel="icon" href="/logo.png"><meta property="og:title" content="自托管 OpenAI Whisper API 替代方案:FunASR 一行起兼容 /v1/audio/transcriptions 服务"><meta property="og:description" content="用 FunASR 起一个 OpenAI 兼容的语音转文字服务:`funasr-server` 暴露 /v1/audio/transcriptions,OpenAI SDK 只改 base_url 就能用。本地、免费、隐私,中文更准,比 Whisper 快。全部代码实测。">
<meta property="og:type" content="article"><meta property="og:url" content="https://www.funasr.com/blog/self-hosted-openai-whisper-api-alternative.html"><meta property="og:image" content="https://www.funasr.com/logo.png">
<link rel="canonical" href="https://www.funasr.com/blog/self-hosted-openai-whisper-api-alternative.html"><link rel="alternate" hreflang="en" href="https://www.funasr.com/en/blog/self-hosted-openai-whisper-api-alternative.html"><link rel="alternate" hreflang="zh" href="https://www.funasr.com/blog/self-hosted-openai-whisper-api-alternative.html"><link rel="alternate" hreflang="x-default" href="https://www.funasr.com/en/blog/self-hosted-openai-whisper-api-alternative.html">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"BlogPosting","headline":"自托管 OpenAI Whisper API 替代方案:FunASR 一行起兼容 /v1/audio/transcriptions 服务","description":"用 FunASR 起一个 OpenAI 兼容的语音转文字服务:`funasr-server` 暴露 /v1/audio/transcriptions,OpenAI SDK 只改 base_url 就能用。本地、免费、隐私,中文更准,比 Whisper 快。全部代码实测。","datePublished":"2026-06-18","dateModified":"2026-06-18","author":{"@type":"Organization","name":"FunASR / Tongyi Lab"},"publisher":{"@type":"Organization","name":"FunASR","logo":{"@type":"ImageObject","url":"https://www.funasr.com/logo.png"}},"mainEntityOfPage":{"@type":"WebPage","@id":"https://www.funasr.com/blog/self-hosted-openai-whisper-api-alternative.html"},"image":"https://www.funasr.com/logo.png"}
</script>
<style>:root{--primary:#2563eb;--primary-dark:#1d4ed8;--bg:#fff;--surface:#f8fafc;--border:#e2e8f0;--text:#0f172a;--text-soft:#475569;--text-muted:#94a3b8;--radius:12px}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:'Inter',-apple-system,sans-serif;color:var(--text);line-height:1.7}
a{color:var(--primary);text-decoration:none}a:hover{text-decoration:underline}
.container{max-width:800px;margin:0 auto;padding:0 24px}
.nav{position:fixed;top:0;left:0;right:0;z-index:100;background:rgba(255,255,255,0.9);backdrop-filter:blur(12px);border-bottom:1px solid var(--border);padding:14px 0}
.nav .container{max-width:1120px;display:flex;align-items:center;gap:24px}
.nav-logo{font-size:1.2rem;font-weight:800;color:var(--text)}.nav-logo span{color:var(--primary)}
.nav-links{display:flex;gap:20px;margin-left:auto;flex-wrap:wrap}
.nav-links a{font-size:0.85rem;font-weight:500;color:var(--text-soft)}
.nav-btn{padding:7px 16px;background:var(--primary);color:#fff;border-radius:7px;font-size:0.83rem;font-weight:600}
article{padding:120px 0 80px}
h1{font-size:2rem;font-weight:800;line-height:1.3;margin-bottom:14px}
h2{font-size:1.3rem;font-weight:700;margin:36px 0 14px;padding-top:16px;border-top:1px solid var(--border)}
h3{font-size:1.05rem;font-weight:700;margin:22px 0 10px}
p{margin-bottom:14px;color:var(--text-soft)}
ul,ol{margin:0 0 14px 22px;color:var(--text-soft)}li{margin-bottom:6px}
table{width:100%;border-collapse:collapse;margin:16px 0;font-size:0.86rem}
th,td{padding:10px 12px;text-align:left;border-bottom:1px solid var(--border)}
th{font-weight:600;background:var(--surface);font-size:0.78rem;color:var(--text-muted)}
pre{background:#1e293b;color:#e2e8f0;padding:18px;border-radius:10px;overflow-x:auto;font-size:0.82rem;line-height:1.7;margin:14px 0}
code{font-family:ui-monospace,Menlo,monospace}
p code,li code{background:var(--surface);padding:2px 6px;border-radius:5px;font-size:0.85em;color:var(--primary-dark)}
.post-meta{color:var(--text-muted);font-size:0.85rem;margin-bottom:24px}
.cta{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:24px;margin:28px 0;text-align:center}
.cta a.btn{display:inline-block;padding:10px 24px;background:var(--primary);color:#fff;border-radius:8px;font-weight:600}
.post-list{list-style:none;margin:0;padding:0}
.post-list li{margin:0 0 8px}
.post-card{display:block;border:1px solid var(--border);border-radius:var(--radius);padding:20px 22px;margin-bottom:14px}
.post-card:hover{border-color:var(--primary);text-decoration:none}
.post-card h2{border:none;padding:0;margin:0 0 6px;font-size:1.15rem;color:var(--text)}
.post-card p{margin:0;color:var(--text-soft);font-size:0.9rem}
.post-card .date{color:var(--text-muted);font-size:0.8rem}
footer{background:#0f172a;color:#94a3b8;padding:28px 0;text-align:center;font-size:0.8rem}
footer a{color:#94a3b8}
@media(max-width:900px){.nav-links{display:none}.nav .container{gap:16px}.nav-logo{margin-right:auto}h1{font-size:1.75rem}table{table-layout:fixed;font-size:0.78rem}th,td{padding:8px 4px;overflow-wrap:anywhere}p code,li code{overflow-wrap:anywhere;word-break:break-word}}
</style></head><body>
<nav class="nav"><div class="container"><a href="/" class="nav-logo">Fun<span>ASR</span></a><div class="nav-links"><a href="/#capabilities">核心能力</a><a href="/#usage">如何使用</a><a href="/#benchmark">性能</a><a href="/#demo">演示</a><a href="https://modelscope.github.io/FunASR/zh/" target="_blank">文档</a><a href="/quickstart.html">快速上手</a><a href="/models.html">模型</a><a href="/ecosystem.html">生态</a><a href="/blog/">技术博客</a><a href="/vs-whisper.html">对比 Whisper</a><a href="/donors.html">功德榜</a></div><a href="https://www.funasr.com/en/blog/self-hosted-openai-whisper-api-alternative.html" style="font-size:0.83rem;font-weight:600;color:var(--text-soft)">EN</a><a href="https://github.com/modelscope/FunASR" target="_blank" class="nav-btn">GitHub ★</a></div></nav>
<article><div class="container">
<h1>自托管 OpenAI Whisper API 替代方案:FunASR 一行起兼容 /v1/audio/transcriptions 服务</h1>
<p class="post-meta">FunASR 技术博客 · 2026-06-18 · 教程</p>
<p>OpenAI 的 <code>/v1/audio/transcriptions</code>(Whisper API)按分钟计费、要把音频上传到云端、还有速率限制。如果你只是想把音频转成文字,完全可以在自己机器上起一个<strong>接口完全一致</strong>的服务——已有代码只改一个 <code>base_url</code> 就能切过来。FunASR 自带的 <code>funasr-server</code> 就是干这个的。下面每段代码都实测过。</p>
<h2>一行启动 OpenAI 兼容服务</h2>
<pre><code>pip install -U funasr
funasr-server --model sensevoice --device cuda # 监听 localhost:8000</code></pre>
<p>启动后就有了和 OpenAI 一致的两个端点:<code>POST /v1/audio/transcriptions</code> 和 <code>GET /v1/models</code>。</p>
<h2>用 OpenAI 官方 SDK 直接调(只改 base_url)</h2>
<p>你原来调 OpenAI 的代码,几乎一字不改,只把 <code>base_url</code> 指到本地服务、<code>api_key</code> 随便填:</p>
<pre><code>from openai import OpenAI
client = OpenAI(base_url="http://localhost:8000/v1", api_key="not-needed")
with open("audio.wav", "rb") as f:
r = client.audio.transcriptions.create(model="sensevoice", file=f)
print(r.text)
# -&gt; 欢迎大家来体验达摩院推出的语音识别模型</code></pre>
<p>列出可用模型也和 OpenAI 一样:</p>
<pre><code>print([m.id for m in client.models.list().data])
# -&gt; ['fun-asr-nano', 'sensevoice', 'paraformer']</code></pre>
<h2>或者用 curl / 任意 HTTP 客户端</h2>
<pre><code>curl http://localhost:8000/v1/audio/transcriptions \
-F "[email protected]" \
-F "model=sensevoice"
# -&gt; {"text": "欢迎大家来体验达摩院推出的语音识别模型"}</code></pre>
<p>因为接口是 OpenAI 兼容的,Node 的 <code>openai</code> 包、LangChain、各种现成 SDK 都能直接连。</p>
<h2>对比:OpenAI Whisper API vs FunASR 自托管</h2>
<table><thead><tr><th></th><th>OpenAI Whisper API</th><th>FunASR 自托管</th></tr></thead><tbody>
<tr><td>费用</td><td>$0.006 / 分钟</td><td>免费(自己的机器)</td></tr>
<tr><td>数据隐私</td><td>音频上传到云端</td><td>不出本地</td></tr>
<tr><td>速率限制</td><td>有</td><td>无</td></tr>
<tr><td>中文准确率</td><td>一般</td><td>更高(<a href="/blog/funasr-vs-whisper-benchmark.html">实测对比</a>)</td></tr>
<tr><td>速度</td><td>—</td><td>SenseVoice 非自回归,远快于 Whisper</td></tr>
<tr><td>接口</td><td>/v1/audio/transcriptions</td><td>完全一致</td></tr>
</tbody></table>
<h2>选哪个模型</h2>
<ul>
<li><code>sensevoice</code> —— 默认,非自回归,极快,50+ 语言,带情感/事件;日常首选。</li>
<li><code>fun-asr-nano</code> —— LLM 解码,面向中英日及中文方言/口音的旗舰模型(需要 vLLM)。</li>
<li>需要 31 语种 —— 部署独立的 <code>FunAudioLLM/Fun-ASR-MLT-Nano-2512</code> checkpoint。</li>
<li><code>paraformer</code> —— 经典中文生产级,稳。</li>
</ul>
<p>请求里把 <code>model=</code> 换成对应名字即可,无需重启服务。</p>
<h2>从 OpenAI 迁移要改什么</h2>
<ul>
<li><strong>base_url</strong>:指到你的 <code>funasr-server</code>。</li>
<li><strong>api_key</strong>:本地服务不校验,随便填一个非空值。</li>
<li><strong>其余不变</strong>:<code>client.audio.transcriptions.create(...)</code> 的调用方式一致。</li>
</ul>
<h2>在 Open-WebUI 里把语音输入接到 FunASR</h2>
<p><strong>Open-WebUI</strong>(15 万星的自托管 LLM 界面)的语音转文字(STT)支持任意 OpenAI 兼容端点。既然 <code>funasr-server</code> 本身就是 OpenAI 兼容的,直接指过去即可——<strong>无需插件、无需改 Open-WebUI 代码</strong>,中文识别比内置 Whisper 更准,而且本地、免费、隐私。</p>
<p>① 起 FunASR 服务(同上):</p>
<pre>funasr-server --model sensevoice --device cuda # 监听 localhost:8000</pre>
<p>② Open-WebUI 里:<strong>管理面板 → 设置 → 音频 → 语音转文本</strong>,引擎选 <strong>OpenAI</strong>,填:</p>
<ul>
<li>API Base URL:<code>http://localhost:8000/v1</code>(Open-WebUI 在 Docker、FunASR 在宿主机时用 <code>http://host.docker.internal:8000/v1</code>)</li>
<li>API Key:任意非空(funasr-server 不校验)</li>
<li>STT Model:<code>sensevoice</code>(或 <code>paraformer</code> / <code>fun-asr-nano</code>)</li>
</ul>
<p>用 Docker Compose 部署等价于这几个环境变量:</p>
<pre>AUDIO_STT_ENGINE=openai
AUDIO_STT_OPENAI_API_BASE_URL=http://host.docker.internal:8000/v1
AUDIO_STT_OPENAI_API_KEY=funasr
AUDIO_STT_MODEL=sensevoice</pre>
<p>之后 Open-WebUI 的麦克风语音输入就走 FunASR 了——中文转写更准、数据不出本地。同样的配置适用于任何"支持自定义 OpenAI STT 端点"的工具(LibreChat、AnythingLLM 等)。</p>
<div class="cta"><p>FunASR 是通义实验室开源的工业级语音识别工具包。</p><a class="btn" href="https://github.com/modelscope/FunASR" target="_blank">在 GitHub 上 Star FunASR ★</a></div>
<!--related-posts-->
<h2>相关文章</h2>
<ul class="post-list">
<li><a href="/blog/funasr-vs-whisper-benchmark.html">FunASR vs Whisper 实测对比</a></li>
<li><a href="/blog/sensevoice-deployment-guide.html">SenseVoice 部署指南</a></li>
<li><a href="/blog/fun-asr-nano-guide.html">Fun-ASR-Nano 使用指南</a></li>
<li><a href="/blog/funasr-speaker-diarization.html">说话人分离:谁在何时说话</a></li>
<li><a href="/blog/sensevoice-emotion-language-detection.html">情感与语种检测</a></li>
<li><a href="/blog/funasr-realtime-streaming-asr.html">实时流式语音识别</a></li>
<li><a href="/blog/funasr-transcribe-long-audio.html">转写超长音频(1小时一次搞定)</a></li>
<li><a href="/blog/funasr-cli-transcribe-command-line.html">命令行转写(文本/JSON/SRT)</a></li>
<li><a href="/blog/generate-subtitles-srt-vtt-from-audio-video.html">自动生成字幕(SRT / VTT)</a></li>
<li><a href="/blog/speech-to-text-python-transcribe-audio.html">Python 语音转文字教程</a></li>
<li><a href="/blog/funasr-llama-cpp-whisper-cpp-alternative.html">FunASR 跑进 llama.cpp(whisper.cpp 替代)</a></li>
<li><a href="/blog/funasr-vs-faster-whisper-chinese.html">FunASR vs faster-whisper(中文/粤语)</a></li>
<li><a href="/blog/lightweight-speech-recognition-cpu.html">轻量语音识别(CPU 250MB)</a></li>
<li><a href="/blog/self-hosted-deepgram-assemblyai-alternative.html">自托管替代 Deepgram/AssemblyAI</a></li>
<li><a href="/blog/which-funasr-model.html">选哪个 FunASR 模型</a></li>
<li><a href="/blog/cantonese-speech-recognition.html">粤语语音识别(SenseVoice 原生粤语)</a></li>
<li><a href="/blog/japanese-speech-recognition.html">日语语音识别(SenseVoice 转写+标点+情感)</a></li>
<li><a href="/blog/voice-activity-detection-python.html">Python 语音活动检测(VAD)</a></li>
<li><a href="/blog/self-hosted-google-aws-azure-speech-to-text.html">自托管替代 Google/AWS/Azure 云语音 API</a></li>
<li><a href="/blog/chinese-speech-recognition.html">中文语音识别(普通话)实战</a></li>
<li><a href="/blog/punctuation-restoration-python.html">标点恢复 Python 实战</a></li>
<li><a href="/blog/speech-to-text-timestamps-python.html">语音识别带时间戳(字级)</a></li>
</ul>
</div></article>
<footer><div class="container">FunASR · 通义实验室开源语音识别 · <a href="https://github.com/modelscope/FunASR">GitHub</a></div></footer>
</body></html>
@@ -0,0 +1,159 @@
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>SenseVoice 部署指南:比 Whisper 快 15 倍的多语言语音识别 | FunASR 博客</title>
<meta name="description" content="SenseVoice 部署完整教程:3 行 Python 代码跑通多语言语音识别,含语种/情感/音频事件检测、VAD 长音频分段、GPU/CPU 选择。比 Whisper 快 15 倍的开源 ASR。">
<meta name="keywords" content="SenseVoice, SenseVoice 部署, 语音识别, 多语言语音识别, Whisper 替代, FunASR, 情感识别, 语种识别, ASR 教程, 开源语音识别">
<link rel="icon" href="/logo.png">
<meta property="og:title" content="SenseVoice 部署指南:比 Whisper 快 15 倍的多语言语音识别 | FunASR 博客">
<meta property="og:description" content="SenseVoice 部署完整教程:3 行 Python 代码跑通多语言语音识别,含语种/情感/音频事件检测、VAD 长音频分段、GPU/CPU 选择。比 Whisper 快 15 倍的开源 ASR。">
<meta property="og:type" content="article">
<meta property="og:url" content="https://www.funasr.com/blog/sensevoice-deployment-guide.html">
<meta property="og:image" content="https://www.funasr.com/logo.png">
<link rel="canonical" href="https://www.funasr.com/blog/sensevoice-deployment-guide.html">
<link rel="alternate" hreflang="en" href="https://www.funasr.com/en/blog/sensevoice-deployment-guide.html">
<link rel="alternate" hreflang="zh" href="https://www.funasr.com/blog/sensevoice-deployment-guide.html">
<link rel="alternate" hreflang="x-default" href="https://www.funasr.com/en/blog/sensevoice-deployment-guide.html">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"BlogPosting","headline":"SenseVoice 部署指南:比 Whisper 快 15 倍的多语言语音识别 | FunASR 博客","description":"SenseVoice 部署完整教程:3 行 Python 代码跑通多语言语音识别,含语种/情感/音频事件检测、VAD 长音频分段、GPU/CPU 选择。比 Whisper 快 15 倍的开源 ASR。","datePublished":"2026-06-16","dateModified":"2026-06-16","author":{"@type":"Organization","name":"FunASR / Tongyi Lab"},"publisher":{"@type":"Organization","name":"FunASR","logo":{"@type":"ImageObject","url":"https://www.funasr.com/logo.png"}},"mainEntityOfPage":{"@type":"WebPage","@id":"https://www.funasr.com/blog/sensevoice-deployment-guide.html"},"image":"https://www.funasr.com/logo.png"}
</script>
<style>:root{--primary:#2563eb;--primary-dark:#1d4ed8;--bg:#fff;--surface:#f8fafc;--border:#e2e8f0;--text:#0f172a;--text-soft:#475569;--text-muted:#94a3b8;--radius:12px}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:'Inter',-apple-system,sans-serif;color:var(--text);line-height:1.7}
a{color:var(--primary);text-decoration:none}a:hover{text-decoration:underline}
.container{max-width:800px;margin:0 auto;padding:0 24px}
.nav{position:fixed;top:0;left:0;right:0;z-index:100;background:rgba(255,255,255,0.9);backdrop-filter:blur(12px);border-bottom:1px solid var(--border);padding:14px 0}
.nav .container{max-width:1120px;display:flex;align-items:center;gap:24px}
.nav-logo{font-size:1.2rem;font-weight:800;color:var(--text)}.nav-logo span{color:var(--primary)}
.nav-links{display:flex;gap:20px;margin-left:auto;flex-wrap:wrap}
.nav-links a{font-size:0.85rem;font-weight:500;color:var(--text-soft)}
.nav-btn{padding:7px 16px;background:var(--primary);color:#fff;border-radius:7px;font-size:0.83rem;font-weight:600}
article{padding:120px 0 80px}
h1{font-size:2rem;font-weight:800;line-height:1.3;margin-bottom:14px}
h2{font-size:1.3rem;font-weight:700;margin:36px 0 14px;padding-top:16px;border-top:1px solid var(--border)}
h3{font-size:1.05rem;font-weight:700;margin:22px 0 10px}
p{margin-bottom:14px;color:var(--text-soft)}
ul,ol{margin:0 0 14px 22px;color:var(--text-soft)}li{margin-bottom:6px}
table{width:100%;border-collapse:collapse;margin:16px 0;font-size:0.86rem}
th,td{padding:10px 12px;text-align:left;border-bottom:1px solid var(--border)}
th{font-weight:600;background:var(--surface);font-size:0.78rem;color:var(--text-muted)}
pre{background:#1e293b;color:#e2e8f0;padding:18px;border-radius:10px;overflow-x:auto;font-size:0.82rem;line-height:1.7;margin:14px 0}
code{font-family:ui-monospace,Menlo,monospace}
p code,li code{background:var(--surface);padding:2px 6px;border-radius:5px;font-size:0.85em;color:var(--primary-dark)}
.post-meta{color:var(--text-muted);font-size:0.85rem;margin-bottom:24px}
.cta{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:24px;margin:28px 0;text-align:center}
.cta a.btn{display:inline-block;padding:10px 24px;background:var(--primary);color:#fff;border-radius:8px;font-weight:600}
.post-list{list-style:none;margin:0;padding:0}
.post-list li{margin:0 0 8px}
.post-card{display:block;border:1px solid var(--border);border-radius:var(--radius);padding:20px 22px;margin-bottom:14px}
.post-card:hover{border-color:var(--primary);text-decoration:none}
.post-card h2{border:none;padding:0;margin:0 0 6px;font-size:1.15rem;color:var(--text)}
.post-card p{margin:0;color:var(--text-soft);font-size:0.9rem}
.post-card .date{color:var(--text-muted);font-size:0.8rem}
footer{background:#0f172a;color:#94a3b8;padding:28px 0;text-align:center;font-size:0.8rem}
footer a{color:#94a3b8}</style>
</head>
<body>
<nav class="nav"><div class="container"><a href="/" class="nav-logo">Fun<span>ASR</span></a><div class="nav-links"><a href="/#capabilities">核心能力</a><a href="/#usage">如何使用</a><a href="/#benchmark">性能</a><a href="/#demo">演示</a><a href="https://modelscope.github.io/FunASR/zh/" target="_blank">文档</a><a href="/quickstart.html">快速上手</a><a href="/models.html">模型</a><a href="/ecosystem.html">生态</a><a href="/blog/">技术博客</a><a href="/vs-whisper.html">对比 Whisper</a><a href="/donors.html">功德榜</a></div><a href="https://www.funasr.com/en/blog/sensevoice-deployment-guide.html" style="font-size:0.83rem;font-weight:500;color:var(--text-soft)">EN</a><a href="https://github.com/modelscope/FunASR" target="_blank" class="nav-btn">GitHub ★</a></div></nav>
<article><div class="container">
<h1>SenseVoice 部署指南:比 Whisper 快 15 倍的多语言语音识别</h1>
<p class="post-meta">FunASR 技术博客 · 2026-06-16 · 部署教程</p>
<p><strong>SenseVoice</strong> 是 FunAudioLLM 团队开源的多语言语音理解大模型。它不仅做语音识别(ASR),还能在一次前向推理中同时输出<strong>语种识别、情感识别、音频事件检测</strong>。模型采用非自回归结构,推理速度比 Whisper-Large 快约 <strong>15 倍</strong>,单条 10 秒音频的识别延迟可低至几十毫秒,非常适合工业级实时与批量场景。</p>
<p>本文用可直接复制运行的代码,带你 3 步把 SenseVoice 跑起来。</p>
<h2>1. 安装</h2>
<p>SenseVoice 通过 <code>funasr</code> 包提供,一行安装:</p>
<pre>pip install -U funasr torch torchaudio</pre>
<h2>2. 三行代码跑通识别</h2>
<p>下面的代码会自动下载 <code>SenseVoiceSmall</code> 模型并完成识别:</p>
<pre>from funasr import AutoModel
from funasr.utils.postprocess_utils import rich_transcription_postprocess
model = AutoModel(model="iic/SenseVoiceSmall", device="cuda:0") # CPU 用 device="cpu"
res = model.generate(input="audio.wav", language="auto", use_itn=True)
print(rich_transcription_postprocess(res[0]["text"]))</pre>
<p>模型 ID:ModelScope 为 <code>iic/SenseVoiceSmall</code>,HuggingFace 为 <code>FunAudioLLM/SenseVoiceSmall</code>。<code>use_itn=True</code> 表示输出带标点和逆文本归一化(数字、日期规整)。</p>
<h2>3. 读懂输出:语种 + 情感 + 音频事件</h2>
<p>SenseVoice 的原始输出带有富文本标签,例如:</p>
<pre>&lt;|zh|&gt;&lt;|NEUTRAL|&gt;&lt;|Speech|&gt;&lt;|withitn|&gt;欢迎大家来体验达摩院推出的语音识别模型。</pre>
<ul>
<li><code>&lt;|zh|&gt;</code>:语种(zh 中文、en 英文、yue 粤语、ja 日语、ko 韩语)</li>
<li><code>&lt;|NEUTRAL|&gt;</code>:情感(HAPPY / SAD / ANGRY / NEUTRAL 等)</li>
<li><code>&lt;|Speech|&gt;</code>:音频事件(Speech / BGM / Applause / Laughter 等)</li>
</ul>
<p>用 <code>rich_transcription_postprocess()</code> 可一键得到干净文本;如果你想保留这些标签做下游分析,直接读取 <code>res[0]["text"]</code> 即可。</p>
<h2>4. 长音频:加 VAD 自动分段</h2>
<p>处理几分钟以上的长音频时,搭配 FSMN-VAD 做语音端点检测、自动分段,效果与速度都更好:</p>
<pre>model = AutoModel(
model="iic/SenseVoiceSmall",
vad_model="fsmn-vad",
vad_kwargs={"max_single_segment_time": 30000},
device="cuda:0",
)
res = model.generate(input="long_audio.wav", language="auto", use_itn=True, batch_size_s=60)</pre>
<h2>5. GPU 与 CPU 怎么选</h2>
<table>
<thead><tr><th>场景</th><th>建议</th></tr></thead>
<tbody>
<tr><td>高并发 / 批量转写</td><td>GPU(<code>device="cuda:0"</code>),吞吐最高</td></tr>
<tr><td>轻量 / 边缘 / 离线</td><td>CPU(<code>device="cpu"</code>);SenseVoice 非自回归,CPU 上也很快</td></tr>
<tr><td>生产服务</td><td>FunASR runtime(C++ / Docker 一键部署,多并发)</td></tr>
</tbody>
</table>
<h2>6. 性能一览</h2>
<table>
<thead><tr><th>维度</th><th>SenseVoice-Small</th></tr></thead>
<tbody>
<tr><td>相对 Whisper-Large 速度</td><td>约 15×</td></tr>
<tr><td>支持语言</td><td>中文 / 粤语 / 英文 / 日文 / 韩文 等</td></tr>
<tr><td>附加能力</td><td>语种识别 · 情感识别 · 音频事件检测</td></tr>
<tr><td>架构</td><td>非自回归(低延迟)</td></tr>
<tr><td>许可证</td><td>开源(可商用)</td></tr>
</tbody>
</table>
<div class="cta">
<h3>开始使用 SenseVoice</h3>
<p>如果这篇指南对你有帮助,欢迎到 GitHub 点个 Star ⭐ 支持开源。</p>
<a href="https://github.com/QwenAudio/SenseVoice" class="btn">SenseVoice GitHub ★</a>
</div>
<p>延伸阅读:<a href="/vs-whisper.html">FunASR vs Whisper 对比</a> · <a href="/quickstart.html">FunASR 快速上手</a> · <a href="/models.html">全部模型</a></p>
<!--related-posts-->
<h2>相关文章</h2>
<ul class="post-list">
<li><a href="/blog/funasr-vs-whisper-benchmark.html">FunASR vs Whisper 实测对比</a></li>
<li><a href="/blog/fun-asr-nano-guide.html">Fun-ASR-Nano 使用指南</a></li>
<li><a href="/blog/funasr-speaker-diarization.html">说话人分离:谁在何时说话</a></li>
<li><a href="/blog/sensevoice-emotion-language-detection.html">情感与语种检测</a></li>
<li><a href="/blog/funasr-realtime-streaming-asr.html">实时流式语音识别</a></li>
<li><a href="/blog/funasr-transcribe-long-audio.html">转写超长音频(1小时一次搞定)</a></li>
<li><a href="/blog/funasr-cli-transcribe-command-line.html">命令行转写(文本/JSON/SRT)</a></li>
<li><a href="/blog/self-hosted-openai-whisper-api-alternative.html">自托管 OpenAI Whisper API 替代</a></li>
<li><a href="/blog/generate-subtitles-srt-vtt-from-audio-video.html">自动生成字幕(SRT / VTT)</a></li>
<li><a href="/blog/speech-to-text-python-transcribe-audio.html">Python 语音转文字教程</a></li>
<li><a href="/blog/funasr-llama-cpp-whisper-cpp-alternative.html">FunASR 跑进 llama.cpp(whisper.cpp 替代)</a></li>
<li><a href="/blog/funasr-vs-faster-whisper-chinese.html">FunASR vs faster-whisper(中文/粤语)</a></li>
<li><a href="/blog/lightweight-speech-recognition-cpu.html">轻量语音识别(CPU 250MB)</a></li>
<li><a href="/blog/self-hosted-deepgram-assemblyai-alternative.html">自托管替代 Deepgram/AssemblyAI</a></li>
<li><a href="/blog/which-funasr-model.html">选哪个 FunASR 模型</a></li>
<li><a href="/blog/cantonese-speech-recognition.html">粤语语音识别(SenseVoice 原生粤语)</a></li>
<li><a href="/blog/japanese-speech-recognition.html">日语语音识别(SenseVoice 转写+标点+情感)</a></li>
<li><a href="/blog/voice-activity-detection-python.html">Python 语音活动检测(VAD)</a></li>
<li><a href="/blog/self-hosted-google-aws-azure-speech-to-text.html">自托管替代 Google/AWS/Azure 云语音 API</a></li>
<li><a href="/blog/chinese-speech-recognition.html">中文语音识别(普通话)实战</a></li>
<li><a href="/blog/punctuation-restoration-python.html">标点恢复 Python 实战</a></li>
<li><a href="/blog/speech-to-text-timestamps-python.html">语音识别带时间戳(字级)</a></li>
</ul>
</div></article>
<footer><div class="container">© 2024-2026 Tongyi Lab, Alibaba Group · <a href="https://github.com/modelscope/FunASR/blob/main/LICENSE">MIT License</a></div></footer>
</body>
</html>
@@ -0,0 +1,158 @@
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Python 语音情感识别:一个模型搞定语种 + 情感 + 音频事件(SenseVoice)| FunASR 博客</title>
<meta name="description" content="用 SenseVoice 一次推理同时输出语种识别、情感识别(高兴/愤怒/中性)、音频事件(背景音乐/掌声/笑声)与 ITN。3 行 Python 代码,附 5 语言真实输出,比 Whisper 快 15 倍。">
<meta name="keywords" content="语音情感识别, SenseVoice, 语种识别, 音频事件检测, 多语言语音识别, Whisper 替代, FunASR, 情感识别 python, 语音识别, 开源语音识别">
<link rel="icon" href="/logo.png">
<meta property="og:title" content="Python 语音情感识别:一个模型搞定语种 + 情感 + 音频事件(SenseVoice)| FunASR 博客">
<meta property="og:description" content="用 SenseVoice 一次推理同时输出语种识别、情感识别(高兴/愤怒/中性)、音频事件(背景音乐/掌声/笑声)与 ITN。3 行 Python 代码,附 5 语言真实输出,比 Whisper 快 15 倍。">
<meta property="og:type" content="article">
<meta property="og:url" content="https://www.funasr.com/blog/sensevoice-emotion-language-detection.html">
<meta property="og:image" content="https://www.funasr.com/logo.png">
<link rel="canonical" href="https://www.funasr.com/blog/sensevoice-emotion-language-detection.html">
<link rel="alternate" hreflang="en" href="https://www.funasr.com/en/blog/sensevoice-emotion-language-detection.html">
<link rel="alternate" hreflang="zh" href="https://www.funasr.com/blog/sensevoice-emotion-language-detection.html">
<link rel="alternate" hreflang="x-default" href="https://www.funasr.com/en/blog/sensevoice-emotion-language-detection.html">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"BlogPosting","headline":"Python 语音情感识别:一个模型搞定语种 + 情感 + 音频事件(SenseVoice)| FunASR 博客","description":"用 SenseVoice 一次推理同时输出语种识别、情感识别(高兴/愤怒/中性)、音频事件(背景音乐/掌声/笑声)与 ITN。3 行 Python 代码,附 5 语言真实输出,比 Whisper 快 15 倍。","datePublished":"2026-06-19","dateModified":"2026-06-19","author":{"@type":"Organization","name":"FunASR / Tongyi Lab"},"publisher":{"@type":"Organization","name":"FunASR","logo":{"@type":"ImageObject","url":"https://www.funasr.com/logo.png"}},"mainEntityOfPage":{"@type":"WebPage","@id":"https://www.funasr.com/blog/sensevoice-emotion-language-detection.html"},"image":"https://www.funasr.com/logo.png"}
</script>
<style>:root{--primary:#2563eb;--primary-dark:#1d4ed8;--bg:#fff;--surface:#f8fafc;--border:#e2e8f0;--text:#0f172a;--text-soft:#475569;--text-muted:#94a3b8;--radius:12px}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:'Inter',-apple-system,sans-serif;color:var(--text);line-height:1.7}
a{color:var(--primary);text-decoration:none}a:hover{text-decoration:underline}
.container{max-width:800px;margin:0 auto;padding:0 24px}
.nav{position:fixed;top:0;left:0;right:0;z-index:100;background:rgba(255,255,255,0.9);backdrop-filter:blur(12px);border-bottom:1px solid var(--border);padding:14px 0}
.nav .container{max-width:1120px;display:flex;align-items:center;gap:24px}
.nav-logo{font-size:1.2rem;font-weight:800;color:var(--text)}.nav-logo span{color:var(--primary)}
.nav-links{display:flex;gap:20px;margin-left:auto;flex-wrap:wrap}
.nav-links a{font-size:0.85rem;font-weight:500;color:var(--text-soft)}
.nav-btn{padding:7px 16px;background:var(--primary);color:#fff;border-radius:7px;font-size:0.83rem;font-weight:600}
article{padding:120px 0 80px}
h1{font-size:2rem;font-weight:800;line-height:1.3;margin-bottom:14px}
h2{font-size:1.3rem;font-weight:700;margin:36px 0 14px;padding-top:16px;border-top:1px solid var(--border)}
h3{font-size:1.05rem;font-weight:700;margin:22px 0 10px}
p{margin-bottom:14px;color:var(--text-soft)}
ul,ol{margin:0 0 14px 22px;color:var(--text-soft)}li{margin-bottom:6px}
table{width:100%;border-collapse:collapse;margin:16px 0;font-size:0.86rem}
th,td{padding:10px 12px;text-align:left;border-bottom:1px solid var(--border)}
th{font-weight:600;background:var(--surface);font-size:0.78rem;color:var(--text-muted)}
pre{background:#1e293b;color:#e2e8f0;padding:18px;border-radius:10px;overflow-x:auto;font-size:0.82rem;line-height:1.7;margin:14px 0}
code{font-family:ui-monospace,Menlo,monospace}
p code,li code{background:var(--surface);padding:2px 6px;border-radius:5px;font-size:0.85em;color:var(--primary-dark)}
.post-meta{color:var(--text-muted);font-size:0.85rem;margin-bottom:24px}
.cta{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:24px;margin:28px 0;text-align:center}
.cta a.btn{display:inline-block;padding:10px 24px;background:var(--primary);color:#fff;border-radius:8px;font-weight:600}
.post-list{list-style:none;margin:0;padding:0}
.post-list li{margin:0 0 8px}
.post-card{display:block;border:1px solid var(--border);border-radius:var(--radius);padding:20px 22px;margin-bottom:14px}
.post-card:hover{border-color:var(--primary);text-decoration:none}
.post-card h2{border:none;padding:0;margin:0 0 6px;font-size:1.15rem;color:var(--text)}
.post-card p{margin:0;color:var(--text-soft);font-size:0.9rem}
.post-card .date{color:var(--text-muted);font-size:0.8rem}
footer{background:#0f172a;color:#94a3b8;padding:28px 0;text-align:center;font-size:0.8rem}
footer a{color:#94a3b8}</style>
</head>
<body>
<nav class="nav"><div class="container"><a href="/" class="nav-logo">Fun<span>ASR</span></a><div class="nav-links"><a href="/#capabilities">核心能力</a><a href="/#usage">如何使用</a><a href="/#benchmark">性能</a><a href="/#demo">演示</a><a href="https://modelscope.github.io/FunASR/zh/" target="_blank">文档</a><a href="/quickstart.html">快速上手</a><a href="/models.html">模型</a><a href="/ecosystem.html">生态</a><a href="/blog/">技术博客</a><a href="/vs-whisper.html">对比 Whisper</a><a href="/donors.html">功德榜</a></div><a href="https://www.funasr.com/en/blog/sensevoice-emotion-language-detection.html" style="font-size:0.83rem;font-weight:500;color:var(--text-soft)">EN</a><a href="https://github.com/modelscope/FunASR" target="_blank" class="nav-btn">GitHub ★</a></div></nav>
<article><div class="container">
<h1>Python 语音情感识别:一个模型同时输出语种、情感与音频事件(SenseVoice)</h1>
<p class="post-meta">2026-06-19 · FunASR 团队</p>
<p>大多数语音识别(ASR)模型只给你<strong>文字</strong>。但真实场景里,你往往还想知道:说话人是<strong>什么情绪</strong>?这段是<strong>哪种语言</strong>?背景是<strong>纯人声还是带音乐</strong>?用 Whisper 你得叠一堆东西——语种检测 + 单独的情感模型 + 音频事件分类器,既慢又难维护。</p>
<p><strong>SenseVoice</strong> 是 FunAudioLLM 团队开源的多语种语音理解模型。它在<strong>一次非自回归前向</strong>里就同时返回:转写文本、<strong>语种识别</strong>、<strong>情感识别</strong>、<strong>音频事件检测</strong>,外加逆文本归一化(ITN)。架构非自回归,<strong>比 Whisper-Large 快约 15 倍</strong>,适合实时也适合大批量。</p>
<h2>一次推理能拿到什么</h2>
<table>
<tr><th>能力</th><th>说明</th></tr>
<tr><td>语音识别(ASR)</td><td>50+ 语种,中文准确率领先</td></tr>
<tr><td>语种识别(LID)</td><td>自动判别 <code>zh / en / ja / ko / yue …</code></td></tr>
<tr><td>情感识别</td><td>HAPPY 😊 / SAD 😔 / ANGRY 😡 / NEUTRAL / FEARFUL / DISGUSTED / SURPRISED</td></tr>
<tr><td>音频事件</td><td>Speech / BGM 🎵 / Applause 👏 / Laughter / Cry</td></tr>
<tr><td>逆文本归一化(ITN)</td><td>“九点”→“9点”、“fifty”→“50”</td></tr>
</table>
<h2>3 行代码跑通</h2>
<pre>pip install funasr
from funasr import AutoModel
from funasr.utils.postprocess_utils import rich_transcription_postprocess
model = AutoModel(model="iic/SenseVoiceSmall", disable_update=True)
res = model.generate(input="audio.wav", cache={}, language="auto", use_itn=True)
print(res[0]["text"]) # 原始带标签输出
print(rich_transcription_postprocess(res[0]["text"])) # 清洗后的纯文本</pre>
<h2>真实输出:5 种语言自动识别</h2>
<p>用 SenseVoice 自带的多语种示例音频实测(zh/en/ja/ko/yue),原始输出每段开头都带标签:</p>
<pre>&lt;|zh|&gt;&lt;|NEUTRAL|&gt;&lt;|Speech|&gt;&lt;|withitn|&gt;开放时间早上9点至下午5点。
&lt;|en|&gt;&lt;|NEUTRAL|&gt;&lt;|Speech|&gt;&lt;|withitn|&gt;The tribal chieftain called for the boy and presented him with 50 pieces of gold.
&lt;|ja|&gt;&lt;|NEUTRAL|&gt;&lt;|Speech|&gt;&lt;|withitn|&gt;うちの中学は弁当制で持っていけない場合は、50 円の学校販売のパンを買う。
&lt;|ko|&gt;&lt;|NEUTRAL|&gt;&lt;|Speech|&gt;&lt;|withitn|&gt;조금만 생각을 하면서 살면 훨씬 편할 거야.
&lt;|yue|&gt;&lt;|NEUTRAL|&gt;&lt;|Speech|&gt;&lt;|withitn|&gt;呢几个字都表达唔到,我想讲嘅意思。</pre>
<p>注意每段开头的标签:<code>&lt;|zh|&gt;</code> 语种(连粤语 <code>yue</code> 都能分出来)、<code>&lt;|NEUTRAL|&gt;</code> 情感、<code>&lt;|Speech|&gt;</code> 音频事件、<code>&lt;|withitn|&gt;</code> 表示已做 ITN(“9点至下午5点”“50 pieces”)。</p>
<h2>情感与音频事件:真实音频实测</h2>
<p>把 SenseVoice 跑在 60 段真实网络音频上:其中 <strong>56 段被正确标为 <code>BGM</code></strong>(带背景音乐)——这正是 Whisper 会硬转写、容易幻觉的场景;同时检测出 HAPPY / ANGRY / NEUTRAL 等情感。例如一段被标为 <strong>ANGRY</strong> 的语音:</p>
<pre>&lt;|zh|&gt;&lt;|ANGRY|&gt;&lt;|Speech|&gt;&lt;|withitn|&gt;哎,不要看不起那些理想主义者,你脚下的每一步都是他们走出来的。</pre>
<p>完整标签集——情感:HAPPY / SAD / ANGRY / NEUTRAL / FEARFUL / DISGUSTED / SURPRISED;事件:Speech / BGM / Applause / Laughter / Cry。</p>
<h2>如何解析这些标签</h2>
<pre>import re
raw = res[0]["text"]
tags = re.findall(r"&lt;\|([^|]+)\|&gt;", raw)
language = tags[0] if tags else None # 'zh'
emotion = next((t for t in tags if t in
{"HAPPY","SAD","ANGRY","NEUTRAL","FEARFUL","DISGUSTED","SURPRISED"}), None)
event = next((t for t in tags if t in
{"Speech","BGM","Applause","Laughter","Cry"}), None)
text = re.sub(r"&lt;\|[^|]+\|&gt;", "", raw) # 纯文本
print(language, emotion, event, text)</pre>
<h2>对比 Whisper</h2>
<table>
<tr><th></th><th>SenseVoice</th><th>Whisper</th></tr>
<tr><td>转写 + 语种</td><td>✅ 一次搞定</td><td>✅</td></tr>
<tr><td>情感识别</td><td>✅ 内置</td><td>❌ 需另接模型</td></tr>
<tr><td>音频事件(BGM/掌声/笑声)</td><td>✅ 内置</td><td>❌</td></tr>
<tr><td>逆文本归一化</td><td>✅ 内置</td><td>部分</td></tr>
<tr><td>速度</td><td>非自回归,约快 15×</td><td>自回归基准</td></tr>
</table>
<p>要的不只是文字,而是对音频的<strong>理解</strong>时,SenseVoice 一个模型就够了——无需再拼语种检测 + 情感模型 + 事件分类器。</p>
<div class="cta"><p><strong>FunASR 全家桶都是开源的</strong>——工业级 ASR / VAD / 标点 / 说话人 / 情感事件 / LLM-ASR。觉得有用就点个 Star 支持一下 👇</p><p><a class="btn" href="https://github.com/modelscope/FunASR" target="_blank">⭐ Star FunASR</a></p><p style="margin-top:10px;font-size:0.85rem">也欢迎 Star:<a href="https://github.com/QwenAudio/SenseVoice" target="_blank">SenseVoice</a> · <a href="https://github.com/QwenAudio/Fun-ASR" target="_blank">Fun-ASR</a> · <a href="https://github.com/modelscope/FunClip" target="_blank">FunClip</a></p></div>
<!--related-posts-->
<h2>相关文章</h2>
<ul class="post-list">
<li><a href="/blog/funasr-vs-whisper-benchmark.html">FunASR vs Whisper 实测对比</a></li>
<li><a href="/blog/sensevoice-deployment-guide.html">SenseVoice 部署指南</a></li>
<li><a href="/blog/fun-asr-nano-guide.html">Fun-ASR-Nano 使用指南</a></li>
<li><a href="/blog/funasr-speaker-diarization.html">说话人分离:谁在何时说话</a></li>
<li><a href="/blog/funasr-realtime-streaming-asr.html">实时流式语音识别</a></li>
<li><a href="/blog/funasr-transcribe-long-audio.html">转写超长音频(1小时一次搞定)</a></li>
<li><a href="/blog/funasr-cli-transcribe-command-line.html">命令行转写(文本/JSON/SRT)</a></li>
<li><a href="/blog/self-hosted-openai-whisper-api-alternative.html">自托管 OpenAI Whisper API 替代</a></li>
<li><a href="/blog/generate-subtitles-srt-vtt-from-audio-video.html">自动生成字幕(SRT / VTT)</a></li>
<li><a href="/blog/speech-to-text-python-transcribe-audio.html">Python 语音转文字教程</a></li>
<li><a href="/blog/funasr-llama-cpp-whisper-cpp-alternative.html">FunASR 跑进 llama.cpp(whisper.cpp 替代)</a></li>
<li><a href="/blog/funasr-vs-faster-whisper-chinese.html">FunASR vs faster-whisper(中文/粤语)</a></li>
<li><a href="/blog/lightweight-speech-recognition-cpu.html">轻量语音识别(CPU 250MB)</a></li>
<li><a href="/blog/self-hosted-deepgram-assemblyai-alternative.html">自托管替代 Deepgram/AssemblyAI</a></li>
<li><a href="/blog/which-funasr-model.html">选哪个 FunASR 模型</a></li>
<li><a href="/blog/cantonese-speech-recognition.html">粤语语音识别(SenseVoice 原生粤语)</a></li>
<li><a href="/blog/japanese-speech-recognition.html">日语语音识别(SenseVoice 转写+标点+情感)</a></li>
<li><a href="/blog/voice-activity-detection-python.html">Python 语音活动检测(VAD)</a></li>
<li><a href="/blog/self-hosted-google-aws-azure-speech-to-text.html">自托管替代 Google/AWS/Azure 云语音 API</a></li>
<li><a href="/blog/chinese-speech-recognition.html">中文语音识别(普通话)实战</a></li>
<li><a href="/blog/punctuation-restoration-python.html">标点恢复 Python 实战</a></li>
<li><a href="/blog/speech-to-text-timestamps-python.html">语音识别带时间戳(字级)</a></li>
</ul>
</div></article>
<footer><div class="container">© 2024-2026 Tongyi Lab, Alibaba Group · <a href="https://github.com/modelscope/FunASR/blob/main/LICENSE">MIT License</a></div></footer>
</body>
</html>
@@ -0,0 +1,134 @@
<!DOCTYPE html>
<html lang="zh"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>Python 语音转文字:用 FunASR 本地、免费地把音频转成文本 | FunASR</title><meta name="description" content="用 Python 几行代码把音频转成文字:`AutoModel(...).generate(...)`,本地运行、免费、无 API key。带时间戳、说话人、批量处理,中文强、50+ 语言。代码全部实测。"><meta name="keywords" content="python 语音转文字, python 语音识别, 音频转文字 python, 语音转文本 python, funasr python, 离线语音识别 python, 免费语音转文字, python 语音转文本教程">
<link rel="icon" href="/logo.png"><meta property="og:title" content="Python 语音转文字:用 FunASR 本地、免费地把音频转成文本"><meta property="og:description" content="用 Python 几行代码把音频转成文字:`AutoModel(...).generate(...)`,本地运行、免费、无 API key。带时间戳、说话人、批量处理,中文强、50+ 语言。代码全部实测。">
<meta property="og:type" content="article"><meta property="og:url" content="https://www.funasr.com/blog/speech-to-text-python-transcribe-audio.html"><meta property="og:image" content="https://www.funasr.com/logo.png">
<link rel="canonical" href="https://www.funasr.com/blog/speech-to-text-python-transcribe-audio.html"><link rel="alternate" hreflang="en" href="https://www.funasr.com/en/blog/speech-to-text-python-transcribe-audio.html"><link rel="alternate" hreflang="zh" href="https://www.funasr.com/blog/speech-to-text-python-transcribe-audio.html"><link rel="alternate" hreflang="x-default" href="https://www.funasr.com/en/blog/speech-to-text-python-transcribe-audio.html">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"BlogPosting","headline":"Python 语音转文字:用 FunASR 本地、免费地把音频转成文本","description":"用 Python 几行代码把音频转成文字:`AutoModel(...).generate(...)`,本地运行、免费、无 API key。带时间戳、说话人、批量处理,中文强、50+ 语言。代码全部实测。","datePublished":"2026-06-18","dateModified":"2026-06-18","author":{"@type":"Organization","name":"FunASR / Tongyi Lab"},"publisher":{"@type":"Organization","name":"FunASR","logo":{"@type":"ImageObject","url":"https://www.funasr.com/logo.png"}},"mainEntityOfPage":{"@type":"WebPage","@id":"https://www.funasr.com/blog/speech-to-text-python-transcribe-audio.html"},"image":"https://www.funasr.com/logo.png"}
</script>
<style>:root{--primary:#2563eb;--primary-dark:#1d4ed8;--bg:#fff;--surface:#f8fafc;--border:#e2e8f0;--text:#0f172a;--text-soft:#475569;--text-muted:#94a3b8;--radius:12px}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:'Inter',-apple-system,sans-serif;color:var(--text);line-height:1.7}
a{color:var(--primary);text-decoration:none}a:hover{text-decoration:underline}
.container{max-width:800px;margin:0 auto;padding:0 24px}
.nav{position:fixed;top:0;left:0;right:0;z-index:100;background:rgba(255,255,255,0.9);backdrop-filter:blur(12px);border-bottom:1px solid var(--border);padding:14px 0}
.nav .container{max-width:1120px;display:flex;align-items:center;gap:24px}
.nav-logo{font-size:1.2rem;font-weight:800;color:var(--text)}.nav-logo span{color:var(--primary)}
.nav-links{display:flex;gap:20px;margin-left:auto;flex-wrap:wrap}
.nav-links a{font-size:0.85rem;font-weight:500;color:var(--text-soft)}
.nav-btn{padding:7px 16px;background:var(--primary);color:#fff;border-radius:7px;font-size:0.83rem;font-weight:600}
article{padding:120px 0 80px}
h1{font-size:2rem;font-weight:800;line-height:1.3;margin-bottom:14px}
h2{font-size:1.3rem;font-weight:700;margin:36px 0 14px;padding-top:16px;border-top:1px solid var(--border)}
h3{font-size:1.05rem;font-weight:700;margin:22px 0 10px}
p{margin-bottom:14px;color:var(--text-soft)}
ul,ol{margin:0 0 14px 22px;color:var(--text-soft)}li{margin-bottom:6px}
table{width:100%;border-collapse:collapse;margin:16px 0;font-size:0.86rem}
th,td{padding:10px 12px;text-align:left;border-bottom:1px solid var(--border)}
th{font-weight:600;background:var(--surface);font-size:0.78rem;color:var(--text-muted)}
pre{background:#1e293b;color:#e2e8f0;padding:18px;border-radius:10px;overflow-x:auto;font-size:0.82rem;line-height:1.7;margin:14px 0}
code{font-family:ui-monospace,Menlo,monospace}
p code,li code{background:var(--surface);padding:2px 6px;border-radius:5px;font-size:0.85em;color:var(--primary-dark)}
.post-meta{color:var(--text-muted);font-size:0.85rem;margin-bottom:24px}
.cta{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:24px;margin:28px 0;text-align:center}
.cta a.btn{display:inline-block;padding:10px 24px;background:var(--primary);color:#fff;border-radius:8px;font-weight:600}
.post-list{list-style:none;margin:0;padding:0}
.post-list li{margin:0 0 8px}
.post-card{display:block;border:1px solid var(--border);border-radius:var(--radius);padding:20px 22px;margin-bottom:14px}
.post-card:hover{border-color:var(--primary);text-decoration:none}
.post-card h2{border:none;padding:0;margin:0 0 6px;font-size:1.15rem;color:var(--text)}
.post-card p{margin:0;color:var(--text-soft);font-size:0.9rem}
.post-card .date{color:var(--text-muted);font-size:0.8rem}
footer{background:#0f172a;color:#94a3b8;padding:28px 0;text-align:center;font-size:0.8rem}
footer a{color:#94a3b8}
@media(max-width:900px){.nav-links{display:none}.nav .container{gap:16px}.nav-logo{margin-right:auto}h1{font-size:1.75rem}table{table-layout:fixed;font-size:0.78rem}th,td{padding:8px 4px;overflow-wrap:anywhere}p code,li code{overflow-wrap:anywhere;word-break:break-word}}
</style></head><body>
<nav class="nav"><div class="container"><a href="/" class="nav-logo">Fun<span>ASR</span></a><div class="nav-links"><a href="/#capabilities">核心能力</a><a href="/#usage">如何使用</a><a href="/#benchmark">性能</a><a href="/#demo">演示</a><a href="https://modelscope.github.io/FunASR/zh/" target="_blank">文档</a><a href="/quickstart.html">快速上手</a><a href="/models.html">模型</a><a href="/ecosystem.html">生态</a><a href="/blog/">技术博客</a><a href="/vs-whisper.html">对比 Whisper</a><a href="/donors.html">功德榜</a></div><a href="https://www.funasr.com/en/blog/speech-to-text-python-transcribe-audio.html" style="font-size:0.83rem;font-weight:600;color:var(--text-soft)">EN</a><a href="https://github.com/modelscope/FunASR" target="_blank" class="nav-btn">GitHub ★</a></div></nav>
<article><div class="container">
<h1>Python 语音转文字:用 FunASR 本地、免费地把音频转成文本</h1>
<p class="post-meta">FunASR 技术博客 · 2026-06-18 · 教程</p>
<p>在 Python 里把音频转成文字,不一定要用云 API 或庞大的 Whisper。FunASR 几行代码就能在本地、免费地转写,还自带时间戳、说话人分离和批量处理。中文尤其强,同时支持 50+ 语言。下面每段代码都已实测。</p>
<h2>安装</h2>
<pre><code>pip install -U torch torchaudio
pip install -U funasr</code></pre>
<h2>最简单:几行转写一个文件</h2>
<pre><code>from funasr import AutoModel
from funasr.utils.postprocess_utils import rich_transcription_postprocess
model = AutoModel(model="iic/SenseVoiceSmall", vad_model="fsmn-vad", device="cuda")
result = model.generate(input="audio.wav")
print(rich_transcription_postprocess(result[0]["text"]))
# -&gt; 欢迎大家来体验达摩院推出的语音识别模型</code></pre>
<p>默认用 SenseVoice(非自回归、极快)。<code>rich_transcription_postprocess</code> 用来清掉 SenseVoice 的 <code>&lt;|zh|&gt;</code> 等标签,得到干净文本——别漏掉这一步。</p>
<h2>直接从 URL 转写</h2>
<pre><code>result = model.generate(
input="https://example.com/audio.wav" # 也支持本地路径、numpy、bytes
)</code></pre>
<h2>要时间戳和说话人</h2>
<p>结果里的 <code>sentence_info</code> 每段都带 <code>start</code>/<code>end</code>(毫秒)、<code>spk</code>(说话人)、<code>sentence</code>:</p>
<pre><code>model = AutoModel(model="iic/SenseVoiceSmall", vad_model="fsmn-vad", spk_model="cam++", device="cuda")
result = model.generate(input="audio.wav")
for seg in result[0]["sentence_info"]:
start = seg["start"] / 1000
text = rich_transcription_postprocess(seg["sentence"])
print("[%.1fs] Speaker %s: %s" % (start, seg["spk"], text))
# -&gt; [0.6s] Speaker 0: 欢迎大家来体验达摩院推出的语音识别模型</code></pre>
<h2>批量转写多个文件</h2>
<p>把文件列表传给 <code>input</code>,一次返回每个文件的结果:</p>
<pre><code>results = model.generate(input=["a.wav", "b.wav", "c.wav"])
for r in results:
print(rich_transcription_postprocess(r["text"]))</code></pre>
<h2>选哪个模型</h2>
<table><thead><tr><th>model=</th><th>适合</th></tr></thead><tbody>
<tr><td><code>iic/SenseVoiceSmall</code></td><td>默认,极快,50+ 语言,带情感/事件</td></tr>
<tr><td><code>paraformer-zh</code></td><td>经典中文生产级,稳</td></tr>
<tr><td><code>FunAudioLLM/Fun-ASR-Nano-2512</code></td><td>旗舰 LLM 解码,中英日 + 中文方言/口音</td></tr>
<tr><td><code>FunAudioLLM/Fun-ASR-MLT-Nano-2512</code></td><td>独立多语 checkpoint,覆盖 31 语种</td></tr>
</tbody></table>
<p>换模型只改 <code>model=</code> 即可,其余代码不变。</p>
<h2>为什么用 FunASR</h2>
<ul>
<li><strong>本地、免费、隐私</strong>:无需联网、无 API key、无时长费用。</li>
<li><strong>快</strong>:SenseVoice 非自回归,远快于 Whisper(<a href="/blog/funasr-vs-whisper-benchmark.html">实测对比</a>),CPU 也能实时。</li>
<li><strong>中文更准</strong> + 50+ 语言;时间戳、说话人、热词、批量开箱即用。</li>
</ul>
<div class="cta"><p>FunASR 是通义实验室开源的工业级语音识别工具包。</p><a class="btn" href="https://github.com/modelscope/FunASR" target="_blank">在 GitHub 上 Star FunASR ★</a></div>
<!--related-posts-->
<h2>相关文章</h2>
<ul class="post-list">
<li><a href="/blog/funasr-vs-whisper-benchmark.html">FunASR vs Whisper 实测对比</a></li>
<li><a href="/blog/sensevoice-deployment-guide.html">SenseVoice 部署指南</a></li>
<li><a href="/blog/fun-asr-nano-guide.html">Fun-ASR-Nano 使用指南</a></li>
<li><a href="/blog/funasr-speaker-diarization.html">说话人分离:谁在何时说话</a></li>
<li><a href="/blog/sensevoice-emotion-language-detection.html">情感与语种检测</a></li>
<li><a href="/blog/funasr-realtime-streaming-asr.html">实时流式语音识别</a></li>
<li><a href="/blog/funasr-transcribe-long-audio.html">转写超长音频(1小时一次搞定)</a></li>
<li><a href="/blog/funasr-cli-transcribe-command-line.html">命令行转写(文本/JSON/SRT)</a></li>
<li><a href="/blog/self-hosted-openai-whisper-api-alternative.html">自托管 OpenAI Whisper API 替代</a></li>
<li><a href="/blog/generate-subtitles-srt-vtt-from-audio-video.html">自动生成字幕(SRT / VTT)</a></li>
<li><a href="/blog/funasr-llama-cpp-whisper-cpp-alternative.html">FunASR 跑进 llama.cpp(whisper.cpp 替代)</a></li>
<li><a href="/blog/funasr-vs-faster-whisper-chinese.html">FunASR vs faster-whisper(中文/粤语)</a></li>
<li><a href="/blog/lightweight-speech-recognition-cpu.html">轻量语音识别(CPU 250MB)</a></li>
<li><a href="/blog/self-hosted-deepgram-assemblyai-alternative.html">自托管替代 Deepgram/AssemblyAI</a></li>
<li><a href="/blog/which-funasr-model.html">选哪个 FunASR 模型</a></li>
<li><a href="/blog/cantonese-speech-recognition.html">粤语语音识别(SenseVoice 原生粤语)</a></li>
<li><a href="/blog/japanese-speech-recognition.html">日语语音识别(SenseVoice 转写+标点+情感)</a></li>
<li><a href="/blog/voice-activity-detection-python.html">Python 语音活动检测(VAD)</a></li>
<li><a href="/blog/self-hosted-google-aws-azure-speech-to-text.html">自托管替代 Google/AWS/Azure 云语音 API</a></li>
<li><a href="/blog/chinese-speech-recognition.html">中文语音识别(普通话)实战</a></li>
<li><a href="/blog/punctuation-restoration-python.html">标点恢复 Python 实战</a></li>
<li><a href="/blog/speech-to-text-timestamps-python.html">语音识别带时间戳(字级)</a></li>
</ul>
</div></article>
<footer><div class="container">FunASR · 通义实验室开源语音识别 · <a href="https://github.com/modelscope/FunASR">GitHub</a></div></footer>
</body></html>
@@ -0,0 +1,144 @@
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>语音识别带时间戳(字级 timestamps)Python 实战:每个字精确到毫秒 | FunASR 博客</title>
<meta name="description" content="怎么让语音识别输出每个字/词的时间戳?FunASR Paraformer 原生输出字级时间戳,每个字带 [起始毫秒,结束毫秒],一次调用即有。可做逐字高亮、点击跳转、字幕对齐。附真实实测输出 + 配对代码。">
<meta name="keywords" content="语音识别时间戳, 字级时间戳, 词级时间戳, speech to text timestamps python, word level timestamps, 语音转文字 时间戳, forced alignment, Paraformer, FunASR, 字幕对齐">
<link rel="icon" href="/logo.png">
<meta property="og:title" content="语音识别带时间戳(字级 timestamps)Python 实战:每个字精确到毫秒 | FunASR 博客">
<meta property="og:description" content="怎么让语音识别输出每个字/词的时间戳?FunASR Paraformer 原生输出字级时间戳,每个字带 [起始毫秒,结束毫秒],一次调用即有。可做逐字高亮、点击跳转、字幕对齐。附真实实测输出 + 配对代码。">
<meta property="og:type" content="article">
<meta property="og:url" content="https://www.funasr.com/blog/speech-to-text-timestamps-python.html">
<meta property="og:image" content="https://www.funasr.com/logo.png">
<link rel="canonical" href="https://www.funasr.com/blog/speech-to-text-timestamps-python.html">
<link rel="alternate" hreflang="en" href="https://www.funasr.com/en/blog/speech-to-text-timestamps-python.html">
<link rel="alternate" hreflang="zh" href="https://www.funasr.com/blog/speech-to-text-timestamps-python.html">
<link rel="alternate" hreflang="x-default" href="https://www.funasr.com/en/blog/speech-to-text-timestamps-python.html">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"BlogPosting","headline":"语音识别带时间戳(字级 timestamps)Python 实战:每个字精确到毫秒 | FunASR 博客","description":"怎么让语音识别输出每个字/词的时间戳?FunASR Paraformer 原生输出字级时间戳,每个字带 [起始毫秒,结束毫秒],一次调用即有。可做逐字高亮、点击跳转、字幕对齐。附真实实测输出 + 配对代码。","datePublished":"2026-06-23","dateModified":"2026-06-23","author":{"@type":"Organization","name":"FunASR / Tongyi Lab"},"publisher":{"@type":"Organization","name":"FunASR","logo":{"@type":"ImageObject","url":"https://www.funasr.com/logo.png"}},"mainEntityOfPage":{"@type":"WebPage","@id":"https://www.funasr.com/blog/speech-to-text-timestamps-python.html"},"image":"https://www.funasr.com/logo.png"}
</script>
<style>:root{--primary:#2563eb;--primary-dark:#1d4ed8;--bg:#fff;--surface:#f8fafc;--border:#e2e8f0;--text:#0f172a;--text-soft:#475569;--text-muted:#94a3b8;--radius:12px}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:'Inter',-apple-system,sans-serif;color:var(--text);line-height:1.7}
a{color:var(--primary);text-decoration:none}a:hover{text-decoration:underline}
.container{max-width:800px;margin:0 auto;padding:0 24px}
.nav{position:fixed;top:0;left:0;right:0;z-index:100;background:rgba(255,255,255,0.9);backdrop-filter:blur(12px);border-bottom:1px solid var(--border);padding:14px 0}
.nav .container{max-width:1120px;display:flex;align-items:center;gap:24px}
.nav-logo{font-size:1.2rem;font-weight:800;color:var(--text)}.nav-logo span{color:var(--primary)}
.nav-links{display:flex;gap:20px;margin-left:auto;flex-wrap:wrap}
.nav-links a{font-size:0.85rem;font-weight:500;color:var(--text-soft)}
.nav-btn{padding:7px 16px;background:var(--primary);color:#fff;border-radius:7px;font-size:0.83rem;font-weight:600}
article{padding:120px 0 80px}
h1{font-size:2rem;font-weight:800;line-height:1.3;margin-bottom:14px}
h2{font-size:1.3rem;font-weight:700;margin:36px 0 14px;padding-top:16px;border-top:1px solid var(--border)}
h3{font-size:1.05rem;font-weight:700;margin:22px 0 10px}
p{margin-bottom:14px;color:var(--text-soft)}
ul,ol{margin:0 0 14px 22px;color:var(--text-soft)}li{margin-bottom:6px}
table{width:100%;border-collapse:collapse;margin:16px 0;font-size:0.86rem}
th,td{padding:10px 12px;text-align:left;border-bottom:1px solid var(--border)}
th{font-weight:600;background:var(--surface);font-size:0.78rem;color:var(--text-muted)}
pre{background:#1e293b;color:#e2e8f0;padding:18px;border-radius:10px;overflow-x:auto;font-size:0.82rem;line-height:1.7;margin:14px 0}
code{font-family:ui-monospace,Menlo,monospace}
p code,li code{background:var(--surface);padding:2px 6px;border-radius:5px;font-size:0.85em;color:var(--primary-dark)}
.post-meta{color:var(--text-muted);font-size:0.85rem;margin-bottom:24px}
.cta{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:24px;margin:28px 0;text-align:center}
.cta a.btn{display:inline-block;padding:10px 24px;background:var(--primary);color:#fff;border-radius:8px;font-weight:600}
.post-list{list-style:none;margin:0;padding:0}
.post-list li{margin:0 0 8px}
.post-card{display:block;border:1px solid var(--border);border-radius:var(--radius);padding:20px 22px;margin-bottom:14px}
.post-card:hover{border-color:var(--primary);text-decoration:none}
.post-card h2{border:none;padding:0;margin:0 0 6px;font-size:1.15rem;color:var(--text)}
.post-card p{margin:0;color:var(--text-soft);font-size:0.9rem}
.post-card .date{color:var(--text-muted);font-size:0.8rem}
footer{background:#0f172a;color:#94a3b8;padding:28px 0;text-align:center;font-size:0.8rem}
footer a{color:#94a3b8}</style>
</head>
<body>
<nav class="nav"><div class="container"><a href="/" class="nav-logo">Fun<span>ASR</span></a><div class="nav-links"><a href="/#capabilities">核心能力</a><a href="/#usage">如何使用</a><a href="/#benchmark">性能</a><a href="/#demo">演示</a><a href="https://modelscope.github.io/FunASR/zh/" target="_blank">文档</a><a href="/quickstart.html">快速上手</a><a href="/models.html">模型</a><a href="/ecosystem.html">生态</a><a href="/blog/">技术博客</a><a href="/vs-whisper.html">对比 Whisper</a><a href="/donors.html">功德榜</a></div><a href="https://www.funasr.com/en/blog/speech-to-text-timestamps-python.html" style="font-size:0.83rem;font-weight:500;color:var(--text-soft)">EN</a><a href="https://github.com/modelscope/FunASR" target="_blank" class="nav-btn">GitHub ★</a></div></nav>
<article><div class="container">
<h1>语音识别带时间戳(字级 timestamps)Python 实战:每个字精确到毫秒</h1>
<p class="post-meta">2026-06-23 · FunASR 团队</p>
<p>很多场景不只要"识别出说了什么",还要知道<strong>每个字是在什么时间说的</strong>——做卡拉OK 逐字高亮、点击文字跳转音频、字幕对齐、视频剪辑定位。Whisper 的 word timestamps 是后加的(需要 DTW、精度一般)。<strong>FunASR 的 Paraformer 原生输出字级时间戳</strong>:每个字带 <code>[起始毫秒, 结束毫秒]</code>,一次调用就有。下面是真实实测输出。</p>
<h2>带时间戳识别(实测输出)</h2>
<pre>pip install funasr
from funasr import AutoModel
model = AutoModel(model="paraformer-zh", vad_model="fsmn-vad", disable_update=True)
res = model.generate(input="audio.wav")
text = res[0]["text"] # 欢 迎 大 家 来 体 验 ...
timestamp = res[0]["timestamp"] # [[880, 1120], [1120, 1360], ...] 每个字的起止毫秒</pre>
<p><code>timestamp</code> 是一个 <code>[start_ms, end_ms]</code> 列表,和文本里的字一一对应。</p>
<h2>把字和时间戳配对(实测)</h2>
<pre>chars = text.split() # Paraformer 中文输出是空格分隔的字
for ch, (start, end) in zip(chars, timestamp):
print(f"{ch} {start}-{end}ms")</pre>
<p>真实输出:</p>
<table>
<tr><th>字</th><th>起止(毫秒)</th></tr>
<tr><td>欢</td><td>880 – 1120</td></tr>
<tr><td>迎</td><td>1120 – 1360</td></tr>
<tr><td>大</td><td>1380 – 1540</td></tr>
<tr><td>家</td><td>1540 – 1780</td></tr>
<tr><td>来</td><td>1780 – 2020</td></tr>
<tr><td>体</td><td>2020 – 2180</td></tr>
<tr><td>验</td><td>2180 – 2420</td></tr>
</table>
<p>整句"欢迎大家来体验达摩院推出的语音识别模型"的 19 个字,每个都有精确到毫秒的起止时间。</p>
<h2>能用来做什么</h2>
<ul>
<li><strong>逐字高亮 / 卡拉OK</strong>:音频播放到某毫秒时,高亮对应的字。</li>
<li><strong>点击文字跳转音频</strong>:点某个字,用它的 <code>start_ms</code> seek 到音频对应位置。</li>
<li><strong>字幕精确对齐</strong>:按时间戳切句、生成逐字时间轴的字幕。完整做字幕见 <a href="/blog/generate-subtitles-srt-vtt-from-audio-video.html">生成 SRT/VTT 字幕</a>。</li>
<li><strong>视频剪辑定位</strong>:按关键词找到它在音频里的精确时间点。</li>
</ul>
<h2>为什么用 Paraformer 拿时间戳</h2>
<table>
<tr><th></th><th>FunASR Paraformer</th><th>Whisper</th></tr>
<tr><td>字/词级时间戳</td><td>✅ 原生,一次调用</td><td>后加(<code>--word_timestamps</code>,靠 DTW)</td></tr>
<tr><td>精度</td><td>非自回归 + CIF 对齐,稳定</td><td>视实现而定</td></tr>
<tr><td>中文</td><td>字级、CER 10.18%</td><td>~20%</td></tr>
<tr><td>许可证</td><td>开源,可商用</td><td>开源</td></tr>
</table>
<p>要更高精度的中文识别,默认用旗舰 <a href="/blog/which-funasr-model.html">Fun-ASR-Nano</a>;完整中文实战见 <a href="/blog/chinese-speech-recognition.html">中文语音识别</a>;长音频分段见 <a href="/blog/voice-activity-detection-python.html">VAD</a>。</p>
<div class="cta"><p><strong>FunASR 全家桶开源(MIT)</strong>——字级时间戳、ASR、VAD、标点、说话人、LLM-ASR(旗舰 Fun-ASR-Nano),拿来即用。觉得有用就点个 Star 👇</p><p><a class="btn" href="https://github.com/modelscope/FunASR" target="_blank">⭐ Star FunASR</a></p><p style="margin-top:10px;font-size:0.85rem">也欢迎 Star:<a href="https://github.com/QwenAudio/SenseVoice" target="_blank">SenseVoice</a> · <a href="https://github.com/QwenAudio/Fun-ASR" target="_blank">Fun-ASR</a> · <a href="https://github.com/modelscope/FunClip" target="_blank">FunClip</a></p></div>
<!--related-posts-->
<h2>相关文章</h2>
<ul class="post-list">
<li><a href="/blog/funasr-vs-whisper-benchmark.html">FunASR vs Whisper 实测对比</a></li>
<li><a href="/blog/sensevoice-deployment-guide.html">SenseVoice 部署指南</a></li>
<li><a href="/blog/fun-asr-nano-guide.html">Fun-ASR-Nano 使用指南</a></li>
<li><a href="/blog/funasr-speaker-diarization.html">说话人分离:谁在何时说话</a></li>
<li><a href="/blog/sensevoice-emotion-language-detection.html">情感与语种检测</a></li>
<li><a href="/blog/funasr-realtime-streaming-asr.html">实时流式语音识别</a></li>
<li><a href="/blog/funasr-transcribe-long-audio.html">转写超长音频(1小时一次搞定)</a></li>
<li><a href="/blog/funasr-cli-transcribe-command-line.html">命令行转写(文本/JSON/SRT)</a></li>
<li><a href="/blog/self-hosted-openai-whisper-api-alternative.html">自托管 OpenAI Whisper API 替代</a></li>
<li><a href="/blog/generate-subtitles-srt-vtt-from-audio-video.html">自动生成字幕(SRT / VTT)</a></li>
<li><a href="/blog/speech-to-text-python-transcribe-audio.html">Python 语音转文字教程</a></li>
<li><a href="/blog/funasr-llama-cpp-whisper-cpp-alternative.html">FunASR 跑进 llama.cpp(whisper.cpp 替代)</a></li>
<li><a href="/blog/funasr-vs-faster-whisper-chinese.html">FunASR vs faster-whisper(中文/粤语)</a></li>
<li><a href="/blog/lightweight-speech-recognition-cpu.html">轻量语音识别(CPU 250MB)</a></li>
<li><a href="/blog/self-hosted-deepgram-assemblyai-alternative.html">自托管替代 Deepgram/AssemblyAI</a></li>
<li><a href="/blog/which-funasr-model.html">选哪个 FunASR 模型</a></li>
<li><a href="/blog/cantonese-speech-recognition.html">粤语语音识别(SenseVoice 原生粤语)</a></li>
<li><a href="/blog/japanese-speech-recognition.html">日语语音识别(SenseVoice 转写+标点+情感)</a></li>
<li><a href="/blog/voice-activity-detection-python.html">Python 语音活动检测(VAD)</a></li>
<li><a href="/blog/self-hosted-google-aws-azure-speech-to-text.html">自托管替代 Google/AWS/Azure 云语音 API</a></li>
<li><a href="/blog/chinese-speech-recognition.html">中文语音识别(普通话)实战</a></li>
<li><a href="/blog/punctuation-restoration-python.html">标点恢复 Python 实战</a></li>
</ul>
</div></article>
<footer><div class="container">© 2024-2026 Tongyi Lab, Alibaba Group · <a href="https://github.com/modelscope/FunASR/blob/main/LICENSE">MIT License</a></div></footer>
</body>
</html>
@@ -0,0 +1,155 @@
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Python 语音活动检测(VAD):检测语音、去静音、按停顿切分音频 | FunASR 博客</title>
<meta name="description" content="怎么用 Python 做语音活动检测(VAD)?FunASR fsmn-vad 3 行代码返回每段语音的起止毫秒,可去静音、按停顿切分长录音、给任意 ASR(含 Whisper)做预处理防幻觉。附真实实测输出。">
<meta name="keywords" content="语音活动检测, VAD, voice activity detection python, vad python, 去静音, 音频切分, 静音检测, 按停顿切分音频, silero vad 替代, fsmn-vad, FunASR, 语音预处理">
<link rel="icon" href="/logo.png">
<meta property="og:title" content="Python 语音活动检测(VAD):检测语音、去静音、按停顿切分音频 | FunASR 博客">
<meta property="og:description" content="怎么用 Python 做语音活动检测(VAD)?FunASR fsmn-vad 3 行代码返回每段语音的起止毫秒,可去静音、按停顿切分长录音、给任意 ASR(含 Whisper)做预处理防幻觉。附真实实测输出。">
<meta property="og:type" content="article">
<meta property="og:url" content="https://www.funasr.com/blog/voice-activity-detection-python.html">
<meta property="og:image" content="https://www.funasr.com/logo.png">
<link rel="canonical" href="https://www.funasr.com/blog/voice-activity-detection-python.html">
<link rel="alternate" hreflang="en" href="https://www.funasr.com/en/blog/voice-activity-detection-python.html">
<link rel="alternate" hreflang="zh" href="https://www.funasr.com/blog/voice-activity-detection-python.html">
<link rel="alternate" hreflang="x-default" href="https://www.funasr.com/en/blog/voice-activity-detection-python.html">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"BlogPosting","headline":"Python 语音活动检测(VAD):检测语音、去静音、按停顿切分音频 | FunASR 博客","description":"怎么用 Python 做语音活动检测(VAD)?FunASR fsmn-vad 3 行代码返回每段语音的起止毫秒,可去静音、按停顿切分长录音、给任意 ASR(含 Whisper)做预处理防幻觉。附真实实测输出。","datePublished":"2026-06-22","dateModified":"2026-06-22","author":{"@type":"Organization","name":"FunASR / Tongyi Lab"},"publisher":{"@type":"Organization","name":"FunASR","logo":{"@type":"ImageObject","url":"https://www.funasr.com/logo.png"}},"mainEntityOfPage":{"@type":"WebPage","@id":"https://www.funasr.com/blog/voice-activity-detection-python.html"},"image":"https://www.funasr.com/logo.png"}
</script>
<style>:root{--primary:#2563eb;--primary-dark:#1d4ed8;--bg:#fff;--surface:#f8fafc;--border:#e2e8f0;--text:#0f172a;--text-soft:#475569;--text-muted:#94a3b8;--radius:12px}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:'Inter',-apple-system,sans-serif;color:var(--text);line-height:1.7}
a{color:var(--primary);text-decoration:none}a:hover{text-decoration:underline}
.container{max-width:800px;margin:0 auto;padding:0 24px}
.nav{position:fixed;top:0;left:0;right:0;z-index:100;background:rgba(255,255,255,0.9);backdrop-filter:blur(12px);border-bottom:1px solid var(--border);padding:14px 0}
.nav .container{max-width:1120px;display:flex;align-items:center;gap:24px}
.nav-logo{font-size:1.2rem;font-weight:800;color:var(--text)}.nav-logo span{color:var(--primary)}
.nav-links{display:flex;gap:20px;margin-left:auto;flex-wrap:wrap}
.nav-links a{font-size:0.85rem;font-weight:500;color:var(--text-soft)}
.nav-btn{padding:7px 16px;background:var(--primary);color:#fff;border-radius:7px;font-size:0.83rem;font-weight:600}
article{padding:120px 0 80px}
h1{font-size:2rem;font-weight:800;line-height:1.3;margin-bottom:14px}
h2{font-size:1.3rem;font-weight:700;margin:36px 0 14px;padding-top:16px;border-top:1px solid var(--border)}
h3{font-size:1.05rem;font-weight:700;margin:22px 0 10px}
p{margin-bottom:14px;color:var(--text-soft)}
ul,ol{margin:0 0 14px 22px;color:var(--text-soft)}li{margin-bottom:6px}
table{width:100%;border-collapse:collapse;margin:16px 0;font-size:0.86rem}
th,td{padding:10px 12px;text-align:left;border-bottom:1px solid var(--border)}
th{font-weight:600;background:var(--surface);font-size:0.78rem;color:var(--text-muted)}
pre{background:#1e293b;color:#e2e8f0;padding:18px;border-radius:10px;overflow-x:auto;font-size:0.82rem;line-height:1.7;margin:14px 0}
code{font-family:ui-monospace,Menlo,monospace}
p code,li code{background:var(--surface);padding:2px 6px;border-radius:5px;font-size:0.85em;color:var(--primary-dark)}
.post-meta{color:var(--text-muted);font-size:0.85rem;margin-bottom:24px}
.cta{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:24px;margin:28px 0;text-align:center}
.cta a.btn{display:inline-block;padding:10px 24px;background:var(--primary);color:#fff;border-radius:8px;font-weight:600}
.post-list{list-style:none;margin:0;padding:0}
.post-list li{margin:0 0 8px}
.post-card{display:block;border:1px solid var(--border);border-radius:var(--radius);padding:20px 22px;margin-bottom:14px}
.post-card:hover{border-color:var(--primary);text-decoration:none}
.post-card h2{border:none;padding:0;margin:0 0 6px;font-size:1.15rem;color:var(--text)}
.post-card p{margin:0;color:var(--text-soft);font-size:0.9rem}
.post-card .date{color:var(--text-muted);font-size:0.8rem}
footer{background:#0f172a;color:#94a3b8;padding:28px 0;text-align:center;font-size:0.8rem}
footer a{color:#94a3b8}</style>
</head>
<body>
<nav class="nav"><div class="container"><a href="/" class="nav-logo">Fun<span>ASR</span></a><div class="nav-links"><a href="/#capabilities">核心能力</a><a href="/#usage">如何使用</a><a href="/#benchmark">性能</a><a href="/#demo">演示</a><a href="https://modelscope.github.io/FunASR/zh/" target="_blank">文档</a><a href="/quickstart.html">快速上手</a><a href="/models.html">模型</a><a href="/ecosystem.html">生态</a><a href="/blog/">技术博客</a><a href="/vs-whisper.html">对比 Whisper</a><a href="/donors.html">功德榜</a></div><a href="https://www.funasr.com/en/blog/voice-activity-detection-python.html" style="font-size:0.83rem;font-weight:500;color:var(--text-soft)">EN</a><a href="https://github.com/modelscope/FunASR" target="_blank" class="nav-btn">GitHub ★</a></div></nav>
<article><div class="container">
<h1>Python 语音活动检测(VAD):检测语音、去静音、按停顿切分音频</h1>
<p class="post-meta">2026-06-22 · FunASR 团队</p>
<p><strong>语音活动检测(VAD,Voice Activity Detection)</strong>是音频处理的基础一环:从一段录音里找出"哪里有人在说话、哪里是静音/噪声"。它是几乎所有语音流程的第一步——去掉静音省算力、把长录音按停顿切成小段、给下游 ASR 做预处理(<strong>包括给 Whisper 喂干净音频以省钱、防它在静音处胡乱"幻觉"出文字</strong>)。</p>
<p><strong>FunASR 的 <code>fsmn-vad</code></strong> 是一个工业级、轻量、极快的开源 VAD 模型,3 行 Python 就能用,返回每段语音的<strong>起止毫秒</strong>。下面全部是真实实测输出。</p>
<h2>3 行代码做 VAD</h2>
<pre>pip install funasr
from funasr import AutoModel
model = AutoModel(model="fsmn-vad", disable_update=True)
segments = model.generate(input="audio.wav")[0]["value"]
print(segments)
# [[610, 5530]] # 单位:毫秒 —— 语音从 0.61s 到 5.53s,开头 610ms 静音被自动剔除</pre>
<p>返回值是 <code>[[start_ms, end_ms], ...]</code> 的列表,每个区间是一段连续语音。上例里一段 5.55s 的录音,开头的 0.61s 静音被自动去掉了。</p>
<h2>真实示例:13 秒录音切成 2 段</h2>
<p>把两段话中间插 1.5s 停顿拼成一段 13.31s 的录音(模拟真实带停顿的录音),VAD 的真实输出:</p>
<table>
<tr><th>语音段</th><th>起止</th><th>时长</th></tr>
<tr><td>seg0</td><td>0.61s → 5.45s</td><td>4.84s</td></tr>
<tr><td>seg1</td><td>7.28s → 13.29s</td><td>6.01s</td></tr>
</table>
<p>VAD 准确切出两段语音、把中间 1.5s 的停顿(5.45s~7.28s)和开头静音都识别为非语音。整段 13.31s 里语音占 82%,<strong>剔除了 18% 的静音</strong>。这一步在 GPU 上只花了 <strong>0.12 秒(约 110× 实时)</strong>——VAD 本身极轻,几乎不增加流程开销。</p>
<h2>三个实用场景</h2>
<h3>1. 去静音 / 只保留语音</h3>
<pre>import soundfile as sf
import numpy as np
audio, sr = sf.read("audio.wav")
segments = model.generate(input="audio.wav")[0]["value"]
# 拼接所有语音段,丢弃静音
speech = np.concatenate([audio[int(s/1000*sr):int(e/1000*sr)] for s, e in segments])
sf.write("speech_only.wav", speech, sr)</pre>
<h3>2. 按停顿把长录音切成多个文件(便于批量识别)</h3>
<pre>for i, (s, e) in enumerate(segments):
chunk = audio[int(s/1000*sr):int(e/1000*sr)]
sf.write(f"chunk_{i}.wav", chunk, sr)
# chunk_0.wav, chunk_1.wav, ... 每个文件是一段独立语音</pre>
<h3>3. 给任何 ASR(含 Whisper)做预处理</h3>
<p>在跑识别<strong>之前</strong>先做 VAD,有两个实打实的好处:① 不把静音/噪声送进模型 = <strong>省算力、降成本</strong>;② Whisper 在长静音处容易"幻觉"出重复文字,<strong>先用 VAD 切掉静音能显著减少幻觉</strong>。FunASR 的 ASR 模型(SenseVoice / Paraformer)更是可以直接 <code>vad_model="fsmn-vad"</code> 一行接上,内部自动分段。</p>
<pre>from funasr import AutoModel
# ASR 直接挂载 VAD,长音频自动分段识别
asr = AutoModel(model="iic/SenseVoiceSmall", vad_model="fsmn-vad")
result = asr.generate(input="long_audio.wav")</pre>
<h2>为什么用 fsmn-vad</h2>
<table>
<tr><th></th><th>fsmn-vad(FunASR)</th></tr>
<tr><td>用法</td><td>3 行 Python,返回毫秒级语音区间</td></tr>
<tr><td>速度</td><td>实测 13s 音频 0.12s(约 110× 实时)</td></tr>
<tr><td>体量</td><td>轻量 FSMN 结构,CPU 也能实时跑</td></tr>
<tr><td>生态</td><td>可独立用,也能一行挂到 FunASR 的 ASR 上自动分段</td></tr>
<tr><td>许可证</td><td>开源,可商用</td></tr>
</table>
<p>如果你已经在用 FunASR 做识别,VAD 是同一套工具、零额外依赖;如果你在用 Whisper 或别的 ASR,也可以把 fsmn-vad 当成独立的预处理器。想看完整的语音流程,可参考 <a href="/blog/funasr-transcribe-long-audio.html">转写超长音频</a> 和 <a href="/blog/funasr-speaker-diarization.html">说话人分离</a>。</p>
<div class="cta"><p><strong>FunASR 全家桶都是开源的</strong>——fsmn-vad、工业级 ASR、标点、说话人、情感事件、LLM-ASR,拿来即用。觉得有用就点个 Star 支持一下 👇</p><p><a class="btn" href="https://github.com/modelscope/FunASR" target="_blank">⭐ Star FunASR</a></p><p style="margin-top:10px;font-size:0.85rem">也欢迎 Star:<a href="https://github.com/QwenAudio/SenseVoice" target="_blank">SenseVoice</a> · <a href="https://github.com/QwenAudio/Fun-ASR" target="_blank">Fun-ASR</a> · <a href="https://github.com/modelscope/FunClip" target="_blank">FunClip</a></p></div>
<!--related-posts-->
<h2>相关文章</h2>
<ul class="post-list">
<li><a href="/blog/funasr-vs-whisper-benchmark.html">FunASR vs Whisper 实测对比</a></li>
<li><a href="/blog/sensevoice-deployment-guide.html">SenseVoice 部署指南</a></li>
<li><a href="/blog/fun-asr-nano-guide.html">Fun-ASR-Nano 使用指南</a></li>
<li><a href="/blog/funasr-speaker-diarization.html">说话人分离:谁在何时说话</a></li>
<li><a href="/blog/sensevoice-emotion-language-detection.html">情感与语种检测</a></li>
<li><a href="/blog/funasr-realtime-streaming-asr.html">实时流式语音识别</a></li>
<li><a href="/blog/funasr-transcribe-long-audio.html">转写超长音频(1小时一次搞定)</a></li>
<li><a href="/blog/funasr-cli-transcribe-command-line.html">命令行转写(文本/JSON/SRT)</a></li>
<li><a href="/blog/self-hosted-openai-whisper-api-alternative.html">自托管 OpenAI Whisper API 替代</a></li>
<li><a href="/blog/generate-subtitles-srt-vtt-from-audio-video.html">自动生成字幕(SRT / VTT)</a></li>
<li><a href="/blog/speech-to-text-python-transcribe-audio.html">Python 语音转文字教程</a></li>
<li><a href="/blog/funasr-llama-cpp-whisper-cpp-alternative.html">FunASR 跑进 llama.cpp(whisper.cpp 替代)</a></li>
<li><a href="/blog/funasr-vs-faster-whisper-chinese.html">FunASR vs faster-whisper(中文/粤语)</a></li>
<li><a href="/blog/lightweight-speech-recognition-cpu.html">轻量语音识别(CPU 250MB)</a></li>
<li><a href="/blog/self-hosted-deepgram-assemblyai-alternative.html">自托管替代 Deepgram/AssemblyAI</a></li>
<li><a href="/blog/which-funasr-model.html">选哪个 FunASR 模型</a></li>
<li><a href="/blog/cantonese-speech-recognition.html">粤语语音识别(SenseVoice 原生粤语)</a></li>
<li><a href="/blog/japanese-speech-recognition.html">日语语音识别(SenseVoice 转写+标点+情感)</a></li>
<li><a href="/blog/self-hosted-google-aws-azure-speech-to-text.html">自托管替代 Google/AWS/Azure 云语音 API</a></li>
<li><a href="/blog/chinese-speech-recognition.html">中文语音识别(普通话)实战</a></li>
<li><a href="/blog/punctuation-restoration-python.html">标点恢复 Python 实战</a></li>
<li><a href="/blog/speech-to-text-timestamps-python.html">语音识别带时间戳(字级)</a></li>
</ul>
</div></article>
<footer><div class="container">© 2024-2026 Tongyi Lab, Alibaba Group · <a href="https://github.com/modelscope/FunASR/blob/main/LICENSE">MIT License</a></div></footer>
</body>
</html>
@@ -0,0 +1,157 @@
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>选哪个 FunASR 模型?Nano vs MLT-Nano vs SenseVoice vs Paraformer(2026 指南)| FunASR 博客</title>
<meta name="description" content="FunASR 模型怎么选?有 GPU、识别中英日及中文方言/口音用旗舰 Fun-ASR-Nano(CER 8.06%);需要 31 语种用独立 Fun-ASR-MLT-Nano;CPU 用 SenseVoice;CPU+纯中文+时间戳/热词用 Paraformer。">
<meta name="keywords" content="FunASR 模型选型, Fun-ASR-Nano, Fun-ASR-MLT-Nano, SenseVoice, Paraformer, 哪个语音识别模型, sensevoice vs paraformer, 31 语种语音识别, 语音识别模型对比, FunASR">
<link rel="icon" href="/logo.png">
<meta property="og:title" content="选哪个 FunASR 模型?Nano vs MLT-Nano vs SenseVoice vs Paraformer(2026 指南)| FunASR 博客">
<meta property="og:description" content="FunASR 模型怎么选?有 GPU、识别中英日及中文方言/口音用旗舰 Fun-ASR-Nano(CER 8.06%);需要 31 语种用独立 Fun-ASR-MLT-Nano;CPU 用 SenseVoice;CPU+纯中文+时间戳/热词用 Paraformer。">
<meta property="og:type" content="article">
<meta property="og:url" content="https://www.funasr.com/blog/which-funasr-model.html">
<meta property="og:image" content="https://www.funasr.com/logo.png">
<link rel="canonical" href="https://www.funasr.com/blog/which-funasr-model.html">
<link rel="alternate" hreflang="en" href="https://www.funasr.com/en/blog/which-funasr-model.html">
<link rel="alternate" hreflang="zh" href="https://www.funasr.com/blog/which-funasr-model.html">
<link rel="alternate" hreflang="x-default" href="https://www.funasr.com/en/blog/which-funasr-model.html">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"BlogPosting","headline":"选哪个 FunASR 模型?Nano vs MLT-Nano vs SenseVoice vs Paraformer(2026 指南)| FunASR 博客","description":"FunASR 模型怎么选?有 GPU、识别中英日及中文方言/口音用旗舰 Fun-ASR-Nano(CER 8.06%);需要 31 语种用独立 Fun-ASR-MLT-Nano;CPU 用 SenseVoice;CPU+纯中文+时间戳/热词用 Paraformer。","datePublished":"2026-06-23","dateModified":"2026-07-15","author":{"@type":"Organization","name":"FunASR / Tongyi Lab"},"publisher":{"@type":"Organization","name":"FunASR","logo":{"@type":"ImageObject","url":"https://www.funasr.com/logo.png"}},"mainEntityOfPage":{"@type":"WebPage","@id":"https://www.funasr.com/blog/which-funasr-model.html"},"image":"https://www.funasr.com/logo.png"}
</script>
<style>:root{--primary:#2563eb;--primary-dark:#1d4ed8;--bg:#fff;--surface:#f8fafc;--border:#e2e8f0;--text:#0f172a;--text-soft:#475569;--text-muted:#94a3b8;--radius:12px}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:'Inter',-apple-system,sans-serif;color:var(--text);line-height:1.7}
a{color:var(--primary);text-decoration:none}a:hover{text-decoration:underline}
.container{max-width:800px;margin:0 auto;padding:0 24px}
.nav{position:fixed;top:0;left:0;right:0;z-index:100;background:rgba(255,255,255,0.9);backdrop-filter:blur(12px);border-bottom:1px solid var(--border);padding:14px 0}
.nav .container{max-width:1120px;display:flex;align-items:center;gap:24px}
.nav-logo{font-size:1.2rem;font-weight:800;color:var(--text)}.nav-logo span{color:var(--primary)}
.nav-links{display:flex;gap:20px;margin-left:auto;flex-wrap:wrap}
.nav-links a{font-size:0.85rem;font-weight:500;color:var(--text-soft)}
.nav-btn{padding:7px 16px;background:var(--primary);color:#fff;border-radius:7px;font-size:0.83rem;font-weight:600}
article{padding:120px 0 80px}
h1{font-size:2rem;font-weight:800;line-height:1.3;margin-bottom:14px}
h2{font-size:1.3rem;font-weight:700;margin:36px 0 14px;padding-top:16px;border-top:1px solid var(--border)}
h3{font-size:1.05rem;font-weight:700;margin:22px 0 10px}
p{margin-bottom:14px;color:var(--text-soft)}
ul,ol{margin:0 0 14px 22px;color:var(--text-soft)}li{margin-bottom:6px}
table{width:100%;border-collapse:collapse;margin:16px 0;font-size:0.86rem}
th,td{padding:10px 12px;text-align:left;border-bottom:1px solid var(--border)}
th{font-weight:600;background:var(--surface);font-size:0.78rem;color:var(--text-muted)}
pre{background:#1e293b;color:#e2e8f0;padding:18px;border-radius:10px;overflow-x:auto;font-size:0.82rem;line-height:1.7;margin:14px 0}
code{font-family:ui-monospace,Menlo,monospace}
p code,li code{background:var(--surface);padding:2px 6px;border-radius:5px;font-size:0.85em;color:var(--primary-dark)}
.post-meta{color:var(--text-muted);font-size:0.85rem;margin-bottom:24px}
.cta{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:24px;margin:28px 0;text-align:center}
.cta a.btn{display:inline-block;padding:10px 24px;background:var(--primary);color:#fff;border-radius:8px;font-weight:600}
.post-list{list-style:none;margin:0;padding:0}
.post-list li{margin:0 0 8px}
.post-card{display:block;border:1px solid var(--border);border-radius:var(--radius);padding:20px 22px;margin-bottom:14px}
.post-card:hover{border-color:var(--primary);text-decoration:none}
.post-card h2{border:none;padding:0;margin:0 0 6px;font-size:1.15rem;color:var(--text)}
.post-card p{margin:0;color:var(--text-soft);font-size:0.9rem}
.post-card .date{color:var(--text-muted);font-size:0.8rem}
footer{background:#0f172a;color:#94a3b8;padding:28px 0;text-align:center;font-size:0.8rem}
footer a{color:#94a3b8}
@media(max-width:900px){.nav-links{display:none}.nav .container{gap:16px}.nav-logo{margin-right:auto}table{table-layout:fixed;font-size:0.78rem}th,td{padding:8px 4px;overflow-wrap:anywhere}}
</style>
</head>
<body>
<nav class="nav"><div class="container"><a href="/" class="nav-logo">Fun<span>ASR</span></a><div class="nav-links"><a href="/#capabilities">核心能力</a><a href="/#usage">如何使用</a><a href="/#benchmark">性能</a><a href="/#demo">演示</a><a href="https://modelscope.github.io/FunASR/zh/" target="_blank">文档</a><a href="/quickstart.html">快速上手</a><a href="/models.html">模型</a><a href="/ecosystem.html">生态</a><a href="/blog/">技术博客</a><a href="/vs-whisper.html">对比 Whisper</a><a href="/donors.html">功德榜</a></div><a href="https://www.funasr.com/en/blog/which-funasr-model.html" style="font-size:0.83rem;font-weight:500;color:var(--text-soft)">EN</a><a href="https://github.com/modelscope/FunASR" target="_blank" class="nav-btn">GitHub ★</a></div></nav>
<article><div class="container">
<h1>选哪个 FunASR 模型?Nano vs MLT-Nano vs SenseVoice vs Paraformer(2026 选型指南)</h1>
<p class="post-meta">2026-07-15 更新 · FunASR 团队</p>
<p>FunASR 提供三个主力模型族,Fun-ASR 另有独立的 MLT-Nano 多语 checkpoint。一句话选型:<strong>有 GPU、识别中英日及中文方言/口音就用旗舰 Fun-ASR-Nano;需要 31 语种用 Fun-ASR-MLT-Nano;只有 CPU 用 SenseVoice;CPU 且纯中文、要时间戳/热词用 Paraformer。</strong></p>
<h2>一张表选型</h2>
<table>
<tr><th>你的情况</th><th>选</th><th>为什么</th></tr>
<tr><td><strong>有 GPU / 中英日及中文方言/口音 / 要最强效果</strong></td><td>⭐ <strong>Fun-ASR-Nano</strong></td><td>LLM-ASR 旗舰,上下文/难例最强,中文 CER 8.06%</td></tr>
<tr><td>需要广泛多语种覆盖</td><td><strong>Fun-ASR-MLT-Nano</strong></td><td>独立 checkpoint,覆盖 31 种语言</td></tr>
<tr><td>只有 CPU / 边缘 / 要最快</td><td>SenseVoice</td><td>非自回归极快,CPU 也能实时,多语种+情感,CER 7.81%</td></tr>
<tr><td>CPU + 纯中文 + 要时间戳/热词</td><td>Paraformer</td><td>最轻量,字级时间戳,热词定制,CER 10.18%</td></tr>
</table>
<p>表中的中文 CER 数据比较 Nano、SenseVoice 和 Paraformer,三者都远好于 Whisper(~20%)。CER 上 SenseVoice 略低,但 <strong>Fun-ASR-Nano 是基于 LLM 的旗舰模型</strong>——在真实复杂音频、上下文和专名上更鲁棒。MLT-Nano 用于 31 语种覆盖,不要把它的语言范围写到 Nano 上。</p>
<h2>Fun-ASR-Nano —— LLM-ASR 旗舰,默认首选(GPU)</h2>
<p>SenseVoice 编码器 + Qwen3-0.6B 解码,支持中文、英文、日语,以及 7 种中文方言和 26 种地域口音;具备 LLM 的上下文理解,难例与长尾词表现最好。</p>
<pre>pip install funasr
from funasr import AutoModel
model = AutoModel(model="FunAudioLLM/Fun-ASR-Nano-2512", disable_update=True, device="cuda")
res = model.generate(input="audio.wav")
print(res[0]["text"])
# 欢迎大家来体验达摩院推出的语音识别模型。</pre>
<p>模型:<a href="https://huggingface.co/FunAudioLLM/Fun-ASR-Nano-2512" target="_blank" rel="noopener">Hugging Face</a> · <a href="https://modelscope.cn/models/FunAudioLLM/Fun-ASR-Nano-2512" target="_blank" rel="noopener">ModelScope</a>。大规模/高并发可用 vLLM 加速(实测约 340× 实时)。详见 <a href="/blog/fun-asr-nano-guide.html">Fun-ASR-Nano 使用指南</a>。</p>
<h2>Fun-ASR-MLT-Nano —— 独立的 31 语种 checkpoint(GPU)</h2>
<p>需要跨 31 种语言识别时选择 MLT-Nano。它与旗舰 Nano 是两个独立 checkpoint,模型 ID 和语言范围都不同。</p>
<p>模型:<a href="https://huggingface.co/FunAudioLLM/Fun-ASR-MLT-Nano-2512" target="_blank" rel="noopener">Hugging Face</a> · <a href="https://modelscope.cn/models/FunAudioLLM/Fun-ASR-MLT-Nano-2512" target="_blank" rel="noopener">ModelScope</a>。</p>
<h2>SenseVoice —— CPU/边缘首选</h2>
<p>非自回归、轻量极快,CPU 也能实时,一遍出语种+情感+音频事件;q8 量化仅约 250MB。CPU 部署或要最低延迟时首选。</p>
<pre>from funasr import AutoModel
from funasr.utils.postprocess_utils import rich_transcription_postprocess
model = AutoModel(model="iic/SenseVoiceSmall", disable_update=True) # CPU 默认
res = model.generate(input="audio.wav", language="auto", use_itn=True)
print(rich_transcription_postprocess(res[0]["text"]))
# 欢迎大家来体验达摩院推出的语音识别模型。</pre>
<h2>Paraformer —— CPU + 纯中文(时间戳/热词)</h2>
<p>最轻量的中文识别,提供<strong>字级时间戳</strong>和<strong>热词</strong>定制,做字幕或要逐字对齐时用它。</p>
<pre>from funasr import AutoModel
model = AutoModel(model="paraformer-zh", vad_model="fsmn-vad", punc_model="ct-punc")
res = model.generate(input="audio.wav", batch_size_s=300)
print(res[0]["text"])
# 欢迎大家来体验达摩院推出的语音识别模型。
# res[0]["timestamp"] -> [[880, 1120], [1120, 1360], ...] 每个字的起止毫秒</pre>
<h2>快速决策</h2>
<ul>
<li><strong>要覆盖 31 语种?</strong> → Fun-ASR-MLT-Nano。</li>
<li><strong>有 GPU,主要识别中英日及中文方言/口音?</strong> → Fun-ASR-Nano(默认旗舰)。</li>
<li><strong>只有 CPU?</strong> 纯中文且要时间戳/热词 → Paraformer;否则(含多语种/情感) → SenseVoice。</li>
<li><strong>要粤语?</strong> SenseVoice 原生支持,见 <a href="/blog/cantonese-speech-recognition.html">粤语语音识别</a>。</li>
</ul>
<p>更多:<a href="/blog/chinese-speech-recognition.html">中文语音识别实战</a> · <a href="/blog/funasr-vs-whisper-benchmark.html">FunASR vs Whisper benchmark</a> · <a href="/blog/fun-asr-nano-guide.html">Fun-ASR-Nano 指南</a>。</p>
<div class="cta"><p><strong>FunASR 全家桶开源(MIT)</strong>——Fun-ASR-Nano / MLT-Nano + SenseVoice + Paraformer + VAD/标点/说话人。觉得有用就点个 Star 👇</p><p><a class="btn" href="https://github.com/QwenAudio/Fun-ASR" target="_blank">⭐ Star Fun-ASR</a></p><p style="margin-top:10px;font-size:0.85rem">也欢迎 Star:<a href="https://github.com/modelscope/FunASR" target="_blank">FunASR</a> · <a href="https://github.com/QwenAudio/SenseVoice" target="_blank">SenseVoice</a> · <a href="https://github.com/modelscope/FunClip" target="_blank">FunClip</a></p></div>
<!--related-posts-->
<h2>相关文章</h2>
<ul class="post-list">
<li><a href="/blog/funasr-vs-whisper-benchmark.html">FunASR vs Whisper 实测对比</a></li>
<li><a href="/blog/sensevoice-deployment-guide.html">SenseVoice 部署指南</a></li>
<li><a href="/blog/fun-asr-nano-guide.html">Fun-ASR-Nano 使用指南</a></li>
<li><a href="/blog/funasr-speaker-diarization.html">说话人分离:谁在何时说话</a></li>
<li><a href="/blog/sensevoice-emotion-language-detection.html">情感与语种检测</a></li>
<li><a href="/blog/funasr-realtime-streaming-asr.html">实时流式语音识别</a></li>
<li><a href="/blog/funasr-transcribe-long-audio.html">转写超长音频(1小时一次搞定)</a></li>
<li><a href="/blog/funasr-cli-transcribe-command-line.html">命令行转写(文本/JSON/SRT)</a></li>
<li><a href="/blog/self-hosted-openai-whisper-api-alternative.html">自托管 OpenAI Whisper API 替代</a></li>
<li><a href="/blog/generate-subtitles-srt-vtt-from-audio-video.html">自动生成字幕(SRT / VTT)</a></li>
<li><a href="/blog/speech-to-text-python-transcribe-audio.html">Python 语音转文字教程</a></li>
<li><a href="/blog/funasr-llama-cpp-whisper-cpp-alternative.html">FunASR 跑进 llama.cpp(whisper.cpp 替代)</a></li>
<li><a href="/blog/funasr-vs-faster-whisper-chinese.html">FunASR vs faster-whisper(中文/粤语)</a></li>
<li><a href="/blog/lightweight-speech-recognition-cpu.html">轻量语音识别(CPU 250MB)</a></li>
<li><a href="/blog/self-hosted-deepgram-assemblyai-alternative.html">自托管替代 Deepgram/AssemblyAI</a></li>
<li><a href="/blog/cantonese-speech-recognition.html">粤语语音识别(SenseVoice 原生粤语)</a></li>
<li><a href="/blog/japanese-speech-recognition.html">日语语音识别(SenseVoice 转写+标点+情感)</a></li>
<li><a href="/blog/voice-activity-detection-python.html">Python 语音活动检测(VAD)</a></li>
<li><a href="/blog/self-hosted-google-aws-azure-speech-to-text.html">自托管替代 Google/AWS/Azure 云语音 API</a></li>
<li><a href="/blog/chinese-speech-recognition.html">中文语音识别(普通话)实战</a></li>
<li><a href="/blog/punctuation-restoration-python.html">标点恢复 Python 实战</a></li>
<li><a href="/blog/speech-to-text-timestamps-python.html">语音识别带时间戳(字级)</a></li>
</ul>
</div></article>
<footer><div class="container">© 2024-2026 Tongyi Lab, Alibaba Group · <a href="https://github.com/modelscope/FunASR/blob/main/LICENSE">MIT License</a></div></footer>
</body>
</html>
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,2 @@
/*! {"remote-origin-url":"https://github.com/alibaba-damo-academy/FunASR\n","branch":"main\n","commithash":"e8f535f53320780cd8ed6f3b8588b187935d3ae5\n"} */body,html{width:100%;height:100%}html>body{overflow:hidden;min-width:1280px;max-width:1920px;margin:0 auto;-webkit-transform:translateZ(0);transform:translateZ(0)}li,p,ul{padding:0;margin:0}li{list-style:none}a{text-decoration:none}button,input,textarea{outline:none;border:none}textarea{resize:none}img{border:none;vertical-align:middle}.ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.xmgl-icon{line-height:1}.app-container{background-color:#eff2f6}.app-container,.app-container .app-content{width:100%;height:100%}.page-container{width:100%;padding:.78125rem}.page-container .page-title{padding-top:2.34375rem;padding-bottom:1.8229166667rem;font-size:2.0833333333rem;font-weight:700;color:#333;text-align:center}.page-content{width:62.5rem;margin:0 auto}.page-content,.page-list-content{background-color:#fff;-webkit-box-shadow:0 1px 0 0 rgba(178,188,198,.51);box-shadow:0 1px 0 0 rgba(178,188,198,.51)}.ui-jessibuca{width:100%;height:100%}.ui-scrollbar{overflow:hidden;position:relative}.ui-scrollbar.child-over-width .ui-scrollbar__view{max-width:100%}.ui-scrollbar:active>.ui-scrollbar__bar,.ui-scrollbar:focus>.ui-scrollbar__bar,.ui-scrollbar:hover>.ui-scrollbar__bar{opacity:1;-webkit-transition:opacity .34s ease-out;transition:opacity .34s ease-out}.ui-scrollbar__wrap{overflow:scroll;height:100%}.ui-scrollbar__view{display:inline-block;vertical-align:middle;min-width:100%}.ui-scrollbar__bar{position:absolute;right:2px;bottom:2px;z-index:1;border-radius:4px;opacity:0;-webkit-transition:opacity .12s ease-out;transition:opacity .12s ease-out}.ui-scrollbar__bar.is-horizontal{height:6px;left:2px}.ui-scrollbar__bar.is-horizontal>div{height:100%}.ui-scrollbar__bar.is-vertical{width:6px;top:2px}.ui-scrollbar__bar.is-vertical>div{width:100%}.ui-scrollbar__thumb{position:relative;display:block;width:0;height:0;cursor:pointer;border-radius:inherit;background-color:hsla(220,4%,58%,.3);-webkit-transition:background-color .3s;transition:background-color .3s}.ui-scrollbar__thumb:hover{background-color:hsla(225,4%,58%,.5)}
/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}
File diff suppressed because one or more lines are too long
+57
View File
@@ -0,0 +1,57 @@
<!DOCTYPE html>
<html lang="zh"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>FunASR 社区功德榜</title><meta name="description" content="FunASR 社区功德榜,感谢支持开源社区建设的朋友们。捐赠用于购买和维护服务器,以及购买、续费和维护 www.funasr.com 域名。"><meta name="keywords" content="FunASR 功德榜,FunASR 捐赠名单,FunASR 社区">
<link rel="icon" href="/logo.png"><meta property="og:title" content="FunASR 社区功德榜"><meta property="og:description" content="感谢支持 FunASR 社区建设的朋友们。捐赠用于购买和维护服务器,以及购买、续费和维护 www.funasr.com 域名。">
<meta property="og:type" content="website"><meta property="og:url" content="https://www.funasr.com/donors.html"><meta property="og:image" content="https://www.funasr.com/logo.png">
<link rel="canonical" href="https://www.funasr.com/donors.html"><link rel="alternate" hreflang="en" href="https://www.funasr.com/en/donors.html"><link rel="alternate" hreflang="zh" href="https://www.funasr.com/donors.html"><link rel="alternate" hreflang="x-default" href="https://www.funasr.com/en/donors.html">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"WebPage","name":"FunASR 社区功德榜","url":"https://www.funasr.com/donors.html","description":"FunASR community donor acknowledgements."}
</script>
<style>:root{--primary:#2563eb;--primary-dark:#1d4ed8;--surface:#f8fafc;--border:#e2e8f0;--text:#0f172a;--text-soft:#475569;--text-muted:#94a3b8;--radius:12px}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:'Inter',-apple-system,BlinkMacSystemFont,sans-serif;color:var(--text);line-height:1.7;background:#fff;-webkit-font-smoothing:antialiased}
a{color:var(--primary);text-decoration:none}a:hover{text-decoration:underline}
.container{max-width:860px;margin:0 auto;padding:0 24px}
.nav{position:fixed;top:0;left:0;right:0;z-index:100;background:rgba(255,255,255,0.9);backdrop-filter:blur(12px);border-bottom:1px solid var(--border);padding:14px 0}
.nav .container{max-width:1120px;display:flex;align-items:center;gap:24px}
.nav-logo{font-size:1.2rem;font-weight:800;color:var(--text);text-decoration:none}.nav-logo span{color:var(--primary)}
.nav-links{display:flex;gap:20px;margin-left:auto;flex-wrap:wrap}
.nav-links a{font-size:0.85rem;font-weight:500;color:var(--text-soft);text-decoration:none}.nav-links a:hover{color:var(--primary)}
.nav-btn{padding:7px 16px;background:var(--primary);color:#fff;border-radius:7px;font-size:0.83rem;font-weight:600;text-decoration:none}
main{padding:124px 0 86px}
.eyebrow{color:var(--primary);font-size:0.78rem;font-weight:700;letter-spacing:0.08em;text-transform:uppercase;margin-bottom:10px}
h1{font-size:2.1rem;font-weight:800;line-height:1.25;margin-bottom:12px}
.lead{color:var(--text-soft);font-size:1rem;max-width:680px;margin-bottom:28px}
.donor-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin:28px 0}
.donor-card{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:14px 16px;border:1px solid var(--border);border-radius:8px;background:var(--surface)}
.donor-card strong{font-size:0.95rem;color:var(--text);font-weight:650}
.donor-card span{font-size:0.84rem;color:var(--text-muted);white-space:nowrap}
.note{border-top:1px solid var(--border);padding-top:18px;margin-top:28px;font-size:0.88rem;color:var(--text-soft)}
footer{background:#0f172a;color:#94a3b8;padding:28px 0;text-align:center;font-size:0.8rem}footer a{color:#94a3b8}
@media(max-width:900px){.nav-links{display:none}.nav .container{gap:16px}.nav-logo{margin-right:auto}.donor-grid{grid-template-columns:repeat(2,1fr)}}
@media(max-width:600px){main{padding-top:104px}.donor-grid{grid-template-columns:1fr}h1{font-size:1.75rem}}
</style></head><body>
<nav class="nav"><div class="container"><a href="/" class="nav-logo">Fun<span>ASR</span></a><div class="nav-links"><a href="/#capabilities">核心能力</a><a href="/#usage">如何使用</a><a href="/#benchmark">性能</a><a href="/#demo">演示</a><a href="https://modelscope.github.io/FunASR/zh/" target="_blank">文档</a><a href="/quickstart.html">快速上手</a><a href="/models.html">模型</a><a href="/ecosystem.html">生态</a><a href="/blog/">技术博客</a><a href="/vs-whisper.html">对比 Whisper</a><a href="/donors.html">功德榜</a></div><a href="/en/donors.html" style="font-size:0.83rem;font-weight:500;color:var(--text-soft)">EN</a><a href="https://github.com/modelscope/FunASR" target="_blank" class="nav-btn">GitHub ★</a></div></nav>
<main><div class="container">
<div class="eyebrow">Community</div>
<h1>FunASR 社区功德榜</h1>
<p class="lead">感谢每一位支持 FunASR 开源社区的朋友。捐赠资金用于社区基础设施建设,包括购买和维护服务器,以及购买、续费和维护 <a href="https://www.funasr.com/">www.funasr.com</a> 域名,保障官网、文档和社区服务稳定运行。下列名单整理自历史官网首页,仅作为社区致谢保留。</p>
<div class="donor-grid" aria-label="FunASR 社区功德榜">
<div class="donor-card"><strong>刘连响</strong><span>300 元</span></div>
<div class="donor-card"><strong>程俊陶</strong><span>300 元</span></div>
<div class="donor-card"><strong>黄明</strong><span>236 元</span></div>
<div class="donor-card"><strong>高志付</strong><span>235 元</span></div>
<div class="donor-card"><strong>陈翔</strong><span>200 元</span></div>
<div class="donor-card"><strong>夏侯杰</strong><span>200 元</span></div>
<div class="donor-card"><strong>黄药师</strong><span>198 元</span></div>
<div class="donor-card"><strong>肖炜</strong><span>100 元</span></div>
<div class="donor-card"><strong>刘柱</strong><span>100 元</span></div>
<div class="donor-card"><strong>黄水杯</strong><span>85 元</span></div>
<div class="donor-card"><strong>子龙</strong><span>85 元</span></div>
</div>
<p class="note">感谢大家让 FunASR 的开源社区可以持续向前。若名单或金额需要更正,请通过 GitHub issue 联系维护者。</p>
</div></main>
<footer><div class="container">© 2024-2026 Tongyi Lab, Alibaba Group · <a href="https://github.com/modelscope/FunASR/blob/main/LICENSE">MIT License</a></div></footer>
<script src="/stats/tracker.js" async></script>
</body></html>
@@ -0,0 +1,400 @@
<!DOCTYPE html>
<html lang="zh">
<head><meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate"><meta http-equiv="Pragma" content="no-cache"><meta http-equiv="Expires" content="0">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>FunASR 生态 — 集成 FunASR 的开源项目</title>
<meta name="description" content="超过 50 个开源项目集成了 FunASR 语音识别:会议转写、视频字幕、语音输入、AI 智能体等。">
<link rel="icon" href="logo.png">
<meta property="og:title" content="FunASR 生态 — 集成 FunASR 的开源项目">
<meta property="og:description" content="50+ 开源项目使用 FunASR 进行语音识别,涵盖视频处理、语音输入、AI 平台等领域。">
<meta property="og:type" content="article">
<meta property="og:url" content="https://www.funasr.com/ecosystem.html">
<meta property="og:image" content="https://www.funasr.com/logo.png">
<link rel="canonical" href="https://www.funasr.com/ecosystem.html">
<link rel="alternate" hreflang="zh" href="https://www.funasr.com/ecosystem.html">
<link rel="alternate" hreflang="en" href="https://www.funasr.com/en/ecosystem.html">
<link rel="alternate" hreflang="x-default" href="https://www.funasr.com/en/ecosystem.html">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"Article","headline":"FunASR 生态:集成项目与应用","author":{"@type":"Organization","name":"通义实验室"},"datePublished":"2026-05-31","description":"超过 50 个开源项目集成 FunASR 语音识别技术。"}
</script>
<style>
:root{--primary:#2563eb;--primary-dark:#1d4ed8;--bg:#fff;--surface:#f8fafc;--border:#e2e8f0;--text:#0f172a;--text-soft:#475569;--text-muted:#94a3b8;--radius:12px;--green:#16a34a}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:'Inter',-apple-system,sans-serif;color:var(--text);line-height:1.7;-webkit-font-smoothing:antialiased}
a{color:var(--primary);text-decoration:none}
a:hover{text-decoration:underline}
.container{max-width:900px;margin:0 auto;padding:0 24px}
.nav{position:fixed;top:0;left:0;right:0;z-index:100;background:rgba(255,255,255,0.9);backdrop-filter:blur(12px);border-bottom:1px solid var(--border);padding:14px 0}
.nav .container{max-width:1120px;display:flex;align-items:center;gap:24px}
.nav-logo{font-size:1.2rem;font-weight:800;color:var(--text);text-decoration:none}
.nav-logo span{color:var(--primary)}
.nav-links{display:flex;gap:20px;margin-left:auto}
.nav-links a{font-size:0.85rem;font-weight:500;color:var(--text-soft);text-decoration:none}
.nav-btn{padding:7px 16px;background:var(--primary);color:white;border-radius:7px;font-size:0.83rem;font-weight:600;text-decoration:none}
article{padding:120px 0 80px}
h1{font-size:2rem;font-weight:800;line-height:1.3;margin-bottom:8px}
.subtitle{font-size:1.05rem;color:var(--text-soft);margin-bottom:32px}
h2{font-size:1.3rem;font-weight:700;margin:40px 0 16px;padding-top:16px;border-top:1px solid var(--border)}
h2:first-of-type{border-top:none;margin-top:0}
p{margin-bottom:14px;color:var(--text-soft)}
.card-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:16px;margin:16px 0}
.card{border:1px solid var(--border);border-radius:var(--radius);padding:20px;background:var(--bg);transition:box-shadow 0.2s}
.card:hover{box-shadow:0 4px 12px rgba(0,0,0,0.08)}
.card-title{font-weight:700;font-size:0.95rem;margin-bottom:4px}
.card-title a{color:var(--text)}
.card-stars{font-size:0.78rem;color:var(--text-muted);margin-bottom:8px}
.card-desc{font-size:0.84rem;color:var(--text-soft);line-height:1.5}
.card-tag{display:inline-block;font-size:0.72rem;font-weight:600;padding:2px 8px;border-radius:4px;background:#eff6ff;color:var(--primary);margin-right:4px;margin-top:8px}
.card-tag.green{background:#f0fdf4;color:var(--green)}
.stat-bar{display:flex;gap:32px;margin:24px 0;flex-wrap:wrap}
.stat{text-align:center}
.stat-num{font-size:2rem;font-weight:800;color:var(--primary)}
.stat-label{font-size:0.82rem;color:var(--text-muted)}
pre{background:#1e293b;color:#e2e8f0;padding:18px;border-radius:10px;overflow-x:auto;font-size:0.82rem;line-height:1.7;margin:14px 0}
.cta{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:28px;margin:36px 0;text-align:center}
.cta p{margin-bottom:16px}
.cta a.btn{display:inline-block;padding:10px 24px;background:var(--primary);color:white;border-radius:8px;font-weight:600;text-decoration:none;margin:0 6px}
.cta a.btn:hover{background:var(--primary-dark)}
.cta a.btn.outline{background:transparent;color:var(--primary);border:1px solid var(--primary)}
footer{background:#0f172a;color:#94a3b8;padding:32px 0;font-size:0.82rem;text-align:center;margin-top:60px}
footer a{color:#60a5fa}
@media(max-width:640px){h1{font-size:1.5rem}.stat-bar{gap:20px}.stat-num{font-size:1.5rem}.card-grid{grid-template-columns:1fr}}
</style>
</head>
<body>
<nav class="nav"><div class="container"><a class="nav-logo" href="./">Fun<span>ASR</span></a><div class="nav-links"><a href="/#capabilities">核心能力</a><a href="/#usage">如何使用</a><a href="/#benchmark">性能</a><a href="/#demo">演示</a><a href="https://modelscope.github.io/FunASR/zh/" target="_blank">文档</a><a href="quickstart.html">快速上手</a><a href="models.html">模型</a><a href="ecosystem.html">生态</a><a href="/blog/">技术博客</a><a href="vs-whisper.html">对比 Whisper</a><a href="/donors.html">功德榜</a><a href="en/ecosystem.html" style="font-size:0.85rem;font-weight:500;color:var(--text-soft);text-decoration:none">EN</a><a href="https://github.com/modelscope/FunASR" target="_blank" class="nav-btn">GitHub ★</a></div></div></nav>
<article>
<div class="container">
<h1>FunASR 生态系统</h1>
<p class="subtitle">基于 FunASR、SenseVoice、Paraformer 构建的开源项目与集成方案。</p>
<div class="stat-bar">
<div class="stat"><div class="stat-num">50+</div><div class="stat-label">集成项目</div></div>
<div class="stat"><div class="stat-num">50+</div><div class="stat-label">支持语种</div></div>
<div class="stat"><div class="stat-num">35K+</div><div class="stat-label">GitHub Stars</div></div>
<div class="stat"><div class="stat-num">100万+</div><div class="stat-label">月安装量</div></div>
</div>
<h2>视频与媒体工具</h2>
<div class="card-grid">
<div class="card">
<div class="card-title"><a href="https://github.com/modelscope/FunClip">FunClip</a></div>
<div class="card-stars">6K+ stars</div>
<div class="card-desc">基于语音识别的智能视频剪辑。自动生成字幕,支持按关键词和说话人剪辑视频片段。<a href="https://github.com/modelscope/FunClip/releases/tag/v2.1.0">下载 v2.1.0</a></div>
<div><span class="card-tag">视频</span><span class="card-tag green">官方</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/jianchang512/pyvideotrans">pyVideoTrans</a></div>
<div class="card-stars">17.6K stars</div>
<div class="card-desc">视频翻译工具。使用 FunASR 进行中文语音识别,自动生成和翻译字幕。</div>
<div><span class="card-tag">视频</span><span class="card-tag">翻译</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/abus-aikorea/voice-pro">Voice-Pro</a></div>
<div class="card-stars">10.4K stars</div>
<div class="card-desc">Gradio WebUI 音频处理工具箱,集成 TTS、语音克隆与 ASR 能力。</div>
<div><span class="card-tag">音频</span><span class="card-tag">TTS</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/Kedreamix/Linly-Dubbing">Linly-Dubbing</a></div>
<div class="card-stars">3.2K stars</div>
<div class="card-desc">AI 视频配音工具包。自动语音识别、翻译和语音克隆,实现多语言视频配音。</div>
<div><span class="card-tag">配音</span><span class="card-tag">视频</span></div>
</div>
</div>
<h2>语音输入与桌面应用</h2>
<div class="card-grid">
<div class="card">
<div class="card-title"><a href="https://github.com/HaujetZhao/CapsWriter-Offline">CapsWriter-Offline</a></div>
<div class="card-stars">5.5K stars</div>
<div class="card-desc">PC 端语音输入工具。按住 CapsLock 说话,松开自动上屏。基于 FunASR Paraformer 离线识别。</div>
<div><span class="card-tag">桌面</span><span class="card-tag">语音输入</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/Open-Less/openless">OpenLess</a></div>
<div class="card-stars">1.8K stars</div>
<div class="card-desc">macOS/Windows 语音输入工具。按住快捷键说话,松开即得润色后的文字。使用 SenseVoice 模型。</div>
<div><span class="card-tag">桌面</span><span class="card-tag">macOS</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/yan5xu/ququ">ququ</a></div>
<div class="card-stars">2.2K stars</div>
<div class="card-desc">开源 Wispr Flow 替代方案。集成 FunASR 本地模型和可配置大语言模型的桌面语音工作流。</div>
<div><span class="card-tag">桌面</span><span class="card-tag">语音输入</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/HG-ha/MTools">MTools</a></div>
<div class="card-stars">1.2K stars</div>
<div class="card-desc">多功能桌面应用程序,集成音视频处理、图片编辑和 AI 增强语音转写。</div>
<div><span class="card-tag">桌面</span><span class="card-tag">工具箱</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/233stone/vocotype-cli">VocoType</a></div>
<div class="card-stars">704 stars</div>
<div class="card-desc">本地端侧隐私安全语音输入工具。通过快捷键将语音实时转文字并自动输入。支持 MCP 集成。</div>
<div><span class="card-tag">语音输入</span><span class="card-tag">隐私</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/TheDeathDragon/LiveTranslate">LiveTranslate</a></div>
<div class="card-stars">325 stars</div>
<div class="card-desc">实时音频翻译工具。捕获系统声音和麦克风,使用 SenseVoice 识别后 LLM 流式翻译显示。</div>
<div><span class="card-tag">翻译</span><span class="card-tag">实时</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/LeonardNJU/VocoType-linux">VocoType-linux</a></div>
<div class="card-stars">139 stars</div>
<div class="card-desc">高性能 Linux 离线中文语音输入法。基于 FunASR,0.1 秒瞬时上屏,支持 IBus/Fcitx5。</div>
<div><span class="card-tag">Linux</span><span class="card-tag">输入法</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/hssstg/murmur">Murmur</a></div>
<div class="card-stars">103 stars</div>
<div class="card-desc">macOS 离线语音转文字工具。按键说话即用,支持任意应用内使用,完全本地处理。</div>
<div><span class="card-tag">macOS</span><span class="card-tag">语音输入</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/joe223/AriaType">AriaType</a></div>
<div class="card-stars">74 stars</div>
<div class="card-desc">语音驱动的桌面写作工具。支持语音输入、文本润色和跨应用协作。</div>
<div><span class="card-tag">桌面</span><span class="card-tag">写作</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/vorojar/VoiceSnap">VoiceSnap</a></div>
<div class="card-stars">73 stars</div>
<div class="card-desc">纯离线语音输入工具,Typeless 免费平替。SenseVoice + DirectML,数据永不出设备,适合涉密场景。</div>
<div><span class="card-tag">离线</span><span class="card-tag">安全</span></div>
</div>
</div>
<h2>语音助手与智能体</h2>
<div class="card-grid">
<div class="card">
<div class="card-title"><a href="https://github.com/xszyou/Fay">Fay 数字人</a></div>
<div class="card-stars">12.8K stars</div>
<div class="card-desc">数字人 Agent 框架,连接 2.5D/3D 虚拟人与大语言模型。使用 FunASR 实时语音识别。</div>
<div><span class="card-tag">数字人</span><span class="card-tag">智能体</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/duixcom/Duix-Avatar">Duix 数字人</a></div>
<div class="card-stars">13.4K stars</div>
<div class="card-desc">开源 AI 数字人工具包,支持离线视频生成和实时交互。使用 FunASR 进行语音识别。</div>
<div><span class="card-tag">数字人</span><span class="card-tag">视频生成</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/wzpan/wukong-robot">悟空机器人</a></div>
<div class="card-stars">7.1K stars</div>
<div class="card-desc">中文语音对话机器人/智能音箱,支持树莓派部署,内置 FunASR 语音识别引擎。</div>
<div><span class="card-tag">IoT</span><span class="card-tag">助手</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/getpaseo/paseo">Paseo</a></div>
<div class="card-stars">6.9K stars</div>
<div class="card-desc">手机端编程助手,通过 Sherpa ONNX 使用 Paraformer 和 SenseVoice 进行语音识别。</div>
<div><span class="card-tag">编程</span><span class="card-tag">智能体</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/Kedreamix/Linly-Talker">Linly-Talker</a></div>
<div class="card-stars">3.3K stars</div>
<div class="card-desc">数字人对话系统,融合 ASR、LLM 和 TTS,实现与虚拟形象自然对话。使用 FunASR 语音识别。</div>
<div><span class="card-tag">数字人</span><span class="card-tag">对话</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/harry0703/AudioNotes">AudioNotes</a></div>
<div class="card-stars">2.1K stars</div>
<div class="card-desc">音视频内容提取工具,自动整理为结构化 Markdown 笔记。使用 FunASR 高精度转写。</div>
<div><span class="card-tag">笔记</span><span class="card-tag">效率</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/wwbin2017/bailing">百聆</a></div>
<div class="card-stars">1.7K stars</div>
<div class="card-desc">类 GPT-4o 语音聊天机器人,完整 ASR + LLM + TTS 语音对话方案。使用 FunASR 语音识别。</div>
<div><span class="card-tag">语音对话</span><span class="card-tag">GPT-4o</span></div>
</div>
</div>
<h2>AI 平台与框架</h2>
<div class="card-grid">
<div class="card">
<div class="card-title"><a href="https://github.com/RVC-Boss/GPT-SoVITS">GPT-SoVITS</a></div>
<div class="card-stars">58K stars</div>
<div class="card-desc">一分钟语音数据即可训练 TTS。使用 FunASR 进行训练数据标注。</div>
<div><span class="card-tag">TTS</span><span class="card-tag">训练</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/mudler/LocalAI">LocalAI</a></div>
<div class="card-stars">33K stars</div>
<div class="card-desc">自托管 OpenAI 替代方案。FunASR 作为语音识别后端(PR 审核中)。</div>
<div><span class="card-tag">LLM</span><span class="card-tag">自托管</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/BerriAI/litellm">LiteLLM</a></div>
<div class="card-stars">54.3K stars</div>
<div class="card-desc">OpenAI 兼容 AI Gateway。FunASR / SenseVoice 可通过 <code>custom_openai</code> 作为自托管语音转写端点接入。</div>
<div><span class="card-tag">AI Gateway</span><span class="card-tag">OpenAI 兼容</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/pipecat-ai/pipecat">Pipecat</a></div>
<div class="card-stars">12.5K stars</div>
<div class="card-desc">语音与多模态对话 AI 框架。FunASR 作为社区 STT 集成。</div>
<div><span class="card-tag">对话 AI</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/open-mmlab/Amphion">Amphion</a></div>
<div class="card-stars">9.8K stars</div>
<div class="card-desc">OpenMMLab 开源音频、音乐和语音生成工具包。使用 FunASR 进行 TTS 评测与数据处理。</div>
<div><span class="card-tag">音频工具</span><span class="card-tag">OpenMMLab</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://marketplace.dify.ai/plugin/langgenius/funasr">Dify · FunASR 官方插件</a></div>
<div class="card-stars">150K stars · 352 installs</div>
<div class="card-desc">FunASR 官方插件 0.1.1 已上线 Dify Marketplace,内置 SenseVoice、Fun-ASR-Nano 与 Paraformer,支持最大 25 MB 音频上传。</div>
<div><span class="card-tag">官方插件</span><span class="card-tag">语音转写</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/xorbitsai/inference">Xinference</a></div>
<div class="card-stars">9.3K stars</div>
<div class="card-desc">分布式推理框架。内置 FunASR 语音识别后端,支持一键部署 ASR 模型服务。</div>
<div><span class="card-tag">推理框架</span><span class="card-tag">分布式</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/modstart-lib/aigcpanel">AIGCPanel</a></div>
<div class="card-stars">5K stars</div>
<div class="card-desc">一站式 AI 数字人系统,支持视频合成、声音合成与克隆。集成 FunASR 语音识别。</div>
<div><span class="card-tag">数字人</span><span class="card-tag">AIGC</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/jingyaogong/minimind-o">MiniMind-O</a></div>
<div class="card-stars">1.6K stars</div>
<div class="card-desc">轻量级多模态模型,融合视觉、音频和语言理解能力。使用 FunASR 作为语音识别模块。</div>
<div><span class="card-tag">多模态</span><span class="card-tag">LLM</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/SpenserCai/ComfyUI-FunAudioLLM">ComfyUI-FunAudioLLM</a></div>
<div class="card-stars">95 stars</div>
<div class="card-desc">ComfyUI 自定义节点,集成 SenseVoice 和 CosyVoice。可视化搭建语音识别与合成工作流。</div>
<div><span class="card-tag">ComfyUI</span><span class="card-tag">工作流</span></div>
</div>
</div>
<h2>SenseVoice 社区扩展</h2>
<div class="card-grid">
<div class="card">
<div class="card-title"><a href="https://github.com/lifeiteng/OmniSenseVoice">OmniSenseVoice</a></div>
<div class="card-stars">894 stars</div>
<div class="card-desc">增强版 SenseVoice,支持高精度单词级时间戳输出。速度与原版一致。</div>
<div><span class="card-tag">时间戳</span><span class="card-tag">SenseVoice</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/0x5446/api4sensevoice">api4sensevoice</a></div>
<div class="card-stars">541 stars</div>
<div class="card-desc">SenseVoice API 和 WebSocket 服务器。支持 VAD 检测、实时流式识别和说话人验证。</div>
<div><span class="card-tag">API</span><span class="card-tag">WebSocket</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/pengzhendong/streaming-sensevoice">streaming-sensevoice</a></div>
<div class="card-stars">451 stars</div>
<div class="card-desc">伪流式 SenseVoice 实现,支持热词增强。实现低延迟准实时语音识别。</div>
<div><span class="card-tag">流式</span><span class="card-tag">热词</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/lovemefan/SenseVoice-python">SenseVoice-python</a></div>
<div class="card-stars">111 stars</div>
<div class="card-desc">基于 ONNX Runtime 的 SenseVoice 推理库。企业级部署方案,无需 PyTorch 依赖。</div>
<div><span class="card-tag">ONNX</span><span class="card-tag">部署</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/HG-ha/SenseVoice-Api">SenseVoice-Api</a></div>
<div class="card-stars">109 stars</div>
<div class="card-desc">SenseVoice 的 FastAPI 封装,ONNX 推理,体积更小。附带量化模型,支持 GPU 加速。</div>
<div><span class="card-tag">FastAPI</span><span class="card-tag">量化</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/LuckLittleBoy/SenseVoice-OneApi">SenseVoice-OneApi</a></div>
<div class="card-stars">93 stars</div>
<div class="card-desc">SenseVoice API 服务,可无缝对接 OneAPI。统一接口管理多个语音识别模型。</div>
<div><span class="card-tag">OneAPI</span><span class="card-tag">API</span></div>
</div>
</div>
<h2>跨平台推理</h2>
<div class="card-grid">
<div class="card">
<div class="card-title"><a href="https://github.com/k2-fsa/sherpa-onnx">Sherpa-ONNX</a></div>
<div class="card-stars">5K+ stars</div>
<div class="card-desc">跨平台语音处理框架。可在 iOS、Android、树莓派、浏览器上运行 SenseVoice 和 Paraformer。</div>
<div><span class="card-tag">移动端</span><span class="card-tag">边缘计算</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/RapidAI/RapidASR">RapidASR</a></div>
<div class="card-stars">608 stars</div>
<div class="card-desc">跨平台 ASR 推理库,基于 ONNX Runtime 和 FunASR。开箱即用,支持中英文混合识别。</div>
<div><span class="card-tag">ONNX</span><span class="card-tag">跨平台</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/lovemefan/SenseVoice.cpp">SenseVoice.cpp</a></div>
<div class="card-stars">550 stars</div>
<div class="card-desc">SenseVoice 模型的 C/C++ 实现。无需 Python 依赖,纯 C++ 推理。</div>
<div><span class="card-tag">C++</span><span class="card-tag">嵌入式</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/huggingface/transformers">Transformers</a></div>
<div class="card-stars">142K stars</div>
<div class="card-desc">Hugging Face Transformers 库。Fun-ASR-Nano 集成(PR 审核中)。</div>
<div><span class="card-tag">ML 框架</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/gpustack/vox-box">Vox-Box</a></div>
<div class="card-stars">211 stars</div>
<div class="card-desc">OpenAI 兼容的语音服务器,支持 FunASR、Whisper、Bark、CosyVoice 后端。</div>
<div><span class="card-tag">API 服务</span><span class="card-tag">OpenAI 兼容</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/zaigie/FunSpeech">FunSpeech</a></div>
<div class="card-stars">136 stars</div>
<div class="card-desc">开箱即用的本地私有化语音服务。微服务架构,兼容阿里云语音 API 与 OpenAI TTS API,集成 FunASR 和 CosyVoice。</div>
<div><span class="card-tag">API 服务</span><span class="card-tag">私有部署</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/huaxin0/FunASR-GGML">FunASR-GGML</a></div>
<div class="card-stars">113 stars</div>
<div class="card-desc">基于 GGML 的 C++ 推理引擎。支持 CPU/CUDA,实时麦克风流式识别,单 GGUF 文件部署。</div>
<div><span class="card-tag">GGML</span><span class="card-tag">C++</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/manyeyes/ManySpeech">ManySpeech</a></div>
<div class="card-stars">79 stars</div>
<div class="card-desc">多模型 ASR 推理方案,支持 Paraformer、SenseVoice、Whisper 等。ONNX 推理,适配多场景。</div>
<div><span class="card-tag">多模型</span><span class="card-tag">ONNX</span></div>
</div>
</div>
<h2>快速上手</h2>
<pre>pip install funasr
# Python API
from funasr import AutoModel
model = AutoModel(model="iic/SenseVoiceSmall")
result = model.generate(input="audio.wav")
# 或启动 OpenAI 兼容 API 服务
pip install vllm fastapi uvicorn python-multipart
funasr-server --device cuda</pre>
<div class="cta">
<p>使用 FunASR 构建了项目?欢迎提交到此列表。</p>
<a class="btn" href="https://github.com/modelscope/FunASR">GitHub</a>
<a class="btn outline" href="https://github.com/modelscope/FunASR/issues">提交 Issue</a>
</div>
</div>
</article>
<footer><div class="container">FunASR &mdash; 工业级语音识别工具包 &mdash; <a href="https://github.com/modelscope/FunASR">GitHub</a> &middot; <a href="./">首页</a> &middot; <a href="https://www.funasr.com">funasr.com</a></div></footer>
</body>
</html>
@@ -0,0 +1,137 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Cantonese Speech Recognition in Python — SenseVoice Keeps Real Cantonese (Whisper Doesn't) | FunASR Blog</title>
<meta name="description" content="How to do open-source Cantonese speech-to-text? SenseVoice natively supports Cantonese (yue), auto-detects the language and outputs authentic colloquial Cantonese (呢/唔/嘅), while Whisper maps it to Mandarin. 3 lines of Python, real side-by-side output.">
<meta name="keywords" content="cantonese speech recognition, cantonese speech to text, cantonese transcription, cantonese asr, SenseVoice, open source speech recognition, Whisper alternative, FunASR, speech to text python">
<link rel="icon" href="/logo.png">
<meta property="og:title" content="Cantonese Speech Recognition in Python — SenseVoice Keeps Real Cantonese (Whisper Doesn't) | FunASR Blog">
<meta property="og:description" content="How to do open-source Cantonese speech-to-text? SenseVoice natively supports Cantonese (yue), auto-detects the language and outputs authentic colloquial Cantonese (呢/唔/嘅), while Whisper maps it to Mandarin. 3 lines of Python, real side-by-side output.">
<meta property="og:type" content="article">
<meta property="og:url" content="https://www.funasr.com/en/blog/cantonese-speech-recognition.html">
<meta property="og:image" content="https://www.funasr.com/logo.png">
<link rel="canonical" href="https://www.funasr.com/en/blog/cantonese-speech-recognition.html">
<link rel="alternate" hreflang="en" href="https://www.funasr.com/en/blog/cantonese-speech-recognition.html">
<link rel="alternate" hreflang="zh" href="https://www.funasr.com/blog/cantonese-speech-recognition.html">
<link rel="alternate" hreflang="x-default" href="https://www.funasr.com/en/blog/cantonese-speech-recognition.html">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"BlogPosting","headline":"Cantonese Speech Recognition in Python — SenseVoice Keeps Real Cantonese (Whisper Doesn't) | FunASR Blog","description":"How to do open-source Cantonese speech-to-text? SenseVoice natively supports Cantonese (yue), auto-detects the language and outputs authentic colloquial Cantonese (呢/唔/嘅), while Whisper maps it to Mandarin. 3 lines of Python, real side-by-side output.","datePublished":"2026-06-21","dateModified":"2026-06-21","author":{"@type":"Organization","name":"FunASR / Tongyi Lab"},"publisher":{"@type":"Organization","name":"FunASR","logo":{"@type":"ImageObject","url":"https://www.funasr.com/logo.png"}},"mainEntityOfPage":{"@type":"WebPage","@id":"https://www.funasr.com/en/blog/cantonese-speech-recognition.html"},"image":"https://www.funasr.com/logo.png"}
</script>
<style>:root{--primary:#2563eb;--primary-dark:#1d4ed8;--bg:#fff;--surface:#f8fafc;--border:#e2e8f0;--text:#0f172a;--text-soft:#475569;--text-muted:#94a3b8;--radius:12px}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:'Inter',-apple-system,sans-serif;color:var(--text);line-height:1.7}
a{color:var(--primary);text-decoration:none}a:hover{text-decoration:underline}
.container{max-width:800px;margin:0 auto;padding:0 24px}
.nav{position:fixed;top:0;left:0;right:0;z-index:100;background:rgba(255,255,255,0.9);backdrop-filter:blur(12px);border-bottom:1px solid var(--border);padding:14px 0}
.nav .container{max-width:1120px;display:flex;align-items:center;gap:24px}
.nav-logo{font-size:1.2rem;font-weight:800;color:var(--text)}.nav-logo span{color:var(--primary)}
.nav-links{display:flex;gap:20px;margin-left:auto;flex-wrap:wrap}
.nav-links a{font-size:0.85rem;font-weight:500;color:var(--text-soft)}
.nav-btn{padding:7px 16px;background:var(--primary);color:#fff;border-radius:7px;font-size:0.83rem;font-weight:600}
article{padding:120px 0 80px}
h1{font-size:2rem;font-weight:800;line-height:1.3;margin-bottom:14px}
h2{font-size:1.3rem;font-weight:700;margin:36px 0 14px;padding-top:16px;border-top:1px solid var(--border)}
h3{font-size:1.05rem;font-weight:700;margin:22px 0 10px}
p{margin-bottom:14px;color:var(--text-soft)}
ul,ol{margin:0 0 14px 22px;color:var(--text-soft)}li{margin-bottom:6px}
table{width:100%;border-collapse:collapse;margin:16px 0;font-size:0.86rem}
th,td{padding:10px 12px;text-align:left;border-bottom:1px solid var(--border)}
th{font-weight:600;background:var(--surface);font-size:0.78rem;color:var(--text-muted)}
pre{background:#1e293b;color:#e2e8f0;padding:18px;border-radius:10px;overflow-x:auto;font-size:0.82rem;line-height:1.7;margin:14px 0}
code{font-family:ui-monospace,Menlo,monospace}
p code,li code{background:var(--surface);padding:2px 6px;border-radius:5px;font-size:0.85em;color:var(--primary-dark)}
.post-meta{color:var(--text-muted);font-size:0.85rem;margin-bottom:24px}
.cta{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:24px;margin:28px 0;text-align:center}
.cta a.btn{display:inline-block;padding:10px 24px;background:var(--primary);color:#fff;border-radius:8px;font-weight:600}
.post-list{list-style:none;margin:0;padding:0}
.post-list li{margin:0 0 8px}
.post-card{display:block;border:1px solid var(--border);border-radius:var(--radius);padding:20px 22px;margin-bottom:14px}
.post-card:hover{border-color:var(--primary);text-decoration:none}
.post-card h2{border:none;padding:0;margin:0 0 6px;font-size:1.15rem;color:var(--text)}
.post-card p{margin:0;color:var(--text-soft);font-size:0.9rem}
.post-card .date{color:var(--text-muted);font-size:0.8rem}
footer{background:#0f172a;color:#94a3b8;padding:28px 0;text-align:center;font-size:0.8rem}
footer a{color:#94a3b8}</style>
</head>
<body>
<nav class="nav"><div class="container"><a href="/en/" class="nav-logo">Fun<span>ASR</span></a><div class="nav-links"><a href="/en/#capabilities">Capabilities</a><a href="/en/#usage">How to Use</a><a href="/en/#benchmark">Benchmark</a><a href="/en/#demo">Demo</a><a href="https://modelscope.github.io/FunASR/" target="_blank">Docs</a><a href="/en/quickstart.html">Quickstart</a><a href="/en/models.html">Models</a><a href="/en/ecosystem.html">Ecosystem</a><a href="/en/blog/">Blog</a><a href="/en/vs-whisper.html">vs Whisper</a><a href="/en/donors.html">Donors</a></div><a href="https://www.funasr.com/blog/cantonese-speech-recognition.html" style="font-size:0.83rem;font-weight:500;color:var(--text-soft)">中文</a><a href="https://github.com/modelscope/FunASR" target="_blank" class="nav-btn">GitHub ★</a></div></nav>
<article><div class="container">
<h1>Cantonese Speech Recognition in Python — SenseVoice Keeps Real Cantonese (Whisper Turns It Into Mandarin)</h1>
<p class="post-meta">2026-06-21 · FunASR Team</p>
<p>Cantonese has around <strong>85 million</strong> speakers, yet open-source ASR support for it is weak. Whisper nominally lists Cantonese, but in practice it <strong>treats Cantonese as Chinese (zh) and rewrites it into Standard Written Mandarin</strong> — <code>唔</code>→<code>不</code>, <code>嘅</code>→<code>的</code>, <code>呢</code>→<code>這</code> — so the actual Cantonese is lost.</p>
<p><strong>SenseVoice</strong> (an open-source multilingual speech-understanding model from the FunAudioLLM team) <strong>natively supports Cantonese (yue)</strong>: it auto-detects the language and preserves genuine colloquial Cantonese characters, all in one non-autoregressive pass. Here is a real side-by-side on the same Cantonese clip.</p>
<h2>Real comparison: the same Cantonese audio</h2>
<p>Tested on SenseVoice's bundled Cantonese sample <code>yue.mp3</code>, actual outputs from both models:</p>
<table>
<tr><th>Model</th><th>Detected language</th><th>Output</th></tr>
<tr><td><strong>SenseVoice</strong></td><td><code>yue</code> (Cantonese)</td><td>呢几个字都表达<strong>唔</strong>到,我想讲<strong>嘅</strong>意思。</td></tr>
<tr><td>Whisper-small</td><td><code>zh</code> (Chinese)</td><td>這幾個字都表達<strong>不</strong>到我想講<strong>的</strong>意思</td></tr>
</table>
<p>The difference is clear: SenseVoice keeps the hallmark Cantonese words <code>呢</code> / <code>唔</code> / <code>嘅</code>; Whisper has no separate Cantonese, recognizes it as Chinese and <strong>converts it to written Mandarin</strong> (<code>呢→這</code>, <code>唔→不</code>, <code>嘅→的</code>) — roughly the same meaning, but no longer Cantonese.</p>
<h2>Cantonese ASR in three lines</h2>
<pre>pip install funasr
from funasr import AutoModel
from funasr.utils.postprocess_utils import rich_transcription_postprocess
model = AutoModel(model="iic/SenseVoiceSmall", disable_update=True)
res = model.generate(input="cantonese.wav", cache={}, language="yue", use_itn=True)
print(rich_transcription_postprocess(res[0]["text"]))
# 呢几个字都表达唔到,我想讲嘅意思。</pre>
<p>Set <code>language</code> to <code>"yue"</code> directly, or use <code>"auto"</code> for automatic language ID — on this clip <code>auto</code> also correctly resolves to <code>yue</code> with identical output.</p>
<h2>What else the raw output carries</h2>
<p>SenseVoice's raw output begins with a set of tags:</p>
<pre>&lt;|yue|&gt;&lt;|NEUTRAL|&gt;&lt;|Speech|&gt;&lt;|withitn|&gt;呢几个字都表达唔到,我想讲嘅意思。</pre>
<p>Meaning: <code>&lt;|yue|&gt;</code> = language is Cantonese, <code>&lt;|NEUTRAL|&gt;</code> = emotion, <code>&lt;|Speech|&gt;</code> = audio event (clean speech), <code>&lt;|withitn|&gt;</code> = inverse text normalization applied. So while transcribing Cantonese you also get <strong>language, emotion and audio events for free</strong>. One call to <code>rich_transcription_postprocess()</code> strips the tags to plain text.</p>
<h2>Why SenseVoice for Cantonese</h2>
<table>
<tr><th></th><th>SenseVoice</th><th>Whisper</th></tr>
<tr><td>Colloquial Cantonese (呢/唔/嘅)</td><td>✅ preserved</td><td>❌ rewritten to Mandarin</td></tr>
<tr><td>Automatic language ID</td><td>✅ resolves to <code>yue</code></td><td>collapses to <code>zh</code></td></tr>
<tr><td>Emotion / audio events</td><td>✅ in one pass</td><td>❌</td></tr>
<tr><td>Inverse text normalization</td><td>✅ built-in</td><td>partial</td></tr>
<tr><td>Speed</td><td>non-autoregressive, ~15× faster than Whisper-Large</td><td>autoregressive baseline</td></tr>
<tr><td>License</td><td>open-source, commercial-friendly</td><td>open-source</td></tr>
</table>
<p>If your use case mixes <strong>Mandarin and Cantonese</strong> (HK/Macau apps, call centers, media subtitles), one SenseVoice model covers both. For higher-accuracy offline transcription, see the FunASR-family <a href="/en/blog/fun-asr-nano-guide.html">Fun-ASR-Nano</a>, and the full Chinese accuracy comparison in the <a href="/en/blog/funasr-vs-whisper-benchmark.html">FunASR vs Whisper benchmark</a>.</p>
<div class="cta"><p><strong>The whole FunASR stack is open-source</strong> — industrial-grade ASR / VAD / punctuation / speaker / emotion &amp; events / LLM-ASR, with Cantonese out of the box. If it helps, a GitHub Star really supports the project 👇</p><p><a class="btn" href="https://github.com/QwenAudio/SenseVoice" target="_blank">⭐ Star SenseVoice</a></p><p style="margin-top:10px;font-size:0.85rem">Also star:<a href="https://github.com/modelscope/FunASR" target="_blank">FunASR</a> · <a href="https://github.com/QwenAudio/Fun-ASR" target="_blank">Fun-ASR</a> · <a href="https://github.com/modelscope/FunClip" target="_blank">FunClip</a></p></div>
<!--related-posts-->
<h2>Related posts</h2>
<ul class="post-list">
<li><a href="/en/blog/funasr-vs-whisper-benchmark.html">FunASR vs Whisper Benchmark</a></li>
<li><a href="/en/blog/sensevoice-deployment-guide.html">SenseVoice Deployment Guide</a></li>
<li><a href="/en/blog/fun-asr-nano-guide.html">Fun-ASR-Nano Guide</a></li>
<li><a href="/en/blog/funasr-speaker-diarization.html">Speaker Diarization: Who Spoke When</a></li>
<li><a href="/en/blog/sensevoice-emotion-language-detection.html">Emotion & Language Detection</a></li>
<li><a href="/en/blog/funasr-realtime-streaming-asr.html">Real-Time Streaming Speech-to-Text</a></li>
<li><a href="/en/blog/funasr-transcribe-long-audio.html">Transcribe Long Audio (Hours in One Call)</a></li>
<li><a href="/en/blog/funasr-cli-transcribe-command-line.html">Transcribe from the Command Line</a></li>
<li><a href="/en/blog/self-hosted-openai-whisper-api-alternative.html">Self-Hosted OpenAI Whisper API Alternative</a></li>
<li><a href="/en/blog/generate-subtitles-srt-vtt-from-audio-video.html">Auto-Generate Subtitles (SRT / VTT)</a></li>
<li><a href="/en/blog/speech-to-text-python-transcribe-audio.html">Speech to Text in Python</a></li>
<li><a href="/en/blog/funasr-llama-cpp-whisper-cpp-alternative.html">FunASR on llama.cpp (whisper.cpp Alternative)</a></li>
<li><a href="/en/blog/funasr-vs-faster-whisper-chinese.html">FunASR vs faster-whisper (Chinese/Cantonese)</a></li>
<li><a href="/en/blog/lightweight-speech-recognition-cpu.html">Lightweight Speech Recognition on CPU</a></li>
<li><a href="/en/blog/self-hosted-deepgram-assemblyai-alternative.html">Self-Hosted Deepgram/AssemblyAI Alternative</a></li>
<li><a href="/en/blog/which-funasr-model.html">Which FunASR Model?</a></li>
<li><a href="/en/blog/japanese-speech-recognition.html">Japanese Speech Recognition (SenseVoice)</a></li>
<li><a href="/en/blog/voice-activity-detection-python.html">Voice Activity Detection in Python</a></li>
<li><a href="/en/blog/self-hosted-google-aws-azure-speech-to-text.html">Self-Hosted Google/AWS/Azure STT Alternative</a></li>
<li><a href="/en/blog/chinese-speech-recognition.html">Chinese Speech Recognition in Python</a></li>
<li><a href="/en/blog/punctuation-restoration-python.html">Punctuation Restoration in Python</a></li>
<li><a href="/en/blog/speech-to-text-timestamps-python.html">Speech-to-Text with Timestamps in Python</a></li>
</ul>
</div></article>
<footer><div class="container">© 2024-2026 Tongyi Lab, Alibaba Group · <a href="https://github.com/modelscope/FunASR/blob/main/LICENSE">MIT License</a></div></footer>
</body>
</html>
@@ -0,0 +1,160 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Chinese (Mandarin) Speech Recognition in Python — Fast & Accurate with FunASR | FunASR Blog</title>
<meta name="description" content="How to do Chinese / Mandarin speech recognition? FunASR is purpose-built for Chinese: default flagship Fun-ASR-Nano (LLM-ASR, CER 8.06%), with SenseVoice (7.81%, fastest) and Paraformer (10.18%, timestamps/hotwords) for CPU — all far better than Whisper (~20%). 3 lines of Python, real output.">
<meta name="keywords" content="chinese speech recognition, mandarin speech recognition, chinese speech to text, mandarin speech to text, chinese asr, speech to text python, Fun-ASR-Nano, SenseVoice, Paraformer, FunASR">
<link rel="icon" href="/logo.png">
<meta property="og:title" content="Chinese (Mandarin) Speech Recognition in Python — Fast & Accurate with FunASR | FunASR Blog">
<meta property="og:description" content="How to do Chinese / Mandarin speech recognition? FunASR is purpose-built for Chinese: default flagship Fun-ASR-Nano (LLM-ASR, CER 8.06%), with SenseVoice (7.81%, fastest) and Paraformer (10.18%, timestamps/hotwords) for CPU — all far better than Whisper (~20%). 3 lines of Python, real output.">
<meta property="og:type" content="article">
<meta property="og:url" content="https://www.funasr.com/en/blog/chinese-speech-recognition.html">
<meta property="og:image" content="https://www.funasr.com/logo.png">
<link rel="canonical" href="https://www.funasr.com/en/blog/chinese-speech-recognition.html">
<link rel="alternate" hreflang="en" href="https://www.funasr.com/en/blog/chinese-speech-recognition.html">
<link rel="alternate" hreflang="zh" href="https://www.funasr.com/blog/chinese-speech-recognition.html">
<link rel="alternate" hreflang="x-default" href="https://www.funasr.com/en/blog/chinese-speech-recognition.html">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"BlogPosting","headline":"Chinese (Mandarin) Speech Recognition in Python — Fast & Accurate with FunASR | FunASR Blog","description":"How to do Chinese / Mandarin speech recognition? FunASR is purpose-built for Chinese: default flagship Fun-ASR-Nano (LLM-ASR, CER 8.06%), with SenseVoice (7.81%, fastest) and Paraformer (10.18%, timestamps/hotwords) for CPU — all far better than Whisper (~20%). 3 lines of Python, real output.","datePublished":"2026-06-22","dateModified":"2026-06-22","author":{"@type":"Organization","name":"FunASR / Tongyi Lab"},"publisher":{"@type":"Organization","name":"FunASR","logo":{"@type":"ImageObject","url":"https://www.funasr.com/logo.png"}},"mainEntityOfPage":{"@type":"WebPage","@id":"https://www.funasr.com/en/blog/chinese-speech-recognition.html"},"image":"https://www.funasr.com/logo.png"}
</script>
<style>:root{--primary:#2563eb;--primary-dark:#1d4ed8;--bg:#fff;--surface:#f8fafc;--border:#e2e8f0;--text:#0f172a;--text-soft:#475569;--text-muted:#94a3b8;--radius:12px}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:'Inter',-apple-system,sans-serif;color:var(--text);line-height:1.7}
a{color:var(--primary);text-decoration:none}a:hover{text-decoration:underline}
.container{max-width:800px;margin:0 auto;padding:0 24px}
.nav{position:fixed;top:0;left:0;right:0;z-index:100;background:rgba(255,255,255,0.9);backdrop-filter:blur(12px);border-bottom:1px solid var(--border);padding:14px 0}
.nav .container{max-width:1120px;display:flex;align-items:center;gap:24px}
.nav-logo{font-size:1.2rem;font-weight:800;color:var(--text)}.nav-logo span{color:var(--primary)}
.nav-links{display:flex;gap:20px;margin-left:auto;flex-wrap:wrap}
.nav-links a{font-size:0.85rem;font-weight:500;color:var(--text-soft)}
.nav-btn{padding:7px 16px;background:var(--primary);color:#fff;border-radius:7px;font-size:0.83rem;font-weight:600}
article{padding:120px 0 80px}
h1{font-size:2rem;font-weight:800;line-height:1.3;margin-bottom:14px}
h2{font-size:1.3rem;font-weight:700;margin:36px 0 14px;padding-top:16px;border-top:1px solid var(--border)}
h3{font-size:1.05rem;font-weight:700;margin:22px 0 10px}
p{margin-bottom:14px;color:var(--text-soft)}
ul,ol{margin:0 0 14px 22px;color:var(--text-soft)}li{margin-bottom:6px}
table{width:100%;border-collapse:collapse;margin:16px 0;font-size:0.86rem}
th,td{padding:10px 12px;text-align:left;border-bottom:1px solid var(--border)}
th{font-weight:600;background:var(--surface);font-size:0.78rem;color:var(--text-muted)}
pre{background:#1e293b;color:#e2e8f0;padding:18px;border-radius:10px;overflow-x:auto;font-size:0.82rem;line-height:1.7;margin:14px 0}
code{font-family:ui-monospace,Menlo,monospace}
p code,li code{background:var(--surface);padding:2px 6px;border-radius:5px;font-size:0.85em;color:var(--primary-dark)}
.post-meta{color:var(--text-muted);font-size:0.85rem;margin-bottom:24px}
.cta{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:24px;margin:28px 0;text-align:center}
.cta a.btn{display:inline-block;padding:10px 24px;background:var(--primary);color:#fff;border-radius:8px;font-weight:600}
.post-list{list-style:none;margin:0;padding:0}
.post-list li{margin:0 0 8px}
.post-card{display:block;border:1px solid var(--border);border-radius:var(--radius);padding:20px 22px;margin-bottom:14px}
.post-card:hover{border-color:var(--primary);text-decoration:none}
.post-card h2{border:none;padding:0;margin:0 0 6px;font-size:1.15rem;color:var(--text)}
.post-card p{margin:0;color:var(--text-soft);font-size:0.9rem}
.post-card .date{color:var(--text-muted);font-size:0.8rem}
footer{background:#0f172a;color:#94a3b8;padding:28px 0;text-align:center;font-size:0.8rem}
footer a{color:#94a3b8}
@media(max-width:900px){.nav-links{display:none}.nav .container{gap:16px}.nav-logo{margin-right:auto}h1{font-size:1.75rem}table{table-layout:fixed;font-size:0.78rem}th,td{padding:8px 4px;overflow-wrap:anywhere}p code,li code{overflow-wrap:anywhere;word-break:break-word}}
</style>
</head>
<body>
<nav class="nav"><div class="container"><a href="/en/" class="nav-logo">Fun<span>ASR</span></a><div class="nav-links"><a href="/en/#capabilities">Capabilities</a><a href="/en/#usage">How to Use</a><a href="/en/#benchmark">Benchmark</a><a href="/en/#demo">Demo</a><a href="https://modelscope.github.io/FunASR/" target="_blank">Docs</a><a href="/en/quickstart.html">Quickstart</a><a href="/en/models.html">Models</a><a href="/en/ecosystem.html">Ecosystem</a><a href="/en/blog/">Blog</a><a href="/en/vs-whisper.html">vs Whisper</a><a href="/en/donors.html">Donors</a></div><a href="https://www.funasr.com/blog/chinese-speech-recognition.html" style="font-size:0.83rem;font-weight:500;color:var(--text-soft)">中文</a><a href="https://github.com/modelscope/FunASR" target="_blank" class="nav-btn">GitHub ★</a></div></nav>
<article><div class="container">
<h1>Chinese (Mandarin) Speech Recognition in Python — Fast &amp; Accurate with FunASR</h1>
<p class="post-meta">2026-06-22 · FunASR Team</p>
<p>Chinese is hard for general ASR — OpenAI Whisper's character error rate (CER) on Chinese is around <strong>20%</strong>, with frequent homophone and proper-noun mistakes. <strong>FunASR</strong> (open-sourced by Tongyi Lab) is purpose-built for Chinese, with CER far below Whisper. The default recommendation is the flagship <strong><a href="https://github.com/QwenAudio/Fun-ASR" target="_blank">Fun-ASR-Nano</a></strong> (LLM-ASR); on CPU use SenseVoice / Paraformer. Here's the practical how-to, with real measured output.</p>
<h2>Chinese ASR in 3 lines (flagship Fun-ASR-Nano, real output)</h2>
<pre>pip install funasr
from funasr import AutoModel
model = AutoModel(model="FunAudioLLM/Fun-ASR-Nano-2512", disable_update=True, device="cuda")
res = model.generate(input="audio.wav")
print(res[0]["text"])
# 欢迎大家来体验达摩院推出的语音识别模型。 ("Welcome everyone to try the speech model from DAMO Academy")</pre>
<p>Fun-ASR-Nano is the LLM-based flagship recognizer (SenseVoice encoder + a Qwen3 decoder) for zh/en/ja plus Chinese dialects/accents, with stronger context, hard-case, and proper-noun handling — the default for Chinese. Use the separate Fun-ASR-MLT-Nano for 31 languages. For scale, use vLLM (~340× real-time); see the <a href="/en/blog/fun-asr-nano-guide.html">Fun-ASR-Nano guide</a>.</p>
<h2>Pick the right Chinese model (by scenario)</h2>
<table>
<tr><th>Your situation</th><th>Pick</th><th>Chinese CER</th></tr>
<tr><td><strong>Have a GPU / want the best</strong></td><td>⭐ <strong>Fun-ASR-Nano</strong></td><td>8.06%</td></tr>
<tr><td>CPU / edge / want fastest</td><td>SenseVoice</td><td>7.81%</td></tr>
<tr><td>CPU + Chinese-only + timestamps/hotwords</td><td>Paraformer</td><td>10.18%</td></tr>
</table>
<p>All three beat Whisper (~20%) by a wide margin. Full guidance in the <a href="/en/blog/which-funasr-model.html">FunASR model selection guide</a>. The two lightweight CPU options:</p>
<pre># SenseVoice — the CPU choice, non-autoregressive & fast, multilingual + emotion
from funasr import AutoModel
from funasr.utils.postprocess_utils import rich_transcription_postprocess
model = AutoModel(model="iic/SenseVoiceSmall", disable_update=True)
res = model.generate(input="audio.wav", language="auto", use_itn=True)
print(rich_transcription_postprocess(res[0]["text"]))
# 欢迎大家来体验达摩院推出的语音识别模型。
# Paraformer — Chinese-only + character timestamps + hotwords
model = AutoModel(model="paraformer-zh", vad_model="fsmn-vad", punc_model="ct-punc")
res = model.generate(input="audio.wav", batch_size_s=300)
print(res[0]["text"]) # 欢迎大家来体验达摩院推出的语音识别模型。
# res[0]["timestamp"] -> [[880, 1120], [1120, 1360], ...] per-character start/end ms</pre>
<h2>Why FunASR for Chinese (instead of Whisper)</h2>
<table>
<tr><th>Chinese test-set CER (lower is better)</th><th>CER</th></tr>
<tr><td><strong>FunASR · Fun-ASR-Nano (flagship)</strong></td><td><strong>8.06%</strong></td></tr>
<tr><td>FunASR · SenseVoice</td><td>7.81%</td></tr>
<tr><td>FunASR · Paraformer</td><td>10.18%</td></tr>
<tr><td>Whisper-large-v3</td><td>20.02%</td></tr>
</table>
<p>Beyond accuracy, FunASR ships a full Chinese toolkit: <strong>inverse text normalization (ITN)</strong>, <strong>punctuation restoration</strong>, <strong>hotword / proper-noun customization</strong>, <strong>character-level timestamps</strong>, and <strong>speaker diarization</strong>. Full comparisons in the <a href="/en/blog/funasr-vs-whisper-benchmark.html">FunASR vs Whisper benchmark</a> and <a href="/en/blog/funasr-vs-faster-whisper-chinese.html">vs faster-whisper</a>.</p>
<h2>Common add-ons (each is one line)</h2>
<ul>
<li><strong>Long audio auto-segmentation</strong>: add <code>vad_model="fsmn-vad"</code>. See <a href="/en/blog/funasr-transcribe-long-audio.html">long audio</a> and <a href="/en/blog/voice-activity-detection-python.html">VAD / silence removal</a>.</li>
<li><strong>Punctuation</strong>: add <code>punc_model="ct-punc"</code>.</li>
<li><strong>Hotwords</strong>: use SeACo-Paraformer with <code>hotword</code>.</li>
<li><strong>Who spoke when</strong>: add a speaker model — see <a href="/en/blog/funasr-speaker-diarization.html">speaker diarization</a>.</li>
<li><strong>Cantonese</strong>: natively supported by SenseVoice — see <a href="/en/blog/cantonese-speech-recognition.html">Cantonese speech recognition</a>.</li>
</ul>
<h2>Command line / server</h2>
<pre># transcribe from the CLI, export srt / json, with speaker labels
funasr audio.wav --model paraformer-zh -f srt --spk
# OpenAI-compatible transcription server (flagship fun-asr-nano by default)
funasr-server --device cuda</pre>
<p>See <a href="/en/blog/funasr-cli-transcribe-command-line.html">command-line transcription</a> and the <a href="/en/blog/self-hosted-google-aws-azure-speech-to-text.html">self-hosted cloud-STT alternative</a>.</p>
<div class="cta"><p><strong>FunASR is the go-to open-source choice for Chinese ASR (MIT)</strong> — flagship Fun-ASR-Nano + SenseVoice + Paraformer. If it helps, a GitHub Star really supports the project 👇</p><p><a class="btn" href="https://github.com/QwenAudio/Fun-ASR" target="_blank">⭐ Star Fun-ASR</a></p><p style="margin-top:10px;font-size:0.85rem">Also star:<a href="https://github.com/modelscope/FunASR" target="_blank">FunASR</a> · <a href="https://github.com/QwenAudio/SenseVoice" target="_blank">SenseVoice</a> · <a href="https://github.com/modelscope/FunClip" target="_blank">FunClip</a></p></div>
<!--related-posts-->
<h2>Related posts</h2>
<ul class="post-list">
<li><a href="/en/blog/funasr-vs-whisper-benchmark.html">FunASR vs Whisper Benchmark</a></li>
<li><a href="/en/blog/sensevoice-deployment-guide.html">SenseVoice Deployment Guide</a></li>
<li><a href="/en/blog/fun-asr-nano-guide.html">Fun-ASR-Nano Guide</a></li>
<li><a href="/en/blog/funasr-speaker-diarization.html">Speaker Diarization: Who Spoke When</a></li>
<li><a href="/en/blog/sensevoice-emotion-language-detection.html">Emotion & Language Detection</a></li>
<li><a href="/en/blog/funasr-realtime-streaming-asr.html">Real-Time Streaming Speech-to-Text</a></li>
<li><a href="/en/blog/funasr-transcribe-long-audio.html">Transcribe Long Audio (Hours in One Call)</a></li>
<li><a href="/en/blog/funasr-cli-transcribe-command-line.html">Transcribe from the Command Line</a></li>
<li><a href="/en/blog/self-hosted-openai-whisper-api-alternative.html">Self-Hosted OpenAI Whisper API Alternative</a></li>
<li><a href="/en/blog/generate-subtitles-srt-vtt-from-audio-video.html">Auto-Generate Subtitles (SRT / VTT)</a></li>
<li><a href="/en/blog/speech-to-text-python-transcribe-audio.html">Speech to Text in Python</a></li>
<li><a href="/en/blog/funasr-llama-cpp-whisper-cpp-alternative.html">FunASR on llama.cpp (whisper.cpp Alternative)</a></li>
<li><a href="/en/blog/funasr-vs-faster-whisper-chinese.html">FunASR vs faster-whisper (Chinese/Cantonese)</a></li>
<li><a href="/en/blog/lightweight-speech-recognition-cpu.html">Lightweight Speech Recognition on CPU</a></li>
<li><a href="/en/blog/self-hosted-deepgram-assemblyai-alternative.html">Self-Hosted Deepgram/AssemblyAI Alternative</a></li>
<li><a href="/en/blog/which-funasr-model.html">Which FunASR Model?</a></li>
<li><a href="/en/blog/cantonese-speech-recognition.html">Cantonese Speech Recognition (SenseVoice)</a></li>
<li><a href="/en/blog/japanese-speech-recognition.html">Japanese Speech Recognition (SenseVoice)</a></li>
<li><a href="/en/blog/voice-activity-detection-python.html">Voice Activity Detection in Python</a></li>
<li><a href="/en/blog/self-hosted-google-aws-azure-speech-to-text.html">Self-Hosted Google/AWS/Azure STT Alternative</a></li>
<li><a href="/en/blog/punctuation-restoration-python.html">Punctuation Restoration in Python</a></li>
<li><a href="/en/blog/speech-to-text-timestamps-python.html">Speech-to-Text with Timestamps in Python</a></li>
</ul>
</div></article>
<footer><div class="container">© 2024-2026 Tongyi Lab, Alibaba Group · <a href="https://github.com/modelscope/FunASR/blob/main/LICENSE">MIT License</a></div></footer>
</body>
</html>
@@ -0,0 +1,168 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Fun-ASR-Nano Guide: 800M ASR LLM for Chinese, English, Japanese and Chinese Dialects | FunASR Blog</title>
<meta name="description" content="Complete Fun-ASR-Nano tutorial: an 800M end-to-end ASR LLM for Chinese, English, Japanese, 7 Chinese dialect groups and 26 regional accents, with hotwords, real-time streaming, external VAD/CAM++ diarization, and native timestamp limitations.">
<meta name="keywords" content="Fun-ASR-Nano, Fun-ASR-Nano deployment, end-to-end speech recognition, speech recognition LLM, Chinese dialect recognition, regional accents, hotwords, streaming ASR, FunASR, speaker diarization">
<link rel="icon" href="/logo.png">
<meta property="og:title" content="Fun-ASR-Nano Guide: 800M ASR LLM for Chinese, English, Japanese and Chinese Dialects | FunASR Blog"><meta property="og:description" content="Complete Fun-ASR-Nano tutorial: an 800M end-to-end ASR LLM for Chinese, English, Japanese, 7 Chinese dialect groups and 26 regional accents, with hotwords, real-time streaming, external VAD/CAM++ diarization, and native timestamp limitations.">
<meta property="og:type" content="article"><meta property="og:url" content="https://www.funasr.com/en/blog/fun-asr-nano-guide.html">
<meta property="og:image" content="https://www.funasr.com/logo.png">
<link rel="canonical" href="https://www.funasr.com/en/blog/fun-asr-nano-guide.html">
<link rel="alternate" hreflang="en" href="https://www.funasr.com/en/blog/fun-asr-nano-guide.html"><link rel="alternate" hreflang="zh" href="https://www.funasr.com/blog/fun-asr-nano-guide.html">
<link rel="alternate" hreflang="x-default" href="https://www.funasr.com/en/blog/fun-asr-nano-guide.html">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"BlogPosting","headline":"Fun-ASR-Nano Guide: 800M ASR LLM for Chinese, English, Japanese and Chinese Dialects | FunASR Blog","description":"Complete Fun-ASR-Nano tutorial: an 800M end-to-end ASR LLM for Chinese, English, Japanese, 7 Chinese dialect groups and 26 regional accents, with hotwords, real-time streaming, external VAD/CAM++ diarization, and native timestamp limitations.","datePublished":"2026-06-16","dateModified":"2026-07-15","author":{"@type":"Organization","name":"FunASR / Tongyi Lab"},"publisher":{"@type":"Organization","name":"FunASR","logo":{"@type":"ImageObject","url":"https://www.funasr.com/logo.png"}},"mainEntityOfPage":{"@type":"WebPage","@id":"https://www.funasr.com/en/blog/fun-asr-nano-guide.html"},"image":"https://www.funasr.com/logo.png"}
</script>
<style>:root{--primary:#2563eb;--primary-dark:#1d4ed8;--bg:#fff;--surface:#f8fafc;--border:#e2e8f0;--text:#0f172a;--text-soft:#475569;--text-muted:#94a3b8;--radius:12px}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:'Inter',-apple-system,sans-serif;color:var(--text);line-height:1.7}
a{color:var(--primary);text-decoration:none}a:hover{text-decoration:underline}
.container{max-width:800px;margin:0 auto;padding:0 24px}
.nav{position:fixed;top:0;left:0;right:0;z-index:100;background:rgba(255,255,255,0.9);backdrop-filter:blur(12px);border-bottom:1px solid var(--border);padding:14px 0}
.nav .container{max-width:1120px;display:flex;align-items:center;gap:24px}
.nav-logo{font-size:1.2rem;font-weight:800;color:var(--text)}.nav-logo span{color:var(--primary)}
.nav-links{display:flex;gap:20px;margin-left:auto;flex-wrap:wrap}
.nav-links a{font-size:0.85rem;font-weight:500;color:var(--text-soft)}
.nav-btn{padding:7px 16px;background:var(--primary);color:#fff;border-radius:7px;font-size:0.83rem;font-weight:600}
article{padding:120px 0 80px}
h1{font-size:2rem;font-weight:800;line-height:1.3;margin-bottom:14px}
h2{font-size:1.3rem;font-weight:700;margin:36px 0 14px;padding-top:16px;border-top:1px solid var(--border)}
h3{font-size:1.05rem;font-weight:700;margin:22px 0 10px}
p{margin-bottom:14px;color:var(--text-soft)}
ul,ol{margin:0 0 14px 22px;color:var(--text-soft)}li{margin-bottom:6px}
table{width:100%;border-collapse:collapse;margin:16px 0;font-size:0.86rem}
th,td{padding:10px 12px;text-align:left;border-bottom:1px solid var(--border)}
th{font-weight:600;background:var(--surface);font-size:0.78rem;color:var(--text-muted)}
pre{background:#1e293b;color:#e2e8f0;padding:18px;border-radius:10px;overflow-x:auto;font-size:0.82rem;line-height:1.7;margin:14px 0}
code{font-family:ui-monospace,Menlo,monospace}
p code,li code{background:var(--surface);padding:2px 6px;border-radius:5px;font-size:0.85em;color:var(--primary-dark)}
.post-meta{color:var(--text-muted);font-size:0.85rem;margin-bottom:24px}
.cta{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:24px;margin:28px 0;text-align:center}
.cta a.btn{display:inline-block;padding:10px 24px;background:var(--primary);color:#fff;border-radius:8px;font-weight:600}
.post-list{list-style:none;margin:0;padding:0}
.post-list li{margin:0 0 8px}
.post-card{display:block;border:1px solid var(--border);border-radius:var(--radius);padding:20px 22px;margin-bottom:14px}
.post-card:hover{border-color:var(--primary);text-decoration:none}
.post-card h2{border:none;padding:0;margin:0 0 6px;font-size:1.15rem;color:var(--text)}
.post-card p{margin:0;color:var(--text-soft);font-size:0.9rem}
.post-card .date{color:var(--text-muted);font-size:0.8rem}
footer{background:#0f172a;color:#94a3b8;padding:28px 0;text-align:center;font-size:0.8rem}
footer a{color:#94a3b8}
@media(max-width:900px){.nav-links{display:none}.nav .container{gap:16px}.nav-logo{margin-right:auto}h1{font-size:1.75rem}p code,li code{overflow-wrap:anywhere;word-break:break-word}}
</style>
</head>
<body>
<nav class="nav"><div class="container"><a href="/en/" class="nav-logo">Fun<span>ASR</span></a><div class="nav-links"><a href="/en/#capabilities">Capabilities</a><a href="/en/#usage">How to Use</a><a href="/en/#benchmark">Benchmark</a><a href="/en/#demo">Demo</a><a href="https://modelscope.github.io/FunASR/" target="_blank">Docs</a><a href="/en/quickstart.html">Quickstart</a><a href="/en/models.html">Models</a><a href="/en/ecosystem.html">Ecosystem</a><a href="/en/blog/">Blog</a><a href="/en/vs-whisper.html">vs Whisper</a><a href="/en/donors.html">Donors</a></div><a href="https://www.funasr.com/blog/fun-asr-nano-guide.html" style="font-size:0.83rem;font-weight:500;color:var(--text-soft)">中文</a><a href="https://github.com/modelscope/FunASR" target="_blank" class="nav-btn">GitHub ★</a></div></nav>
<article><div class="container">
<h1>Fun-ASR-Nano Guide: An 800M ASR LLM for Chinese, English, Japanese and Chinese Dialects</h1>
<p class="post-meta">FunASR Blog · Updated 2026-07-15 · Flagship model</p>
<p><strong>Fun-ASR-Nano</strong> is an end-to-end speech recognition <strong>large model</strong> from the FunAudioLLM team, built on an "Audio Encoder + Adaptor + LLM (Qwen)" architecture with ~800M parameters, trained on tens of millions of hours of real speech. It is our current <strong>flagship recommended</strong> ASR model.</p>
<p>Highlights:</p>
<ul>
<li>Supports <strong>Chinese, English, and Japanese</strong>; Chinese covers <strong>7 dialect groups</strong> (Wu, Cantonese, Min, Hakka, Gan, Xiang, Jin) and 26 regional accents</li>
<li><strong>Hotwords</strong> and a <strong>low-latency streaming service</strong></li>
<li>The FunASR pipeline can combine separate <strong>VAD + cam++ + punctuation</strong> models for speaker diarization (not a native Nano checkpoint output)</li>
<li>Even <strong>lyric and rap speech recognition</strong></li>
</ul>
<p><strong>Timestamp boundary:</strong> The released <code>model.pt</code> checkpoint lacks trained CTC alignment weights, so it does not provide reliable checkpoint-native character timestamps. In the offline service, VAD returns reliable segment start and end times; use Paraformer when you need accurate character-level timestamps. See <a href="https://github.com/QwenAudio/Fun-ASR/issues/106" target="_blank" rel="noopener">issue #106</a>.</p>
<p>For recognition across 31 languages, use the separate <a href="https://huggingface.co/FunAudioLLM/Fun-ASR-MLT-Nano-2512" target="_blank" rel="noopener">Fun-ASR-MLT-Nano-2512</a> checkpoint. Its language scope must not be attributed to flagship Nano.</p>
<h2>1. Install</h2>
<pre>pip install -U funasr torch torchaudio</pre>
<h2>2. Basic inference (with hotwords)</h2>
<p>A minimal, tested example (downloads the model automatically):</p>
<pre>from funasr import AutoModel
model = AutoModel(
model="FunAudioLLM/Fun-ASR-Nano-2512",
trust_remote_code=True,
remote_code="./model.py",
device="cuda:0",
hub="hf", # use hub="ms" for ModelScope
)
wav = f"{model.model_path}/example/zh.mp3" # bundled sample audio
res = model.generate(
input=[wav], cache={}, batch_size=1,
hotwords=["开放时间"], # boosts recall of domain terms
language="中文",
itn=True,
)
print(res[0]["text"])</pre>
<p>Verified output: <code>开放时间早上九点至下午五点。</code> — the hotword was recognized correctly.</p>
<h2>3. Long audio: add VAD</h2>
<pre>model = AutoModel(
model="FunAudioLLM/Fun-ASR-Nano-2512",
trust_remote_code=True, remote_code="./model.py",
vad_model="fsmn-vad",
vad_kwargs={"max_single_segment_time": 30000},
device="cuda:0", hub="hf",
)
res = model.generate(input=[wav], cache={}, batch_size=1, language="中文")</pre>
<h2>4. Speaker diarization</h2>
<p>Speaker diarization is not a native Nano checkpoint output. The FunASR pipeline below combines VAD + speaker embedding (cam++) + punctuation for per-sentence speaker labels:</p>
<pre>model = AutoModel(
model="FunAudioLLM/Fun-ASR-Nano-2512",
trust_remote_code=True, remote_code="./model.py",
vad_model="fsmn-vad", vad_kwargs={"max_single_segment_time": 30000},
spk_model="cam++", punc_model="ct-punc",
device="cuda:0", hub="hf",
)
res = model.generate(input=[wav], cache={}, batch_size=1, language="中文")
for sent in res[0]["sentence_info"]:
print(sent["spk"], sent["text"])</pre>
<p>Diarization needs FunASR from source: <code>pip install git+https://github.com/modelscope/FunASR.git</code>.</p>
<h2>5. High-throughput / streaming</h2>
<table>
<thead><tr><th>Scenario</th><th>Recommended</th></tr></thead>
<tbody>
<tr><td>Large-scale offline batch</td><td><code>AutoModelVLLM</code> (vLLM backend)</td></tr>
<tr><td>Real-time low latency</td><td><code>FunASRNanoStreamingVLLM</code> (chunk streaming)</td></tr>
<tr><td>Single machine / quick try</td><td>The <code>AutoModel</code> path above</td></tr>
</tbody>
</table>
<p>The vLLM path is version-sensitive; vLLM 0.12.0 + torch 2.9.0 is recommended. Full examples in the <a href="https://github.com/QwenAudio/Fun-ASR" target="_blank">Fun-ASR repo</a>.</p>
<div class="cta">
<h3>Get started with Fun-ASR-Nano</h3>
<p>Our flagship model for zh/en/ja plus Chinese dialects and accents. Choose MLT-Nano for 31 languages. If it helps, please star it on GitHub ⭐</p>
<a href="https://github.com/QwenAudio/Fun-ASR" class="btn">Fun-ASR GitHub ★</a>
</div>
<p>Read more: <a href="/en/blog/sensevoice-deployment-guide.html">SenseVoice Deployment Guide</a> · <a href="/en/quickstart.html">Quickstart</a></p>
<!--related-posts-->
<h2>Related posts</h2>
<ul class="post-list">
<li><a href="/en/blog/funasr-vs-whisper-benchmark.html">FunASR vs Whisper Benchmark</a></li>
<li><a href="/en/blog/sensevoice-deployment-guide.html">SenseVoice Deployment Guide</a></li>
<li><a href="/en/blog/funasr-speaker-diarization.html">Speaker Diarization: Who Spoke When</a></li>
<li><a href="/en/blog/sensevoice-emotion-language-detection.html">Emotion & Language Detection</a></li>
<li><a href="/en/blog/funasr-realtime-streaming-asr.html">Real-Time Streaming Speech-to-Text</a></li>
<li><a href="/en/blog/funasr-transcribe-long-audio.html">Transcribe Long Audio (Hours in One Call)</a></li>
<li><a href="/en/blog/funasr-cli-transcribe-command-line.html">Transcribe from the Command Line</a></li>
<li><a href="/en/blog/self-hosted-openai-whisper-api-alternative.html">Self-Hosted OpenAI Whisper API Alternative</a></li>
<li><a href="/en/blog/generate-subtitles-srt-vtt-from-audio-video.html">Auto-Generate Subtitles (SRT / VTT)</a></li>
<li><a href="/en/blog/speech-to-text-python-transcribe-audio.html">Speech to Text in Python</a></li>
<li><a href="/en/blog/funasr-llama-cpp-whisper-cpp-alternative.html">FunASR on llama.cpp (whisper.cpp Alternative)</a></li>
<li><a href="/en/blog/funasr-vs-faster-whisper-chinese.html">FunASR vs faster-whisper (Chinese/Cantonese)</a></li>
<li><a href="/en/blog/lightweight-speech-recognition-cpu.html">Lightweight Speech Recognition on CPU</a></li>
<li><a href="/en/blog/self-hosted-deepgram-assemblyai-alternative.html">Self-Hosted Deepgram/AssemblyAI Alternative</a></li>
<li><a href="/en/blog/which-funasr-model.html">Which FunASR Model?</a></li>
<li><a href="/en/blog/cantonese-speech-recognition.html">Cantonese Speech Recognition (SenseVoice)</a></li>
<li><a href="/en/blog/japanese-speech-recognition.html">Japanese Speech Recognition (SenseVoice)</a></li>
<li><a href="/en/blog/voice-activity-detection-python.html">Voice Activity Detection in Python</a></li>
<li><a href="/en/blog/self-hosted-google-aws-azure-speech-to-text.html">Self-Hosted Google/AWS/Azure STT Alternative</a></li>
<li><a href="/en/blog/chinese-speech-recognition.html">Chinese Speech Recognition in Python</a></li>
<li><a href="/en/blog/punctuation-restoration-python.html">Punctuation Restoration in Python</a></li>
<li><a href="/en/blog/speech-to-text-timestamps-python.html">Speech-to-Text with Timestamps in Python</a></li>
</ul>
</div></article>
<footer><div class="container">© 2024-2026 Tongyi Lab, Alibaba Group · <a href="https://github.com/modelscope/FunASR/blob/main/LICENSE">MIT License</a></div></footer>
</body>
</html>
@@ -0,0 +1,129 @@
<!DOCTYPE html>
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>Transcribe Audio from the Command Line with FunASR (text / JSON / SRT) | FunASR</title><meta name="description" content="FunASR ships a CLI: `funasr audio.wav` prints text, `-f srt` makes subtitles, `-f json` gives structured output, `--spk` adds speakers. No Python needed - local, free, strong on Chinese. All commands tested."><meta name="keywords" content="speech to text command line, transcribe audio cli, audio to srt command line, funasr cli, command line speech recognition, generate subtitles cli, whisper cli alternative">
<link rel="icon" href="/logo.png"><meta property="og:title" content="Transcribe Audio from the Command Line with FunASR (text / JSON / SRT)"><meta property="og:description" content="FunASR ships a CLI: `funasr audio.wav` prints text, `-f srt` makes subtitles, `-f json` gives structured output, `--spk` adds speakers. No Python needed - local, free, strong on Chinese. All commands tested.">
<meta property="og:type" content="article"><meta property="og:url" content="https://www.funasr.com/en/blog/funasr-cli-transcribe-command-line.html"><meta property="og:image" content="https://www.funasr.com/logo.png">
<link rel="canonical" href="https://www.funasr.com/en/blog/funasr-cli-transcribe-command-line.html"><link rel="alternate" hreflang="en" href="https://www.funasr.com/en/blog/funasr-cli-transcribe-command-line.html"><link rel="alternate" hreflang="zh" href="https://www.funasr.com/blog/funasr-cli-transcribe-command-line.html"><link rel="alternate" hreflang="x-default" href="https://www.funasr.com/en/blog/funasr-cli-transcribe-command-line.html">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"BlogPosting","headline":"Transcribe Audio from the Command Line with FunASR (text / JSON / SRT)","description":"FunASR ships a CLI: `funasr audio.wav` prints text, `-f srt` makes subtitles, `-f json` gives structured output, `--spk` adds speakers. No Python needed - local, free, strong on Chinese. All commands tested.","datePublished":"2026-06-18","dateModified":"2026-06-18","author":{"@type":"Organization","name":"FunASR / Tongyi Lab"},"publisher":{"@type":"Organization","name":"FunASR","logo":{"@type":"ImageObject","url":"https://www.funasr.com/logo.png"}},"mainEntityOfPage":{"@type":"WebPage","@id":"https://www.funasr.com/en/blog/funasr-cli-transcribe-command-line.html"},"image":"https://www.funasr.com/logo.png"}
</script>
<style>:root{--primary:#2563eb;--primary-dark:#1d4ed8;--bg:#fff;--surface:#f8fafc;--border:#e2e8f0;--text:#0f172a;--text-soft:#475569;--text-muted:#94a3b8;--radius:12px}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:'Inter',-apple-system,sans-serif;color:var(--text);line-height:1.7}
a{color:var(--primary);text-decoration:none}a:hover{text-decoration:underline}
.container{max-width:800px;margin:0 auto;padding:0 24px}
.nav{position:fixed;top:0;left:0;right:0;z-index:100;background:rgba(255,255,255,0.9);backdrop-filter:blur(12px);border-bottom:1px solid var(--border);padding:14px 0}
.nav .container{max-width:1120px;display:flex;align-items:center;gap:24px}
.nav-logo{font-size:1.2rem;font-weight:800;color:var(--text)}.nav-logo span{color:var(--primary)}
.nav-links{display:flex;gap:20px;margin-left:auto;flex-wrap:wrap}
.nav-links a{font-size:0.85rem;font-weight:500;color:var(--text-soft)}
.nav-btn{padding:7px 16px;background:var(--primary);color:#fff;border-radius:7px;font-size:0.83rem;font-weight:600}
article{padding:120px 0 80px}
h1{font-size:2rem;font-weight:800;line-height:1.3;margin-bottom:14px}
h2{font-size:1.3rem;font-weight:700;margin:36px 0 14px;padding-top:16px;border-top:1px solid var(--border)}
h3{font-size:1.05rem;font-weight:700;margin:22px 0 10px}
p{margin-bottom:14px;color:var(--text-soft)}
ul,ol{margin:0 0 14px 22px;color:var(--text-soft)}li{margin-bottom:6px}
table{width:100%;border-collapse:collapse;margin:16px 0;font-size:0.86rem}
th,td{padding:10px 12px;text-align:left;border-bottom:1px solid var(--border)}
th{font-weight:600;background:var(--surface);font-size:0.78rem;color:var(--text-muted)}
pre{background:#1e293b;color:#e2e8f0;padding:18px;border-radius:10px;overflow-x:auto;font-size:0.82rem;line-height:1.7;margin:14px 0}
code{font-family:ui-monospace,Menlo,monospace}
p code,li code{background:var(--surface);padding:2px 6px;border-radius:5px;font-size:0.85em;color:var(--primary-dark)}
.post-meta{color:var(--text-muted);font-size:0.85rem;margin-bottom:24px}
.cta{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:24px;margin:28px 0;text-align:center}
.cta a.btn{display:inline-block;padding:10px 24px;background:var(--primary);color:#fff;border-radius:8px;font-weight:600}
.post-list{list-style:none;margin:0;padding:0}
.post-list li{margin:0 0 8px}
.post-card{display:block;border:1px solid var(--border);border-radius:var(--radius);padding:20px 22px;margin-bottom:14px}
.post-card:hover{border-color:var(--primary);text-decoration:none}
.post-card h2{border:none;padding:0;margin:0 0 6px;font-size:1.15rem;color:var(--text)}
.post-card p{margin:0;color:var(--text-soft);font-size:0.9rem}
.post-card .date{color:var(--text-muted);font-size:0.8rem}
footer{background:#0f172a;color:#94a3b8;padding:28px 0;text-align:center;font-size:0.8rem}
footer a{color:#94a3b8}</style></head><body>
<nav class="nav"><div class="container"><a href="/" class="nav-logo">Fun<span>ASR</span></a><div class="nav-links"><a href="/en/#capabilities">Capabilities</a><a href="/en/#usage">How to Use</a><a href="/en/#benchmark">Benchmark</a><a href="/en/#demo">Demo</a><a href="https://modelscope.github.io/FunASR/" target="_blank">Docs</a><a href="/en/quickstart.html">Quickstart</a><a href="/en/models.html">Models</a><a href="/en/ecosystem.html">Ecosystem</a><a href="/en/blog/">Blog</a><a href="/en/vs-whisper.html">vs Whisper</a><a href="/en/donors.html">Thanks</a></div><a href="https://www.funasr.com/blog/funasr-cli-transcribe-command-line.html" style="font-size:0.83rem;font-weight:600;color:var(--text-soft)">中文</a><a href="https://github.com/modelscope/FunASR" target="_blank" class="nav-btn">GitHub ★</a></div></nav>
<article><div class="container">
<h1>Transcribe Audio from the Command Line with FunASR (text / JSON / SRT)</h1>
<p class="post-meta">FunASR Blog · 2026-06-18 · Tutorial</p>
<p>Don't want to write Python? FunASR ships a command-line tool that turns audio into text, JSON, or SRT subtitles right in your terminal. Local, free, and especially strong on Chinese. Every command below is tested.</p>
<h2>Install</h2>
<pre><code>pip install -U torch torchaudio
pip install -U funasr # recommended funasr &gt;= 1.3.26</code></pre>
<h2>Simplest: print text</h2>
<pre><code>funasr audio.wav</code></pre>
<p>Prints the transcript to the terminal. Defaults to SenseVoice (non-autoregressive, very fast, 50+ languages).</p>
<h2>Generate SRT subtitles</h2>
<pre><code>funasr audio.wav -f srt -o ./subs</code></pre>
<p>Writes <code>./subs/audio.srt</code>. Add <code>--spk</code> for speaker-split cues with real timestamps:</p>
<pre><code>funasr meeting.wav --spk -f srt -o ./subs</code></pre>
<pre><code>1
00:00:02,919 --&gt; 00:00:08,169
Hi everyone, let's talk about the Q3 plan.
2
00:00:10,029 --&gt; 00:00:18,550
Quick status update - core features are 80% done.</code></pre>
<h2>Structured JSON</h2>
<pre><code>funasr audio.wav -f json</code></pre>
<pre><code>{
"text": "Hi everyone let's talk about the Q3 plan...",
"file": "audio.wav",
"model": "sensevoice",
"language": "auto",
"audio_duration_s": 59.52,
"processing_s": 2.17
}</code></pre>
<h2>Common options</h2>
<table><thead><tr><th>Command</th><th>What it does</th></tr></thead><tbody>
<tr><td><code>-f text/json/srt/tsv</code></td><td>Output format (default text)</td></tr>
<tr><td><code>--spk</code></td><td>Speaker diarization (who spoke when)</td></tr>
<tr><td><code>--model sensevoice/paraformer/fun-asr-nano</code></td><td>Pick a model (fun-asr-nano = highest accuracy)</td></tr>
<tr><td><code>--hotwords "term,jargon"</code></td><td>Hotwords to boost rare terms</td></tr>
<tr><td><code>-o ./out</code></td><td>Output directory</td></tr>
<tr><td><code>funasr a.wav b.wav</code></td><td>Transcribe multiple files at once</td></tr>
</tbody></table>
<h2>Deploy as an API server (OpenAI-compatible)</h2>
<pre><code>funasr-server --device cuda # localhost:8000, POST /v1/audio/transcriptions</code></pre>
<p>Call it with any OpenAI SDK:</p>
<pre><code>from openai import OpenAI
client = OpenAI(base_url="http://localhost:8000/v1", api_key="x")
r = client.audio.transcriptions.create(model="sensevoice", file=open("audio.wav","rb"))
print(r.text)</code></pre>
<h2>Why the FunASR CLI</h2>
<ul>
<li><strong>Local, free, private</strong> - no internet, no API key.</li>
<li><strong>Fast</strong>: SenseVoice is non-autoregressive, far faster than Whisper (<a href="/en/blog/funasr-vs-whisper-benchmark.html">benchmark</a>) - real-time even on CPU.</li>
<li><strong>Stronger on Chinese</strong> + 50+ languages; subtitles, speakers, hotwords, JSON out of the box.</li>
</ul>
<div class="cta"><p>FunASR is Tongyi Lab's open-source, industrial-grade speech recognition toolkit.</p><a class="btn" href="https://github.com/modelscope/FunASR" target="_blank">Star FunASR on GitHub ★</a></div>
<!--related-posts-->
<h2>Related posts</h2>
<ul class="post-list">
<li><a href="/en/blog/funasr-vs-whisper-benchmark.html">FunASR vs Whisper Benchmark</a></li>
<li><a href="/en/blog/sensevoice-deployment-guide.html">SenseVoice Deployment Guide</a></li>
<li><a href="/en/blog/fun-asr-nano-guide.html">Fun-ASR-Nano Guide</a></li>
<li><a href="/en/blog/funasr-speaker-diarization.html">Speaker Diarization: Who Spoke When</a></li>
<li><a href="/en/blog/sensevoice-emotion-language-detection.html">Emotion & Language Detection</a></li>
<li><a href="/en/blog/funasr-realtime-streaming-asr.html">Real-Time Streaming Speech-to-Text</a></li>
<li><a href="/en/blog/funasr-transcribe-long-audio.html">Transcribe Long Audio (Hours in One Call)</a></li>
<li><a href="/en/blog/self-hosted-openai-whisper-api-alternative.html">Self-Hosted OpenAI Whisper API Alternative</a></li>
<li><a href="/en/blog/generate-subtitles-srt-vtt-from-audio-video.html">Auto-Generate Subtitles (SRT / VTT)</a></li>
<li><a href="/en/blog/speech-to-text-python-transcribe-audio.html">Speech to Text in Python</a></li>
<li><a href="/en/blog/funasr-llama-cpp-whisper-cpp-alternative.html">FunASR on llama.cpp (whisper.cpp Alternative)</a></li>
<li><a href="/en/blog/funasr-vs-faster-whisper-chinese.html">FunASR vs faster-whisper (Chinese/Cantonese)</a></li>
<li><a href="/en/blog/lightweight-speech-recognition-cpu.html">Lightweight Speech Recognition on CPU</a></li>
<li><a href="/en/blog/self-hosted-deepgram-assemblyai-alternative.html">Self-Hosted Deepgram/AssemblyAI Alternative</a></li>
<li><a href="/en/blog/which-funasr-model.html">Which FunASR Model?</a></li>
<li><a href="/en/blog/cantonese-speech-recognition.html">Cantonese Speech Recognition (SenseVoice)</a></li>
<li><a href="/en/blog/japanese-speech-recognition.html">Japanese Speech Recognition (SenseVoice)</a></li>
<li><a href="/en/blog/voice-activity-detection-python.html">Voice Activity Detection in Python</a></li>
<li><a href="/en/blog/self-hosted-google-aws-azure-speech-to-text.html">Self-Hosted Google/AWS/Azure STT Alternative</a></li>
<li><a href="/en/blog/chinese-speech-recognition.html">Chinese Speech Recognition in Python</a></li>
<li><a href="/en/blog/punctuation-restoration-python.html">Punctuation Restoration in Python</a></li>
<li><a href="/en/blog/speech-to-text-timestamps-python.html">Speech-to-Text with Timestamps in Python</a></li>
</ul>
</div></article>
<footer><div class="container">FunASR · Open-source speech recognition by Tongyi Lab · <a href="https://github.com/modelscope/FunASR">GitHub</a></div></footer>
</body></html>
@@ -0,0 +1,145 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>FunASR on llama.cpp — a whisper.cpp Alternative for Chinese ASR (CPU, no Python) | FunASR Blog</title>
<meta name="description" content="FunASR's llama.cpp/GGUF on-device runtime: a single self-contained binary, no Python, built-in VAD, any audio format — download and transcribe Chinese. ~2.7x more accurate than whisper.cpp on CPU. Verified 3-step quickstart.">
<meta name="keywords" content="whisper.cpp alternative, llama.cpp speech recognition, FunASR, chinese asr cpu, on-device asr, offline speech recognition, gguf, SenseVoice, Paraformer, asr without gpu">
<link rel="icon" href="/logo.png">
<meta property="og:title" content="FunASR on llama.cpp — a whisper.cpp Alternative for Chinese ASR (CPU, no Python) | FunASR Blog">
<meta property="og:description" content="FunASR's llama.cpp/GGUF on-device runtime: a single self-contained binary, no Python, built-in VAD, any audio format — download and transcribe Chinese. ~2.7x more accurate than whisper.cpp on CPU. Verified 3-step quickstart.">
<meta property="og:type" content="article">
<meta property="og:url" content="https://www.funasr.com/en/blog/funasr-llama-cpp-whisper-cpp-alternative.html">
<meta property="og:image" content="https://www.funasr.com/logo.png">
<link rel="canonical" href="https://www.funasr.com/en/blog/funasr-llama-cpp-whisper-cpp-alternative.html">
<link rel="alternate" hreflang="en" href="https://www.funasr.com/en/blog/funasr-llama-cpp-whisper-cpp-alternative.html">
<link rel="alternate" hreflang="zh" href="https://www.funasr.com/blog/funasr-llama-cpp-whisper-cpp-alternative.html">
<link rel="alternate" hreflang="x-default" href="https://www.funasr.com/en/blog/funasr-llama-cpp-whisper-cpp-alternative.html">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"BlogPosting","headline":"FunASR on llama.cpp — a whisper.cpp Alternative for Chinese ASR (CPU, no Python) | FunASR Blog","description":"FunASR's llama.cpp/GGUF on-device runtime: a single self-contained binary, no Python, built-in VAD, any audio format — download and transcribe Chinese. ~2.7x more accurate than whisper.cpp on CPU. Verified 3-step quickstart.","datePublished":"2026-06-20","dateModified":"2026-06-20","author":{"@type":"Organization","name":"FunASR / Tongyi Lab"},"publisher":{"@type":"Organization","name":"FunASR","logo":{"@type":"ImageObject","url":"https://www.funasr.com/logo.png"}},"mainEntityOfPage":{"@type":"WebPage","@id":"https://www.funasr.com/en/blog/funasr-llama-cpp-whisper-cpp-alternative.html"},"image":"https://www.funasr.com/logo.png"}
</script>
<style>:root{--primary:#2563eb;--primary-dark:#1d4ed8;--bg:#fff;--surface:#f8fafc;--border:#e2e8f0;--text:#0f172a;--text-soft:#475569;--text-muted:#94a3b8;--radius:12px}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:'Inter',-apple-system,sans-serif;color:var(--text);line-height:1.7}
a{color:var(--primary);text-decoration:none}a:hover{text-decoration:underline}
.container{max-width:800px;margin:0 auto;padding:0 24px}
.nav{position:fixed;top:0;left:0;right:0;z-index:100;background:rgba(255,255,255,0.9);backdrop-filter:blur(12px);border-bottom:1px solid var(--border);padding:14px 0}
.nav .container{max-width:1120px;display:flex;align-items:center;gap:24px}
.nav-logo{font-size:1.2rem;font-weight:800;color:var(--text)}.nav-logo span{color:var(--primary)}
.nav-links{display:flex;gap:20px;margin-left:auto;flex-wrap:wrap}
.nav-links a{font-size:0.85rem;font-weight:500;color:var(--text-soft)}
.nav-btn{padding:7px 16px;background:var(--primary);color:#fff;border-radius:7px;font-size:0.83rem;font-weight:600}
article{padding:120px 0 80px}
h1{font-size:2rem;font-weight:800;line-height:1.3;margin-bottom:14px}
h2{font-size:1.3rem;font-weight:700;margin:36px 0 14px;padding-top:16px;border-top:1px solid var(--border)}
h3{font-size:1.05rem;font-weight:700;margin:22px 0 10px}
p{margin-bottom:14px;color:var(--text-soft)}
ul,ol{margin:0 0 14px 22px;color:var(--text-soft)}li{margin-bottom:6px}
table{width:100%;border-collapse:collapse;margin:16px 0;font-size:0.86rem}
th,td{padding:10px 12px;text-align:left;border-bottom:1px solid var(--border)}
th{font-weight:600;background:var(--surface);font-size:0.78rem;color:var(--text-muted)}
pre{background:#1e293b;color:#e2e8f0;padding:18px;border-radius:10px;overflow-x:auto;font-size:0.82rem;line-height:1.7;margin:14px 0}
code{font-family:ui-monospace,Menlo,monospace}
p code,li code{background:var(--surface);padding:2px 6px;border-radius:5px;font-size:0.85em;color:var(--primary-dark)}
.post-meta{color:var(--text-muted);font-size:0.85rem;margin-bottom:24px}
.cta{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:24px;margin:28px 0;text-align:center}
.cta a.btn{display:inline-block;padding:10px 24px;background:var(--primary);color:#fff;border-radius:8px;font-weight:600}
.post-list{list-style:none;margin:0;padding:0}
.post-list li{margin:0 0 8px}
.post-card{display:block;border:1px solid var(--border);border-radius:var(--radius);padding:20px 22px;margin-bottom:14px}
.post-card:hover{border-color:var(--primary);text-decoration:none}
.post-card h2{border:none;padding:0;margin:0 0 6px;font-size:1.15rem;color:var(--text)}
.post-card p{margin:0;color:var(--text-soft);font-size:0.9rem}
.post-card .date{color:var(--text-muted);font-size:0.8rem}
footer{background:#0f172a;color:#94a3b8;padding:28px 0;text-align:center;font-size:0.8rem}
footer a{color:#94a3b8}</style>
</head>
<body>
<nav class="nav"><div class="container"><a href="/en/" class="nav-logo">Fun<span>ASR</span></a><div class="nav-links"><a href="/en/#capabilities">Capabilities</a><a href="/en/#usage">How to Use</a><a href="/en/#benchmark">Benchmark</a><a href="/en/#demo">Demo</a><a href="https://modelscope.github.io/FunASR/" target="_blank">Docs</a><a href="/en/quickstart.html">Quickstart</a><a href="/en/models.html">Models</a><a href="/en/ecosystem.html">Ecosystem</a><a href="/en/blog/">Blog</a><a href="/en/vs-whisper.html">vs Whisper</a><a href="/en/donors.html">Thanks</a></div><a href="https://www.funasr.com/blog/funasr-llama-cpp-whisper-cpp-alternative.html" style="font-size:0.83rem;font-weight:500;color:var(--text-soft)">中文</a><a href="https://github.com/modelscope/FunASR" target="_blank" class="nav-btn">GitHub ★</a></div></nav>
<article><div class="container">
<h1>FunASR on llama.cpp — a whisper.cpp Alternative for Chinese ASR (CPU, no Python)</h1>
<p class="post-meta">2026-06-20 · FunASR Team</p>
<p><a href="https://github.com/ggml-org/whisper.cpp" target="_blank">whisper.cpp</a> is the de-facto on-device ASR runtime — a single self-contained binary, runs on CPU, zero dependencies. But Whisper is comparatively weak on <strong>Chinese</strong>. Now <strong>FunASR has a llama.cpp / GGUF runtime</strong>: the same download-and-run experience — <strong>one static binary, no Python, built-in VAD, any audio format</strong> — and it is about <strong>2.7× more accurate than whisper.cpp on Chinese CPU</strong>.</p>
<p style="background:var(--surface);border:1px solid var(--border);border-radius:10px;padding:12px 16px"><strong>👉 Just want the download?</strong> Prebuilt binaries for Linux/macOS/Windows plus a one-page quickstart and benchmarks are on the <a href="/en/llama-cpp.html">Run FunASR on CPU (llama.cpp) page</a>.</p>
<h2>Run it in 3 steps (all verified)</h2>
<pre># 1. Download a prebuilt binary (linux-x64 / linux-arm64 / macos-arm64 / windows-x64)
wget https://github.com/modelscope/FunASR/releases/download/runtime-llamacpp-v0.1.9/funasr-llamacpp-linux-x64-vulkan.tar.gz
tar xzf funasr-llamacpp-linux-x64-vulkan.tar.gz
# Windows Vulkan asset: funasr-llamacpp-windows-x64-vulkan.zip (run with --backend vulkan)
# 2. Download a model with one command (no torch / funasr env)
bash download-funasr-model.sh sensevoice
# 3. Transcribe — prints text directly
./llama-funasr-sensevoice -m funasr-gguf/sensevoice-small-f16.gguf \
--vad funasr-gguf/fsmn-vad.gguf -a audio.wav
# -> 开放时间早上九点至下午五点</pre>
<p>No Python, no build, no dependency hell — download the binary, download the model, run, get text. Exactly the whisper.cpp feel.</p>
<h2>What you get</h2>
<table>
<tr><th>Model</th><th>Strength</th><th>Speed (CPU)</th></tr>
<tr><td><strong>SenseVoice</strong></td><td>multilingual + language / emotion / event tags</td><td>~20× real-time</td></tr>
<tr><td><strong>Paraformer</strong></td><td>non-autoregressive, fastest</td><td>~22× real-time</td></tr>
<tr><td><strong>Fun-ASR-Nano</strong></td><td>LLM-ASR, most accurate</td><td>LLM decode</td></tr>
</table>
<ul>
<li><strong>Built-in FSMN-VAD</strong>: automatic long-audio segmentation (`--vad fsmn-vad.gguf`); the bare binary reaches reference accuracy with no Python front end.</li>
<li><strong>Any audio</strong>: wav / mp3 / flac, any sample rate / channels — resampled inside the binary.</li>
<li><strong>Multi-platform prebuilts</strong>: Linux x64/arm64, macOS arm64, Windows x64, including Linux/Windows Vulkan and Windows CUDA acceleration packages (<a href="https://github.com/modelscope/FunASR/releases/tag/runtime-llamacpp-v0.1.9" target="_blank">Release</a>); one CMake command to build for others.</li>
</ul>
<h2>vs whisper.cpp on Chinese CPU</h2>
<p>184 Mandarin clips, same machine, CPU 8 threads, character error rate (CER, lower is better):</p>
<table>
<tr><th>System</th><th>CER ↓</th><th>Size</th></tr>
<tr><td><strong>FunASR SenseVoice</strong></td><td><strong>8.01 %</strong></td><td>449 MB</td></tr>
<tr><td><strong>FunASR Paraformer</strong></td><td><strong>9.85 %</strong></td><td>401 MB</td></tr>
<tr><td><strong>FunASR Fun-ASR-Nano</strong></td><td><strong>8.30 %</strong></td><td>enc + Qwen3-0.6B</td></tr>
<tr><td>whisper.cpp base</td><td>31.33 %</td><td>142 MB</td></tr>
<tr><td>whisper.cpp small</td><td>22.12 %</td><td>466 MB</td></tr>
<tr><td>whisper.cpp large-v3-turbo</td><td>23.15 %</td><td>1.6 GB</td></tr>
</table>
<p>At comparable size (SenseVoice 449 MB ≈ whisper small 466 MB), FunASR's CER is about <strong>2.7× lower</strong> — and faster. Full methodology in the repo's <a href="https://github.com/modelscope/FunASR/blob/main/runtime/llama.cpp/BENCHMARKS.md" target="_blank">BENCHMARKS.md</a>.</p>
<h2>Why it wins on Chinese</h2>
<p>(1) <strong>Training data</strong> — SenseVoice / Paraformer / Fun-ASR-Nano are trained primarily on large-scale Mandarin; Whisper is a general multilingual model where Chinese is a small slice. (2) <strong>Architecture</strong> — Paraformer is non-autoregressive (CIF, one forward pass) and SenseVoice is encoder + CTC (one forward pass), faster than Whisper's autoregressive per-token decoding.</p>
<h2>Model GGUFs</h2>
<p>Pre-converted GGUF on Hugging Face: <a href="https://huggingface.co/FunAudioLLM/SenseVoiceSmall-GGUF" target="_blank">SenseVoiceSmall-GGUF</a> · <a href="https://huggingface.co/FunAudioLLM/Paraformer-GGUF" target="_blank">Paraformer-GGUF</a> · <a href="https://huggingface.co/FunAudioLLM/Fun-ASR-Nano-GGUF" target="_blank">Fun-ASR-Nano-GGUF</a> · <a href="https://huggingface.co/FunAudioLLM/fsmn-vad-GGUF" target="_blank">fsmn-vad-GGUF</a>. `download-funasr-model.sh` fetches them automatically.</p>
<div class="cta"><p><strong>The whole FunASR stack is open-source</strong> — ASR / VAD / punctuation / speaker / emotion &amp; events / LLM-ASR, now with an on-device llama.cpp runtime. A GitHub Star really helps 👇</p><p><a class="btn" href="https://github.com/modelscope/FunASR" target="_blank">⭐ Star FunASR</a></p><p style="margin-top:10px;font-size:0.85rem">Also star:<a href="https://github.com/QwenAudio/SenseVoice" target="_blank">SenseVoice</a> · <a href="https://github.com/QwenAudio/Fun-ASR" target="_blank">Fun-ASR</a> · <a href="https://github.com/modelscope/FunClip" target="_blank">FunClip</a></p></div>
<!--related-posts-->
<h2>Related posts</h2>
<ul class="post-list">
<li><a href="/en/blog/funasr-vs-whisper-benchmark.html">FunASR vs Whisper Benchmark</a></li>
<li><a href="/en/blog/sensevoice-deployment-guide.html">SenseVoice Deployment Guide</a></li>
<li><a href="/en/blog/fun-asr-nano-guide.html">Fun-ASR-Nano Guide</a></li>
<li><a href="/en/blog/funasr-speaker-diarization.html">Speaker Diarization: Who Spoke When</a></li>
<li><a href="/en/blog/sensevoice-emotion-language-detection.html">Emotion & Language Detection</a></li>
<li><a href="/en/blog/funasr-realtime-streaming-asr.html">Real-Time Streaming Speech-to-Text</a></li>
<li><a href="/en/blog/funasr-transcribe-long-audio.html">Transcribe Long Audio (Hours in One Call)</a></li>
<li><a href="/en/blog/funasr-cli-transcribe-command-line.html">Transcribe from the Command Line</a></li>
<li><a href="/en/blog/self-hosted-openai-whisper-api-alternative.html">Self-Hosted OpenAI Whisper API Alternative</a></li>
<li><a href="/en/blog/generate-subtitles-srt-vtt-from-audio-video.html">Auto-Generate Subtitles (SRT / VTT)</a></li>
<li><a href="/en/blog/speech-to-text-python-transcribe-audio.html">Speech to Text in Python</a></li>
<li><a href="/en/blog/funasr-vs-faster-whisper-chinese.html">FunASR vs faster-whisper (Chinese/Cantonese)</a></li>
<li><a href="/en/blog/lightweight-speech-recognition-cpu.html">Lightweight Speech Recognition on CPU</a></li>
<li><a href="/en/blog/self-hosted-deepgram-assemblyai-alternative.html">Self-Hosted Deepgram/AssemblyAI Alternative</a></li>
<li><a href="/en/blog/which-funasr-model.html">Which FunASR Model?</a></li>
<li><a href="/en/blog/cantonese-speech-recognition.html">Cantonese Speech Recognition (SenseVoice)</a></li>
<li><a href="/en/blog/japanese-speech-recognition.html">Japanese Speech Recognition (SenseVoice)</a></li>
<li><a href="/en/blog/voice-activity-detection-python.html">Voice Activity Detection in Python</a></li>
<li><a href="/en/blog/self-hosted-google-aws-azure-speech-to-text.html">Self-Hosted Google/AWS/Azure STT Alternative</a></li>
<li><a href="/en/blog/chinese-speech-recognition.html">Chinese Speech Recognition in Python</a></li>
<li><a href="/en/blog/punctuation-restoration-python.html">Punctuation Restoration in Python</a></li>
<li><a href="/en/blog/speech-to-text-timestamps-python.html">Speech-to-Text with Timestamps in Python</a></li>
</ul>
</div></article>
<footer><div class="container">© 2024-2026 Tongyi Lab, Alibaba Group · <a href="https://github.com/modelscope/FunASR/blob/main/LICENSE">MIT License</a></div></footer>
</body>
</html>
@@ -0,0 +1,136 @@
<!DOCTYPE html>
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>Real-Time Streaming Speech-to-Text with FunASR | FunASR</title><meta name="description" content="FunASR's streaming Paraformer enables ~600ms low-latency real-time speech-to-text: partial text as you speak, via cached chunk decoding. Ideal for live captions, voice assistants and meetings. Runnable code + 2-pass (streaming + offline) best practice included."><meta name="keywords" content="real time speech to text, streaming asr, low latency speech recognition, live transcription, FunASR streaming, paraformer streaming, live captions, realtime stt python">
<link rel="icon" href="/logo.png"><meta property="og:title" content="Real-Time Streaming Speech-to-Text with FunASR"><meta property="og:description" content="FunASR's streaming Paraformer enables ~600ms low-latency real-time speech-to-text: partial text as you speak, via cached chunk decoding. Ideal for live captions, voice assistants and meetings. Runnable code + 2-pass (streaming + offline) best practice included.">
<meta property="og:type" content="article"><meta property="og:url" content="https://www.funasr.com/en/blog/funasr-realtime-streaming-asr.html"><meta property="og:image" content="https://www.funasr.com/logo.png">
<link rel="canonical" href="https://www.funasr.com/en/blog/funasr-realtime-streaming-asr.html"><link rel="alternate" hreflang="en" href="https://www.funasr.com/en/blog/funasr-realtime-streaming-asr.html"><link rel="alternate" hreflang="zh" href="https://www.funasr.com/blog/funasr-realtime-streaming-asr.html"><link rel="alternate" hreflang="x-default" href="https://www.funasr.com/en/blog/funasr-realtime-streaming-asr.html">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"BlogPosting","headline":"Real-Time Streaming Speech-to-Text with FunASR","description":"FunASR's streaming Paraformer enables ~600ms low-latency real-time speech-to-text: partial text as you speak, via cached chunk decoding. Ideal for live captions, voice assistants and meetings. Runnable code + 2-pass (streaming + offline) best practice included.","datePublished":"2026-06-17","dateModified":"2026-06-17","author":{"@type":"Organization","name":"FunASR / Tongyi Lab"},"publisher":{"@type":"Organization","name":"FunASR","logo":{"@type":"ImageObject","url":"https://www.funasr.com/logo.png"}},"mainEntityOfPage":{"@type":"WebPage","@id":"https://www.funasr.com/en/blog/funasr-realtime-streaming-asr.html"},"image":"https://www.funasr.com/logo.png"}
</script>
<style>:root{--primary:#2563eb;--primary-dark:#1d4ed8;--bg:#fff;--surface:#f8fafc;--border:#e2e8f0;--text:#0f172a;--text-soft:#475569;--text-muted:#94a3b8;--radius:12px}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:'Inter',-apple-system,sans-serif;color:var(--text);line-height:1.7}
a{color:var(--primary);text-decoration:none}a:hover{text-decoration:underline}
.container{max-width:800px;margin:0 auto;padding:0 24px}
.nav{position:fixed;top:0;left:0;right:0;z-index:100;background:rgba(255,255,255,0.9);backdrop-filter:blur(12px);border-bottom:1px solid var(--border);padding:14px 0}
.nav .container{max-width:1120px;display:flex;align-items:center;gap:24px}
.nav-logo{font-size:1.2rem;font-weight:800;color:var(--text)}.nav-logo span{color:var(--primary)}
.nav-links{display:flex;gap:20px;margin-left:auto;flex-wrap:wrap}
.nav-links a{font-size:0.85rem;font-weight:500;color:var(--text-soft)}
.nav-btn{padding:7px 16px;background:var(--primary);color:#fff;border-radius:7px;font-size:0.83rem;font-weight:600}
article{padding:120px 0 80px}
h1{font-size:2rem;font-weight:800;line-height:1.3;margin-bottom:14px}
h2{font-size:1.3rem;font-weight:700;margin:36px 0 14px;padding-top:16px;border-top:1px solid var(--border)}
h3{font-size:1.05rem;font-weight:700;margin:22px 0 10px}
p{margin-bottom:14px;color:var(--text-soft)}
ul,ol{margin:0 0 14px 22px;color:var(--text-soft)}li{margin-bottom:6px}
table{width:100%;border-collapse:collapse;margin:16px 0;font-size:0.86rem}
th,td{padding:10px 12px;text-align:left;border-bottom:1px solid var(--border)}
th{font-weight:600;background:var(--surface);font-size:0.78rem;color:var(--text-muted)}
pre{background:#1e293b;color:#e2e8f0;padding:18px;border-radius:10px;overflow-x:auto;font-size:0.82rem;line-height:1.7;margin:14px 0}
code{font-family:ui-monospace,Menlo,monospace}
p code,li code{background:var(--surface);padding:2px 6px;border-radius:5px;font-size:0.85em;color:var(--primary-dark)}
.post-meta{color:var(--text-muted);font-size:0.85rem;margin-bottom:24px}
.cta{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:24px;margin:28px 0;text-align:center}
.cta a.btn{display:inline-block;padding:10px 24px;background:var(--primary);color:#fff;border-radius:8px;font-weight:600}
.post-list{list-style:none;margin:0;padding:0}
.post-list li{margin:0 0 8px}
.post-card{display:block;border:1px solid var(--border);border-radius:var(--radius);padding:20px 22px;margin-bottom:14px}
.post-card:hover{border-color:var(--primary);text-decoration:none}
.post-card h2{border:none;padding:0;margin:0 0 6px;font-size:1.15rem;color:var(--text)}
.post-card p{margin:0;color:var(--text-soft);font-size:0.9rem}
.post-card .date{color:var(--text-muted);font-size:0.8rem}
footer{background:#0f172a;color:#94a3b8;padding:28px 0;text-align:center;font-size:0.8rem}
footer a{color:#94a3b8}</style></head><body>
<nav class="nav"><div class="container"><a href="/" class="nav-logo">Fun<span>ASR</span></a><div class="nav-links"><a href="/en/#capabilities">Capabilities</a><a href="/en/#usage">How to Use</a><a href="/en/#benchmark">Benchmark</a><a href="/en/#demo">Demo</a><a href="https://modelscope.github.io/FunASR/" target="_blank">Docs</a><a href="/en/quickstart.html">Quickstart</a><a href="/en/models.html">Models</a><a href="/en/ecosystem.html">Ecosystem</a><a href="/en/blog/">Blog</a><a href="/en/vs-whisper.html">vs Whisper</a><a href="/en/donors.html">Donors</a></div><a href="https://www.funasr.com/blog/funasr-realtime-streaming-asr.html" style="font-size:0.83rem;font-weight:600;color:var(--text-soft)">中文</a><a href="https://github.com/modelscope/FunASR" target="_blank" class="nav-btn">GitHub ★</a></div></nav>
<article><div class="container">
<h1>Real-Time Streaming Speech-to-Text with FunASR</h1>
<p class="post-meta">FunASR Blog · 2026-06-17 · Tutorial</p>
<p>Live captions, voice assistants, meeting transcription — these don't want "record then transcribe", they want text <strong>as you speak</strong>: words scrolling on screen before the sentence even ends. That is <strong>streaming ASR</strong>.</p>
<p>FunASR's streaming Paraformer decodes with <strong>chunks + a cache</strong>, delivering real-time text at <strong>~600 ms latency</strong> — and it runs on CPU.</p>
<h2>Install</h2>
<pre><code>pip install -U funasr modelscope</code></pre>
<h2>Full, runnable code</h2>
<pre><code>from funasr import AutoModel
import soundfile as sf
chunk_size = [0, 10, 5] # 600 ms chunks (10 * 60 ms center)
encoder_chunk_look_back = 4 # encoder look-back chunks
decoder_chunk_look_back = 1 # decoder look-back chunks
model = AutoModel(model="paraformer-zh-streaming")
audio, sr = sf.read("speech.wav", dtype="float32") # 16 kHz mono
chunk_stride = chunk_size[1] * 960 # 600 ms @ 16 kHz
cache = {}
n_chunks = (len(audio) - 1) // chunk_stride + 1
for i in range(n_chunks):
chunk = audio[i * chunk_stride : (i + 1) * chunk_stride]
is_final = i == n_chunks - 1
res = model.generate(
input=chunk, cache=cache, is_final=is_final,
chunk_size=chunk_size,
encoder_chunk_look_back=encoder_chunk_look_back,
decoder_chunk_look_back=decoder_chunk_look_back,
)
if res[0]["text"]:
print(res[0]["text"], end="", flush=True) # emit partial text</code></pre>
<h2>The output grows incrementally (example)</h2>
<pre><code>Today # ~600 ms after speech starts
Today the
Today the weather
Today the weather is great # is_final=True</code></pre>
<p>For each 600 ms audio chunk, the model emits the newly recognized text, so the on-screen sentence <strong>grows token by token</strong> until <code>is_final=True</code>. In testing, a 12 s clip was split into 20 chunks, each returning an incremental result.</p>
<h2>Key parameters</h2>
<table><thead><tr><th>Parameter</th><th>Meaning</th></tr></thead><tbody>
<tr><td><code>chunk_size=[0,10,5]</code></td><td>[left, center, right] chunk sizes in 60 ms units. center 10 → 600 ms per chunk (the latency/accuracy sweet spot)</td></tr>
<tr><td><code>encoder_chunk_look_back=4</code></td><td>History chunks the encoder attends to (more = more context, slightly more latency)</td></tr>
<tr><td><code>decoder_chunk_look_back=1</code></td><td>History chunks for the decoder</td></tr>
<tr><td><code>cache={}</code></td><td>State carried across chunks — <strong>reuse the same dict across calls</strong></td></tr>
<tr><td><code>is_final</code></td><td>Set <code>True</code> on the last chunk to flush the final decoding</td></tr>
</tbody></table>
<h2>Best practice: 2-pass (streaming + offline)</h2>
<p>To keep latency low, the streaming model is slightly less accurate than offline. Production systems often use a <strong>2-pass</strong> design:</p>
<ul>
<li><strong>Pass 1 (streaming)</strong>: streaming Paraformer for instant on-screen feedback;</li>
<li><strong>Pass 2 (offline)</strong>: once a sentence ends (VAD endpointing), re-transcribe the full segment with <a href="/en/blog/sensevoice-deployment-guide.html">SenseVoice</a> / offline Paraformer for a more accurate final result that replaces the provisional text.</li>
</ul>
<p>FunASR's official WebSocket service (<code>funasr-runtime-sdk-online-cpu</code>) ships this 2-pass streaming protocol ready to deploy.</p>
<h2>Typical use cases</h2>
<ul>
<li><strong>Live captions</strong>: instant subtitles for streams, meetings, classrooms.</li>
<li><strong>Voice assistants</strong>: understand while listening, lowering end-to-end latency.</li>
<li><strong>Call-center QA</strong>: live transcription + real-time keyword alerts.</li>
</ul>
<div class="cta"><p>FunASR is Tongyi Lab's open-source, industrial-grade speech recognition toolkit — offline + streaming, fast and accurate on Chinese.</p><a class="btn" href="https://github.com/modelscope/FunASR" target="_blank">Star FunASR on GitHub ★</a></div>
<!--related-posts-->
<h2>Related posts</h2>
<ul class="post-list">
<li><a href="/en/blog/funasr-vs-whisper-benchmark.html">FunASR vs Whisper Benchmark</a></li>
<li><a href="/en/blog/sensevoice-deployment-guide.html">SenseVoice Deployment Guide</a></li>
<li><a href="/en/blog/fun-asr-nano-guide.html">Fun-ASR-Nano Guide</a></li>
<li><a href="/en/blog/funasr-speaker-diarization.html">Speaker Diarization: Who Spoke When</a></li>
<li><a href="/en/blog/sensevoice-emotion-language-detection.html">Emotion & Language Detection</a></li>
<li><a href="/en/blog/funasr-transcribe-long-audio.html">Transcribe Long Audio (Hours in One Call)</a></li>
<li><a href="/en/blog/funasr-cli-transcribe-command-line.html">Transcribe from the Command Line</a></li>
<li><a href="/en/blog/self-hosted-openai-whisper-api-alternative.html">Self-Hosted OpenAI Whisper API Alternative</a></li>
<li><a href="/en/blog/generate-subtitles-srt-vtt-from-audio-video.html">Auto-Generate Subtitles (SRT / VTT)</a></li>
<li><a href="/en/blog/speech-to-text-python-transcribe-audio.html">Speech to Text in Python</a></li>
<li><a href="/en/blog/funasr-llama-cpp-whisper-cpp-alternative.html">FunASR on llama.cpp (whisper.cpp Alternative)</a></li>
<li><a href="/en/blog/funasr-vs-faster-whisper-chinese.html">FunASR vs faster-whisper (Chinese/Cantonese)</a></li>
<li><a href="/en/blog/lightweight-speech-recognition-cpu.html">Lightweight Speech Recognition on CPU</a></li>
<li><a href="/en/blog/self-hosted-deepgram-assemblyai-alternative.html">Self-Hosted Deepgram/AssemblyAI Alternative</a></li>
<li><a href="/en/blog/which-funasr-model.html">Which FunASR Model?</a></li>
<li><a href="/en/blog/cantonese-speech-recognition.html">Cantonese Speech Recognition (SenseVoice)</a></li>
<li><a href="/en/blog/japanese-speech-recognition.html">Japanese Speech Recognition (SenseVoice)</a></li>
<li><a href="/en/blog/voice-activity-detection-python.html">Voice Activity Detection in Python</a></li>
<li><a href="/en/blog/self-hosted-google-aws-azure-speech-to-text.html">Self-Hosted Google/AWS/Azure STT Alternative</a></li>
<li><a href="/en/blog/chinese-speech-recognition.html">Chinese Speech Recognition in Python</a></li>
<li><a href="/en/blog/punctuation-restoration-python.html">Punctuation Restoration in Python</a></li>
<li><a href="/en/blog/speech-to-text-timestamps-python.html">Speech-to-Text with Timestamps in Python</a></li>
</ul>
</div></article>
<footer><div class="container">FunASR · Open-source speech recognition by Tongyi Lab · <a href="https://github.com/modelscope/FunASR">GitHub</a></div></footer>
</body></html>
@@ -0,0 +1,125 @@
<!DOCTYPE html>
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>Speaker Diarization with FunASR: Who Spoke When, in One Call | FunASR</title><meta name="description" content="FunASR returns transcription, speaker labels and per-sentence timestamps in a single generate() call — no pyannote+Whisper combo, no HuggingFace gated access. Tested: a 227s meeting auto-split into 77 sentences across 11 speakers."><meta name="keywords" content="speaker diarization, who spoke when, pyannote alternative, meeting transcription, speaker labels, FunASR, cam++, speech to text with speakers">
<link rel="icon" href="/logo.png"><meta property="og:title" content="Speaker Diarization with FunASR: Who Spoke When, in One Call"><meta property="og:description" content="FunASR returns transcription, speaker labels and per-sentence timestamps in a single generate() call — no pyannote+Whisper combo, no HuggingFace gated access. Tested: a 227s meeting auto-split into 77 sentences across 11 speakers.">
<meta property="og:type" content="article"><meta property="og:url" content="https://www.funasr.com/en/blog/funasr-speaker-diarization.html"><meta property="og:image" content="https://www.funasr.com/logo.png">
<link rel="canonical" href="https://www.funasr.com/en/blog/funasr-speaker-diarization.html"><link rel="alternate" hreflang="en" href="https://www.funasr.com/en/blog/funasr-speaker-diarization.html"><link rel="alternate" hreflang="zh" href="https://www.funasr.com/blog/funasr-speaker-diarization.html"><link rel="alternate" hreflang="x-default" href="https://www.funasr.com/en/blog/funasr-speaker-diarization.html">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"BlogPosting","headline":"Speaker Diarization with FunASR: Who Spoke When, in One Call","description":"FunASR returns transcription, speaker labels and per-sentence timestamps in a single generate() call — no pyannote+Whisper combo, no HuggingFace gated access. Tested: a 227s meeting auto-split into 77 sentences across 11 speakers.","datePublished":"2026-06-17","dateModified":"2026-06-17","author":{"@type":"Organization","name":"FunASR / Tongyi Lab"},"publisher":{"@type":"Organization","name":"FunASR","logo":{"@type":"ImageObject","url":"https://www.funasr.com/logo.png"}},"mainEntityOfPage":{"@type":"WebPage","@id":"https://www.funasr.com/en/blog/funasr-speaker-diarization.html"},"image":"https://www.funasr.com/logo.png"}
</script>
<style>:root{--primary:#2563eb;--primary-dark:#1d4ed8;--bg:#fff;--surface:#f8fafc;--border:#e2e8f0;--text:#0f172a;--text-soft:#475569;--text-muted:#94a3b8;--radius:12px}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:'Inter',-apple-system,sans-serif;color:var(--text);line-height:1.7}
a{color:var(--primary);text-decoration:none}a:hover{text-decoration:underline}
.container{max-width:800px;margin:0 auto;padding:0 24px}
.nav{position:fixed;top:0;left:0;right:0;z-index:100;background:rgba(255,255,255,0.9);backdrop-filter:blur(12px);border-bottom:1px solid var(--border);padding:14px 0}
.nav .container{max-width:1120px;display:flex;align-items:center;gap:24px}
.nav-logo{font-size:1.2rem;font-weight:800;color:var(--text)}.nav-logo span{color:var(--primary)}
.nav-links{display:flex;gap:20px;margin-left:auto;flex-wrap:wrap}
.nav-links a{font-size:0.85rem;font-weight:500;color:var(--text-soft)}
.nav-btn{padding:7px 16px;background:var(--primary);color:#fff;border-radius:7px;font-size:0.83rem;font-weight:600}
article{padding:120px 0 80px}
h1{font-size:2rem;font-weight:800;line-height:1.3;margin-bottom:14px}
h2{font-size:1.3rem;font-weight:700;margin:36px 0 14px;padding-top:16px;border-top:1px solid var(--border)}
h3{font-size:1.05rem;font-weight:700;margin:22px 0 10px}
p{margin-bottom:14px;color:var(--text-soft)}
ul,ol{margin:0 0 14px 22px;color:var(--text-soft)}li{margin-bottom:6px}
table{width:100%;border-collapse:collapse;margin:16px 0;font-size:0.86rem}
th,td{padding:10px 12px;text-align:left;border-bottom:1px solid var(--border)}
th{font-weight:600;background:var(--surface);font-size:0.78rem;color:var(--text-muted)}
pre{background:#1e293b;color:#e2e8f0;padding:18px;border-radius:10px;overflow-x:auto;font-size:0.82rem;line-height:1.7;margin:14px 0}
code{font-family:ui-monospace,Menlo,monospace}
p code,li code{background:var(--surface);padding:2px 6px;border-radius:5px;font-size:0.85em;color:var(--primary-dark)}
.post-meta{color:var(--text-muted);font-size:0.85rem;margin-bottom:24px}
.cta{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:24px;margin:28px 0;text-align:center}
.cta a.btn{display:inline-block;padding:10px 24px;background:var(--primary);color:#fff;border-radius:8px;font-weight:600}
.post-list{list-style:none;margin:0;padding:0}
.post-list li{margin:0 0 8px}
.post-card{display:block;border:1px solid var(--border);border-radius:var(--radius);padding:20px 22px;margin-bottom:14px}
.post-card:hover{border-color:var(--primary);text-decoration:none}
.post-card h2{border:none;padding:0;margin:0 0 6px;font-size:1.15rem;color:var(--text)}
.post-card p{margin:0;color:var(--text-soft);font-size:0.9rem}
.post-card .date{color:var(--text-muted);font-size:0.8rem}
footer{background:#0f172a;color:#94a3b8;padding:28px 0;text-align:center;font-size:0.8rem}
footer a{color:#94a3b8}</style></head><body>
<nav class="nav"><div class="container"><a href="/" class="nav-logo">Fun<span>ASR</span></a><div class="nav-links"><a href="/en/#capabilities">Capabilities</a><a href="/en/#usage">How to Use</a><a href="/en/#benchmark">Benchmark</a><a href="/en/#demo">Demo</a><a href="https://modelscope.github.io/FunASR/" target="_blank">Docs</a><a href="/en/quickstart.html">Quickstart</a><a href="/en/models.html">Models</a><a href="/en/ecosystem.html">Ecosystem</a><a href="/en/blog/">Blog</a><a href="/en/vs-whisper.html">vs Whisper</a><a href="/en/donors.html">Donors</a></div><a href="https://www.funasr.com/blog/funasr-speaker-diarization.html" style="font-size:0.83rem;font-weight:600;color:var(--text-soft)">中文</a><a href="https://github.com/modelscope/FunASR" target="_blank" class="nav-btn">GitHub ★</a></div></nav>
<article><div class="container">
<h1>Speaker Diarization with FunASR: Who Spoke When, in One Call</h1>
<p class="post-meta">FunASR Blog · 2026-06-17 · Tutorial</p>
<p>For meeting minutes, call-center QA or interview transcripts, you don't just want to know <strong>what</strong> was said — you want to know <strong>who said each line</strong>. That task is called <strong>speaker diarization</strong>.</p>
<p>The usual approach glues two tools together: <strong>pyannote.audio</strong> for speaker segmentation + <strong>Whisper</strong> for transcription, then you align the timelines yourself. That means requesting HuggingFace gated access, installing a stack of dependencies, and writing your own alignment logic — and it isn't especially strong on Chinese.</p>
<p><strong>With FunASR, a single <code>generate()</code> call is enough.</strong> VAD, ASR, punctuation and speaker embedding (CAM++) are chained into one pipeline that returns the <strong>speaker id, timestamps and text for every sentence</strong>.</p>
<h2>Install</h2>
<pre><code>pip install -U funasr modelscope</code></pre>
<h2>Full code</h2>
<pre><code>from funasr import AutoModel
# One model handle = VAD + ASR + punctuation + speaker embedding (CAM++)
model = AutoModel(
model="paraformer-zh", # or "iic/SenseVoiceSmall"
vad_model="fsmn-vad",
punc_model="ct-punc",
spk_model="cam++", # speaker diarization
)
res = model.generate(input="meeting.wav", batch_size_s=300)
for s in res[0]["sentence_info"]:
print(f'[{s["start"]/1000:.1f}s-{s["end"]/1000:.1f}s] '
f'speaker {s["spk"]}: {s["sentence"]}')</code></pre>
<h2>What the output looks like (example)</h2>
<pre><code>[0.0s-3.2s] speaker 0: Hi everyone, today's meeting is about the Q3 product plan.
[3.5s-7.1s] speaker 1: Quick status update — the core features are about 80% done.
[7.4s-9.9s] speaker 2: QA may need two more weeks on our side.
[10.2s-13.6s] speaker 0: Got it, let's push the launch back by one week.</code></pre>
<p>Each <code>sentence_info</code> item has four fields:</p>
<table><thead><tr><th>Field</th><th>Meaning</th></tr></thead><tbody>
<tr><td><code>spk</code></td><td>Speaker id, auto-clustered by CAM++ — <strong>no need to specify the number of speakers</strong></td></tr>
<tr><td><code>start</code> / <code>end</code></td><td>Sentence start/end time (milliseconds)</td></tr>
<tr><td><code>sentence</code></td><td>Sentence text (punctuated)</td></tr>
</tbody></table>
<h2>Tested on a real recording</h2>
<p>On a <strong>227-second multi-speaker meeting recording</strong>, FunASR automatically split the audio into <strong>77 sentences</strong> and distinguished <strong>11 different speakers</strong> — <strong>without being told the speaker count in advance</strong>. The whole pipeline is one <code>generate()</code> call and a single Python dependency.</p>
<h2>Why FunASR instead of pyannote + Whisper</h2>
<ul>
<li><strong>One call, no alignment</strong>: transcription and speaker labels are aligned by construction.</li>
<li><strong>No HuggingFace gated access</strong>: pyannote's speaker models are gated; FunASR models are openly downloadable.</li>
<li><strong>Stronger on Chinese</strong>: Paraformer / SenseVoice have far lower CER than Whisper on Chinese (<a href="/en/blog/funasr-vs-whisper-benchmark.html">benchmark</a>).</li>
<li><strong>Runs on CPU</strong>: get results offline without a GPU.</li>
</ul>
<h2>Going further</h2>
<ul>
<li>Swap <code>model="paraformer-zh"</code> for <code>"iic/SenseVoiceSmall"</code> to use SenseVoice (with emotion/event tags).</li>
<li>Iterate over <code>sentence_info</code> to export <strong>SRT subtitles</strong> or aggregate per speaker into <strong>meeting minutes</strong>.</li>
</ul>
<div class="cta"><p>FunASR is Tongyi Lab's open-source, industrial-grade speech recognition toolkit — fast and accurate, especially on Chinese.</p><a class="btn" href="https://github.com/modelscope/FunASR" target="_blank">Star FunASR on GitHub ★</a></div>
<!--related-posts-->
<h2>Related posts</h2>
<ul class="post-list">
<li><a href="/en/blog/funasr-vs-whisper-benchmark.html">FunASR vs Whisper Benchmark</a></li>
<li><a href="/en/blog/sensevoice-deployment-guide.html">SenseVoice Deployment Guide</a></li>
<li><a href="/en/blog/fun-asr-nano-guide.html">Fun-ASR-Nano Guide</a></li>
<li><a href="/en/blog/sensevoice-emotion-language-detection.html">Emotion & Language Detection</a></li>
<li><a href="/en/blog/funasr-realtime-streaming-asr.html">Real-Time Streaming Speech-to-Text</a></li>
<li><a href="/en/blog/funasr-transcribe-long-audio.html">Transcribe Long Audio (Hours in One Call)</a></li>
<li><a href="/en/blog/funasr-cli-transcribe-command-line.html">Transcribe from the Command Line</a></li>
<li><a href="/en/blog/self-hosted-openai-whisper-api-alternative.html">Self-Hosted OpenAI Whisper API Alternative</a></li>
<li><a href="/en/blog/generate-subtitles-srt-vtt-from-audio-video.html">Auto-Generate Subtitles (SRT / VTT)</a></li>
<li><a href="/en/blog/speech-to-text-python-transcribe-audio.html">Speech to Text in Python</a></li>
<li><a href="/en/blog/funasr-llama-cpp-whisper-cpp-alternative.html">FunASR on llama.cpp (whisper.cpp Alternative)</a></li>
<li><a href="/en/blog/funasr-vs-faster-whisper-chinese.html">FunASR vs faster-whisper (Chinese/Cantonese)</a></li>
<li><a href="/en/blog/lightweight-speech-recognition-cpu.html">Lightweight Speech Recognition on CPU</a></li>
<li><a href="/en/blog/self-hosted-deepgram-assemblyai-alternative.html">Self-Hosted Deepgram/AssemblyAI Alternative</a></li>
<li><a href="/en/blog/which-funasr-model.html">Which FunASR Model?</a></li>
<li><a href="/en/blog/cantonese-speech-recognition.html">Cantonese Speech Recognition (SenseVoice)</a></li>
<li><a href="/en/blog/japanese-speech-recognition.html">Japanese Speech Recognition (SenseVoice)</a></li>
<li><a href="/en/blog/voice-activity-detection-python.html">Voice Activity Detection in Python</a></li>
<li><a href="/en/blog/self-hosted-google-aws-azure-speech-to-text.html">Self-Hosted Google/AWS/Azure STT Alternative</a></li>
<li><a href="/en/blog/chinese-speech-recognition.html">Chinese Speech Recognition in Python</a></li>
<li><a href="/en/blog/punctuation-restoration-python.html">Punctuation Restoration in Python</a></li>
<li><a href="/en/blog/speech-to-text-timestamps-python.html">Speech-to-Text with Timestamps in Python</a></li>
</ul>
</div></article>
<footer><div class="container">FunASR · Open-source speech recognition by Tongyi Lab · <a href="https://github.com/modelscope/FunASR">GitHub</a></div></footer>
</body></html>
@@ -0,0 +1,121 @@
<!DOCTYPE html>
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>Transcribe Long Audio with FunASR: Hours in a Single Call | FunASR</title><meta name="description" content="Whisper processes only 30s at a time, so a 1-hour file means manual chunking and stitching. FunASR has built-in VAD: a single generate() call ingests audio of any length - tested 13.2 min transcribed in 4.3s (186x realtime). Runnable code + long-audio best practices."><meta name="keywords" content="transcribe long audio, long audio transcription, whisper 30 second limit, transcribe 1 hour audio, podcast transcription, meeting transcription, FunASR, audio to text python">
<link rel="icon" href="/logo.png"><meta property="og:title" content="Transcribe Long Audio with FunASR: Hours in a Single Call"><meta property="og:description" content="Whisper processes only 30s at a time, so a 1-hour file means manual chunking and stitching. FunASR has built-in VAD: a single generate() call ingests audio of any length - tested 13.2 min transcribed in 4.3s (186x realtime). Runnable code + long-audio best practices.">
<meta property="og:type" content="article"><meta property="og:url" content="https://www.funasr.com/en/blog/funasr-transcribe-long-audio.html"><meta property="og:image" content="https://www.funasr.com/logo.png">
<link rel="canonical" href="https://www.funasr.com/en/blog/funasr-transcribe-long-audio.html"><link rel="alternate" hreflang="en" href="https://www.funasr.com/en/blog/funasr-transcribe-long-audio.html"><link rel="alternate" hreflang="zh" href="https://www.funasr.com/blog/funasr-transcribe-long-audio.html"><link rel="alternate" hreflang="x-default" href="https://www.funasr.com/en/blog/funasr-transcribe-long-audio.html">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"BlogPosting","headline":"Transcribe Long Audio with FunASR: Hours in a Single Call","description":"Whisper processes only 30s at a time, so a 1-hour file means manual chunking and stitching. FunASR has built-in VAD: a single generate() call ingests audio of any length - tested 13.2 min transcribed in 4.3s (186x realtime). Runnable code + long-audio best practices.","datePublished":"2026-06-17","dateModified":"2026-06-17","author":{"@type":"Organization","name":"FunASR / Tongyi Lab"},"publisher":{"@type":"Organization","name":"FunASR","logo":{"@type":"ImageObject","url":"https://www.funasr.com/logo.png"}},"mainEntityOfPage":{"@type":"WebPage","@id":"https://www.funasr.com/en/blog/funasr-transcribe-long-audio.html"},"image":"https://www.funasr.com/logo.png"}
</script>
<style>:root{--primary:#2563eb;--primary-dark:#1d4ed8;--bg:#fff;--surface:#f8fafc;--border:#e2e8f0;--text:#0f172a;--text-soft:#475569;--text-muted:#94a3b8;--radius:12px}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:'Inter',-apple-system,sans-serif;color:var(--text);line-height:1.7}
a{color:var(--primary);text-decoration:none}a:hover{text-decoration:underline}
.container{max-width:800px;margin:0 auto;padding:0 24px}
.nav{position:fixed;top:0;left:0;right:0;z-index:100;background:rgba(255,255,255,0.9);backdrop-filter:blur(12px);border-bottom:1px solid var(--border);padding:14px 0}
.nav .container{max-width:1120px;display:flex;align-items:center;gap:24px}
.nav-logo{font-size:1.2rem;font-weight:800;color:var(--text)}.nav-logo span{color:var(--primary)}
.nav-links{display:flex;gap:20px;margin-left:auto;flex-wrap:wrap}
.nav-links a{font-size:0.85rem;font-weight:500;color:var(--text-soft)}
.nav-btn{padding:7px 16px;background:var(--primary);color:#fff;border-radius:7px;font-size:0.83rem;font-weight:600}
article{padding:120px 0 80px}
h1{font-size:2rem;font-weight:800;line-height:1.3;margin-bottom:14px}
h2{font-size:1.3rem;font-weight:700;margin:36px 0 14px;padding-top:16px;border-top:1px solid var(--border)}
h3{font-size:1.05rem;font-weight:700;margin:22px 0 10px}
p{margin-bottom:14px;color:var(--text-soft)}
ul,ol{margin:0 0 14px 22px;color:var(--text-soft)}li{margin-bottom:6px}
table{width:100%;border-collapse:collapse;margin:16px 0;font-size:0.86rem}
th,td{padding:10px 12px;text-align:left;border-bottom:1px solid var(--border)}
th{font-weight:600;background:var(--surface);font-size:0.78rem;color:var(--text-muted)}
pre{background:#1e293b;color:#e2e8f0;padding:18px;border-radius:10px;overflow-x:auto;font-size:0.82rem;line-height:1.7;margin:14px 0}
code{font-family:ui-monospace,Menlo,monospace}
p code,li code{background:var(--surface);padding:2px 6px;border-radius:5px;font-size:0.85em;color:var(--primary-dark)}
.post-meta{color:var(--text-muted);font-size:0.85rem;margin-bottom:24px}
.cta{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:24px;margin:28px 0;text-align:center}
.cta a.btn{display:inline-block;padding:10px 24px;background:var(--primary);color:#fff;border-radius:8px;font-weight:600}
.post-list{list-style:none;margin:0;padding:0}
.post-list li{margin:0 0 8px}
.post-card{display:block;border:1px solid var(--border);border-radius:var(--radius);padding:20px 22px;margin-bottom:14px}
.post-card:hover{border-color:var(--primary);text-decoration:none}
.post-card h2{border:none;padding:0;margin:0 0 6px;font-size:1.15rem;color:var(--text)}
.post-card p{margin:0;color:var(--text-soft);font-size:0.9rem}
.post-card .date{color:var(--text-muted);font-size:0.8rem}
footer{background:#0f172a;color:#94a3b8;padding:28px 0;text-align:center;font-size:0.8rem}
footer a{color:#94a3b8}</style></head><body>
<nav class="nav"><div class="container"><a href="/" class="nav-logo">Fun<span>ASR</span></a><div class="nav-links"><a href="/en/#capabilities">Capabilities</a><a href="/en/#usage">How to Use</a><a href="/en/#benchmark">Benchmark</a><a href="/en/#demo">Demo</a><a href="https://modelscope.github.io/FunASR/" target="_blank">Docs</a><a href="/en/quickstart.html">Quickstart</a><a href="/en/models.html">Models</a><a href="/en/ecosystem.html">Ecosystem</a><a href="/en/blog/">Blog</a><a href="/en/vs-whisper.html">vs Whisper</a><a href="/en/donors.html">Donors</a></div><a href="https://www.funasr.com/blog/funasr-transcribe-long-audio.html" style="font-size:0.83rem;font-weight:600;color:var(--text-soft)">中文</a><a href="https://github.com/modelscope/FunASR" target="_blank" class="nav-btn">GitHub ★</a></div></nav>
<article><div class="container">
<h1>Transcribe Long Audio with FunASR: Hours in a Single Call</h1>
<p class="post-meta">FunASR Blog · 2026-06-17 · Tutorial</p>
<p>Transcribing a 1-hour podcast, lecture or meeting with Whisper is painful: it processes only <strong>30 seconds</strong> at a time, so you have to chunk the audio, transcribe each piece, and stitch the results back together - while handling words cut off at chunk boundaries.</p>
<p><strong>FunASR makes this trivial.</strong> With built-in VAD (voice activity detection), a single <code>generate()</code> call ingests audio of <strong>any length</strong> - it segments, batch-decodes and reassembles the full text for you, with zero chunking code.</p>
<h2>Install</h2>
<pre><code>pip install -U funasr modelscope</code></pre>
<h2>Full, runnable code</h2>
<pre><code>from funasr import AutoModel
model = AutoModel(
model="iic/SenseVoiceSmall", # or "paraformer-zh"
vad_model="fsmn-vad", # built-in voice activity detection
vad_kwargs={"max_single_segment_time": 30000},
)
# One call on a full 1-hour file - VAD segments and batches it internally.
res = model.generate(
input="podcast_1hour.wav",
batch_size_s=300, # dynamic batching of VAD segments (throughput)
)
print(res[0]["text"])</code></pre>
<h2>Tested: 13 minutes transcribed in 4.3s</h2>
<pre><code>long clip: 791s = 13.2 min
transcribed 791s in 4.3s -> RTFx=186
output chars: 2104 # full transcript, head to tail</code></pre>
<p>We fed a <strong>13.2-minute (791s)</strong> recording into a single <code>generate()</code> call - done in <strong>4.3s (186x realtime)</strong>, with output covering the full file head to tail. A 1-hour file works exactly the same way, no code changes.</p>
<h2>Why it handles any length</h2>
<ul>
<li><strong>VAD auto-segmentation</strong>: <code>fsmn-vad</code> splits the long audio into speech segments at pauses; <code>max_single_segment_time</code> caps the longest segment.</li>
<li><strong>Dynamic batching</strong>: <code>batch_size_s=300</code> packs segments by total duration for high-throughput decoding.</li>
<li><strong>Bounded memory</strong>: because it processes segments, GPU memory is <strong>independent of total file length</strong> - 1 hour uses about as much as 1 minute.</li>
</ul>
<h2>Going further</h2>
<ul>
<li>Add <code>punc_model="ct-punc"</code> for automatic punctuation;</li>
<li>Add <code>spk_model="cam++"</code> for <a href="/en/blog/funasr-speaker-diarization.html">speaker diarization</a> (who spoke when);</li>
<li>Use <code>SenseVoiceSmall</code> for <a href="/en/blog/sensevoice-emotion-language-detection.html">language & emotion</a>; for max speed see the <a href="/en/blog/funasr-vs-whisper-benchmark.html">benchmark</a>.</li>
</ul>
<h2>Typical use cases</h2>
<ul>
<li><strong>Podcasts / audiobooks</strong>: transcribe a whole episode at once.</li>
<li><strong>Meetings / lectures</strong>: batch long recordings to text + archive/search.</li>
<li><strong>Call recordings</strong>: full-call transcription for QA and mining.</li>
</ul>
<div class="cta"><p>FunASR is Tongyi Lab's open-source, industrial-grade speech recognition toolkit - long audio, streaming and multilingual all covered.</p><a class="btn" href="https://github.com/modelscope/FunASR" target="_blank">Star FunASR on GitHub ★</a></div>
<!--related-posts-->
<h2>Related posts</h2>
<ul class="post-list">
<li><a href="/en/blog/funasr-vs-whisper-benchmark.html">FunASR vs Whisper Benchmark</a></li>
<li><a href="/en/blog/sensevoice-deployment-guide.html">SenseVoice Deployment Guide</a></li>
<li><a href="/en/blog/fun-asr-nano-guide.html">Fun-ASR-Nano Guide</a></li>
<li><a href="/en/blog/funasr-speaker-diarization.html">Speaker Diarization: Who Spoke When</a></li>
<li><a href="/en/blog/sensevoice-emotion-language-detection.html">Emotion & Language Detection</a></li>
<li><a href="/en/blog/funasr-realtime-streaming-asr.html">Real-Time Streaming Speech-to-Text</a></li>
<li><a href="/en/blog/funasr-cli-transcribe-command-line.html">Transcribe from the Command Line</a></li>
<li><a href="/en/blog/self-hosted-openai-whisper-api-alternative.html">Self-Hosted OpenAI Whisper API Alternative</a></li>
<li><a href="/en/blog/generate-subtitles-srt-vtt-from-audio-video.html">Auto-Generate Subtitles (SRT / VTT)</a></li>
<li><a href="/en/blog/speech-to-text-python-transcribe-audio.html">Speech to Text in Python</a></li>
<li><a href="/en/blog/funasr-llama-cpp-whisper-cpp-alternative.html">FunASR on llama.cpp (whisper.cpp Alternative)</a></li>
<li><a href="/en/blog/funasr-vs-faster-whisper-chinese.html">FunASR vs faster-whisper (Chinese/Cantonese)</a></li>
<li><a href="/en/blog/lightweight-speech-recognition-cpu.html">Lightweight Speech Recognition on CPU</a></li>
<li><a href="/en/blog/self-hosted-deepgram-assemblyai-alternative.html">Self-Hosted Deepgram/AssemblyAI Alternative</a></li>
<li><a href="/en/blog/which-funasr-model.html">Which FunASR Model?</a></li>
<li><a href="/en/blog/cantonese-speech-recognition.html">Cantonese Speech Recognition (SenseVoice)</a></li>
<li><a href="/en/blog/japanese-speech-recognition.html">Japanese Speech Recognition (SenseVoice)</a></li>
<li><a href="/en/blog/voice-activity-detection-python.html">Voice Activity Detection in Python</a></li>
<li><a href="/en/blog/self-hosted-google-aws-azure-speech-to-text.html">Self-Hosted Google/AWS/Azure STT Alternative</a></li>
<li><a href="/en/blog/chinese-speech-recognition.html">Chinese Speech Recognition in Python</a></li>
<li><a href="/en/blog/punctuation-restoration-python.html">Punctuation Restoration in Python</a></li>
<li><a href="/en/blog/speech-to-text-timestamps-python.html">Speech-to-Text with Timestamps in Python</a></li>
</ul>
</div></article>
<footer><div class="container">FunASR · Open-source speech recognition by Tongyi Lab · <a href="https://github.com/modelscope/FunASR">GitHub</a></div></footer>
</body></html>
@@ -0,0 +1,121 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>FunASR v1.3.26:OpenAI-Compatible API, vLLM, and llama.cpp | FunASR</title>
<meta name="description" content="Deploy FunASR v1.3.26 through the OpenAI-compatible /v1/audio/transcriptions API, high-throughput vLLM inference, or self-contained llama.cpp/GGUF runtimes.">
<meta name="keywords" content="FunASR v1.3.26,OpenAI compatible ASR,vLLM speech recognition,llama.cpp ASR,GGUF,self-hosted speech to text">
<link rel="icon" href="/logo.png">
<meta property="og:title" content="FunASR v1.3.26:OpenAI-Compatible API, vLLM, and llama.cpp">
<meta property="og:description" content="Three runnable paths for OpenAI-compatible serving, GPU throughput, and Python-free edge deployment.">
<meta property="og:type" content="article">
<meta property="og:url" content="https://www.funasr.com/en/blog/funasr-v1-3-26-openai-vllm-llama-cpp.html">
<meta property="og:image" content="https://www.funasr.com/img/banner.4f436d19.png">
<link rel="canonical" href="https://www.funasr.com/en/blog/funasr-v1-3-26-openai-vllm-llama-cpp.html">
<link rel="alternate" hreflang="en" href="https://www.funasr.com/en/blog/funasr-v1-3-26-openai-vllm-llama-cpp.html">
<link rel="alternate" hreflang="zh" href="https://www.funasr.com/blog/funasr-v1-3-26-openai-vllm-llama-cpp.html">
<link rel="alternate" hreflang="x-default" href="https://www.funasr.com/en/blog/funasr-v1-3-26-openai-vllm-llama-cpp.html">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&amp;display=swap" rel="stylesheet">
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"BlogPosting","headline":"FunASR v1.3.26:OpenAI-Compatible API, vLLM, and llama.cpp","description":"Three runnable paths for OpenAI-compatible serving, GPU throughput, and Python-free edge deployment.","datePublished":"2026-07-23","dateModified":"2026-07-23","author":{"@type":"Organization","name":"FunASR / Tongyi Lab"},"publisher":{"@type":"Organization","name":"FunASR","logo":{"@type":"ImageObject","url":"https://www.funasr.com/logo.png"}},"mainEntityOfPage":{"@type":"WebPage","@id":"https://www.funasr.com/en/blog/funasr-v1-3-26-openai-vllm-llama-cpp.html"},"image":"https://www.funasr.com/img/banner.4f436d19.png"}
</script>
<style>
:root{--primary:#2563eb;--primary-dark:#1d4ed8;--accent:#047857;--bg:#fff;--surface:#f8fafc;--border:#e2e8f0;--text:#0f172a;--text-soft:#475569;--text-muted:#94a3b8}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:'Inter',-apple-system,sans-serif;color:var(--text);line-height:1.7;background:var(--bg)}
a{color:var(--primary);text-decoration:none}a:hover{text-decoration:underline}
.container{max-width:800px;margin:0 auto;padding:0 24px}
.nav{position:fixed;top:0;left:0;right:0;z-index:100;background:rgba(255,255,255,0.94);backdrop-filter:blur(12px);border-bottom:1px solid var(--border);padding:14px 0}
.nav .container{max-width:1120px;display:flex;align-items:center;gap:24px}
.nav-logo{font-size:1.2rem;font-weight:800;color:var(--text)}.nav-logo span{color:var(--primary)}
.nav-links{display:flex;gap:20px;margin-left:auto;flex-wrap:wrap}.nav-links a{font-size:.85rem;font-weight:500;color:var(--text-soft)}
.nav-btn{padding:7px 16px;background:var(--primary);color:#fff;border-radius:7px;font-size:.83rem;font-weight:600}
article{padding:116px 0 80px}
h1{font-size:2rem;font-weight:800;line-height:1.3;margin-bottom:14px}
h2{font-size:1.3rem;font-weight:700;margin:38px 0 14px;padding-top:18px;border-top:1px solid var(--border)}
h3{font-size:1.05rem;font-weight:700;margin:24px 0 10px}
p{margin-bottom:14px;color:var(--text-soft)}
ul{margin:0 0 16px 22px;color:var(--text-soft)}li{margin-bottom:7px}
table{width:100%;border-collapse:collapse;margin:18px 0;font-size:.88rem}
th,td{padding:11px 12px;text-align:left;vertical-align:top;border-bottom:1px solid var(--border)}th{font-weight:600;background:var(--surface);color:var(--text)}
pre{background:#172033;color:#e2e8f0;padding:18px;border-radius:8px;overflow-x:auto;font-size:.82rem;line-height:1.7;margin:14px 0}
code{font-family:ui-monospace,Menlo,monospace}p code,li code,td code{background:var(--surface);padding:2px 6px;border-radius:5px;font-size:.85em;color:var(--primary-dark)}
.post-meta{color:var(--text-muted);font-size:.85rem;margin-bottom:22px}
.lead{font-size:1.05rem;color:var(--text);margin:22px 0}
.hero-media{display:block;width:100%;aspect-ratio:2.04/1;object-fit:cover;border-radius:8px;border:1px solid var(--border);margin:0 0 24px}
.proof{border-left:4px solid var(--accent);background:#f0fdf4;padding:14px 16px;margin:18px 0;color:#14532d}
.cta{background:var(--surface);border:1px solid var(--border);border-radius:8px;padding:24px;margin:30px 0;text-align:center}.cta p{margin-bottom:16px}.cta a.btn{display:inline-block;padding:10px 22px;background:var(--primary);color:#fff;border-radius:7px;font-weight:600}
footer{background:#0f172a;color:#94a3b8;padding:28px 0;text-align:center;font-size:.8rem}footer a{color:#94a3b8}
@media(max-width:900px){.nav-links{display:none}.nav .container{gap:16px}.nav-logo{margin-right:auto}h1{font-size:1.65rem}table{font-size:.8rem}th,td{padding:9px 8px}}
</style>
</head>
<body>
<nav class="nav"><div class="container"><a href="/en/" class="nav-logo">Fun<span>ASR</span></a><div class="nav-links"><a href="/en/#capabilities">Capabilities</a><a href="/en/#usage">How to Use</a><a href="/en/#benchmark">Benchmark</a><a href="/en/#demo">Demo</a><a href="https://modelscope.github.io/FunASR/" target="_blank">Docs</a><a href="/en/quickstart.html">Quickstart</a><a href="/en/models.html">Models</a><a href="/en/ecosystem.html">Ecosystem</a><a href="/en/blog/">Blog</a><a href="/en/vs-whisper.html">vs Whisper</a><a href="/en/donors.html">Thanks</a></div><a href="/blog/funasr-v1-3-26-openai-vllm-llama-cpp.html" style="font-size:.83rem;font-weight:500;color:var(--text-soft)">中文</a><a href="https://github.com/modelscope/FunASR" target="_blank" rel="noopener" class="nav-btn">GitHub ★</a></div></nav>
<article><div class="container">
<h1>FunASR v1.3.26:OpenAI-Compatible API, vLLM, and llama.cpp</h1>
<p class="post-meta">July 23, 2026 · FunASR release guide</p>
<img class="hero-media" src="/img/banner.4f436d19.png" alt="FunASR industrial speech recognition visual">
<p class="lead">FunASR v1.3.26 organizes the same open-source speech stack into three clear entry points:Python and an OpenAI-compatible API, vLLM for high-throughput GPU inference, and Python-free llama.cpp / GGUF runtimes.</p>
<p>This is more than a wheel-only release. The Python package, serving examples, GPU inference guide, and eight platform runtime assets target different deployment needs while remaining part of one FunASR ecosystem.</p>
<h2>Choose the path that matches your workload</h2>
<table>
<thead><tr><th>Goal</th><th>Recommended path</th><th>Start here</th></tr></thead>
<tbody>
<tr><td>Connect an OpenAI SDK, agent, or workflow</td><td><code>/v1/audio/transcriptions</code></td><td><a href="https://github.com/modelscope/FunASR/tree/main/examples/openai_api" target="_blank" rel="noopener">OpenAI-compatible API example</a></td></tr>
<tr><td>Batch transcription and high-throughput GPU serving</td><td>Fun-ASR-Nano + vLLM</td><td><a href="https://github.com/modelscope/FunASR/blob/main/docs/vllm_guide.md" target="_blank" rel="noopener">vLLM guide</a></td></tr>
<tr><td>CPU, edge, or zero-Python deployment</td><td>llama.cpp / GGUF</td><td><a href="https://github.com/modelscope/FunASR/releases/tag/runtime-llamacpp-v0.1.9" target="_blank" rel="noopener">v0.1.9 runtime assets</a></td></tr>
</tbody>
</table>
<h2>1. Start the OpenAI-compatible transcription service</h2>
<p>This path uses the same server implementation as the repository smoke tests. Pin the current PyPI release, then start the service:</p>
<pre><code>git clone https://github.com/modelscope/FunASR.git
cd FunASR/examples/openai_api
python -m pip install "funasr==1.3.26" fastapi uvicorn python-multipart
python server.py --model sensevoice --device cuda --port 8000</code></pre>
<p>In another terminal, verify health and transcription with the public sample:</p>
<pre><code>curl -L https://isv-data.oss-cn-hangzhou.aliyuncs.com/ics/MaaS/ASR/test_audio/BAC009S0764W0121.wav -o sample.wav
curl http://localhost:8000/health
curl http://localhost:8000/v1/audio/transcriptions \
-F [email protected] \
-F model=sensevoice \
-F response_format=verbose_json</code></pre>
<p>If you already use the OpenAI Python client, point <code>base_url</code> to <code>http://localhost:8000/v1</code>. The examples also include model listing, Swagger, Postman, OpenAPI, Gradio, and Kubernetes paths.</p>
<h2>2. Scale Fun-ASR-Nano throughput with vLLM</h2>
<p>Fun-ASR-Nano runs its audio encoder and adaptor in PyTorch, then sends continuous audio embeddings into the Qwen3 decoder managed by vLLM. The repository benchmark records <strong>RTFx 340</strong> for vLLM batch inference while keeping CER close to the PyTorch baseline.</p>
<div class="proof">The maintainer environment also completed a real-checkpoint smoke on one H100:vLLM 0.19.1 loaded successfully, transcribed the bundled sample, and returned token timestamps. The vLLM guide documents installation, memory, batching, WebSocket, and serving options.</div>
<pre><code>python -m pip install "vllm==0.19.1"
python -m pip install "funasr&gt;=1.3.26" safetensors tiktoken websockets
# Follow docs/vllm_guide.md for offline, streaming, or server mode</code></pre>
<h2>3. Download the self-contained llama.cpp / GGUF runtime</h2>
<p><a href="https://github.com/modelscope/FunASR/releases/tag/runtime-llamacpp-v0.1.9" target="_blank" rel="noopener">runtime-llamacpp-v0.1.9</a> ships Linux x64/ARM64, macOS ARM64, and Windows x64 packages. Linux includes AVX2 and Vulkan options; Windows includes AVX2, Vulkan, and CUDA, including <code>funasr-llamacpp-windows-x64-vulkan.zip</code>. Each archive provides a self-contained <code>llama-funasr-*</code> binary entry point.</p>
<ul>
<li>Choose the standard CPU build when you do not want to maintain Python.</li>
<li>Choose Vulkan or CUDA for desktop GPU acceleration.</li>
<li>Choose ARM64 for edge devices and Apple Silicon.</li>
</ul>
<p>See the <a href="/en/llama-cpp.html">llama.cpp / GGUF page</a> for models, commands, and hardware selection. Runtime assets and model versions are linked together so users do not have to hunt across releases.</p>
<h2>What each repository owns</h2>
<table>
<thead><tr><th>Repository</th><th>What to follow</th></tr></thead>
<tbody>
<tr><td><a href="https://github.com/modelscope/FunASR" target="_blank" rel="noopener">FunASR</a></td><td>Toolkit, serving, OpenAI API, vLLM, llama.cpp, and deployment docs</td></tr>
<tr><td><a href="https://github.com/QwenAudio/Fun-ASR" target="_blank" rel="noopener">Fun-ASR</a></td><td>Fun-ASR-Nano / MLT models, capabilities, benchmarks, and model integrations</td></tr>
<tr><td><a href="https://github.com/QwenAudio/SenseVoice" target="_blank" rel="noopener">SenseVoice</a></td><td>Multilingual ASR plus emotion, language, and audio-event recognition</td></tr>
<tr><td><a href="https://github.com/modelscope/FunClip" target="_blank" rel="noopener">FunClip</a></td><td>Speech-driven video understanding, retrieval, and editing</td></tr>
</tbody>
</table>
<div class="cta">
<p>Run one real audio file through the path that fits your deployment. File a reproducible GitHub issue when something blocks you, and star the repository you actually use.</p>
<a class="btn" href="https://github.com/modelscope/FunASR/releases/tag/v1.3.26" target="_blank" rel="noopener">Read the v1.3.26 release notes</a>
</div>
</div></article>
<footer><div class="container">© 2024-2026 Tongyi Lab, Alibaba Group · <a href="https://github.com/modelscope/FunASR/blob/main/LICENSE">MIT License</a></div></footer>
</body>
</html>
@@ -0,0 +1,124 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>FunASR v1.3.27: Detected Language and Reliable vLLM Fallback | FunASR</title>
<meta name="description" content="FunASR v1.3.27 fixes SenseVoice language metadata, repeated Fun-ASR-Nano vLLM fallback loading, and server version reporting, with PyPI, wheel, sdist, and nine runtime downloads.">
<meta name="keywords" content="FunASR v1.3.27,SenseVoice language detection,OpenAI compatible ASR,vLLM fallback,llama.cpp ASR,GGUF,self-hosted speech to text">
<link rel="icon" href="/logo.png">
<meta property="og:title" content="FunASR v1.3.27: Detected Language and Reliable vLLM Fallback">
<meta property="og:description" content="Accurate language metadata, one cached Nano fallback, and nine prebuilt llama.cpp runtime downloads.">
<meta property="og:type" content="article">
<meta property="og:url" content="https://www.funasr.com/en/blog/funasr-v1-3-27-language-metadata-vllm-fallback.html">
<meta property="og:image" content="https://www.funasr.com/img/banner.4f436d19.png">
<link rel="canonical" href="https://www.funasr.com/en/blog/funasr-v1-3-27-language-metadata-vllm-fallback.html">
<link rel="alternate" hreflang="en" href="https://www.funasr.com/en/blog/funasr-v1-3-27-language-metadata-vllm-fallback.html">
<link rel="alternate" hreflang="zh" href="https://www.funasr.com/blog/funasr-v1-3-27-language-metadata-vllm-fallback.html">
<link rel="alternate" hreflang="x-default" href="https://www.funasr.com/en/blog/funasr-v1-3-27-language-metadata-vllm-fallback.html">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&amp;display=swap" rel="stylesheet">
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"BlogPosting","headline":"FunASR v1.3.27: Detected Language and Reliable vLLM Fallback","description":"Accurate language metadata, one cached Nano fallback, and nine prebuilt llama.cpp runtime downloads.","datePublished":"2026-07-24","dateModified":"2026-07-24","author":{"@type":"Organization","name":"FunASR / Tongyi Lab"},"publisher":{"@type":"Organization","name":"FunASR","logo":{"@type":"ImageObject","url":"https://www.funasr.com/logo.png"}},"mainEntityOfPage":{"@type":"WebPage","@id":"https://www.funasr.com/en/blog/funasr-v1-3-27-language-metadata-vllm-fallback.html"},"image":"https://www.funasr.com/img/banner.4f436d19.png"}
</script>
<style>
:root{--primary:#2563eb;--primary-dark:#1d4ed8;--accent:#047857;--bg:#fff;--surface:#f8fafc;--border:#e2e8f0;--text:#0f172a;--text-soft:#475569;--text-muted:#94a3b8}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:'Inter',-apple-system,sans-serif;color:var(--text);line-height:1.7;background:var(--bg)}
a{color:var(--primary);text-decoration:none}a:hover{text-decoration:underline}
.container{max-width:800px;margin:0 auto;padding:0 24px}
.nav{position:fixed;top:0;left:0;right:0;z-index:100;background:rgba(255,255,255,0.94);backdrop-filter:blur(12px);border-bottom:1px solid var(--border);padding:14px 0}
.nav .container{max-width:1120px;display:flex;align-items:center;gap:24px}
.nav-logo{font-size:1.2rem;font-weight:800;color:var(--text)}.nav-logo span{color:var(--primary)}
.nav-links{display:flex;gap:20px;margin-left:auto;flex-wrap:wrap}.nav-links a{font-size:.85rem;font-weight:500;color:var(--text-soft)}
.nav-btn{padding:7px 16px;background:var(--primary);color:#fff;border-radius:7px;font-size:.83rem;font-weight:600}
article{padding:116px 0 80px}
h1{font-size:2rem;font-weight:800;line-height:1.3;margin-bottom:14px}
h2{font-size:1.3rem;font-weight:700;margin:38px 0 14px;padding-top:18px;border-top:1px solid var(--border)}
h3{font-size:1.05rem;font-weight:700;margin:24px 0 10px}
p{margin-bottom:14px;color:var(--text-soft)}
ul{margin:0 0 16px 22px;color:var(--text-soft)}li{margin-bottom:7px}
table{width:100%;border-collapse:collapse;margin:18px 0;font-size:.88rem}
th,td{padding:11px 12px;text-align:left;vertical-align:top;border-bottom:1px solid var(--border)}th{font-weight:600;background:var(--surface);color:var(--text)}
pre{background:#172033;color:#e2e8f0;padding:18px;border-radius:8px;overflow-x:auto;font-size:.82rem;line-height:1.7;margin:14px 0}
code{font-family:ui-monospace,Menlo,monospace}p code,li code,td code{background:var(--surface);padding:2px 6px;border-radius:5px;font-size:.85em;color:var(--primary-dark)}
.post-meta{color:var(--text-muted);font-size:.85rem;margin-bottom:22px}
.lead{font-size:1.05rem;color:var(--text);margin:22px 0}
.hero-media{display:block;width:100%;aspect-ratio:2.04/1;object-fit:cover;border-radius:8px;border:1px solid var(--border);margin:0 0 24px}
.proof{border-left:4px solid var(--accent);background:#f0fdf4;padding:14px 16px;margin:18px 0;color:#14532d}
.cta{background:var(--surface);border:1px solid var(--border);border-radius:8px;padding:24px;margin:30px 0;text-align:center}.cta p{margin-bottom:16px}.cta a.btn{display:inline-block;padding:10px 22px;background:var(--primary);color:#fff;border-radius:7px;font-weight:600}
footer{background:#0f172a;color:#94a3b8;padding:28px 0;text-align:center;font-size:.8rem}footer a{color:#94a3b8}
@media(max-width:900px){.nav-links{display:none}.nav .container{gap:16px}.nav-logo{margin-right:auto}h1{font-size:1.65rem}table{font-size:.8rem}th,td{padding:9px 8px}}
</style>
</head>
<body>
<nav class="nav"><div class="container"><a href="/en/" class="nav-logo">Fun<span>ASR</span></a><div class="nav-links"><a href="/en/#capabilities">Capabilities</a><a href="/en/#usage">How to Use</a><a href="/en/#benchmark">Benchmark</a><a href="/en/#demo">Demo</a><a href="https://modelscope.github.io/FunASR/" target="_blank">Docs</a><a href="/en/quickstart.html">Quickstart</a><a href="/en/models.html">Models</a><a href="/en/ecosystem.html">Ecosystem</a><a href="/en/blog/">Blog</a><a href="/en/vs-whisper.html">vs Whisper</a><a href="/en/donors.html">Thanks</a></div><a href="/blog/funasr-v1-3-27-language-metadata-vllm-fallback.html" style="font-size:.83rem;font-weight:500;color:var(--text-soft)">中文</a><a href="https://github.com/modelscope/FunASR" target="_blank" rel="noopener" class="nav-btn">GitHub ★</a></div></nav>
<article><div class="container">
<h1>FunASR v1.3.27: Detected Language and Reliable vLLM Fallback</h1>
<p class="post-meta">July 24, 2026 · FunASR weekly release</p>
<img class="hero-media" src="/img/banner.4f436d19.png?v=1.3.27" alt="FunASR industrial speech recognition visual">
<p class="lead">FunASR v1.3.27 focuses on correctness and reliability in the OpenAI-compatible server: SenseVoice returns the detected language, Fun-ASR-Nano reuses its fallback after vLLM fails, and every server surface reports the installed package version.</p>
<p>The Python wheel and source distribution are published together. The same release page also lists nine self-contained llama.cpp / GGUF runtimes, so users do not have to hunt across separate releases.</p>
<h2>What changed</h2>
<table>
<thead><tr><th>Scenario</th><th>v1.3.27 behavior</th><th>Why it matters</th></tr></thead>
<tbody>
<tr><td>SenseVoice automatic language detection</td><td><code>verbose_json.language</code> returns detected <code>zh/en/yue/ja/ko</code></td><td>Subtitle, routing, and analytics clients no longer receive a false Chinese default</td></tr>
<tr><td>Fun-ASR-Nano cannot start vLLM</td><td>The process reuses its cached <code>AutoModel</code> fallback</td><td>Later requests do not construct the same model again</td></tr>
<tr><td>vLLM/VAD setup and fallback both fail</td><td>Half-initialized state is cleared and a later request can retry</td><td>A transient setup failure does not leave a falsely loaded service</td></tr>
<tr><td>Version diagnostics</td><td>OpenAPI metadata and the startup banner read the package version</td><td>Logs and <code>/docs</code> accurately show <code>1.3.27</code></td></tr>
</tbody>
</table>
<h2>1. Start the OpenAI-compatible transcription service</h2>
<p>This path uses the same server implementation as the repository smoke tests. Pin the current PyPI release, then start the service:</p>
<pre><code>git clone https://github.com/modelscope/FunASR.git
cd FunASR/examples/openai_api
python -m pip install "funasr==1.3.27" fastapi uvicorn python-multipart
python server.py --model sensevoice --device cuda --port 8000</code></pre>
<p>In another terminal, verify health and transcription with the public sample:</p>
<pre><code>curl -L https://isv-data.oss-cn-hangzhou.aliyuncs.com/ics/MaaS/ASR/test_audio/BAC009S0764W0121.wav -o sample.wav
curl http://localhost:8000/health
curl http://localhost:8000/v1/audio/transcriptions \
-F [email protected] \
-F model=sensevoice \
-F response_format=verbose_json</code></pre>
<p>SenseVoice now preserves its raw language tag in the OpenAI-compatible response. An English clip, for example, returns:</p>
<pre><code>{"task":"transcribe","language":"en","duration":4.6,"text":"hello", "segments":[...]}</code></pre>
<p>If you already use the OpenAI Python client, point <code>base_url</code> to <code>http://localhost:8000/v1</code>. The examples also include model listing, Swagger, Postman, OpenAPI, Gradio, and Kubernetes paths.</p>
<h2>2. Scale Fun-ASR-Nano throughput with vLLM</h2>
<p>Fun-ASR-Nano runs its audio encoder and adaptor in PyTorch, then sends continuous audio embeddings into the Qwen3 decoder managed by vLLM. The repository benchmark records <strong>RTFx 340</strong> for vLLM batch inference while keeping CER close to the PyTorch baseline.</p>
<div class="proof">The maintainer environment also completed a real-checkpoint smoke on one H100:vLLM 0.19.1 loaded successfully, transcribed the bundled sample, and returned token timestamps. The vLLM guide documents installation, memory, batching, WebSocket, and serving options.</div>
<pre><code>python -m pip install "vllm==0.19.1"
python -m pip install "funasr&gt;=1.3.27" safetensors tiktoken websockets
# Follow docs/vllm_guide.md for offline, streaming, or server mode</code></pre>
<h2>3. Download the self-contained llama.cpp / GGUF runtime</h2>
<p><a href="https://github.com/modelscope/FunASR/releases/tag/runtime-llamacpp-v0.1.9" target="_blank" rel="noopener">runtime-llamacpp-v0.1.9</a> ships nine Linux x64/ARM64, macOS ARM64, and Windows x64 packages. Linux includes AVX2 and Vulkan options; Windows includes AVX2, Vulkan, and CUDA, including <code>funasr-llamacpp-windows-x64-vulkan.zip</code>. Each archive provides a self-contained <code>llama-funasr-*</code> binary entry point.</p>
<ul>
<li>Choose the standard CPU build when you do not want to maintain Python.</li>
<li>Choose Vulkan or CUDA for desktop GPU acceleration.</li>
<li>Choose ARM64 for edge devices and Apple Silicon.</li>
</ul>
<p>See the <a href="/en/llama-cpp.html">llama.cpp / GGUF page</a> for models, commands, and hardware selection. Runtime assets and model versions are linked together so users do not have to hunt across releases.</p>
<h2>What each repository owns</h2>
<table>
<thead><tr><th>Repository</th><th>What to follow</th></tr></thead>
<tbody>
<tr><td><a href="https://github.com/modelscope/FunASR" target="_blank" rel="noopener">FunASR</a></td><td>Toolkit, serving, OpenAI API, vLLM, llama.cpp, and deployment docs</td></tr>
<tr><td><a href="https://github.com/QwenAudio/Fun-ASR" target="_blank" rel="noopener">Fun-ASR</a></td><td>Fun-ASR-Nano / MLT models, capabilities, benchmarks, and model integrations</td></tr>
<tr><td><a href="https://github.com/QwenAudio/SenseVoice" target="_blank" rel="noopener">SenseVoice</a></td><td>Multilingual ASR plus emotion, language, and audio-event recognition</td></tr>
<tr><td><a href="https://github.com/modelscope/FunClip" target="_blank" rel="noopener">FunClip</a></td><td>Speech-driven video understanding, retrieval, and editing</td></tr>
</tbody>
</table>
<div class="cta">
<p>Run one real audio file through the path that fits your deployment. File a reproducible GitHub issue when something blocks you, and star the repository you actually use.</p>
<a class="btn" href="https://github.com/modelscope/FunASR/releases/tag/v1.3.27" target="_blank" rel="noopener">Open the v1.3.27 release and downloads</a>
</div>
</div></article>
<footer><div class="container">© 2024-2026 Tongyi Lab, Alibaba Group · <a href="https://github.com/modelscope/FunASR/blob/main/LICENSE">MIT License</a></div></footer>
</body>
</html>
@@ -0,0 +1,113 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>FunASR v1.3.28: Reliable Realtime ASR and Better Subtitles | FunASR</title>
<meta name="description" content="FunASR v1.3.28 fixes realtime WebSocket finalization, STOP and disconnect handling, and SenseVoice subtitle timestamp alignment, with wheel, sdist, and nine llama.cpp runtime downloads.">
<meta name="keywords" content="FunASR v1.3.28,realtime speech recognition,WebSocket ASR,SenseVoice subtitles,timestamps,llama.cpp ASR,GGUF,self-hosted speech to text">
<link rel="icon" href="/logo.png">
<meta property="og:title" content="FunASR v1.3.28: Reliable Realtime ASR and Better Subtitles">
<meta property="og:description" content="Continuous realtime finals, reliable STOP handling, aligned SenseVoice subtitles, and eleven release assets.">
<meta property="og:type" content="article">
<meta property="og:url" content="https://www.funasr.com/en/blog/funasr-v1-3-28-realtime-websocket-subtitles.html">
<meta property="og:image" content="https://www.funasr.com/img/banner.4f436d19.png">
<link rel="canonical" href="https://www.funasr.com/en/blog/funasr-v1-3-28-realtime-websocket-subtitles.html">
<link rel="alternate" hreflang="en" href="https://www.funasr.com/en/blog/funasr-v1-3-28-realtime-websocket-subtitles.html">
<link rel="alternate" hreflang="zh" href="https://www.funasr.com/blog/funasr-v1-3-28-realtime-websocket-subtitles.html">
<link rel="alternate" hreflang="x-default" href="https://www.funasr.com/en/blog/funasr-v1-3-28-realtime-websocket-subtitles.html">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&amp;display=swap" rel="stylesheet">
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"BlogPosting","headline":"FunASR v1.3.28: Reliable Realtime ASR and Better Subtitles","description":"Continuous realtime finals, reliable STOP handling, aligned SenseVoice subtitles, and eleven release assets.","datePublished":"2026-07-24","dateModified":"2026-07-24","author":{"@type":"Organization","name":"FunASR / Tongyi Lab"},"publisher":{"@type":"Organization","name":"FunASR","logo":{"@type":"ImageObject","url":"https://www.funasr.com/logo.png"}},"mainEntityOfPage":{"@type":"WebPage","@id":"https://www.funasr.com/en/blog/funasr-v1-3-28-realtime-websocket-subtitles.html"},"image":"https://www.funasr.com/img/banner.4f436d19.png"}
</script>
<style>
:root{--primary:#2563eb;--primary-dark:#1d4ed8;--accent:#047857;--bg:#fff;--surface:#f8fafc;--border:#e2e8f0;--text:#0f172a;--text-soft:#475569;--text-muted:#94a3b8}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:'Inter',-apple-system,sans-serif;color:var(--text);line-height:1.7;background:var(--bg)}
a{color:var(--primary);text-decoration:none}a:hover{text-decoration:underline}
.container{max-width:800px;margin:0 auto;padding:0 24px}
.nav{position:fixed;top:0;left:0;right:0;z-index:100;background:rgba(255,255,255,0.94);backdrop-filter:blur(12px);border-bottom:1px solid var(--border);padding:14px 0}
.nav .container{max-width:1120px;display:flex;align-items:center;gap:24px}
.nav-logo{font-size:1.2rem;font-weight:800;color:var(--text)}.nav-logo span{color:var(--primary)}
.nav-links{display:flex;gap:20px;margin-left:auto;flex-wrap:wrap}.nav-links a{font-size:.85rem;font-weight:500;color:var(--text-soft)}
.nav-btn{padding:7px 16px;background:var(--primary);color:#fff;border-radius:7px;font-size:.83rem;font-weight:600}
article{padding:116px 0 80px}
h1{font-size:2rem;font-weight:800;line-height:1.3;margin-bottom:14px}
h2{font-size:1.3rem;font-weight:700;margin:38px 0 14px;padding-top:18px;border-top:1px solid var(--border)}
h3{font-size:1.05rem;font-weight:700;margin:24px 0 10px}
p{margin-bottom:14px;color:var(--text-soft)}
ul{margin:0 0 16px 22px;color:var(--text-soft)}li{margin-bottom:7px}
table{width:100%;border-collapse:collapse;margin:18px 0;font-size:.88rem}
th,td{padding:11px 12px;text-align:left;vertical-align:top;border-bottom:1px solid var(--border)}th{font-weight:600;background:var(--surface);color:var(--text)}
pre{background:#172033;color:#e2e8f0;padding:18px;border-radius:8px;overflow-x:auto;font-size:.82rem;line-height:1.7;margin:14px 0}
code{font-family:ui-monospace,Menlo,monospace}p code,li code,td code{background:var(--surface);padding:2px 6px;border-radius:5px;font-size:.85em;color:var(--primary-dark)}
.post-meta{color:var(--text-muted);font-size:.85rem;margin-bottom:22px}
.lead{font-size:1.05rem;color:var(--text);margin:22px 0}
.hero-media{display:block;width:100%;aspect-ratio:2.04/1;object-fit:cover;border-radius:8px;border:1px solid var(--border);margin:0 0 24px}
.proof{border-left:4px solid var(--accent);background:#f0fdf4;padding:14px 16px;margin:18px 0;color:#14532d}
.cta{background:var(--surface);border:1px solid var(--border);border-radius:8px;padding:24px;margin:30px 0;text-align:center}.cta p{margin-bottom:16px}.cta a.btn{display:inline-block;padding:10px 22px;background:var(--primary);color:#fff;border-radius:7px;font-weight:600}
footer{background:#0f172a;color:#94a3b8;padding:28px 0;text-align:center;font-size:.8rem}footer a{color:#94a3b8}
@media(max-width:900px){.nav-links{display:none}.nav .container{gap:16px}.nav-logo{margin-right:auto}h1{font-size:1.65rem}table{font-size:.8rem}th,td{padding:9px 8px}}
</style>
</head>
<body>
<nav class="nav"><div class="container"><a href="/en/" class="nav-logo">Fun<span>ASR</span></a><div class="nav-links"><a href="/en/#capabilities">Capabilities</a><a href="/en/#usage">How to Use</a><a href="/en/#benchmark">Benchmark</a><a href="/en/#demo">Demo</a><a href="https://modelscope.github.io/FunASR/" target="_blank">Docs</a><a href="/en/quickstart.html">Quickstart</a><a href="/en/models.html">Models</a><a href="/en/ecosystem.html">Ecosystem</a><a href="/en/blog/">Blog</a><a href="/en/vs-whisper.html">vs Whisper</a><a href="/en/donors.html">Thanks</a></div><a href="/blog/funasr-v1-3-28-realtime-websocket-subtitles.html" style="font-size:.83rem;font-weight:500;color:var(--text-soft)">中文</a><a href="https://github.com/modelscope/FunASR" target="_blank" rel="noopener" class="nav-btn">GitHub ★</a></div></nav>
<article><div class="container">
<h1>FunASR v1.3.28: Reliable Realtime ASR and Better Subtitles</h1>
<p class="post-meta">July 24, 2026 · FunASR weekly release</p>
<img class="hero-media" src="/img/banner.4f436d19.png?v=1.3.28" alt="FunASR industrial speech recognition visual">
<p class="lead">FunASR v1.3.28 is a focused reliability release for live transcription and subtitle generation. Realtime WebSocket sessions now keep the best continuous transcript when a final decode regresses, while SenseVoice subtitle cues preserve text and timestamp alignment.</p>
<p>The signed release includes the Python wheel, source distribution, and nine self-contained llama.cpp / GGUF runtimes on one download page.</p>
<h2>What changed</h2>
<table>
<thead><tr><th>Scenario</th><th>v1.3.28 behavior</th><th>Why it matters</th></tr></thead>
<tbody>
<tr><td>VAD-locked final decode becomes a short prefix, repetition, or exception</td><td>The server keeps the clean continuous partial covering the utterance</td><td>Final text no longer loses the end of a live sentence or replaces it with a repeated phrase</td></tr>
<tr><td>Short audio tail followed by <code>STOP</code></td><td>The pending samples use the same final decode path</td><td>Short endings are returned instead of being silently dropped</td></tr>
<tr><td>WebSocket disconnect or handler error</td><td>Connection exceptions are imported explicitly and unexpected errors reach the generic handler</td><td>Error handling is stable across supported <code>websockets</code> versions and import order</td></tr>
<tr><td>SenseVoice subtitle segmentation</td><td>Rich tags, punctuation, and word/BPE timestamps stay aligned</td><td>Chinese is not collapsed into one cue and English surface text is preserved</td></tr>
</tbody>
</table>
<h2>1. Upgrade the Python package</h2>
<p>Upgrade both realtime and subtitle deployments to the exact hotfix release:</p>
<pre><code>python -m pip install -U "funasr==1.3.28"
funasr --version</code></pre>
<p>The package version, command-line version, and server banner all report <code>1.3.28</code>. Existing model caches and API request formats remain compatible.</p>
<h2>2. Realtime and subtitle paths</h2>
<p>For live Fun-ASR-Nano sessions, use the packaged realtime entry point and the repository's vLLM guide. Client-driven <code>COMMIT</code> and server VAD modes share the corrected finalization logic.</p>
<pre><code>funasr-realtime-server --help
# See docs/vllm_guide.md for model and device options</code></pre>
<div class="proof">The exact merged source passed 118 focused regression tests. The realtime WebSocket file also passed all 60 tests independently, including STOP final decode and import-order-independent exception handling.</div>
<p>SenseVoice users receive the subtitle alignment fix through the same package upgrade; no output-schema migration is required.</p>
<h2>3. Download the self-contained llama.cpp / GGUF runtime</h2>
<p><a href="https://github.com/modelscope/FunASR/releases/tag/runtime-llamacpp-v0.1.9" target="_blank" rel="noopener">runtime-llamacpp-v0.1.9</a> ships nine Linux x64/ARM64, macOS ARM64, and Windows x64 packages. Linux includes AVX2 and Vulkan options; Windows includes AVX2, Vulkan, and CUDA, including <code>funasr-llamacpp-windows-x64-vulkan.zip</code>. Each archive provides a self-contained <code>llama-funasr-*</code> binary entry point.</p>
<ul>
<li>Choose the standard CPU build when you do not want to maintain Python.</li>
<li>Choose Vulkan or CUDA for desktop GPU acceleration.</li>
<li>Choose ARM64 for edge devices and Apple Silicon.</li>
</ul>
<p>See the <a href="/en/llama-cpp.html">llama.cpp / GGUF page</a> for models, commands, and hardware selection. Runtime assets and model versions are linked together so users do not have to hunt across releases.</p>
<h2>What each repository owns</h2>
<table>
<thead><tr><th>Repository</th><th>What to follow</th></tr></thead>
<tbody>
<tr><td><a href="https://github.com/modelscope/FunASR" target="_blank" rel="noopener">FunASR</a></td><td>Toolkit, serving, OpenAI API, vLLM, llama.cpp, and deployment docs</td></tr>
<tr><td><a href="https://github.com/QwenAudio/Fun-ASR" target="_blank" rel="noopener">Fun-ASR</a></td><td>Fun-ASR-Nano / MLT models, capabilities, benchmarks, and model integrations</td></tr>
<tr><td><a href="https://github.com/QwenAudio/SenseVoice" target="_blank" rel="noopener">SenseVoice</a></td><td>Multilingual ASR plus emotion, language, and audio-event recognition</td></tr>
<tr><td><a href="https://github.com/modelscope/FunClip" target="_blank" rel="noopener">FunClip</a></td><td>Speech-driven video understanding, retrieval, and editing</td></tr>
</tbody>
</table>
<div class="cta">
<p>Run one real audio file through the path that fits your deployment. File a reproducible GitHub issue when something blocks you, and star the repository you actually use.</p>
<a class="btn" href="https://github.com/modelscope/FunASR/releases/tag/v1.3.28" target="_blank" rel="noopener">Open the v1.3.28 release and downloads</a>
</div>
</div></article>
<footer><div class="container">© 2024-2026 Tongyi Lab, Alibaba Group · <a href="https://github.com/modelscope/FunASR/blob/main/LICENSE">MIT License</a></div></footer>
</body>
</html>
@@ -0,0 +1,130 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>FunASR vs faster-whisper: Chinese & Cantonese Speech Recognition Compared | FunASR Blog</title>
<meta name="description" content="Where faster-whisper falls short on Chinese (esp. Cantonese/dialects): Cantonese mislabeled as Mandarin, Japanese homophone errors. FunASR SenseVoice handles Cantonese natively + language/emotion ID, ~2.7x lower CER on 184 clips. With a 3-line quickstart.">
<meta name="keywords" content="faster-whisper, faster-whisper chinese, faster-whisper alternative, FunASR, cantonese speech recognition, chinese asr, SenseVoice, whisper chinese, language identification, dialect asr">
<link rel="icon" href="/logo.png">
<meta property="og:title" content="FunASR vs faster-whisper: Chinese & Cantonese Speech Recognition Compared | FunASR Blog">
<meta property="og:description" content="Where faster-whisper falls short on Chinese (esp. Cantonese/dialects): Cantonese mislabeled as Mandarin, Japanese homophone errors. FunASR SenseVoice handles Cantonese natively + language/emotion ID, ~2.7x lower CER on 184 clips. With a 3-line quickstart.">
<meta property="og:type" content="article">
<meta property="og:url" content="https://www.funasr.com/en/blog/funasr-vs-faster-whisper-chinese.html">
<meta property="og:image" content="https://www.funasr.com/logo.png">
<link rel="canonical" href="https://www.funasr.com/en/blog/funasr-vs-faster-whisper-chinese.html">
<link rel="alternate" hreflang="en" href="https://www.funasr.com/en/blog/funasr-vs-faster-whisper-chinese.html">
<link rel="alternate" hreflang="zh" href="https://www.funasr.com/blog/funasr-vs-faster-whisper-chinese.html">
<link rel="alternate" hreflang="x-default" href="https://www.funasr.com/en/blog/funasr-vs-faster-whisper-chinese.html">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"BlogPosting","headline":"FunASR vs faster-whisper: Chinese & Cantonese Speech Recognition Compared | FunASR Blog","description":"Where faster-whisper falls short on Chinese (esp. Cantonese/dialects): Cantonese mislabeled as Mandarin, Japanese homophone errors. FunASR SenseVoice handles Cantonese natively + language/emotion ID, ~2.7x lower CER on 184 clips. With a 3-line quickstart.","datePublished":"2026-06-21","dateModified":"2026-06-21","author":{"@type":"Organization","name":"FunASR / Tongyi Lab"},"publisher":{"@type":"Organization","name":"FunASR","logo":{"@type":"ImageObject","url":"https://www.funasr.com/logo.png"}},"mainEntityOfPage":{"@type":"WebPage","@id":"https://www.funasr.com/en/blog/funasr-vs-faster-whisper-chinese.html"},"image":"https://www.funasr.com/logo.png"}
</script>
<style>:root{--primary:#2563eb;--primary-dark:#1d4ed8;--bg:#fff;--surface:#f8fafc;--border:#e2e8f0;--text:#0f172a;--text-soft:#475569;--text-muted:#94a3b8;--radius:12px}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:'Inter',-apple-system,sans-serif;color:var(--text);line-height:1.7}
a{color:var(--primary);text-decoration:none}a:hover{text-decoration:underline}
.container{max-width:800px;margin:0 auto;padding:0 24px}
.nav{position:fixed;top:0;left:0;right:0;z-index:100;background:rgba(255,255,255,0.9);backdrop-filter:blur(12px);border-bottom:1px solid var(--border);padding:14px 0}
.nav .container{max-width:1120px;display:flex;align-items:center;gap:24px}
.nav-logo{font-size:1.2rem;font-weight:800;color:var(--text)}.nav-logo span{color:var(--primary)}
.nav-links{display:flex;gap:20px;margin-left:auto;flex-wrap:wrap}
.nav-links a{font-size:0.85rem;font-weight:500;color:var(--text-soft)}
.nav-btn{padding:7px 16px;background:var(--primary);color:#fff;border-radius:7px;font-size:0.83rem;font-weight:600}
article{padding:120px 0 80px}
h1{font-size:2rem;font-weight:800;line-height:1.3;margin-bottom:14px}
h2{font-size:1.3rem;font-weight:700;margin:36px 0 14px;padding-top:16px;border-top:1px solid var(--border)}
h3{font-size:1.05rem;font-weight:700;margin:22px 0 10px}
p{margin-bottom:14px;color:var(--text-soft)}
ul,ol{margin:0 0 14px 22px;color:var(--text-soft)}li{margin-bottom:6px}
table{width:100%;border-collapse:collapse;margin:16px 0;font-size:0.86rem}
th,td{padding:10px 12px;text-align:left;border-bottom:1px solid var(--border)}
th{font-weight:600;background:var(--surface);font-size:0.78rem;color:var(--text-muted)}
pre{background:#1e293b;color:#e2e8f0;padding:18px;border-radius:10px;overflow-x:auto;font-size:0.82rem;line-height:1.7;margin:14px 0}
code{font-family:ui-monospace,Menlo,monospace}
p code,li code{background:var(--surface);padding:2px 6px;border-radius:5px;font-size:0.85em;color:var(--primary-dark)}
.post-meta{color:var(--text-muted);font-size:0.85rem;margin-bottom:24px}
.cta{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:24px;margin:28px 0;text-align:center}
.cta a.btn{display:inline-block;padding:10px 24px;background:var(--primary);color:#fff;border-radius:8px;font-weight:600}
.post-list{list-style:none;margin:0;padding:0}
.post-list li{margin:0 0 8px}
.post-card{display:block;border:1px solid var(--border);border-radius:var(--radius);padding:20px 22px;margin-bottom:14px}
.post-card:hover{border-color:var(--primary);text-decoration:none}
.post-card h2{border:none;padding:0;margin:0 0 6px;font-size:1.15rem;color:var(--text)}
.post-card p{margin:0;color:var(--text-soft);font-size:0.9rem}
.post-card .date{color:var(--text-muted);font-size:0.8rem}
footer{background:#0f172a;color:#94a3b8;padding:28px 0;text-align:center;font-size:0.8rem}
footer a{color:#94a3b8}</style>
</head>
<body>
<nav class="nav"><div class="container"><a href="/en/" class="nav-logo">Fun<span>ASR</span></a><div class="nav-links"><a href="/en/#capabilities">Capabilities</a><a href="/en/#usage">How to Use</a><a href="/en/#benchmark">Benchmark</a><a href="/en/#demo">Demo</a><a href="https://modelscope.github.io/FunASR/" target="_blank">Docs</a><a href="/en/quickstart.html">Quickstart</a><a href="/en/models.html">Models</a><a href="/en/ecosystem.html">Ecosystem</a><a href="/en/blog/">Blog</a><a href="/en/vs-whisper.html">vs Whisper</a><a href="/en/donors.html">Donors</a></div><a href="https://www.funasr.com/blog/funasr-vs-faster-whisper-chinese.html" style="font-size:0.83rem;font-weight:500;color:var(--text-soft)">中文</a><a href="https://github.com/modelscope/FunASR" target="_blank" class="nav-btn">GitHub ★</a></div></nav>
<article><div class="container">
<h1>FunASR vs faster-whisper: Chinese &amp; Cantonese Speech Recognition Compared</h1>
<p class="post-meta">2026-06-21 · FunASR Team</p>
<p><a href="https://github.com/SYSTRAN/faster-whisper" target="_blank">faster-whisper</a> is the most popular fast Whisper implementation (CTranslate2), and it is strong on English and general multilingual audio. But on <strong>Chinese — especially Cantonese and dialects</strong> — it has clear gaps. Below is a sentence-level comparison of faster-whisper (small) vs FunASR <strong>SenseVoice</strong> on the same three clips.</p>
<h2>Side by side (same audio, verbatim)</h2>
<table>
<tr><th>Audio</th><th>faster-whisper (small)</th><th>FunASR SenseVoice</th></tr>
<tr><td>Mandarin</td><td>开放时间早上九点至下午五点。</td><td>开放时间早上9点至下午5点。</td></tr>
<tr><td><strong>Cantonese</strong></td><td>lang mis-detected as zh;<br>這幾個字都表達<strong>不到</strong>我想<strong>講的</strong>意思</td><td>correctly detects <code>yue</code>;<br>呢几个字都表达<strong>唔到</strong>,我想<strong>讲嘅</strong>意思</td></tr>
<tr><td>Japanese</td><td>うちの中学は弁当<strong>性</strong>で…</td><td>うちの中学は弁当<strong>制</strong>で…</td></tr>
</table>
<ul>
<li><strong>Cantonese: faster-whisper treats it as Mandarin</strong> — detects <code>zh</code> and rewrites spoken Cantonese into standard written Mandarin (dropping Cantonese-specific characters <code>呢 / 唔到 / 嘅</code>). SenseVoice natively handles Cantonese, detects <code>yue</code>, and keeps the Cantonese form.</li>
<li><strong>Japanese homophone error</strong>: faster-whisper hears 弁当<strong>性</strong> instead of 弁当<strong>制</strong>; SenseVoice is correct.</li>
<li>On a simple Mandarin sentence both are correct — the gap shows on hard samples, dialects, and proper nouns.</li>
</ul>
<h2>Overall accuracy (184 Mandarin clips)</h2>
<p>Same machine, CPU, character error rate (lower is better): FunASR <strong>SenseVoice 8.0% / Paraformer 9.9% / Fun-ASR-Nano 8.3%</strong>; Whisper-class models (small/base/large-v3-turbo) ~<strong>22–31%</strong>. On Chinese, FunASR's CER is ~2.7× lower — due to large-scale Mandarin training data and a non-autoregressive architecture (also faster). Full methodology in <a href="https://github.com/modelscope/FunASR/blob/main/runtime/llama.cpp/BENCHMARKS.md" target="_blank">BENCHMARKS.md</a>.</p>
<h2>What else FunASR gives you</h2>
<ul>
<li><strong>Language ID</strong>: zh / en / yue (Cantonese) / ja / ko (faster-whisper labels Cantonese as zh)</li>
<li><strong>Emotion + audio events</strong>: HAPPY/SAD/ANGRY, BGM/applause/laughter (<a href="/en/blog/sensevoice-emotion-language-detection.html">details</a>)</li>
<li><strong>Non-autoregressive = faster</strong>: SenseVoice/Paraformer single forward pass, ~20× real-time on CPU</li>
<li><strong>On-device</strong>: a <a href="/en/blog/funasr-llama-cpp-whisper-cpp-alternative.html">llama.cpp/GGUF runtime</a>, single binary, zero Python</li>
</ul>
<h2>Which should you use?</h2>
<p>Honestly: <strong>faster-whisper is still excellent for English, general 99-language coverage, and translation</strong>, with a mature ecosystem. But if your audio is <strong>Chinese, Cantonese, dialects, or you need emotion / event / language info</strong>, FunASR is more accurate and more complete. Both are open-source and run locally.</p>
<h3>Try FunASR in 3 lines</h3>
<pre>pip install funasr
from funasr import AutoModel
m = AutoModel(model="iic/SenseVoiceSmall")
print(m.generate(input="audio.wav", language="auto", use_itn=True)[0]["text"])</pre>
<div class="cta"><p><strong>The whole FunASR stack is open-source</strong> — ASR / VAD / punctuation / speaker / emotion &amp; events / LLM-ASR / on-device llama.cpp. A GitHub Star helps 👇</p><p><a class="btn" href="https://github.com/modelscope/FunASR" target="_blank">⭐ Star FunASR</a></p><p style="margin-top:10px;font-size:0.85rem">Also star:<a href="https://github.com/QwenAudio/SenseVoice" target="_blank">SenseVoice</a> · <a href="https://github.com/QwenAudio/Fun-ASR" target="_blank">Fun-ASR</a> · <a href="https://github.com/modelscope/FunClip" target="_blank">FunClip</a></p></div>
<!--related-posts-->
<h2>Related posts</h2>
<ul class="post-list">
<li><a href="/en/blog/funasr-vs-whisper-benchmark.html">FunASR vs Whisper Benchmark</a></li>
<li><a href="/en/blog/sensevoice-deployment-guide.html">SenseVoice Deployment Guide</a></li>
<li><a href="/en/blog/fun-asr-nano-guide.html">Fun-ASR-Nano Guide</a></li>
<li><a href="/en/blog/funasr-speaker-diarization.html">Speaker Diarization: Who Spoke When</a></li>
<li><a href="/en/blog/sensevoice-emotion-language-detection.html">Emotion & Language Detection</a></li>
<li><a href="/en/blog/funasr-realtime-streaming-asr.html">Real-Time Streaming Speech-to-Text</a></li>
<li><a href="/en/blog/funasr-transcribe-long-audio.html">Transcribe Long Audio (Hours in One Call)</a></li>
<li><a href="/en/blog/funasr-cli-transcribe-command-line.html">Transcribe from the Command Line</a></li>
<li><a href="/en/blog/self-hosted-openai-whisper-api-alternative.html">Self-Hosted OpenAI Whisper API Alternative</a></li>
<li><a href="/en/blog/generate-subtitles-srt-vtt-from-audio-video.html">Auto-Generate Subtitles (SRT / VTT)</a></li>
<li><a href="/en/blog/speech-to-text-python-transcribe-audio.html">Speech to Text in Python</a></li>
<li><a href="/en/blog/funasr-llama-cpp-whisper-cpp-alternative.html">FunASR on llama.cpp (whisper.cpp Alternative)</a></li>
<li><a href="/en/blog/lightweight-speech-recognition-cpu.html">Lightweight Speech Recognition on CPU</a></li>
<li><a href="/en/blog/self-hosted-deepgram-assemblyai-alternative.html">Self-Hosted Deepgram/AssemblyAI Alternative</a></li>
<li><a href="/en/blog/which-funasr-model.html">Which FunASR Model?</a></li>
<li><a href="/en/blog/cantonese-speech-recognition.html">Cantonese Speech Recognition (SenseVoice)</a></li>
<li><a href="/en/blog/japanese-speech-recognition.html">Japanese Speech Recognition (SenseVoice)</a></li>
<li><a href="/en/blog/voice-activity-detection-python.html">Voice Activity Detection in Python</a></li>
<li><a href="/en/blog/self-hosted-google-aws-azure-speech-to-text.html">Self-Hosted Google/AWS/Azure STT Alternative</a></li>
<li><a href="/en/blog/chinese-speech-recognition.html">Chinese Speech Recognition in Python</a></li>
<li><a href="/en/blog/punctuation-restoration-python.html">Punctuation Restoration in Python</a></li>
<li><a href="/en/blog/speech-to-text-timestamps-python.html">Speech-to-Text with Timestamps in Python</a></li>
</ul>
</div></article>
<footer><div class="container">© 2024-2026 Tongyi Lab, Alibaba Group · <a href="https://github.com/modelscope/FunASR/blob/main/LICENSE">MIT License</a></div></footer>
</body>
</html>
@@ -0,0 +1,95 @@
<!DOCTYPE html>
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>FunASR vs Whisper: Real Chinese ASR Benchmark | FunASR Blog</title><meta name="description" content="FunASR vs Whisper benchmark on 184 Chinese files (H100): SenseVoice 169.6x realtime (12x faster than Whisper), 7.81% CER (half of Whisper). Full speed & accuracy data."><meta name="keywords" content="FunASR vs Whisper, Whisper alternative, Chinese speech recognition, SenseVoice benchmark, Paraformer, ASR speed, CER, RTFx, fast speech to text">
<link rel="icon" href="/logo.png"><meta property="og:title" content="FunASR vs Whisper: Real Chinese ASR Benchmark | FunASR Blog"><meta property="og:description" content="FunASR vs Whisper benchmark on 184 Chinese files (H100): SenseVoice 169.6x realtime (12x faster than Whisper), 7.81% CER (half of Whisper). Full speed & accuracy data.">
<meta property="og:type" content="article"><meta property="og:url" content="https://www.funasr.com/en/blog/funasr-vs-whisper-benchmark.html"><meta property="og:image" content="https://www.funasr.com/logo.png">
<link rel="canonical" href="https://www.funasr.com/en/blog/funasr-vs-whisper-benchmark.html"><link rel="alternate" hreflang="en" href="https://www.funasr.com/en/blog/funasr-vs-whisper-benchmark.html"><link rel="alternate" hreflang="zh" href="https://www.funasr.com/blog/funasr-vs-whisper-benchmark.html"><link rel="alternate" hreflang="x-default" href="https://www.funasr.com/en/blog/funasr-vs-whisper-benchmark.html">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"BlogPosting","headline":"FunASR vs Whisper: Real Chinese ASR Benchmark | FunASR Blog","description":"FunASR vs Whisper benchmark on 184 Chinese files (H100): SenseVoice 169.6x realtime (12x faster than Whisper), 7.81% CER (half of Whisper). Full speed & accuracy data.","datePublished":"2026-06-16","dateModified":"2026-06-16","author":{"@type":"Organization","name":"FunASR / Tongyi Lab"},"publisher":{"@type":"Organization","name":"FunASR","logo":{"@type":"ImageObject","url":"https://www.funasr.com/logo.png"}},"mainEntityOfPage":{"@type":"WebPage","@id":"https://www.funasr.com/en/blog/funasr-vs-whisper-benchmark.html"},"image":"https://www.funasr.com/logo.png"}
</script>
<style>:root{--primary:#2563eb;--primary-dark:#1d4ed8;--bg:#fff;--surface:#f8fafc;--border:#e2e8f0;--text:#0f172a;--text-soft:#475569;--text-muted:#94a3b8;--radius:12px}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:'Inter',-apple-system,sans-serif;color:var(--text);line-height:1.7}
a{color:var(--primary);text-decoration:none}a:hover{text-decoration:underline}
.container{max-width:800px;margin:0 auto;padding:0 24px}
.nav{position:fixed;top:0;left:0;right:0;z-index:100;background:rgba(255,255,255,0.9);backdrop-filter:blur(12px);border-bottom:1px solid var(--border);padding:14px 0}
.nav .container{max-width:1120px;display:flex;align-items:center;gap:24px}
.nav-logo{font-size:1.2rem;font-weight:800;color:var(--text)}.nav-logo span{color:var(--primary)}
.nav-links{display:flex;gap:20px;margin-left:auto;flex-wrap:wrap}
.nav-links a{font-size:0.85rem;font-weight:500;color:var(--text-soft)}
.nav-btn{padding:7px 16px;background:var(--primary);color:#fff;border-radius:7px;font-size:0.83rem;font-weight:600}
article{padding:120px 0 80px}
h1{font-size:2rem;font-weight:800;line-height:1.3;margin-bottom:14px}
h2{font-size:1.3rem;font-weight:700;margin:36px 0 14px;padding-top:16px;border-top:1px solid var(--border)}
h3{font-size:1.05rem;font-weight:700;margin:22px 0 10px}
p{margin-bottom:14px;color:var(--text-soft)}
ul,ol{margin:0 0 14px 22px;color:var(--text-soft)}li{margin-bottom:6px}
table{width:100%;border-collapse:collapse;margin:16px 0;font-size:0.86rem}
th,td{padding:10px 12px;text-align:left;border-bottom:1px solid var(--border)}
th{font-weight:600;background:var(--surface);font-size:0.78rem;color:var(--text-muted)}
pre{background:#1e293b;color:#e2e8f0;padding:18px;border-radius:10px;overflow-x:auto;font-size:0.82rem;line-height:1.7;margin:14px 0}
code{font-family:ui-monospace,Menlo,monospace}
p code,li code{background:var(--surface);padding:2px 6px;border-radius:5px;font-size:0.85em;color:var(--primary-dark)}
.post-meta{color:var(--text-muted);font-size:0.85rem;margin-bottom:24px}
.cta{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:24px;margin:28px 0;text-align:center}
.cta a.btn{display:inline-block;padding:10px 24px;background:var(--primary);color:#fff;border-radius:8px;font-weight:600}
.post-list{list-style:none;margin:0;padding:0}
.post-list li{margin:0 0 8px}
.post-card{display:block;border:1px solid var(--border);border-radius:var(--radius);padding:20px 22px;margin-bottom:14px}
.post-card:hover{border-color:var(--primary);text-decoration:none}
.post-card h2{border:none;padding:0;margin:0 0 6px;font-size:1.15rem;color:var(--text)}
.post-card p{margin:0;color:var(--text-soft);font-size:0.9rem}
.post-card .date{color:var(--text-muted);font-size:0.8rem}
footer{background:#0f172a;color:#94a3b8;padding:28px 0;text-align:center;font-size:0.8rem}
footer a{color:#94a3b8}</style></head><body>
<nav class="nav"><div class="container"><a href="/en/" class="nav-logo">Fun<span>ASR</span></a><div class="nav-links"><a href="/en/#capabilities">Capabilities</a><a href="/en/#usage">How to Use</a><a href="/en/#benchmark">Benchmark</a><a href="/en/#demo">Demo</a><a href="https://modelscope.github.io/FunASR/" target="_blank">Docs</a><a href="/en/quickstart.html">Quickstart</a><a href="/en/models.html">Models</a><a href="/en/ecosystem.html">Ecosystem</a><a href="/en/blog/">Blog</a><a href="/en/vs-whisper.html">vs Whisper</a><a href="/en/donors.html">Donors</a></div><a href="https://www.funasr.com/blog/funasr-vs-whisper-benchmark.html" style="font-size:0.83rem;font-weight:500;color:var(--text-soft)">中文</a><a href="https://github.com/modelscope/FunASR" target="_blank" class="nav-btn">GitHub ★</a></div></nav>
<article><div class="container">
<h1>FunASR vs Whisper: A Real Benchmark on Chinese Speech Recognition</h1>
<p class="post-meta">FunASR Blog · 2026-06-16 · Benchmark</p>
<p>We benchmarked the FunASR model family against OpenAI Whisper on <strong>184 long-form Chinese audio files (11,539s ≈ 192 min)</strong> on a single <strong>NVIDIA H100</strong>, measuring speed (RTFx) and accuracy (CER). The takeaway: <strong>for Chinese, FunASR is both faster and more accurate.</strong></p>
<table><thead><tr><th>Model</th><th>Device</th><th>RTFx(higher=faster)</th><th>CER(lower=better)</th></tr></thead><tbody>
<tr><td><b>SenseVoice-Small</b></td><td>GPU</td><td class="win"><b>169.6x</b></td><td><b>7.81%</b></td></tr>
<tr><td><b>Paraformer-Large</b></td><td>GPU</td><td class="win"><b>119.6x</b></td><td>10.18%</td></tr>
<tr><td>Fun-ASR-Nano</td><td>GPU</td><td>340x (vLLM)</td><td>8.20%</td></tr>
<tr><td>Whisper-large-v3-turbo</td><td>GPU</td><td>46.1x</td><td>21.71%</td></tr>
<tr><td>Whisper-large-v3</td><td>GPU</td><td>13.4x</td><td>20.02%</td></tr>
<tr><td><b>SenseVoice-Small</b></td><td>CPU</td><td><b>17.2x</b></td><td>7.81%</td></tr>
</tbody></table>
<h2>Speed</h2>
<p><strong>SenseVoice-Small reaches 169.6x realtime — about 12x faster than Whisper-large-v3 (13.4x)</strong>. Even on CPU, SenseVoice hits 17.2x, faster than Whisper on GPU. Paraformer-Large does 119.6x.</p>
<h2>Accuracy</h2>
<p>Chinese CER: <strong>SenseVoice 7.81%, Paraformer 10.18%</strong>, versus Whisper-large-v3 at 20.02% (turbo 21.71%) — roughly half the error rate or better.</p>
<h2>Why FunASR is faster</h2>
<p>SenseVoice / Paraformer are <strong>non-autoregressive</strong>: one forward pass yields the full transcript, unlike Whisper's token-by-token autoregressive decoding. Combined with training data tuned for Chinese and Asian languages, FunASR wins on both speed and accuracy in Chinese.</p>
<div class="cta"><h3>Get started with FunASR</h3><p>Open-source, commercial-friendly, CPU/GPU. If it helps, star it ⭐</p><a href="https://github.com/modelscope/FunASR" class="btn">FunASR GitHub ★</a></div>
<p>Read more: <a href="/en/blog/sensevoice-deployment-guide.html">SenseVoice Guide</a> · <a href="/en/blog/fun-asr-nano-guide.html">Fun-ASR-Nano Guide</a></p>
<p style="color:#94a3b8;font-size:0.82rem">Setup: 184 files / 11,539s Chinese audio, NVIDIA H100. RTF=infer time/audio duration, Speed=1/RTF, CER computed after punctuation removal.</p>
<!--related-posts-->
<h2>Related posts</h2>
<ul class="post-list">
<li><a href="/en/blog/sensevoice-deployment-guide.html">SenseVoice Deployment Guide</a></li>
<li><a href="/en/blog/fun-asr-nano-guide.html">Fun-ASR-Nano Guide</a></li>
<li><a href="/en/blog/funasr-speaker-diarization.html">Speaker Diarization: Who Spoke When</a></li>
<li><a href="/en/blog/sensevoice-emotion-language-detection.html">Emotion & Language Detection</a></li>
<li><a href="/en/blog/funasr-realtime-streaming-asr.html">Real-Time Streaming Speech-to-Text</a></li>
<li><a href="/en/blog/funasr-transcribe-long-audio.html">Transcribe Long Audio (Hours in One Call)</a></li>
<li><a href="/en/blog/funasr-cli-transcribe-command-line.html">Transcribe from the Command Line</a></li>
<li><a href="/en/blog/self-hosted-openai-whisper-api-alternative.html">Self-Hosted OpenAI Whisper API Alternative</a></li>
<li><a href="/en/blog/generate-subtitles-srt-vtt-from-audio-video.html">Auto-Generate Subtitles (SRT / VTT)</a></li>
<li><a href="/en/blog/speech-to-text-python-transcribe-audio.html">Speech to Text in Python</a></li>
<li><a href="/en/blog/funasr-llama-cpp-whisper-cpp-alternative.html">FunASR on llama.cpp (whisper.cpp Alternative)</a></li>
<li><a href="/en/blog/funasr-vs-faster-whisper-chinese.html">FunASR vs faster-whisper (Chinese/Cantonese)</a></li>
<li><a href="/en/blog/lightweight-speech-recognition-cpu.html">Lightweight Speech Recognition on CPU</a></li>
<li><a href="/en/blog/self-hosted-deepgram-assemblyai-alternative.html">Self-Hosted Deepgram/AssemblyAI Alternative</a></li>
<li><a href="/en/blog/which-funasr-model.html">Which FunASR Model?</a></li>
<li><a href="/en/blog/cantonese-speech-recognition.html">Cantonese Speech Recognition (SenseVoice)</a></li>
<li><a href="/en/blog/japanese-speech-recognition.html">Japanese Speech Recognition (SenseVoice)</a></li>
<li><a href="/en/blog/voice-activity-detection-python.html">Voice Activity Detection in Python</a></li>
<li><a href="/en/blog/self-hosted-google-aws-azure-speech-to-text.html">Self-Hosted Google/AWS/Azure STT Alternative</a></li>
<li><a href="/en/blog/chinese-speech-recognition.html">Chinese Speech Recognition in Python</a></li>
<li><a href="/en/blog/punctuation-restoration-python.html">Punctuation Restoration in Python</a></li>
<li><a href="/en/blog/speech-to-text-timestamps-python.html">Speech-to-Text with Timestamps in Python</a></li>
</ul>
</div></article>
<footer><div class="container">© 2024-2026 Tongyi Lab, Alibaba Group · <a href="https://github.com/modelscope/FunASR/blob/main/LICENSE">MIT License</a></div></footer></body></html>
@@ -0,0 +1,118 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>FunClip v2.1.0: Local AI Video Clipping with FunASR | FunASR</title>
<meta name="description" content="FunClip v2.1.0 is the first versioned GitHub release for local AI video clipping with Paraformer, Fun-ASR-Nano, SenseVoice, LLM selection, tar.gz, zip, and SHA256SUMS.">
<meta name="keywords" content="FunClip v2.1.0,AI video clipping,local video editor,automatic subtitles,FunASR,Fun-ASR-Nano,SenseVoice,LLM video clipping,Gradio">
<link rel="icon" href="/logo.png">
<meta property="og:title" content="FunClip v2.1.0: The First Versioned Local AI Video-Clipping Release">
<meta property="og:description" content="Paraformer, Fun-ASR-Nano, SenseVoice, and LLM clipping in checksum-protected, rollback-ready source archives.">
<meta property="og:type" content="article">
<meta property="og:url" content="https://www.funasr.com/en/blog/funclip-v2-1-0-video-clipping-release.html">
<meta property="og:image" content="https://www.funasr.com/img/funclip-v2-1-0-interface.jpg">
<link rel="canonical" href="https://www.funasr.com/en/blog/funclip-v2-1-0-video-clipping-release.html">
<link rel="alternate" hreflang="en" href="https://www.funasr.com/en/blog/funclip-v2-1-0-video-clipping-release.html">
<link rel="alternate" hreflang="zh" href="https://www.funasr.com/blog/funclip-v2-1-0-video-clipping-release.html">
<link rel="alternate" hreflang="x-default" href="https://www.funasr.com/en/blog/funclip-v2-1-0-video-clipping-release.html">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&amp;display=swap" rel="stylesheet">
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"BlogPosting","headline":"FunClip v2.1.0: The First Versioned Local AI Video-Clipping Release","description":"Paraformer, Fun-ASR-Nano, SenseVoice, and LLM clipping in checksum-protected, rollback-ready source archives.","datePublished":"2026-07-24","dateModified":"2026-07-24","author":{"@type":"Organization","name":"FunASR / Tongyi Lab"},"publisher":{"@type":"Organization","name":"FunASR","logo":{"@type":"ImageObject","url":"https://www.funasr.com/logo.png"}},"mainEntityOfPage":{"@type":"WebPage","@id":"https://www.funasr.com/en/blog/funclip-v2-1-0-video-clipping-release.html"},"image":"https://www.funasr.com/img/funclip-v2-1-0-interface.jpg"}
</script>
<style>
:root{--primary:#2563eb;--primary-dark:#1d4ed8;--accent:#047857;--bg:#fff;--surface:#f8fafc;--border:#e2e8f0;--text:#0f172a;--text-soft:#475569;--text-muted:#94a3b8}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:'Inter',-apple-system,sans-serif;color:var(--text);line-height:1.7;background:var(--bg)}
a{color:var(--primary);text-decoration:none}a:hover{text-decoration:underline}
.container{max-width:800px;margin:0 auto;padding:0 24px}
.nav{position:fixed;top:0;left:0;right:0;z-index:100;background:rgba(255,255,255,0.94);backdrop-filter:blur(12px);border-bottom:1px solid var(--border);padding:14px 0}
.nav .container{max-width:1120px;display:flex;align-items:center;gap:24px}
.nav-logo{font-size:1.2rem;font-weight:800;color:var(--text)}.nav-logo span{color:var(--primary)}
.nav-links{display:flex;gap:20px;margin-left:auto;flex-wrap:wrap}.nav-links a{font-size:.85rem;font-weight:500;color:var(--text-soft)}
.nav-btn{padding:7px 16px;background:var(--primary);color:#fff;border-radius:7px;font-size:.83rem;font-weight:600}
article{padding:116px 0 80px}
h1{font-size:2rem;font-weight:800;line-height:1.3;margin-bottom:14px}
h2{font-size:1.3rem;font-weight:700;margin:38px 0 14px;padding-top:18px;border-top:1px solid var(--border)}
h3{font-size:1.05rem;font-weight:700;margin:24px 0 10px}
p{margin-bottom:14px;color:var(--text-soft)}
ul{margin:0 0 16px 22px;color:var(--text-soft)}li{margin-bottom:7px}
table{width:100%;border-collapse:collapse;margin:18px 0;font-size:.88rem}
th,td{padding:11px 12px;text-align:left;vertical-align:top;border-bottom:1px solid var(--border)}th{font-weight:600;background:var(--surface);color:var(--text)}
pre{background:#172033;color:#e2e8f0;padding:18px;border-radius:8px;overflow-x:auto;font-size:.82rem;line-height:1.7;margin:14px 0}
code{font-family:ui-monospace,Menlo,monospace}p code,li code,td code{background:var(--surface);padding:2px 6px;border-radius:5px;font-size:.85em;color:var(--primary-dark)}
.post-meta{color:var(--text-muted);font-size:.85rem;margin-bottom:22px}
.lead{font-size:1.05rem;color:var(--text);margin:22px 0}
.hero-media{display:block;width:100%;aspect-ratio:2.04/1;object-fit:cover;border-radius:8px;border:1px solid var(--border);margin:0 0 24px}
.proof{border-left:4px solid var(--accent);background:#f0fdf4;padding:14px 16px;margin:18px 0;color:#14532d}
.cta{background:var(--surface);border:1px solid var(--border);border-radius:8px;padding:24px;margin:30px 0;text-align:center}.cta p{margin-bottom:16px}.cta a.btn{display:inline-block;padding:10px 22px;background:var(--primary);color:#fff;border-radius:7px;font-weight:600}
footer{background:#0f172a;color:#94a3b8;padding:28px 0;text-align:center;font-size:.8rem}footer a{color:#94a3b8}
@media(max-width:900px){.nav-links{display:none}.nav .container{gap:16px}.nav-logo{margin-right:auto}h1{font-size:1.65rem}table{font-size:.8rem}th,td{padding:9px 8px}}
</style>
</head>
<body>
<nav class="nav"><div class="container"><a href="/en/" class="nav-logo">Fun<span>ASR</span></a><div class="nav-links"><a href="/en/#capabilities">Capabilities</a><a href="/en/#usage">How to Use</a><a href="/en/#benchmark">Benchmark</a><a href="/en/#demo">Demo</a><a href="https://modelscope.github.io/FunASR/" target="_blank" rel="noopener">Docs</a><a href="/en/quickstart.html">Quickstart</a><a href="/en/models.html">Models</a><a href="/en/ecosystem.html">Ecosystem</a><a href="/en/blog/">Blog</a><a href="/en/vs-whisper.html">vs Whisper</a><a href="/en/donors.html">Thanks</a></div><a href="/blog/funclip-v2-1-0-video-clipping-release.html" style="font-size:.83rem;font-weight:500;color:var(--text-soft)">中文</a><a href="https://github.com/modelscope/FunASR" target="_blank" rel="noopener" class="nav-btn">GitHub ★</a></div></nav>
<article><div class="container">
<h1>FunClip v2.1.0: The First Versioned Local AI Video-Clipping Release</h1>
<p class="post-meta">July 24, 2026 · FunClip Release</p>
<img class="hero-media" src="/img/funclip-v2-1-0-interface.jpg" alt="FunClip local video input, subtitle recognition, and LLM-assisted clipping interface">
<p class="lead">FunClip v2.1.0 is the project's first versioned GitHub release. It turns the current local video-clipping application into a downloadable, verifiable, rollback-ready snapshot: transcribe video with the FunASR model family, then cut by transcript, speaker, or LLM-selected segments.</p>
<p>You can run the public Space first or download the source for private local deployment. Videos, audio, and model weights stay outside the release archives.</p>
<h2>Choose the ASR path that fits the edit</h2>
<table>
<thead><tr><th>Path</th><th>Best for</th><th>Launch command</th></tr></thead>
<tbody>
<tr><td>Paraformer</td><td>Precise timestamps, transcript or speaker clipping, and Chinese hotwords</td><td><code>python funclip/launch.py</code></td></tr>
<tr><td>Fun-ASR-Nano</td><td>High-accuracy Mandarin, English, Japanese, Chinese dialect, and accent transcription; use Paraformer for precise character-level clipping</td><td><code>python funclip/launch.py -m fun-asr-nano</code></td></tr>
<tr><td>SenseVoice</td><td>Multilingual ASR with emotion and audio-event tags</td><td><code>python funclip/launch.py -m sensevoice</code></td></tr>
<tr><td>English Paraformer</td><td>English recognition with timestamp-based clipping</td><td><code>python funclip/launch.py -l en</code></td></tr>
</tbody>
</table>
<h2>1. Try the public application first</h2>
<p>The <a href="https://huggingface.co/spaces/FunAudioLLM/FunClip" target="_blank" rel="noopener">FunClip Hugging Face Space</a> runs the same public application. Use it to validate video upload, ASR, subtitle selection, and AI clipping before moving private media or pinned dependencies to a local deployment.</p>
<h2>2. Download and verify v2.1.0</h2>
<p>Use the <code>tar.gz</code> archive on Linux and macOS, or the <code>zip</code> archive on Windows and general-purpose extraction workflows. The checksum command below verifies only archives present in the current directory:</p>
<pre><code>curl -LO https://github.com/modelscope/FunClip/releases/download/v2.1.0/FunClip-2.1.0.tar.gz
curl -LO https://github.com/modelscope/FunClip/releases/download/v2.1.0/SHA256SUMS
sha256sum -c SHA256SUMS --ignore-missing
tar -xzf FunClip-2.1.0.tar.gz
cd FunClip-2.1.0
python -m pip install -r requirements.txt
python -m pip install -U "funasr>=1.3.29"
python funclip/launch.py</code></pre>
<p>On Windows, run <code>Get-FileHash -Algorithm SHA256 FunClip-2.1.0.zip</code> and compare the result with <a href="https://github.com/modelscope/FunClip/releases/download/v2.1.0/SHA256SUMS" target="_blank" rel="noopener">SHA256SUMS</a>.</p>
<h2>3. From transcript clipping to content-aware selection</h2>
<p>The default workflow turns a video into timestamped subtitles and lets you cut by transcript or speaker. LLM-assisted clipping sends subtitles plus your prompt to a configured provider and returns segments that the existing clip action can consume directly.</p>
<ul>
<li>Use a supported transcript-driven LLM provider when subtitles contain the signal you need.</li>
<li>Use optional TwelveLabs Pegasus when action, scene changes, or on-screen events matter more than the transcript; Pegasus reasons over video and audio together.</li>
<li>Use direct transcript or speaker selection when a human needs exact control over the output video and SRT cues.</li>
</ul>
<h2>Why these are source archives, not a wheel</h2>
<p>FunClip is a runnable application, not a declared Python library package; the repository has no wheel-producing <code>setup.py</code> or <code>pyproject.toml</code>. v2.1.0 therefore ships two honest application snapshots and one checksum manifest:</p>
<ul>
<li><a href="https://github.com/modelscope/FunClip/releases/download/v2.1.0/FunClip-2.1.0.tar.gz" target="_blank" rel="noopener"><code>FunClip-2.1.0.tar.gz</code></a></li>
<li><a href="https://github.com/modelscope/FunClip/releases/download/v2.1.0/FunClip-2.1.0.zip" target="_blank" rel="noopener"><code>FunClip-2.1.0.zip</code></a></li>
<li><a href="https://github.com/modelscope/FunClip/releases/download/v2.1.0/SHA256SUMS" target="_blank" rel="noopener"><code>SHA256SUMS</code></a></li>
</ul>
<p>The archives contain tracked application source, documentation, and the dependency manifest. They do not bundle runtime dependencies or model weights, so every model keeps its own license and distribution boundary.</p>
<div class="proof">The exact v2.1.0 merge passed 50 tests with 1 skipped. Six release-contract tests also passed in a clean Python 3.12 environment, covering reproducible archives, cross-filesystem output, invalid-ref rejection, and idempotent publication. Both the initial GitHub Actions release and a deliberate rerun succeeded; the rerun verified the published assets and made no destructive changes.</div>
<h2>Version relationship with FunASR 1.3.29</h2>
<p>FunClip v2.1.0 requires <code>funasr>=1.3.29</code>. When SenseVoice has no token timestamps, that release exposes every VAD speech region through <code>sentence_info</code>, giving subtitle and clipping clients real segment boundaries. It also includes the realtime final-text and short-tail fixes from 1.3.28. See the <a href="https://github.com/modelscope/FunASR/releases/tag/v1.3.29" target="_blank" rel="noopener">FunASR v1.3.29 release</a> for details.</p>
<div class="cta">
<p>Run one video in the Space or deploy the pinned version on your own machine. File a reproducible issue when something blocks you, and star the <a href="https://github.com/modelscope/FunClip" target="_blank" rel="noopener">FunClip repository</a> if it becomes part of your workflow.</p>
<a class="btn" href="https://github.com/modelscope/FunClip/releases/tag/v2.1.0" target="_blank" rel="noopener">Open the FunClip v2.1.0 release and downloads</a>
</div>
</div></article>
<footer><div class="container">© 2024-2026 Tongyi Lab, Alibaba Group · <a href="https://github.com/modelscope/FunASR/blob/main/LICENSE">MIT License</a></div></footer>
</body>
</html>
@@ -0,0 +1,134 @@
<!DOCTYPE html>
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>Auto-Generate Subtitles (SRT & VTT) from Audio or Video with FunASR | FunASR</title><meta name="description" content="Generate subtitles for any video or audio locally and for free: `funasr video.wav -f srt` writes SRT in one line, and Python can also emit VTT with speaker labels and real timestamps. Strong on Chinese, 50+ languages, nothing uploaded. All code tested."><meta name="keywords" content="auto generate subtitles, video to srt, audio to subtitles, srt generator python, generate vtt subtitles, subtitle generator, transcribe video to subtitles, add subtitles to video, speaker labeled subtitles, whisper subtitle alternative">
<link rel="icon" href="/logo.png"><meta property="og:title" content="Auto-Generate Subtitles (SRT & VTT) from Audio or Video with FunASR"><meta property="og:description" content="Generate subtitles for any video or audio locally and for free: `funasr video.wav -f srt` writes SRT in one line, and Python can also emit VTT with speaker labels and real timestamps. Strong on Chinese, 50+ languages, nothing uploaded. All code tested.">
<meta property="og:type" content="article"><meta property="og:url" content="https://www.funasr.com/en/blog/generate-subtitles-srt-vtt-from-audio-video.html"><meta property="og:image" content="https://www.funasr.com/logo.png">
<link rel="canonical" href="https://www.funasr.com/en/blog/generate-subtitles-srt-vtt-from-audio-video.html"><link rel="alternate" hreflang="en" href="https://www.funasr.com/en/blog/generate-subtitles-srt-vtt-from-audio-video.html"><link rel="alternate" hreflang="zh" href="https://www.funasr.com/blog/generate-subtitles-srt-vtt-from-audio-video.html"><link rel="alternate" hreflang="x-default" href="https://www.funasr.com/en/blog/generate-subtitles-srt-vtt-from-audio-video.html">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"BlogPosting","headline":"Auto-Generate Subtitles (SRT & VTT) from Audio or Video with FunASR","description":"Generate subtitles for any video or audio locally and for free: `funasr video.wav -f srt` writes SRT in one line, and Python can also emit VTT with speaker labels and real timestamps. Strong on Chinese, 50+ languages, nothing uploaded. All code tested.","datePublished":"2026-06-18","dateModified":"2026-06-18","author":{"@type":"Organization","name":"FunASR / Tongyi Lab"},"publisher":{"@type":"Organization","name":"FunASR","logo":{"@type":"ImageObject","url":"https://www.funasr.com/logo.png"}},"mainEntityOfPage":{"@type":"WebPage","@id":"https://www.funasr.com/en/blog/generate-subtitles-srt-vtt-from-audio-video.html"},"image":"https://www.funasr.com/logo.png"}
</script>
<style>:root{--primary:#2563eb;--primary-dark:#1d4ed8;--bg:#fff;--surface:#f8fafc;--border:#e2e8f0;--text:#0f172a;--text-soft:#475569;--text-muted:#94a3b8;--radius:12px}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:'Inter',-apple-system,sans-serif;color:var(--text);line-height:1.7}
a{color:var(--primary);text-decoration:none}a:hover{text-decoration:underline}
.container{max-width:800px;margin:0 auto;padding:0 24px}
.nav{position:fixed;top:0;left:0;right:0;z-index:100;background:rgba(255,255,255,0.9);backdrop-filter:blur(12px);border-bottom:1px solid var(--border);padding:14px 0}
.nav .container{max-width:1120px;display:flex;align-items:center;gap:24px}
.nav-logo{font-size:1.2rem;font-weight:800;color:var(--text)}.nav-logo span{color:var(--primary)}
.nav-links{display:flex;gap:20px;margin-left:auto;flex-wrap:wrap}
.nav-links a{font-size:0.85rem;font-weight:500;color:var(--text-soft)}
.nav-btn{padding:7px 16px;background:var(--primary);color:#fff;border-radius:7px;font-size:0.83rem;font-weight:600}
article{padding:120px 0 80px}
h1{font-size:2rem;font-weight:800;line-height:1.3;margin-bottom:14px}
h2{font-size:1.3rem;font-weight:700;margin:36px 0 14px;padding-top:16px;border-top:1px solid var(--border)}
h3{font-size:1.05rem;font-weight:700;margin:22px 0 10px}
p{margin-bottom:14px;color:var(--text-soft)}
ul,ol{margin:0 0 14px 22px;color:var(--text-soft)}li{margin-bottom:6px}
table{width:100%;border-collapse:collapse;margin:16px 0;font-size:0.86rem}
th,td{padding:10px 12px;text-align:left;border-bottom:1px solid var(--border)}
th{font-weight:600;background:var(--surface);font-size:0.78rem;color:var(--text-muted)}
pre{background:#1e293b;color:#e2e8f0;padding:18px;border-radius:10px;overflow-x:auto;font-size:0.82rem;line-height:1.7;margin:14px 0}
code{font-family:ui-monospace,Menlo,monospace}
p code,li code{background:var(--surface);padding:2px 6px;border-radius:5px;font-size:0.85em;color:var(--primary-dark)}
.post-meta{color:var(--text-muted);font-size:0.85rem;margin-bottom:24px}
.cta{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:24px;margin:28px 0;text-align:center}
.cta a.btn{display:inline-block;padding:10px 24px;background:var(--primary);color:#fff;border-radius:8px;font-weight:600}
.post-list{list-style:none;margin:0;padding:0}
.post-list li{margin:0 0 8px}
.post-card{display:block;border:1px solid var(--border);border-radius:var(--radius);padding:20px 22px;margin-bottom:14px}
.post-card:hover{border-color:var(--primary);text-decoration:none}
.post-card h2{border:none;padding:0;margin:0 0 6px;font-size:1.15rem;color:var(--text)}
.post-card p{margin:0;color:var(--text-soft);font-size:0.9rem}
.post-card .date{color:var(--text-muted);font-size:0.8rem}
footer{background:#0f172a;color:#94a3b8;padding:28px 0;text-align:center;font-size:0.8rem}
footer a{color:#94a3b8}</style></head><body>
<nav class="nav"><div class="container"><a href="/" class="nav-logo">Fun<span>ASR</span></a><div class="nav-links"><a href="/en/#capabilities">Capabilities</a><a href="/en/#usage">How to Use</a><a href="/en/#benchmark">Benchmark</a><a href="/en/#demo">Demo</a><a href="https://modelscope.github.io/FunASR/" target="_blank">Docs</a><a href="/en/quickstart.html">Quickstart</a><a href="/en/models.html">Models</a><a href="/en/ecosystem.html">Ecosystem</a><a href="/en/blog/">Blog</a><a href="/en/vs-whisper.html">vs Whisper</a><a href="/en/donors.html">Donors</a></div><a href="https://www.funasr.com/blog/generate-subtitles-srt-vtt-from-audio-video.html" style="font-size:0.83rem;font-weight:600;color:var(--text-soft)">中文</a><a href="https://github.com/modelscope/FunASR" target="_blank" class="nav-btn">GitHub ★</a></div></nav>
<article><div class="container">
<h1>Auto-Generate Subtitles (SRT & VTT) from Audio or Video with FunASR</h1>
<p class="post-meta">FunASR Blog · 2026-06-18 · Tutorial</p>
<p>You don't need a cloud service or a paid API to subtitle a video. FunASR turns speech into timestamped <strong>SRT</strong> or <strong>VTT</strong> subtitles locally and for free, and can even label speakers. It's especially strong on Chinese and supports 50+ languages. Every command and snippet below is tested.</p>
<h2>Step 1 (video): extract the audio</h2>
<p>If your source is a video, pull out 16 kHz mono audio (FunASR's standard input) with ffmpeg:</p>
<pre><code>ffmpeg -i video.mp4 -ar 16000 -ac 1 audio.wav</code></pre>
<p>For audio files (wav/mp3/m4a, ...) skip this step.</p>
<h2>Fastest: one command to SRT</h2>
<pre><code>pip install -U funasr
funasr audio.wav -f srt -o ./subs</code></pre>
<p>Writes a standard SRT file at <code>./subs/audio.srt</code> with real, usable timestamps:</p>
<pre><code>1
00:00:00,000 --&gt; 00:00:05,546
欢迎大家来体验达摩院推出的语音识别模型 (the Chinese sample)</code></pre>
<p>Add <code>--spk</code> to split cues by speaker (great for interviews and meetings):</p>
<pre><code>funasr meeting.wav --spk -f srt -o ./subs</code></pre>
<h2>Python: emit SRT and VTT together (with speakers)</h2>
<p>When you need more control — e.g. a web-friendly VTT as well, or a custom speaker prefix — build subtitles directly from <code>sentence_info</code> in the result:</p>
<pre><code>from funasr import AutoModel
from funasr.utils.postprocess_utils import rich_transcription_postprocess
model = AutoModel(model="iic/SenseVoiceSmall", vad_model="fsmn-vad", spk_model="cam++", device="cuda")
res = model.generate(input="audio.wav")
segments = res[0]["sentence_info"] # each has start/end (ms), spk, sentence
def ts(ms, sep): # ms -&gt; HH:MM:SS,mmm (SRT uses "," / VTT uses ".")
h, mm, ss, mmm = ms//3600000, (ms%3600000)//60000, (ms%60000)//1000, ms%1000
return "%02d:%02d:%02d%s%03d" % (h, mm, ss, sep, mmm)
with open("subs.srt", "w", encoding="utf-8") as f:
for i, s in enumerate(segments):
text = rich_transcription_postprocess(s["sentence"])
f.write("%d\n%s --&gt; %s\nSpeaker %s: %s\n\n" % (i+1, ts(s["start"], ","), ts(s["end"], ","), s["spk"], text))
with open("subs.vtt", "w", encoding="utf-8") as f:
f.write("WEBVTT\n\n")
for s in segments:
text = rich_transcription_postprocess(s["sentence"])
f.write("%s --&gt; %s\n&lt;v Speaker %s&gt;%s\n\n" % (ts(s["start"], "."), ts(s["end"], "."), s["spk"], text))</code></pre>
<p>Tested output (SRT):</p>
<pre><code>1
00:00:00,610 --&gt; 00:00:05,530
Speaker 0: 欢迎大家来体验达摩院推出的语音识别模型</code></pre>
<p>Always run <code>rich_transcription_postprocess</code> to strip SenseVoice tags like <code>&lt;|zh|&gt;</code>, otherwise they leak into your subtitles.</p>
<h2>Last (optional): burn subtitles into the video</h2>
<pre><code>ffmpeg -i video.mp4 -vf subtitles=subs.srt output.mp4</code></pre>
<h2>Why use FunASR for subtitles</h2>
<ul>
<li><strong>Local, free, private</strong> — no uploads, no API key, no per-minute fees.</li>
<li><strong>Fast</strong>: SenseVoice is non-autoregressive, far faster than Whisper (<a href="/en/blog/funasr-vs-whisper-benchmark.html">benchmark</a>) — long videos subtitle quickly.</li>
<li><strong>Stronger on Chinese</strong> + 50+ languages; built-in VAD segmentation, speaker labels, and real timestamps.</li>
</ul>
<div class="cta"><p>FunASR is Tongyi Lab's open-source, industrial-grade speech recognition toolkit.</p><a class="btn" href="https://github.com/modelscope/FunASR" target="_blank">Star FunASR on GitHub ★</a></div>
<!--related-posts-->
<h2>Related posts</h2>
<ul class="post-list">
<li><a href="/en/blog/funasr-vs-whisper-benchmark.html">FunASR vs Whisper Benchmark</a></li>
<li><a href="/en/blog/sensevoice-deployment-guide.html">SenseVoice Deployment Guide</a></li>
<li><a href="/en/blog/fun-asr-nano-guide.html">Fun-ASR-Nano Guide</a></li>
<li><a href="/en/blog/funasr-speaker-diarization.html">Speaker Diarization: Who Spoke When</a></li>
<li><a href="/en/blog/sensevoice-emotion-language-detection.html">Emotion & Language Detection</a></li>
<li><a href="/en/blog/funasr-realtime-streaming-asr.html">Real-Time Streaming Speech-to-Text</a></li>
<li><a href="/en/blog/funasr-transcribe-long-audio.html">Transcribe Long Audio (Hours in One Call)</a></li>
<li><a href="/en/blog/funasr-cli-transcribe-command-line.html">Transcribe from the Command Line</a></li>
<li><a href="/en/blog/self-hosted-openai-whisper-api-alternative.html">Self-Hosted OpenAI Whisper API Alternative</a></li>
<li><a href="/en/blog/speech-to-text-python-transcribe-audio.html">Speech to Text in Python</a></li>
<li><a href="/en/blog/funasr-llama-cpp-whisper-cpp-alternative.html">FunASR on llama.cpp (whisper.cpp Alternative)</a></li>
<li><a href="/en/blog/funasr-vs-faster-whisper-chinese.html">FunASR vs faster-whisper (Chinese/Cantonese)</a></li>
<li><a href="/en/blog/lightweight-speech-recognition-cpu.html">Lightweight Speech Recognition on CPU</a></li>
<li><a href="/en/blog/self-hosted-deepgram-assemblyai-alternative.html">Self-Hosted Deepgram/AssemblyAI Alternative</a></li>
<li><a href="/en/blog/which-funasr-model.html">Which FunASR Model?</a></li>
<li><a href="/en/blog/cantonese-speech-recognition.html">Cantonese Speech Recognition (SenseVoice)</a></li>
<li><a href="/en/blog/japanese-speech-recognition.html">Japanese Speech Recognition (SenseVoice)</a></li>
<li><a href="/en/blog/voice-activity-detection-python.html">Voice Activity Detection in Python</a></li>
<li><a href="/en/blog/self-hosted-google-aws-azure-speech-to-text.html">Self-Hosted Google/AWS/Azure STT Alternative</a></li>
<li><a href="/en/blog/chinese-speech-recognition.html">Chinese Speech Recognition in Python</a></li>
<li><a href="/en/blog/punctuation-restoration-python.html">Punctuation Restoration in Python</a></li>
<li><a href="/en/blog/speech-to-text-timestamps-python.html">Speech-to-Text with Timestamps in Python</a></li>
</ul>
</div></article>
<footer><div class="container">FunASR · Open-source speech recognition by Tongyi Lab · <a href="https://github.com/modelscope/FunASR">GitHub</a></div></footer>
</body></html>
File diff suppressed because one or more lines are too long
@@ -0,0 +1,144 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Japanese Speech Recognition in Python — SenseVoice: Transcription + Punctuation + Emotion in One Pass | FunASR Blog</title>
<meta name="description" content="How to do open-source Japanese speech-to-text? SenseVoice natively supports Japanese (ja), auto-detects the language, outputs punctuated text, and adds emotion & audio events. Real test on one clip: SenseVoice writes 転売 correctly, Whisper-small gives the homophone 天売. 3 lines of Python.">
<meta name="keywords" content="japanese speech recognition, japanese speech to text, japanese transcription, japanese asr, transcribe japanese audio, SenseVoice, open source speech recognition, Whisper alternative, FunASR, speech to text python">
<link rel="icon" href="/logo.png">
<meta property="og:title" content="Japanese Speech Recognition in Python — SenseVoice: Transcription + Punctuation + Emotion in One Pass | FunASR Blog">
<meta property="og:description" content="How to do open-source Japanese speech-to-text? SenseVoice natively supports Japanese (ja), auto-detects the language, outputs punctuated text, and adds emotion & audio events. Real test on one clip: SenseVoice writes 転売 correctly, Whisper-small gives the homophone 天売. 3 lines of Python.">
<meta property="og:type" content="article">
<meta property="og:url" content="https://www.funasr.com/en/blog/japanese-speech-recognition.html">
<meta property="og:image" content="https://www.funasr.com/logo.png">
<link rel="canonical" href="https://www.funasr.com/en/blog/japanese-speech-recognition.html">
<link rel="alternate" hreflang="en" href="https://www.funasr.com/en/blog/japanese-speech-recognition.html">
<link rel="alternate" hreflang="zh" href="https://www.funasr.com/blog/japanese-speech-recognition.html">
<link rel="alternate" hreflang="x-default" href="https://www.funasr.com/en/blog/japanese-speech-recognition.html">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"BlogPosting","headline":"Japanese Speech Recognition in Python — SenseVoice: Transcription + Punctuation + Emotion in One Pass | FunASR Blog","description":"How to do open-source Japanese speech-to-text? SenseVoice natively supports Japanese (ja), auto-detects the language, outputs punctuated text, and adds emotion & audio events. Real test on one clip: SenseVoice writes 転売 correctly, Whisper-small gives the homophone 天売. 3 lines of Python.","datePublished":"2026-06-22","dateModified":"2026-06-22","author":{"@type":"Organization","name":"FunASR / Tongyi Lab"},"publisher":{"@type":"Organization","name":"FunASR","logo":{"@type":"ImageObject","url":"https://www.funasr.com/logo.png"}},"mainEntityOfPage":{"@type":"WebPage","@id":"https://www.funasr.com/en/blog/japanese-speech-recognition.html"},"image":"https://www.funasr.com/logo.png"}
</script>
<style>:root{--primary:#2563eb;--primary-dark:#1d4ed8;--bg:#fff;--surface:#f8fafc;--border:#e2e8f0;--text:#0f172a;--text-soft:#475569;--text-muted:#94a3b8;--radius:12px}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:'Inter',-apple-system,sans-serif;color:var(--text);line-height:1.7}
a{color:var(--primary);text-decoration:none}a:hover{text-decoration:underline}
.container{max-width:800px;margin:0 auto;padding:0 24px}
.nav{position:fixed;top:0;left:0;right:0;z-index:100;background:rgba(255,255,255,0.9);backdrop-filter:blur(12px);border-bottom:1px solid var(--border);padding:14px 0}
.nav .container{max-width:1120px;display:flex;align-items:center;gap:24px}
.nav-logo{font-size:1.2rem;font-weight:800;color:var(--text)}.nav-logo span{color:var(--primary)}
.nav-links{display:flex;gap:20px;margin-left:auto;flex-wrap:wrap}
.nav-links a{font-size:0.85rem;font-weight:500;color:var(--text-soft)}
.nav-btn{padding:7px 16px;background:var(--primary);color:#fff;border-radius:7px;font-size:0.83rem;font-weight:600}
article{padding:120px 0 80px}
h1{font-size:2rem;font-weight:800;line-height:1.3;margin-bottom:14px}
h2{font-size:1.3rem;font-weight:700;margin:36px 0 14px;padding-top:16px;border-top:1px solid var(--border)}
h3{font-size:1.05rem;font-weight:700;margin:22px 0 10px}
p{margin-bottom:14px;color:var(--text-soft)}
ul,ol{margin:0 0 14px 22px;color:var(--text-soft)}li{margin-bottom:6px}
table{width:100%;border-collapse:collapse;margin:16px 0;font-size:0.86rem}
th,td{padding:10px 12px;text-align:left;border-bottom:1px solid var(--border)}
th{font-weight:600;background:var(--surface);font-size:0.78rem;color:var(--text-muted)}
pre{background:#1e293b;color:#e2e8f0;padding:18px;border-radius:10px;overflow-x:auto;font-size:0.82rem;line-height:1.7;margin:14px 0}
code{font-family:ui-monospace,Menlo,monospace}
p code,li code{background:var(--surface);padding:2px 6px;border-radius:5px;font-size:0.85em;color:var(--primary-dark)}
.post-meta{color:var(--text-muted);font-size:0.85rem;margin-bottom:24px}
.cta{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:24px;margin:28px 0;text-align:center}
.cta a.btn{display:inline-block;padding:10px 24px;background:var(--primary);color:#fff;border-radius:8px;font-weight:600}
.post-list{list-style:none;margin:0;padding:0}
.post-list li{margin:0 0 8px}
.post-card{display:block;border:1px solid var(--border);border-radius:var(--radius);padding:20px 22px;margin-bottom:14px}
.post-card:hover{border-color:var(--primary);text-decoration:none}
.post-card h2{border:none;padding:0;margin:0 0 6px;font-size:1.15rem;color:var(--text)}
.post-card p{margin:0;color:var(--text-soft);font-size:0.9rem}
.post-card .date{color:var(--text-muted);font-size:0.8rem}
footer{background:#0f172a;color:#94a3b8;padding:28px 0;text-align:center;font-size:0.8rem}
footer a{color:#94a3b8}</style>
</head>
<body>
<nav class="nav"><div class="container"><a href="/en/" class="nav-logo">Fun<span>ASR</span></a><div class="nav-links"><a href="/en/#capabilities">Capabilities</a><a href="/en/#usage">How to Use</a><a href="/en/#benchmark">Benchmark</a><a href="/en/#demo">Demo</a><a href="https://modelscope.github.io/FunASR/" target="_blank">Docs</a><a href="/en/quickstart.html">Quickstart</a><a href="/en/models.html">Models</a><a href="/en/ecosystem.html">Ecosystem</a><a href="/en/blog/">Blog</a><a href="/en/vs-whisper.html">vs Whisper</a><a href="/en/donors.html">Donors</a></div><a href="https://www.funasr.com/blog/japanese-speech-recognition.html" style="font-size:0.83rem;font-weight:500;color:var(--text-soft)">中文</a><a href="https://github.com/modelscope/FunASR" target="_blank" class="nav-btn">GitHub ★</a></div></nav>
<article><div class="container">
<h1>Japanese Speech Recognition in Python — SenseVoice Does Transcription + Punctuation + Emotion in One Pass (vs Whisper)</h1>
<p class="post-meta">2026-06-22 · FunASR Team</p>
<p>For Japanese speech-to-text, most people reach for Whisper. But if you want something that <strong>runs on CPU, is fast and accurate, and ships punctuation and emotion out of the box</strong>, <strong>SenseVoice</strong> (an open-source multilingual speech-understanding model from the FunAudioLLM team) is an underrated option: it natively supports Japanese (ja), auto-detects the language, and produces punctuated text in a single non-autoregressive pass — plus emotion and audio-event tags for free.</p>
<p>Below is a <strong>real side-by-side</strong> on the <strong>same Japanese clip</strong> between SenseVoice and the same-tier Whisper-small (both run on our server, nothing cherry-picked).</p>
<h2>Real comparison: the same Japanese audio</h2>
<p>The test clip is a piece of colloquial Japanese speech. Actual outputs from both models:</p>
<table>
<tr><th>Model</th><th>Detected language</th><th>Output</th></tr>
<tr><td><strong>SenseVoice</strong></td><td>auto → <code>ja</code></td><td>供給量が減る と ある程度は仕方ないんじゃね、<strong>転売</strong>の価格は論外だけど。</td></tr>
<tr><td>Whisper-small</td><td><code>ja</code></td><td>供給量が減るとある程度は仕方ないんじゃね<strong>天売</strong>の価格は論外だけど</td></tr>
</table>
<p>The key difference is the word <code>転売</code>:</p>
<ul>
<li><strong>SenseVoice writes <code>転売</code> correctly</strong> (<em>tenbai</em>, "resale / scalping") — which is exactly what the sentence is about (talking about resale prices).</li>
<li>Whisper-small produces the homophone <code>天売</code> — same reading (<em>tenbai</em>), but <strong>not a real word</strong>: a classic Japanese homophone/wrong-kanji error.</li>
<li>SenseVoice also <strong>adds punctuation (<code>、</code> <code>。</code>) automatically</strong>; the Whisper-small output has none.</li>
</ul>
<p>To be fair about the setup: this compares <strong>same-tier</strong> Whisper-small (a common CPU-friendly choice). A larger Whisper-large would usually fix this kind of homophone, but it is far bigger and slower; SenseVoice gets the word right at a <strong>small-model footprint</strong>, and throws in punctuation and emotion on top.</p>
<h2>Japanese ASR in three lines</h2>
<pre>pip install funasr
from funasr import AutoModel
from funasr.utils.postprocess_utils import rich_transcription_postprocess
model = AutoModel(model="iic/SenseVoiceSmall", disable_update=True)
res = model.generate(input="japanese.wav", language="auto", use_itn=True)
print(rich_transcription_postprocess(res[0]["text"]))
# 供給量が減る と ある程度は仕方ないんじゃね、転売の価格は論外だけど。</pre>
<p>Set <code>language</code> to <code>"ja"</code> explicitly, or use <code>"auto"</code> as above for automatic language ID — on this clip <code>auto</code> correctly resolves to <code>ja</code> with output identical to the explicit setting.</p>
<h2>What else the raw output carries</h2>
<p>SenseVoice's raw output begins with a set of tags:</p>
<pre>&lt;|ja|&gt;&lt;|NEUTRAL|&gt;&lt;|Speech|&gt;&lt;|withitn|&gt;供給量が減る と ある程度は仕方ないんじゃね、転売の価格は論外だけど。</pre>
<p>Meaning: <code>&lt;|ja|&gt;</code> = language is Japanese, <code>&lt;|NEUTRAL|&gt;</code> = emotion (neutral), <code>&lt;|Speech|&gt;</code> = audio event (clean speech; it can also flag BGM/laughter/applause), <code>&lt;|withitn|&gt;</code> = inverse text normalization applied. So while transcribing Japanese you also get <strong>language, emotion and audio events for free</strong>. One call to <code>rich_transcription_postprocess()</code> strips the tags to plain text.</p>
<h2>Why SenseVoice is worth a try for Japanese</h2>
<table>
<tr><th></th><th>SenseVoice</th><th>Whisper-small</th></tr>
<tr><td>Japanese homophone (転売)</td><td>✅ correct</td><td>❌ wrong (天売)</td></tr>
<tr><td>Automatic punctuation</td><td>✅ built-in</td><td>❌ none</td></tr>
<tr><td>Emotion / audio events</td><td>✅ in one pass</td><td>❌</td></tr>
<tr><td>Inverse text normalization</td><td>✅ built-in</td><td>partial</td></tr>
<tr><td>Speed</td><td>non-autoregressive, measured RTF≈0.04 (GPU)</td><td>autoregressive, slower</td></tr>
<tr><td>Multilingual</td><td>one model for 50+ languages (ja/ko/zh/yue/en…)</td><td>multilingual</td></tr>
<tr><td>License</td><td>open-source, commercial-friendly</td><td>open-source</td></tr>
</table>
<p>If your use case mixes <strong>Japanese + Chinese + English</strong> (cross-border support, subtitles, meetings), one SenseVoice model covers all of them and bundles emotion analysis. For its emotion/event detection, see <a href="/en/blog/sensevoice-emotion-language-detection.html">SenseVoice emotion &amp; audio event detection</a>; to pick a model, see the <a href="/en/blog/which-funasr-model.html">FunASR model selection guide</a>; and for Chinese accuracy, the <a href="/en/blog/funasr-vs-whisper-benchmark.html">FunASR vs Whisper benchmark</a>.</p>
<div class="cta"><p><strong>The whole FunASR stack is open-source</strong> — industrial-grade ASR / VAD / punctuation / speaker / emotion &amp; events / LLM-ASR, with Japanese and 50+ languages out of the box. If it helps, a GitHub Star really supports the project 👇</p><p><a class="btn" href="https://github.com/QwenAudio/SenseVoice" target="_blank">⭐ Star SenseVoice</a></p><p style="margin-top:10px;font-size:0.85rem">Also star:<a href="https://github.com/modelscope/FunASR" target="_blank">FunASR</a> · <a href="https://github.com/QwenAudio/Fun-ASR" target="_blank">Fun-ASR</a> · <a href="https://github.com/modelscope/FunClip" target="_blank">FunClip</a></p></div>
<!--related-posts-->
<h2>Related posts</h2>
<ul class="post-list">
<li><a href="/en/blog/funasr-vs-whisper-benchmark.html">FunASR vs Whisper Benchmark</a></li>
<li><a href="/en/blog/sensevoice-deployment-guide.html">SenseVoice Deployment Guide</a></li>
<li><a href="/en/blog/fun-asr-nano-guide.html">Fun-ASR-Nano Guide</a></li>
<li><a href="/en/blog/funasr-speaker-diarization.html">Speaker Diarization: Who Spoke When</a></li>
<li><a href="/en/blog/sensevoice-emotion-language-detection.html">Emotion & Language Detection</a></li>
<li><a href="/en/blog/funasr-realtime-streaming-asr.html">Real-Time Streaming Speech-to-Text</a></li>
<li><a href="/en/blog/funasr-transcribe-long-audio.html">Transcribe Long Audio (Hours in One Call)</a></li>
<li><a href="/en/blog/funasr-cli-transcribe-command-line.html">Transcribe from the Command Line</a></li>
<li><a href="/en/blog/self-hosted-openai-whisper-api-alternative.html">Self-Hosted OpenAI Whisper API Alternative</a></li>
<li><a href="/en/blog/generate-subtitles-srt-vtt-from-audio-video.html">Auto-Generate Subtitles (SRT / VTT)</a></li>
<li><a href="/en/blog/speech-to-text-python-transcribe-audio.html">Speech to Text in Python</a></li>
<li><a href="/en/blog/funasr-llama-cpp-whisper-cpp-alternative.html">FunASR on llama.cpp (whisper.cpp Alternative)</a></li>
<li><a href="/en/blog/funasr-vs-faster-whisper-chinese.html">FunASR vs faster-whisper (Chinese/Cantonese)</a></li>
<li><a href="/en/blog/lightweight-speech-recognition-cpu.html">Lightweight Speech Recognition on CPU</a></li>
<li><a href="/en/blog/self-hosted-deepgram-assemblyai-alternative.html">Self-Hosted Deepgram/AssemblyAI Alternative</a></li>
<li><a href="/en/blog/which-funasr-model.html">Which FunASR Model?</a></li>
<li><a href="/en/blog/cantonese-speech-recognition.html">Cantonese Speech Recognition (SenseVoice)</a></li>
<li><a href="/en/blog/voice-activity-detection-python.html">Voice Activity Detection in Python</a></li>
<li><a href="/en/blog/self-hosted-google-aws-azure-speech-to-text.html">Self-Hosted Google/AWS/Azure STT Alternative</a></li>
<li><a href="/en/blog/chinese-speech-recognition.html">Chinese Speech Recognition in Python</a></li>
<li><a href="/en/blog/punctuation-restoration-python.html">Punctuation Restoration in Python</a></li>
<li><a href="/en/blog/speech-to-text-timestamps-python.html">Speech-to-Text with Timestamps in Python</a></li>
</ul>
</div></article>
<footer><div class="container">© 2024-2026 Tongyi Lab, Alibaba Group · <a href="https://github.com/modelscope/FunASR/blob/main/LICENSE">MIT License</a></div></footer>
</body>
</html>
@@ -0,0 +1,116 @@
<!DOCTYPE html>
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>Lightweight Speech Recognition: Chinese ASR in ~250MB on CPU (no GPU/Python) | FunASR Blog</title><meta name="description" content="Run Chinese speech-to-text lightweightly on CPU/edge: FunASR's llama.cpp runtime is one binary + a 254MB q8 model, no GPU or Python, 0.16s on CPU, 7.99% CER — smaller than whisper.cpp small and ~3x more accurate on Chinese."><meta name="keywords" content="lightweight speech recognition, speech recognition on cpu, low memory asr, edge speech recognition, raspberry pi speech recognition, small asr model, whisper.cpp alternative, gguf, sensevoice">
<link rel="icon" href="/logo.png"><meta property="og:title" content="Lightweight Speech Recognition: Chinese ASR in ~250MB on CPU (no GPU/Python) | FunASR Blog"><meta property="og:description" content="Run Chinese speech-to-text lightweightly on CPU/edge: FunASR's llama.cpp runtime is one binary + a 254MB q8 model, no GPU or Python, 0.16s on CPU, 7.99% CER — smaller than whisper.cpp small and ~3x more accurate on Chinese.">
<meta property="og:type" content="article"><meta property="og:url" content="https://www.funasr.com/en/blog/lightweight-speech-recognition-cpu.html"><meta property="og:image" content="https://www.funasr.com/logo.png">
<link rel="canonical" href="https://www.funasr.com/en/blog/lightweight-speech-recognition-cpu.html"><link rel="alternate" hreflang="en" href="https://www.funasr.com/en/blog/lightweight-speech-recognition-cpu.html"><link rel="alternate" hreflang="zh" href="https://www.funasr.com/blog/lightweight-speech-recognition-cpu.html"><link rel="alternate" hreflang="x-default" href="https://www.funasr.com/en/blog/lightweight-speech-recognition-cpu.html">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"BlogPosting","headline":"Lightweight Speech Recognition: Chinese ASR in ~250MB on CPU (no GPU/Python) | FunASR Blog","description":"Run Chinese speech-to-text lightweightly on CPU/edge: FunASR's llama.cpp runtime is one binary + a 254MB q8 model, no GPU or Python, 0.16s on CPU, 7.99% CER — smaller than whisper.cpp small and ~3x more accurate on Chinese.","datePublished":"2026-06-22","dateModified":"2026-06-22","author":{"@type":"Organization","name":"FunASR / Tongyi Lab"},"publisher":{"@type":"Organization","name":"FunASR","logo":{"@type":"ImageObject","url":"https://www.funasr.com/logo.png"}},"mainEntityOfPage":{"@type":"WebPage","@id":"https://www.funasr.com/en/blog/lightweight-speech-recognition-cpu.html"},"image":"https://www.funasr.com/logo.png"}
</script>
<style>:root{--primary:#2563eb;--primary-dark:#1d4ed8;--bg:#fff;--surface:#f8fafc;--border:#e2e8f0;--text:#0f172a;--text-soft:#475569;--text-muted:#94a3b8;--radius:12px}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:'Inter',-apple-system,sans-serif;color:var(--text);line-height:1.7}
a{color:var(--primary);text-decoration:none}a:hover{text-decoration:underline}
.container{max-width:800px;margin:0 auto;padding:0 24px}
.nav{position:fixed;top:0;left:0;right:0;z-index:100;background:rgba(255,255,255,0.9);backdrop-filter:blur(12px);border-bottom:1px solid var(--border);padding:14px 0}
.nav .container{max-width:1120px;display:flex;align-items:center;gap:24px}
.nav-logo{font-size:1.2rem;font-weight:800;color:var(--text)}.nav-logo span{color:var(--primary)}
.nav-links{display:flex;gap:20px;margin-left:auto;flex-wrap:wrap}
.nav-links a{font-size:0.85rem;font-weight:500;color:var(--text-soft)}
.nav-btn{padding:7px 16px;background:var(--primary);color:#fff;border-radius:7px;font-size:0.83rem;font-weight:600}
article{padding:120px 0 80px}
h1{font-size:2rem;font-weight:800;line-height:1.3;margin-bottom:14px}
h2{font-size:1.3rem;font-weight:700;margin:36px 0 14px;padding-top:16px;border-top:1px solid var(--border)}
h3{font-size:1.05rem;font-weight:700;margin:22px 0 10px}
p{margin-bottom:14px;color:var(--text-soft)}
ul,ol{margin:0 0 14px 22px;color:var(--text-soft)}li{margin-bottom:6px}
table{width:100%;border-collapse:collapse;margin:16px 0;font-size:0.86rem}
th,td{padding:10px 12px;text-align:left;border-bottom:1px solid var(--border)}
th{font-weight:600;background:var(--surface);font-size:0.78rem;color:var(--text-muted)}
pre{background:#1e293b;color:#e2e8f0;padding:18px;border-radius:10px;overflow-x:auto;font-size:0.82rem;line-height:1.7;margin:14px 0}
code{font-family:ui-monospace,Menlo,monospace}
p code,li code{background:var(--surface);padding:2px 6px;border-radius:5px;font-size:0.85em;color:var(--primary-dark)}
.post-meta{color:var(--text-muted);font-size:0.85rem;margin-bottom:24px}
.cta{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:24px;margin:28px 0;text-align:center}
.cta a.btn{display:inline-block;padding:10px 24px;background:var(--primary);color:#fff;border-radius:8px;font-weight:600}
.post-list{list-style:none;margin:0;padding:0}
.post-list li{margin:0 0 8px}
.post-card{display:block;border:1px solid var(--border);border-radius:var(--radius);padding:20px 22px;margin-bottom:14px}
.post-card:hover{border-color:var(--primary);text-decoration:none}
.post-card h2{border:none;padding:0;margin:0 0 6px;font-size:1.15rem;color:var(--text)}
.post-card p{margin:0;color:var(--text-soft);font-size:0.9rem}
.post-card .date{color:var(--text-muted);font-size:0.8rem}
footer{background:#0f172a;color:#94a3b8;padding:28px 0;text-align:center;font-size:0.8rem}
footer a{color:#94a3b8}</style></head><body>
<nav class="nav"><div class="container"><a href="/en/" class="nav-logo">Fun<span>ASR</span></a><div class="nav-links"><a href="/en/#capabilities">Capabilities</a><a href="/en/#usage">How to Use</a><a href="/en/#benchmark">Benchmark</a><a href="/en/#demo">Demo</a><a href="https://modelscope.github.io/FunASR/" target="_blank">Docs</a><a href="/en/quickstart.html">Quickstart</a><a href="/en/models.html">Models</a><a href="/en/ecosystem.html">Ecosystem</a><a href="/en/blog/">Blog</a><a href="/en/vs-whisper.html">vs Whisper</a><a href="/en/donors.html">Donors</a></div><a href="https://www.funasr.com/blog/lightweight-speech-recognition-cpu.html" style="font-size:0.83rem;font-weight:500;color:var(--text-soft)">中文</a><a href="https://github.com/modelscope/FunASR" target="_blank" class="nav-btn">GitHub ★</a></div></nav>
<article><div class="container">
<h1>Lightweight speech-to-text: Chinese ASR in ~250 MB on CPU (no GPU, no Python)</h1>
<p class="post-meta">2026-06-22 · FunASR Team</p>
<p>Most speech recognition wants a GPU, a Python environment, and multi-GB models. If you just need to turn Chinese speech into text on a laptop, a small server, or an edge device, that's a lot of overhead.</p>
<p><strong>FunASR's llama.cpp / GGUF runtime</strong> strips it down to the minimum: **one self-contained binary + one quantized model file**, pure CPU, zero Python. The q8 build of SenseVoice is just **254 MB** with virtually unchanged accuracy.</p>
<h2>Tested: a 254 MB model, 0.16 s on CPU (real output)</h2>
<p>Grab a prebuilt binary (Linux/macOS/Windows) and a q8 model, then run:</p>
<pre># binaries are on Releases; then fetch a model
bash download-funasr-model.sh sensevoice ./gguf
llama-funasr-sensevoice -m ./gguf/sensevoice-small-q8.gguf --vad ./gguf/fsmn-vad.gguf -a audio.wav
# → 欢迎大家来体验达摩院推出的语音识别模型。 (CPU, 0.16 s)</pre>
<p>The model is 243–254 MB, the VAD just 1.7 MB, and detokenization is built into the binary (no Python).</p>
<h2>Small and accurate: vs whisper.cpp</h2>
<p>Both on CPU (Chinese, 184-file micro-CER, lower is better):</p>
<table>
<tr><th>Model</th><th>Size</th><th>Chinese CER ↓</th></tr>
<tr><td><strong>FunASR SenseVoice q8</strong></td><td><strong>254 MB</strong></td><td><strong>7.99%</strong></td></tr>
<tr><td><strong>FunASR Paraformer q8</strong></td><td><strong>237 MB</strong></td><td>9.78%</td></tr>
<tr><td>whisper.cpp small</td><td>466 MB</td><td>22.12%</td></tr>
<tr><td>whisper.cpp large-v3-turbo</td><td>1.6 GB</td><td>23.15%</td></tr>
</table>
<p>FunASR's q8 model is <strong>smaller than whisper.cpp small</strong> yet ~3× more accurate on Chinese.</p>
<h2>Even smaller: the quant matrix</h2>
<table>
<tr><th>Model</th><th>Type</th><th>Size</th><th>CER</th></tr>
<tr><td>SenseVoice encoder</td><td>q8</td><td>254 MB</td><td>7.99%</td></tr>
<tr><td>Paraformer encoder</td><td>q8</td><td>237 MB</td><td>9.78%</td></tr>
<tr><td>Fun-ASR-Nano LLM (+ encoder 470 MB)</td><td>q4_K_M</td><td>484 MB</td><td>8.35%</td></tr>
</table>
<p>Prebuilt binaries for Linux x64 / <strong>arm64</strong>, macOS arm64, Windows x64 — the arm64 build suits Raspberry Pi and edge boxes.</p>
<h2>Where to get it</h2>
<ul>
<li>Prebuilt binaries: <a href="https://github.com/modelscope/FunASR/releases" target="_blank">GitHub Releases</a> (tag <code>runtime-llamacpp-v*</code>)</li>
<li>One-page quickstart: <a href="/en/llama-cpp.html">funasr.com/llama-cpp</a></li>
<li>GGUF models: <a href="https://huggingface.co/FunAudioLLM" target="_blank">Hugging Face</a> / <a href="https://modelscope.cn/organization/FunAudioLLM" target="_blank">ModelScope</a></li>
</ul>
<div class="cta"><p><strong>FunASR is fully open-source &amp; commercial-friendly.</strong> A GitHub Star really helps 👇</p><p><a class="btn" href="https://github.com/modelscope/FunASR" target="_blank">⭐ Star FunASR</a></p><p style="margin-top:10px;font-size:0.85rem">Also star: <a href="https://github.com/QwenAudio/SenseVoice" target="_blank">SenseVoice</a> · <a href="https://github.com/QwenAudio/Fun-ASR" target="_blank">Fun-ASR</a> · <a href="https://github.com/modelscope/FunClip" target="_blank">FunClip</a></p></div>
<!--related-posts-->
<h2>Related posts</h2>
<ul class="post-list">
<li><a href="/en/blog/funasr-vs-whisper-benchmark.html">FunASR vs Whisper Benchmark</a></li>
<li><a href="/en/blog/sensevoice-deployment-guide.html">SenseVoice Deployment Guide</a></li>
<li><a href="/en/blog/fun-asr-nano-guide.html">Fun-ASR-Nano Guide</a></li>
<li><a href="/en/blog/funasr-speaker-diarization.html">Speaker Diarization: Who Spoke When</a></li>
<li><a href="/en/blog/sensevoice-emotion-language-detection.html">Emotion & Language Detection</a></li>
<li><a href="/en/blog/funasr-realtime-streaming-asr.html">Real-Time Streaming Speech-to-Text</a></li>
<li><a href="/en/blog/funasr-transcribe-long-audio.html">Transcribe Long Audio (Hours in One Call)</a></li>
<li><a href="/en/blog/funasr-cli-transcribe-command-line.html">Transcribe from the Command Line</a></li>
<li><a href="/en/blog/self-hosted-openai-whisper-api-alternative.html">Self-Hosted OpenAI Whisper API Alternative</a></li>
<li><a href="/en/blog/generate-subtitles-srt-vtt-from-audio-video.html">Auto-Generate Subtitles (SRT / VTT)</a></li>
<li><a href="/en/blog/speech-to-text-python-transcribe-audio.html">Speech to Text in Python</a></li>
<li><a href="/en/blog/funasr-llama-cpp-whisper-cpp-alternative.html">FunASR on llama.cpp (whisper.cpp Alternative)</a></li>
<li><a href="/en/blog/funasr-vs-faster-whisper-chinese.html">FunASR vs faster-whisper (Chinese/Cantonese)</a></li>
<li><a href="/en/blog/self-hosted-deepgram-assemblyai-alternative.html">Self-Hosted Deepgram/AssemblyAI Alternative</a></li>
<li><a href="/en/blog/which-funasr-model.html">Which FunASR Model?</a></li>
<li><a href="/en/blog/cantonese-speech-recognition.html">Cantonese Speech Recognition (SenseVoice)</a></li>
<li><a href="/en/blog/japanese-speech-recognition.html">Japanese Speech Recognition (SenseVoice)</a></li>
<li><a href="/en/blog/voice-activity-detection-python.html">Voice Activity Detection in Python</a></li>
<li><a href="/en/blog/self-hosted-google-aws-azure-speech-to-text.html">Self-Hosted Google/AWS/Azure STT Alternative</a></li>
<li><a href="/en/blog/chinese-speech-recognition.html">Chinese Speech Recognition in Python</a></li>
<li><a href="/en/blog/punctuation-restoration-python.html">Punctuation Restoration in Python</a></li>
<li><a href="/en/blog/speech-to-text-timestamps-python.html">Speech-to-Text with Timestamps in Python</a></li>
</ul>
</div></article>
<footer><div class="container">© 2024-2026 Tongyi Lab, Alibaba Group · <a href="https://github.com/modelscope/FunASR/blob/main/LICENSE">MIT License</a></div></footer>
</body></html>
@@ -0,0 +1,136 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Punctuation Restoration in Python — Add Punctuation to Text / ASR Output | FunASR Blog</title>
<meta name="description" content="How to add punctuation to unpunctuated text or ASR output? FunASR ct-punc is an open-source bilingual (Chinese + English) punctuation-restoration model: 3 lines of Python to add commas, periods, and question marks (and capitalize English), or attach to ASR in one line. With real output.">
<meta name="keywords" content="punctuation restoration, add punctuation to text python, restore punctuation, punctuation restoration model, punctuation prediction, ct-punc, ASR postprocessing, FunASR, speech to text punctuation">
<link rel="icon" href="/logo.png">
<meta property="og:title" content="Punctuation Restoration in Python — Add Punctuation to Text / ASR Output | FunASR Blog">
<meta property="og:description" content="How to add punctuation to unpunctuated text or ASR output? FunASR ct-punc is an open-source bilingual (Chinese + English) punctuation-restoration model: 3 lines of Python to add commas, periods, and question marks (and capitalize English), or attach to ASR in one line. With real output.">
<meta property="og:type" content="article">
<meta property="og:url" content="https://www.funasr.com/en/blog/punctuation-restoration-python.html">
<meta property="og:image" content="https://www.funasr.com/logo.png">
<link rel="canonical" href="https://www.funasr.com/en/blog/punctuation-restoration-python.html">
<link rel="alternate" hreflang="en" href="https://www.funasr.com/en/blog/punctuation-restoration-python.html">
<link rel="alternate" hreflang="zh" href="https://www.funasr.com/blog/punctuation-restoration-python.html">
<link rel="alternate" hreflang="x-default" href="https://www.funasr.com/en/blog/punctuation-restoration-python.html">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"BlogPosting","headline":"Punctuation Restoration in Python — Add Punctuation to Text / ASR Output | FunASR Blog","description":"How to add punctuation to unpunctuated text or ASR output? FunASR ct-punc is an open-source bilingual (Chinese + English) punctuation-restoration model: 3 lines of Python to add commas, periods, and question marks (and capitalize English), or attach to ASR in one line. With real output.","datePublished":"2026-06-23","dateModified":"2026-06-23","author":{"@type":"Organization","name":"FunASR / Tongyi Lab"},"publisher":{"@type":"Organization","name":"FunASR","logo":{"@type":"ImageObject","url":"https://www.funasr.com/logo.png"}},"mainEntityOfPage":{"@type":"WebPage","@id":"https://www.funasr.com/en/blog/punctuation-restoration-python.html"},"image":"https://www.funasr.com/logo.png"}
</script>
<style>:root{--primary:#2563eb;--primary-dark:#1d4ed8;--bg:#fff;--surface:#f8fafc;--border:#e2e8f0;--text:#0f172a;--text-soft:#475569;--text-muted:#94a3b8;--radius:12px}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:'Inter',-apple-system,sans-serif;color:var(--text);line-height:1.7}
a{color:var(--primary);text-decoration:none}a:hover{text-decoration:underline}
.container{max-width:800px;margin:0 auto;padding:0 24px}
.nav{position:fixed;top:0;left:0;right:0;z-index:100;background:rgba(255,255,255,0.9);backdrop-filter:blur(12px);border-bottom:1px solid var(--border);padding:14px 0}
.nav .container{max-width:1120px;display:flex;align-items:center;gap:24px}
.nav-logo{font-size:1.2rem;font-weight:800;color:var(--text)}.nav-logo span{color:var(--primary)}
.nav-links{display:flex;gap:20px;margin-left:auto;flex-wrap:wrap}
.nav-links a{font-size:0.85rem;font-weight:500;color:var(--text-soft)}
.nav-btn{padding:7px 16px;background:var(--primary);color:#fff;border-radius:7px;font-size:0.83rem;font-weight:600}
article{padding:120px 0 80px}
h1{font-size:2rem;font-weight:800;line-height:1.3;margin-bottom:14px}
h2{font-size:1.3rem;font-weight:700;margin:36px 0 14px;padding-top:16px;border-top:1px solid var(--border)}
h3{font-size:1.05rem;font-weight:700;margin:22px 0 10px}
p{margin-bottom:14px;color:var(--text-soft)}
ul,ol{margin:0 0 14px 22px;color:var(--text-soft)}li{margin-bottom:6px}
table{width:100%;border-collapse:collapse;margin:16px 0;font-size:0.86rem}
th,td{padding:10px 12px;text-align:left;border-bottom:1px solid var(--border)}
th{font-weight:600;background:var(--surface);font-size:0.78rem;color:var(--text-muted)}
pre{background:#1e293b;color:#e2e8f0;padding:18px;border-radius:10px;overflow-x:auto;font-size:0.82rem;line-height:1.7;margin:14px 0}
code{font-family:ui-monospace,Menlo,monospace}
p code,li code{background:var(--surface);padding:2px 6px;border-radius:5px;font-size:0.85em;color:var(--primary-dark)}
.post-meta{color:var(--text-muted);font-size:0.85rem;margin-bottom:24px}
.cta{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:24px;margin:28px 0;text-align:center}
.cta a.btn{display:inline-block;padding:10px 24px;background:var(--primary);color:#fff;border-radius:8px;font-weight:600}
.post-list{list-style:none;margin:0;padding:0}
.post-list li{margin:0 0 8px}
.post-card{display:block;border:1px solid var(--border);border-radius:var(--radius);padding:20px 22px;margin-bottom:14px}
.post-card:hover{border-color:var(--primary);text-decoration:none}
.post-card h2{border:none;padding:0;margin:0 0 6px;font-size:1.15rem;color:var(--text)}
.post-card p{margin:0;color:var(--text-soft);font-size:0.9rem}
.post-card .date{color:var(--text-muted);font-size:0.8rem}
footer{background:#0f172a;color:#94a3b8;padding:28px 0;text-align:center;font-size:0.8rem}
footer a{color:#94a3b8}</style>
</head>
<body>
<nav class="nav"><div class="container"><a href="/en/" class="nav-logo">Fun<span>ASR</span></a><div class="nav-links"><a href="/en/#capabilities">Capabilities</a><a href="/en/#usage">How to Use</a><a href="/en/#benchmark">Benchmark</a><a href="/en/#demo">Demo</a><a href="https://modelscope.github.io/FunASR/" target="_blank">Docs</a><a href="/en/quickstart.html">Quickstart</a><a href="/en/models.html">Models</a><a href="/en/ecosystem.html">Ecosystem</a><a href="/en/blog/">Blog</a><a href="/en/vs-whisper.html">vs Whisper</a><a href="/en/donors.html">Donors</a></div><a href="https://www.funasr.com/blog/punctuation-restoration-python.html" style="font-size:0.83rem;font-weight:500;color:var(--text-soft)">中文</a><a href="https://github.com/modelscope/FunASR" target="_blank" class="nav-btn">GitHub ★</a></div></nav>
<article><div class="container">
<h1>Punctuation Restoration in Python — Add Punctuation to Unpunctuated Text / ASR Output</h1>
<p class="post-meta">2026-06-23 · FunASR Team</p>
<p>Many speech recognition (ASR) models output <strong>unpunctuated</strong> text — one long run of words that is hard to read. <strong>Punctuation restoration</strong> adds the commas, periods, and question marks back so the transcript is readable. <strong>FunASR's <code>ct-punc</code></strong> is an open-source punctuation-restoration model that works for <strong>both Chinese and English</strong>, adding punctuation to any text in three lines of Python. Everything below is real measured output.</p>
<h2>Punctuation restoration in three lines (real output)</h2>
<pre>pip install funasr
from funasr import AutoModel
model = AutoModel(model="ct-punc", disable_update=True)
print(model.generate(input="the meeting is at 3 pm please bring your laptop and the report")[0]["text"])
# The meeting is at 3 pm, please bring your laptop and the report.</pre>
<p>The input is a continuous string with no punctuation; the output gets a comma, a period, and a capitalized first letter.</p>
<h2>Real Chinese &amp; English examples</h2>
<table>
<tr><th>Input (no punctuation)</th><th>Output (ct-punc)</th></tr>
<tr><td>the meeting is at 3 pm please bring your laptop and the report</td><td><strong>T</strong>he meeting is at 3 pm<strong>,</strong> please bring your laptop and the report<strong>.</strong></td></tr>
<tr><td>我们都是木头人不许说话不许动</td><td>我们都是木头人,不许说话,不许动。</td></tr>
<tr><td>今天天气怎么样我想出去走走你要一起吗</td><td>今天天气怎么样,我想出去走走,你要一起<strong>吗?</strong></td></tr>
</table>
<p>So: English gets commas, periods, and a capitalized first letter; Chinese gets ,。? — and it even picks a <strong>question mark</strong> for questions. One model handles both languages.</p>
<h2>The most common use: punctuate ASR output</h2>
<p>The biggest use of punctuation restoration is cleaning up speech-to-text output. FunASR's ASR models let you attach ct-punc <strong>in one line</strong> so the transcript comes out punctuated:</p>
<pre>from funasr import AutoModel
# ASR + VAD + punctuation in one call (Chinese Paraformer here)
model = AutoModel(model="paraformer-zh", vad_model="fsmn-vad", punc_model="ct-punc")
result = model.generate(input="audio.wav")
print(result[0]["text"]) # output already has punctuation</pre>
<p>You can also use ct-punc <strong>standalone</strong> on any text — not just speech. Old subtitles, OCR output, chat logs: anything unpunctuated can be punctuated.</p>
<h2>Why ct-punc</h2>
<table>
<tr><th></th><th>ct-punc (FunASR)</th></tr>
<tr><td>Languages</td><td>Chinese + English (one bilingual model)</td></tr>
<tr><td>Usage</td><td>3 lines of Python on raw text; or attach to ASR in one line</td></tr>
<tr><td>Punctuation</td><td>,。? etc.; also capitalizes the first letter in English</td></tr>
<tr><td>License</td><td>open-source, commercial-friendly</td></tr>
</table>
<p>For full speech pipelines, see <a href="/en/blog/chinese-speech-recognition.html">Chinese speech recognition</a>, <a href="/en/blog/voice-activity-detection-python.html">VAD / silence removal</a>, and <a href="/en/blog/funasr-speaker-diarization.html">speaker diarization</a>; to pick an ASR model, see the <a href="/en/blog/which-funasr-model.html">model selection guide</a> (default recommendation: the flagship Fun-ASR-Nano).</p>
<div class="cta"><p><strong>The whole FunASR stack is open-source (MIT)</strong> — punctuation restoration, ASR, VAD, speaker, emotion, LLM-ASR (flagship Fun-ASR-Nano), ready to use. If it helps, a GitHub Star supports the project 👇</p><p><a class="btn" href="https://github.com/modelscope/FunASR" target="_blank">⭐ Star FunASR</a></p><p style="margin-top:10px;font-size:0.85rem">Also star:<a href="https://github.com/QwenAudio/SenseVoice" target="_blank">SenseVoice</a> · <a href="https://github.com/QwenAudio/Fun-ASR" target="_blank">Fun-ASR</a> · <a href="https://github.com/modelscope/FunClip" target="_blank">FunClip</a></p></div>
<!--related-posts-->
<h2>Related posts</h2>
<ul class="post-list">
<li><a href="/en/blog/funasr-vs-whisper-benchmark.html">FunASR vs Whisper Benchmark</a></li>
<li><a href="/en/blog/sensevoice-deployment-guide.html">SenseVoice Deployment Guide</a></li>
<li><a href="/en/blog/fun-asr-nano-guide.html">Fun-ASR-Nano Guide</a></li>
<li><a href="/en/blog/funasr-speaker-diarization.html">Speaker Diarization: Who Spoke When</a></li>
<li><a href="/en/blog/sensevoice-emotion-language-detection.html">Emotion & Language Detection</a></li>
<li><a href="/en/blog/funasr-realtime-streaming-asr.html">Real-Time Streaming Speech-to-Text</a></li>
<li><a href="/en/blog/funasr-transcribe-long-audio.html">Transcribe Long Audio (Hours in One Call)</a></li>
<li><a href="/en/blog/funasr-cli-transcribe-command-line.html">Transcribe from the Command Line</a></li>
<li><a href="/en/blog/self-hosted-openai-whisper-api-alternative.html">Self-Hosted OpenAI Whisper API Alternative</a></li>
<li><a href="/en/blog/generate-subtitles-srt-vtt-from-audio-video.html">Auto-Generate Subtitles (SRT / VTT)</a></li>
<li><a href="/en/blog/speech-to-text-python-transcribe-audio.html">Speech to Text in Python</a></li>
<li><a href="/en/blog/funasr-llama-cpp-whisper-cpp-alternative.html">FunASR on llama.cpp (whisper.cpp Alternative)</a></li>
<li><a href="/en/blog/funasr-vs-faster-whisper-chinese.html">FunASR vs faster-whisper (Chinese/Cantonese)</a></li>
<li><a href="/en/blog/lightweight-speech-recognition-cpu.html">Lightweight Speech Recognition on CPU</a></li>
<li><a href="/en/blog/self-hosted-deepgram-assemblyai-alternative.html">Self-Hosted Deepgram/AssemblyAI Alternative</a></li>
<li><a href="/en/blog/which-funasr-model.html">Which FunASR Model?</a></li>
<li><a href="/en/blog/cantonese-speech-recognition.html">Cantonese Speech Recognition (SenseVoice)</a></li>
<li><a href="/en/blog/japanese-speech-recognition.html">Japanese Speech Recognition (SenseVoice)</a></li>
<li><a href="/en/blog/voice-activity-detection-python.html">Voice Activity Detection in Python</a></li>
<li><a href="/en/blog/self-hosted-google-aws-azure-speech-to-text.html">Self-Hosted Google/AWS/Azure STT Alternative</a></li>
<li><a href="/en/blog/chinese-speech-recognition.html">Chinese Speech Recognition in Python</a></li>
<li><a href="/en/blog/speech-to-text-timestamps-python.html">Speech-to-Text with Timestamps in Python</a></li>
</ul>
</div></article>
<footer><div class="container">© 2024-2026 Tongyi Lab, Alibaba Group · <a href="https://github.com/modelscope/FunASR/blob/main/LICENSE">MIT License</a></div></footer>
</body>
</html>
@@ -0,0 +1,106 @@
<!DOCTYPE html>
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>Self-Hosted Deepgram / AssemblyAI Alternative: Open-Source Speech-to-Text API | FunASR Blog</title><meta name="description" content="Looking to replace per-minute cloud STT APIs like Deepgram or AssemblyAI? FunASR is open-source, free, self-hostable, keeps audio local, leads on Chinese, and exposes an OpenAI-compatible /v1/audio/transcriptions — migrate by changing base_url."><meta name="keywords" content="deepgram alternative, assemblyai alternative, self-hosted speech to text api, open source speech recognition api, replace cloud stt, on-premise speech recognition, openai compatible stt, FunASR"><link rel="icon" href="/logo.png">
<meta property="og:title" content="Self-Hosted Deepgram / AssemblyAI Alternative: Open-Source Speech-to-Text API | FunASR Blog"><meta property="og:description" content="Looking to replace per-minute cloud STT APIs like Deepgram or AssemblyAI? FunASR is open-source, free, self-hostable, keeps audio local, leads on Chinese, and exposes an OpenAI-compatible /v1/audio/transcriptions — migrate by changing base_url."><meta property="og:type" content="article"><meta property="og:url" content="https://www.funasr.com/en/blog/self-hosted-deepgram-assemblyai-alternative.html"><meta property="og:image" content="https://www.funasr.com/logo.png">
<link rel="canonical" href="https://www.funasr.com/en/blog/self-hosted-deepgram-assemblyai-alternative.html"><link rel="alternate" hreflang="en" href="https://www.funasr.com/en/blog/self-hosted-deepgram-assemblyai-alternative.html"><link rel="alternate" hreflang="zh" href="https://www.funasr.com/blog/self-hosted-deepgram-assemblyai-alternative.html"><link rel="alternate" hreflang="x-default" href="https://www.funasr.com/en/blog/self-hosted-deepgram-assemblyai-alternative.html">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"BlogPosting","headline":"Self-Hosted Deepgram / AssemblyAI Alternative: Open-Source Speech-to-Text API | FunASR Blog","description":"Looking to replace per-minute cloud STT APIs like Deepgram or AssemblyAI? FunASR is open-source, free, self-hostable, keeps audio local, leads on Chinese, and exposes an OpenAI-compatible /v1/audio/transcriptions — migrate by changing base_url.","datePublished":"2026-06-23","dateModified":"2026-06-23","author":{"@type":"Organization","name":"FunASR / Tongyi Lab"},"publisher":{"@type":"Organization","name":"FunASR","logo":{"@type":"ImageObject","url":"https://www.funasr.com/logo.png"}},"mainEntityOfPage":{"@type":"WebPage","@id":"https://www.funasr.com/en/blog/self-hosted-deepgram-assemblyai-alternative.html"},"image":"https://www.funasr.com/logo.png"}
</script>
<style>:root{--primary:#2563eb;--primary-dark:#1d4ed8;--bg:#fff;--surface:#f8fafc;--border:#e2e8f0;--text:#0f172a;--text-soft:#475569;--text-muted:#94a3b8;--radius:12px}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:'Inter',-apple-system,sans-serif;color:var(--text);line-height:1.7}
a{color:var(--primary);text-decoration:none}a:hover{text-decoration:underline}
.container{max-width:800px;margin:0 auto;padding:0 24px}
.nav{position:fixed;top:0;left:0;right:0;z-index:100;background:rgba(255,255,255,0.9);backdrop-filter:blur(12px);border-bottom:1px solid var(--border);padding:14px 0}
.nav .container{max-width:1120px;display:flex;align-items:center;gap:24px}
.nav-logo{font-size:1.2rem;font-weight:800;color:var(--text)}.nav-logo span{color:var(--primary)}
.nav-links{display:flex;gap:20px;margin-left:auto;flex-wrap:wrap}
.nav-links a{font-size:0.85rem;font-weight:500;color:var(--text-soft)}
.nav-btn{padding:7px 16px;background:var(--primary);color:#fff;border-radius:7px;font-size:0.83rem;font-weight:600}
article{padding:120px 0 80px}
h1{font-size:2rem;font-weight:800;line-height:1.3;margin-bottom:14px}
h2{font-size:1.3rem;font-weight:700;margin:36px 0 14px;padding-top:16px;border-top:1px solid var(--border)}
h3{font-size:1.05rem;font-weight:700;margin:22px 0 10px}
p{margin-bottom:14px;color:var(--text-soft)}
ul,ol{margin:0 0 14px 22px;color:var(--text-soft)}li{margin-bottom:6px}
table{width:100%;border-collapse:collapse;margin:16px 0;font-size:0.86rem}
th,td{padding:10px 12px;text-align:left;border-bottom:1px solid var(--border)}
th{font-weight:600;background:var(--surface);font-size:0.78rem;color:var(--text-muted)}
pre{background:#1e293b;color:#e2e8f0;padding:18px;border-radius:10px;overflow-x:auto;font-size:0.82rem;line-height:1.7;margin:14px 0}
code{font-family:ui-monospace,Menlo,monospace}
p code,li code{background:var(--surface);padding:2px 6px;border-radius:5px;font-size:0.85em;color:var(--primary-dark)}
.post-meta{color:var(--text-muted);font-size:0.85rem;margin-bottom:24px}
.cta{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:24px;margin:28px 0;text-align:center}
.cta a.btn{display:inline-block;padding:10px 24px;background:var(--primary);color:#fff;border-radius:8px;font-weight:600}
.post-list{list-style:none;margin:0;padding:0}
.post-list li{margin:0 0 8px}
.post-card{display:block;border:1px solid var(--border);border-radius:var(--radius);padding:20px 22px;margin-bottom:14px}
.post-card:hover{border-color:var(--primary);text-decoration:none}
.post-card h2{border:none;padding:0;margin:0 0 6px;font-size:1.15rem;color:var(--text)}
.post-card p{margin:0;color:var(--text-soft);font-size:0.9rem}
.post-card .date{color:var(--text-muted);font-size:0.8rem}
footer{background:#0f172a;color:#94a3b8;padding:28px 0;text-align:center;font-size:0.8rem}
footer a{color:#94a3b8}
@media(max-width:900px){.nav-links{display:none}.nav .container{gap:16px}.nav-logo{margin-right:auto}h1{font-size:1.75rem}table{table-layout:fixed;font-size:0.78rem}th,td{padding:8px 4px;overflow-wrap:anywhere}p code,li code{overflow-wrap:anywhere;word-break:break-word}}
</style></head><body>
<nav class="nav"><div class="container"><a href="/en/" class="nav-logo">Fun<span>ASR</span></a><div class="nav-links"><a href="/en/#capabilities">Capabilities</a><a href="/en/#usage">How to Use</a><a href="/en/#benchmark">Benchmark</a><a href="/en/#demo">Demo</a><a href="https://modelscope.github.io/FunASR/" target="_blank">Docs</a><a href="/en/quickstart.html">Quickstart</a><a href="/en/models.html">Models</a><a href="/en/ecosystem.html">Ecosystem</a><a href="/en/blog/">Blog</a><a href="/en/vs-whisper.html">vs Whisper</a><a href="/en/donors.html">Donors</a></div><a href="https://www.funasr.com/blog/self-hosted-deepgram-assemblyai-alternative.html" style="font-size:0.83rem;font-weight:500;color:var(--text-soft)">中文</a><a href="https://github.com/modelscope/FunASR" target="_blank" class="nav-btn">GitHub ★</a></div></nav>
<article><div class="container">
<h1>Self-Hosted Alternative to Deepgram &amp; AssemblyAI: Open-Source, Free, Data Stays Local</h1>
<p class="post-meta">2026-06-23 · FunASR Team</p>
<p>Cloud speech-to-text APIs like Deepgram, AssemblyAI and Google/Azure Speech bill per minute and require uploading your audio to a third party. If you want to <strong>self-host, pay no per-minute fees, and keep audio on your own machines</strong> — especially for Chinese — <a href="https://github.com/modelscope/FunASR" target="_blank">FunASR</a> is a direct open-source alternative with a built-in <strong>OpenAI-compatible transcription API</strong>: clients just change the base URL.</p>
<h2>Comparison</h2>
<table>
<tr><th></th><th>FunASR (self-hosted)</th><th>Deepgram / AssemblyAI</th></tr>
<tr><td>Price</td><td><strong>Free (MIT), no per-minute billing</strong></td><td>Pay per minute</td></tr>
<tr><td>Deployment</td><td>Self-hosted (local / private cloud / edge)</td><td>Cloud API (managed)</td></tr>
<tr><td>Data privacy</td><td><strong>Audio never leaves your machine</strong></td><td>Uploaded to vendor</td></tr>
<tr><td>Chinese / Cantonese</td><td><strong>Industry-leading</strong></td><td>English-first</td></tr>
<tr><td>Interface</td><td>OpenAI-compatible (drop-in)</td><td>Proprietary SDKs</td></tr>
<tr><td>Offline / CPU</td><td>✅ (incl. <a href="/en/llama-cpp.html">llama.cpp single binary</a>)</td><td>❌ cloud only</td></tr>
</table>
<p>Cloud APIs win on zero-ops, elastic scaling, and mature English/value-added features; FunASR wins on cost, self-hosting, privacy, and Chinese. Choose by your needs.</p>
<h2>Run an OpenAI-compatible local STT server</h2>
<pre>pip install funasr
funasr-server --model sensevoice --device cuda # or --device cpu
# → POST http://localhost:8000/v1/audio/transcriptions</pre>
<p>Then any OpenAI client just changes <code>base_url</code> — no business-code changes:</p>
<pre>from openai import OpenAI
client = OpenAI(base_url="http://localhost:8000/v1", api_key="not-needed")
text = client.audio.transcriptions.create(model="sensevoice", file=open("audio.wav","rb")).text</pre>
<p>Migrating from Deepgram/AssemblyAI or the OpenAI Whisper API: point requests at your own funasr-server — usage bills go to zero and audio stays local.</p>
<h2>Which model?</h2>
<p>Use SenseVoice for multilingual + emotion; Paraformer for Chinese + timestamps/hotwords; flagship Fun-ASR-Nano for zh/en/ja plus Chinese dialects/accents; and the separate Fun-ASR-MLT-Nano for 31 languages. See the <a href="/en/blog/which-funasr-model.html">model selection guide</a>.</p>
<div class="cta"><p><strong>FunASR is open-source, commercial-friendly, and self-hostable.</strong> A Star really helps 👇</p><p><a class="btn" href="https://github.com/modelscope/FunASR" target="_blank">⭐ Star FunASR</a></p><p style="margin-top:10px;font-size:0.85rem">Also: <a href="https://github.com/QwenAudio/SenseVoice" target="_blank">SenseVoice</a> · <a href="https://github.com/QwenAudio/Fun-ASR" target="_blank">Fun-ASR</a> · <a href="https://github.com/modelscope/FunClip" target="_blank">FunClip</a></p></div>
<!--related-posts-->
<h2>Related posts</h2>
<ul class="post-list">
<li><a href="/en/blog/funasr-vs-whisper-benchmark.html">FunASR vs Whisper Benchmark</a></li>
<li><a href="/en/blog/sensevoice-deployment-guide.html">SenseVoice Deployment Guide</a></li>
<li><a href="/en/blog/fun-asr-nano-guide.html">Fun-ASR-Nano Guide</a></li>
<li><a href="/en/blog/funasr-speaker-diarization.html">Speaker Diarization: Who Spoke When</a></li>
<li><a href="/en/blog/sensevoice-emotion-language-detection.html">Emotion & Language Detection</a></li>
<li><a href="/en/blog/funasr-realtime-streaming-asr.html">Real-Time Streaming Speech-to-Text</a></li>
<li><a href="/en/blog/funasr-transcribe-long-audio.html">Transcribe Long Audio (Hours in One Call)</a></li>
<li><a href="/en/blog/funasr-cli-transcribe-command-line.html">Transcribe from the Command Line</a></li>
<li><a href="/en/blog/self-hosted-openai-whisper-api-alternative.html">Self-Hosted OpenAI Whisper API Alternative</a></li>
<li><a href="/en/blog/generate-subtitles-srt-vtt-from-audio-video.html">Auto-Generate Subtitles (SRT / VTT)</a></li>
<li><a href="/en/blog/speech-to-text-python-transcribe-audio.html">Speech to Text in Python</a></li>
<li><a href="/en/blog/funasr-llama-cpp-whisper-cpp-alternative.html">FunASR on llama.cpp (whisper.cpp Alternative)</a></li>
<li><a href="/en/blog/funasr-vs-faster-whisper-chinese.html">FunASR vs faster-whisper (Chinese/Cantonese)</a></li>
<li><a href="/en/blog/lightweight-speech-recognition-cpu.html">Lightweight Speech Recognition on CPU</a></li>
<li><a href="/en/blog/which-funasr-model.html">Which FunASR Model?</a></li>
<li><a href="/en/blog/cantonese-speech-recognition.html">Cantonese Speech Recognition (SenseVoice)</a></li>
<li><a href="/en/blog/japanese-speech-recognition.html">Japanese Speech Recognition (SenseVoice)</a></li>
<li><a href="/en/blog/voice-activity-detection-python.html">Voice Activity Detection in Python</a></li>
<li><a href="/en/blog/self-hosted-google-aws-azure-speech-to-text.html">Self-Hosted Google/AWS/Azure STT Alternative</a></li>
<li><a href="/en/blog/chinese-speech-recognition.html">Chinese Speech Recognition in Python</a></li>
<li><a href="/en/blog/punctuation-restoration-python.html">Punctuation Restoration in Python</a></li>
<li><a href="/en/blog/speech-to-text-timestamps-python.html">Speech-to-Text with Timestamps in Python</a></li>
</ul>
</div></article>
<footer><div class="container">© 2024-2026 Tongyi Lab, Alibaba Group · <a href="https://github.com/modelscope/FunASR/blob/main/LICENSE">MIT License</a></div></footer>
</body></html>
@@ -0,0 +1,147 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Self-Hosted Speech-to-Text — Free Alternative to Google / AWS / Azure Cloud Speech APIs | FunASR Blog</title>
<meta name="description" content="Looking to replace Google Cloud Speech-to-Text / AWS Transcribe / Azure Speech? FunASR is an open-source (MIT), self-hosted speech-to-text option: local inference, no per-minute billing, audio stays on your network, strong Chinese, and OpenAI-compatible so you migrate by changing base_url. With runnable code and a cost comparison.">
<meta name="keywords" content="self-hosted speech to text, google speech to text alternative, aws transcribe alternative, azure speech alternative, cloud speech api alternative, open source speech to text, offline speech recognition, FunASR, speech to text self hosted">
<link rel="icon" href="/logo.png">
<meta property="og:title" content="Self-Hosted Speech-to-Text — Free Alternative to Google / AWS / Azure Cloud Speech APIs | FunASR Blog">
<meta property="og:description" content="Looking to replace Google Cloud Speech-to-Text / AWS Transcribe / Azure Speech? FunASR is an open-source (MIT), self-hosted speech-to-text option: local inference, no per-minute billing, audio stays on your network, strong Chinese, and OpenAI-compatible so you migrate by changing base_url. With runnable code and a cost comparison.">
<meta property="og:type" content="article">
<meta property="og:url" content="https://www.funasr.com/en/blog/self-hosted-google-aws-azure-speech-to-text.html">
<meta property="og:image" content="https://www.funasr.com/logo.png">
<link rel="canonical" href="https://www.funasr.com/en/blog/self-hosted-google-aws-azure-speech-to-text.html">
<link rel="alternate" hreflang="en" href="https://www.funasr.com/en/blog/self-hosted-google-aws-azure-speech-to-text.html">
<link rel="alternate" hreflang="zh" href="https://www.funasr.com/blog/self-hosted-google-aws-azure-speech-to-text.html">
<link rel="alternate" hreflang="x-default" href="https://www.funasr.com/en/blog/self-hosted-google-aws-azure-speech-to-text.html">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"BlogPosting","headline":"Self-Hosted Speech-to-Text — Free Alternative to Google / AWS / Azure Cloud Speech APIs | FunASR Blog","description":"Looking to replace Google Cloud Speech-to-Text / AWS Transcribe / Azure Speech? FunASR is an open-source (MIT), self-hosted speech-to-text option: local inference, no per-minute billing, audio stays on your network, strong Chinese, and OpenAI-compatible so you migrate by changing base_url. With runnable code and a cost comparison.","datePublished":"2026-06-22","dateModified":"2026-06-22","author":{"@type":"Organization","name":"FunASR / Tongyi Lab"},"publisher":{"@type":"Organization","name":"FunASR","logo":{"@type":"ImageObject","url":"https://www.funasr.com/logo.png"}},"mainEntityOfPage":{"@type":"WebPage","@id":"https://www.funasr.com/en/blog/self-hosted-google-aws-azure-speech-to-text.html"},"image":"https://www.funasr.com/logo.png"}
</script>
<style>:root{--primary:#2563eb;--primary-dark:#1d4ed8;--bg:#fff;--surface:#f8fafc;--border:#e2e8f0;--text:#0f172a;--text-soft:#475569;--text-muted:#94a3b8;--radius:12px}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:'Inter',-apple-system,sans-serif;color:var(--text);line-height:1.7}
a{color:var(--primary);text-decoration:none}a:hover{text-decoration:underline}
.container{max-width:800px;margin:0 auto;padding:0 24px}
.nav{position:fixed;top:0;left:0;right:0;z-index:100;background:rgba(255,255,255,0.9);backdrop-filter:blur(12px);border-bottom:1px solid var(--border);padding:14px 0}
.nav .container{max-width:1120px;display:flex;align-items:center;gap:24px}
.nav-logo{font-size:1.2rem;font-weight:800;color:var(--text)}.nav-logo span{color:var(--primary)}
.nav-links{display:flex;gap:20px;margin-left:auto;flex-wrap:wrap}
.nav-links a{font-size:0.85rem;font-weight:500;color:var(--text-soft)}
.nav-btn{padding:7px 16px;background:var(--primary);color:#fff;border-radius:7px;font-size:0.83rem;font-weight:600}
article{padding:120px 0 80px}
h1{font-size:2rem;font-weight:800;line-height:1.3;margin-bottom:14px}
h2{font-size:1.3rem;font-weight:700;margin:36px 0 14px;padding-top:16px;border-top:1px solid var(--border)}
h3{font-size:1.05rem;font-weight:700;margin:22px 0 10px}
p{margin-bottom:14px;color:var(--text-soft)}
ul,ol{margin:0 0 14px 22px;color:var(--text-soft)}li{margin-bottom:6px}
table{width:100%;border-collapse:collapse;margin:16px 0;font-size:0.86rem}
th,td{padding:10px 12px;text-align:left;border-bottom:1px solid var(--border)}
th{font-weight:600;background:var(--surface);font-size:0.78rem;color:var(--text-muted)}
pre{background:#1e293b;color:#e2e8f0;padding:18px;border-radius:10px;overflow-x:auto;font-size:0.82rem;line-height:1.7;margin:14px 0}
code{font-family:ui-monospace,Menlo,monospace}
p code,li code{background:var(--surface);padding:2px 6px;border-radius:5px;font-size:0.85em;color:var(--primary-dark)}
.post-meta{color:var(--text-muted);font-size:0.85rem;margin-bottom:24px}
.cta{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:24px;margin:28px 0;text-align:center}
.cta a.btn{display:inline-block;padding:10px 24px;background:var(--primary);color:#fff;border-radius:8px;font-weight:600}
.post-list{list-style:none;margin:0;padding:0}
.post-list li{margin:0 0 8px}
.post-card{display:block;border:1px solid var(--border);border-radius:var(--radius);padding:20px 22px;margin-bottom:14px}
.post-card:hover{border-color:var(--primary);text-decoration:none}
.post-card h2{border:none;padding:0;margin:0 0 6px;font-size:1.15rem;color:var(--text)}
.post-card p{margin:0;color:var(--text-soft);font-size:0.9rem}
.post-card .date{color:var(--text-muted);font-size:0.8rem}
footer{background:#0f172a;color:#94a3b8;padding:28px 0;text-align:center;font-size:0.8rem}
footer a{color:#94a3b8}</style>
</head>
<body>
<nav class="nav"><div class="container"><a href="/en/" class="nav-logo">Fun<span>ASR</span></a><div class="nav-links"><a href="/en/#capabilities">Capabilities</a><a href="/en/#usage">How to Use</a><a href="/en/#benchmark">Benchmark</a><a href="/en/#demo">Demo</a><a href="https://modelscope.github.io/FunASR/" target="_blank">Docs</a><a href="/en/quickstart.html">Quickstart</a><a href="/en/models.html">Models</a><a href="/en/ecosystem.html">Ecosystem</a><a href="/en/blog/">Blog</a><a href="/en/vs-whisper.html">vs Whisper</a><a href="/en/donors.html">Donors</a></div><a href="https://www.funasr.com/blog/self-hosted-google-aws-azure-speech-to-text.html" style="font-size:0.83rem;font-weight:500;color:var(--text-soft)">中文</a><a href="https://github.com/modelscope/FunASR" target="_blank" class="nav-btn">GitHub ★</a></div></nav>
<article><div class="container">
<h1>Self-Hosted Speech-to-Text — A Free, Open-Source Alternative to Google / AWS / Azure Cloud Speech APIs</h1>
<p class="post-meta">2026-06-22 · FunASR Team</p>
<p>Cloud speech APIs like Google Cloud Speech-to-Text, AWS Transcribe, and Azure Speech are convenient — fully managed, auto-scaling, zero ops. But as volume grows or compliance matters, their downsides show: <strong>per-minute billing (expensive at scale), audio is uploaded to the vendor's cloud (privacy / compliance / data-residency), rate limits, internet dependency, and limited customization</strong>.</p>
<p><strong>FunASR</strong> (open-sourced by Tongyi Lab) is a mature self-hosted alternative: <strong>open-source and free (MIT, commercial-friendly), runs on your own machine (fully offline-capable), no per-minute billing, and your audio never leaves your network</strong>. It's especially strong on Chinese and Asian languages, and ships an <strong>OpenAI-compatible API</strong> so migration is nearly free. Here's runnable code.</p>
<h2>Transcribe locally in 4 lines (real output)</h2>
<pre>pip install funasr
from funasr import AutoModel
from funasr.utils.postprocess_utils import rich_transcription_postprocess
model = AutoModel(model="iic/SenseVoiceSmall", disable_update=True) # uses CPU if no GPU
res = model.generate(input="audio.wav", language="auto", use_itn=True)
print(rich_transcription_postprocess(res[0]["text"]))
# 欢迎大家来体验达摩院推出的语音识别模型。 (output for a Chinese sample)</pre>
<p>The model downloads on first run, then everything is local inference — <strong>no API key, no per-minute bill, no audio uploaded anywhere</strong>.</p>
<h2>Already on a cloud API? Migrate by changing the base_url</h2>
<p>FunASR ships an <strong>OpenAI-compatible transcription server</strong>, so if your app already calls a cloud SDK you often only point <code>base_url</code> at your own service:</p>
<pre># start a local server (OpenAI-compatible /v1/audio/transcriptions)
funasr-server --model sensevoice --device cuda
# client: the OpenAI SDK, just change base_url to your server
from openai import OpenAI
client = OpenAI(base_url="http://localhost:8000/v1", api_key="not-needed")
text = client.audio.transcriptions.create(model="sensevoice", file=open("audio.wav","rb")).text</pre>
<h2>FunASR vs cloud speech APIs</h2>
<table>
<tr><th></th><th>FunASR (self-hosted)</th><th>Cloud STT (Google/AWS/Azure)</th></tr>
<tr><td>Pricing</td><td>open-source &amp; free; fixed machine cost only</td><td>per-minute, scales linearly with usage</td></tr>
<tr><td>Data</td><td>stays on your servers (offline-capable)</td><td>audio uploaded to the vendor cloud</td></tr>
<tr><td>Deployment</td><td>you run it (pip / Docker)</td><td>fully managed, zero ops</td></tr>
<tr><td>Languages</td><td>50+, very strong Chinese/Asian</td><td>many (varies by vendor)</td></tr>
<tr><td>Speaker diarization</td><td>✅ built-in (cam++)</td><td>✅ (extra cost/config)</td></tr>
<tr><td>Emotion / audio events</td><td>✅ (SenseVoice)</td><td>mostly ❌</td></tr>
<tr><td>Customization / fine-tune</td><td>✅ full model access</td><td>limited</td></tr>
<tr><td>Offline / air-gapped</td><td>✅</td><td>❌</td></tr>
<tr><td>License</td><td>open-source, commercial-friendly</td><td>proprietary</td></tr>
</table>
<p>To be fair: if what you want is <strong>zero ops, elastic scale, and no machines to manage</strong>, a managed cloud API is still the easy choice. FunASR's trade-off is that you run one machine of your own in exchange for <strong>controllable cost, private data, offline capability, and full customization</strong>.</p>
<h2>When self-hosting pays off</h2>
<p>Cloud STT typically bills per audio minute (roughly <strong>$0.6–$1.5 per audio hour</strong> depending on vendor/tier). So <strong>1,000 hours/month</strong> is about $600–$1,500/month and grows linearly, whereas a self-hosted FunASR instance is a <strong>fixed machine cost, largely independent of volume</strong>. Self-hosting usually wins when any of these hold:</p>
<ul>
<li><strong>High volume</strong>: lots of audio per month, where per-minute bills dwarf one machine's cost;</li>
<li><strong>Sensitive data</strong>: healthcare/finance/government, where audio can't leave your network;</li>
<li><strong>Offline / air-gapped</strong> deployment environments;</li>
<li><strong>Chinese / dialects / Asian languages</strong> as the primary need, where you want stronger local accuracy and customization.</li>
</ul>
<p>See also: the <a href="/en/blog/self-hosted-openai-whisper-api-alternative.html">self-hosted OpenAI Whisper API alternative</a>, the <a href="/en/blog/self-hosted-deepgram-assemblyai-alternative.html">Deepgram/AssemblyAI alternative</a>, the <a href="/en/blog/funasr-vs-whisper-benchmark.html">FunASR vs Whisper benchmark</a>, and the <a href="/en/blog/which-funasr-model.html">model selection guide</a>.</p>
<div class="cta"><p><strong>The whole FunASR stack is open-source (MIT)</strong> — industrial-grade ASR / VAD / punctuation / speaker / emotion &amp; events / LLM-ASR, self-hosted and commercial-friendly. If it helps, a GitHub Star really supports the project 👇</p><p><a class="btn" href="https://github.com/modelscope/FunASR" target="_blank">⭐ Star FunASR</a></p><p style="margin-top:10px;font-size:0.85rem">Also star:<a href="https://github.com/QwenAudio/SenseVoice" target="_blank">SenseVoice</a> · <a href="https://github.com/QwenAudio/Fun-ASR" target="_blank">Fun-ASR</a> · <a href="https://github.com/modelscope/FunClip" target="_blank">FunClip</a></p></div>
<!--related-posts-->
<h2>Related posts</h2>
<ul class="post-list">
<li><a href="/en/blog/funasr-vs-whisper-benchmark.html">FunASR vs Whisper Benchmark</a></li>
<li><a href="/en/blog/sensevoice-deployment-guide.html">SenseVoice Deployment Guide</a></li>
<li><a href="/en/blog/fun-asr-nano-guide.html">Fun-ASR-Nano Guide</a></li>
<li><a href="/en/blog/funasr-speaker-diarization.html">Speaker Diarization: Who Spoke When</a></li>
<li><a href="/en/blog/sensevoice-emotion-language-detection.html">Emotion & Language Detection</a></li>
<li><a href="/en/blog/funasr-realtime-streaming-asr.html">Real-Time Streaming Speech-to-Text</a></li>
<li><a href="/en/blog/funasr-transcribe-long-audio.html">Transcribe Long Audio (Hours in One Call)</a></li>
<li><a href="/en/blog/funasr-cli-transcribe-command-line.html">Transcribe from the Command Line</a></li>
<li><a href="/en/blog/self-hosted-openai-whisper-api-alternative.html">Self-Hosted OpenAI Whisper API Alternative</a></li>
<li><a href="/en/blog/generate-subtitles-srt-vtt-from-audio-video.html">Auto-Generate Subtitles (SRT / VTT)</a></li>
<li><a href="/en/blog/speech-to-text-python-transcribe-audio.html">Speech to Text in Python</a></li>
<li><a href="/en/blog/funasr-llama-cpp-whisper-cpp-alternative.html">FunASR on llama.cpp (whisper.cpp Alternative)</a></li>
<li><a href="/en/blog/funasr-vs-faster-whisper-chinese.html">FunASR vs faster-whisper (Chinese/Cantonese)</a></li>
<li><a href="/en/blog/lightweight-speech-recognition-cpu.html">Lightweight Speech Recognition on CPU</a></li>
<li><a href="/en/blog/self-hosted-deepgram-assemblyai-alternative.html">Self-Hosted Deepgram/AssemblyAI Alternative</a></li>
<li><a href="/en/blog/which-funasr-model.html">Which FunASR Model?</a></li>
<li><a href="/en/blog/cantonese-speech-recognition.html">Cantonese Speech Recognition (SenseVoice)</a></li>
<li><a href="/en/blog/japanese-speech-recognition.html">Japanese Speech Recognition (SenseVoice)</a></li>
<li><a href="/en/blog/voice-activity-detection-python.html">Voice Activity Detection in Python</a></li>
<li><a href="/en/blog/chinese-speech-recognition.html">Chinese Speech Recognition in Python</a></li>
<li><a href="/en/blog/punctuation-restoration-python.html">Punctuation Restoration in Python</a></li>
<li><a href="/en/blog/speech-to-text-timestamps-python.html">Speech-to-Text with Timestamps in Python</a></li>
</ul>
</div></article>
<footer><div class="container">© 2024-2026 Tongyi Lab, Alibaba Group · <a href="https://github.com/modelscope/FunASR/blob/main/LICENSE">MIT License</a></div></footer>
</body>
</html>
@@ -0,0 +1,151 @@
<!DOCTYPE html>
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>Self-Hosted OpenAI Whisper API Alternative: Drop-in /v1/audio/transcriptions with FunASR | FunASR</title><meta name="description" content="Run an OpenAI-compatible speech-to-text server with FunASR: `funasr-server` exposes /v1/audio/transcriptions, and the OpenAI SDK works by changing only base_url. Local, free, private, stronger on Chinese, faster than Whisper. All code tested."><meta name="keywords" content="openai whisper api alternative, self-hosted speech to text api, openai audio transcriptions api, whisper api self-hosted, /v1/audio/transcriptions, openai compatible asr, replace openai whisper api, local whisper api, private speech to text api, funasr server">
<link rel="icon" href="/logo.png"><meta property="og:title" content="Self-Hosted OpenAI Whisper API Alternative: Drop-in /v1/audio/transcriptions with FunASR"><meta property="og:description" content="Run an OpenAI-compatible speech-to-text server with FunASR: `funasr-server` exposes /v1/audio/transcriptions, and the OpenAI SDK works by changing only base_url. Local, free, private, stronger on Chinese, faster than Whisper. All code tested.">
<meta property="og:type" content="article"><meta property="og:url" content="https://www.funasr.com/en/blog/self-hosted-openai-whisper-api-alternative.html"><meta property="og:image" content="https://www.funasr.com/logo.png">
<link rel="canonical" href="https://www.funasr.com/en/blog/self-hosted-openai-whisper-api-alternative.html"><link rel="alternate" hreflang="en" href="https://www.funasr.com/en/blog/self-hosted-openai-whisper-api-alternative.html"><link rel="alternate" hreflang="zh" href="https://www.funasr.com/blog/self-hosted-openai-whisper-api-alternative.html"><link rel="alternate" hreflang="x-default" href="https://www.funasr.com/en/blog/self-hosted-openai-whisper-api-alternative.html">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"BlogPosting","headline":"Self-Hosted OpenAI Whisper API Alternative: Drop-in /v1/audio/transcriptions with FunASR","description":"Run an OpenAI-compatible speech-to-text server with FunASR: `funasr-server` exposes /v1/audio/transcriptions, and the OpenAI SDK works by changing only base_url. Local, free, private, stronger on Chinese, faster than Whisper. All code tested.","datePublished":"2026-06-18","dateModified":"2026-06-18","author":{"@type":"Organization","name":"FunASR / Tongyi Lab"},"publisher":{"@type":"Organization","name":"FunASR","logo":{"@type":"ImageObject","url":"https://www.funasr.com/logo.png"}},"mainEntityOfPage":{"@type":"WebPage","@id":"https://www.funasr.com/en/blog/self-hosted-openai-whisper-api-alternative.html"},"image":"https://www.funasr.com/logo.png"}
</script>
<style>:root{--primary:#2563eb;--primary-dark:#1d4ed8;--bg:#fff;--surface:#f8fafc;--border:#e2e8f0;--text:#0f172a;--text-soft:#475569;--text-muted:#94a3b8;--radius:12px}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:'Inter',-apple-system,sans-serif;color:var(--text);line-height:1.7}
a{color:var(--primary);text-decoration:none}a:hover{text-decoration:underline}
.container{max-width:800px;margin:0 auto;padding:0 24px}
.nav{position:fixed;top:0;left:0;right:0;z-index:100;background:rgba(255,255,255,0.9);backdrop-filter:blur(12px);border-bottom:1px solid var(--border);padding:14px 0}
.nav .container{max-width:1120px;display:flex;align-items:center;gap:24px}
.nav-logo{font-size:1.2rem;font-weight:800;color:var(--text)}.nav-logo span{color:var(--primary)}
.nav-links{display:flex;gap:20px;margin-left:auto;flex-wrap:wrap}
.nav-links a{font-size:0.85rem;font-weight:500;color:var(--text-soft)}
.nav-btn{padding:7px 16px;background:var(--primary);color:#fff;border-radius:7px;font-size:0.83rem;font-weight:600}
article{padding:120px 0 80px}
h1{font-size:2rem;font-weight:800;line-height:1.3;margin-bottom:14px}
h2{font-size:1.3rem;font-weight:700;margin:36px 0 14px;padding-top:16px;border-top:1px solid var(--border)}
h3{font-size:1.05rem;font-weight:700;margin:22px 0 10px}
p{margin-bottom:14px;color:var(--text-soft)}
ul,ol{margin:0 0 14px 22px;color:var(--text-soft)}li{margin-bottom:6px}
table{width:100%;border-collapse:collapse;margin:16px 0;font-size:0.86rem}
th,td{padding:10px 12px;text-align:left;border-bottom:1px solid var(--border)}
th{font-weight:600;background:var(--surface);font-size:0.78rem;color:var(--text-muted)}
pre{background:#1e293b;color:#e2e8f0;padding:18px;border-radius:10px;overflow-x:auto;font-size:0.82rem;line-height:1.7;margin:14px 0}
code{font-family:ui-monospace,Menlo,monospace}
p code,li code{background:var(--surface);padding:2px 6px;border-radius:5px;font-size:0.85em;color:var(--primary-dark)}
.post-meta{color:var(--text-muted);font-size:0.85rem;margin-bottom:24px}
.cta{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:24px;margin:28px 0;text-align:center}
.cta a.btn{display:inline-block;padding:10px 24px;background:var(--primary);color:#fff;border-radius:8px;font-weight:600}
.post-list{list-style:none;margin:0;padding:0}
.post-list li{margin:0 0 8px}
.post-card{display:block;border:1px solid var(--border);border-radius:var(--radius);padding:20px 22px;margin-bottom:14px}
.post-card:hover{border-color:var(--primary);text-decoration:none}
.post-card h2{border:none;padding:0;margin:0 0 6px;font-size:1.15rem;color:var(--text)}
.post-card p{margin:0;color:var(--text-soft);font-size:0.9rem}
.post-card .date{color:var(--text-muted);font-size:0.8rem}
footer{background:#0f172a;color:#94a3b8;padding:28px 0;text-align:center;font-size:0.8rem}
footer a{color:#94a3b8}
@media(max-width:900px){.nav-links{display:none}.nav .container{gap:16px}.nav-logo{margin-right:auto}h1{font-size:1.75rem}table{table-layout:fixed;font-size:0.78rem}th,td{padding:8px 4px;overflow-wrap:anywhere}p code,li code{overflow-wrap:anywhere;word-break:break-word}}
</style></head><body>
<nav class="nav"><div class="container"><a href="/" class="nav-logo">Fun<span>ASR</span></a><div class="nav-links"><a href="/en/#capabilities">Capabilities</a><a href="/en/#usage">How to Use</a><a href="/en/#benchmark">Benchmark</a><a href="/en/#demo">Demo</a><a href="https://modelscope.github.io/FunASR/" target="_blank">Docs</a><a href="/en/quickstart.html">Quickstart</a><a href="/en/models.html">Models</a><a href="/en/ecosystem.html">Ecosystem</a><a href="/en/blog/">Blog</a><a href="/en/vs-whisper.html">vs Whisper</a><a href="/en/donors.html">Donors</a></div><a href="https://www.funasr.com/blog/self-hosted-openai-whisper-api-alternative.html" style="font-size:0.83rem;font-weight:600;color:var(--text-soft)">中文</a><a href="https://github.com/modelscope/FunASR" target="_blank" class="nav-btn">GitHub ★</a></div></nav>
<article><div class="container">
<h1>Self-Hosted OpenAI Whisper API Alternative: Drop-in /v1/audio/transcriptions with FunASR</h1>
<p class="post-meta">FunASR Blog · 2026-06-18 · Tutorial</p>
<p>OpenAI's <code>/v1/audio/transcriptions</code> (the Whisper API) charges per minute, uploads your audio to the cloud, and is rate-limited. If you just need audio turned into text, you can run a server with an <strong>identical interface</strong> on your own machine — existing code switches over by changing a single <code>base_url</code>. FunASR ships exactly that as <code>funasr-server</code>. Every snippet below is tested.</p>
<h2>Start an OpenAI-compatible server in one line</h2>
<pre><code>pip install -U funasr
funasr-server --model sensevoice --device cuda # listens on localhost:8000</code></pre>
<p>You now have the same two endpoints OpenAI exposes: <code>POST /v1/audio/transcriptions</code> and <code>GET /v1/models</code>.</p>
<h2>Call it with the official OpenAI SDK (just change base_url)</h2>
<p>Your existing OpenAI code is almost unchanged — point <code>base_url</code> at the local server and put any non-empty <code>api_key</code>:</p>
<pre><code>from openai import OpenAI
client = OpenAI(base_url="http://localhost:8000/v1", api_key="not-needed")
with open("audio.wav", "rb") as f:
r = client.audio.transcriptions.create(model="sensevoice", file=f)
print(r.text)
# -&gt; 欢迎大家来体验达摩院推出的语音识别模型 (the Chinese sample above)</code></pre>
<p>Listing models works the same way:</p>
<pre><code>print([m.id for m in client.models.list().data])
# -&gt; ['fun-asr-nano', 'sensevoice', 'paraformer']</code></pre>
<h2>Or use curl / any HTTP client</h2>
<pre><code>curl http://localhost:8000/v1/audio/transcriptions \
-F "[email protected]" \
-F "model=sensevoice"
# -&gt; {"text": "..."}</code></pre>
<p>Because the API is OpenAI-compatible, the Node <code>openai</code> package, LangChain, and most existing SDKs connect to it unchanged.</p>
<h2>OpenAI Whisper API vs self-hosted FunASR</h2>
<table><thead><tr><th></th><th>OpenAI Whisper API</th><th>FunASR self-hosted</th></tr></thead><tbody>
<tr><td>Cost</td><td>$0.006 / min</td><td>Free (your hardware)</td></tr>
<tr><td>Privacy</td><td>Audio leaves your machine</td><td>Stays local</td></tr>
<tr><td>Rate limits</td><td>Yes</td><td>None</td></tr>
<tr><td>Chinese accuracy</td><td>Mediocre</td><td>Higher (<a href="/en/blog/funasr-vs-whisper-benchmark.html">benchmark</a>)</td></tr>
<tr><td>Speed</td><td>—</td><td>SenseVoice is non-autoregressive, far faster than Whisper</td></tr>
<tr><td>Interface</td><td>/v1/audio/transcriptions</td><td>Identical</td></tr>
</tbody></table>
<h2>Which model to pick</h2>
<ul>
<li><code>sensevoice</code> — default; non-autoregressive, very fast, 50+ languages, with emotion/events. Best everyday choice.</li>
<li><code>fun-asr-nano</code> — flagship LLM decoder for zh/en/ja plus Chinese dialects/accents (needs vLLM).</li>
<li>For 31 languages, deploy the separate <code>FunAudioLLM/Fun-ASR-MLT-Nano-2512</code> checkpoint.</li>
<li><code>paraformer</code> — classic, production-grade Chinese.</li>
</ul>
<p>Just set <code>model=</code> in the request — no server restart needed.</p>
<h2>What changes when migrating from OpenAI</h2>
<ul>
<li><strong>base_url</strong>: point it at your <code>funasr-server</code>.</li>
<li><strong>api_key</strong>: not validated locally — any non-empty string works.</li>
<li><strong>Everything else</strong>: the <code>client.audio.transcriptions.create(...)</code> call is the same.</li>
</ul>
<h2>Use FunASR as the speech-to-text in Open-WebUI</h2>
<p><strong>Open-WebUI</strong> (the 150k-star self-hosted LLM interface) lets its speech-to-text (STT) point at any OpenAI-compatible endpoint. Since <code>funasr-server</code> <em>is</em> OpenAI-compatible, you just point it there — <strong>no plugin, no Open-WebUI code changes</strong> — and get more accurate Chinese transcription than the built-in Whisper, fully local and free.</p>
<p>1. Start FunASR (as above):</p>
<pre>funasr-server --model sensevoice --device cuda # listens on localhost:8000</pre>
<p>2. In Open-WebUI: <strong>Admin Panel &rarr; Settings &rarr; Audio &rarr; Speech-to-Text</strong>, set Engine to <strong>OpenAI</strong> and fill in:</p>
<ul>
<li>API Base URL: <code>http://localhost:8000/v1</code> (if Open-WebUI runs in Docker and FunASR on the host, use <code>http://host.docker.internal:8000/v1</code>)</li>
<li>API Key: any non-empty string (funasr-server does not validate it)</li>
<li>STT Model: <code>sensevoice</code> (or <code>paraformer</code> / <code>fun-asr-nano</code>)</li>
</ul>
<p>With Docker Compose this is the same as a few environment variables:</p>
<pre>AUDIO_STT_ENGINE=openai
AUDIO_STT_OPENAI_API_BASE_URL=http://host.docker.internal:8000/v1
AUDIO_STT_OPENAI_API_KEY=funasr
AUDIO_STT_MODEL=sensevoice</pre>
<p>Now Open-WebUI's microphone / voice input runs through FunASR — better Chinese accuracy, data never leaves your machine. The same config works for any tool that supports a custom OpenAI STT endpoint (LibreChat, AnythingLLM, etc.).</p>
<div class="cta"><p>FunASR is Tongyi Lab's open-source, industrial-grade speech recognition toolkit.</p><a class="btn" href="https://github.com/modelscope/FunASR" target="_blank">Star FunASR on GitHub ★</a></div>
<!--related-posts-->
<h2>Related posts</h2>
<ul class="post-list">
<li><a href="/en/blog/funasr-vs-whisper-benchmark.html">FunASR vs Whisper Benchmark</a></li>
<li><a href="/en/blog/sensevoice-deployment-guide.html">SenseVoice Deployment Guide</a></li>
<li><a href="/en/blog/fun-asr-nano-guide.html">Fun-ASR-Nano Guide</a></li>
<li><a href="/en/blog/funasr-speaker-diarization.html">Speaker Diarization: Who Spoke When</a></li>
<li><a href="/en/blog/sensevoice-emotion-language-detection.html">Emotion & Language Detection</a></li>
<li><a href="/en/blog/funasr-realtime-streaming-asr.html">Real-Time Streaming Speech-to-Text</a></li>
<li><a href="/en/blog/funasr-transcribe-long-audio.html">Transcribe Long Audio (Hours in One Call)</a></li>
<li><a href="/en/blog/funasr-cli-transcribe-command-line.html">Transcribe from the Command Line</a></li>
<li><a href="/en/blog/generate-subtitles-srt-vtt-from-audio-video.html">Auto-Generate Subtitles (SRT / VTT)</a></li>
<li><a href="/en/blog/speech-to-text-python-transcribe-audio.html">Speech to Text in Python</a></li>
<li><a href="/en/blog/funasr-llama-cpp-whisper-cpp-alternative.html">FunASR on llama.cpp (whisper.cpp Alternative)</a></li>
<li><a href="/en/blog/funasr-vs-faster-whisper-chinese.html">FunASR vs faster-whisper (Chinese/Cantonese)</a></li>
<li><a href="/en/blog/lightweight-speech-recognition-cpu.html">Lightweight Speech Recognition on CPU</a></li>
<li><a href="/en/blog/self-hosted-deepgram-assemblyai-alternative.html">Self-Hosted Deepgram/AssemblyAI Alternative</a></li>
<li><a href="/en/blog/which-funasr-model.html">Which FunASR Model?</a></li>
<li><a href="/en/blog/cantonese-speech-recognition.html">Cantonese Speech Recognition (SenseVoice)</a></li>
<li><a href="/en/blog/japanese-speech-recognition.html">Japanese Speech Recognition (SenseVoice)</a></li>
<li><a href="/en/blog/voice-activity-detection-python.html">Voice Activity Detection in Python</a></li>
<li><a href="/en/blog/self-hosted-google-aws-azure-speech-to-text.html">Self-Hosted Google/AWS/Azure STT Alternative</a></li>
<li><a href="/en/blog/chinese-speech-recognition.html">Chinese Speech Recognition in Python</a></li>
<li><a href="/en/blog/punctuation-restoration-python.html">Punctuation Restoration in Python</a></li>
<li><a href="/en/blog/speech-to-text-timestamps-python.html">Speech-to-Text with Timestamps in Python</a></li>
</ul>
</div></article>
<footer><div class="container">FunASR · Open-source speech recognition by Tongyi Lab · <a href="https://github.com/modelscope/FunASR">GitHub</a></div></footer>
</body></html>
@@ -0,0 +1,157 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>SenseVoice Deployment Guide: Multilingual ASR 15x Faster Than Whisper | FunASR Blog</title>
<meta name="description" content="Complete SenseVoice deployment tutorial: transcribe multilingual speech in 3 lines of Python, with language ID, emotion and audio-event detection, VAD for long audio, GPU/CPU tips. Open-source ASR 15x faster than Whisper.">
<meta name="keywords" content="SenseVoice, SenseVoice deployment, speech recognition, multilingual ASR, Whisper alternative, FunASR, emotion recognition, language identification, ASR tutorial, open source speech to text">
<link rel="icon" href="/logo.png">
<meta property="og:title" content="SenseVoice Deployment Guide: Multilingual ASR 15x Faster Than Whisper | FunASR Blog">
<meta property="og:description" content="Complete SenseVoice deployment tutorial: transcribe multilingual speech in 3 lines of Python, with language ID, emotion and audio-event detection, VAD for long audio, GPU/CPU tips. Open-source ASR 15x faster than Whisper.">
<meta property="og:type" content="article">
<meta property="og:url" content="https://www.funasr.com/en/blog/sensevoice-deployment-guide.html">
<meta property="og:image" content="https://www.funasr.com/logo.png">
<link rel="canonical" href="https://www.funasr.com/en/blog/sensevoice-deployment-guide.html">
<link rel="alternate" hreflang="en" href="https://www.funasr.com/en/blog/sensevoice-deployment-guide.html">
<link rel="alternate" hreflang="zh" href="https://www.funasr.com/blog/sensevoice-deployment-guide.html">
<link rel="alternate" hreflang="x-default" href="https://www.funasr.com/en/blog/sensevoice-deployment-guide.html">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"BlogPosting","headline":"SenseVoice Deployment Guide: Multilingual ASR 15x Faster Than Whisper | FunASR Blog","description":"Complete SenseVoice deployment tutorial: transcribe multilingual speech in 3 lines of Python, with language ID, emotion and audio-event detection, VAD for long audio, GPU/CPU tips. Open-source ASR 15x faster than Whisper.","datePublished":"2026-06-16","dateModified":"2026-06-16","author":{"@type":"Organization","name":"FunASR / Tongyi Lab"},"publisher":{"@type":"Organization","name":"FunASR","logo":{"@type":"ImageObject","url":"https://www.funasr.com/logo.png"}},"mainEntityOfPage":{"@type":"WebPage","@id":"https://www.funasr.com/en/blog/sensevoice-deployment-guide.html"},"image":"https://www.funasr.com/logo.png"}
</script>
<style>:root{--primary:#2563eb;--primary-dark:#1d4ed8;--bg:#fff;--surface:#f8fafc;--border:#e2e8f0;--text:#0f172a;--text-soft:#475569;--text-muted:#94a3b8;--radius:12px}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:'Inter',-apple-system,sans-serif;color:var(--text);line-height:1.7}
a{color:var(--primary);text-decoration:none}a:hover{text-decoration:underline}
.container{max-width:800px;margin:0 auto;padding:0 24px}
.nav{position:fixed;top:0;left:0;right:0;z-index:100;background:rgba(255,255,255,0.9);backdrop-filter:blur(12px);border-bottom:1px solid var(--border);padding:14px 0}
.nav .container{max-width:1120px;display:flex;align-items:center;gap:24px}
.nav-logo{font-size:1.2rem;font-weight:800;color:var(--text)}.nav-logo span{color:var(--primary)}
.nav-links{display:flex;gap:20px;margin-left:auto;flex-wrap:wrap}
.nav-links a{font-size:0.85rem;font-weight:500;color:var(--text-soft)}
.nav-btn{padding:7px 16px;background:var(--primary);color:#fff;border-radius:7px;font-size:0.83rem;font-weight:600}
article{padding:120px 0 80px}
h1{font-size:2rem;font-weight:800;line-height:1.3;margin-bottom:14px}
h2{font-size:1.3rem;font-weight:700;margin:36px 0 14px;padding-top:16px;border-top:1px solid var(--border)}
h3{font-size:1.05rem;font-weight:700;margin:22px 0 10px}
p{margin-bottom:14px;color:var(--text-soft)}
ul,ol{margin:0 0 14px 22px;color:var(--text-soft)}li{margin-bottom:6px}
table{width:100%;border-collapse:collapse;margin:16px 0;font-size:0.86rem}
th,td{padding:10px 12px;text-align:left;border-bottom:1px solid var(--border)}
th{font-weight:600;background:var(--surface);font-size:0.78rem;color:var(--text-muted)}
pre{background:#1e293b;color:#e2e8f0;padding:18px;border-radius:10px;overflow-x:auto;font-size:0.82rem;line-height:1.7;margin:14px 0}
code{font-family:ui-monospace,Menlo,monospace}
p code,li code{background:var(--surface);padding:2px 6px;border-radius:5px;font-size:0.85em;color:var(--primary-dark)}
.post-meta{color:var(--text-muted);font-size:0.85rem;margin-bottom:24px}
.cta{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:24px;margin:28px 0;text-align:center}
.cta a.btn{display:inline-block;padding:10px 24px;background:var(--primary);color:#fff;border-radius:8px;font-weight:600}
.post-list{list-style:none;margin:0;padding:0}
.post-list li{margin:0 0 8px}
.post-card{display:block;border:1px solid var(--border);border-radius:var(--radius);padding:20px 22px;margin-bottom:14px}
.post-card:hover{border-color:var(--primary);text-decoration:none}
.post-card h2{border:none;padding:0;margin:0 0 6px;font-size:1.15rem;color:var(--text)}
.post-card p{margin:0;color:var(--text-soft);font-size:0.9rem}
.post-card .date{color:var(--text-muted);font-size:0.8rem}
footer{background:#0f172a;color:#94a3b8;padding:28px 0;text-align:center;font-size:0.8rem}
footer a{color:#94a3b8}</style>
</head>
<body>
<nav class="nav"><div class="container"><a href="/en/" class="nav-logo">Fun<span>ASR</span></a><div class="nav-links"><a href="/en/#capabilities">Capabilities</a><a href="/en/#usage">How to Use</a><a href="/en/#benchmark">Benchmark</a><a href="/en/#demo">Demo</a><a href="https://modelscope.github.io/FunASR/" target="_blank">Docs</a><a href="/en/quickstart.html">Quickstart</a><a href="/en/models.html">Models</a><a href="/en/ecosystem.html">Ecosystem</a><a href="/en/blog/">Blog</a><a href="/en/vs-whisper.html">vs Whisper</a><a href="/en/donors.html">Donors</a></div><a href="https://www.funasr.com/blog/sensevoice-deployment-guide.html" style="font-size:0.83rem;font-weight:500;color:var(--text-soft)">中文</a><a href="https://github.com/modelscope/FunASR" target="_blank" class="nav-btn">GitHub ★</a></div></nav>
<article><div class="container">
<h1>SenseVoice Deployment Guide: Multilingual Speech Recognition 15× Faster Than Whisper</h1>
<p class="post-meta">FunASR Blog · 2026-06-16 · Tutorial</p>
<p><strong>SenseVoice</strong> is an open-source multilingual speech understanding model from the FunAudioLLM team. Beyond automatic speech recognition (ASR), a single forward pass also returns <strong>spoken-language identification, emotion recognition, and audio-event detection</strong>. Its non-autoregressive architecture makes it roughly <strong>15× faster than Whisper-Large</strong>, with latency low enough for both real-time and high-throughput batch workloads.</p>
<p>Here is a copy-paste guide to get SenseVoice running in three steps.</p>
<h2>1. Install</h2>
<pre>pip install -U funasr torch torchaudio</pre>
<h2>2. Transcribe in three lines</h2>
<p>This downloads <code>SenseVoiceSmall</code> automatically and runs recognition:</p>
<pre>from funasr import AutoModel
from funasr.utils.postprocess_utils import rich_transcription_postprocess
model = AutoModel(model="iic/SenseVoiceSmall", device="cuda:0") # use device="cpu" for CPU
res = model.generate(input="audio.wav", language="auto", use_itn=True)
print(rich_transcription_postprocess(res[0]["text"]))</pre>
<p>Model IDs: <code>iic/SenseVoiceSmall</code> on ModelScope, <code>FunAudioLLM/SenseVoiceSmall</code> on HuggingFace. <code>use_itn=True</code> adds punctuation and inverse text normalization.</p>
<h2>3. Reading the output: language + emotion + audio event</h2>
<p>The raw output carries rich-text tags, for example:</p>
<pre>&lt;|en|&gt;&lt;|NEUTRAL|&gt;&lt;|Speech|&gt;&lt;|withitn|&gt;Welcome to the speech recognition model.</pre>
<ul>
<li><code>&lt;|en|&gt;</code> — language (zh, en, yue, ja, ko)</li>
<li><code>&lt;|NEUTRAL|&gt;</code> — emotion (HAPPY / SAD / ANGRY / NEUTRAL ...)</li>
<li><code>&lt;|Speech|&gt;</code> — audio event (Speech / BGM / Applause / Laughter ...)</li>
</ul>
<p>Call <code>rich_transcription_postprocess()</code> for clean text, or read <code>res[0]["text"]</code> directly to keep the tags for downstream analysis.</p>
<h2>4. Long audio: add VAD segmentation</h2>
<pre>model = AutoModel(
model="iic/SenseVoiceSmall",
vad_model="fsmn-vad",
vad_kwargs={"max_single_segment_time": 30000},
device="cuda:0",
)
res = model.generate(input="long_audio.wav", language="auto", use_itn=True, batch_size_s=60)</pre>
<h2>5. GPU vs CPU</h2>
<table>
<thead><tr><th>Scenario</th><th>Recommendation</th></tr></thead>
<tbody>
<tr><td>High concurrency / batch</td><td>GPU (<code>device="cuda:0"</code>)</td></tr>
<tr><td>Lightweight / edge / offline</td><td>CPU (<code>device="cpu"</code>) — non-autoregressive, fast on CPU too</td></tr>
<tr><td>Production service</td><td>FunASR runtime (C++ / Docker, multi-concurrency)</td></tr>
</tbody>
</table>
<h2>6. At a glance</h2>
<table>
<thead><tr><th>Dimension</th><th>SenseVoice-Small</th></tr></thead>
<tbody>
<tr><td>Speed vs Whisper-Large</td><td>~15×</td></tr>
<tr><td>Languages</td><td>Chinese / Cantonese / English / Japanese / Korean ...</td></tr>
<tr><td>Extra capabilities</td><td>Language ID · Emotion · Audio events</td></tr>
<tr><td>Architecture</td><td>Non-autoregressive (low latency)</td></tr>
<tr><td>License</td><td>Open source (commercial use allowed)</td></tr>
</tbody>
</table>
<div class="cta">
<h3>Get started with SenseVoice</h3>
<p>If this guide helped, please star the project on GitHub ⭐ to support open source.</p>
<a href="https://github.com/QwenAudio/SenseVoice" class="btn">SenseVoice GitHub ★</a>
</div>
<p>Read more: <a href="/en/quickstart.html">FunASR Quickstart</a> · <a href="/en/models.html">All models</a> · <a href="/en/ecosystem.html">Ecosystem</a></p>
<!--related-posts-->
<h2>Related posts</h2>
<ul class="post-list">
<li><a href="/en/blog/funasr-vs-whisper-benchmark.html">FunASR vs Whisper Benchmark</a></li>
<li><a href="/en/blog/fun-asr-nano-guide.html">Fun-ASR-Nano Guide</a></li>
<li><a href="/en/blog/funasr-speaker-diarization.html">Speaker Diarization: Who Spoke When</a></li>
<li><a href="/en/blog/sensevoice-emotion-language-detection.html">Emotion & Language Detection</a></li>
<li><a href="/en/blog/funasr-realtime-streaming-asr.html">Real-Time Streaming Speech-to-Text</a></li>
<li><a href="/en/blog/funasr-transcribe-long-audio.html">Transcribe Long Audio (Hours in One Call)</a></li>
<li><a href="/en/blog/funasr-cli-transcribe-command-line.html">Transcribe from the Command Line</a></li>
<li><a href="/en/blog/self-hosted-openai-whisper-api-alternative.html">Self-Hosted OpenAI Whisper API Alternative</a></li>
<li><a href="/en/blog/generate-subtitles-srt-vtt-from-audio-video.html">Auto-Generate Subtitles (SRT / VTT)</a></li>
<li><a href="/en/blog/speech-to-text-python-transcribe-audio.html">Speech to Text in Python</a></li>
<li><a href="/en/blog/funasr-llama-cpp-whisper-cpp-alternative.html">FunASR on llama.cpp (whisper.cpp Alternative)</a></li>
<li><a href="/en/blog/funasr-vs-faster-whisper-chinese.html">FunASR vs faster-whisper (Chinese/Cantonese)</a></li>
<li><a href="/en/blog/lightweight-speech-recognition-cpu.html">Lightweight Speech Recognition on CPU</a></li>
<li><a href="/en/blog/self-hosted-deepgram-assemblyai-alternative.html">Self-Hosted Deepgram/AssemblyAI Alternative</a></li>
<li><a href="/en/blog/which-funasr-model.html">Which FunASR Model?</a></li>
<li><a href="/en/blog/cantonese-speech-recognition.html">Cantonese Speech Recognition (SenseVoice)</a></li>
<li><a href="/en/blog/japanese-speech-recognition.html">Japanese Speech Recognition (SenseVoice)</a></li>
<li><a href="/en/blog/voice-activity-detection-python.html">Voice Activity Detection in Python</a></li>
<li><a href="/en/blog/self-hosted-google-aws-azure-speech-to-text.html">Self-Hosted Google/AWS/Azure STT Alternative</a></li>
<li><a href="/en/blog/chinese-speech-recognition.html">Chinese Speech Recognition in Python</a></li>
<li><a href="/en/blog/punctuation-restoration-python.html">Punctuation Restoration in Python</a></li>
<li><a href="/en/blog/speech-to-text-timestamps-python.html">Speech-to-Text with Timestamps in Python</a></li>
</ul>
</div></article>
<footer><div class="container">© 2024-2026 Tongyi Lab, Alibaba Group · <a href="https://github.com/modelscope/FunASR/blob/main/LICENSE">MIT License</a></div></footer>
</body>
</html>
@@ -0,0 +1,158 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Speech Emotion Recognition in Python — Language ID & Audio Events in One Model (SenseVoice) | FunASR Blog</title>
<meta name="description" content="Use SenseVoice to get language ID, emotion (happy/angry/neutral), audio events (music/applause/laughter) and ITN in one inference. 3 lines of Python, real 5-language output, 15x faster than Whisper.">
<meta name="keywords" content="speech emotion recognition, speech emotion recognition python, SenseVoice, language identification, audio event detection, multilingual speech recognition, Whisper alternative, FunASR, open source speech to text">
<link rel="icon" href="/logo.png">
<meta property="og:title" content="Speech Emotion Recognition in Python — Language ID & Audio Events in One Model (SenseVoice) | FunASR Blog">
<meta property="og:description" content="Use SenseVoice to get language ID, emotion (happy/angry/neutral), audio events (music/applause/laughter) and ITN in one inference. 3 lines of Python, real 5-language output, 15x faster than Whisper.">
<meta property="og:type" content="article">
<meta property="og:url" content="https://www.funasr.com/en/blog/sensevoice-emotion-language-detection.html">
<meta property="og:image" content="https://www.funasr.com/logo.png">
<link rel="canonical" href="https://www.funasr.com/en/blog/sensevoice-emotion-language-detection.html">
<link rel="alternate" hreflang="en" href="https://www.funasr.com/en/blog/sensevoice-emotion-language-detection.html">
<link rel="alternate" hreflang="zh" href="https://www.funasr.com/blog/sensevoice-emotion-language-detection.html">
<link rel="alternate" hreflang="x-default" href="https://www.funasr.com/en/blog/sensevoice-emotion-language-detection.html">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"BlogPosting","headline":"Speech Emotion Recognition in Python — Language ID & Audio Events in One Model (SenseVoice) | FunASR Blog","description":"Use SenseVoice to get language ID, emotion (happy/angry/neutral), audio events (music/applause/laughter) and ITN in one inference. 3 lines of Python, real 5-language output, 15x faster than Whisper.","datePublished":"2026-06-19","dateModified":"2026-06-19","author":{"@type":"Organization","name":"FunASR / Tongyi Lab"},"publisher":{"@type":"Organization","name":"FunASR","logo":{"@type":"ImageObject","url":"https://www.funasr.com/logo.png"}},"mainEntityOfPage":{"@type":"WebPage","@id":"https://www.funasr.com/en/blog/sensevoice-emotion-language-detection.html"},"image":"https://www.funasr.com/logo.png"}
</script>
<style>:root{--primary:#2563eb;--primary-dark:#1d4ed8;--bg:#fff;--surface:#f8fafc;--border:#e2e8f0;--text:#0f172a;--text-soft:#475569;--text-muted:#94a3b8;--radius:12px}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:'Inter',-apple-system,sans-serif;color:var(--text);line-height:1.7}
a{color:var(--primary);text-decoration:none}a:hover{text-decoration:underline}
.container{max-width:800px;margin:0 auto;padding:0 24px}
.nav{position:fixed;top:0;left:0;right:0;z-index:100;background:rgba(255,255,255,0.9);backdrop-filter:blur(12px);border-bottom:1px solid var(--border);padding:14px 0}
.nav .container{max-width:1120px;display:flex;align-items:center;gap:24px}
.nav-logo{font-size:1.2rem;font-weight:800;color:var(--text)}.nav-logo span{color:var(--primary)}
.nav-links{display:flex;gap:20px;margin-left:auto;flex-wrap:wrap}
.nav-links a{font-size:0.85rem;font-weight:500;color:var(--text-soft)}
.nav-btn{padding:7px 16px;background:var(--primary);color:#fff;border-radius:7px;font-size:0.83rem;font-weight:600}
article{padding:120px 0 80px}
h1{font-size:2rem;font-weight:800;line-height:1.3;margin-bottom:14px}
h2{font-size:1.3rem;font-weight:700;margin:36px 0 14px;padding-top:16px;border-top:1px solid var(--border)}
h3{font-size:1.05rem;font-weight:700;margin:22px 0 10px}
p{margin-bottom:14px;color:var(--text-soft)}
ul,ol{margin:0 0 14px 22px;color:var(--text-soft)}li{margin-bottom:6px}
table{width:100%;border-collapse:collapse;margin:16px 0;font-size:0.86rem}
th,td{padding:10px 12px;text-align:left;border-bottom:1px solid var(--border)}
th{font-weight:600;background:var(--surface);font-size:0.78rem;color:var(--text-muted)}
pre{background:#1e293b;color:#e2e8f0;padding:18px;border-radius:10px;overflow-x:auto;font-size:0.82rem;line-height:1.7;margin:14px 0}
code{font-family:ui-monospace,Menlo,monospace}
p code,li code{background:var(--surface);padding:2px 6px;border-radius:5px;font-size:0.85em;color:var(--primary-dark)}
.post-meta{color:var(--text-muted);font-size:0.85rem;margin-bottom:24px}
.cta{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:24px;margin:28px 0;text-align:center}
.cta a.btn{display:inline-block;padding:10px 24px;background:var(--primary);color:#fff;border-radius:8px;font-weight:600}
.post-list{list-style:none;margin:0;padding:0}
.post-list li{margin:0 0 8px}
.post-card{display:block;border:1px solid var(--border);border-radius:var(--radius);padding:20px 22px;margin-bottom:14px}
.post-card:hover{border-color:var(--primary);text-decoration:none}
.post-card h2{border:none;padding:0;margin:0 0 6px;font-size:1.15rem;color:var(--text)}
.post-card p{margin:0;color:var(--text-soft);font-size:0.9rem}
.post-card .date{color:var(--text-muted);font-size:0.8rem}
footer{background:#0f172a;color:#94a3b8;padding:28px 0;text-align:center;font-size:0.8rem}
footer a{color:#94a3b8}</style>
</head>
<body>
<nav class="nav"><div class="container"><a href="/en/" class="nav-logo">Fun<span>ASR</span></a><div class="nav-links"><a href="/en/#capabilities">Capabilities</a><a href="/en/#usage">How to Use</a><a href="/en/#benchmark">Benchmark</a><a href="/en/#demo">Demo</a><a href="https://modelscope.github.io/FunASR/" target="_blank">Docs</a><a href="/en/quickstart.html">Quickstart</a><a href="/en/models.html">Models</a><a href="/en/ecosystem.html">Ecosystem</a><a href="/en/blog/">Blog</a><a href="/en/vs-whisper.html">vs Whisper</a><a href="/en/donors.html">Donors</a></div><a href="https://www.funasr.com/blog/sensevoice-emotion-language-detection.html" style="font-size:0.83rem;font-weight:500;color:var(--text-soft)">中文</a><a href="https://github.com/modelscope/FunASR" target="_blank" class="nav-btn">GitHub ★</a></div></nav>
<article><div class="container">
<h1>Speech Emotion Recognition in Python — Language ID &amp; Audio Events in One Model (SenseVoice)</h1>
<p class="post-meta">2026-06-19 · FunASR Team</p>
<p>Most speech-recognition (ASR) models give you only <strong>text</strong>. But real applications often need more: what <strong>emotion</strong> is the speaker in? what <strong>language</strong> is this? is the background <strong>clean speech or music</strong>? With Whisper you have to stack several models — language detection + a separate emotion model + an audio-event classifier. Slow and hard to maintain.</p>
<p><strong>SenseVoice</strong> (an open-source multilingual speech-understanding model from the FunAudioLLM team) returns all of it in <strong>one non-autoregressive forward pass</strong>: the transcript plus <strong>spoken-language ID</strong>, <strong>emotion</strong>, <strong>audio-event detection</strong>, and inverse text normalization (ITN). It is roughly <strong>15× faster than Whisper-Large</strong>.</p>
<h2>What one inference gives you</h2>
<table>
<tr><th>Capability</th><th>Detail</th></tr>
<tr><td>ASR</td><td>50+ languages, leading Chinese accuracy</td></tr>
<tr><td>Language ID</td><td>auto-detects <code>zh / en / ja / ko / yue …</code></td></tr>
<tr><td>Emotion</td><td>HAPPY 😊 / SAD 😔 / ANGRY 😡 / NEUTRAL / FEARFUL / DISGUSTED / SURPRISED</td></tr>
<tr><td>Audio events</td><td>Speech / BGM 🎵 / Applause 👏 / Laughter / Cry</td></tr>
<tr><td>Inverse text norm (ITN)</td><td>“nine o'clock”→“9:00”, “fifty”→“50”</td></tr>
</table>
<h2>Three lines of Python</h2>
<pre>pip install funasr
from funasr import AutoModel
from funasr.utils.postprocess_utils import rich_transcription_postprocess
model = AutoModel(model="iic/SenseVoiceSmall", disable_update=True)
res = model.generate(input="audio.wav", cache={}, language="auto", use_itn=True)
print(res[0]["text"]) # raw, with tags
print(rich_transcription_postprocess(res[0]["text"])) # cleaned text</pre>
<h2>Real output: 5 languages auto-detected</h2>
<p>Run on SenseVoice's bundled multilingual samples (zh/en/ja/ko/yue). Each raw output starts with tags:</p>
<pre>&lt;|zh|&gt;&lt;|NEUTRAL|&gt;&lt;|Speech|&gt;&lt;|withitn|&gt;开放时间早上9点至下午5点。
&lt;|en|&gt;&lt;|NEUTRAL|&gt;&lt;|Speech|&gt;&lt;|withitn|&gt;The tribal chieftain called for the boy and presented him with 50 pieces of gold.
&lt;|ja|&gt;&lt;|NEUTRAL|&gt;&lt;|Speech|&gt;&lt;|withitn|&gt;うちの中学は弁当制で持っていけない場合は、50 円の学校販売のパンを買う。
&lt;|ko|&gt;&lt;|NEUTRAL|&gt;&lt;|Speech|&gt;&lt;|withitn|&gt;조금만 생각을 하면서 살면 훨씬 편할 거야.
&lt;|yue|&gt;&lt;|NEUTRAL|&gt;&lt;|Speech|&gt;&lt;|withitn|&gt;呢几个字都表达唔到,我想讲嘅意思。</pre>
<p>Note the leading tags: <code>&lt;|zh|&gt;</code> language (it even separates Cantonese <code>yue</code>), <code>&lt;|NEUTRAL|&gt;</code> emotion, <code>&lt;|Speech|&gt;</code> audio event, <code>&lt;|withitn|&gt;</code> ITN applied (“9点至下午5点”, “50 pieces”).</p>
<h2>Emotion &amp; audio events on real-world audio</h2>
<p>Running SenseVoice over 60 real-world web clips: <strong>56 were correctly tagged <code>BGM</code></strong> (background music present) — exactly the case where Whisper tends to force a transcription and hallucinate — while HAPPY / ANGRY / NEUTRAL emotions were detected. For example, one clip tagged <strong>ANGRY</strong>:</p>
<pre>&lt;|zh|&gt;&lt;|ANGRY|&gt;&lt;|Speech|&gt;&lt;|withitn|&gt;哎,不要看不起那些理想主义者,你脚下的每一步都是他们走出来的。</pre>
<p>Full tag sets — emotion: HAPPY / SAD / ANGRY / NEUTRAL / FEARFUL / DISGUSTED / SURPRISED; events: Speech / BGM / Applause / Laughter / Cry.</p>
<h2>Parsing the tags</h2>
<pre>import re
raw = res[0]["text"]
tags = re.findall(r"&lt;\|([^|]+)\|&gt;", raw)
language = tags[0] if tags else None # 'zh'
emotion = next((t for t in tags if t in
{"HAPPY","SAD","ANGRY","NEUTRAL","FEARFUL","DISGUSTED","SURPRISED"}), None)
event = next((t for t in tags if t in
{"Speech","BGM","Applause","Laughter","Cry"}), None)
text = re.sub(r"&lt;\|[^|]+\|&gt;", "", raw) # clean text
print(language, emotion, event, text)</pre>
<h2>vs Whisper</h2>
<table>
<tr><th></th><th>SenseVoice</th><th>Whisper</th></tr>
<tr><td>Transcript + language</td><td>✅ one call</td><td>✅</td></tr>
<tr><td>Emotion recognition</td><td>✅ built-in</td><td>❌ needs extra model</td></tr>
<tr><td>Audio events (BGM/applause/laughter)</td><td>✅ built-in</td><td>❌</td></tr>
<tr><td>Inverse text normalization</td><td>✅ built-in</td><td>partial</td></tr>
<tr><td>Speed</td><td>non-autoregressive, ~15× faster</td><td>autoregressive baseline</td></tr>
</table>
<p>When you need <strong>understanding</strong> of audio and not just text, one SenseVoice model replaces a language-detector + emotion-model + event-classifier stack.</p>
<div class="cta"><p><strong>The whole FunASR stack is open-source</strong> — industrial-grade ASR / VAD / punctuation / speaker / emotion &amp; events / LLM-ASR. If it helps, a GitHub Star really supports the project 👇</p><p><a class="btn" href="https://github.com/modelscope/FunASR" target="_blank">⭐ Star FunASR</a></p><p style="margin-top:10px;font-size:0.85rem">Also star:<a href="https://github.com/QwenAudio/SenseVoice" target="_blank">SenseVoice</a> · <a href="https://github.com/QwenAudio/Fun-ASR" target="_blank">Fun-ASR</a> · <a href="https://github.com/modelscope/FunClip" target="_blank">FunClip</a></p></div>
<!--related-posts-->
<h2>Related posts</h2>
<ul class="post-list">
<li><a href="/en/blog/funasr-vs-whisper-benchmark.html">FunASR vs Whisper Benchmark</a></li>
<li><a href="/en/blog/sensevoice-deployment-guide.html">SenseVoice Deployment Guide</a></li>
<li><a href="/en/blog/fun-asr-nano-guide.html">Fun-ASR-Nano Guide</a></li>
<li><a href="/en/blog/funasr-speaker-diarization.html">Speaker Diarization: Who Spoke When</a></li>
<li><a href="/en/blog/funasr-realtime-streaming-asr.html">Real-Time Streaming Speech-to-Text</a></li>
<li><a href="/en/blog/funasr-transcribe-long-audio.html">Transcribe Long Audio (Hours in One Call)</a></li>
<li><a href="/en/blog/funasr-cli-transcribe-command-line.html">Transcribe from the Command Line</a></li>
<li><a href="/en/blog/self-hosted-openai-whisper-api-alternative.html">Self-Hosted OpenAI Whisper API Alternative</a></li>
<li><a href="/en/blog/generate-subtitles-srt-vtt-from-audio-video.html">Auto-Generate Subtitles (SRT / VTT)</a></li>
<li><a href="/en/blog/speech-to-text-python-transcribe-audio.html">Speech to Text in Python</a></li>
<li><a href="/en/blog/funasr-llama-cpp-whisper-cpp-alternative.html">FunASR on llama.cpp (whisper.cpp Alternative)</a></li>
<li><a href="/en/blog/funasr-vs-faster-whisper-chinese.html">FunASR vs faster-whisper (Chinese/Cantonese)</a></li>
<li><a href="/en/blog/lightweight-speech-recognition-cpu.html">Lightweight Speech Recognition on CPU</a></li>
<li><a href="/en/blog/self-hosted-deepgram-assemblyai-alternative.html">Self-Hosted Deepgram/AssemblyAI Alternative</a></li>
<li><a href="/en/blog/which-funasr-model.html">Which FunASR Model?</a></li>
<li><a href="/en/blog/cantonese-speech-recognition.html">Cantonese Speech Recognition (SenseVoice)</a></li>
<li><a href="/en/blog/japanese-speech-recognition.html">Japanese Speech Recognition (SenseVoice)</a></li>
<li><a href="/en/blog/voice-activity-detection-python.html">Voice Activity Detection in Python</a></li>
<li><a href="/en/blog/self-hosted-google-aws-azure-speech-to-text.html">Self-Hosted Google/AWS/Azure STT Alternative</a></li>
<li><a href="/en/blog/chinese-speech-recognition.html">Chinese Speech Recognition in Python</a></li>
<li><a href="/en/blog/punctuation-restoration-python.html">Punctuation Restoration in Python</a></li>
<li><a href="/en/blog/speech-to-text-timestamps-python.html">Speech-to-Text with Timestamps in Python</a></li>
</ul>
</div></article>
<footer><div class="container">© 2024-2026 Tongyi Lab, Alibaba Group · <a href="https://github.com/modelscope/FunASR/blob/main/LICENSE">MIT License</a></div></footer>
</body>
</html>
@@ -0,0 +1,134 @@
<!DOCTYPE html>
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>Speech to Text in Python: Transcribe Audio Locally and Free with FunASR | FunASR</title><meta name="description" content="Turn audio into text with a few lines of Python: `AutoModel(...).generate(...)` — local, free, no API key. Timestamps, speakers, batch processing; strong on Chinese, 50+ languages. All code tested."><meta name="keywords" content="python speech to text, transcribe audio python, speech recognition python, audio to text python, python transcription, offline speech to text python, free speech to text python, funasr python">
<link rel="icon" href="/logo.png"><meta property="og:title" content="Speech to Text in Python: Transcribe Audio Locally and Free with FunASR"><meta property="og:description" content="Turn audio into text with a few lines of Python: `AutoModel(...).generate(...)` — local, free, no API key. Timestamps, speakers, batch processing; strong on Chinese, 50+ languages. All code tested.">
<meta property="og:type" content="article"><meta property="og:url" content="https://www.funasr.com/en/blog/speech-to-text-python-transcribe-audio.html"><meta property="og:image" content="https://www.funasr.com/logo.png">
<link rel="canonical" href="https://www.funasr.com/en/blog/speech-to-text-python-transcribe-audio.html"><link rel="alternate" hreflang="en" href="https://www.funasr.com/en/blog/speech-to-text-python-transcribe-audio.html"><link rel="alternate" hreflang="zh" href="https://www.funasr.com/blog/speech-to-text-python-transcribe-audio.html"><link rel="alternate" hreflang="x-default" href="https://www.funasr.com/en/blog/speech-to-text-python-transcribe-audio.html">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"BlogPosting","headline":"Speech to Text in Python: Transcribe Audio Locally and Free with FunASR","description":"Turn audio into text with a few lines of Python: `AutoModel(...).generate(...)` — local, free, no API key. Timestamps, speakers, batch processing; strong on Chinese, 50+ languages. All code tested.","datePublished":"2026-06-18","dateModified":"2026-06-18","author":{"@type":"Organization","name":"FunASR / Tongyi Lab"},"publisher":{"@type":"Organization","name":"FunASR","logo":{"@type":"ImageObject","url":"https://www.funasr.com/logo.png"}},"mainEntityOfPage":{"@type":"WebPage","@id":"https://www.funasr.com/en/blog/speech-to-text-python-transcribe-audio.html"},"image":"https://www.funasr.com/logo.png"}
</script>
<style>:root{--primary:#2563eb;--primary-dark:#1d4ed8;--bg:#fff;--surface:#f8fafc;--border:#e2e8f0;--text:#0f172a;--text-soft:#475569;--text-muted:#94a3b8;--radius:12px}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:'Inter',-apple-system,sans-serif;color:var(--text);line-height:1.7}
a{color:var(--primary);text-decoration:none}a:hover{text-decoration:underline}
.container{max-width:800px;margin:0 auto;padding:0 24px}
.nav{position:fixed;top:0;left:0;right:0;z-index:100;background:rgba(255,255,255,0.9);backdrop-filter:blur(12px);border-bottom:1px solid var(--border);padding:14px 0}
.nav .container{max-width:1120px;display:flex;align-items:center;gap:24px}
.nav-logo{font-size:1.2rem;font-weight:800;color:var(--text)}.nav-logo span{color:var(--primary)}
.nav-links{display:flex;gap:20px;margin-left:auto;flex-wrap:wrap}
.nav-links a{font-size:0.85rem;font-weight:500;color:var(--text-soft)}
.nav-btn{padding:7px 16px;background:var(--primary);color:#fff;border-radius:7px;font-size:0.83rem;font-weight:600}
article{padding:120px 0 80px}
h1{font-size:2rem;font-weight:800;line-height:1.3;margin-bottom:14px}
h2{font-size:1.3rem;font-weight:700;margin:36px 0 14px;padding-top:16px;border-top:1px solid var(--border)}
h3{font-size:1.05rem;font-weight:700;margin:22px 0 10px}
p{margin-bottom:14px;color:var(--text-soft)}
ul,ol{margin:0 0 14px 22px;color:var(--text-soft)}li{margin-bottom:6px}
table{width:100%;border-collapse:collapse;margin:16px 0;font-size:0.86rem}
th,td{padding:10px 12px;text-align:left;border-bottom:1px solid var(--border)}
th{font-weight:600;background:var(--surface);font-size:0.78rem;color:var(--text-muted)}
pre{background:#1e293b;color:#e2e8f0;padding:18px;border-radius:10px;overflow-x:auto;font-size:0.82rem;line-height:1.7;margin:14px 0}
code{font-family:ui-monospace,Menlo,monospace}
p code,li code{background:var(--surface);padding:2px 6px;border-radius:5px;font-size:0.85em;color:var(--primary-dark)}
.post-meta{color:var(--text-muted);font-size:0.85rem;margin-bottom:24px}
.cta{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:24px;margin:28px 0;text-align:center}
.cta a.btn{display:inline-block;padding:10px 24px;background:var(--primary);color:#fff;border-radius:8px;font-weight:600}
.post-list{list-style:none;margin:0;padding:0}
.post-list li{margin:0 0 8px}
.post-card{display:block;border:1px solid var(--border);border-radius:var(--radius);padding:20px 22px;margin-bottom:14px}
.post-card:hover{border-color:var(--primary);text-decoration:none}
.post-card h2{border:none;padding:0;margin:0 0 6px;font-size:1.15rem;color:var(--text)}
.post-card p{margin:0;color:var(--text-soft);font-size:0.9rem}
.post-card .date{color:var(--text-muted);font-size:0.8rem}
footer{background:#0f172a;color:#94a3b8;padding:28px 0;text-align:center;font-size:0.8rem}
footer a{color:#94a3b8}
@media(max-width:900px){.nav-links{display:none}.nav .container{gap:16px}.nav-logo{margin-right:auto}h1{font-size:1.75rem}table{table-layout:fixed;font-size:0.78rem}th,td{padding:8px 4px;overflow-wrap:anywhere}p code,li code{overflow-wrap:anywhere;word-break:break-word}}
</style></head><body>
<nav class="nav"><div class="container"><a href="/" class="nav-logo">Fun<span>ASR</span></a><div class="nav-links"><a href="/en/#capabilities">Capabilities</a><a href="/en/#usage">How to Use</a><a href="/en/#benchmark">Benchmark</a><a href="/en/#demo">Demo</a><a href="https://modelscope.github.io/FunASR/" target="_blank">Docs</a><a href="/en/quickstart.html">Quickstart</a><a href="/en/models.html">Models</a><a href="/en/ecosystem.html">Ecosystem</a><a href="/en/blog/">Blog</a><a href="/en/vs-whisper.html">vs Whisper</a><a href="/en/donors.html">Donors</a></div><a href="https://www.funasr.com/blog/speech-to-text-python-transcribe-audio.html" style="font-size:0.83rem;font-weight:600;color:var(--text-soft)">中文</a><a href="https://github.com/modelscope/FunASR" target="_blank" class="nav-btn">GitHub ★</a></div></nav>
<article><div class="container">
<h1>Speech to Text in Python: Transcribe Audio Locally and Free with FunASR</h1>
<p class="post-meta">FunASR Blog · 2026-06-18 · Tutorial</p>
<p>You don't need a cloud API or a heavy Whisper setup to transcribe audio in Python. FunASR turns audio into text in a few lines, locally and for free, with timestamps, speaker diarization, and batch processing built in. It's especially strong on Chinese and supports 50+ languages. Every snippet below is tested.</p>
<h2>Install</h2>
<pre><code>pip install -U torch torchaudio
pip install -U funasr</code></pre>
<h2>Simplest: transcribe a file in a few lines</h2>
<pre><code>from funasr import AutoModel
from funasr.utils.postprocess_utils import rich_transcription_postprocess
model = AutoModel(model="iic/SenseVoiceSmall", vad_model="fsmn-vad", device="cuda")
result = model.generate(input="audio.wav")
print(rich_transcription_postprocess(result[0]["text"]))
# -&gt; 欢迎大家来体验达摩院推出的语音识别模型 (Chinese sample)</code></pre>
<p>Defaults to SenseVoice (non-autoregressive, very fast). <code>rich_transcription_postprocess</code> strips SenseVoice tags like <code>&lt;|zh|&gt;</code> to give clean text — don't skip it.</p>
<h2>Transcribe straight from a URL</h2>
<pre><code>result = model.generate(
input="https://example.com/audio.wav" # local paths, numpy, bytes also work
)</code></pre>
<h2>Get timestamps and speakers</h2>
<p>Each entry in <code>sentence_info</code> carries <code>start</code>/<code>end</code> (ms), <code>spk</code> (speaker), and <code>sentence</code>:</p>
<pre><code>model = AutoModel(model="iic/SenseVoiceSmall", vad_model="fsmn-vad", spk_model="cam++", device="cuda")
result = model.generate(input="audio.wav")
for seg in result[0]["sentence_info"]:
start = seg["start"] / 1000
text = rich_transcription_postprocess(seg["sentence"])
print("[%.1fs] Speaker %s: %s" % (start, seg["spk"], text))
# -&gt; [0.6s] Speaker 0: 欢迎大家来体验达摩院推出的语音识别模型</code></pre>
<h2>Batch-transcribe multiple files</h2>
<p>Pass a list to <code>input</code> and get one result per file:</p>
<pre><code>results = model.generate(input=["a.wav", "b.wav", "c.wav"])
for r in results:
print(rich_transcription_postprocess(r["text"]))</code></pre>
<h2>Which model to pick</h2>
<table><thead><tr><th>model=</th><th>Best for</th></tr></thead><tbody>
<tr><td><code>iic/SenseVoiceSmall</code></td><td>Default; very fast, 50+ languages, emotion/events</td></tr>
<tr><td><code>paraformer-zh</code></td><td>Classic, production-grade Chinese</td></tr>
<tr><td><code>FunAudioLLM/Fun-ASR-Nano-2512</code></td><td>Flagship LLM decoder for zh/en/ja + Chinese dialects/accents</td></tr>
<tr><td><code>FunAudioLLM/Fun-ASR-MLT-Nano-2512</code></td><td>Separate multilingual checkpoint covering 31 languages</td></tr>
</tbody></table>
<p>Switch models by changing only <code>model=</code> — the rest of the code stays the same.</p>
<h2>Why FunASR</h2>
<ul>
<li><strong>Local, free, private</strong> — no internet, no API key, no per-minute fees.</li>
<li><strong>Fast</strong>: SenseVoice is non-autoregressive, far faster than Whisper (<a href="/en/blog/funasr-vs-whisper-benchmark.html">benchmark</a>) — real-time even on CPU.</li>
<li><strong>Stronger on Chinese</strong> + 50+ languages; timestamps, speakers, hotwords, and batching out of the box.</li>
</ul>
<div class="cta"><p>FunASR is Tongyi Lab's open-source, industrial-grade speech recognition toolkit.</p><a class="btn" href="https://github.com/modelscope/FunASR" target="_blank">Star FunASR on GitHub ★</a></div>
<!--related-posts-->
<h2>Related posts</h2>
<ul class="post-list">
<li><a href="/en/blog/funasr-vs-whisper-benchmark.html">FunASR vs Whisper Benchmark</a></li>
<li><a href="/en/blog/sensevoice-deployment-guide.html">SenseVoice Deployment Guide</a></li>
<li><a href="/en/blog/fun-asr-nano-guide.html">Fun-ASR-Nano Guide</a></li>
<li><a href="/en/blog/funasr-speaker-diarization.html">Speaker Diarization: Who Spoke When</a></li>
<li><a href="/en/blog/sensevoice-emotion-language-detection.html">Emotion & Language Detection</a></li>
<li><a href="/en/blog/funasr-realtime-streaming-asr.html">Real-Time Streaming Speech-to-Text</a></li>
<li><a href="/en/blog/funasr-transcribe-long-audio.html">Transcribe Long Audio (Hours in One Call)</a></li>
<li><a href="/en/blog/funasr-cli-transcribe-command-line.html">Transcribe from the Command Line</a></li>
<li><a href="/en/blog/self-hosted-openai-whisper-api-alternative.html">Self-Hosted OpenAI Whisper API Alternative</a></li>
<li><a href="/en/blog/generate-subtitles-srt-vtt-from-audio-video.html">Auto-Generate Subtitles (SRT / VTT)</a></li>
<li><a href="/en/blog/funasr-llama-cpp-whisper-cpp-alternative.html">FunASR on llama.cpp (whisper.cpp Alternative)</a></li>
<li><a href="/en/blog/funasr-vs-faster-whisper-chinese.html">FunASR vs faster-whisper (Chinese/Cantonese)</a></li>
<li><a href="/en/blog/lightweight-speech-recognition-cpu.html">Lightweight Speech Recognition on CPU</a></li>
<li><a href="/en/blog/self-hosted-deepgram-assemblyai-alternative.html">Self-Hosted Deepgram/AssemblyAI Alternative</a></li>
<li><a href="/en/blog/which-funasr-model.html">Which FunASR Model?</a></li>
<li><a href="/en/blog/cantonese-speech-recognition.html">Cantonese Speech Recognition (SenseVoice)</a></li>
<li><a href="/en/blog/japanese-speech-recognition.html">Japanese Speech Recognition (SenseVoice)</a></li>
<li><a href="/en/blog/voice-activity-detection-python.html">Voice Activity Detection in Python</a></li>
<li><a href="/en/blog/self-hosted-google-aws-azure-speech-to-text.html">Self-Hosted Google/AWS/Azure STT Alternative</a></li>
<li><a href="/en/blog/chinese-speech-recognition.html">Chinese Speech Recognition in Python</a></li>
<li><a href="/en/blog/punctuation-restoration-python.html">Punctuation Restoration in Python</a></li>
<li><a href="/en/blog/speech-to-text-timestamps-python.html">Speech-to-Text with Timestamps in Python</a></li>
</ul>
</div></article>
<footer><div class="container">FunASR · Open-source speech recognition by Tongyi Lab · <a href="https://github.com/modelscope/FunASR">GitHub</a></div></footer>
</body></html>
@@ -0,0 +1,144 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Speech-to-Text with Word/Character-Level Timestamps in Python — Millisecond-Accurate | FunASR Blog</title>
<meta name="description" content="How to get per-word/character timestamps from speech recognition? FunASR Paraformer emits character-level timestamps natively — every character has [start_ms, end_ms] in a single call. Build word highlighting, click-to-seek, subtitle alignment. With real output and pairing code.">
<meta name="keywords" content="speech to text with timestamps python, word level timestamps, word timestamps speech recognition, character timestamps, forced alignment, speech recognition timestamps, Paraformer, FunASR, subtitle alignment">
<link rel="icon" href="/logo.png">
<meta property="og:title" content="Speech-to-Text with Word/Character-Level Timestamps in Python — Millisecond-Accurate | FunASR Blog">
<meta property="og:description" content="How to get per-word/character timestamps from speech recognition? FunASR Paraformer emits character-level timestamps natively — every character has [start_ms, end_ms] in a single call. Build word highlighting, click-to-seek, subtitle alignment. With real output and pairing code.">
<meta property="og:type" content="article">
<meta property="og:url" content="https://www.funasr.com/en/blog/speech-to-text-timestamps-python.html">
<meta property="og:image" content="https://www.funasr.com/logo.png">
<link rel="canonical" href="https://www.funasr.com/en/blog/speech-to-text-timestamps-python.html">
<link rel="alternate" hreflang="en" href="https://www.funasr.com/en/blog/speech-to-text-timestamps-python.html">
<link rel="alternate" hreflang="zh" href="https://www.funasr.com/blog/speech-to-text-timestamps-python.html">
<link rel="alternate" hreflang="x-default" href="https://www.funasr.com/en/blog/speech-to-text-timestamps-python.html">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"BlogPosting","headline":"Speech-to-Text with Word/Character-Level Timestamps in Python — Millisecond-Accurate | FunASR Blog","description":"How to get per-word/character timestamps from speech recognition? FunASR Paraformer emits character-level timestamps natively — every character has [start_ms, end_ms] in a single call. Build word highlighting, click-to-seek, subtitle alignment. With real output and pairing code.","datePublished":"2026-06-23","dateModified":"2026-06-23","author":{"@type":"Organization","name":"FunASR / Tongyi Lab"},"publisher":{"@type":"Organization","name":"FunASR","logo":{"@type":"ImageObject","url":"https://www.funasr.com/logo.png"}},"mainEntityOfPage":{"@type":"WebPage","@id":"https://www.funasr.com/en/blog/speech-to-text-timestamps-python.html"},"image":"https://www.funasr.com/logo.png"}
</script>
<style>:root{--primary:#2563eb;--primary-dark:#1d4ed8;--bg:#fff;--surface:#f8fafc;--border:#e2e8f0;--text:#0f172a;--text-soft:#475569;--text-muted:#94a3b8;--radius:12px}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:'Inter',-apple-system,sans-serif;color:var(--text);line-height:1.7}
a{color:var(--primary);text-decoration:none}a:hover{text-decoration:underline}
.container{max-width:800px;margin:0 auto;padding:0 24px}
.nav{position:fixed;top:0;left:0;right:0;z-index:100;background:rgba(255,255,255,0.9);backdrop-filter:blur(12px);border-bottom:1px solid var(--border);padding:14px 0}
.nav .container{max-width:1120px;display:flex;align-items:center;gap:24px}
.nav-logo{font-size:1.2rem;font-weight:800;color:var(--text)}.nav-logo span{color:var(--primary)}
.nav-links{display:flex;gap:20px;margin-left:auto;flex-wrap:wrap}
.nav-links a{font-size:0.85rem;font-weight:500;color:var(--text-soft)}
.nav-btn{padding:7px 16px;background:var(--primary);color:#fff;border-radius:7px;font-size:0.83rem;font-weight:600}
article{padding:120px 0 80px}
h1{font-size:2rem;font-weight:800;line-height:1.3;margin-bottom:14px}
h2{font-size:1.3rem;font-weight:700;margin:36px 0 14px;padding-top:16px;border-top:1px solid var(--border)}
h3{font-size:1.05rem;font-weight:700;margin:22px 0 10px}
p{margin-bottom:14px;color:var(--text-soft)}
ul,ol{margin:0 0 14px 22px;color:var(--text-soft)}li{margin-bottom:6px}
table{width:100%;border-collapse:collapse;margin:16px 0;font-size:0.86rem}
th,td{padding:10px 12px;text-align:left;border-bottom:1px solid var(--border)}
th{font-weight:600;background:var(--surface);font-size:0.78rem;color:var(--text-muted)}
pre{background:#1e293b;color:#e2e8f0;padding:18px;border-radius:10px;overflow-x:auto;font-size:0.82rem;line-height:1.7;margin:14px 0}
code{font-family:ui-monospace,Menlo,monospace}
p code,li code{background:var(--surface);padding:2px 6px;border-radius:5px;font-size:0.85em;color:var(--primary-dark)}
.post-meta{color:var(--text-muted);font-size:0.85rem;margin-bottom:24px}
.cta{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:24px;margin:28px 0;text-align:center}
.cta a.btn{display:inline-block;padding:10px 24px;background:var(--primary);color:#fff;border-radius:8px;font-weight:600}
.post-list{list-style:none;margin:0;padding:0}
.post-list li{margin:0 0 8px}
.post-card{display:block;border:1px solid var(--border);border-radius:var(--radius);padding:20px 22px;margin-bottom:14px}
.post-card:hover{border-color:var(--primary);text-decoration:none}
.post-card h2{border:none;padding:0;margin:0 0 6px;font-size:1.15rem;color:var(--text)}
.post-card p{margin:0;color:var(--text-soft);font-size:0.9rem}
.post-card .date{color:var(--text-muted);font-size:0.8rem}
footer{background:#0f172a;color:#94a3b8;padding:28px 0;text-align:center;font-size:0.8rem}
footer a{color:#94a3b8}</style>
</head>
<body>
<nav class="nav"><div class="container"><a href="/en/" class="nav-logo">Fun<span>ASR</span></a><div class="nav-links"><a href="/en/#capabilities">Capabilities</a><a href="/en/#usage">How to Use</a><a href="/en/#benchmark">Benchmark</a><a href="/en/#demo">Demo</a><a href="https://modelscope.github.io/FunASR/" target="_blank">Docs</a><a href="/en/quickstart.html">Quickstart</a><a href="/en/models.html">Models</a><a href="/en/ecosystem.html">Ecosystem</a><a href="/en/blog/">Blog</a><a href="/en/vs-whisper.html">vs Whisper</a><a href="/en/donors.html">Donors</a></div><a href="https://www.funasr.com/blog/speech-to-text-timestamps-python.html" style="font-size:0.83rem;font-weight:500;color:var(--text-soft)">中文</a><a href="https://github.com/modelscope/FunASR" target="_blank" class="nav-btn">GitHub ★</a></div></nav>
<article><div class="container">
<h1>Speech-to-Text with Word/Character-Level Timestamps in Python — Millisecond-Accurate</h1>
<p class="post-meta">2026-06-23 · FunASR Team</p>
<p>Many use cases need more than "what was said" — they need to know <strong>when each word was spoken</strong>: karaoke-style highlighting, click-a-word-to-seek transcripts, subtitle alignment, video-editing search. Whisper's word timestamps are bolted on (DTW-based, variable accuracy). <strong>FunASR's Paraformer emits character-level timestamps natively</strong>: every character comes with <code>[start_ms, end_ms]</code> in a single call. Here is real measured output.</p>
<h2>Transcribe with timestamps (real output)</h2>
<pre>pip install funasr
from funasr import AutoModel
model = AutoModel(model="paraformer-zh", vad_model="fsmn-vad", disable_update=True)
res = model.generate(input="audio.wav")
text = res[0]["text"] # 欢 迎 大 家 来 体 验 ...
timestamp = res[0]["timestamp"] # [[880, 1120], [1120, 1360], ...] per-character start/end ms</pre>
<p><code>timestamp</code> is a list of <code>[start_ms, end_ms]</code> pairs, one per character in the text.</p>
<h2>Pair characters with timestamps (real)</h2>
<pre>chars = text.split() # Paraformer's Chinese output is space-separated characters
for ch, (start, end) in zip(chars, timestamp):
print(f"{ch} {start}-{end}ms")</pre>
<p>Actual output:</p>
<table>
<tr><th>Char</th><th>Span (ms)</th></tr>
<tr><td>欢</td><td>880 – 1120</td></tr>
<tr><td>迎</td><td>1120 – 1360</td></tr>
<tr><td>大</td><td>1380 – 1540</td></tr>
<tr><td>家</td><td>1540 – 1780</td></tr>
<tr><td>来</td><td>1780 – 2020</td></tr>
<tr><td>体</td><td>2020 – 2180</td></tr>
<tr><td>验</td><td>2180 – 2420</td></tr>
</table>
<p>All 19 characters of the sentence get a millisecond-accurate start/end.</p>
<h2>What you can build</h2>
<ul>
<li><strong>Word highlighting / karaoke</strong>: highlight the character whose span contains the current playback time.</li>
<li><strong>Click-to-seek transcripts</strong>: clicking a character seeks the audio to its <code>start_ms</code>.</li>
<li><strong>Precise subtitle alignment</strong>: split and time captions from the timestamps. For full subtitles, see <a href="/en/blog/generate-subtitles-srt-vtt-from-audio-video.html">generating SRT/VTT subtitles</a>.</li>
<li><strong>Video-edit search</strong>: jump to the exact moment a keyword is spoken.</li>
</ul>
<h2>Why Paraformer for timestamps</h2>
<table>
<tr><th></th><th>FunASR Paraformer</th><th>Whisper</th></tr>
<tr><td>Word/char timestamps</td><td>✅ native, single call</td><td>bolt-on (<code>--word_timestamps</code>, DTW)</td></tr>
<tr><td>Accuracy</td><td>non-autoregressive + CIF alignment, stable</td><td>implementation-dependent</td></tr>
<tr><td>Chinese</td><td>character-level, CER 10.18%</td><td>~20%</td></tr>
<tr><td>License</td><td>open-source, commercial-friendly</td><td>open-source</td></tr>
</table>
<p>For higher Chinese accuracy, default to the flagship <a href="/en/blog/which-funasr-model.html">Fun-ASR-Nano</a>; for the full Chinese walkthrough see <a href="/en/blog/chinese-speech-recognition.html">Chinese speech recognition</a>; for long-audio segmentation see <a href="/en/blog/voice-activity-detection-python.html">VAD</a>.</p>
<div class="cta"><p><strong>The whole FunASR stack is open-source (MIT)</strong> — character timestamps, ASR, VAD, punctuation, speaker, LLM-ASR (flagship Fun-ASR-Nano), ready to use. If it helps, a GitHub Star supports the project 👇</p><p><a class="btn" href="https://github.com/modelscope/FunASR" target="_blank">⭐ Star FunASR</a></p><p style="margin-top:10px;font-size:0.85rem">Also star:<a href="https://github.com/QwenAudio/SenseVoice" target="_blank">SenseVoice</a> · <a href="https://github.com/QwenAudio/Fun-ASR" target="_blank">Fun-ASR</a> · <a href="https://github.com/modelscope/FunClip" target="_blank">FunClip</a></p></div>
<!--related-posts-->
<h2>Related posts</h2>
<ul class="post-list">
<li><a href="/en/blog/funasr-vs-whisper-benchmark.html">FunASR vs Whisper Benchmark</a></li>
<li><a href="/en/blog/sensevoice-deployment-guide.html">SenseVoice Deployment Guide</a></li>
<li><a href="/en/blog/fun-asr-nano-guide.html">Fun-ASR-Nano Guide</a></li>
<li><a href="/en/blog/funasr-speaker-diarization.html">Speaker Diarization: Who Spoke When</a></li>
<li><a href="/en/blog/sensevoice-emotion-language-detection.html">Emotion & Language Detection</a></li>
<li><a href="/en/blog/funasr-realtime-streaming-asr.html">Real-Time Streaming Speech-to-Text</a></li>
<li><a href="/en/blog/funasr-transcribe-long-audio.html">Transcribe Long Audio (Hours in One Call)</a></li>
<li><a href="/en/blog/funasr-cli-transcribe-command-line.html">Transcribe from the Command Line</a></li>
<li><a href="/en/blog/self-hosted-openai-whisper-api-alternative.html">Self-Hosted OpenAI Whisper API Alternative</a></li>
<li><a href="/en/blog/generate-subtitles-srt-vtt-from-audio-video.html">Auto-Generate Subtitles (SRT / VTT)</a></li>
<li><a href="/en/blog/speech-to-text-python-transcribe-audio.html">Speech to Text in Python</a></li>
<li><a href="/en/blog/funasr-llama-cpp-whisper-cpp-alternative.html">FunASR on llama.cpp (whisper.cpp Alternative)</a></li>
<li><a href="/en/blog/funasr-vs-faster-whisper-chinese.html">FunASR vs faster-whisper (Chinese/Cantonese)</a></li>
<li><a href="/en/blog/lightweight-speech-recognition-cpu.html">Lightweight Speech Recognition on CPU</a></li>
<li><a href="/en/blog/self-hosted-deepgram-assemblyai-alternative.html">Self-Hosted Deepgram/AssemblyAI Alternative</a></li>
<li><a href="/en/blog/which-funasr-model.html">Which FunASR Model?</a></li>
<li><a href="/en/blog/cantonese-speech-recognition.html">Cantonese Speech Recognition (SenseVoice)</a></li>
<li><a href="/en/blog/japanese-speech-recognition.html">Japanese Speech Recognition (SenseVoice)</a></li>
<li><a href="/en/blog/voice-activity-detection-python.html">Voice Activity Detection in Python</a></li>
<li><a href="/en/blog/self-hosted-google-aws-azure-speech-to-text.html">Self-Hosted Google/AWS/Azure STT Alternative</a></li>
<li><a href="/en/blog/chinese-speech-recognition.html">Chinese Speech Recognition in Python</a></li>
<li><a href="/en/blog/punctuation-restoration-python.html">Punctuation Restoration in Python</a></li>
</ul>
</div></article>
<footer><div class="container">© 2024-2026 Tongyi Lab, Alibaba Group · <a href="https://github.com/modelscope/FunASR/blob/main/LICENSE">MIT License</a></div></footer>
</body>
</html>
@@ -0,0 +1,155 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Voice Activity Detection in Python — Detect Speech, Remove Silence, Split Audio | FunASR Blog</title>
<meta name="description" content="How to do Voice Activity Detection (VAD) in Python? FunASR fsmn-vad returns start/end milliseconds of every speech region in 3 lines — remove silence, split long recordings on pauses, and preprocess any ASR (incl. Whisper) to cut cost and hallucinations. With real measured output.">
<meta name="keywords" content="voice activity detection python, vad python, voice activity detection, remove silence from audio python, split audio by silence, detect speech in audio, silero vad alternative, fsmn-vad, FunASR, audio preprocessing">
<link rel="icon" href="/logo.png">
<meta property="og:title" content="Voice Activity Detection in Python — Detect Speech, Remove Silence, Split Audio | FunASR Blog">
<meta property="og:description" content="How to do Voice Activity Detection (VAD) in Python? FunASR fsmn-vad returns start/end milliseconds of every speech region in 3 lines — remove silence, split long recordings on pauses, and preprocess any ASR (incl. Whisper) to cut cost and hallucinations. With real measured output.">
<meta property="og:type" content="article">
<meta property="og:url" content="https://www.funasr.com/en/blog/voice-activity-detection-python.html">
<meta property="og:image" content="https://www.funasr.com/logo.png">
<link rel="canonical" href="https://www.funasr.com/en/blog/voice-activity-detection-python.html">
<link rel="alternate" hreflang="en" href="https://www.funasr.com/en/blog/voice-activity-detection-python.html">
<link rel="alternate" hreflang="zh" href="https://www.funasr.com/blog/voice-activity-detection-python.html">
<link rel="alternate" hreflang="x-default" href="https://www.funasr.com/en/blog/voice-activity-detection-python.html">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"BlogPosting","headline":"Voice Activity Detection in Python — Detect Speech, Remove Silence, Split Audio | FunASR Blog","description":"How to do Voice Activity Detection (VAD) in Python? FunASR fsmn-vad returns start/end milliseconds of every speech region in 3 lines — remove silence, split long recordings on pauses, and preprocess any ASR (incl. Whisper) to cut cost and hallucinations. With real measured output.","datePublished":"2026-06-22","dateModified":"2026-06-22","author":{"@type":"Organization","name":"FunASR / Tongyi Lab"},"publisher":{"@type":"Organization","name":"FunASR","logo":{"@type":"ImageObject","url":"https://www.funasr.com/logo.png"}},"mainEntityOfPage":{"@type":"WebPage","@id":"https://www.funasr.com/en/blog/voice-activity-detection-python.html"},"image":"https://www.funasr.com/logo.png"}
</script>
<style>:root{--primary:#2563eb;--primary-dark:#1d4ed8;--bg:#fff;--surface:#f8fafc;--border:#e2e8f0;--text:#0f172a;--text-soft:#475569;--text-muted:#94a3b8;--radius:12px}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:'Inter',-apple-system,sans-serif;color:var(--text);line-height:1.7}
a{color:var(--primary);text-decoration:none}a:hover{text-decoration:underline}
.container{max-width:800px;margin:0 auto;padding:0 24px}
.nav{position:fixed;top:0;left:0;right:0;z-index:100;background:rgba(255,255,255,0.9);backdrop-filter:blur(12px);border-bottom:1px solid var(--border);padding:14px 0}
.nav .container{max-width:1120px;display:flex;align-items:center;gap:24px}
.nav-logo{font-size:1.2rem;font-weight:800;color:var(--text)}.nav-logo span{color:var(--primary)}
.nav-links{display:flex;gap:20px;margin-left:auto;flex-wrap:wrap}
.nav-links a{font-size:0.85rem;font-weight:500;color:var(--text-soft)}
.nav-btn{padding:7px 16px;background:var(--primary);color:#fff;border-radius:7px;font-size:0.83rem;font-weight:600}
article{padding:120px 0 80px}
h1{font-size:2rem;font-weight:800;line-height:1.3;margin-bottom:14px}
h2{font-size:1.3rem;font-weight:700;margin:36px 0 14px;padding-top:16px;border-top:1px solid var(--border)}
h3{font-size:1.05rem;font-weight:700;margin:22px 0 10px}
p{margin-bottom:14px;color:var(--text-soft)}
ul,ol{margin:0 0 14px 22px;color:var(--text-soft)}li{margin-bottom:6px}
table{width:100%;border-collapse:collapse;margin:16px 0;font-size:0.86rem}
th,td{padding:10px 12px;text-align:left;border-bottom:1px solid var(--border)}
th{font-weight:600;background:var(--surface);font-size:0.78rem;color:var(--text-muted)}
pre{background:#1e293b;color:#e2e8f0;padding:18px;border-radius:10px;overflow-x:auto;font-size:0.82rem;line-height:1.7;margin:14px 0}
code{font-family:ui-monospace,Menlo,monospace}
p code,li code{background:var(--surface);padding:2px 6px;border-radius:5px;font-size:0.85em;color:var(--primary-dark)}
.post-meta{color:var(--text-muted);font-size:0.85rem;margin-bottom:24px}
.cta{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:24px;margin:28px 0;text-align:center}
.cta a.btn{display:inline-block;padding:10px 24px;background:var(--primary);color:#fff;border-radius:8px;font-weight:600}
.post-list{list-style:none;margin:0;padding:0}
.post-list li{margin:0 0 8px}
.post-card{display:block;border:1px solid var(--border);border-radius:var(--radius);padding:20px 22px;margin-bottom:14px}
.post-card:hover{border-color:var(--primary);text-decoration:none}
.post-card h2{border:none;padding:0;margin:0 0 6px;font-size:1.15rem;color:var(--text)}
.post-card p{margin:0;color:var(--text-soft);font-size:0.9rem}
.post-card .date{color:var(--text-muted);font-size:0.8rem}
footer{background:#0f172a;color:#94a3b8;padding:28px 0;text-align:center;font-size:0.8rem}
footer a{color:#94a3b8}</style>
</head>
<body>
<nav class="nav"><div class="container"><a href="/en/" class="nav-logo">Fun<span>ASR</span></a><div class="nav-links"><a href="/en/#capabilities">Capabilities</a><a href="/en/#usage">How to Use</a><a href="/en/#benchmark">Benchmark</a><a href="/en/#demo">Demo</a><a href="https://modelscope.github.io/FunASR/" target="_blank">Docs</a><a href="/en/quickstart.html">Quickstart</a><a href="/en/models.html">Models</a><a href="/en/ecosystem.html">Ecosystem</a><a href="/en/blog/">Blog</a><a href="/en/vs-whisper.html">vs Whisper</a><a href="/en/donors.html">Donors</a></div><a href="https://www.funasr.com/blog/voice-activity-detection-python.html" style="font-size:0.83rem;font-weight:500;color:var(--text-soft)">中文</a><a href="https://github.com/modelscope/FunASR" target="_blank" class="nav-btn">GitHub ★</a></div></nav>
<article><div class="container">
<h1>Voice Activity Detection in Python — Detect Speech, Remove Silence, Split Audio by Pauses</h1>
<p class="post-meta">2026-06-22 · FunASR Team</p>
<p><strong>Voice Activity Detection (VAD)</strong> is a foundational step in audio processing: finding <em>where someone is speaking</em> versus silence/noise in a recording. It's the first stage of almost every speech pipeline — drop silence to save compute, split long recordings into utterances on pauses, and preprocess audio for any downstream ASR (<strong>including feeding Whisper clean speech to cut cost and stop it from "hallucinating" text over silent stretches</strong>).</p>
<p><strong>FunASR's <code>fsmn-vad</code></strong> is an industrial-grade, lightweight, very fast open-source VAD model. Three lines of Python, and it returns the <strong>start/end milliseconds</strong> of every speech region. Everything below is real measured output.</p>
<h2>VAD in three lines</h2>
<pre>pip install funasr
from funasr import AutoModel
model = AutoModel(model="fsmn-vad", disable_update=True)
segments = model.generate(input="audio.wav")[0]["value"]
print(segments)
# [[610, 5530]] # milliseconds — speech from 0.61s to 5.53s; the leading 610ms of silence is dropped</pre>
<p>The return value is a list of <code>[start_ms, end_ms]</code> intervals, one per continuous speech region. In this 5.55s clip, the 0.61s of leading silence was removed automatically.</p>
<h2>Real example: a 13-second clip split into 2 segments</h2>
<p>Concatenating two utterances with a 1.5s pause between them gives a 13.31s recording (simulating a real clip with a pause). Actual VAD output:</p>
<table>
<tr><th>Segment</th><th>Span</th><th>Duration</th></tr>
<tr><td>seg0</td><td>0.61s → 5.45s</td><td>4.84s</td></tr>
<tr><td>seg1</td><td>7.28s → 13.29s</td><td>6.01s</td></tr>
</table>
<p>VAD cleanly isolates the two speech regions and marks both the 1.5s pause (5.45s–7.28s) and the leading silence as non-speech. Speech is 82% of the 13.31s clip — <strong>18% of silence removed</strong>. This took just <strong>0.12s on GPU (~110× real-time)</strong>: VAD is extremely light and adds almost no overhead.</p>
<h2>Three practical use cases</h2>
<h3>1. Remove silence / keep speech only</h3>
<pre>import soundfile as sf
import numpy as np
audio, sr = sf.read("audio.wav")
segments = model.generate(input="audio.wav")[0]["value"]
# concatenate all speech regions, drop silence
speech = np.concatenate([audio[int(s/1000*sr):int(e/1000*sr)] for s, e in segments])
sf.write("speech_only.wav", speech, sr)</pre>
<h3>2. Split a long recording into files on pauses (for batch ASR)</h3>
<pre>for i, (s, e) in enumerate(segments):
chunk = audio[int(s/1000*sr):int(e/1000*sr)]
sf.write(f"chunk_{i}.wav", chunk, sr)
# chunk_0.wav, chunk_1.wav, ... each file is one independent utterance</pre>
<h3>3. Preprocess for any ASR (including Whisper)</h3>
<p>Running VAD <strong>before</strong> recognition has two concrete benefits: (1) you never send silence/noise into the model = <strong>less compute, lower cost</strong>; (2) Whisper tends to hallucinate repeated text over long silences, and <strong>trimming silence with VAD first measurably reduces those hallucinations</strong>. With FunASR's own ASR models (SenseVoice / Paraformer) you can wire VAD in with a single <code>vad_model="fsmn-vad"</code> argument for automatic segmentation.</p>
<pre>from funasr import AutoModel
# attach VAD directly to ASR; long audio is auto-segmented
asr = AutoModel(model="iic/SenseVoiceSmall", vad_model="fsmn-vad")
result = asr.generate(input="long_audio.wav")</pre>
<h2>Why fsmn-vad</h2>
<table>
<tr><th></th><th>fsmn-vad (FunASR)</th></tr>
<tr><td>Usage</td><td>3 lines of Python, returns millisecond speech spans</td></tr>
<tr><td>Speed</td><td>measured 0.12s on 13s audio (~110× real-time)</td></tr>
<tr><td>Footprint</td><td>lightweight FSMN architecture, real-time even on CPU</td></tr>
<tr><td>Ecosystem</td><td>use standalone, or attach to FunASR ASR in one line for auto-segmentation</td></tr>
<tr><td>License</td><td>open-source, commercial-friendly</td></tr>
</table>
<p>If you already use FunASR for recognition, VAD is the same toolkit with zero extra dependencies; if you use Whisper or another ASR, fsmn-vad works as a standalone preprocessor. For full pipelines, see <a href="/en/blog/funasr-transcribe-long-audio.html">transcribing long audio</a> and <a href="/en/blog/funasr-speaker-diarization.html">speaker diarization</a>.</p>
<div class="cta"><p><strong>The whole FunASR stack is open-source</strong> — fsmn-vad, industrial-grade ASR, punctuation, speaker, emotion &amp; events, LLM-ASR, ready to use. If it helps, a GitHub Star really supports the project 👇</p><p><a class="btn" href="https://github.com/modelscope/FunASR" target="_blank">⭐ Star FunASR</a></p><p style="margin-top:10px;font-size:0.85rem">Also star:<a href="https://github.com/QwenAudio/SenseVoice" target="_blank">SenseVoice</a> · <a href="https://github.com/QwenAudio/Fun-ASR" target="_blank">Fun-ASR</a> · <a href="https://github.com/modelscope/FunClip" target="_blank">FunClip</a></p></div>
<!--related-posts-->
<h2>Related posts</h2>
<ul class="post-list">
<li><a href="/en/blog/funasr-vs-whisper-benchmark.html">FunASR vs Whisper Benchmark</a></li>
<li><a href="/en/blog/sensevoice-deployment-guide.html">SenseVoice Deployment Guide</a></li>
<li><a href="/en/blog/fun-asr-nano-guide.html">Fun-ASR-Nano Guide</a></li>
<li><a href="/en/blog/funasr-speaker-diarization.html">Speaker Diarization: Who Spoke When</a></li>
<li><a href="/en/blog/sensevoice-emotion-language-detection.html">Emotion & Language Detection</a></li>
<li><a href="/en/blog/funasr-realtime-streaming-asr.html">Real-Time Streaming Speech-to-Text</a></li>
<li><a href="/en/blog/funasr-transcribe-long-audio.html">Transcribe Long Audio (Hours in One Call)</a></li>
<li><a href="/en/blog/funasr-cli-transcribe-command-line.html">Transcribe from the Command Line</a></li>
<li><a href="/en/blog/self-hosted-openai-whisper-api-alternative.html">Self-Hosted OpenAI Whisper API Alternative</a></li>
<li><a href="/en/blog/generate-subtitles-srt-vtt-from-audio-video.html">Auto-Generate Subtitles (SRT / VTT)</a></li>
<li><a href="/en/blog/speech-to-text-python-transcribe-audio.html">Speech to Text in Python</a></li>
<li><a href="/en/blog/funasr-llama-cpp-whisper-cpp-alternative.html">FunASR on llama.cpp (whisper.cpp Alternative)</a></li>
<li><a href="/en/blog/funasr-vs-faster-whisper-chinese.html">FunASR vs faster-whisper (Chinese/Cantonese)</a></li>
<li><a href="/en/blog/lightweight-speech-recognition-cpu.html">Lightweight Speech Recognition on CPU</a></li>
<li><a href="/en/blog/self-hosted-deepgram-assemblyai-alternative.html">Self-Hosted Deepgram/AssemblyAI Alternative</a></li>
<li><a href="/en/blog/which-funasr-model.html">Which FunASR Model?</a></li>
<li><a href="/en/blog/cantonese-speech-recognition.html">Cantonese Speech Recognition (SenseVoice)</a></li>
<li><a href="/en/blog/japanese-speech-recognition.html">Japanese Speech Recognition (SenseVoice)</a></li>
<li><a href="/en/blog/self-hosted-google-aws-azure-speech-to-text.html">Self-Hosted Google/AWS/Azure STT Alternative</a></li>
<li><a href="/en/blog/chinese-speech-recognition.html">Chinese Speech Recognition in Python</a></li>
<li><a href="/en/blog/punctuation-restoration-python.html">Punctuation Restoration in Python</a></li>
<li><a href="/en/blog/speech-to-text-timestamps-python.html">Speech-to-Text with Timestamps in Python</a></li>
</ul>
</div></article>
<footer><div class="container">© 2024-2026 Tongyi Lab, Alibaba Group · <a href="https://github.com/modelscope/FunASR/blob/main/LICENSE">MIT License</a></div></footer>
</body>
</html>
@@ -0,0 +1,157 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Which FunASR Model? Nano vs MLT-Nano vs SenseVoice vs Paraformer (2026 Guide) | FunASR Blog</title>
<meta name="description" content="Which FunASR model should you use? Pick flagship Fun-ASR-Nano for zh/en/ja plus Chinese dialects/accents; use the separate Fun-ASR-MLT-Nano for 31 languages; on CPU choose SenseVoice or Paraformer.">
<meta name="keywords" content="which funasr model, fun-asr-nano, fun-asr-mlt-nano, 31 language speech recognition, sensevoice vs paraformer, funasr model comparison, SenseVoice, Paraformer, FunASR">
<link rel="icon" href="/logo.png">
<meta property="og:title" content="Which FunASR Model? Nano vs MLT-Nano vs SenseVoice vs Paraformer (2026 Guide) | FunASR Blog">
<meta property="og:description" content="Which FunASR model should you use? Pick flagship Fun-ASR-Nano for zh/en/ja plus Chinese dialects/accents; use the separate Fun-ASR-MLT-Nano for 31 languages; on CPU choose SenseVoice or Paraformer.">
<meta property="og:type" content="article">
<meta property="og:url" content="https://www.funasr.com/en/blog/which-funasr-model.html">
<meta property="og:image" content="https://www.funasr.com/logo.png">
<link rel="canonical" href="https://www.funasr.com/en/blog/which-funasr-model.html">
<link rel="alternate" hreflang="en" href="https://www.funasr.com/en/blog/which-funasr-model.html">
<link rel="alternate" hreflang="zh" href="https://www.funasr.com/blog/which-funasr-model.html">
<link rel="alternate" hreflang="x-default" href="https://www.funasr.com/en/blog/which-funasr-model.html">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"BlogPosting","headline":"Which FunASR Model? Nano vs MLT-Nano vs SenseVoice vs Paraformer (2026 Guide) | FunASR Blog","description":"Which FunASR model should you use? Pick flagship Fun-ASR-Nano for zh/en/ja plus Chinese dialects/accents; use the separate Fun-ASR-MLT-Nano for 31 languages; on CPU choose SenseVoice or Paraformer.","datePublished":"2026-06-23","dateModified":"2026-07-15","author":{"@type":"Organization","name":"FunASR / Tongyi Lab"},"publisher":{"@type":"Organization","name":"FunASR","logo":{"@type":"ImageObject","url":"https://www.funasr.com/logo.png"}},"mainEntityOfPage":{"@type":"WebPage","@id":"https://www.funasr.com/en/blog/which-funasr-model.html"},"image":"https://www.funasr.com/logo.png"}
</script>
<style>:root{--primary:#2563eb;--primary-dark:#1d4ed8;--bg:#fff;--surface:#f8fafc;--border:#e2e8f0;--text:#0f172a;--text-soft:#475569;--text-muted:#94a3b8;--radius:12px}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:'Inter',-apple-system,sans-serif;color:var(--text);line-height:1.7}
a{color:var(--primary);text-decoration:none}a:hover{text-decoration:underline}
.container{max-width:800px;margin:0 auto;padding:0 24px}
.nav{position:fixed;top:0;left:0;right:0;z-index:100;background:rgba(255,255,255,0.9);backdrop-filter:blur(12px);border-bottom:1px solid var(--border);padding:14px 0}
.nav .container{max-width:1120px;display:flex;align-items:center;gap:24px}
.nav-logo{font-size:1.2rem;font-weight:800;color:var(--text)}.nav-logo span{color:var(--primary)}
.nav-links{display:flex;gap:20px;margin-left:auto;flex-wrap:wrap}
.nav-links a{font-size:0.85rem;font-weight:500;color:var(--text-soft)}
.nav-btn{padding:7px 16px;background:var(--primary);color:#fff;border-radius:7px;font-size:0.83rem;font-weight:600}
article{padding:120px 0 80px}
h1{font-size:2rem;font-weight:800;line-height:1.3;margin-bottom:14px}
h2{font-size:1.3rem;font-weight:700;margin:36px 0 14px;padding-top:16px;border-top:1px solid var(--border)}
h3{font-size:1.05rem;font-weight:700;margin:22px 0 10px}
p{margin-bottom:14px;color:var(--text-soft)}
ul,ol{margin:0 0 14px 22px;color:var(--text-soft)}li{margin-bottom:6px}
table{width:100%;border-collapse:collapse;margin:16px 0;font-size:0.86rem}
th,td{padding:10px 12px;text-align:left;border-bottom:1px solid var(--border)}
th{font-weight:600;background:var(--surface);font-size:0.78rem;color:var(--text-muted)}
pre{background:#1e293b;color:#e2e8f0;padding:18px;border-radius:10px;overflow-x:auto;font-size:0.82rem;line-height:1.7;margin:14px 0}
code{font-family:ui-monospace,Menlo,monospace}
p code,li code{background:var(--surface);padding:2px 6px;border-radius:5px;font-size:0.85em;color:var(--primary-dark)}
.post-meta{color:var(--text-muted);font-size:0.85rem;margin-bottom:24px}
.cta{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:24px;margin:28px 0;text-align:center}
.cta a.btn{display:inline-block;padding:10px 24px;background:var(--primary);color:#fff;border-radius:8px;font-weight:600}
.post-list{list-style:none;margin:0;padding:0}
.post-list li{margin:0 0 8px}
.post-card{display:block;border:1px solid var(--border);border-radius:var(--radius);padding:20px 22px;margin-bottom:14px}
.post-card:hover{border-color:var(--primary);text-decoration:none}
.post-card h2{border:none;padding:0;margin:0 0 6px;font-size:1.15rem;color:var(--text)}
.post-card p{margin:0;color:var(--text-soft);font-size:0.9rem}
.post-card .date{color:var(--text-muted);font-size:0.8rem}
footer{background:#0f172a;color:#94a3b8;padding:28px 0;text-align:center;font-size:0.8rem}
footer a{color:#94a3b8}
@media(max-width:900px){.nav-links{display:none}.nav .container{gap:16px}.nav-logo{margin-right:auto}table{table-layout:fixed;font-size:0.78rem}th,td{padding:8px 4px;overflow-wrap:anywhere}}
</style>
</head>
<body>
<nav class="nav"><div class="container"><a href="/en/" class="nav-logo">Fun<span>ASR</span></a><div class="nav-links"><a href="/en/#capabilities">Capabilities</a><a href="/en/#usage">How to Use</a><a href="/en/#benchmark">Benchmark</a><a href="/en/#demo">Demo</a><a href="https://modelscope.github.io/FunASR/" target="_blank">Docs</a><a href="/en/quickstart.html">Quickstart</a><a href="/en/models.html">Models</a><a href="/en/ecosystem.html">Ecosystem</a><a href="/en/blog/">Blog</a><a href="/en/vs-whisper.html">vs Whisper</a><a href="/en/donors.html">Donors</a></div><a href="https://www.funasr.com/blog/which-funasr-model.html" style="font-size:0.83rem;font-weight:500;color:var(--text-soft)">中文</a><a href="https://github.com/modelscope/FunASR" target="_blank" class="nav-btn">GitHub ★</a></div></nav>
<article><div class="container">
<h1>Which FunASR Model? Nano vs MLT-Nano vs SenseVoice vs Paraformer (2026 Guide)</h1>
<p class="post-meta">Updated 2026-07-15 · FunASR Team</p>
<p>FunASR ships three main model families, plus a separate multilingual MLT-Nano checkpoint. In one line: <strong>with a GPU, use flagship Fun-ASR-Nano for Chinese, English, Japanese, and Chinese dialects/accents; use Fun-ASR-MLT-Nano when you need 31 languages; on CPU use SenseVoice, or Paraformer for Chinese timestamps/hotwords.</strong></p>
<h2>Pick at a glance</h2>
<table>
<tr><th>Your situation</th><th>Pick</th><th>Why</th></tr>
<tr><td><strong>GPU / zh, en, ja, or Chinese dialects and accents / want the best</strong></td><td>⭐ <strong>Fun-ASR-Nano</strong></td><td>LLM-ASR flagship, strongest on context and hard cases, Chinese CER 8.06%</td></tr>
<tr><td>Need broad multilingual coverage</td><td><strong>Fun-ASR-MLT-Nano</strong></td><td>Separate checkpoint covering 31 languages</td></tr>
<tr><td>CPU / edge / want fastest</td><td>SenseVoice</td><td>non-autoregressive &amp; very fast, real-time on CPU, multilingual + emotion, CER 7.81%</td></tr>
<tr><td>CPU + Chinese-only + timestamps/hotwords</td><td>Paraformer</td><td>lightest, character timestamps, hotwords, CER 10.18%</td></tr>
</table>
<p>The Chinese CER figures compare Nano, SenseVoice, and Paraformer; all three beat Whisper on Chinese (~20%) by a wide margin. SenseVoice has a slightly lower CER, but <strong>Fun-ASR-Nano is the LLM-based flagship</strong> — more robust on real-world audio, context, and proper nouns. MLT-Nano is the choice for 31-language coverage; do not apply its language claim to Nano.</p>
<h2>Fun-ASR-Nano — LLM-ASR flagship, the default (GPU)</h2>
<p>SenseVoice encoder + a Qwen3-0.6B decoder, supporting Chinese, English, Japanese, 7 Chinese dialect groups, and 26 regional accents, with LLM-grade context understanding for hard cases and long-tail vocabulary.</p>
<pre>pip install funasr
from funasr import AutoModel
model = AutoModel(model="FunAudioLLM/Fun-ASR-Nano-2512", disable_update=True, device="cuda")
res = model.generate(input="audio.wav")
print(res[0]["text"])
# 欢迎大家来体验达摩院推出的语音识别模型。 ("Welcome everyone to try the speech model from DAMO Academy")</pre>
<p>Models: <a href="https://huggingface.co/FunAudioLLM/Fun-ASR-Nano-2512" target="_blank" rel="noopener">Hugging Face</a> · <a href="https://modelscope.cn/models/FunAudioLLM/Fun-ASR-Nano-2512" target="_blank" rel="noopener">ModelScope</a>. For scale/throughput, use vLLM acceleration (~340× real-time measured). See the <a href="/en/blog/fun-asr-nano-guide.html">Fun-ASR-Nano guide</a>.</p>
<h2>Fun-ASR-MLT-Nano — separate 31-language checkpoint (GPU)</h2>
<p>Choose MLT-Nano for recognition across 31 languages. It is a separate checkpoint from flagship Nano, with a different model ID and language scope.</p>
<p>Models: <a href="https://huggingface.co/FunAudioLLM/Fun-ASR-MLT-Nano-2512" target="_blank" rel="noopener">Hugging Face</a> · <a href="https://modelscope.cn/models/FunAudioLLM/Fun-ASR-MLT-Nano-2512" target="_blank" rel="noopener">ModelScope</a>.</p>
<h2>SenseVoice — the CPU/edge choice</h2>
<p>Non-autoregressive, lightweight and very fast — real-time even on CPU — emitting language + emotion + audio events in one pass; q8 quantization is ~250MB. Pick it for CPU deployment or lowest latency.</p>
<pre>from funasr import AutoModel
from funasr.utils.postprocess_utils import rich_transcription_postprocess
model = AutoModel(model="iic/SenseVoiceSmall", disable_update=True) # CPU by default
res = model.generate(input="audio.wav", language="auto", use_itn=True)
print(rich_transcription_postprocess(res[0]["text"]))
# 欢迎大家来体验达摩院推出的语音识别模型。</pre>
<h2>Paraformer — CPU + Chinese-only (timestamps/hotwords)</h2>
<p>The lightest Chinese recognizer, with <strong>character-level timestamps</strong> and <strong>hotword</strong> customization — use it for subtitles or word-level alignment.</p>
<pre>from funasr import AutoModel
model = AutoModel(model="paraformer-zh", vad_model="fsmn-vad", punc_model="ct-punc")
res = model.generate(input="audio.wav", batch_size_s=300)
print(res[0]["text"])
# 欢迎大家来体验达摩院推出的语音识别模型。
# res[0]["timestamp"] -> [[880, 1120], [1120, 1360], ...] per-character start/end ms</pre>
<h2>Quick decision</h2>
<ul>
<li><strong>Need 31-language coverage?</strong> → Fun-ASR-MLT-Nano.</li>
<li><strong>Have a GPU and mainly need zh/en/ja or Chinese dialects/accents?</strong> → Fun-ASR-Nano (the default flagship).</li>
<li><strong>CPU only?</strong> Chinese-only with timestamps/hotwords → Paraformer; otherwise (incl. multilingual/emotion) → SenseVoice.</li>
<li><strong>Need Cantonese?</strong> SenseVoice supports it natively — see <a href="/en/blog/cantonese-speech-recognition.html">Cantonese speech recognition</a>.</li>
</ul>
<p>More: <a href="/en/blog/chinese-speech-recognition.html">Chinese speech recognition</a> · <a href="/en/blog/funasr-vs-whisper-benchmark.html">FunASR vs Whisper benchmark</a> · <a href="/en/blog/fun-asr-nano-guide.html">Fun-ASR-Nano guide</a>.</p>
<div class="cta"><p><strong>The whole FunASR stack is open-source (MIT)</strong> — Fun-ASR-Nano / MLT-Nano + SenseVoice + Paraformer + VAD/punctuation/speaker. If it helps, a GitHub Star supports the project 👇</p><p><a class="btn" href="https://github.com/QwenAudio/Fun-ASR" target="_blank">⭐ Star Fun-ASR</a></p><p style="margin-top:10px;font-size:0.85rem">Also star:<a href="https://github.com/modelscope/FunASR" target="_blank">FunASR</a> · <a href="https://github.com/QwenAudio/SenseVoice" target="_blank">SenseVoice</a> · <a href="https://github.com/modelscope/FunClip" target="_blank">FunClip</a></p></div>
<!--related-posts-->
<h2>Related posts</h2>
<ul class="post-list">
<li><a href="/en/blog/funasr-vs-whisper-benchmark.html">FunASR vs Whisper Benchmark</a></li>
<li><a href="/en/blog/sensevoice-deployment-guide.html">SenseVoice Deployment Guide</a></li>
<li><a href="/en/blog/fun-asr-nano-guide.html">Fun-ASR-Nano Guide</a></li>
<li><a href="/en/blog/funasr-speaker-diarization.html">Speaker Diarization: Who Spoke When</a></li>
<li><a href="/en/blog/sensevoice-emotion-language-detection.html">Emotion & Language Detection</a></li>
<li><a href="/en/blog/funasr-realtime-streaming-asr.html">Real-Time Streaming Speech-to-Text</a></li>
<li><a href="/en/blog/funasr-transcribe-long-audio.html">Transcribe Long Audio (Hours in One Call)</a></li>
<li><a href="/en/blog/funasr-cli-transcribe-command-line.html">Transcribe from the Command Line</a></li>
<li><a href="/en/blog/self-hosted-openai-whisper-api-alternative.html">Self-Hosted OpenAI Whisper API Alternative</a></li>
<li><a href="/en/blog/generate-subtitles-srt-vtt-from-audio-video.html">Auto-Generate Subtitles (SRT / VTT)</a></li>
<li><a href="/en/blog/speech-to-text-python-transcribe-audio.html">Speech to Text in Python</a></li>
<li><a href="/en/blog/funasr-llama-cpp-whisper-cpp-alternative.html">FunASR on llama.cpp (whisper.cpp Alternative)</a></li>
<li><a href="/en/blog/funasr-vs-faster-whisper-chinese.html">FunASR vs faster-whisper (Chinese/Cantonese)</a></li>
<li><a href="/en/blog/lightweight-speech-recognition-cpu.html">Lightweight Speech Recognition on CPU</a></li>
<li><a href="/en/blog/self-hosted-deepgram-assemblyai-alternative.html">Self-Hosted Deepgram/AssemblyAI Alternative</a></li>
<li><a href="/en/blog/cantonese-speech-recognition.html">Cantonese Speech Recognition (SenseVoice)</a></li>
<li><a href="/en/blog/japanese-speech-recognition.html">Japanese Speech Recognition (SenseVoice)</a></li>
<li><a href="/en/blog/voice-activity-detection-python.html">Voice Activity Detection in Python</a></li>
<li><a href="/en/blog/self-hosted-google-aws-azure-speech-to-text.html">Self-Hosted Google/AWS/Azure STT Alternative</a></li>
<li><a href="/en/blog/chinese-speech-recognition.html">Chinese Speech Recognition in Python</a></li>
<li><a href="/en/blog/punctuation-restoration-python.html">Punctuation Restoration in Python</a></li>
<li><a href="/en/blog/speech-to-text-timestamps-python.html">Speech-to-Text with Timestamps in Python</a></li>
</ul>
</div></article>
<footer><div class="container">© 2024-2026 Tongyi Lab, Alibaba Group · <a href="https://github.com/modelscope/FunASR/blob/main/LICENSE">MIT License</a></div></footer>
</body>
</html>
@@ -0,0 +1,57 @@
<!DOCTYPE html>
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>FunASR Community Thanks</title><meta name="description" content="FunASR community acknowledgements. Donations fund server purchase and maintenance, plus the purchase, renewal, and maintenance of the www.funasr.com domain."><meta name="keywords" content="FunASR community thanks,FunASR donors,FunASR supporters">
<link rel="icon" href="/logo.png"><meta property="og:title" content="FunASR Community Thanks"><meta property="og:description" content="Donations support FunASR infrastructure, including servers and the www.funasr.com domain.">
<meta property="og:type" content="website"><meta property="og:url" content="https://www.funasr.com/en/donors.html"><meta property="og:image" content="https://www.funasr.com/logo.png">
<link rel="canonical" href="https://www.funasr.com/en/donors.html"><link rel="alternate" hreflang="en" href="https://www.funasr.com/en/donors.html"><link rel="alternate" hreflang="zh" href="https://www.funasr.com/donors.html"><link rel="alternate" hreflang="x-default" href="https://www.funasr.com/en/donors.html">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"WebPage","name":"FunASR Community Thanks","url":"https://www.funasr.com/en/donors.html","description":"FunASR community donor acknowledgements."}
</script>
<style>:root{--primary:#2563eb;--primary-dark:#1d4ed8;--surface:#f8fafc;--border:#e2e8f0;--text:#0f172a;--text-soft:#475569;--text-muted:#94a3b8;--radius:12px}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:'Inter',-apple-system,BlinkMacSystemFont,sans-serif;color:var(--text);line-height:1.7;background:#fff;-webkit-font-smoothing:antialiased}
a{color:var(--primary);text-decoration:none}a:hover{text-decoration:underline}
.container{max-width:860px;margin:0 auto;padding:0 24px}
.nav{position:fixed;top:0;left:0;right:0;z-index:100;background:rgba(255,255,255,0.9);backdrop-filter:blur(12px);border-bottom:1px solid var(--border);padding:14px 0}
.nav .container{max-width:1120px;display:flex;align-items:center;gap:24px}
.nav-logo{font-size:1.2rem;font-weight:800;color:var(--text);text-decoration:none}.nav-logo span{color:var(--primary)}
.nav-links{display:flex;gap:20px;margin-left:auto;flex-wrap:wrap}
.nav-links a{font-size:0.85rem;font-weight:500;color:var(--text-soft);text-decoration:none}.nav-links a:hover{color:var(--primary)}
.nav-btn{padding:7px 16px;background:var(--primary);color:#fff;border-radius:7px;font-size:0.83rem;font-weight:600;text-decoration:none}
main{padding:124px 0 86px}
.eyebrow{color:var(--primary);font-size:0.78rem;font-weight:700;letter-spacing:0.08em;text-transform:uppercase;margin-bottom:10px}
h1{font-size:2.1rem;font-weight:800;line-height:1.25;margin-bottom:12px}
.lead{color:var(--text-soft);font-size:1rem;max-width:680px;margin-bottom:28px}
.donor-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin:28px 0}
.donor-card{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:14px 16px;border:1px solid var(--border);border-radius:8px;background:var(--surface)}
.donor-card strong{font-size:0.95rem;color:var(--text);font-weight:650}
.donor-card span{font-size:0.84rem;color:var(--text-muted);white-space:nowrap}
.note{border-top:1px solid var(--border);padding-top:18px;margin-top:28px;font-size:0.88rem;color:var(--text-soft)}
footer{background:#0f172a;color:#94a3b8;padding:28px 0;text-align:center;font-size:0.8rem}footer a{color:#94a3b8}
@media(max-width:900px){.nav-links{display:none}.nav .container{gap:16px}.nav-logo{margin-right:auto}.donor-grid{grid-template-columns:repeat(2,1fr)}}
@media(max-width:600px){main{padding-top:104px}.donor-grid{grid-template-columns:1fr}h1{font-size:1.75rem}}
</style></head><body>
<nav class="nav"><div class="container"><a href="/en/" class="nav-logo">Fun<span>ASR</span></a><div class="nav-links"><a href="/en/#capabilities">Capabilities</a><a href="/en/#usage">How to Use</a><a href="/en/#benchmark">Benchmark</a><a href="/en/#demo">Demo</a><a href="https://modelscope.github.io/FunASR/" target="_blank">Docs</a><a href="/en/quickstart.html">Quickstart</a><a href="/en/models.html">Models</a><a href="/en/ecosystem.html">Ecosystem</a><a href="/en/blog/">Blog</a><a href="/en/vs-whisper.html">vs Whisper</a><a href="/en/donors.html">Thanks</a></div><a href="/donors.html" style="font-size:0.83rem;font-weight:500;color:var(--text-soft)">中文</a><a href="https://github.com/modelscope/FunASR" target="_blank" class="nav-btn">GitHub ★</a></div></nav>
<main><div class="container">
<div class="eyebrow">Community</div>
<h1>FunASR Community Thanks</h1>
<p class="lead">Thank you to everyone who supports the FunASR open-source community. Donations fund community infrastructure, including server purchase and maintenance, as well as the purchase, renewal, and maintenance of the <a href="https://www.funasr.com/">www.funasr.com</a> domain. This helps keep the website, documentation, and community services reliably available. The list is preserved from the historical home-page donor list.</p>
<div class="donor-grid" aria-label="FunASR community supporters">
<div class="donor-card"><strong>刘连响</strong><span>300 RMB</span></div>
<div class="donor-card"><strong>程俊陶</strong><span>300 RMB</span></div>
<div class="donor-card"><strong>黄明</strong><span>236 RMB</span></div>
<div class="donor-card"><strong>高志付</strong><span>235 RMB</span></div>
<div class="donor-card"><strong>陈翔</strong><span>200 RMB</span></div>
<div class="donor-card"><strong>夏侯杰</strong><span>200 RMB</span></div>
<div class="donor-card"><strong>黄药师</strong><span>198 RMB</span></div>
<div class="donor-card"><strong>肖炜</strong><span>100 RMB</span></div>
<div class="donor-card"><strong>刘柱</strong><span>100 RMB</span></div>
<div class="donor-card"><strong>黄水杯</strong><span>85 RMB</span></div>
<div class="donor-card"><strong>子龙</strong><span>85 RMB</span></div>
</div>
<p class="note">Thank you for helping the open-source FunASR community keep moving. For name or amount corrections, please contact maintainers through a GitHub issue.</p>
</div></main>
<footer><div class="container">© 2024-2026 Tongyi Lab, Alibaba Group · <a href="https://github.com/modelscope/FunASR/blob/main/LICENSE">MIT License</a></div></footer>
<script src="/stats/tracker.js" async></script>
</body></html>
@@ -0,0 +1,403 @@
<!DOCTYPE html>
<html lang="en">
<head><meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate"><meta http-equiv="Pragma" content="no-cache"><meta http-equiv="Expires" content="0">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>FunASR Ecosystem — Projects & Integrations Using FunASR</title>
<meta name="description" content="Discover 50+ open-source projects using FunASR for speech recognition: meeting transcription, video subtitles, voice assistants, AI agents, and more.">
<link rel="icon" href="../logo.png">
<meta property="og:title" content="FunASR Ecosystem — Open Source Speech Recognition Integrations">
<meta property="og:description" content="50+ projects integrate FunASR for meeting notes, video clipping, voice input, AI agents. See who uses FunASR in production.">
<meta property="og:type" content="article">
<meta property="og:url" content="https://www.funasr.com/en/ecosystem.html">
<meta property="og:image" content="https://www.funasr.com/logo.png">
<meta name="twitter:card" content="summary_large_image">
<link rel="canonical" href="https://www.funasr.com/en/ecosystem.html">
<link rel="alternate" hreflang="zh" href="https://www.funasr.com/ecosystem.html">
<link rel="alternate" hreflang="en" href="https://www.funasr.com/en/ecosystem.html">
<link rel="alternate" hreflang="x-default" href="https://www.funasr.com/en/ecosystem.html">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"Article","headline":"FunASR Ecosystem: Projects and Integrations","author":{"@type":"Organization","name":"FunAudioLLM, Tongyi Lab"},"datePublished":"2026-05-31","description":"A curated list of open-source projects that integrate FunASR for speech recognition."}
</script>
<style>
:root{--primary:#2563eb;--primary-dark:#1d4ed8;--bg:#fff;--surface:#f8fafc;--border:#e2e8f0;--text:#0f172a;--text-soft:#475569;--text-muted:#94a3b8;--radius:12px;--green:#16a34a}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:'Inter',-apple-system,sans-serif;color:var(--text);line-height:1.7;-webkit-font-smoothing:antialiased}
a{color:var(--primary);text-decoration:none}
a:hover{text-decoration:underline}
.container{max-width:900px;margin:0 auto;padding:0 24px}
.nav{position:fixed;top:0;left:0;right:0;z-index:100;background:rgba(255,255,255,0.9);backdrop-filter:blur(12px);border-bottom:1px solid var(--border);padding:14px 0}
.nav .container{max-width:1120px;display:flex;align-items:center;gap:24px}
.nav-logo{font-size:1.2rem;font-weight:800;color:var(--text);text-decoration:none}
.nav-logo span{color:var(--primary)}
.nav-links{display:flex;gap:20px;margin-left:auto}
.nav-links a{font-size:0.85rem;font-weight:500;color:var(--text-soft);text-decoration:none}
.nav-btn{padding:7px 16px;background:var(--primary);color:white;border-radius:7px;font-size:0.83rem;font-weight:600;text-decoration:none}
article{padding:120px 0 80px}
h1{font-size:2rem;font-weight:800;line-height:1.3;margin-bottom:8px}
.subtitle{font-size:1.05rem;color:var(--text-soft);margin-bottom:32px}
h2{font-size:1.3rem;font-weight:700;margin:40px 0 16px;padding-top:16px;border-top:1px solid var(--border)}
h2:first-of-type{border-top:none;margin-top:0}
p{margin-bottom:14px;color:var(--text-soft)}
.card-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:16px;margin:16px 0}
.card{border:1px solid var(--border);border-radius:var(--radius);padding:20px;background:var(--bg);transition:box-shadow 0.2s}
.card:hover{box-shadow:0 4px 12px rgba(0,0,0,0.08)}
.card-title{font-weight:700;font-size:0.95rem;margin-bottom:4px}
.card-title a{color:var(--text)}
.card-stars{font-size:0.78rem;color:var(--text-muted);margin-bottom:8px}
.card-desc{font-size:0.84rem;color:var(--text-soft);line-height:1.5}
.card-tag{display:inline-block;font-size:0.72rem;font-weight:600;padding:2px 8px;border-radius:4px;background:#eff6ff;color:var(--primary);margin-right:4px;margin-top:8px}
.card-tag.green{background:#f0fdf4;color:var(--green)}
.stat-bar{display:flex;gap:32px;margin:24px 0;flex-wrap:wrap}
.stat{text-align:center}
.stat-num{font-size:2rem;font-weight:800;color:var(--primary)}
.stat-label{font-size:0.82rem;color:var(--text-muted)}
pre{background:#1e293b;color:#e2e8f0;padding:18px;border-radius:10px;overflow-x:auto;font-size:0.82rem;line-height:1.7;margin:14px 0}
.cta{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:28px;margin:36px 0;text-align:center}
.cta p{margin-bottom:16px}
.cta a.btn{display:inline-block;padding:10px 24px;background:var(--primary);color:white;border-radius:8px;font-weight:600;text-decoration:none;margin:0 6px}
.cta a.btn:hover{background:var(--primary-dark)}
.cta a.btn.outline{background:transparent;color:var(--primary);border:1px solid var(--primary)}
footer{background:#0f172a;color:#94a3b8;padding:32px 0;font-size:0.82rem;text-align:center;margin-top:60px}
footer a{color:#60a5fa}
@media(max-width:640px){h1{font-size:1.5rem}.stat-bar{gap:20px}.stat-num{font-size:1.5rem}.card-grid{grid-template-columns:1fr}}
</style>
</head>
<body>
<nav class="nav"><div class="container"><a class="nav-logo" href="../en/">Fun<span>ASR</span></a><div class="nav-links"><a href="/en/#capabilities">Capabilities</a><a href="/en/#usage">How to Use</a><a href="/en/#benchmark">Benchmark</a><a href="/en/#demo">Demo</a><a href="https://modelscope.github.io/FunASR/" target="_blank">Docs</a><a href="quickstart.html">Quickstart</a><a href="models.html">Models</a><a href="ecosystem.html">Ecosystem</a><a href="/en/blog/">Blog</a><a href="vs-whisper.html">vs Whisper</a><a href="/en/donors.html">Thanks</a><a href="/ecosystem.html" style="font-size:0.85rem;font-weight:500;color:var(--text-soft);text-decoration:none">中文</a><a href="https://github.com/modelscope/FunASR" target="_blank" class="nav-btn">GitHub ★</a></div></div></nav>
<article>
<div class="container">
<h1>FunASR Ecosystem</h1>
<p class="subtitle">Open-source projects and integrations powered by FunASR, SenseVoice, and Paraformer.</p>
<div class="stat-bar">
<div class="stat"><div class="stat-num">50+</div><div class="stat-label">Integrations</div></div>
<div class="stat"><div class="stat-num">50+</div><div class="stat-label">Languages</div></div>
<div class="stat"><div class="stat-num">35K+</div><div class="stat-label">GitHub Stars</div></div>
<div class="stat"><div class="stat-num">1M+</div><div class="stat-label">pip installs/month</div></div>
</div>
<h2>Video & Media Tools</h2>
<div class="card-grid">
<div class="card">
<div class="card-title"><a href="https://github.com/modelscope/FunClip">FunClip</a></div>
<div class="card-stars">6K+ stars</div>
<div class="card-desc">ASR-powered video clipping. Automatic subtitles, keyword and speaker-based clip extraction. <a href="https://github.com/modelscope/FunClip/releases/tag/v2.1.0">Download v2.1.0</a></div>
<div><span class="card-tag">Video</span><span class="card-tag green">Official</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/jianchang512/pyvideotrans">pyVideoTrans</a></div>
<div class="card-stars">17.6K stars</div>
<div class="card-desc">Video translation tool. Uses FunASR for Chinese speech recognition with subtitle generation.</div>
<div><span class="card-tag">Video</span><span class="card-tag">Translation</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/abus-aikorea/voice-pro">Voice-Pro</a></div>
<div class="card-stars">10.4K stars</div>
<div class="card-desc">Gradio WebUI for TTS, voice cloning, and audio processing with ASR capabilities.</div>
<div><span class="card-tag">Audio</span><span class="card-tag">TTS</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/Kedreamix/Linly-Dubbing">Linly-Dubbing</a></div>
<div class="card-stars">3.2K stars</div>
<div class="card-desc">AI video dubbing toolkit. Automatic speech recognition, translation, and voice cloning for multilingual dubbing.</div>
<div><span class="card-tag">Dubbing</span><span class="card-tag">Video</span></div>
</div>
</div>
<h2>Voice Input & Desktop Apps</h2>
<div class="card-grid">
<div class="card">
<div class="card-title"><a href="https://github.com/HaujetZhao/CapsWriter-Offline">CapsWriter-Offline</a></div>
<div class="card-stars">5.5K stars</div>
<div class="card-desc">PC voice input tool with offline recognition. Hold CapsLock to speak, release to paste. Powered by FunASR Paraformer.</div>
<div><span class="card-tag">Desktop</span><span class="card-tag">Voice Input</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/Open-Less/openless">OpenLess</a></div>
<div class="card-stars">1.8K stars</div>
<div class="card-desc">Voice input for macOS & Windows. Hold a key, speak, release — text appears at cursor. Uses SenseVoice via Sherpa ONNX.</div>
<div><span class="card-tag">Desktop</span><span class="card-tag">macOS</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/yan5xu/ququ">ququ</a></div>
<div class="card-stars">2.2K stars</div>
<div class="card-desc">Open-source Wispr Flow alternative. Desktop voice workflow integrating FunASR local models with configurable LLMs.</div>
<div><span class="card-tag">Desktop</span><span class="card-tag">Voice Input</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/HG-ha/MTools">MTools</a></div>
<div class="card-stars">1.2K stars</div>
<div class="card-desc">Multi-function desktop app with audio/video processing, image editing, and AI-enhanced speech transcription.</div>
<div><span class="card-tag">Desktop</span><span class="card-tag">Toolkit</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/233stone/vocotype-cli">VocoType</a></div>
<div class="card-stars">704 stars</div>
<div class="card-desc">Privacy-first local voice input tool. Converts speech to text via hotkey and auto-types into any app. Supports MCP integration.</div>
<div><span class="card-tag">Voice Input</span><span class="card-tag">Privacy</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/TheDeathDragon/LiveTranslate">LiveTranslate</a></div>
<div class="card-stars">325 stars</div>
<div class="card-desc">Real-time audio translation. Captures system audio + mic, uses SenseVoice for ASR, then LLM streaming translation.</div>
<div><span class="card-tag">Translation</span><span class="card-tag">Real-time</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/LeonardNJU/VocoType-linux">VocoType-linux</a></div>
<div class="card-stars">139 stars</div>
<div class="card-desc">High-performance Linux offline Chinese voice input. Based on FunASR, 0.1s instant display, IBus/Fcitx5 support.</div>
<div><span class="card-tag">Linux</span><span class="card-tag">Input Method</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/hssstg/murmur">Murmur</a></div>
<div class="card-stars">103 stars</div>
<div class="card-desc">Free offline voice-to-text for macOS. Push-to-talk, works in any app. Fully local processing with SenseVoice.</div>
<div><span class="card-tag">macOS</span><span class="card-tag">Voice Input</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/joe223/AriaType">AriaType</a></div>
<div class="card-stars">74 stars</div>
<div class="card-desc">Voice-driven writing, input, and cross-app work for your desktop. Speech-to-text with AI refinement.</div>
<div><span class="card-tag">Desktop</span><span class="card-tag">Writing</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/vorojar/VoiceSnap">VoiceSnap</a></div>
<div class="card-stars">73 stars</div>
<div class="card-desc">Open-source offline voice dictation — a free Typeless alternative. 100% local, SenseVoice + DirectML, ideal for air-gapped environments.</div>
<div><span class="card-tag">Offline</span><span class="card-tag">Security</span></div>
</div>
</div>
<h2>Voice Assistants & Agents</h2>
<div class="card-grid">
<div class="card">
<div class="card-title"><a href="https://github.com/xszyou/Fay">Fay</a></div>
<div class="card-stars">12.8K stars</div>
<div class="card-desc">Digital human agent framework connecting 2.5D/3D avatars with LLMs. Uses FunASR for real-time speech recognition.</div>
<div><span class="card-tag">Digital Human</span><span class="card-tag">Agent</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/duixcom/Duix-Avatar">Duix Avatar</a></div>
<div class="card-stars">13.4K stars</div>
<div class="card-desc">Open-source AI digital human toolkit. Offline video generation and real-time interaction. Uses FunASR for speech recognition.</div>
<div><span class="card-tag">Digital Human</span><span class="card-tag">Video</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/wzpan/wukong-robot">Wukong Robot</a></div>
<div class="card-stars">7.1K stars</div>
<div class="card-desc">Chinese voice assistant / smart speaker on Raspberry Pi. Supports ChatGPT, brain-computer interaction. FunASR as ASR engine.</div>
<div><span class="card-tag">IoT</span><span class="card-tag">Assistant</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/getpaseo/paseo">Paseo</a></div>
<div class="card-stars">6.9K stars</div>
<div class="card-desc">Coding agent from your phone, desktop, and CLI. Uses Paraformer and SenseVoice for speech recognition via Sherpa ONNX.</div>
<div><span class="card-tag">Coding</span><span class="card-tag">Agent</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/Kedreamix/Linly-Talker">Linly-Talker</a></div>
<div class="card-stars">3.3K stars</div>
<div class="card-desc">Digital avatar conversational system. Combines ASR, LLM, and TTS for natural dialogue with virtual characters. Uses FunASR.</div>
<div><span class="card-tag">Digital Avatar</span><span class="card-tag">Dialogue</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/harry0703/AudioNotes">AudioNotes</a></div>
<div class="card-stars">2.1K stars</div>
<div class="card-desc">Extract audio/video content into structured markdown notes. Uses FunASR for accurate transcription.</div>
<div><span class="card-tag">Notes</span><span class="card-tag">Productivity</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/wwbin2017/bailing">Bailing</a></div>
<div class="card-stars">1.7K stars</div>
<div class="card-desc">GPT-4o-style voice chatbot. Full ASR + LLM + TTS pipeline for natural voice conversations. Powered by FunASR.</div>
<div><span class="card-tag">Voice Chat</span><span class="card-tag">GPT-4o</span></div>
</div>
</div>
<h2>AI Platforms & Frameworks</h2>
<div class="card-grid">
<div class="card">
<div class="card-title"><a href="https://github.com/RVC-Boss/GPT-SoVITS">GPT-SoVITS</a></div>
<div class="card-stars">58K stars</div>
<div class="card-desc">1-minute voice data TTS. Uses FunASR for training data annotation — automatic speech-to-text labeling.</div>
<div><span class="card-tag">TTS</span><span class="card-tag">Training</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/mudler/LocalAI">LocalAI</a></div>
<div class="card-stars">33K stars</div>
<div class="card-desc">Self-hosted OpenAI alternative. FunASR integration as speech-to-text backend (PR in review).</div>
<div><span class="card-tag">LLM</span><span class="card-tag">Self-hosted</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/BerriAI/litellm">LiteLLM</a></div>
<div class="card-stars">54.3K stars</div>
<div class="card-desc">OpenAI-compatible AI Gateway. FunASR / SenseVoice can be routed through <code>custom_openai</code> as a self-hosted transcription endpoint.</div>
<div><span class="card-tag">AI Gateway</span><span class="card-tag">OpenAI-compatible</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/pipecat-ai/pipecat">Pipecat</a></div>
<div class="card-stars">12.5K stars</div>
<div class="card-desc">Voice and multimodal conversational AI framework. FunASR as community STT integration.</div>
<div><span class="card-tag">Conversational AI</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/open-mmlab/Amphion">Amphion</a></div>
<div class="card-stars">9.8K stars</div>
<div class="card-desc">Open-source audio, music, and speech generation toolkit from OpenMMLab. Uses FunASR for TTS evaluation and data processing.</div>
<div><span class="card-tag">Audio Toolkit</span><span class="card-tag">OpenMMLab</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://marketplace.dify.ai/plugin/langgenius/funasr">Dify · Official FunASR Plugin</a></div>
<div class="card-stars">150K stars · 352 installs</div>
<div class="card-desc">The official FunASR plugin 0.1.1 is live on Dify Marketplace with SenseVoice, Fun-ASR-Nano, and Paraformer presets, supporting 25 MB uploads.</div>
<div><span class="card-tag">Official Plugin</span><span class="card-tag">Speech-to-Text</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/xorbitsai/inference">Xinference</a></div>
<div class="card-stars">9.3K stars</div>
<div class="card-desc">Distributed inference framework. Built-in FunASR speech recognition backend with one-click ASR model deployment.</div>
<div><span class="card-tag">Inference</span><span class="card-tag">Distributed</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/modstart-lib/aigcpanel">AIGCPanel</a></div>
<div class="card-stars">5K stars</div>
<div class="card-desc">All-in-one AI digital human system with video synthesis, voice cloning. Integrates FunASR for speech recognition.</div>
<div><span class="card-tag">Digital Human</span><span class="card-tag">AIGC</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/jingyaogong/minimind-o">MiniMind-O</a></div>
<div class="card-stars">1.6K stars</div>
<div class="card-desc">Lightweight multimodal model combining vision, audio, and language understanding. Uses FunASR for speech recognition module.</div>
<div><span class="card-tag">Multimodal</span><span class="card-tag">LLM</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/SpenserCai/ComfyUI-FunAudioLLM">ComfyUI-FunAudioLLM</a></div>
<div class="card-stars">95 stars</div>
<div class="card-desc">ComfyUI custom nodes for SenseVoice and CosyVoice. Visual workflow builder for speech recognition and synthesis.</div>
<div><span class="card-tag">ComfyUI</span><span class="card-tag">Workflow</span></div>
</div>
</div>
<h2>SenseVoice Community Extensions</h2>
<div class="card-grid">
<div class="card">
<div class="card-title"><a href="https://github.com/lifeiteng/OmniSenseVoice">OmniSenseVoice</a></div>
<div class="card-stars">894 stars</div>
<div class="card-desc">Enhanced SenseVoice with high-accuracy word-level timestamps. Same speed as original model.</div>
<div><span class="card-tag">Timestamps</span><span class="card-tag">SenseVoice</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/0x5446/api4sensevoice">api4sensevoice</a></div>
<div class="card-stars">541 stars</div>
<div class="card-desc">API and WebSocket server for SenseVoice. Supports VAD detection, real-time streaming, and speaker verification.</div>
<div><span class="card-tag">API</span><span class="card-tag">WebSocket</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/pengzhendong/streaming-sensevoice">streaming-sensevoice</a></div>
<div class="card-stars">451 stars</div>
<div class="card-desc">Pseudo-streaming SenseVoice with hotword boosting. Low-latency near-realtime speech recognition.</div>
<div><span class="card-tag">Streaming</span><span class="card-tag">Hotwords</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/lovemefan/SenseVoice-python">SenseVoice-python</a></div>
<div class="card-stars">111 stars</div>
<div class="card-desc">Enterprise-grade SenseVoice inference with ONNX Runtime. No PyTorch dependency, production-ready deployment.</div>
<div><span class="card-tag">ONNX</span><span class="card-tag">Deployment</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/HG-ha/SenseVoice-Api">SenseVoice-Api</a></div>
<div class="card-stars">109 stars</div>
<div class="card-desc">FastAPI wrapper for SenseVoice with ONNX inference. Smaller footprint, quantized models, GPU acceleration.</div>
<div><span class="card-tag">FastAPI</span><span class="card-tag">Quantized</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/LuckLittleBoy/SenseVoice-OneApi">SenseVoice-OneApi</a></div>
<div class="card-stars">93 stars</div>
<div class="card-desc">SenseVoice API service compatible with OneAPI. Unified interface for managing multiple speech recognition models.</div>
<div><span class="card-tag">OneAPI</span><span class="card-tag">API</span></div>
</div>
</div>
<h2>Cross-Platform Inference</h2>
<div class="card-grid">
<div class="card">
<div class="card-title"><a href="https://github.com/k2-fsa/sherpa-onnx">Sherpa-ONNX</a></div>
<div class="card-stars">5K+ stars</div>
<div class="card-desc">Cross-platform speech processing with ONNX. Runs SenseVoice and Paraformer on iOS, Android, Raspberry Pi, and browsers.</div>
<div><span class="card-tag">Mobile</span><span class="card-tag">Edge</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/RapidAI/RapidASR">RapidASR</a></div>
<div class="card-stars">608 stars</div>
<div class="card-desc">Cross-platform ASR inference library based on ONNX Runtime and FunASR. Ready to use, supports Chinese-English mixed recognition.</div>
<div><span class="card-tag">ONNX</span><span class="card-tag">Cross-Platform</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/lovemefan/SenseVoice.cpp">SenseVoice.cpp</a></div>
<div class="card-stars">550 stars</div>
<div class="card-desc">C/C++ implementation of SenseVoice model. Pure C++ inference with no Python dependency.</div>
<div><span class="card-tag">C++</span><span class="card-tag">Embedded</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/huggingface/transformers">Transformers</a></div>
<div class="card-stars">142K stars</div>
<div class="card-desc">Hugging Face Transformers library. Fun-ASR-Nano integration (PR in review) — use FunASR models with the familiar HF API.</div>
<div><span class="card-tag">ML Framework</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/gpustack/vox-box">Vox-Box</a></div>
<div class="card-stars">211 stars</div>
<div class="card-desc">OpenAI-compatible speech server supporting FunASR, Whisper, Bark, and CosyVoice backends.</div>
<div><span class="card-tag">API Server</span><span class="card-tag">OpenAI-compat</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/zaigie/FunSpeech">FunSpeech</a></div>
<div class="card-stars">136 stars</div>
<div class="card-desc">Out-of-the-box local speech service. Microservice architecture, compatible with Alibaba Cloud Speech API and OpenAI TTS API.</div>
<div><span class="card-tag">API Server</span><span class="card-tag">Self-hosted</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/huaxin0/FunASR-GGML">FunASR-GGML</a></div>
<div class="card-stars">113 stars</div>
<div class="card-desc">C++ inference engine based on GGML. CPU/CUDA support, real-time mic streaming, single GGUF file deployment.</div>
<div><span class="card-tag">GGML</span><span class="card-tag">C++</span></div>
</div>
<div class="card">
<div class="card-title"><a href="https://github.com/manyeyes/ManySpeech">ManySpeech</a></div>
<div class="card-stars">79 stars</div>
<div class="card-desc">Multi-model ASR inference solution supporting Paraformer, SenseVoice, Whisper, and more. ONNX-based, multi-scenario ready.</div>
<div><span class="card-tag">Multi-model</span><span class="card-tag">ONNX</span></div>
</div>
</div>
<h2>Get Started</h2>
<p>The fastest way to try FunASR:</p>
<pre>pip install funasr
# Python API
from funasr import AutoModel
model = AutoModel(model="iic/SenseVoiceSmall")
result = model.generate(input="audio.wav")
# Or start an OpenAI-compatible server
pip install vllm fastapi uvicorn python-multipart
funasr-server --device cuda</pre>
<div class="cta">
<p>Build something with FunASR? We'd love to list it here.</p>
<a class="btn" href="https://github.com/modelscope/FunASR">GitHub</a>
<a class="btn outline" href="https://github.com/modelscope/FunASR/issues">Open an Issue</a>
</div>
</div>
</article>
<footer><div class="container">FunASR &mdash; Industrial-grade speech recognition toolkit &mdash; <a href="https://github.com/modelscope/FunASR">GitHub</a> &middot; <a href="../en/">Home</a> &middot; <a href="https://www.funasr.com">funasr.com</a></div></footer>
</body>
</html>
+375
View File
@@ -0,0 +1,375 @@
<!DOCTYPE html>
<html lang="en">
<head><meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate"><meta http-equiv="Pragma" content="no-cache"><meta http-equiv="Expires" content="0">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>FunASR - Industrial Speech Recognition | All-in-One Speech Understanding</title>
<meta name="description" content="FunASR is an industrial-grade speech recognition service offering ASR, voice activity detection, punctuation restoration, speaker diarization, emotion detection, and audio event recognition through a unified Python API. 50+ languages, self-hosted.">
<link rel="icon" href="../logo.png">
<meta property="og:title" content="FunASR - All-in-One Industrial Speech Understanding">
<meta property="og:description" content="Speech recognition, VAD, punctuation, speaker diarization, emotion detection, audio events — one unified Python API, deploy with one command.">
<meta property="og:type" content="website">
<meta property="og:url" content="https://www.funasr.com/en/">
<meta property="og:image" content="https://www.funasr.com/logo.png">
<link rel="canonical" href="https://www.funasr.com/en/">
<link rel="alternate" hreflang="zh" href="https://www.funasr.com">
<link rel="alternate" hreflang="en" href="https://www.funasr.com/en/">
<link rel="alternate" hreflang="x-default" href="https://www.funasr.com/en/">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<style>
:root{--primary:#2563eb;--primary-dark:#1d4ed8;--bg:#fff;--surface:#f8fafc;--border:#e2e8f0;--text:#0f172a;--text-soft:#475569;--text-muted:#94a3b8;--radius:12px}
*{margin:0;padding:0;box-sizing:border-box}
html{scroll-behavior:smooth}
body{font-family:'Inter',-apple-system,sans-serif;color:var(--text);line-height:1.6;-webkit-font-smoothing:antialiased}
a{color:var(--primary);text-decoration:none}
a:hover{text-decoration:underline}
.container{max-width:1120px;margin:0 auto;padding:0 24px}
.nav{position:fixed;top:0;left:0;right:0;z-index:100;background:rgba(255,255,255,0.85);backdrop-filter:blur(12px);border-bottom:1px solid var(--border);padding:14px 0}
.nav .container{display:flex;align-items:center;gap:32px}
.nav-logo{font-size:1.3rem;font-weight:800;color:var(--text);text-decoration:none}
.nav-logo span{color:var(--primary)}
.nav-links{display:flex;gap:24px;margin-left:auto}
.nav-links a{font-size:0.88rem;font-weight:500;color:var(--text-soft);text-decoration:none}
.nav-links a:hover{color:var(--primary)}
.nav-btn{padding:8px 18px;background:var(--primary);color:white;border-radius:8px;font-size:0.85rem;font-weight:600;text-decoration:none}
.nav-btn:hover{background:var(--primary-dark);text-decoration:none}
.hero{padding:140px 0 80px;background:linear-gradient(180deg,#0f172a 0%,#1e293b 100%);color:white}
.hero-grid{display:grid;grid-template-columns:1fr 1fr;gap:60px;align-items:center}
.hero h1{font-size:2.8rem;font-weight:800;line-height:1.15}
.hero h1 span{background:linear-gradient(135deg,#60a5fa,#a78bfa);-webkit-background-clip:text;-webkit-text-fill-color:transparent}
.hero-sub{margin-top:16px;font-size:1.05rem;color:#94a3b8;max-width:500px}
.hero-actions{display:flex;gap:12px;margin-top:28px}
.btn-primary{padding:12px 28px;background:var(--primary);color:white;border-radius:10px;font-weight:600;text-decoration:none;box-shadow:0 4px 14px rgba(37,99,235,0.3)}
.btn-primary:hover{background:var(--primary-dark);text-decoration:none}
.btn-outline{padding:12px 28px;background:transparent;color:white;border:1px solid rgba(255,255,255,0.25);border-radius:10px;font-weight:600;text-decoration:none}
.btn-outline:hover{border-color:rgba(255,255,255,0.5);text-decoration:none}
.hero-stats{display:flex;gap:40px;margin-top:36px}
.hero-stat strong{font-size:2rem;font-weight:800;display:block}
.hero-stat span{font-size:0.78rem;color:#64748b;display:block}
.hero-code{background:rgba(0,0,0,0.4);border:1px solid rgba(255,255,255,0.1);border-radius:16px;padding:24px;color:#e2e8f0;font-family:monospace;font-size:0.8rem;line-height:1.8;overflow-x:auto}
.hero-code .c{color:#64748b}
.hero-code .k{color:#7dd3fc}
.hero-code .s{color:#86efac}
section{padding:80px 0}
section.alt{background:var(--surface)}
section.dark{background:#0f172a;color:white}
.section-header{text-align:center;margin-bottom:48px}
.section-header h2{font-size:2rem;font-weight:800}
.section-header p{margin-top:8px;font-size:1.05rem;color:var(--text-soft);max-width:600px;margin-left:auto;margin-right:auto}
.capabilities-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:24px}
.cap-card{padding:32px;border-radius:var(--radius);border:1px solid var(--border);background:white;text-align:center;transition:all 0.2s}
.cap-card:hover{border-color:var(--primary);box-shadow:0 8px 20px rgba(37,99,235,0.06);transform:translateY(-3px)}
.cap-icon{width:56px;height:56px;border-radius:14px;background:linear-gradient(135deg,#eff6ff,#e0e7ff);display:flex;align-items:center;justify-content:center;font-size:1.5rem;margin:0 auto 16px}
.cap-card h3{font-size:1.05rem;font-weight:700;margin-bottom:8px}
.cap-card p{font-size:0.85rem;color:var(--text-soft);line-height:1.6}
.tabs{display:flex;gap:4px;background:var(--surface);border-radius:10px;padding:4px;border:1px solid var(--border);width:fit-content;margin:0 auto 32px}
.tab{padding:10px 24px;border-radius:8px;font-size:0.88rem;font-weight:600;color:var(--text-soft);cursor:pointer;border:none;background:none;transition:all 0.15s}
.tab:hover{color:var(--text)}
.tab.active{background:white;color:var(--primary);box-shadow:0 2px 8px rgba(0,0,0,0.06)}
.tab-content{display:none}
.tab-content.active{display:block}
.usage-panel{max-width:760px;margin:0 auto}
.usage-panel h3{font-size:1.1rem;font-weight:700;margin-bottom:6px}
.usage-panel .desc{color:var(--text-soft);font-size:0.92rem;margin-bottom:20px}
.code-block{background:#1e293b;border-radius:12px;padding:24px;color:#e2e8f0;font-family:monospace;font-size:0.82rem;line-height:1.9;overflow-x:auto;margin-bottom:16px}
.code-block .c{color:#64748b}
.code-block .p{color:#22c55e}
.code-block .s{color:#86efac}
.code-block .n{color:#fbbf24}
.output-block{background:#f0fdf4;border:1px solid #bbf7d0;border-radius:12px;padding:20px;font-size:0.85rem;color:#166534;line-height:1.7;margin-bottom:20px}
.output-block strong{display:block;font-size:0.75rem;color:#15803d;text-transform:uppercase;letter-spacing:0.5px;margin-bottom:8px}
.more-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:12px;max-width:600px;margin:0 auto}
.more-item{display:flex;align-items:center;gap:10px;padding:12px 16px;border-radius:8px;border:1px solid var(--border);font-size:0.88rem;font-weight:500;color:var(--text);text-decoration:none;transition:all 0.15s}
.more-item:hover{border-color:var(--primary);background:#f8faff;text-decoration:none}
.more-item span{color:var(--text-muted);font-size:0.8rem;margin-left:auto}
.bench-table{width:100%;border-collapse:collapse;margin:20px 0;font-size:0.85rem;color:#e2e8f0}
.bench-table th,.bench-table td{padding:12px 16px;text-align:left;border-bottom:1px solid rgba(255,255,255,0.1)}
.bench-table th{color:#94a3b8;font-size:0.75rem;text-transform:uppercase}
.bench-table .win{color:#22c55e;font-weight:700}
.video-section{background:linear-gradient(180deg,#1e293b 0%,#0f172a 100%);color:white;padding:80px 0}
.video-wrapper{max-width:800px;margin:0 auto;border-radius:16px;overflow:hidden;box-shadow:0 20px 60px rgba(0,0,0,0.4);aspect-ratio:16/9;position:relative;background:#000}
.video-wrapper iframe{position:absolute;top:0;left:0;width:100%;height:100%;border:none}
footer{background:#0f172a;color:#94a3b8;padding:48px 0 32px}
.footer-grid{display:grid;grid-template-columns:2fr 1fr 1fr 1fr;gap:40px;margin-bottom:32px}
.footer-brand h3{color:white;font-size:1.2rem;margin-bottom:8px}
.footer-brand p{font-size:0.85rem;line-height:1.7}
.footer-col h4{color:white;font-size:0.85rem;margin-bottom:12px;font-weight:600}
.footer-col a{display:block;font-size:0.83rem;color:#94a3b8;margin-bottom:8px;text-decoration:none}
.footer-col a:hover{color:white}
.footer-bottom{border-top:1px solid #1e293b;padding-top:24px;font-size:0.8rem;text-align:center}
@media(max-width:900px){.hero-grid{grid-template-columns:1fr}.capabilities-grid{grid-template-columns:1fr 1fr}.footer-grid{grid-template-columns:1fr 1fr}.nav-links{display:none}.more-grid{grid-template-columns:1fr}}
@media(max-width:600px){.hero{padding:112px 0 36px}.hero h1{font-size:2rem}.hero-code{display:none}.hero-stats{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;margin-top:28px}.hero-stat strong{font-size:1.6rem}.capabilities-grid{grid-template-columns:1fr}.tabs{flex-wrap:wrap;width:100%}.tab{flex:1;text-align:center;padding:8px 12px;font-size:0.82rem}.bench-table{table-layout:fixed;font-size:0.72rem}.bench-table th,.bench-table td{padding:8px 4px;overflow-wrap:anywhere}}
.hero-models{display:flex;flex-direction:column;align-items:flex-start;gap:8px;margin:0 0 18px}
.hero-flagship{display:inline-flex;align-items:center;gap:6px;max-width:100%;padding:7px 16px;background:rgba(37,99,235,0.08);border:1px solid rgba(37,99,235,0.25);border-radius:999px;font-size:0.85rem;font-weight:500;line-height:1.4;color:#1d4ed8;text-decoration:none}
.hero-flagship.mlt{background:rgba(22,163,74,0.08);border-color:rgba(22,163,74,0.3);color:#15803d}
.hero-flagship strong{font-weight:700}
.hero-flagship:hover{background:rgba(37,99,235,0.14)}
.hero-flagship.mlt:hover{background:rgba(22,163,74,0.14)}
@media(max-width:600px){.hero-flagship{display:block;width:100%;padding:7px 12px;font-size:0.78rem;border-radius:10px}}
</style>
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"SoftwareApplication","name":"FunASR","applicationCategory":"DeveloperApplication","operatingSystem":"Linux, Windows, macOS","offers":{"@type":"Offer","price":"0","priceCurrency":"USD"},"description":"Industrial-grade speech recognition toolkit supporting 50+ languages","url":"https://www.funasr.com","downloadUrl":"https://pypi.org/project/funasr/","author":{"@type":"Organization","name":"FunAudioLLM, Tongyi Lab"}}
</script>
</head>
<body>
<nav class="nav"><div class="container">
<a href="/en/" class="nav-logo">Fun<span>ASR</span></a>
<div class="nav-links">
<a href="#capabilities">Capabilities</a>
<a href="#usage">How to Use</a>
<a href="#benchmark">Benchmark</a>
<a href="#demo">Demo</a>
<a href="https://modelscope.github.io/FunASR/" target="_blank">Docs</a>
<a href="quickstart.html">Quickstart</a>
<a href="models.html">Models</a>
<a href="ecosystem.html">Ecosystem</a><a href="/en/blog/">Blog</a>
<a href="vs-whisper.html">vs Whisper</a>
<a href="/en/donors.html">Thanks</a>
</div>
<a href="/" style="font-size:0.85rem;font-weight:500;color:var(--text-soft);text-decoration:none">中文</a>
<a href="https://github.com/modelscope/FunASR" target="_blank" class="nav-btn">GitHub ★</a>
</div></nav>
<!-- Hero -->
<section class="hero"><div class="container">
<div class="hero-grid">
<div>
<h1>Industrial-Grade<br><span>Speech Recognition</span></h1>
<div class="hero-models">
<a href="https://huggingface.co/FunAudioLLM/Fun-ASR-Nano-2512" target="_blank" rel="noopener" class="hero-flagship">🚀 Flagship <strong>Fun-ASR-Nano</strong> · zh/en/ja + Chinese dialects/accents</a>
<a href="https://huggingface.co/FunAudioLLM/Fun-ASR-MLT-Nano-2512" target="_blank" rel="noopener" class="hero-flagship mlt">🌍 31 languages <strong>Fun-ASR-MLT-Nano</strong> · separate checkpoint</a>
</div>
<p class="hero-sub">Speech recognition, voice activity detection, punctuation restoration, speaker diarization, emotion detection, and audio event recognition — one unified Python API handles it all. 50+ languages, self-hosted, production-ready.</p>
<div class="hero-actions">
<a href="#usage" class="btn-primary">How to Use</a>
<a href="#demo" class="btn-outline">Watch Demo</a>
</div>
<div class="hero-stats">
<div class="hero-stat"><strong>50+</strong><span>Languages</span></div>
<div class="hero-stat"><strong>170x</strong><span>Realtime Speed</span></div>
<div class="hero-stat"><strong>1 API</strong><span>Unified Interface</span></div>
</div>
</div>
<div class="hero-code">
<span class="c"># Start speech recognition service</span><br>
<span class="k">$</span> pip install torch torchaudio
pip install funasr vllm fastapi uvicorn python-multipart<br>
<span class="k">$</span> funasr-server --device cuda<br>
<br>
<span class="c"># Call with OpenAI SDK</span><br>
<span class="k">from</span> openai <span class="k">import</span> OpenAI<br>
client = OpenAI(base_url=<span class="s">"http://localhost:8899/v1"</span>, api_key=<span class="s">"x"</span>)<br>
result = client.audio.transcriptions.create(<br>
&nbsp;&nbsp;&nbsp;&nbsp;model=<span class="s">"fun-asr-nano"</span>,<br>
&nbsp;&nbsp;&nbsp;&nbsp;file=open(<span class="s">"meeting.wav"</span>, <span class="s">"rb"</span>)<br>
)<br>
print(result.text)
</div>
</div>
</div></section>
<!-- Capabilities -->
<section id="capabilities"><div class="container">
<div class="section-header">
<h2>Core Capabilities</h2>
<p>A complete speech understanding pipeline from raw audio to structured output — all in one call</p>
</div>
<div class="capabilities-grid">
<div class="cap-card"><div class="cap-icon">🎙️</div><h3>Speech Recognition</h3><p>End-to-end ASR supporting 50+ languages, including 7 Chinese dialects and 26 regional accents, with automatic language detection</p></div>
<div class="cap-card"><div class="cap-icon">📍</div><h3>Voice Activity Detection</h3><p>Millisecond-precision VAD with adaptive silence thresholds, accurately segmenting speech from silence</p></div>
<div class="cap-card"><div class="cap-icon">✍️</div><h3>Punctuation Restoration</h3><p>Automatically adds punctuation and applies inverse text normalization, producing readable formatted text</p></div>
<div class="cap-card"><div class="cap-icon">👥</div><h3>Speaker Diarization</h3><p>Identifies who said what, labeling each sentence with a speaker ID — ideal for meetings and interviews</p></div>
<div class="cap-card"><div class="cap-icon">😊</div><h3>Emotion Detection</h3><p>Recognizes emotional states — happy, sad, angry, neutral — for customer service QA and sentiment analysis</p></div>
<div class="cap-card"><div class="cap-icon">🔔</div><h3>Audio Event Recognition</h3><p>Detects background music, applause, laughter, crying, and other acoustic events for full scene understanding</p></div>
</div>
</div></section>
<!-- How to Use -->
<section class="alt" id="usage"><div class="container">
<div class="section-header">
<h2>How to Use</h2>
<p>Three steps: Install → Choose your scenario → Call</p>
</div>
<!-- Step 1 -->
<div style="text-align:center;margin-bottom:48px">
<div style="display:inline-block;background:#1e293b;border-radius:10px;padding:14px 32px;font-family:monospace;font-size:0.95rem;color:#e2e8f0">
<span style="color:#22c55e">$</span> pip install torch torchaudio
pip install funasr vllm fastapi uvicorn python-multipart
</div>
<p style="margin-top:10px;font-size:0.82rem;color:var(--text-muted)">Python 3.8+ · GPU 8GB+ · Linux / macOS</p>
</div>
<!-- Step 2: Tabs -->
<div class="tabs">
<button class="tab active" onclick="switchTab('offline')">File Transcription</button>
<button class="tab" onclick="switchTab('stream')">Real-time</button>
<button class="tab" onclick="switchTab('api')">API Integration</button>
</div>
<div class="tab-content active" id="tab-offline">
<div class="usage-panel">
<h3>File Transcription — Upload audio, get complete results</h3>
<p class="desc">Ideal for meeting recordings, video subtitles, and batch processing. Automatically includes VAD segmentation, punctuation, timestamps, and speaker labels.</p>
<div class="code-block">
<span class="c"># Start offline transcription service (works after pip install)</span><br>
<span class="p">$</span> funasr-server --device cuda --port <span class="n">8899</span><br>
<br>
<span class="c"># Call (curl)</span><br>
<span class="p">$</span> curl -X POST http://localhost:<span class="n">8899</span>/v1/audio/transcriptions \<br>
&nbsp;&nbsp;&nbsp;&nbsp;-F "[email protected]" -F "model=fun-asr-nano" -F "response_format=verbose_json"
</div>
<div class="output-block">
<strong>Output</strong>
[00:01.7 → 00:05.5] Speaker 0: Let's discuss the three topics today.<br>
[00:05.8 → 00:08.2] Speaker 1: Sounds good. First one is the Q3 plan.<br>
[00:08.5 → 00:12.1] Speaker 0: Go ahead, we have 30 minutes.
</div>
</div>
</div>
<div class="tab-content" id="tab-stream">
<div class="usage-panel">
<h3>Real-time Recognition — Speak and see results instantly</h3>
<p class="desc">For live captions, broadcast transcription, and voice assistants. WebSocket-based protocol with confirmed text that never changes and new text that updates continuously.</p>
<div class="code-block">
<span class="c"># Streaming requires source code (not in pip yet)</span><br>
<span class="p">$</span> git clone https://github.com/modelscope/FunASR.git && cd FunASR<br>
<span class="p">$</span> python examples/industrial_data_pretraining/fun_asr_nano/serve_realtime_ws.py --port <span class="n">10095</span> --language 中文<br>
<br>
<span class="c"># Open the built-in browser client</span><br>
<span class="p">$</span> open client_mic.html<br>
<br>
<span class="c"># Or connect via Python</span><br>
<span class="p">$</span> python client_python.py --server ws://localhost:<span class="n">10095</span> --mic
</div>
<div class="output-block">
<strong>Real-time output (updates progressively)</strong>
[live] Let's discuss the...<br>
[confirmed] Let's discuss the three topics today.<br>
[live] Sounds good first...<br>
[confirmed] Sounds good. First one is the Q3 plan.
</div>
</div>
</div>
<div class="tab-content" id="tab-api">
<div class="usage-panel">
<h3>API Integration — OpenAI-compatible, zero-code changes for AI frameworks</h3>
<p class="desc">Standard /v1/audio/transcriptions endpoint. LangChain, AutoGen, Dify, and Coze can connect directly without any code modifications.</p>
<div class="code-block">
<span class="c"># Start OpenAI-compatible API</span><br>
<span class="p">$</span> funasr-server --device cuda<br>
<br>
<span class="c"># Python (identical to OpenAI Whisper API)</span><br>
from openai import OpenAI<br>
client = OpenAI(base_url=<span class="s">"http://localhost:8899/v1"</span>, api_key=<span class="s">"x"</span>)<br>
<br>
result = client.audio.transcriptions.create(<br>
&nbsp;&nbsp;&nbsp;&nbsp;model=<span class="s">"fun-asr-nano"</span>,<br>
&nbsp;&nbsp;&nbsp;&nbsp;file=open(<span class="s">"audio.wav"</span>, <span class="s">"rb"</span>),<br>
&nbsp;&nbsp;&nbsp;&nbsp;response_format=<span class="s">"verbose_json"</span><br>
)<br>
print(result.text)
</div>
<div class="output-block">
<strong>JSON Response</strong>
{"text": "Let's discuss the three topics today.", "segments": [{"start": 1.7, "end": 5.5, "text": "..."}], "duration": 12.1}
</div>
</div>
</div>
<!-- Step 3 -->
<div style="margin-top:48px">
<h3 style="text-align:center;font-size:1.1rem;margin-bottom:20px;color:var(--text)">Explore More</h3>
<div class="more-grid">
<a class="more-item" href="https://github.com/modelscope/FunASR/blob/main/docs/vllm_guide.md" target="_blank">🔥 Hotword Boosting <span>→</span></a>
<a class="more-item" href="https://modelscope.github.io/FunASR/tutorial.html" target="_blank">👥 Speaker Diarization <span>→</span></a>
<a class="more-item" href="https://github.com/QwenAudio/SenseVoice" target="_blank">😊 Emotion Detection <span>→</span></a>
<a class="more-item" href="https://modelscope.github.io/FunASR/tutorial.html" target="_blank">🌍 Multilingual <span>→</span></a>
<a class="more-item" href="https://modelscope.github.io/FunASR/training.html" target="_blank">🎯 Fine-tuning <span>→</span></a>
<a class="more-item" href="https://github.com/modelscope/FunASR/blob/main/docs/vllm_guide.md" target="_blank">⚡ vLLM Acceleration <span>→</span></a>
</div>
</div>
</div></section>
<!-- Benchmark -->
<section class="dark" id="benchmark"><div class="container">
<div class="section-header">
<h2 style="color:white">Performance</h2>
<p style="color:#94a3b8">184 files / 11,541 seconds / Fun-ASR-Nano</p>
</div>
<table class="bench-table">
<thead><tr><th>Model</th><th>Engine</th><th>RTFx</th><th>CER</th><th>Notes</th></tr></thead>
<tbody>
<tr><td>Fun-ASR-Nano</td><td>PyTorch</td><td>21</td><td>8.06%</td><td>Baseline</td></tr>
<tr><td>Fun-ASR-Nano</td><td class="win">vLLM batch</td><td class="win">340</td><td>8.20%</td><td class="win">16x speedup</td></tr>
<tr><td>Fun-ASR-Nano</td><td class="win">Offline service</td><td class="win">102</td><td>8.14%</td><td>Incl. VAD segment timing</td></tr>
<tr><td>GLM-ASR-Nano</td><td class="win">vLLM batch</td><td class="win">265</td><td>12.93%</td><td>Community model</td></tr>
</tbody>
</table>
<p style="text-align:center;color:#64748b;font-size:0.82rem;margin-top:16px">Accuracy matches PyTorch exactly (CER delta &lt; 0.2%), with 16–340x speedup. <a href="https://modelscope.github.io/FunASR/benchmark.html" style="color:#60a5fa" target="_blank">Full report →</a></p>
</div></section>
<!-- Demo -->
<section class="video-section" id="demo"><div class="container">
<div class="section-header">
<h2 style="color:white">Product Demo</h2>
<p style="color:#94a3b8">Watch FunASR real-time speech recognition in action</p>
</div>
<div class="video-wrapper">
<iframe src="//player.bilibili.com/player.html?isOutside=true&aid=116639869699659&bvid=BV1QwVP6eEfp&cid=38624300030&p=1" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"></iframe>
</div>
</div></section>
<!-- Footer -->
<footer><div class="container">
<div class="footer-grid">
<div class="footer-brand">
<h3>FunASR</h3>
<p>Industrial-grade speech recognition from Tongyi Lab. All-in-one speech understanding, built for production.</p>
</div>
<div class="footer-col"><h4>Documentation</h4>
<a href="https://modelscope.github.io/FunASR/tutorial.html">Getting Started</a>
<a href="https://modelscope.github.io/FunASR/training.html">Training Guide</a>
<a href="https://github.com/modelscope/FunASR/blob/main/docs/vllm_guide.md">vLLM Guide</a>
<a href="https://modelscope.github.io/FunASR/api.html">API Reference</a>
</div>
<div class="footer-col"><h4>Ecosystem</h4>
<a href="https://github.com/QwenAudio/Fun-ASR">Fun-ASR-Nano</a>
<a href="https://github.com/QwenAudio/SenseVoice">SenseVoice</a>
<a href="https://github.com/modelscope/FunClip">FunClip</a>
<a href="https://github.com/QwenAudio/CosyVoice">CosyVoice</a>
</div>
<div class="footer-col"><h4>Community</h4>
<a href="https://github.com/modelscope/FunASR">GitHub</a>
<a href="https://github.com/modelscope/FunASR/discussions">Discussions</a>
<a href="https://github.com/modelscope/FunASR/issues">Issues</a>
</div>
</div>
<div class="footer-bottom">© 2024-2026 Tongyi Lab, Alibaba Group · <a href="https://github.com/modelscope/FunASR/blob/main/LICENSE" style="color:#94a3b8">MIT License</a></div>
</div></footer>
<script>
function switchTab(id){
document.querySelectorAll('.tab').forEach(t=>t.classList.remove('active'));
document.querySelectorAll('.tab-content').forEach(t=>t.classList.remove('active'));
event.target.classList.add('active');
document.getElementById('tab-'+id).classList.add('active');
}
</script>
<script src="/stats/tracker.js" async></script>
</body>
</html>
@@ -0,0 +1,132 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Run FunASR on CPU: the llama.cpp / GGUF Runtime (a whisper.cpp Alternative) | FunASR</title>
<meta name="description" content="Download-and-run FunASR llama.cpp runtime: a single binary, no Python or GPU, running SenseVoice/Paraformer/Fun-ASR-Nano on CPU/edge with built-in VAD. Chinese CER ~1/3 of whisper.cpp. Prebuilt binaries for Linux/macOS/Windows.">
<meta name="keywords" content="FunASR llama.cpp, GGUF speech recognition, CPU speech recognition, offline speech to text, whisper.cpp alternative, on-device ASR, speech to text without GPU, SenseVoice GGUF">
<link rel="icon" href="/logo.png">
<meta property="og:title" content="Run FunASR on CPU: the llama.cpp / GGUF Runtime (a whisper.cpp Alternative) | FunASR"><meta property="og:description" content="Download-and-run FunASR llama.cpp runtime: a single binary, no Python or GPU, running SenseVoice/Paraformer/Fun-ASR-Nano on CPU/edge with built-in VAD. Chinese CER ~1/3 of whisper.cpp. Prebuilt binaries for Linux/macOS/Windows.">
<meta property="og:type" content="website"><meta property="og:url" content="https://www.funasr.com/en/llama-cpp.html">
<meta property="og:image" content="https://www.funasr.com/logo.png">
<link rel="canonical" href="https://www.funasr.com/en/llama-cpp.html">
<link rel="alternate" hreflang="en" href="https://www.funasr.com/en/llama-cpp.html"><link rel="alternate" hreflang="zh" href="https://www.funasr.com/llama-cpp.html">
<link rel="alternate" hreflang="x-default" href="https://www.funasr.com/en/llama-cpp.html">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"SoftwareApplication","name":"FunASR llama.cpp runtime","description":"Download-and-run FunASR llama.cpp runtime: a single binary, no Python or GPU, running SenseVoice/Paraformer/Fun-ASR-Nano on CPU/edge with built-in VAD. Chinese CER ~1/3 of whisper.cpp. Prebuilt binaries for Linux/macOS/Windows.","applicationCategory":"DeveloperApplication","operatingSystem":"Linux, macOS, Windows","offers":{"@type":"Offer","price":"0","priceCurrency":"USD"},"author":{"@type":"Organization","name":"FunASR / Tongyi Lab"},"url":"https://www.funasr.com/en/llama-cpp.html"}
</script>
<style>:root{--primary:#2563eb;--primary-dark:#1d4ed8;--bg:#fff;--surface:#f8fafc;--border:#e2e8f0;--text:#0f172a;--text-soft:#475569;--text-muted:#94a3b8;--radius:12px}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:'Inter',-apple-system,sans-serif;color:var(--text);line-height:1.7}
a{color:var(--primary);text-decoration:none}a:hover{text-decoration:underline}
.container{max-width:800px;margin:0 auto;padding:0 24px}
.nav{position:fixed;top:0;left:0;right:0;z-index:100;background:rgba(255,255,255,0.9);backdrop-filter:blur(12px);border-bottom:1px solid var(--border);padding:14px 0}
.nav .container{max-width:1120px;display:flex;align-items:center;gap:24px}
.nav-logo{font-size:1.2rem;font-weight:800;color:var(--text)}.nav-logo span{color:var(--primary)}
.nav-links{display:flex;gap:20px;margin-left:auto;flex-wrap:wrap}
.nav-links a{font-size:0.85rem;font-weight:500;color:var(--text-soft)}
.nav-btn{padding:7px 16px;background:var(--primary);color:#fff;border-radius:7px;font-size:0.83rem;font-weight:600}
article{padding:120px 0 80px}
h1{font-size:2rem;font-weight:800;line-height:1.3;margin-bottom:14px}
h2{font-size:1.3rem;font-weight:700;margin:36px 0 14px;padding-top:16px;border-top:1px solid var(--border)}
h3{font-size:1.05rem;font-weight:700;margin:22px 0 10px}
p{margin-bottom:14px;color:var(--text-soft)}
ul,ol{margin:0 0 14px 22px;color:var(--text-soft)}li{margin-bottom:6px}
table{width:100%;border-collapse:collapse;margin:16px 0;font-size:0.86rem}
th,td{padding:10px 12px;text-align:left;border-bottom:1px solid var(--border)}
th{font-weight:600;background:var(--surface);font-size:0.78rem;color:var(--text-muted)}
pre{background:#1e293b;color:#e2e8f0;padding:18px;border-radius:10px;overflow-x:auto;font-size:0.82rem;line-height:1.7;margin:14px 0}
code{font-family:ui-monospace,Menlo,monospace}
p code,li code{background:var(--surface);padding:2px 6px;border-radius:5px;font-size:0.85em;color:var(--primary-dark)}
.post-meta{color:var(--text-muted);font-size:0.85rem;margin-bottom:24px}
.cta{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:24px;margin:28px 0;text-align:center}
.cta a.btn{display:inline-block;padding:10px 24px;background:var(--primary);color:#fff;border-radius:8px;font-weight:600}
.post-list{list-style:none;margin:0;padding:0}
.post-list li{margin:0 0 8px}
.post-card{display:block;border:1px solid var(--border);border-radius:var(--radius);padding:20px 22px;margin-bottom:14px}
.post-card:hover{border-color:var(--primary);text-decoration:none}
.post-card h2{border:none;padding:0;margin:0 0 6px;font-size:1.15rem;color:var(--text)}
.post-card p{margin:0;color:var(--text-soft);font-size:0.9rem}
.post-card .date{color:var(--text-muted);font-size:0.8rem}
footer{background:#0f172a;color:#94a3b8;padding:28px 0;text-align:center;font-size:0.8rem}
footer a{color:#94a3b8}
.dl-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:12px;margin:18px 0}
.dl-card{border:1px solid var(--border);border-radius:10px;padding:16px 18px}
.dl-card b{color:var(--text)}
.hero{text-align:center;padding:20px 0 8px}
.hero .tags{color:var(--text-muted);font-size:0.9rem;margin-top:8px}
@media(max-width:900px){.nav-links{display:none}.nav .container{gap:16px}.nav-logo{margin-right:auto}h1{font-size:1.75rem}table{table-layout:fixed;font-size:0.78rem}th,td{padding:8px 4px;overflow-wrap:anywhere}p code,li code{overflow-wrap:anywhere;word-break:break-word}}
</style>
</head>
<body>
<nav class="nav"><div class="container"><a href="/en/" class="nav-logo">Fun<span>ASR</span></a><div class="nav-links"><a href="/en/#capabilities">Capabilities</a><a href="/en/#usage">How to Use</a><a href="/en/#benchmark">Benchmark</a><a href="/en/#demo">Demo</a><a href="https://modelscope.github.io/FunASR/" target="_blank">Docs</a><a href="/en/quickstart.html">Quickstart</a><a href="/en/models.html">Models</a><a href="/en/ecosystem.html">Ecosystem</a><a href="/en/blog/">Blog</a><a href="/en/vs-whisper.html">vs Whisper</a><a href="/en/donors.html">Thanks</a></div><a href="https://www.funasr.com/llama-cpp.html" style="font-size:0.83rem;font-weight:500;color:var(--text-soft)">中文</a><a href="https://github.com/modelscope/FunASR" target="_blank" class="nav-btn">GitHub ★</a></div></nav>
<article><div class="container">
<div class="hero"><h1>Run FunASR on CPU — the llama.cpp / GGUF Runtime</h1>
<p class="tags">Single binary · No Python · No GPU · Quantized weights · whisper.cpp-style on-device ASR, strong on Chinese</p></div>
<p><strong>FunASR on llama.cpp</strong> is to FunASR what <a href="https://github.com/ggml-org/whisper.cpp" target="_blank">whisper.cpp</a> is to Whisper: it runs SenseVoice / Paraformer / Fun-ASR-Nano on the <a href="https://github.com/ggml-org/llama.cpp" target="_blank">ggml</a> stack, so the models work <strong>where there is no GPU and no Python</strong> (laptops, edge boxes, embedded C/C++ apps), complementing the PyTorch / vLLM paths for GPU serving. FSMN-VAD is built into the binaries.</p>
<h2>Download prebuilt binaries (download &amp; run)</h2>
<p>Linux (x64/arm64), macOS (arm64), Windows (x64) — static, self-contained, zero dependencies. Available in all three repos' Releases:</p>
<div class="dl-grid">
<a class="dl-card" href="https://github.com/modelscope/FunASR/releases" target="_blank"><b>⬇ modelscope/FunASR</b><br><span style="color:var(--text-soft);font-size:0.88rem">all three models</span></a>
<a class="dl-card" href="https://github.com/modelscope/FunASR/releases/tag/runtime-llamacpp-v0.1.9" target="_blank"><b>⬇ Current runtime v0.1.8</b><br><span style="color:var(--text-soft);font-size:0.88rem">Linux/Windows Vulkan + Windows CUDA + 9 platform assets</span></a>
<a class="dl-card" href="https://github.com/modelscope/FunASR/releases/tag/v1.3.26" target="_blank"><b>Python package v1.3.26</b><br><span style="color:var(--text-soft);font-size:0.88rem">--hub ms fix + runtime download table</span></a>
<a class="dl-card" href="https://github.com/QwenAudio/SenseVoice/releases" target="_blank"><b>⬇ QwenAudio/SenseVoice</b><br><span style="color:var(--text-soft);font-size:0.88rem">multilingual + emotion/events</span></a>
<a class="dl-card" href="https://github.com/QwenAudio/Fun-ASR/releases" target="_blank"><b>⬇ QwenAudio/Fun-ASR</b><br><span style="color:var(--text-soft);font-size:0.88rem">Fun-ASR-Nano (LLM-ASR)</span></a>
</div>
<p>Recommended download entry today: <a href="https://github.com/modelscope/FunASR/releases/tag/runtime-llamacpp-v0.1.9" target="_blank">runtime-llamacpp-v0.1.9</a>. Common accelerated builds include <a href="https://github.com/modelscope/FunASR/releases/download/runtime-llamacpp-v0.1.9/funasr-llamacpp-linux-x64-vulkan.tar.gz" target="_blank">funasr-llamacpp-linux-x64-vulkan.tar.gz</a>, <a href="https://github.com/modelscope/FunASR/releases/download/runtime-llamacpp-v0.1.9/funasr-llamacpp-windows-x64-vulkan.zip" target="_blank">funasr-llamacpp-windows-x64-vulkan.zip</a>, and <a href="https://github.com/modelscope/FunASR/releases/download/runtime-llamacpp-v0.1.9/funasr-llamacpp-windows-x64-cuda.zip" target="_blank">funasr-llamacpp-windows-x64-cuda.zip</a>. Python users can install <code>python -m pip install -U "funasr==1.3.26"</code>; the <a href="https://github.com/modelscope/FunASR/releases/tag/v1.3.26" target="_blank">v1.3.26 Latest Release</a> also lists the same runtime download links and SHA-256 checksums.</p>
<h2>Three lines to run</h2>
<pre># 1) Unpack the binaries, fetch a model (downloads GGUF + VAD)
bash download-funasr-model.sh sensevoice ./gguf
# 2) Get text directly (in-binary detok, no Python)
llama-funasr-sensevoice -m ./gguf/SenseVoiceSmall-f16.gguf --vad ./gguf/fsmn-vad.gguf -a audio.wav</pre>
<p>Other models: <code>download-funasr-model.sh paraformer</code> with <code>llama-funasr-paraformer</code>; <code>download-funasr-model.sh nano</code> with <code>llama-funasr-cli</code> (Fun-ASR-Nano for zh/en/ja + Chinese dialects/accents). The 31-language scope belongs to the separate MLT-Nano checkpoint.</p>
<h2>Accuracy: far ahead of whisper.cpp on Chinese</h2>
<p>Same 184-clip Chinese test set, character error rate (CER, micro-avg, lower is better):</p>
<table>
<tr><th>Model</th><th>CER ↓</th><th>Notes</th></tr>
<tr><td><strong>FunASR SenseVoice</strong></td><td><strong>8.01%</strong></td><td>multilingual + emotion/events</td></tr>
<tr><td><strong>FunASR Paraformer</strong></td><td><strong>9.85%</strong></td><td>non-autoregressive, industrial Chinese</td></tr>
<tr><td><strong>FunASR Fun-ASR-Nano</strong></td><td><strong>8.30%</strong></td><td>LLM-ASR, zh/en/ja + Chinese dialects/accents</td></tr>
<tr><td>whisper.cpp small</td><td>22.12%</td><td></td></tr>
<tr><td>whisper.cpp large-v3-turbo</td><td>23.15%</td><td></td></tr>
<tr><td>whisper.cpp base</td><td>31.33%</td><td></td></tr>
</table>
<p>FunASR's Chinese CER is roughly a third of whisper.cpp's. Full methodology in each repo's <a href="https://github.com/modelscope/FunASR/blob/main/runtime/llama.cpp/BENCHMARKS.md" target="_blank">runtime/llama.cpp/BENCHMARKS.md</a>.</p>
<h2>Model sizes &amp; accuracy (quantized)</h2>
<p>Quantized builds are smaller and faster with virtually unchanged accuracy (184-file micro-CER):</p>
<table>
<tr><th>Model</th><th>Type</th><th>Size</th><th>CER ↓</th><th>Speed</th></tr>
<tr><td>SenseVoice encoder</td><td>f16</td><td>470 MB</td><td>8.01%</td><td>23×</td></tr>
<tr><td>SenseVoice encoder</td><td><strong>q8</strong></td><td><strong>254 MB</strong></td><td>7.99%</td><td>27×</td></tr>
<tr><td>Paraformer encoder</td><td>f16</td><td>435 MB</td><td>9.85%</td><td>22×</td></tr>
<tr><td>Paraformer encoder</td><td><strong>q8</strong></td><td><strong>237 MB</strong></td><td>9.78%</td><td>27×</td></tr>
<tr><td>Fun-ASR-Nano LLM*</td><td>q8_0</td><td>805 MB</td><td>8.30%</td><td>6.0×</td></tr>
<tr><td>Fun-ASR-Nano LLM*</td><td><strong>q5_K_M</strong></td><td>551 MB</td><td><strong>8.25%</strong></td><td>5.7×</td></tr>
<tr><td>Fun-ASR-Nano LLM*</td><td><strong>q4_K_M</strong></td><td><strong>484 MB</strong></td><td>8.35%</td><td>6.1×</td></tr>
</table>
<p style="font-size:0.9rem">* Fun-ASR-Nano also needs the encoder (f16, 470 MB). The q8 encoder halves size while CER even drops slightly; the three Nano LLM tiers are nearly identical — pick <strong>q4_K_M</strong> (smallest) or <strong>q5_K_M</strong> (best).</p>
<h2>What's included</h2>
<ul>
<li>6 binaries: <code>llama-funasr-{cli,encoder,embd,sensevoice,paraformer,vad}</code>, static, no .so dependencies.</li>
<li>Built-in FSMN-VAD (<code>--vad</code>), in-binary detokenization (prints text), kaldi-compatible fbank front end.</li>
<li>GGUF models on Hugging Face: <a href="https://huggingface.co/FunAudioLLM" target="_blank">FunAudioLLM</a> / <a href="https://huggingface.co/funasr" target="_blank">funasr</a> (f16 / f32 / <strong>q8</strong> with embedded vocab; <strong>q8 is ~half the size of f16 with the same accuracy</strong>).</li>
<li>Source &amp; docs: <a href="https://github.com/modelscope/FunASR/tree/main/runtime/llama.cpp" target="_blank">runtime/llama.cpp/</a> (README / DESIGN / BENCHMARKS).</li>
</ul>
<div class="cta"><p><strong>If it helps, a GitHub Star really supports the project 👇</strong> Fully open-source, commercial-friendly.</p>
<p><a class="btn" href="https://github.com/modelscope/FunASR" target="_blank">⭐ Star FunASR</a></p>
<p style="margin-top:10px;font-size:0.85rem">Also star: <a href="https://github.com/QwenAudio/SenseVoice" target="_blank">SenseVoice</a> · <a href="https://github.com/QwenAudio/Fun-ASR" target="_blank">Fun-ASR</a> · <a href="https://github.com/modelscope/FunClip" target="_blank">FunClip</a></p></div>
<p style="font-size:0.9rem">Further reading: <a href="/en/blog/funasr-llama-cpp-whisper-cpp-alternative.html">FunASR on llama.cpp (a whisper.cpp alternative) — deep dive</a></p>
</div></article>
<footer><div class="container">© 2024-2026 Tongyi Lab, Alibaba Group · <a href="https://github.com/modelscope/FunASR/blob/main/LICENSE">MIT License</a></div></footer>
</body>
</html>
@@ -0,0 +1,235 @@
<!DOCTYPE html>
<html lang="en">
<head><meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate"><meta http-equiv="Pragma" content="no-cache"><meta http-equiv="Expires" content="0">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>FunASR Models — SenseVoice, Paraformer, Fun-ASR-Nano, cam++</title>
<meta name="description" content="Choose the right FunASR model: SenseVoice (170x realtime, 50+ langs), Paraformer (Chinese accuracy and reliable character timestamps), Fun-ASR-Nano (LLM-based, vLLM accelerated), and cam++ (speaker diarization).">
<link rel="icon" href="../logo.png">
<meta property="og:title" content="FunASR Models — Speech Recognition Model Comparison">
<meta property="og:description" content="Compare FunASR models: SenseVoice, Paraformer, Fun-ASR-Nano for speech recognition. Choose by speed, accuracy, language support, and features.">
<meta property="og:type" content="article">
<meta property="og:url" content="https://www.funasr.com/en/models.html">
<meta property="og:image" content="https://www.funasr.com/logo.png">
<link rel="canonical" href="https://www.funasr.com/en/models.html">
<link rel="alternate" hreflang="zh" href="https://www.funasr.com/models.html">
<link rel="alternate" hreflang="en" href="https://www.funasr.com/en/models.html">
<link rel="alternate" hreflang="x-default" href="https://www.funasr.com/en/models.html">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<style>
:root{--primary:#2563eb;--primary-dark:#1d4ed8;--bg:#fff;--surface:#f8fafc;--border:#e2e8f0;--text:#0f172a;--text-soft:#475569;--text-muted:#94a3b8;--radius:12px;--green:#16a34a;--orange:#ea580c}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:'Inter',-apple-system,sans-serif;color:var(--text);line-height:1.7;-webkit-font-smoothing:antialiased}
a{color:var(--primary);text-decoration:none}
a:hover{text-decoration:underline}
.container{max-width:960px;margin:0 auto;padding:0 24px}
.nav{position:fixed;top:0;left:0;right:0;z-index:100;background:rgba(255,255,255,0.9);backdrop-filter:blur(12px);border-bottom:1px solid var(--border);padding:14px 0}
.nav .container{max-width:1120px;display:flex;align-items:center;gap:24px}
.nav-logo{font-size:1.2rem;font-weight:800;color:var(--text);text-decoration:none}
.nav-logo span{color:var(--primary)}
.nav-links{display:flex;gap:20px;margin-left:auto}
.nav-links a{font-size:0.85rem;font-weight:500;color:var(--text-soft);text-decoration:none}
.nav-btn{padding:7px 16px;background:var(--primary);color:white;border-radius:7px;font-size:0.83rem;font-weight:600;text-decoration:none}
article{padding:120px 0 80px}
h1{font-size:2rem;font-weight:800;line-height:1.3;margin-bottom:8px}
.subtitle{font-size:1.05rem;color:var(--text-soft);margin-bottom:32px}
h2{font-size:1.3rem;font-weight:700;margin:40px 0 16px;padding-top:16px;border-top:1px solid var(--border)}
h2:first-of-type{border-top:none;margin-top:24px}
h3{font-size:1.05rem;font-weight:700;margin:20px 0 8px}
p{margin-bottom:14px;color:var(--text-soft)}
table{width:100%;border-collapse:collapse;margin:16px 0;font-size:0.88rem}
th{background:var(--surface);font-weight:600;text-align:left;padding:10px 14px;border-bottom:2px solid var(--border)}
td{padding:10px 14px;border-bottom:1px solid var(--border)}
tr:hover{background:var(--surface)}
.badge{display:inline-block;font-size:0.72rem;font-weight:600;padding:2px 8px;border-radius:4px;margin-right:4px}
.badge-blue{background:#eff6ff;color:var(--primary)}
.badge-green{background:#f0fdf4;color:var(--green)}
.badge-orange{background:#fff7ed;color:var(--orange)}
.model-card{border:1px solid var(--border);border-radius:var(--radius);padding:24px;margin:16px 0;background:var(--bg)}
.model-card:hover{box-shadow:0 4px 12px rgba(0,0,0,0.06)}
.model-name{font-size:1.15rem;font-weight:800;margin-bottom:4px}
.model-meta{font-size:0.82rem;color:var(--text-muted);margin-bottom:12px}
.model-desc{font-size:0.9rem;color:var(--text-soft);margin-bottom:12px}
.model-features{display:flex;flex-wrap:wrap;gap:6px}
pre{background:#1e293b;color:#e2e8f0;padding:18px;border-radius:10px;overflow-x:auto;font-size:0.82rem;line-height:1.7;margin:14px 0}
code{font-family:'SF Mono',Consolas,monospace;font-size:0.88em}
.highlight{background:#fef3c7;padding:16px 20px;border-radius:10px;border-left:4px solid #f59e0b;margin:16px 0;font-size:0.88rem}
footer{background:#0f172a;color:#94a3b8;padding:32px 0;font-size:0.82rem;text-align:center;margin-top:60px}
footer a{color:#60a5fa}
@media(max-width:640px){h1{font-size:1.5rem}.nav .container{gap:12px}.nav-links{gap:12px;margin-left:auto}.nav-links a{display:none}.nav-links a:nth-last-child(-n+2){display:block}.nav-links .nav-btn{color:white}table{display:block;overflow-x:auto;white-space:nowrap;font-size:0.78rem;-webkit-overflow-scrolling:touch}td,th{padding:8px}}
</style>
</head>
<body>
<nav class="nav"><div class="container"><a class="nav-logo" href="../en/">Fun<span>ASR</span></a><div class="nav-links"><a href="/en/#capabilities">Capabilities</a><a href="/en/#usage">How to Use</a><a href="/en/#benchmark">Benchmark</a><a href="/en/#demo">Demo</a><a href="https://modelscope.github.io/FunASR/" target="_blank">Docs</a><a href="quickstart.html">Quickstart</a><a href="models.html">Models</a><a href="ecosystem.html">Ecosystem</a><a href="/en/blog/">Blog</a><a href="vs-whisper.html">vs Whisper</a><a href="/en/donors.html">Thanks</a><a href="/models.html" style="font-size:0.85rem;font-weight:500;color:var(--text-soft);text-decoration:none">中文</a><a href="https://github.com/modelscope/FunASR" target="_blank" class="nav-btn">GitHub ★</a></div></div></nav>
<article>
<div class="container">
<h1>FunASR Models</h1>
<p class="subtitle">Choose the right model for your use case — from ultra-fast multilingual recognition to the highest Chinese accuracy.</p>
<h2>Quick Comparison</h2>
<table>
<thead>
<tr><th>Model</th><th>Speed</th><th>Languages</th><th>Params</th><th>Best For</th></tr>
</thead>
<tbody>
<tr><td><strong>Fun-ASR-Nano</strong> ⭐</td><td>vLLM 340x</td><td>zh/en/ja + Chinese dialects/accents</td><td>800M</td><td>Flagship · LLM-ASR · hardest cases</td></tr>
<tr><td><strong>Fun-ASR-MLT-Nano</strong></td><td>vLLM</td><td>31</td><td>800M</td><td>Separate multilingual checkpoint</td></tr>
<tr><td><strong>SenseVoice Small</strong></td><td>170x realtime</td><td>50+</td><td>234M</td><td>Fast multilingual, emotion detection</td></tr>
<tr><td><strong>Paraformer-zh</strong></td><td>120x realtime</td><td>zh, yue</td><td>220M</td><td>Best Chinese accuracy</td></tr>
<tr><td><strong>cam++</strong></td><td>realtime</td><td>any</td><td>7.2M</td><td>Speaker diarization &amp; verification</td></tr>
</tbody>
</table>
<h2>ASR Models</h2>
<div class="model-card">
<div class="model-name">Fun-ASR-Nano <span class="badge badge-orange">⭐ Flagship / default</span></div>
<div class="model-meta">800M params &middot; LLM-based (SenseVoice encoder + Qwen3-0.6B) &middot; <a href="https://github.com/QwenAudio/Fun-ASR">GitHub</a> &middot; <a href="https://huggingface.co/FunAudioLLM/Fun-ASR-Nano-2512">HuggingFace</a></div>
<div class="model-desc">Next-generation LLM-based ASR model. Combines SenseVoice's audio encoder with Qwen3-0.6B language model for superior context understanding. Supports vLLM acceleration for high-throughput batch inference and real-time streaming. The released <code>model.pt</code> checkpoint does not provide reliable checkpoint-native character timestamps (<a href="https://github.com/QwenAudio/Fun-ASR/issues/106" target="_blank" rel="noopener">issue #106</a>).</div>
<div class="model-features">
<span class="badge badge-green">vLLM accelerated</span>
<span class="badge badge-blue">zh/en/ja + Chinese dialects/accents</span>
<span class="badge badge-blue">Streaming</span>
<span class="badge badge-orange">LLM-quality</span>
</div>
<h3>When to use</h3>
<p>Best for high-throughput batch processing, real-time subtitles, and scenarios where LLM-quality context understanding improves output (e.g., proper nouns and code-switching). For reliable character-level timestamps, use Paraformer.</p>
<pre># With vLLM acceleration
from funasr import AutoModel
model = AutoModel(model="FunAudioLLM/Fun-ASR-Nano-2512", device="cuda", backend="vllm")
result = model.generate(input="audio.wav")
print(result[0]["text"])</pre>
</div>
<div class="model-card">
<div class="model-name">Fun-ASR-MLT-Nano <span class="badge badge-blue">31 languages</span></div>
<div class="model-meta">800M params &middot; Separate multilingual checkpoint &middot; <a href="https://huggingface.co/FunAudioLLM/Fun-ASR-MLT-Nano-2512">HuggingFace</a> &middot; <a href="https://modelscope.cn/models/FunAudioLLM/Fun-ASR-MLT-Nano-2512">ModelScope</a></div>
<div class="model-desc">A separate checkpoint for broad multilingual recognition across 31 languages. Its model ID and language scope differ from flagship Fun-ASR-Nano.</div>
<div class="model-features">
<span class="badge badge-green">vLLM accelerated</span>
<span class="badge badge-blue">31 languages</span>
<span class="badge badge-orange">Separate checkpoint</span>
</div>
<h3>When to use</h3>
<p>Choose MLT-Nano for recognition across 31 languages; choose flagship Nano for zh/en/ja and Chinese dialects/accents.</p>
<pre>from funasr import AutoModel
model = AutoModel(model="FunAudioLLM/Fun-ASR-MLT-Nano-2512", device="cuda")
result = model.generate(input="audio.wav")</pre>
</div>
<div class="model-card">
<div class="model-name">SenseVoice Small</div>
<div class="model-meta">234M params &middot; Non-autoregressive &middot; <a href="https://github.com/QwenAudio/SenseVoice">GitHub</a> &middot; <a href="https://huggingface.co/FunAudioLLM/SenseVoiceSmall">HuggingFace</a></div>
<div class="model-desc">Ultra-fast speech recognition with built-in emotion and audio event detection. Supports 50+ languages including Chinese, English, Japanese, Korean, French, German, and more. Non-autoregressive architecture delivers 170x realtime speed on GPU.</div>
<div class="model-features">
<span class="badge badge-green">170x realtime</span>
<span class="badge badge-blue">50+ languages</span>
<span class="badge badge-orange">Emotion detection</span>
<span class="badge badge-blue">Audio events</span>
<span class="badge badge-green">CPU-viable</span>
</div>
<h3>When to use</h3>
<p>Best for: multilingual applications, real-time streaming, batch processing large audio collections, applications needing emotion or audio event detection.</p>
<pre>from funasr import AutoModel
model = AutoModel(model="iic/SenseVoiceSmall")
result = model.generate(input="audio.wav")
print(result[0]["text"])</pre>
</div>
<div class="model-card">
<div class="model-name">Paraformer-zh Large</div>
<div class="model-meta">220M params &middot; Non-autoregressive &middot; <a href="https://huggingface.co/funasr/paraformer-zh">HuggingFace</a></div>
<div class="model-desc">Highest-accuracy Chinese speech recognition model. Non-autoregressive with CTC-guided attention, trained on 60,000+ hours of Mandarin speech. Includes built-in punctuation restoration and timestamp prediction.</div>
<div class="model-features">
<span class="badge badge-green">120x realtime</span>
<span class="badge badge-blue">Chinese + Cantonese</span>
<span class="badge badge-green">Best accuracy</span>
<span class="badge badge-blue">Timestamps</span>
<span class="badge badge-blue">Punctuation</span>
</div>
<h3>When to use</h3>
<p>Best for: Chinese-only applications where accuracy is the top priority — meeting transcription, subtitle generation, voice input, training data annotation.</p>
<pre>from funasr import AutoModel
model = AutoModel(
model="iic/speech_paraformer-large-vad-punc_asr_nat-zh-cn-16k-common-vocab8404-pytorch",
vad_model="iic/speech_fsmn_vad_zh-cn-16k-common-pytorch",
punc_model="iic/punc_ct-transformer_cn-en-common-vocab471067-large",
)
result = model.generate(input="audio.wav")
print(result[0]["text"])</pre>
</div>
<h2>Supporting Models</h2>
<div class="model-card">
<div class="model-name">cam++ (Speaker Diarization)</div>
<div class="model-meta">7.2M params &middot; <a href="https://huggingface.co/funasr/campplus">HuggingFace</a></div>
<div class="model-desc">Lightweight speaker embedding model for speaker diarization (who spoke when) and speaker verification (is this the same person). Only 7.2M parameters — runs on CPU in realtime.</div>
<div class="model-features">
<span class="badge badge-green">7.2M params</span>
<span class="badge badge-blue">Diarization</span>
<span class="badge badge-blue">Verification</span>
<span class="badge badge-green">CPU realtime</span>
</div>
</div>
<div class="model-card">
<div class="model-name">FSMN-VAD</div>
<div class="model-meta">Built-in &middot; Voice Activity Detection</div>
<div class="model-desc">Feedforward Sequential Memory Network for Voice Activity Detection. Accurately detects speech segments in audio, handling silence, noise, and music. Used as a preprocessing step for all ASR models.</div>
<div class="model-features">
<span class="badge badge-blue">VAD</span>
<span class="badge badge-green">Lightweight</span>
</div>
</div>
<div class="model-card">
<div class="model-name">CT-Transformer (Punctuation)</div>
<div class="model-meta">Built-in &middot; Punctuation Restoration</div>
<div class="model-desc">Automatically adds punctuation to ASR output — commas, periods, question marks, etc. Supports Chinese and English. Dramatically improves readability of transcription output.</div>
<div class="model-features">
<span class="badge badge-blue">Punctuation</span>
<span class="badge badge-blue">zh + en</span>
</div>
</div>
<h2>OpenAI-Compatible API</h2>
<p>All models are available through <code>funasr-server</code>, which exposes an OpenAI-compatible <code>/v1/audio/transcriptions</code> endpoint:</p>
<pre># Start the server
pip install funasr vllm fastapi uvicorn python-multipart
funasr-server --device cuda --port 8000
# Use with any OpenAI-compatible client
curl http://localhost:8000/v1/audio/transcriptions \
-F [email protected] \
-F model=SenseVoiceSmall</pre>
<div class="highlight">
<strong>Drop-in replacement:</strong> Any application using OpenAI's Whisper API can switch to FunASR by changing the base URL. No code changes needed — same API format, same response structure.
</div>
<h2>Deployment Options</h2>
<table>
<thead>
<tr><th>Method</th><th>Command</th><th>Best For</th></tr>
</thead>
<tbody>
<tr><td>pip</td><td><code>pip install funasr && funasr-server</code></td><td>Development, quick testing</td></tr>
<tr><td>Docker</td><td><code>docker run -d --gpus all -p 8000:8000 ...</code></td><td>Production deployment</td></tr>
<tr><td>Python API</td><td><code>from funasr import AutoModel</code></td><td>Embedding in applications</td></tr>
<tr><td>ONNX</td><td>Via <a href="https://github.com/k2-fsa/sherpa-onnx">Sherpa-ONNX</a></td><td>Mobile, edge, browser</td></tr>
</tbody>
</table>
</div>
</article>
<footer><div class="container">FunASR &mdash; Industrial-grade speech recognition toolkit &mdash; <a href="https://github.com/modelscope/FunASR">GitHub</a> &middot; <a href="../en/">Home</a> &middot; <a href="https://www.funasr.com">funasr.com</a></div></footer>
</body>
</html>
@@ -0,0 +1,380 @@
<!DOCTYPE html>
<html lang="en">
<head><meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate"><meta http-equiv="Pragma" content="no-cache"><meta http-equiv="Expires" content="0">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>FunASR Quickstart Guide | Speech Recognition in Python — Get Started in 3 Minutes</title>
<meta name="description" content="Get started with FunASR in 3 minutes. File transcription, real-time streaming ASR, and OpenAI-compatible API server deployment with copy-paste Python code. Free, open-source speech recognition.">
<meta name="keywords" content="speech recognition python, ASR API, automatic speech recognition, speech to text, FunASR tutorial, real-time ASR, OpenAI Whisper alternative, voice recognition API">
<link rel="icon" href="../logo.png">
<meta property="og:title" content="FunASR Quickstart Guide — Speech Recognition in 3 Minutes">
<meta property="og:description" content="File transcription, real-time streaming, OpenAI-compatible API — complete runnable code, ready to copy and use.">
<meta property="og:type" content="article">
<meta property="og:url" content="https://www.funasr.com/en/quickstart.html">
<meta property="og:image" content="https://www.funasr.com/logo.png">
<link rel="canonical" href="https://www.funasr.com/en/quickstart.html">
<link rel="alternate" hreflang="en" href="https://www.funasr.com/en/quickstart.html">
<link rel="alternate" hreflang="zh" href="https://www.funasr.com/quickstart.html">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "HowTo",
"name": "FunASR Quickstart Guide",
"description": "Learn how to use FunASR for speech recognition in 3 minutes: file transcription, real-time streaming ASR, and OpenAI-compatible API server deployment.",
"image": "https://www.funasr.com/logo.png",
"totalTime": "PT3M",
"tool": [
{"@type": "HowToTool", "name": "Python 3.8+"},
{"@type": "HowToTool", "name": "pip"},
{"@type": "HowToTool", "name": "GPU (8GB+ VRAM, optional)"}
],
"step": [
{
"@type": "HowToStep",
"position": 1,
"name": "Install FunASR",
"text": "Install FunASR and its dependencies using pip: pip install funasr",
"url": "https://www.funasr.com/en/quickstart.html#install"
},
{
"@type": "HowToStep",
"position": 2,
"name": "Transcribe Audio Files",
"text": "Use AutoModel to load the SenseVoice model and call the generate method to transcribe audio files. Supports 50+ languages with emotion detection.",
"url": "https://www.funasr.com/en/quickstart.html#file-transcription"
},
{
"@type": "HowToStep",
"position": 3,
"name": "Real-time Streaming ASR",
"text": "Use the Paraformer streaming model for real-time speech recognition with microphone input and WebSocket support.",
"url": "https://www.funasr.com/en/quickstart.html#streaming"
},
{
"@type": "HowToStep",
"position": 4,
"name": "Deploy OpenAI-compatible API",
"text": "Start an OpenAI-compatible speech recognition API server with a single command. Works with curl, Python SDK, and AI frameworks out of the box.",
"url": "https://www.funasr.com/en/quickstart.html#api-server"
}
]
}
</script>
<style>
:root{--primary:#2563eb;--primary-dark:#1d4ed8;--bg:#fff;--surface:#f8fafc;--border:#e2e8f0;--text:#0f172a;--text-soft:#475569;--text-muted:#94a3b8;--radius:12px}
*{margin:0;padding:0;box-sizing:border-box}
html{scroll-behavior:smooth}
body{font-family:'Inter',-apple-system,BlinkMacSystemFont,sans-serif;color:var(--text);line-height:1.6;-webkit-font-smoothing:antialiased}
a{color:var(--primary);text-decoration:none}
a:hover{text-decoration:underline}
.container{max-width:1120px;margin:0 auto;padding:0 24px}
.nav{position:fixed;top:0;left:0;right:0;z-index:100;background:rgba(255,255,255,0.85);backdrop-filter:blur(12px);border-bottom:1px solid var(--border);padding:14px 0}
.nav .container{display:flex;align-items:center;gap:32px}
.nav-logo{font-size:1.3rem;font-weight:800;color:var(--text);text-decoration:none}
.nav-logo span{color:var(--primary)}
.nav-links{display:flex;gap:24px;margin-left:auto}
.nav-links a{font-size:0.88rem;font-weight:500;color:var(--text-soft);text-decoration:none;transition:color 0.15s}
.nav-links a:hover{color:var(--primary)}
.nav-links a.active{color:var(--primary)}
.nav-btn{padding:8px 18px;background:var(--primary);color:white;border-radius:8px;font-size:0.85rem;font-weight:600;text-decoration:none}
.nav-btn:hover{background:var(--primary-dark);text-decoration:none}
.page-hero{padding:120px 0 60px;background:linear-gradient(180deg,#0f172a 0%,#1e293b 100%);color:white;text-align:center}
.page-hero h1{font-size:2.6rem;font-weight:800;line-height:1.2}
.page-hero h1 span{background:linear-gradient(135deg,#60a5fa,#a78bfa);-webkit-background-clip:text;-webkit-text-fill-color:transparent}
.page-hero p{margin-top:16px;font-size:1.1rem;color:#94a3b8;max-width:640px;margin-left:auto;margin-right:auto}
.page-hero .prereq{margin-top:24px;display:flex;gap:16px;justify-content:center;flex-wrap:wrap}
.page-hero .prereq span{background:rgba(255,255,255,0.08);border:1px solid rgba(255,255,255,0.12);border-radius:8px;padding:6px 16px;font-size:0.82rem;color:#cbd5e1}
section{padding:80px 0}
section.alt{background:var(--surface)}
section.dark{background:#0f172a;color:white}
.section-header{text-align:center;margin-bottom:48px}
.section-header h2{font-size:2rem;font-weight:800}
.section-header p{margin-top:8px;font-size:1.05rem;color:var(--text-soft);max-width:600px;margin-left:auto;margin-right:auto}
.step-number{display:inline-flex;align-items:center;justify-content:center;width:36px;height:36px;border-radius:50%;background:var(--primary);color:white;font-weight:700;font-size:0.95rem;margin-right:12px;flex-shrink:0}
.guide-section{max-width:820px;margin:0 auto 64px}
.guide-section h2{display:flex;align-items:center;font-size:1.5rem;font-weight:800;margin-bottom:8px}
.guide-section .subtitle{color:var(--text-soft);font-size:0.95rem;margin-bottom:24px;padding-left:48px}
.code-block{background:#1e293b;border-radius:12px;padding:24px;color:#e2e8f0;font-family:'SF Mono',Monaco,Consolas,monospace;font-size:0.82rem;line-height:1.9;overflow-x:auto;margin-bottom:16px;position:relative}
.code-block .c{color:#64748b}
.code-block .p{color:#22c55e}
.code-block .s{color:#86efac}
.code-block .n{color:#fbbf24}
.code-block .k{color:#7dd3fc}
.output-block{background:#f0fdf4;border:1px solid #bbf7d0;border-radius:12px;padding:20px;font-size:0.85rem;color:#166534;line-height:1.7;margin-bottom:20px}
.output-block strong{display:block;font-size:0.75rem;color:#15803d;text-transform:uppercase;letter-spacing:0.5px;margin-bottom:8px}
.tip-block{background:#eff6ff;border:1px solid #bfdbfe;border-radius:12px;padding:20px;font-size:0.85rem;color:#1e40af;line-height:1.7;margin-bottom:20px}
.tip-block strong{display:block;font-size:0.75rem;color:#1d4ed8;text-transform:uppercase;letter-spacing:0.5px;margin-bottom:8px}
.next-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:16px;max-width:720px;margin:0 auto}
.next-card{display:flex;align-items:center;gap:14px;padding:20px 24px;border-radius:var(--radius);border:1px solid var(--border);background:white;text-decoration:none;color:var(--text);transition:all 0.2s}
.next-card:hover{border-color:var(--primary);box-shadow:0 8px 20px rgba(37,99,235,0.06);transform:translateY(-2px);text-decoration:none}
.next-icon{font-size:1.5rem;flex-shrink:0}
.next-card h3{font-size:0.95rem;font-weight:700;margin-bottom:2px}
.next-card p{font-size:0.8rem;color:var(--text-soft)}
footer{background:#0f172a;color:#94a3b8;padding:48px 0 32px}
.footer-grid{display:grid;grid-template-columns:2fr 1fr 1fr 1fr;gap:40px;margin-bottom:32px}
.footer-brand h3{color:white;font-size:1.2rem;margin-bottom:8px}
.footer-brand p{font-size:0.85rem;line-height:1.7}
.footer-col h4{color:white;font-size:0.85rem;margin-bottom:12px;font-weight:600}
.footer-col a{display:block;font-size:0.83rem;color:#94a3b8;margin-bottom:8px;text-decoration:none}
.footer-col a:hover{color:white}
.footer-bottom{border-top:1px solid #1e293b;padding-top:24px;font-size:0.8rem;text-align:center}
@media(max-width:900px){.footer-grid{grid-template-columns:1fr 1fr}.nav-links{display:none}.next-grid{grid-template-columns:1fr}}
@media(max-width:600px){.page-hero h1{font-size:1.8rem}.guide-section h2{font-size:1.2rem}.next-grid{grid-template-columns:1fr}}
</style>
</head>
<body>
<!-- Nav -->
<nav class="nav"><div class="container">
<a href="/en/" class="nav-logo">Fun<span>ASR</span></a>
<div class="nav-links"><a href="/en/#capabilities">Capabilities</a><a href="/en/#usage">How to Use</a><a href="/en/#benchmark">Benchmark</a><a href="/en/#demo">Demo</a><a href="https://modelscope.github.io/FunASR/" target="_blank">Docs</a><a href="quickstart.html">Quickstart</a><a href="models.html">Models</a><a href="ecosystem.html">Ecosystem</a><a href="/en/blog/">Blog</a><a href="vs-whisper.html">vs Whisper</a><a href="/en/donors.html">Thanks</a></div>
<a href="/quickstart.html" style="font-size:0.85rem;font-weight:500;color:var(--text-soft);text-decoration:none">中文</a>
<a href="https://github.com/modelscope/FunASR" target="_blank" class="nav-btn">GitHub ★</a>
</div></nav>
<!-- Hero -->
<section class="page-hero">
<h1><span>Quickstart</span> Guide</h1>
<p>Master the three core workflows of FunASR in under 3 minutes: file transcription, real-time streaming, and API server deployment. Every code snippet is ready to copy and run.</p>
<div class="prereq">
<span>Python 3.8+</span>
<span>GPU 8GB+ (optional, CPU works too)</span>
<span>Linux / macOS / Windows</span>
</div>
</section>
<!-- Install -->
<section id="install"><div class="container">
<div class="guide-section">
<h2><div class="step-number">0</div>Installation</h2>
<p class="subtitle">One command to install everything. GPU users should add vllm for a 16x speed boost.</p>
<div class="code-block">
<span class="c"># Basic install (works on both CPU and GPU)</span><br>
<span class="p">$</span> pip install funasr<br>
<br>
<span class="c"># Full install (API server + vLLM acceleration, recommended for GPU)</span><br>
<span class="p">$</span> pip install funasr vllm fastapi uvicorn python-multipart
</div>
<div class="tip-block">
<strong>Tip</strong>
If you just need a one-off transcription, <code>pip install funasr</code> is enough. For deploying an API server or maximum throughput, go with the full install.
</div>
</div>
</div></section>
<!-- Section 1: File Transcription -->
<section class="alt" id="file-transcription"><div class="container">
<div class="guide-section">
<h2><div class="step-number">1</div>File Transcription</h2>
<p class="subtitle">Pass in an audio file, get back the full transcript. Supports 50+ languages with built-in emotion and audio event detection.</p>
<div class="code-block">
<span class="k">from</span> funasr <span class="k">import</span> AutoModel<br>
<br>
<span class="c"># Fun-ASR-Nano: flagship LLM-ASR for zh/en/ja + Chinese dialects/accents (GPU)</span><br>
model = AutoModel(model=<span class="s">"FunAudioLLM/Fun-ASR-Nano-2512"</span>, device=<span class="s">"cuda"</span>)<br>
result = model.generate(input=<span class="s">"meeting.wav"</span>)<br>
print(result[<span class="n">0</span>][<span class="s">"text"</span>])<br>
<br>
<span class="c"># For 31 languages use the separate checkpoint: FunAudioLLM/Fun-ASR-MLT-Nano-2512</span><br>
<span class="c"># On CPU, use SenseVoice: AutoModel(model="iic/SenseVoiceSmall", vad_model="fsmn-vad")</span>
</div>
<div class="output-block">
<strong>Output</strong>
Let's discuss the three topics today. Sounds good. First one is the Q3 plan. Go ahead, we have 30 minutes.
</div>
<div class="code-block">
<span class="c"># Batch-process multiple files at once</span><br>
results = model.generate(input=[<span class="s">"file1.wav"</span>, <span class="s">"file2.mp3"</span>, <span class="s">"file3.flac"</span>])<br>
<span class="k">for</span> r <span class="k">in</span> results:<br>
&nbsp;&nbsp;&nbsp;&nbsp;print(r[<span class="s">"text"</span>])
</div>
<div class="tip-block">
<strong>Supported Formats</strong>
WAV, MP3, FLAC, AAC, OGG, MP4 video -- virtually every common audio and video format works out of the box, no manual conversion needed.
</div>
</div>
</div></section>
<!-- Section 2: Real-time Streaming -->
<section id="streaming"><div class="container">
<div class="guide-section">
<h2><div class="step-number">2</div>Real-time Streaming ASR</h2>
<p class="subtitle">Feed audio from a microphone or stream and get results as you speak. Perfect for live captions, broadcast transcription, and voice assistants.</p>
<div class="tip-block">
<strong>Which model</strong>
The flagship <strong>Fun-ASR-Nano</strong> (LLM-ASR) is an <strong>offline</strong> model and the default for file transcription and the OpenAI-compatible API (sections 1 &amp; 3). For true <strong>low-latency, speak-as-you-go streaming</strong>, FunASR ships a dedicated streaming model, <code>paraformer-zh-streaming</code> — shown below. One industrial-grade FunASR stack; pick the model per use case.
</div>
<div class="code-block">
<span class="k">from</span> funasr <span class="k">import</span> AutoModel<br>
<br>
<span class="c"># Paraformer streaming model</span><br>
model = AutoModel(model=<span class="s">"paraformer-zh-streaming"</span>, vad_model=<span class="s">"fsmn-vad"</span>)<br>
<br>
<span class="c"># Streaming inference: chunk_size = [5, 10, 5] means 600ms lookahead</span><br>
chunk_size = [<span class="n">5</span>, <span class="n">10</span>, <span class="n">5</span>]<br>
cache = {}<br>
<br>
<span class="c"># Simulate streaming input (replace with mic capture in production)</span><br>
<span class="k">import</span> soundfile <span class="k">as</span> sf<br>
speech, sr = sf.read(<span class="s">"meeting.wav"</span>)<br>
chunk_stride = chunk_size[<span class="n">1</span>] * <span class="n">960</span> <span class="c"># samples per chunk</span><br>
<br>
<span class="k">for</span> i <span class="k">in</span> range(<span class="n">0</span>, len(speech), chunk_stride):<br>
&nbsp;&nbsp;&nbsp;&nbsp;chunk = speech[i:i+chunk_stride]<br>
&nbsp;&nbsp;&nbsp;&nbsp;is_final = (i + chunk_stride >= len(speech))<br>
&nbsp;&nbsp;&nbsp;&nbsp;result = model.generate(<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;input=chunk, cache=cache,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;is_final=is_final, chunk_size=chunk_size<br>
&nbsp;&nbsp;&nbsp;&nbsp;)<br>
&nbsp;&nbsp;&nbsp;&nbsp;print(result[<span class="n">0</span>][<span class="s">"text"</span>], end=<span class="s">""</span>, flush=<span class="k">True</span>)
</div>
<div class="output-block">
<strong>Live output (updates progressively)</strong>
Let's discuss the...three topics today. Sounds good. First one is...the Q3 plan.
</div>
<div class="tip-block">
<strong>WebSocket Real-time Service</strong>
Need browser-based live transcription? FunASR ships with a complete WebSocket server solution. Check the <a href="https://github.com/modelscope/FunASR" target="_blank">GitHub repository</a> under <code>examples/</code> for the WebSocket server and browser client code.
</div>
</div>
</div></section>
<!-- Section 3: API Server -->
<section class="alt" id="api-server"><div class="container">
<div class="guide-section">
<h2><div class="step-number">3</div>OpenAI-compatible API Server</h2>
<p class="subtitle">Deploy an OpenAI-compatible speech recognition API with a single command. Drop-in replacement for any app already using the Whisper API.</p>
<div class="code-block">
<span class="c"># Install and start the server</span><br>
<span class="p">$</span> pip install funasr vllm fastapi uvicorn python-multipart<br>
<span class="p">$</span> funasr-server --device cuda<br>
<br>
<span class="c"># Server starts on port 8899 by default</span>
</div>
<div class="code-block">
<span class="c"># Option 1: curl</span><br>
<span class="p">$</span> curl -X POST http://localhost:<span class="n">8899</span>/v1/audio/transcriptions \<br>
&nbsp;&nbsp;&nbsp;&nbsp;-F <span class="s">"[email protected]"</span> \<br>
&nbsp;&nbsp;&nbsp;&nbsp;-F <span class="s">"model=iic/SenseVoiceSmall"</span>
</div>
<div class="code-block">
<span class="c"># Option 2: OpenAI Python SDK (identical to Whisper API)</span><br>
<span class="k">from</span> openai <span class="k">import</span> OpenAI<br>
<br>
client = OpenAI(base_url=<span class="s">"http://localhost:8899/v1"</span>, api_key=<span class="s">"x"</span>)<br>
result = client.audio.transcriptions.create(<br>
&nbsp;&nbsp;&nbsp;&nbsp;model=<span class="s">"fun-asr-nano"</span>,<br>
&nbsp;&nbsp;&nbsp;&nbsp;file=open(<span class="s">"audio.wav"</span>, <span class="s">"rb"</span>),<br>
&nbsp;&nbsp;&nbsp;&nbsp;response_format=<span class="s">"verbose_json"</span><br>
)<br>
print(result.text)
</div>
<div class="output-block">
<strong>JSON Response</strong>
{"text": "Let's discuss the three topics today.", "segments": [{"start": 1.7, "end": 5.5, "text": "Let's discuss the three topics today."}], "duration": 12.1}
</div>
</div>
</div></section>
<!-- MCP Server -->
<section id="mcp"><div class="container">
<div class="guide-section">
<h2><div class="step-number">+</div>MCP Server: AI Assistant Integration</h2>
<p class="subtitle">With MCP enabled, AI assistants like Claude, Cursor, and Windsurf can call FunASR directly for speech recognition.</p>
<div class="code-block">
<span class="c"># Start the server with MCP support</span><br>
<span class="p">$</span> funasr-server --device cuda --enable-mcp<br>
<br>
<span class="c"># AI assistants can now invoke speech recognition via MCP protocol</span><br>
<span class="c"># Works with Claude Desktop, Cursor, Windsurf, and more</span>
</div>
<div class="tip-block">
<strong>What is MCP?</strong>
MCP (Model Context Protocol) is a standard protocol for AI assistants to invoke external tools. Once enabled, your AI coding assistant can directly "listen to" audio files, unlocking voice-driven development workflows.
</div>
</div>
</div></section>
<!-- Next Steps -->
<section class="alt" id="next"><div class="container">
<div class="section-header">
<h2>Next Steps</h2>
<p>Explore more of what FunASR can do</p>
</div>
<div class="next-grid">
<a class="next-card" href="https://github.com/modelscope/FunASR" target="_blank">
<div class="next-icon">⭐</div>
<div><h3>GitHub Repository</h3><p>Source code, examples, and issue tracker</p></div>
</a>
<a class="next-card" href="models.html">
<div class="next-icon">🧠</div>
<div><h3>Model Gallery</h3><p>Browse all available models and their capabilities</p></div>
</a>
<a class="next-card" href="ecosystem.html">
<div class="next-icon">🔗</div>
<div><h3>Ecosystem</h3><p>FunClip, CosyVoice, and companion tools</p></div>
</a>
<a class="next-card" href="vs-whisper.html">
<div class="next-icon">⚡</div>
<div><h3>vs Whisper</h3><p>Performance, accuracy, and feature comparison</p></div>
</a>
</div>
</div></section>
<!-- Footer -->
<footer><div class="container">
<div class="footer-grid">
<div class="footer-brand">
<h3>FunASR</h3>
<p>Industrial-grade speech recognition from Tongyi Lab. All-in-one speech understanding, built for production.</p>
</div>
<div class="footer-col"><h4>Documentation</h4>
<a href="quickstart.html">Quickstart</a>
<a href="https://modelscope.github.io/FunASR/training.html">Training Guide</a>
<a href="https://github.com/modelscope/FunASR/blob/main/docs/vllm_guide.md">vLLM Guide</a>
<a href="https://modelscope.github.io/FunASR/api.html">API Reference</a>
</div>
<div class="footer-col"><h4>Ecosystem</h4>
<a href="https://github.com/QwenAudio/Fun-ASR">Fun-ASR-Nano</a>
<a href="https://github.com/QwenAudio/SenseVoice">SenseVoice</a>
<a href="https://github.com/modelscope/FunClip">FunClip</a>
<a href="https://github.com/QwenAudio/CosyVoice">CosyVoice</a>
</div>
<div class="footer-col"><h4>Community</h4>
<a href="https://github.com/modelscope/FunASR">GitHub</a>
<a href="https://github.com/modelscope/FunASR/discussions">Discussions</a>
<a href="https://github.com/modelscope/FunASR/issues">Issues</a>
</div>
</div>
<div class="footer-bottom">&copy; 2024-2026 Tongyi Lab, Alibaba Group &middot; <a href="https://github.com/modelscope/FunASR/blob/main/LICENSE" style="color:#94a3b8">MIT License</a></div>
</div></footer>
<script src="/stats/tracker.js" async></script>
</body>
</html>
@@ -0,0 +1,172 @@
<!DOCTYPE html>
<html lang="en">
<head><meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate"><meta http-equiv="Pragma" content="no-cache"><meta http-equiv="Expires" content="0">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>FunASR vs Whisper — Open Source Speech Recognition Comparison 2026</title>
<meta name="description" content="Compare FunASR and Whisper: speed, accuracy, features, languages. FunASR is 170x realtime vs Whisper's 13x. Built-in speaker diarization, emotion detection, streaming.">
<link rel="icon" href="../logo.png">
<meta property="og:title" content="FunASR vs Whisper — Which Open Source ASR Should You Use?">
<meta property="og:description" content="Side-by-side comparison: FunASR runs 13x faster than Whisper on GPU, works on CPU, includes speaker ID and emotion detection out of the box.">
<meta property="og:type" content="article">
<meta property="og:url" content="https://www.funasr.com/en/vs-whisper.html">
<meta property="og:image" content="https://www.funasr.com/logo.png">
<meta name="twitter:card" content="summary_large_image">
<link rel="canonical" href="https://www.funasr.com/en/vs-whisper.html">
<link rel="alternate" hreflang="zh" href="https://www.funasr.com/vs-whisper.html">
<link rel="alternate" hreflang="en" href="https://www.funasr.com/en/vs-whisper.html">
<link rel="alternate" hreflang="x-default" href="https://www.funasr.com/en/vs-whisper.html">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"Article","headline":"FunASR vs Whisper: Open Source Speech Recognition Comparison","author":{"@type":"Organization","name":"Tongyi Lab, Alibaba Group"},"datePublished":"2026-05-25","description":"Detailed comparison of FunASR and OpenAI Whisper for speech recognition tasks."}
</script>
<style>
:root{--primary:#2563eb;--primary-dark:#1d4ed8;--bg:#fff;--surface:#f8fafc;--border:#e2e8f0;--text:#0f172a;--text-soft:#475569;--text-muted:#94a3b8;--radius:12px}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:'Inter',-apple-system,sans-serif;color:var(--text);line-height:1.7;-webkit-font-smoothing:antialiased}
a{color:var(--primary);text-decoration:none}
a:hover{text-decoration:underline}
.container{max-width:800px;margin:0 auto;padding:0 24px}
.nav{position:fixed;top:0;left:0;right:0;z-index:100;background:rgba(255,255,255,0.9);backdrop-filter:blur(12px);border-bottom:1px solid var(--border);padding:14px 0}
.nav .container{max-width:1120px;display:flex;align-items:center;gap:24px}
.nav-logo{font-size:1.2rem;font-weight:800;color:var(--text);text-decoration:none}
.nav-logo span{color:var(--primary)}
.nav-links{display:flex;gap:20px;margin-left:auto}
.nav-links a{font-size:0.85rem;font-weight:500;color:var(--text-soft);text-decoration:none}
.nav-btn{padding:7px 16px;background:var(--primary);color:white;border-radius:7px;font-size:0.83rem;font-weight:600;text-decoration:none}
article{padding:120px 0 80px}
h1{font-size:2.2rem;font-weight:800;line-height:1.2;margin-bottom:16px}
h2{font-size:1.4rem;font-weight:700;margin:40px 0 16px;padding-top:20px;border-top:1px solid var(--border)}
h3{font-size:1.1rem;font-weight:600;margin:24px 0 8px}
p{margin-bottom:16px;color:var(--text-soft)}
table{width:100%;border-collapse:collapse;margin:20px 0;font-size:0.88rem}
th,td{padding:12px 14px;text-align:left;border-bottom:1px solid var(--border)}
th{font-weight:600;background:var(--surface);font-size:0.8rem;text-transform:uppercase;letter-spacing:0.5px;color:var(--text-muted)}
td:first-child{font-weight:500}
.win{color:#16a34a;font-weight:600}
.lose{color:var(--text-muted)}
pre{background:#1e293b;color:#e2e8f0;padding:20px;border-radius:10px;overflow-x:auto;font-size:0.83rem;line-height:1.7;margin:16px 0}
code{font-family:'JetBrains Mono',monospace}
.cta{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:28px;margin:32px 0;text-align:center}
.cta h3{margin:0 0 8px}
.cta p{margin-bottom:16px}
.cta a.btn{display:inline-block;padding:10px 24px;background:var(--primary);color:white;border-radius:8px;font-weight:600;font-size:0.9rem;text-decoration:none}
.cta a.btn:hover{background:var(--primary-dark);text-decoration:none}
.badge{display:inline-block;padding:2px 8px;background:#dcfce7;color:#166534;border-radius:4px;font-size:0.75rem;font-weight:600}
footer{background:#0f172a;color:#94a3b8;padding:32px 0;text-align:center;font-size:0.82rem}
footer a{color:#94a3b8}
@media(max-width:600px){.nav-links{display:none}.nav .container{gap:16px}.nav-logo{margin-right:auto}h1{font-size:1.7rem}table{font-size:0.8rem}th,td{padding:8px}}
</style>
</head>
<body>
<nav class="nav"><div class="container" style="max-width:1120px">
<a href="/en/" class="nav-logo">Fun<span>ASR</span></a>
<div class="nav-links"><a href="/en/#capabilities">Capabilities</a><a href="/en/#usage">How to Use</a><a href="/en/#benchmark">Benchmark</a><a href="/en/#demo">Demo</a><a href="https://modelscope.github.io/FunASR/" target="_blank">Docs</a><a href="/en/quickstart.html">Quickstart</a><a href="/en/models.html">Models</a><a href="/en/ecosystem.html">Ecosystem</a><a href="/en/blog/">Blog</a><a href="/en/vs-whisper.html">vs Whisper</a><a href="/en/donors.html">Thanks</a></div>
<a href="/" style="font-size:0.83rem;font-weight:500;color:var(--text-soft)">中文</a>
<a href="https://github.com/modelscope/FunASR" target="_blank" class="nav-btn">GitHub ★</a>
</div></nav>
<article><div class="container">
<h1>FunASR vs Whisper: Which Open Source ASR Should You Use?</h1>
<p>Both FunASR and OpenAI Whisper are open-source speech recognition tools. Here's a detailed comparison to help you choose the right one for your use case.</p>
<h2>Speed Comparison</h2>
<p>Tested on 184 long-form audio files (192 minutes total). Higher RTF = faster.</p>
<table>
<thead><tr><th>Model</th><th>GPU Speed</th><th>CPU Speed</th><th>vs Whisper-large-v3</th></tr></thead>
<tbody>
<tr><td>FunASR Fun-ASR-Nano (vLLM)</td><td class="win">340x realtime</td><td>—</td><td><span class="badge">26x faster</span></td></tr>
<tr><td>FunASR SenseVoice-Small</td><td class="win">170x realtime</td><td class="win">17x realtime</td><td><span class="badge">13x faster</span></td></tr>
<tr><td>FunASR Paraformer-Large</td><td class="win">120x realtime</td><td class="win">15x realtime</td><td><span class="badge">9x faster</span></td></tr>
<tr><td>Whisper-large-v3-turbo</td><td>46x realtime</td><td class="lose">❌ Too slow</td><td>3.4x faster</td></tr>
<tr><td>Whisper-large-v3</td><td class="lose">13x realtime</td><td class="lose">❌</td><td>baseline</td></tr>
</tbody>
</table>
<p><strong>Key takeaway:</strong> FunASR models run on CPU faster than Whisper runs on GPU.</p>
<h2>Feature Comparison</h2>
<table>
<thead><tr><th>Feature</th><th>FunASR</th><th>Whisper</th></tr></thead>
<tbody>
<tr><td>Languages</td><td class="win">50+ (SenseVoice) / 31 (MLT-Nano) / zh-en-ja + Chinese dialects/accents (Nano)</td><td>57</td></tr>
<tr><td>Speaker Diarization</td><td class="win">✅ Built-in (cam++)</td><td>❌ Needs pyannote</td></tr>
<tr><td>Emotion Detection</td><td class="win">✅ Happy/Sad/Angry/Neutral</td><td>❌</td></tr>
<tr><td>Audio Event Detection</td><td class="win">✅ Music, applause, laughter</td><td>❌</td></tr>
<tr><td>Streaming / Real-time</td><td class="win">✅ WebSocket + vLLM</td><td>❌</td></tr>
<tr><td>Hotwords / Boosting</td><td class="win">✅ Custom vocabulary</td><td>❌</td></tr>
<tr><td>Chinese Dialects</td><td class="win">7 dialects + 26 accents</td><td>Limited</td></tr>
<tr><td>OpenAI-compatible API</td><td class="win">✅ funasr-server</td><td>Separate wrapper needed</td></tr>
<tr><td>VAD (Voice Activity)</td><td class="win">✅ Built-in</td><td>❌ External</td></tr>
<tr><td>Punctuation</td><td class="win">✅ Built-in</td><td>Partial</td></tr>
<tr><td>CPU Inference</td><td class="win">✅ 17x realtime</td><td>❌ Impractical</td></tr>
<tr><td>Fine-tuning</td><td class="win">✅ DeepSpeed scripts</td><td>Community scripts</td></tr>
<tr><td>License</td><td>MIT</td><td>MIT</td></tr>
<tr><td>Cost</td><td>Free (self-hosted)</td><td>Free (self-hosted)</td></tr>
</tbody>
</table>
<h2>When to Choose FunASR</h2>
<ul style="margin:16px 0;padding-left:24px;color:var(--text-soft)">
<li>You need <strong>speaker diarization</strong> without extra tools</li>
<li>You need <strong>real-time streaming</strong> transcription</li>
<li>You process <strong>Chinese, Japanese, or Asian languages</strong></li>
<li>You need <strong>CPU-viable</strong> deployment (edge, cost-sensitive)</li>
<li>You want an <strong>OpenAI-compatible API</strong> for AI agents</li>
<li>You need <strong>emotion detection</strong> or audio event classification</li>
<li>You have <strong>high-throughput batch</strong> workloads</li>
</ul>
<h2>When to Choose Whisper</h2>
<ul style="margin:16px 0;padding-left:24px;color:var(--text-soft)">
<li>You need the absolute widest language coverage (57 languages)</li>
<li>You're already integrated with the OpenAI ecosystem</li>
<li>Your workload is small enough that speed doesn't matter</li>
</ul>
<h2>Quick Start</h2>
<pre><code>pip install funasr
from funasr import AutoModel
# One-line transcription with speaker diarization
model = AutoModel(
model="iic/SenseVoiceSmall",
vad_model="fsmn-vad",
spk_model="cam++",
device="cuda" # or "cpu"
)
result = model.generate(input="meeting.wav")
</code></pre>
<div class="cta">
<h3>Ready to try FunASR?</h3>
<p>The FunASR open-source community keeps growing. Try it and join the project.</p>
<a href="https://github.com/modelscope/FunASR" class="btn">View on GitHub ★</a>
</div>
<h2>Migration Guide</h2>
<p>Already using Whisper? We have a detailed <a href="https://github.com/modelscope/FunASR/blob/main/docs/migration_from_whisper.md">migration guide</a> that covers feature mapping, evaluation methodology, and deployment options.</p>
<h2>Related Projects</h2>
<table>
<thead><tr><th>Project</th><th>Best For</th><th>Link</th></tr></thead>
<tbody>
<tr><td>FunASR</td><td>Full-featured toolkit (all models)</td><td><a href="https://github.com/modelscope/FunASR">GitHub</a></td></tr>
<tr><td>Fun-ASR-Nano</td><td>Flagship LLM-ASR for zh/en/ja + Chinese dialects/accents</td><td><a href="https://github.com/QwenAudio/Fun-ASR">GitHub</a></td></tr>
<tr><td>Fun-ASR-MLT-Nano</td><td>Separate multilingual checkpoint for 31 languages</td><td><a href="https://github.com/QwenAudio/Fun-ASR">GitHub</a></td></tr>
<tr><td>SenseVoice</td><td>Ultra-fast ASR + emotion + events</td><td><a href="https://github.com/QwenAudio/SenseVoice">GitHub</a></td></tr>
<tr><td>FunClip</td><td>AI video clipping with ASR</td><td><a href="https://github.com/modelscope/FunClip">GitHub</a></td></tr>
</tbody>
</table>
</div></article>
<footer><div class="container">
© 2024-2026 Tongyi Lab, Alibaba Group · <a href="https://github.com/modelscope/FunASR/blob/main/LICENSE">MIT License</a> · <a href="https://www.funasr.com">www.funasr.com</a>
</div></footer>
</body>
</html>
Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 318 KiB

Some files were not shown because too many files have changed in this diff Show More