FunAsrNet:用 .NET 10 和纯 C# 实现语音识别与合成
有人用纯 C# 写了个语音识别引擎,README 比代码还好看 - 张善友
FunAsrNet 是基于 QwenAudio/Fun-ASR 固定版本架构的社区实现,用 .NET 10 和纯 C# 完成 ASR、实时转写、中文 TTS 与电话音频处理,不依赖 Python、ONNX Runtime、ggml 等原生推理库。
最近翻到个挺倔的项目。
现在做 AI 推理,大家第一眼想到的无非就是 Python 调 ONNX Runtime,或者 llama.cpp 一把梭。这个叫 FunAsrNet 的项目偏不:用 .NET 10 和纯 C#,把普通话语音识别、语音合成、电话音频处理整个做了一遍,全程不碰任何原生推理库。
不是封装,是手写。这样的事情在2026年的.NET 社区里已经不是新闻了,用.NET 10 做模型推理正变成一个可行的路径。

先说清楚它是什么,不是什么
它是基于 QwenAudio/Fun-ASR 固定版本架构的社区实现,围绕固定的几个模型验证:F16 编码器、Qwen3 Q8_0 解码器、FSMN VAD、两个中文 VITS。
作者在 README 开头就把丑话说了:这不是官方 .NET SDK,也不是 FunASR 工具箱的移植,别指望它兼容上游所有模型和语言。
先把边界划清再谈功能,这个开头我就挺喜欢。
"纯 C#"纯到什么程度
我一开始以为又是那种 P/Invoke 包壳的项目,看完文档发现不是。
模型读取、特征提取、神经网络算子、解码、VAD、中文前端、TTS,全是 C# 写的。核心、CLI、Web 服务不依赖 Python、ONNX Runtime、ggml、sherpa-onnx、RKNN 中的任何一个。ONNX 和 GGUF 在这里只是文件格式——仓库里甚至自带了一个 ONNX 解释器,只支持目标模型用到的那部分算子。
性能优化也全走 .NET 自己的路子:SIMD、ARM64 NEON/SDOT、池化缓冲、共享只读权重、有界队列。x64 上行主序 SIMD,ARM64 上换 NEON/SDOT 交错内核。Vulkan 后端是可选的,由 C# 调度 GPU 驱动执行嵌入的 SPIR-V,GLSL 源码也以字符串形式留在仓库里。
仓库里倒是真有一个引用原生 ORT 的工程,叫 FunAsrNet.NativeReference——专门用来测速对照的,不进主解决方案,不算产品依赖。等于说原生库在仓库里的唯一身份是"陪练"。
能干什么
| 功能 | 现状 |
|---|---|
| ASR | WAV 转写;固定 F16 编码器、Q8_0 解码器 |
| 实时转写 | WebSocket + VAD 切句,预览可修订(不是逐帧增量编码) |
| 中文 TTS | Huayan 1 位 + AISHELL3 174 位,共 175 个发音人 |
| 浏览器 Demo | 麦克风实时转写、WAV 上传、TTS 试听下载 |
| 电话音频 | PCM16、G.711 PCMA/PCMU、重采样,可接自研 SIP/PJSIP 媒体层 |
| 并发 | 独立会话状态、权重只读共享、队列配额取消 |
C# 调用长这样:
using FunAsrNet;
var asr = new FunAsr("models/funasr-encoder-f16.gguf",
"models/qwen3-0.6b-q8_0.gguf", threads: 4);
var (samples, rate) = AudioFile.ReadWave("input.wav");
var result = asr.Transcribe(AudioFile.Resample(samples, rate, 16000), maxTokens: 128);
Console.WriteLine(result.Text);
跑服务也不复杂:
dotnet publish src/FunAsrNet.Server -c Release -o artifacts/server
dotnet artifacts/server/FunAsrNet.Server.dll \
--urls http://localhost:18080 --models models --threads 4
然后浏览器打开 18080 端口,麦克风转写、WAV 上传、TTS 试听三个 Demo 直接能玩。
重点聊聊它的 README
如果说代码是正常水平的好,这个项目的文档是我今年见过最不像开源项目的开源项目文档。
大多数项目的 Benchmark 环节,核心思想是"挑我们赢的发出来"。FunAsrNet 反着来,大量篇幅在讲"我们还差在哪"。
先看成绩。i7-12700、四线程、同模型同输入,C# CPU 的 ASR 热态已经打平原版 C++ 了:
| 项目 | C# CPU | 原版 CPU | C# Vulkan | 原版 GPU |
|---|---|---|---|---|
| ASR 6 秒 PCMA | 0.720s | 0.773s | 0.349s | 0.111s |
| ASR 28 秒样例 | 2.881s | 3.039s | 1.344s | 0.263s |
| TTS Huayan | 0.141s | 0.108s | 0.154s | 0.028s |
RK3588 上 C# 甚至比原版 C++ 快 15% 到 27%。
然后作者马上自己拆台:那台在线机器有明显换页和动态调频,别当成稳定领先。
再看差距。Vulkan 后端优化了七轮,ASR GPU 耗时比上一版降了 14.8% 到 19.4%,然后原话是:"仍为同轮原版 GPU 的 3.14~5.50 倍耗时,尚未追平。"
还有一堆我在别的 README 里从没见过的句子:
- "热态改善不等于启动改善"
- "不能将差异解释为语言优劣"
- "不宣称全链路零拷贝"
- TTS 的 Vulkan 路径比自家 CPU 还慢——这种反向结果也照写
- 默认 4 个实时连接,但特意注明"不能理解为四路都已满足实时延迟"
所有测速的原始记录、哈希、P95、慢样本全留在仓库里,三方转写逐字一致性做了校验,连撤回过的实验方案都有记录。
看多了"拳打 PyTorch 脚踢 vLLM"的标题党,再看到这种每报一个数都要补一句"先别信太多"的写法,观感非常奇特。你很难不信他给的数字。
上手前要知道的几件事
仓库克隆下来跑不起来完整服务,先说清楚:
- 模型权重不在仓库里,要按模型清单自己准备
models/目录并校验 SHA-256。目前没有一键下载的公开 GGUF 镜像,也没有转换工具。没模型只能跑数值检查。 - 没发 NuGet 包,用的话直接引 csproj。
- 电话方向只做了媒体层,SIP 信令、RTP 抖动缓冲、AEC 都没有。
- TTS 支持语速、音量、采样率、发音人、种子、随机度,但没有独立的音高和情绪控制。
- 模型资产的许可要留意:Huayan 标注 Unknown,AISHELL3 归档里没有独立的模型 LICENSE。代码本身是 Apache-2.0。
我的看法
纯比速度,这项目现在没什么可吹的,GPU 上离原生方案还差好几倍,作者自己也承认。
但它的价值在另一头:一个完整的语音推理流水线,模型加载、算子、解码、前后端,全部用托管代码实现,不依赖任何原生 AI 框架。这件事能做出来,说明现在的 .NET 性能是真的够用了。对用 .NET 的团队来说,这意味着语音能力可以变成解决方案里普通的一部分——能审计、能维护、部署不折腾,而不是一个要用 Docker 单独供起来的 Python 服务。
再就是那份 README。把差距、失败和免责声明写得比成绩还详细的项目,我建议大家去看看,哪怕不写 C#。
项目地址:https://github.com/hnlyf168/FunAsrNet
文中性能数据均来自项目 README,为作者在特定硬件上的实测,不代表普遍表现。
来源:博客园 · cnblogs.com