FunASR iOS 端侧部署实战:基于 ONNX C++ 的 Paraformer 流式语音识别 Demo

FunASR iOS 端侧部署实战:基于 ONNX C++ 的 Paraformer 流式语音识别 Demo FunASR iOS 端侧部署实战基于 ONNX C 的 Paraformer 流式语音识别 Demo【免费下载链接】FunASROpen-source speech recognition toolkit for training, inference, streaming ASR, VAD, punctuation, speaker diarization pipelines, and OpenAI-compatible/MCP serving.项目地址: https://gitcode.com/GitHub_Trending/fun/FunASR本文介绍 FunASR 仓库中 iOS Paraformer 在线识别 Demo 的完整构建与运行方式。该 Demo 基于 ONNX 推理的 C 实现无需额外服务端依赖在 Xcode 中编译后即可在 iPhone 上完成麦克风采集与 Paraformer 流式识别。读完后你可以掌握如何获取量化 ONNX 模型并将其配置进 Xcode 工程、如何执行 CocoaPods 环境准备并运行工程以及从麦克风 AudioQueue 到 C 推理句柄FunASRInit/FunASROnlineInit/FunASRInferBuffer的完整调用链与音频分帧原理。Demo 定位纯端侧、无网络依赖的流式 ASR根据 runtime/ios/Readme.md 的说明该项目是一个基于 iOS 端的 Paraformer 流式识别 demo基于 ONNX 推理的 C 版本不需要依赖除 ONNX Runtime 之外的其他库和额外配置直接在 Xcode 上编译运行即可使用量化后的 ONNX 模型model_quant.onnx、decoder_quant.onnx适配移动端资源约束。工程位于 runtime/ios/paraformer_online其结构为paraformer_online/应用源码含AppDelegate、SceneDelegate、ViewController、AudioCapture、AudioRecorder等 Objective-C/Objective-C 文件、paraformer_online.xcodeproj/工程文件以及 Podfile。文档提到需要在 Xcode 项目中维护一个model文件夹存放模型文件这正是 C 推理代码读取模型目录的约定位置。获取并配置模型四个必备文件按文档给出的步骤模型获取分为三步通过命令下载模型仓库git clone https://www.modelscope.cn/damo/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-online-onnx.git注意该模型名中的online与onnx两个关键词online表示这是 Paraformer 流式在线版本与 Demo 的流式识别场景匹配onnx表示已导出为 ONNX 格式。下载得到的是量化后的模型该 iOS 项目需要用到四个文件model_quant.onnx量化后的声学模型encoderdecoder_quant.onnx量化后的解码器am.mvn声学特征均值/方差归一化统计文件config.yaml模型配置文件。将这四个文件拖入 Xcode 项目中的model文件夹下文档建议在打开 Xcode 项目后再拖入以避免文件引用状态异常。这一“四个文件 一个目录”的约定在源码中得到了印证。AudioCapture.mm 的initASROnnx方法通过 Bundle 定位config.yaml所在目录并将其作为MODEL_DIR传给推理引擎同时显式声明量化模式- (void)initASROnnx { NSString *model_file_path [[NSBundle mainBundle] pathForResource:config ofType:.yaml inDirectory:model]; model_file_path [model_file_path stringByReplacingOccurrencesOfString:config.yaml withString:]; const char* model_dir [model_file_path UTF8String]; std::mapstd::string, std::string model_path; model_path.insert({MODEL_DIR, model_dir}); model_path.insert({QUANTIZE, true}); int thread_num 1; asr_handle_ FunASRInit(model_path, thread_num, ASR_ONLINE); // 初始化在线特征提取 online_handle_ FunASROnlineInit(asr_handle_); }可以据此归纳出三个配置要点MODEL_DIR指向包含上述四个文件的model目录QUANTIZE参数为true与量化模型文件一一对应若换成非量化模型该参数需要相应调整thread_num 1表示推理使用单线程这是移动端常见的保守配置ASR_ONLINE标记表明初始化的是流式识别引擎。识别流程从 pod install 到真机运行文档给出的三步识别流程及其目的如下mac 设备上确保已安装 Xcode——工程为原生 Xcode 工程需要完整工具链编译 C 与 Objective-C 代码拉取 ONNX 运行环境。由于 onnx 是作为 Xcode 的一个 CocoaPods 包引入的需要先在终端中进入包含Podfile的目录执行pod install。对应 Podfile 的内容非常简洁platform :ios, 12.0 target paraformer_online do use_frameworks! pod onnxruntime-c end其中pod onnxruntime-c即 ONNX Runtime 的 C/C 绑定platform :ios, 12.0声明了最低支持 iOS 12.0。这也意味着必须通过.xcworkspaceCocoaPods 生成而不是.xcodeproj打开工程否则找不到 ONNX Runtime 依赖mac 连接 iPhone 设备双击paraformer_online.xcworkspaceXcode 自动打开后直接运行该工程。Demo 面向真机麦克风采集需连接 iPhone 并在Info.plist/工程签名中配置相应的麦克风使用权限。源码走读从麦克风到识别结果的完整链路以下结合仓库源码对 Demo 的运行机制做纵深说明帮助理解文档中“直接运行即可”背后的数据流。1. 录音层AudioQueue 采集 16k/16bit 单声道 PCMAudioRecorder.h 定义了核心采集参数#define kNumberAudioQueueBuffers 3 // 缓冲区设定 3 个 #define kDefaultSampleRate 16000 // 采样率 #define kBufferByteSize (kDefaultSampleRate/100*2) // 960 字节 480 个 16bit 采样 30ms #define kDataSize 2048即16kHz 采样率、每通道 16bit一帧为 100Hz 分帧30ms、480 个采样点、960 字节。AudioRecorder.m 的实现要点setupAudioFormat中设置mChannelsPerFrame 1单声道、mFormatFlags kLinearPCMFormatFlagIsSignedInteger | kLinearPCMFormatFlagIsPacked有符号整型 PCM与 Paraformer 模型要求的 16k 单声道输入一致start方法先设置AVAudioSessionCategoryPlayAndRecord并激活AVAudioSession再调用AudioQueueNewInput创建音频输入队列分配 3 个 960 字节缓冲区循环入队回调函数inputHandler将到达的音频数据追加进recorder-data按 960 字节kBufferByteSize整帧切分每切出一帧就通过inputBlock回调上送余下不足一帧的数据保留在缓冲头部等待下一批数据。2. 调度层10 帧聚合成一次推理输入约 600msAudioCapture.mm 中的宏定义给出了推理的批量策略#define Recorder_Sample_Rate 16000 #define Samples_Per_Frame (Recorder_Sample_Rate/100) // 160 采样点/10ms #define k_input_frames 10 #define k_left_padding_frames 5 #define k_right_padding_frames 5 #define k_input_samples 960 // (60ms)在startRecorder中录音回调被dispatch_async到主队列处理每收到一帧 PCM 就拷贝进speech_buff累积到k_input_frames*6-1即第 60 个 30ms 帧时把整段缓冲一次性送入推理接口if (speech_idx k_input_frames*6-1) { FUNASR_RESULT result FunASRInferBuffer(strongSelf-online_handle_, speech_buff, step, RASR_NONE, NULL, false, 16000); memset(speech_buff, 0, step * sizeof(char)); speech_idx 0; if (result) { string msg FunASRGetResult(result, 0); FunASRFreeResult(result); if (strongSelf.resultBlock) { strongSelf.resultBlock([NSString stringWithUTF8String:msg.c_str()]); } } }从源码结构看FunASRInferBuffer的入参包括在线句柄、PCM 缓冲、长度step 9600*2字节即 1.8s 的 16bit 数据、流式结束标志false表示语音流未结束与采样率16000。识别结果通过FunASRGetResult取出文本后再FunASRFreeResult释放这一分配-使用-释放的句柄协议是 C API 的典型用法。3. 交互层ViewController 拼接流式部分结果ViewController.mm 完成 UI 与引擎的衔接viewDidLoad中调用[self initEngine:YES]YES 即使用 ONNX 模型初始化在后台线程执行界面用 loading 覆盖层提示正在初始化模型...initASR:中创建AudioCapture并注册resultBlock回调。流式识别返回的是增量部分结果partial text因此 ViewController 用pre_partial_text属性做字符串累积拼接再把完整文本更新到UITextViewself.audioCapture.resultBlock ^(NSString *result) { if ([result length] 0) { return; } NSString *text [NSString stringWithFormat:%%, weakSelf.pre_partial_text, result]; weakSelf.pre_partial_text text; dispatch_async(dispatch_get_main_queue(), ^{ weakSelf.resultView.text text; }); };点击圆形startButton时切换startRecorder/stopRecorder对应识别会话的开始与结束stopRecorder中会调用FunASRUninit释放asr_handle_与online_handle_并释放speech_buff体现了一次完整初始化—流式推理—释放的生命周期管理。已知边界与未来工作需要说明的适用前提Demo 面向量化 ONNX 模型QUANTIZE true替换模型时需同时调整模型文件与量化标志工程最低支持 iOS 12.0见 Podfile且依赖 CocoaPods 拉取onnxruntime-c构建环境需先完成pod install推理输入以约 600ms 为粒度批量送入源码中k_input_frames*6帧的累积策略从源码结构看这是一个为移动端性能与实时性折中而设计的实现源码注释也提示该缓冲可改为 ring buffer进一步优化。文档在未来工作一节列出了两个演进方向CoreML 支持利用苹果生态原生推理框架与加入流式标点在流式文本输出中恢复标点符号。如需进一步了解 FunASR 在其他端侧/服务端平台的部署方案ONNX Runtime C、Triton、WebSocket 服务等可继续查阅 runtime/README 与 runtime/docs 下的部署文档。小结模型侧从 ModelScope 获取paraformer-large中文在线量化 ONNX 模型将model_quant.onnx、decoder_quant.onnx、am.mvn、config.yaml四个文件放入 Xcode 工程的model目录环境侧pod install拉取onnxruntime-c以.xcworkspace方式连接 iPhone 真机运行实现侧AudioQueue 以 16k/16bit 单声道、30ms 分帧采集累积后批量调用FunASRInferBuffer进行流式推理resultBlock回调增量文本并在 UI 层拼接展示停止时通过FunASRUninit完成资源释放。【免费下载链接】FunASROpen-source speech recognition toolkit for training, inference, streaming ASR, VAD, punctuation, speaker diarization pipelines, and OpenAI-compatible/MCP serving.项目地址: https://gitcode.com/GitHub_Trending/fun/FunASR创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考