有人用纯 C# 写了个语音识别引擎,README 比代码还好看

项目地址:https://github.com/hnlyf168/FunAsrNet

最近翻到个挺倔的项目。

现在做 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# 调用长这样:

csharp 复制代码
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);

跑服务也不复杂:

bash 复制代码
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"的标题党,再看到这种每报一个数都要补一句"先别信太多"的写法,观感非常奇特。你很难不信他给的数字。

上手前要知道的几件事

仓库克隆下来跑不起来完整服务,先说清楚:

  1. 模型权重不在仓库里,要按模型清单自己准备 models/ 目录并校验 SHA-256。目前没有一键下载的公开 GGUF 镜像,也没有转换工具。没模型只能跑数值检查。
  2. 没发 NuGet 包,用的话直接引 csproj。
  3. 电话方向只做了媒体层,SIP 信令、RTP 抖动缓冲、AEC 都没有。
  4. TTS 支持语速、音量、采样率、发音人、种子、随机度,但没有独立的音高和情绪控制。
  5. 模型资产的许可要留意:Huayan 标注 Unknown,AISHELL3 归档里没有独立的模型 LICENSE。代码本身是 Apache-2.0。

我的看法

纯比速度,这项目现在没什么可吹的,GPU 上离原生方案还差好几倍,作者自己也承认。

但它的价值在另一头:一个完整的语音推理流水线,模型加载、算子、解码、前后端,全部用托管代码实现,不依赖任何原生 AI 框架。这件事能做出来,说明现在的 .NET 性能是真的够用了。对用 .NET 的团队来说,这意味着语音能力可以变成解决方案里普通的一部分------能审计、能维护、部署不折腾,而不是一个要用 Docker 单独供起来的 Python 服务。

再就是那份 README。把差距、失败和免责声明写得比成绩还详细的项目,我建议大家去看看,哪怕不写 C#。

项目地址:https://github.com/hnlyf168/FunAsrNet


文中性能数据均来自项目 README,为作者在特定硬件上的实测,不代表普遍表现。