本篇文章从实现流式识别的角度来探讨各类asr方案,包括推理引擎的选择.首先给出结论,我所探索到的合适架构是

sherpa-onnx,模型sherpa-onnx-streaming-paraformer-bilingual-zh-en,LLM为Qwen3-1.7B, 引擎为CTranslate

推理引擎(Nvidia生态)

CUDA 生态

Cuda toolkit是底层工具包,提供了编译器(nvcc)、调试器(cuda-gdb)、内存分析工具(nvprof)以及基础运行库(cudart). 并且提供并行计算能力比如如何开辟显存(cudaMalloc)、如何把数据从内存拷贝到显存(cudaMemcpy)、如何定义线程块和网格。

而另外一部分CudaX 是建立在 CUDA Toolkit 之上的一系列高级函数库,核心组件包括- -

  • cuDNN:专门用于深度学习(卷积、池化)。
  • cuBLAS:专门用于线性代数(矩阵乘法,大模型的底层)。
  • cuFFT:专门用于快速傅里叶变换(信号处理中常用)。
  • NVENC/NVDEC:视频编解码加速(FFmpeg 硬件加速)。

同样的,Nvidia生态也不允许用户态程序触碰寄存器,nvcc将C++代码编译为PTX中间指令,CudaDriver中的实时编译器(JIT)根据运行时环境,翻译成机器码.

推理引擎简介

在模型部署工程中,推理引擎的核心任务是将训练好的模型权重和计算图(Computational Graph)转换为目标硬件上的高效底层算子调用。其优化手段通常包括算子融合(Operator Fusion)、常量折叠(Constant Folding)、精度校准(Quantization)以及特定硬件的内核优化(Kernel Tuning)。

贴上ai回答如下

1. NVIDIA TensorRT

定位: 针对 NVIDIA GPU 的高性能深度学习推理优化器。

  • Trade-off:

  • 优势: 极致的性能。通过对计算图的深度重构和针对特定显卡架构(如 Ampere 的 Tensor Core)生成高度优化的 CUDA Kernel,能榨干 NVIDIA 硬件的吞吐量。

  • 代价: 强硬件绑定(仅限 NVIDIA GPU);预编译成本高,首次启动或硬件环境变更时需要漫长的序列化过程(Build Engine);灵活性差,对于非标准算子或自定义层,通常需要手写插件(Plugin)。

  • 典型应用场景: 自动驾驶感知算法部署。在车载边缘计算平台(如 Orin)或云端视觉处理集群中,性能是第一优先级。

2. ONNX Runtime (ORT)

定位: 微软开发的跨平台、跨后端的高性能推理引擎。

  • Trade-off:

  • 优势: 互操作性最强。支持多种后端(Execution Providers),如 CUDA、TensorRT、DirectML、OpenVINO 等。它充当了硬件抽象层,极大降低了跨平台部署的工程成本。

  • 代价: “中间层”开销。虽然它能调用各家硬件的 SDK,但在某些极端场景下,其抽象层引入的开销和算子转换损失,使其性能往往略逊于硬件厂商的原生引擎(如 TensorRT)。

  • 典型应用场景: 跨平台桌面端软件。例如在 Windows/Linux 上运行的实时翻译或图像增强软件,开发者只需维护一套 ONNX 模型即可适配不同的显卡或 CPU。

3. vLLM

定位: 专为大语言模型(LLM)设计的高吞吐量推理框架。

  • Trade-off:

  • 优势: 显存利用率极高。通过 PagedAttention 技术解决了 LLM 推理中 KV Cache 造成的内存碎片化问题,大幅提升了并发请求的吞吐量。

  • 代价: 资源预占高。为了性能,vLLM 通常会预先占满大部分显存作为 Page 池,不适合与其他任务共用显卡;且对于单次请求的延迟优化并非其核心强项,其优势在于高并发

  • 典型应用场景: LLM API 服务化。如在云端构建类似 ChatGPT 的高并发对话接口服务。

4. NCNN / MNN

定位: 针对移动端(ARM 架构)优化的极致轻量化引擎(NCNN 由腾讯开发,MNN 由阿里开发)。

  • Trade-off:

  • 优势: 无第三方依赖,库体积极小(通常只有几 MB),对 ARM CPU 和 VULKAN 驱动进行了手写汇编级优化。在低功耗、低算力设备上表现极佳。

  • 代价: 开发门槛高。对复杂算子支持较慢,且模型转换过程有时会出现精度偏差,需要开发者具备较强的底层算力调试经验。

  • 典型应用场景: 手机 App 实时视觉任务。如手机银行的活体检测、美颜滤镜或轻量化 OCR。

推理引擎对比摘要

引擎 核心优势 核心折损 (Trade-off) 典型硬件
TensorRT 峰值性能、算子融合 硬件锁定、编译时间长 NVIDIA GPU
ONNX Runtime 兼容性、生态成熟 相比厂商 SDK 存在性能微损 跨平台 (CPU/GPU)
vLLM 高并发、KV Cache 管理 显存预占、不适合非 LLM 模型 NVIDIA GPU (H100/A100)
NCNN 轻量、无依赖、ARM 优化 算子支持不全、调试难度高 手机、嵌入式 ARM

FunASR

funasr是一个完整的asr框架,将流式处理的复杂的都封装在了流水线内,其包括VAD,ASR,Punc(标点恢复模型), ITN (反向文本正则化,可以配合热词使用),LM. 基本工作流程是这样的:
在 Python 开发环境下,FunASR 使用 AutoModel 作为入口,内部通过 Pipeline 类来管理模型, 每个子模型(VAD、ASR、Punctuation)都遵循统一的 call 接口。输入通常是 ndarray 或 torch.Tensor,输出则是标准的 dict 结构。

对于核心的asr模型,有两种方案,其一还offline也就是非流式,另外是流式即paraformer,项目中应该保留两种接口,非流式用于音频文件的转录,而流式用于实时的识别. 集成到项目中同样有两种方案,首先是完全基于Python的,另外是C++Runtime, 由于GIL锁等等python的性能原因,所以选择C++runtime继续推进.另外,funasr本身会提供2Pass方式来对识别结果进行纠正,其工作链路是第 1 Pass: 极低延迟的流式识别(部分准确度)。第 2 Pass: 当一句话结束时,利用非流式模型进行整体修正(高准确度)。

对于asr而言,最优的无疑是架构在onnx上的sherpa-onnx, sherpa-onnx 用纯 C++ 把这些繁琐的语音前处理(Audio Frontend)、流式解码器(Streaming Decoders)、文本正则化(TTS Text Normalization)全部封装好了。类似于Funasr的流水线,但是使用纯C++核心,同时提供各类语言绑定,适合端侧.

Whisper

典型的端到端方案, 性能原因弃用.

添加一个LM来做更有趣的事

Qwen2.5-1.5B是一个不错的选择,但是在工程实现上要格外注意asr管道输出到LLM的缓冲计算,这个区域应该是可伸缩的,可以借鉴webrtc对带宽的探测方案,实现缓冲区的调控,推理引擎应该是用CTranslate2

同时还要注意LLM 的 Prompt 预处理开销, 在推理引擎中设置Prefix Caching,来实现KVcache复用,减小开销,减小延迟.这是一个针对 OpenNMT 和 Fairseq 模型的高性能推理引擎。它支持权重量化(INT8/INT16)和层融合。

音频捕捉方案

WASAPI库可以实现更为简单的音频捕捉,而区别于ffmpeg的复杂管道配置, 这也是asr方案使用python而非C++实现的重要原因. 其能够直接从硬件抽象层(或驱动层)获取 PCM 数据。步骤如下

  • 通过 IMMDeviceEnumerator 获取默认或指定的 eCapture 设备。
  • 以 AUDCLNT_SHAREMODE_SHARED(共享模式)或 AUDCLNT_SHAREMODE_EXCLUSIVE(独占模式)初始化 IAudioClient。
  • 使用 IAudioCaptureClient::GetBuffer 读取麦克风采集的音频帧。

需要注意的是WASAPI 并不支持直接“按进程”过滤音频,但它支持 环回模式 (Loopback),用于捕获正在通过渲染设备(如扬声器、耳机)播放的所有声音。另外一定要用共享模式,否则会阻塞其他应用访问音频数据


本站由 Edison.Chen 创建。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。