ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

在 Windows 桌面用 MFC 集成 sherpa-onnx:非流式/流式语音识别与离线 TTS 三个 Visual C++ 示例全解析

在 Windows 桌面用 MFC 集成 sherpa-onnx:非流式/流式语音识别与离线 TTS 三个 Visual C++ 示例全解析 在 Windows 桌面用 MFC 集成 sherpa-onnx非流式/流式语音识别与离线 TTS 三个 Visual C 示例全解析【免费下载链接】sherpa-onnxSpeech-to-text, text-to-speech, speaker diarization, speech enhancement, source separation, and VAD using next-gen Kaldi with onnxruntime without Internet connection. Support embedded systems, Android, iOS, HarmonyOS, Raspberry Pi, RISC-V, RK NPU, Axera NPU, Ascend NPU, x86_64 servers, websocket server/client, support 12 programming languages项目地址: https://gitcode.com/GitHub_Trending/sh/sherpa-onnx本指南以仓库 mfc-examples/README.md 为核心结合仓库内的三个 MFC 示例工程源码系统讲解如何在 Windows 平台使用 Visual Studio 2022 MFC 构建基于 sherpa-onnxNext-gen Kaldi onnxruntime的离线语音应用非流式整句语音识别、流式实时语音识别与离线文本转语音。读完本文你将掌握从编译 sherpa-onnx 静态库、配置 MFC 工程依赖到模型放置、参数调优与识别/TTS 调用链落地的完整实战路径。示例工程总览mfc-examples 目录下包含三个可直接编译的 MFC 对话框程序统一由解决方案 mfc-examples.sln 组织工程分别位于三个子目录目录说明NonStreamingSpeechRecognition非流式离线语音识别录音完成后一次性解码整段语音StreamingSpeechRecognition流式在线语音识别边录音边实时输出识别结果NonStreamingTextToSpeech非流式文本转语音输入文字生成并播放语音可导出 WAV从 mfc-examples.sln 可以看到三个工程均支持 Debug/Release 与 Win32/x64 四种配置组合其中 x64 与 x86 两种平台在解决方案中对应x64与Win32平台名。工程共同依赖三个工程均通过共享属性表 sherpa-onnx-deps.props 接入 sherpa-onnx 静态库。该属性表做了两件事指定头文件与库文件搜索路径SherpaOnnxBuildDirectory指向仓库根目录下的buildSherpaOnnxInstallDirectory指向build\install即与下文先编译 sherpa-onnx的安装输出目录严格对应声明静态链接的库清单sherpa-onnx-deps.props包括sherpa-onnx-portaudio_static.lib录音/播音、sherpa-onnx-c-api.libC API 入口、sherpa-onnx-core.lib、kaldi-decoder-core.lib、sherpa-onnx-kaldifst-core.lib、sherpa-onnx-fstfar.lib、sherpa-onnx-fst.lib、kaldi-native-fbank-core.lib特征提取、kissfft-float.lib、onnxruntime.lib推理引擎、piper_phonemize.lib、espeak-ng.lib音素化、ucd.lib、ssentencepiece_core.lib分词器等。同时三个工程的.vcxproj例如 NonStreamingSpeechRecognition.vcxproj统一使用v143工具集即 Visual Studio 2022、Unicode 字符集、静态链接 MFCUseOfMfcStatic并导入sherpa-onnx-deps.props属性表。环境与前置条件根据 mfc-examples/README.md 的说明编译这些示例需要满足操作系统Windows开发环境安装Visual Studio 2022MSVC 工具集 v143MFC 与 C 桌面开发组件需一并安装依赖sherpa-onnx 本体需要先从源码编译下文给出完整命令编译时默认会拉取 onnxruntime、PortAudio、espeak-ng 等依赖运行环境程序通过 PortAudio 访问麦克风 / 扬声器因此需要 Windows 上可用的录音与放音设备。如果不想安装 Visual Studio 或编译工程可以直接下载官方发布的预编译 exe 运行见下文直接下载预编译 exe一节。README 中的示例命令以 bash 书写在 Windows 上请按 PowerShell / CMD 语法相应调整。编译从源码构建 sherpa-onnx 与 MFC 示例第一步编译并安装 sherpa-onnx在仓库根目录执行 CMake 构建产物安装到build/install该路径正是三个示例工程属性表引用的目录mkdir -p $HOME/open-source cd $HOME/open-source git clone https://github.com/k2-fsa/sherpa-onnx cd sherpa-onnx mkdir build cd build cmake -DCMAKE_BUILD_TYPERelease -DBUILD_SHARED_LIBSOFF -DCMAKE_INSTALL_PREFIX./install .. cmake --build . --config Release --target install关键点说明-DBUILD_SHARED_LIBSOFF构建静态库与 MFC 工程的静态链接方式sherpa-onnx-deps.props中链接*.lib一致-DCMAKE_INSTALL_PREFIX./install将头文件与静态库安装到build/install属性表中的SherpaOnnxInstallDirectory即指向此处若需调整后端如 ARM、NPU、GPU 等可在 cmake 时追加对应选项本示例默认使用 CPU 推理provider cpu。第二步用 msbuild 编译 MFC 解决方案回到仓库根目录下的mfc-examples用 Visual Studio 的 msbuild 命令行构建解决方案cd ../mfc-examples msbuild ./mfc-examples.sln /property:ConfigurationRelease /property:Platformx64构建完成后可直接运行生成的 exe./x64/Release/StreamingSpeechRecognition.exe ./x64/Release/NonStreamingSpeechRecognition.exe文本转语音程序位于同目录x64/Release/NonStreamingTextToSpeech.exe。若需要 32 位版本将/property:Platformx64改为/property:Platformx86对应解决方案中的 Win32 平台即可。不编译直接下载预编译 exe如果你只是想快速体验README 提供了两个途径当前版本的预编译 exe官方发布页面为每个示例分别提供了 x64 与 x86 两个版本sherpa-onnx-non-streaming-asr-*.exe、sherpa-onnx-streaming-asr-*.exe、sherpa-onnx-non-streaming-tts-*.exe历史版本的通用 exe例如sherpa-onnx-streaming-v1.5.1.exe、sherpa-onnx-non-streaming-v1.5.1.exe等。下载后需要把对应的 ONNX 模型文件放到 exe 所在的同一目录详见下文运行前的模型准备再双击运行。非流式语音识别示例NonStreamingSpeechRecognition该程序是一个 MFC 对话框应用点击Start按钮开始录音再次点击Stop停止录音并对整段音频做一次离线解码最终把完整识别文本显示在多行编辑框中核心逻辑位于 NonStreamingSpeechRecognitionDlg.cpp。支持三类模型并自动探测程序启动识别器时按顺序探测当前目录下已放置的模型文件InitRecognizerParaformer存在paraformer.onnx或paraformer.int8.onnx时使用Whisper存在whisper-encoder.onnx或whisper-encoder.int8.onnx与whisper-decoder.onnx时使用Transducer默认存在encoder.onnx、decoder.onnx、joiner.onnx时使用。三者都依赖tokens.txt分词表。int8 量化模型会被优先选中因为体积更小、CPU 推理更快。若文件缺失程序会在编辑框中输出下载与重命名指引并禁用 Start 按钮。核心配置参数以 Transducer 分支为例NonStreamingSpeechRecognitionDlg.cpp配置通过SherpaOnnxOfflineRecognizerConfig完成参数示例值含义feat_config.sample_rate16000音频采样率Hz需与模型训练时的采样率一致feat_config.feature_dim80Fbank 特征维度model_config.transducer.encoder / decoder / joiner文件路径Transducer 三件套 ONNX 模型model_config.tokens./tokens.txt分词表路径model_config.num_threads1推理线程数可适当调大以利用多核model_config.debug0是否输出调试信息Whisper 分支中为 1model_config.model_typetransducer / paraformer / whisper模型类型decoding_methodgreedy_search解码方式也可用 modified_beam_searchmax_active_paths4beam search 最大活跃路径数Whisper 分支额外要求whisper.encoder与whisper.decoder两个字段NonStreamingSpeechRecognitionDlg.cppParaformer 分支则使用paraformer.model单模型字段NonStreamingSpeechRecognitionDlg.cpp。识别调用链录音 → 波形送入 → 解码 → 取结果停止录音后程序执行标准的 sherpa-onnx 离线识别四步NonStreamingSpeechRecognitionDlg.cppconst SherpaOnnxOfflineStream *stream SherpaOnnxCreateOfflineStream(recognizer_); SherpaOnnxAcceptWaveformOffline(stream, config_.feat_config.sample_rate, samples_.data(), (int32_t)samples_.size()); SherpaOnnxDecodeOfflineStream(recognizer_, stream); auto r SherpaOnnxGetOfflineStreamResult(stream);SherpaOnnxCreateOfflineStream创建离线解码流SherpaOnnxAcceptWaveformOffline把录音期间累积的 float32 PCM 样本一次性交给识别器SherpaOnnxDecodeOfflineStream执行整段解码SherpaOnnxGetOfflineStreamResult取回结果随后用SherpaOnnxDestroyOfflineRecognizerResult与SherpaOnnxDestroyOfflineStream释放资源。每次识别结果按顺序追加Cat()辅助函数将其编号拼接到编辑框显示源码中 Utf8ToUtf16 负责把 UTF-8 识别文本转换为 MFC 控件需要的 UTF-16。录音实现PortAudio程序在OnInitDialog中调用InitMicrophone()通过 PortAudio API 获取默认输入设备Pa_GetDefaultInputDevice若不存在则禁用按钮。录音回调 RecordCallback 以单声道 float32 格式、按模型采样率 16000 采集数据并把样本累积到samples_向量回调返回paContinue或paComplete来控制录音流的启停。流式语音识别示例StreamingSpeechRecognition该程序实现边说话边出字的实时识别窗口标题为 Real-time speech recogntion with Next-gen Kaldi点击 Start 后启动录音与识别线程识别文本实时刷新点击 Stop 结束核心逻辑位于 StreamingSpeechRecognitionDlg.cpp。录音回调直接送解码流与离线示例攒够再算不同流式示例在 PortAudio 回调中实时把每一帧音频推入在线解码流SherpaOnnxOnlineStreamAcceptWaveform(stream, 16000, reinterpret_castconst float *(input_buffer), frames_per_buffer);见 StreamingSpeechRecognitionDlg.cpp录音采样率固定为 16000同样为单声道 float32。后台识别线程Start 后程序创建RecognizerThread工作线程循环执行解码RunThreadwhile (SherpaOnnxIsOnlineStreamReady(recognizer_, stream_)) { SherpaOnnxDecodeOnlineStream(recognizer_, stream_); } auto r SherpaOnnxGetOnlineStreamResult(recognizer_, stream_);线程每轮先解码所有可解码的音频块再取当前结果若文本发生变化则刷新界面随后检查是否命中端点int is_endpoint SherpaOnnxOnlineStreamIsEndpoint(recognizer_, stream_); if (is_endpoint) { SherpaOnnxOnlineStreamReset(recognizer_, stream_); // 重置流开始下一句 results.push_back(std::move(text)); // 归档当前句 }每轮循环Pa_Sleep(100)控制 CPU 占用。Stop 后通过WaitForSingleObject等待识别线程退出再关闭录音流。端点检测Endpoint配置程序同时启用了自动断句相关参数在 InitRecognizer 中配置参数示例值含义enable_endpoint1是否启用端点检测rule1_min_trailing_silence1.2规则 1句尾静音达到该秒数即判定句子结束rule2_min_trailing_silence0.8规则 2句尾静音阈值更宽松的次级规则rule3_min_utterance_length300.0规则 3语音长度下限避免把短暂静音误判为断句这些阈值可以按使用场景如安静环境 vs 嘈杂环境调优。流式示例同时支持Transducerencoder/decoder/joiner.onnx与流式 Paraformerparaformer-encoder.onnx、paraformer-decoder.onnx优先选择 int8 版本两类模型配置与离线示例类似但使用SherpaOnnxOnlineRecognizerConfig并明确设置model_config.provider cpu。非流式 TTS 示例NonStreamingTextToSpeech该程序提供文本框输入、Speaker ID、语速Speed与输出文件名四个输入项点击 Generate 后生成语音并通过扬声器播放同时将音频写入 WAV 文件另有 Stop 按钮可中断核心逻辑位于 NonStreamingTextToSpeechDlg.cpp。界面默认值为Speaker ID0、Speed1.0、输出文件./generated.wav。自动识别模型类型并装配配置程序按目录下存在的文件自动判断模型族Init并填写对应的SherpaOnnxOfflineTtsConfig字段Kokoro 模型检测到voices.bin时启用配置model.kokoro.model / voices / tokens / data_dir若同时存在dict/jieba.dict.utf8与lexicon-zh.txt还会装配dict_dir与中英文 lexicon实现中英混合朗读Matcha 模型检测到hifigan.onnx或vocos.onnx声码器时启用配置model.matcha.acoustic_model与model.matcha.vocoderVITS 模型默认分支配置model.vits.model与model.vits.tokens。模型若支持还可附带espeak-ng-data音素化数据、lexicon.txt词典以及rule_fsts/rule_fars数字、日期、电话等文本正则化规则文件如phone.fst,date.fst,number.fst。最后统一通过SherpaOnnxCreateOfflineTts(config)创建 TTS 引擎。生成参数Speaker ID、语速与静音间隔点击 Generate 后程序从界面读取参数并构造SherpaOnnxGenerationConfigNonStreamingTextToSpeechDlg.cppSherpaOnnxGenerationConfig config {0}; config.silence_scale 0.2f; // 句间静音缩放 config.sid speaker_id; // 多说话人模型的说话人 ID config.speed speed; // 语速越大越快对照 C API 头文件 c-api.h 中SherpaOnnxGenerationConfig的完整字段定义该结构还支持reference_audio/reference_audio_len/reference_sample_rate零样本克隆的参考音频、reference_text参考文本、num_stepsflow-matching 步数与extra模型相关 JSON 扩展参数供接入更高级 TTS 能力时使用。生成与播放的双线程流水线为保证界面不卡顿程序启动两个std::thread生成线程调用SherpaOnnxOfflineTtsGenerateWithConfig(tts, text, config, AudioGeneratedProgressCallback, nullptr)异步合成语音NonStreamingTextToSpeechDlg.cpp。该接口支持进度回调是 C API 推荐的新式生成入口参见 c-api.h生成的音频通过SherpaOnnxWriteWave写入 WAV 文件最后用SherpaOnnxDestroyOfflineTtsGeneratedAudio释放播放线程StartPlayback以模型采样率SherpaOnnxOfflineTtsSampleRate打开 PortAudio 输出流AudioGeneratedCallback把合成出的 float32 样本压入带互斥锁的队列PlayCallback在音频设备回调中消费队列数据送扬声器NonStreamingTextToSpeechDlg.cpp。队列为空且未结束时填充静音std::fill_n(pout, n, 0)播放完毕通过条件变量通知主流程关闭流。点击 Stop 时置g_killed true播放回调据此提前结束实现对朗读的中断。程序退出时析构函数会依次销毁 TTS 引擎并 join 两个线程NonStreamingTextToSpeechDlg.cpp。运行前的模型准备三个示例都从exe 所在目录工作目录加载模型文件缺失时程序会给出下载与重命名提示。实际操作遵循下载 → 解压/重命名 → 放到 exe 旁边三步非流式 ASR把encoder.onnx、decoder.onnx、joiner.onnx或paraformer.onnx、或whisper-encoder.onnxwhisper-decoder.onnx与tokens.txt放到 exe 目录流式 ASR把encoder.onnx、decoder.onnx、joiner.onnx流式 Transducer注意文件名为带chunk-16-left-128后缀的流式版本或paraformer-encoder.onnx、paraformer-decoder.onnx与tokens.txt放到 exe 目录TTS把model.onnx与tokens.txt放到 exe 目录并按模型族补齐voices.binKokoro、hifigan.onnx/vocos.onnxMatcha 声码器、espeak-ng-data、lexicon.txt、*.fst等可选文件。模型解压目录通常自带上述文件直接在该目录运行 exe 即可。常见问题与调试建议提示找不到模型文件检查模型文件是否与 exe 位于同一目录、文件名是否完全匹配包括int8后缀与重命名规则程序会在编辑框中输出缺失清单提示 No default input device foundASR 示例依赖默认麦克风需在 Windows 声音设置中确认录音设备可用并设为默认启动时识别器创建较慢首次创建识别器需加载 ONNX 模型并初始化推理引擎代码注释与界面提示均说明需要几秒请等待中文乱码识别文本为 UTF-8MFC 控件需要 UTF-16示例内置了Utf8ToUtf16转换函数移植代码时不要省略这一环节编译报错找不到sherpa-onnx-c-api.lib请确认已按上文步骤完成cmake --build . --target install且build/install/lib下确实生成了属性表所引用的静态库。三个示例完整覆盖了 sherpa-onnx C API 在 Windows 桌面端的典型用法离线整句解码、在线流式解码含端点检测与离线语音合成含异步播放是 MFC 应用接入离线语音能力的可直接参考的工程模板。【免费下载链接】sherpa-onnxSpeech-to-text, text-to-speech, speaker diarization, speech enhancement, source separation, and VAD using next-gen Kaldi with onnxruntime without Internet connection. Support embedded systems, Android, iOS, HarmonyOS, Raspberry Pi, RISC-V, RK NPU, Axera NPU, Ascend NPU, x86_64 servers, websocket server/client, support 12 programming languages项目地址: https://gitcode.com/GitHub_Trending/sh/sherpa-onnx创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表