From cffe7feaa0955ef0a56ea7e22ccd1cb8e30d27b9 Mon Sep 17 00:00:00 2001 From: zhifu gao Date: Wed, 9 Sep 2026 08:33:29 +0000 Subject: [PATCH] docs: correct HTTP migration blog contracts Signed-off-by: zhifu gao --- .../product-site/content/legacy-manifest.json | 12 +- web-pages/product-site/legacy/blog/index.html | 2 +- ...osted-deepgram-assemblyai-alternative.html | 83 +++-- ...hosted-openai-whisper-api-alternative.html | 127 +++---- .../product-site/legacy/en/blog/index.html | 2 +- ...osted-deepgram-assemblyai-alternative.html | 83 +++-- ...hosted-openai-whisper-api-alternative.html | 127 +++---- .../tests/browser/http-blog-contracts.spec.ts | 69 ++++ .../tests/test_http_blog_contracts.py | 351 ++++++++++++++++++ 9 files changed, 642 insertions(+), 214 deletions(-) create mode 100644 web-pages/product-site/tests/browser/http-blog-contracts.spec.ts create mode 100644 web-pages/product-site/tests/test_http_blog_contracts.py diff --git a/web-pages/product-site/content/legacy-manifest.json b/web-pages/product-site/content/legacy-manifest.json index 0007f06ea..84cedc044 100644 --- a/web-pages/product-site/content/legacy-manifest.json +++ b/web-pages/product-site/content/legacy-manifest.json @@ -24,14 +24,14 @@ "blog/funclip-v2-1-0-video-clipping-release.html": "88f6c44e5332d1746c4db0fc97d755ef82f12e46d8f1c1c0ad9351152ff9dfc1", "blog/funclip-v2-2-0-moss-speaker-clipping.html": "0d50747d3992301fb3062ad2cdf903bd427bec3db1f1e4fab1f06de207928bc9", "blog/generate-subtitles-srt-vtt-from-audio-video.html": "f1133235673d441cc654310581f59a319f182314ab7c0b0824af87da9f4a0591", - "blog/index.html": "92af7f61f70b676eb942c889b4501cab5c328a0eb099bad487b9adb9b8d2ef16", + "blog/index.html": "c3edf2411f377beb2bf01a0486349b189b1548f6babfc4794c16ab43f49754b4", "blog/japanese-speech-recognition.html": "399f5ce84e68ac00854bdf70b52b1cde6795efca7c800fd6492035a37a7c1b68", "blog/lightweight-speech-recognition-cpu.html": "d6270066222ed5baef0df108e6a4155f4a87bb5482169f23f218794d371f3281", "blog/meeting-transcript-acceptance.html": "3e35d1f283c7005977ad8cbd079e38c51e14b51f04f50cedb5636e2d4baf38bd", "blog/punctuation-restoration-python.html": "6cd26e03bf75b4343afd7b351c2681ebd513b058fb549c5888802be9ff3a1229", - "blog/self-hosted-deepgram-assemblyai-alternative.html": "13b4287b5ef0d3159bf0af09ece3bc1fea66f13390b13c7f33b8b5e85351a1f5", + "blog/self-hosted-deepgram-assemblyai-alternative.html": "feb17aae8e0f3fe46914c8725eacc8fcdf7fe78bf22a291347d6107c24e3992e", "blog/self-hosted-google-aws-azure-speech-to-text.html": "8e4000fb9e2b33a48a3907d4bd0f55db57ba74121a89b5fa12b412c3c963f49a", - "blog/self-hosted-openai-whisper-api-alternative.html": "8e7352392dc755428bd272c208107a64d9c6d5d1700ef52b42553a3ec234e3fd", + "blog/self-hosted-openai-whisper-api-alternative.html": "3c44496e02a15addfe6063b9b8c2d586b3861925701c4fbd81dba77be69c5de9", "blog/sensevoice-deployment-guide.html": "61c34fb7626444a0f1b5c93013dd95c10c576333791eaca1ab819baf0a8cdad6", "blog/sensevoice-emotion-language-detection.html": "a00c40bfbaa3f0f390bc00f052b7e4e299a7d193b088014b7515813f1f8a636b", "blog/speech-to-text-python-transcribe-audio.html": "87335710235dfdec9e01288f03a9a294c7bc3f730110e8d06f2b4c9d4906e284", @@ -66,14 +66,14 @@ "en/blog/funclip-v2-1-0-video-clipping-release.html": "229baf59adf2c3290541d9b3c8a6243992406ba84b712714e9d14599205cb1d4", "en/blog/funclip-v2-2-0-moss-speaker-clipping.html": "644159267f0fa4e7aab9d0eda98f68cd2b6365a9985038b639c626a5ea5ea7e8", "en/blog/generate-subtitles-srt-vtt-from-audio-video.html": "1530d4b9e94820a0b60d801e8d1c19b7aeb031b2f2b76c092657392e47706c6d", - "en/blog/index.html": "d5a5787e0cf9868752e4c94ad4e699f616f6d81b1b9bc9e38332f8690cd2a017", + "en/blog/index.html": "8fccbb7bf21902521cfe78cdf054abf75c5b6fe7ed571f25bfe4a04468c565f8", "en/blog/japanese-speech-recognition.html": "c476adcc2be1ed7c19e2345cc91b8ee6a0e04efd794b9b6476dd5d9b3a2c8b04", "en/blog/lightweight-speech-recognition-cpu.html": "0e02c0e0853b12613d32c250f593c05c2052f18231207b63ee01d6e6600a86f7", "en/blog/meeting-transcript-acceptance.html": "3183682d2cae0ce18f68e3bd33e22b9effb4de699f6a4d821938cc03dd6835bf", "en/blog/punctuation-restoration-python.html": "d6e30049f48d9dc6e6bc22eb567830013e4161eca51215616738b675dd1ffc40", - "en/blog/self-hosted-deepgram-assemblyai-alternative.html": "73b2fc101101fd2408ed49fdb2b0995ada59dec0016a91ed49efb856ebb8de53", + "en/blog/self-hosted-deepgram-assemblyai-alternative.html": "4239a93246726c6f010a2fb20208211e050792a372e3ea356d1a93ac028a8a96", "en/blog/self-hosted-google-aws-azure-speech-to-text.html": "4a8453451722b3ec8735224a586744ddfbfec9458cedd433f9fc908351027e9a", - "en/blog/self-hosted-openai-whisper-api-alternative.html": "cda3b8e45857996031b888b2bf076666b7c3dcae355f097e942fd770a3f0b729", + "en/blog/self-hosted-openai-whisper-api-alternative.html": "3e004bdf307bfb25fe2261554f130077678ca99b58f9dfe0e48b1ecae5547c19", "en/blog/sensevoice-deployment-guide.html": "8882912c6a84ec0a0e025d0eff8fcfa74bf76324bd4c9cae862c43c87c6e10b3", "en/blog/sensevoice-emotion-language-detection.html": "4fa0d49d34df3b923323fc49fbb02c432efd7cd0d90d81e84621dbbecc08cd29", "en/blog/speech-to-text-python-transcribe-audio.html": "4fc57aef3c6177e28afa26fa6c41f67280b986e384b32a63a2f79ca67bcfe631", diff --git a/web-pages/product-site/legacy/blog/index.html b/web-pages/product-site/legacy/blog/index.html index 77ac27e84..e3d3c70b0 100644 --- a/web-pages/product-site/legacy/blog/index.html +++ b/web-pages/product-site/legacy/blog/index.html @@ -51,5 +51,5 @@ footer a{color:#94a3b8}
2026-08-31 · FunClip v2.2.0

MOSS 多说话人转写进入 FunClip:从一句话到带说话人的片段

通过经真实双说话人音频验证的 vLLM 路径,把第三方 MOSS 模型的段级时间戳和说话人标签直接用于 SRT 与说话人片段导出。

查看部署与剪辑边界 →
-

FunASR 技术博客

2026-06-23

语音识别带时间戳(字级 timestamps)Python 实战:每个字精确到毫秒

FunASR Paraformer 原生字级时间戳:每个字带 [起始毫秒,结束毫秒],一次调用即有。可做逐字高亮、点击跳转、字幕对齐。附真实实测+配对代码。

2026-06-23

标点恢复 Python 实战:给无标点文本/ASR 结果自动加标点

FunASR ct-punc 开源标点恢复,中英双语,3 行 Python 补全 ,。?(英文还做句首大写),也能一行挂到 ASR 上。附真实实测。

2026-06-22

中文语音识别(普通话)Python 实战:用 FunASR 又快又准

FunASR 专为中文打造:默认旗舰 Fun-ASR-Nano(CER 8.06%),CPU 用 SenseVoice(7.81%)/ Paraformer(10.18%,时间戳/热词),都远好于 Whisper(~20%)。3 行 Python。

2026-06-22

自托管语音转文字:Google / AWS / Azure 云语音 API 的免费开源替代

开源免费(MIT)、本地推理、不按分钟计费、数据不出内网、中文强,OpenAI 兼容改 base_url 即可迁移。附实测代码 + FunASR vs 云 API 对比 + 成本分析。

2026-06-22

Python 语音活动检测(VAD):检测语音、去静音、按停顿切分音频

FunASR fsmn-vad 3 行代码返回每段语音的起止毫秒。实测 13s 录音 0.12s 切成 2 段、去除 18% 静音;可去静音、切分长录音、给 Whisper 等做预处理防幻觉。

2026-06-22

日语语音识别:SenseVoice 一个模型搞定日语转写+标点+情感

同一段日语音频实测:SenseVoice 写对同音字 転売、自动加标点,Whisper-small 误为 天売、无标点。原生 ja 支持 + 自动语种识别 + 情感事件,3 行 Python。

2026-06-23

自托管替代 Deepgram / AssemblyAI

开源免费、自托管、音频不出本地、中文领先,自带 OpenAI 兼容 API——客户端只改 base_url 即可替代按分钟付费的云 STT。

2026-06-23

选哪个 FunASR 模型?Nano vs MLT-Nano vs SenseVoice vs Paraformer

模型选型表 + 场景代码:中英日及中文方言/口音选旗舰 Nano,31 语种选独立 MLT-Nano,CPU 再选 SenseVoice 或 Paraformer。

2026-06-22

轻量语音识别:CPU 上约 250MB 跑中文 ASR

单二进制 + 254MB q8 模型,无需 GPU/Python,CPU 0.16s,中文 CER 7.99%——比 whisper.cpp small 还小且准 3 倍。

2026-06-21

粤语语音识别:SenseVoice 原生支持粤语口语(Whisper 会转成普通话)

同一段粤语音频实测:SenseVoice 保留 呢/唔/嘅,Whisper 转成普通话书面语。原生 yue 支持 + 自动语种识别,3 行 Python。

2026-06-21

FunASR vs faster-whisper:中文与粤语实测对比

粤语被 faster-whisper 误判为普通话、日语同音字错;SenseVoice 原生支持粤语+语种识别,中文 CER 低约 2.7 倍。实测。

2026-06-20

FunASR 跑进 llama.cpp:中文 ASR 的 whisper.cpp 替代品(CPU/零 Python)

单个自包含二进制、内置 VAD、吃任意音频,下载即用转写中文;中文 CPU 上比 whisper.cpp 准约 2.7 倍。3 步实测。

2026-06-18

Python 语音转文字:用 FunASR 本地免费转写音频

几行 Python 把音频转成文本,带时间戳/说话人/批量;本地、免费、无 API key、中文强。

2026-06-18

用 FunASR 自动生成字幕:音频/视频一键出 SRT 和 VTT

一行命令出 SRT,Python 同时导出 VTT,带说话人和真实时间戳;本地、免费、中文强。

2026-06-18

自托管 OpenAI Whisper API 替代:FunASR 起兼容 /v1/audio/transcriptions 服务

funasr-server 暴露 OpenAI 兼容接口,OpenAI SDK 只改 base_url 就能用;本地、免费、隐私、中文更准。

2026-06-18

用 FunASR 命令行转写音频:文本/JSON/SRT 字幕

一行命令出文字/字幕/JSON,--spk 带说话人;还能 funasr-server 起 OpenAI 兼容 API。

2026-06-17

用 FunASR 转写超长音频:1 小时一次搞定

Whisper 限 30 秒,FunASR 内置 VAD 一次吃下任意时长;实测 13 分钟 4.3 秒转完(186x)。

2026-06-17

用 FunASR 实现实时流式语音识别(边说边出字)

600ms 级低延迟流式 ASR:分块+cache 边说边出字,含 2-pass(流式+离线)最佳实践。

2026-06-17

超越转写:用 SenseVoice 识别语言、情感与声学事件

一次非自回归前向同时输出转写+语种+情感+音频事件,Whisper 做不到的四合一。

2026-06-17

用 FunASR 做说话人分离:谁在何时说了什么

一次 generate 调用同时输出转写+说话人标签+时间戳,替代 pyannote+Whisper,无需 HF 授权。

2026-06-16

FunASR vs Whisper 实测对比:谁更快更准

184 中文文件 H100 实测:SenseVoice 169.6x、CER 7.81%,完整速度+准确率数据。

2026-06-16

Fun-ASR-Nano 使用指南:800M 端到端语音识别大模型

主力旗舰,中英日 + 7 大中文方言/26 种口音,热词/流式/说话人分离;31 语种请用 MLT-Nano。

2026-06-16

SenseVoice 部署指南:五语种识别、情感与音频事件

3 行代码跑通多语言识别,含语种/情感/事件检测、VAD、GPU/CPU。

更多:快速上手 · 模型

+

FunASR 技术博客

2026-06-23

语音识别带时间戳(字级 timestamps)Python 实战:每个字精确到毫秒

FunASR Paraformer 原生字级时间戳:每个字带 [起始毫秒,结束毫秒],一次调用即有。可做逐字高亮、点击跳转、字幕对齐。附真实实测+配对代码。

2026-06-23

标点恢复 Python 实战:给无标点文本/ASR 结果自动加标点

FunASR ct-punc 开源标点恢复,中英双语,3 行 Python 补全 ,。?(英文还做句首大写),也能一行挂到 ASR 上。附真实实测。

2026-06-22

中文语音识别(普通话)Python 实战:用 FunASR 又快又准

FunASR 专为中文打造:默认旗舰 Fun-ASR-Nano(CER 8.06%),CPU 用 SenseVoice(7.81%)/ Paraformer(10.18%,时间戳/热词),都远好于 Whisper(~20%)。3 行 Python。

2026-06-22

自托管语音转文字:Google / AWS / Azure 云语音 API 的免费开源替代

开源免费(MIT)、本地推理、不按分钟计费、数据不出内网、中文强,OpenAI 兼容改 base_url 即可迁移。附实测代码 + FunASR vs 云 API 对比 + 成本分析。

2026-06-22

Python 语音活动检测(VAD):检测语音、去静音、按停顿切分音频

FunASR fsmn-vad 3 行代码返回每段语音的起止毫秒。实测 13s 录音 0.12s 切成 2 段、去除 18% 静音;可去静音、切分长录音、给 Whisper 等做预处理防幻觉。

2026-06-22

日语语音识别:SenseVoice 一个模型搞定日语转写+标点+情感

同一段日语音频实测:SenseVoice 写对同音字 転売、自动加标点,Whisper-small 误为 天売、无标点。原生 ja 支持 + 自动语种识别 + 情感事件,3 行 Python。

2026-06-23

从 Deepgram / AssemblyAI 迁移到自托管 FunASR:接入与验收清单

评估自托管转写迁移:映射请求和结果契约,检查鉴权、返回格式、模型质量与运维成本。提供 FunASR 本地 JSON 示例,不承诺厂商 API 或 SDK 直接替换。

2026-06-23

选哪个 FunASR 模型?Nano vs MLT-Nano vs SenseVoice vs Paraformer

模型选型表 + 场景代码:中英日及中文方言/口音选旗舰 Nano,31 语种选独立 MLT-Nano,CPU 再选 SenseVoice 或 Paraformer。

2026-06-22

轻量语音识别:CPU 上约 250MB 跑中文 ASR

单二进制 + 254MB q8 模型,无需 GPU/Python,CPU 0.16s,中文 CER 7.99%——比 whisper.cpp small 还小且准 3 倍。

2026-06-21

粤语语音识别:SenseVoice 原生支持粤语口语(Whisper 会转成普通话)

同一段粤语音频实测:SenseVoice 保留 呢/唔/嘅,Whisper 转成普通话书面语。原生 yue 支持 + 自动语种识别,3 行 Python。

2026-06-21

FunASR vs faster-whisper:中文与粤语实测对比

粤语被 faster-whisper 误判为普通话、日语同音字错;SenseVoice 原生支持粤语+语种识别,中文 CER 低约 2.7 倍。实测。

2026-06-20

FunASR 跑进 llama.cpp:中文 ASR 的 whisper.cpp 替代品(CPU/零 Python)

单个自包含二进制、内置 VAD、吃任意音频,下载即用转写中文;中文 CPU 上比 whisper.cpp 准约 2.7 倍。3 步实测。

2026-06-18

Python 语音转文字:用 FunASR 本地免费转写音频

几行 Python 把音频转成文本,带时间戳/说话人/批量;本地、免费、无 API key、中文强。

2026-06-18

用 FunASR 自动生成字幕:音频/视频一键出 SRT 和 VTT

一行命令出 SRT,Python 同时导出 VTT,带说话人和真实时间戳;本地、免费、中文强。

2026-06-18

自托管 OpenAI Whisper API 替代:FunASR 接入与安全边界

用 FunASR 部署本地文件转写:显式 loopback 监听、基本 JSON 调用、SDK 接入、格式限制与网关安全。区分部分接口兼容与完整云服务替换。

2026-06-18

用 FunASR 命令行转写音频:文本/JSON/SRT 字幕

一行命令出文字/字幕/JSON,--spk 带说话人;还能 funasr-server 起 OpenAI 兼容 API。

2026-06-17

用 FunASR 转写超长音频:1 小时一次搞定

Whisper 限 30 秒,FunASR 内置 VAD 一次吃下任意时长;实测 13 分钟 4.3 秒转完(186x)。

2026-06-17

用 FunASR 实现实时流式语音识别(边说边出字)

600ms 级低延迟流式 ASR:分块+cache 边说边出字,含 2-pass(流式+离线)最佳实践。

2026-06-17

超越转写:用 SenseVoice 识别语言、情感与声学事件

一次非自回归前向同时输出转写+语种+情感+音频事件,Whisper 做不到的四合一。

2026-06-17

用 FunASR 做说话人分离:谁在何时说了什么

一次 generate 调用同时输出转写+说话人标签+时间戳,替代 pyannote+Whisper,无需 HF 授权。

2026-06-16

FunASR vs Whisper 实测对比:谁更快更准

184 中文文件 H100 实测:SenseVoice 169.6x、CER 7.81%,完整速度+准确率数据。

2026-06-16

Fun-ASR-Nano 使用指南:800M 端到端语音识别大模型

主力旗舰,中英日 + 7 大中文方言/26 种口音,热词/流式/说话人分离;31 语种请用 MLT-Nano。

2026-06-16

SenseVoice 部署指南:五语种识别、情感与音频事件

3 行代码跑通多语言识别,含语种/情感/事件检测、VAD、GPU/CPU。

更多:快速上手 · 模型

diff --git a/web-pages/product-site/legacy/blog/self-hosted-deepgram-assemblyai-alternative.html b/web-pages/product-site/legacy/blog/self-hosted-deepgram-assemblyai-alternative.html index bdd5ddc96..631379ae9 100644 --- a/web-pages/product-site/legacy/blog/self-hosted-deepgram-assemblyai-alternative.html +++ b/web-pages/product-site/legacy/blog/self-hosted-deepgram-assemblyai-alternative.html @@ -1,11 +1,11 @@ -自托管替代 Deepgram / AssemblyAI:开源免费的语音识别 API | FunASR 博客 - +从 Deepgram / AssemblyAI 迁移到自托管 FunASR:接入与验收 | FunASR Blog +
-

自托管替代 Deepgram / AssemblyAI:开源、免费、数据不出本地

- -

Deepgram、AssemblyAI、Google/Azure Speech 这类云端语音识别 API 按分钟计费,音频还得上传到第三方。如果你想自己托管、零按量费用、音频不出本地——尤其中文场景——FunASR 是一个直接的开源替代:它自带 OpenAI 兼容的转写 API,客户端只改 base_url 即可。

- -

对比

- - - - - - - - -
FunASR(自托管)Deepgram / AssemblyAI
价格免费(MIT),无按分钟计费按分钟付费
部署自托管(本地/私有云/边缘)云 API(托管)
数据隐私音频不出本地上传到供应商
中文/粤语业界领先以英文为主
接口OpenAI 兼容(drop-in)各自专有 SDK
离线/CPU✅(含 llama.cpp 单二进制)❌ 仅云
-

云 API 的优势是免运维、弹性扩缩、英文与增值功能成熟;FunASR 的优势是免费、自托管、隐私、中文。按需求取舍。

- -

起一个 OpenAI 兼容的本地 STT 服务

-
pip install funasr
-funasr-server --model sensevoice --device cuda      # 或 --device cpu
-# → POST http://localhost:8000/v1/audio/transcriptions
-

然后任何 OpenAI 客户端只改 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
-

从 Deepgram/AssemblyAI 或 OpenAI Whisper API 迁移:把请求指向你自己的 funasr-server 即可,按量账单归零、数据留在本地。

- -

选模型

-

多语种 + 情感选 SenseVoice;中文 + 时间戳/热词选 Paraformer;中英日及中文方言/口音的旗舰识别选 Fun-ASR-Nano;需要 31 语种选独立的 Fun-ASR-MLT-Nano。详见 选型指南。

-

FunASR 全家桶开源、可商用、可自托管。觉得有用点个 Star 👇

⭐ Star FunASR

也欢迎:SenseVoice · Fun-ASR · FunClip

+

从 Deepgram / AssemblyAI 迁移到自托管 FunASR:接入与验收清单

+ +

评估自托管语音转写时,真正要迁移的是应用契约:上传方式、模型选择、鉴权、结果结构和运行责任。本文以 FunASR 1.4.15 的包内 funasr-server 为边界,介绍文件转写的接入路径。它不是 Deepgram / AssemblyAI 专有 API 或 SDK 的直接替换,也不提供完整云服务功能对等承诺。

+ +

先列迁移清单,再选择模型

+ + + + + + +
应用环节迁移时要验证什么
请求协议把现有 SDK 或 HTTP 调用映射到目标路由、multipart 文件上传及其实际声明的字段。连接地址、请求头和参数都需要检查。
任务方式本地示例是一次文件上传转写,不是流式会话、异步任务队列或回调服务。原应用依赖这些流程时,需要单独实现或选择对应部署服务。
结果结构明确文本、时间单位、分段、说话人标签以及空结果的映射。说话人分离标签不是实名身份识别;不同模型提供的信息不同。
故障处理检查鉴权失败、无效文件、超时、重试与过载行为;客户端超时不等于后台推理已经取消。
运行责任安排容量、监控、升级、数据留存及故障恢复。用自己的音频评估质量,不按未经验证的语言或价格排名选型。
+

先参考模型选型指南和部署矩阵。需要转写与说话人分离时,可评估第三方模型 MOSS-Transcribe-Diarize 的集成路径;不要把任一后端的能力推定为所有 FunASR 服务都具备。

+

最小本地接入:先验证 JSON 文本

+
+

前提:已经准备并验证过的独立 FunASR 1.4.15 环境。本段不是从零安装教程。运行下列命令的 Python 和 funasr-server 必须来自同一个已激活环境,且 funasr==1.4.15、PyTorch、音频依赖、FastAPI、Uvicorn、python-multipart、模型权重访问及音频文件均已准备好。平台依赖参见安装指南;其他版本需要重新核对行为。

+
python -c 'from importlib.metadata import version; assert version("funasr") == "1.4.15", version("funasr")'
+python -m pip check
+

版本检查和 pip check 只检查包元数据,不能证明 CUDA、音频解码或实际转写可用。下方明确选择 SenseVoice CPU 做接入验证,不是性能建议;不要在同一端口同时启动多个服务。另有仓库示例 HTTP 服务指南可作实现对照,但它准备并启动的是 example server,不是本文所要求的包内 1.4.15 环境。

+
+
funasr-server --host 127.0.0.1 --port 8000 --model sensevoice --device cpu
+

在同一主机另一个终端提交有权处理的 audio.wav。返回文本会写到终端,请勿把私人转写内容放进公开日志。

+
curl --fail --show-error --silent --max-time 120 \
+  http://127.0.0.1:8000/v1/audio/transcriptions \
+  -F "file=@audio.wav" \
+  -F "model=sensevoice" \
+  -F "response_format=json"
+

预期结构是包含 text 的 JSON 对象,具体内容取决于音频与模型。120 秒是示例客户端超时,不是可处理音频时长或吞吐承诺。使用 OpenAI Python SDK 的基本调用可参考本地转写接入指南;这不意味着原厂商 SDK 可以原样使用。

+

明确返回格式边界

+ + + + + + +
response_format包内处理器的行为
json返回含 text 的 JSON 对象。
verbose_json返回结构化 JSON,包括 segments、duration 等字段;具体时间与说话人信息依赖模型和实际结果。
text返回 JSON 字符串,不是普通纯文本响应。
srt不生成 SRT 字幕,落入 JSON 文本对象分支;HTTP 200 不能证明返回了字幕文件。
vtt不生成 VTT 字幕,同样落入 JSON 文本对象分支。
+

该路由声明 file、model、language、response_format 和扩展字段 spk;其他字段被请求接受不代表已经应用。

+

包内服务的字段应通过私有或受限的运维路径访问运行中服务的 /openapi.json,并核对固定版本包内处理器源码。示例服务 API schema描述的是另一种实现,不是包内处理器的完整字段说明。包内服务、仓库示例、vLLM 与 llama.cpp 的默认值、参数和响应结构并不通用。

+

上线前的三项验收

+
    +
  1. 契约:在旧、新实现上运行有代表性的受控请求,核对字段、文本解析、时间单位、错误与超时;不要以一次 200 响应作为全部兼容证据。
  2. +
  3. 质量:用业务录音检查关键实体、多人重叠、分段与低质量音频。参考会议转写验收清单,记录模型、硬件和版本。
  4. +
  5. 安全与运维:验证网关认证和后端不可绕过;容器的 127.0.0.1 指向容器自身,跨容器需设计受限网络。按需要评估计算、存储、带宽、监控和维护成本,另行核对所用模型权重许可证。
  6. +
+

自托管提供数据处理的控制空间,不自动保证音频从不落盘、日志不含转写或零成本。临时文件、代理、客户端及留存策略都要纳入检查。本文不比较厂商当前价格,也不声称新的准确率或性能测试结果。

相关文章

    diff --git a/web-pages/product-site/legacy/blog/self-hosted-openai-whisper-api-alternative.html b/web-pages/product-site/legacy/blog/self-hosted-openai-whisper-api-alternative.html index 46eafe660..bfb463448 100644 --- a/web-pages/product-site/legacy/blog/self-hosted-openai-whisper-api-alternative.html +++ b/web-pages/product-site/legacy/blog/self-hosted-openai-whisper-api-alternative.html @@ -1,12 +1,12 @@ -自托管 OpenAI Whisper API 替代方案:FunASR 一行起兼容 /v1/audio/transcriptions 服务 | FunASR - +自托管 OpenAI Whisper API 替代:FunASR 接入与安全边界 | FunASR Blog +
    -

    自托管 OpenAI Whisper API 替代方案:FunASR 一行起兼容 /v1/audio/transcriptions 服务

    - -

    OpenAI 的 /v1/audio/transcriptions(Whisper API)按分钟计费、要把音频上传到云端、还有速率限制。如果你只是想把音频转成文字,完全可以在自己机器上起一个接口完全一致的服务——已有代码只改一个 base_url 就能切过来。FunASR 自带的 funasr-server 就是干这个的。下面每段代码都实测过。

    - -

    一行启动 OpenAI 兼容服务

    -
    pip install -U funasr
    -funasr-server --model sensevoice --device cuda     # 监听 localhost:8000
    -

    启动后就有了和 OpenAI 一致的两个端点:POST /v1/audio/transcriptions 和 GET /v1/models。

    - -

    用 OpenAI 官方 SDK 直接调(只改 base_url)

    -

    你原来调 OpenAI 的代码,几乎一字不改,只把 base_url 指到本地服务、api_key 随便填:

    +

    自托管 OpenAI Whisper API 替代:FunASR 接入与安全边界

    + +

    把转写任务放到自己的机器上,能让团队自行选择模型、容量与数据处理方式。本文讨论 FunASR 1.4.15 的包内 funasr-server,演示 POST /v1/audio/transcriptions 的基本 JSON 调用。它提供部分 OpenAI 兼容能力,不代表完整复刻 OpenAI 服务,也不代表任意 SDK 或应用都无需适配。

    + +

    先做一次本地 JSON 转写

    +
    +

    前提:已经准备并验证过的独立 FunASR 1.4.15 环境。本段不是从零安装教程。运行下列命令的 Python 和 funasr-server 必须来自同一个已激活环境,且 funasr==1.4.15、PyTorch、音频依赖、FastAPI、Uvicorn、python-multipart、模型权重访问及音频文件均已准备好。平台依赖参见安装指南;其他版本需要重新核对行为。

    +
    python -c 'from importlib.metadata import version; assert version("funasr") == "1.4.15", version("funasr")'
    +python -m pip check
    +

    版本检查和 pip check 只检查包元数据,不能证明 CUDA、音频解码或实际转写可用。下方明确选择 SenseVoice CPU 做接入验证,不是性能建议;不要在同一端口同时启动多个服务。另有仓库示例 HTTP 服务指南可作实现对照,但它准备并启动的是 example server,不是本文所要求的包内 1.4.15 环境。

    +
    +
    funasr-server --host 127.0.0.1 --port 8000 --model sensevoice --device cpu
    +

    在同一主机的另一个终端,上传你有权处理的 audio.wav。命令会输出转写文本,不要把包含私人内容的输出直接贴入公开日志。

    +
    curl --fail --show-error --silent --max-time 120 \
    +  http://127.0.0.1:8000/v1/audio/transcriptions \
    +  -F "file=@audio.wav" \
    +  -F "model=sensevoice" \
    +  -F "response_format=json"
    +

    响应是包含 text 的 JSON 对象;具体文本由录音和模型决定。120 秒只是客户端示例超时,不是任意长度音频的处理保证,也不意味着超时会取消后台推理。

    +

    OpenAI Python SDK:明确模型和返回格式

    +

    在单独安装了 openai 客户端的环境中,可以使用以下基本调用。迁移时仍需检查模型名、参数、响应解析、错误处理和网关认证,不能只检查 URL 是否可连接。

    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)
    -# -> 欢迎大家来体验达摩院推出的语音识别模型
    -

    列出可用模型也和 OpenAI 一样:

    -
    print([m.id for m in client.models.list().data])
    -# -> ['fun-asr-nano', 'sensevoice', 'paraformer']
    - -

    或者用 curl / 任意 HTTP 客户端

    -
    curl http://localhost:8000/v1/audio/transcriptions \
    -  -F "file=@audio.wav" \
    -  -F "model=sensevoice"
    -# -> {"text": "欢迎大家来体验达摩院推出的语音识别模型"}
    -

    因为接口是 OpenAI 兼容的,Node 的 openai 包、LangChain、各种现成 SDK 都能直接连。

    - -

    对比:OpenAI Whisper API vs FunASR 自托管

    - - - - - - - +client = OpenAI( + base_url="http://127.0.0.1:8000/v1", + api_key="not-needed", + timeout=120.0, + max_retries=0, +) +with open("audio.wav", "rb") as audio: + result = client.audio.transcriptions.create( + model="sensevoice", file=audio, response_format="json" + ) +print(result.text) +

    包内服务的兼容范围

    +
    OpenAI Whisper APIFunASR 自托管
    费用$0.006 / 分钟免费(自己的机器)
    数据隐私音频上传到云端不出本地
    速率限制有无
    中文准确率一般更高(实测对比)
    速度—SenseVoice 非自回归,远快于 Whisper
    接口/v1/audio/transcriptions完全一致
    + + + + + + +
    项目当前行为与接入要求
    请求multipart 文件上传;路由声明 file、model、language、response_format 和 FunASR 扩展 spk。语言和说话人能力仍受所选模型限制。
    json返回带 text 的 JSON 对象,适合先验证基本文本转写。
    verbose_json返回结构化 JSON,包括 segments、duration 等字段;具体时间与说话人信息依赖模型和实际结果。
    text当前包内处理器返回 JSON 字符串,不是标准的纯文本响应;不要假设云端客户端的解析方式完全相同。
    srt不生成 SRT 字幕,落入 JSON 文本对象分支;HTTP 200 不能证明返回了字幕文件。
    vtt不生成 VTT 字幕,同样落入 JSON 文本对象分支。
    其他参数与协议prompt、temperature、timestamp_granularities 不是该路由声明的完整能力。不要把它当成流式 WebSocket、翻译或完整云 API;额外字段未报错也不证明生效。
    - -

    选哪个模型

    +

    包内服务的字段应通过私有或受限的运维路径访问运行中服务的 /openapi.json,并核对固定版本包内处理器源码。示例服务 API schema描述的是另一种实现,不是包内处理器的完整字段说明。包内服务、仓库示例、vLLM 与 llama.cpp 的默认值、参数和响应结构并不通用。

    +

    接入 Open WebUI 或其他应用前

      -
    • sensevoice —— 默认,非自回归,极快,中、粤、英、日、韩五种语言,带情感/事件;日常首选。
    • -
    • fun-asr-nano —— LLM 解码,面向中英日及中文方言/口音的旗舰模型(需要 vLLM)。
    • -
    • 需要 31 语种 —— 部署独立的 FunAudioLLM/Fun-ASR-MLT-Nano-2512 checkpoint。
    • -
    • paraformer —— 经典中文生产级,稳。
    • +
    • 核对应用实际发送的模型别名、文件类型和 response_format,以及成功、空文本、错误和超时的解析路径。
    • +
    • 容器内的 127.0.0.1 指向该容器自身。宿主机 loopback 服务不会因为换成 host.docker.internal 就自动可达;跨容器部署需要受限的私有网络和匹配的网关认证。
    • +
    • Basic、Bearer、OIDC 等认证方式不能互换。生产环境不能照搬本地占位 key;预加载一个模型也不是模型访问白名单。
    • +
    • 先用受控录音验证端到端流程,再开放真实流量。参见维护中的客户端接入指南。
    -

    请求里把 model= 换成对应名字即可,无需重启服务。

    - -

    从 OpenAI 迁移要改什么

    -
      -
    • base_url:指到你的 funasr-server。
    • -
    • api_key:本地服务不校验,随便填一个非空值。
    • -
    • 其余不变:client.audio.transcriptions.create(...) 的调用方式一致。
    • -
    - -

    在 Open-WebUI 里把语音输入接到 FunASR

    -

    Open-WebUI(15 万星的自托管 LLM 界面)的语音转文字(STT)支持任意 OpenAI 兼容端点。既然 funasr-server 本身就是 OpenAI 兼容的,直接指过去即可——无需插件、无需改 Open-WebUI 代码,中文识别比内置 Whisper 更准,而且本地、免费、隐私。

    -

    ① 起 FunASR 服务(同上):

    -
    funasr-server --model sensevoice --device cuda   # 监听 localhost:8000
    -

    ② Open-WebUI 里:管理面板 → 设置 → 音频 → 语音转文本,引擎选 OpenAI,填:

    -
      -
    • API Base URL:http://localhost:8000/v1(Open-WebUI 在 Docker、FunASR 在宿主机时用 http://host.docker.internal:8000/v1)
    • -
    • API Key:任意非空(funasr-server 不校验)
    • -
    • STT Model:sensevoice(或 paraformer / fun-asr-nano)
    • -
    -

    用 Docker Compose 部署等价于这几个环境变量:

    -
    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
    -

    之后 Open-WebUI 的麦克风语音输入就走 FunASR 了——中文转写更准、数据不出本地。同样的配置适用于任何"支持自定义 OpenAI STT 端点"的工具(LibreChat、AnythingLLM 等)。

    -

    FunASR 是通义实验室开源的工业级语音识别工具包。

    在 GitHub 上 Star FunASR ★
    +

    比较的是完整部署方案,不只是 API 单价

    +

    自托管需要计算服务器、存储、流量、维护与监控成本。是否留在受控网络,取决于客户端、代理、临时文件、日志和保留策略;不能承诺音频绝不落盘或转写永不泄露。模型权重的许可也需要单独核对,不能由工具包代码许可代替。

    +

    根据语言、时延、硬件和说话人需求查看模型选型、MOSS 转写与说话人分离和部署矩阵。本文不提供新的准确率或性能排名;验收方法见会议录音验收清单。

    相关文章