尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

C# WinForms语音转文字全攻略:从System.Speech选型到NAudio避坑实录

发布时间:2026/9/28 20:19:51

资讯中心
01
ARTICLE

C# WinForms语音转文字全攻略:从System.Speech选型到NAudio避坑实录

C# WinForms语音转文字全攻略:从System.Speech选型到NAudio避坑实录
简介一套基于C#的WinForms框架实现的语音转文字示例源码面向C#开发者、智能机器人及人机对话场景演示从麦克风采集语音到输出文字的完整处理链路。源码包含项目工程、窗体界面、核心识别逻辑及配套依赖重点涉及Oraycn音频采集组件、AipSdk语音识别接口与Newtonsoft.Json数据解析等关键技术可帮助读者快速理解WinForms下语音交互模块的搭建方式。整个压缩包共65个文件以dll运行库、xml配置说明、cs源码文件为主附有exe可执行程序、resx界面资源、config配置及项目文件等类型齐全整体大小约4.88MB目录结构规整适合直接打开工程对照学习。目前已有333人学习下载。通过源码可学习到音频数据捕捉、异步识别请求、界面状态刷新及多线程协作等实践技巧开发者可在此基础上扩展指令识别、对话机器人等功能是实现智能语音交互入门的参考案例。1. 从“winfom”这个笔误说起C#语音转文字能解决什么问题如果你的浏览器里躺着“基于C#的winfom框架的语音转文字源码.zip”这个文件先别急着解压把标题里的“winfom”纠正成WinForms——这是最常见的笔误不影响你判断这个方案本身的价值。语音转文字在C#里能做的事很具体医护口述报告、客服录音质检、车间设备语音点检、上位机语音指令本质上都是“麦克风进音频TextBox出文本”这一条链路。我拆过不少同类源码包最短的从解压到说话出字不超过半小时但想让它稳定跑一周坑全藏在识别引擎的参数和UI线程里。这套方案适合谁打算在工控机上做语音输入的上位机工程师、兼职接私活的.NET开发以及刚学会C#基础、想拿窗体程序把语音识别跑起来的新手。下面会给出两条技术路线——离线用Windows自带识别引擎、在线用云API核心代码可以直接改成你自己的WinForms项目。先说明一点标题里的cx#上位机、方言语音转文字这些诉求会在第2章选型和第4章避坑里逐一回应因为多数人拿到源码后第一次翻车都在这些环节。2. 语音转文字在C# WinForms里的选型系统引擎、云API、离线模型怎么选2.1 三条技术路线成本和落地差异WinForms项目接入语音转文字常见做法不外乎三条路选型没做好后面全是坑。第一条Windows自带的System.Speech命名空间下的SpeechRecognitionEngine。它利用操作系统内置的语音识别平台不花钱、不联网、内网可用中文识别率对普通话相对标准的用户足够对数字、短句、固定指令很稳。缺点是长音频、专业术语、方言口音基本靠不住而且它依赖系统“语音”设置里是否安装了对应语言包。这套方案最适合做原型机和内网部署的上位机也是本源码包大概率采用的技术路线。第二条云端API比如讯飞、阿里云、Azure的语音识别服务。识别率高特别是普通话和多种方言粤语、四川话、河南话等的表现远超系统引擎还能拿到带标点、带时间戳的结构化结果。代价是要联网、要申请密钥、按调用次数或时长计费对公网受限的工厂内网场景不友好。如果你的项目允许联网这是把识别率拉到商用级别的常规选择。第三条本地离线模型比如Vosk、whisper.cpp这类。模型文件下载后放在本地P/Invoke调用或用JSON协议通信不联网、无流量费、支持方言模型识别速度还快。代价是集成工作量大C#侧没有官方SDK的时候要自己维护进程通信模型文件体积也偏大几百MB到GB级。Vosk相对轻量适合做“离线方言语音转文字”的国产化项目。三条路线用一张表对比更清晰方案是否联网中文识别率方言支持部署成本典型场景System.Speech否中等普通话尚可不支斜带口音会飘最低Windows自带内网上位机、原型云API是高带标点支持多种方言密钥、计费客服质检、医疗报告Vosk/whisper否较高取决于模型可选方言模型中高模型体积大离线长期运行、军工内网我建议中小项目优先考虑“System.Speech先跑通、云API做备选”的方式。原因很俗WinForms最容易被客户验收的点是“按下按钮说的话能变成字”系统引擎不需要申请任何密钥省下来的时间足够你把UI和业务流程写完。识别率不够再切云API这也是大厂里最常见的演进路径。2.2 系统引擎与NAudio采集的黄金组合如果你选择System.Speech音频采集环节我强烈建议用NAudio而不是去调WinForms自带的录音控件或Microsoft.DirectX。原因有三个NAudio是C#世界最常用的跨版本音频库对WaveIn波形输入的封装简单直接其次它提供WaveInEvent这类事件驱动的采集类天然适合WinForms的消息循环再者它支持你自由指定采样率、位深、声道数而System.Speech对这三者的敏感度不是一点半点。为什么说音频格式敏感SpeechRecognitionEngine内部对输入流有明确的格式要求常见稳定格式是16kHz、16bit、单声道PCM这是语音识别平台训练时最常用的参数。我见过不少源码包翻车就是录音端用了48kHz立体声识别引擎直接抛异常或返回空结果。NAudio里一个WaveFormat(16000, 16, 1)就能固定住这组参数后面所有代码都围绕这个格式写。采集线程和识别线程的关系也要提前理顺。NAudio的DataAvailable事件在后台线程触发System.Speech的SpeechRecognized事件也在识别引擎自己的工作线程上触发两个事件都不能直接碰UI控件。正确的姿势是采集线程把音频字节流写进某个Stream或队列识别引擎消费这个流识别结果通过BeginInvoke回到WinForms的UI线程再赋值给TextBox。这个模型理解透了后面实时识别、停止录音、释放资源都能顺着写。2.3 源码包里哪些文件决定你能否跑通拿到一个语音转文字的WinForms源码包先别急着双击sln按下面几步“验货”。第一找入口窗体文件一般是Form1.cs或MainForm.cs打开后搜SpeechRecognitionEngine和WaveInEvent这两个关键词确认它到底用了哪条技术路线搜不到这两个词说明它可能调的是云API或第三方SDK那就要去找密钥配置和AppID。第二看依赖有packages.config就看NAudio和System.Speech的引用版本有app.config看目标框架是.NET Framework 4.x还是.NET 6/8。目标框架直接影响你能不能顺利编译。第三看资源文件源码包里如果有model文件夹或tscn文件夹大概率嵌了离线模型这种包体积通常几十MB以上而纯System.Speech方案一般只有几个cs文件。第四看是否有测试用的wav音频有的话先用它跑一遍识别流程再谈接麦克风。这一步能帮你快速判断是“代码问题”还是“环境问题”。我为什么会强调验货曾经有朋友拿了个“语音转文字源码”给我看运行发现调的是百度AI平台的REST接口密钥写死在代码里早就失效了整个包就是个空壳。先看依赖和入口能避免在这种包上浪费时间。2.4 音频格式和线程模型动手前的两个底层约束WinForms做语音识别本质上在跟两个“黑匣子”打交道一个是操作系统语音识别平台另一个是音频硬件驱动。前者要求你按固定格式喂数据后者要求你按事件回调消费数据。两个约束不满足代码写得再漂亮也不出活。第一个约束是格式。System.Speech识别的音频流推荐PCM编码位深16采样率16k或8k单声道。如果你接的是网络音频流或电话录音可能是8kHz/16bit单声道也能识别但准确率会下降。音频格式不对时常见异常是“音频格式不受支持”或直接没反应。所以源码里只要看到WaveFormat、SpeechAudioFormatInfo这类代码优先检查参数。第二个约束是线程。WinForms的UI控件被限定在创建它的线程上访问任何后台线程直接写控件文本都会抛出InvalidOperationException。C#里做跨线程更新标准做法是Control.BeginInvoke或Invoke前者异步后者同步。识别结果回调里我一般用BeginInvoke因为识别引擎产生结果的频率不低同步Invoke在UI卡顿时会反过来拖慢识别线程。下面第3章的代码会在这里专门给出写法。提示System.Speech的识别结果事件里e.Result.Text是识别出的文本e.Result.Confidence是置信度范围0到1。低于0.5的结果建议直接丢弃特别是做语音指令时宁可没反应也不要误动作。3. 把源码跑通识别引擎初始化、音频采集、结果上屏的可改代码3.1 环境准备建项目、装NAudio、确认中文语音包不管源码包是.NET Framework还是.NET 6下面的代码都适用。先创建一个WinForms项目在NuGet里安装NAudio。目标框架建议用.NET Framework 4.8或.NET 8System.Speech在.NET 6/8的Windows下依然可用。在包管理器控制台执行Install-Package NAudio -Version 2.2.1装完后在cs文件顶部确认引用using System.Speech.Recognition; // 识别引擎所在命名空间 using System.Speech.AudioFormat; // 音频格式定义 using NAudio.Wave; // NAudio 的录音与波形相关类逻辑说明System.Speech是.NET Framework时代就有的官方类库Windows系统自带不需要额外安装SDKNAudio负责从麦克风采集PCM数据。两个库的分工很明确——NAudio只管拿音频识别引擎只管出文本。关于版本NAudio 2.x是当前主版本WinForms里用WaveInEvent不需要额外授权。参数说明如果你在.NET 6以上的项目里引用System.Speech可能需要先在NuGet安装System.Speech包如果使用的是.NET Framework直接使用即可。安装失败时检查项目目标框架是否为“仅Windows”因为语音识别本身就不是跨平台功能跨平台期望可以放一放。3.2 识别引擎最小初始化带中文引擎检测打开源码里的主窗体在窗体的构造函数或OnLoad里初始化识别引擎。下面的代码能检测本机装了哪些识别引擎并优先选择中文private SpeechRecognitionEngine _recognizer; private void InitRecognizer() { // 获取系统已安装的语音识别引擎 var installed SpeechRecognitionEngine.InstalledRecognizers(); var zhCn installed.CastRecognizerInfo() .FirstOrDefault(r r.Culture.Name zh-CN); if (zhCn null) { MessageBox.Show(未安装中文语音识别引擎请检查系统语音设置); return; } // 用中文引擎创建识别器 _recognizer new SpeechRecognitionEngine(zhCn); // 加载听写语法支持连续的日常语句而不是固定命令词 _recognizer.LoadGrammar(new DictationGrammar()); // 订阅识别完成事件 _recognizer.SpeechRecognized OnSpeechRecognized; // 准备接收音频流16kHz、16bit、单声道 PCM var audioFormat new SpeechAudioFormatInfo( 16000, AudioBitsPerSample.Sixteen, AudioChannel.Mono); _recognizer.SetInputToAudioStream( new MemoryStream(), audioFormat); }逻辑说明InstalledRecognizers()返回系统当前可用的识别引擎列表每个RecgonizerInfo的Culture属性标示了语言区域。这里刻意先遍历再匹配zh-CN而不是直接new SpeechRecognitionEngine(new CultureInfo(zh-CN))是为了把环境问题提前暴露出来——很多WinForms项目在英文系统或精简版Windows上跑直接构造会抛异常先检测能给出友好提示。参数说明DictationGrammar是听写语法适合自由语句、不定长文本如果你想做“打开灯/关灯/查询温度”这类固定指令可以换用GrammarBuilder构造命令集合并禁用DictationGrammar识别会更准。16000这个采样率的取值是识别速度和准确率的折中低于8000明显变差高于16000对识别率没有提升反而不稳定。3.3 录音并识别的核心代码按钮点击到文本上屏实时识别涉及流式音频先从最简单的“按一下按钮开始录音再按一下结束并识别”讲起后续再升级成实时流式。UI上放两个按钮btnRecord和btnStop一个TextBox显示结果。private WaveInEvent _waveIn; private MemoryStream _audioStream; private void BtnRecord_Click(object sender, EventArgs e) { // 内存流存PCM数据后面对接识别引擎 _audioStream new MemoryStream(); // 初始化录音设备16kHz 16bit 单声道 _waveIn new WaveInEvent { DeviceNumber 0, // 默认麦克风 WaveFormat new WaveFormat(16000, 16, 1), BufferMilliseconds 50 // 每50毫秒回调一次 }; _waveIn.DataAvailable OnDataAvailable; _waveIn.RecordingStopped OnRecordingStopped; _waveIn.StartRecording(); } private void OnDataAvailable(object sender, WaveInEventArgs e) { // 把麦克风采集到的PCM字节写入内存流 _audioStream.Write(e.Buffer, 0, e.BytesRecorded); } private void OnRecordingStopped(object sender, StoppedEventArgs e) { // 停止后把内存流交给识别引擎 _audioStream.Position 0; _recognizer.SetInputToWaveStream(_audioStream); _recognizer.Recognize(); // 同步识别最后触发SpeechRecognized } private void BtnStop_Click(object sender, EventArgs e) { _waveIn?.StopRecording(); }逻辑说明这套代码先把录音数据积累在内存流里停止后一次性交给识别引擎避免了实时流的复杂性。SetInputToWaveStream要求流里有完整的WAV文件头还是只有PCM裸数据这里坑在System.Speech的SetInputToWaveStream期望的是包含WAV头的流。上述代码只把PCM写到MemoryStream严格来说应包装成WaveFileWriter生成的WAV流更稳的写法是录音时直接用WaveFileWriter写入一个临时wav文件识别阶段调用SetInputToWaveFile。参数说明BufferMilliseconds设置采集回调的间隔50ms在绝大多数声卡上稳定如果你发现录音有爆音或卡顿可以调到100ms代价是暂停录音时延迟变大。DeviceNumber0是默认录音设备用多个麦克风的主机需要遍历WaveInEvent.DeviceCount拿到设备列表再选。上面提到wav文件更稳那就直接改成文件版既方便调试也方便复用private WaveFileWriter _writer; private string _tempWav Path.Combine(Path.GetTempPath(), speech_temp.wav); private void BtnRecord_Click(object sender, EventArgs e) { _writer new WaveFileWriter(_tempWav, new WaveFormat(16000, 16, 1)); _waveIn new WaveInEvent { DeviceNumber 0, WaveFormat new WaveFormat(16000, 16, 1), BufferMilliseconds 50 }; _waveIn.DataAvailable (s, args) _writer.Write(args.Buffer, 0, args.BytesRecorded); _waveIn.RecordingStopped (s, args) { _writer.Dispose(); BeginInvoke(new Action(() { _recognizer.SetInputToWaveFile(_tempWav); _recognizer.Recognize(); })); }; _waveIn.StartRecording(); }逻辑说明用WaveFileWriter写文件的好处是自动生成WAV文件头SetInputToWaveFile直接读取就能识别不会踩“缺头”的坑。录音停止事件里的Dispose必须执行否则文件头不会补全、识别引擎也读不了文件。BeginInvoke把识别动作拉回UI线程这样SpeechRecognized事件的结果可以直接写TextBox少一次跨线程跳转。参数说明临时文件放在系统Temp目录每次录音前覆盖同名文件避免磁盘碎片正式项目可以每次用Guid生成文件名识别完的临时文件及时File.Delete。WaveFormat(16000, 16, 1)里的三个数字分别是采样率、位深、声道数跟识别引擎的SpeechAudioFormatInfo保持一致。3.4 实时流式识别长音频、按住说话不再等录音结束文件识别适合短句比如2分钟内的问题。如果是会议录音、长时间录音用户不可能等录完才出字此时要用流式识别。核心变化是从“停止后识别”改为“边录边识别”。private void StartLiveRecognition() { // 复用上一节初始化的_recognizer加载听写语法 _recognizer.SpeechRecognized OnSpeechRecognized; // 自定义流接收NAudio写入的PCM数据识别引擎从中读取 _liveStream new BufferedWaveProvider(new WaveFormat(16000, 16, 1)); // 关键识别引擎从这个缓冲流持续消费音频 _recognizer.SetInputToAudioStream( new RawSourceWaveStream(_liveStream, new WaveFormat(16000, 16, 1)), new SpeechAudioFormatInfo(16000, AudioBitsPerSample.Sixteen, AudioChannel.Mono)); // 异步、连续识别识别完一句紧接着识别下一句 _recognizer.RecognizeAsync(RecognizeMode.Multiple); _waveIn new WaveInEvent { DeviceNumber 0, WaveFormat new WaveFormat(16000, 16, 1), BufferMilliseconds 50 }; // 采集到的音频持续写入缓冲流 _waveIn.DataAvailable (s, e) _liveStream.AddSamples(e.Buffer, 0, e.BytesRecorded); _waveIn.StartRecording(); }逻辑说明BufferedWaveProvider是NAudio提供的音频缓冲队列DataAvailable里的每次回调把PCM数据追加进去识别引擎则从同一个缓冲流里读取消费一写一读互不阻塞。RecognizeAsync(RecognizeMode.Multiple)让引擎在识别完一句话后继续等待下一句这样就实现了“边说边出字”。这个方案的结尾处理需要留意停止时先StopRecording然后调用_recognizer.RecognizeAsyncCancel否则识别线程还会一直挂在那里。参数说明BufferedWaveProvider的BufferDuration默认0.5秒声音事件密集时容易溢出导致丢字建议设置为2秒_liveStream.BufferDuration TimeSpan.FromSeconds(2);参数变大后实时性会稍有下降但对口语短句影响不大。3.5 识别文本的后处理与字符串处理识别出来的是原始文本往往带语气词和标点符号直接存库显得很脏。C#的字符串处理在这里派上用场。比如去掉“嗯”“啊”“那个”替换小错误词汇或者截取关键片段。常见的做法是这样private string CleanRecognizedText(string rawText) { if (string.IsNullOrEmpty(rawText)) return rawText; // 去掉常见语气词 string[] fillerWords { 嗯, 啊, 那个, 就是, 然后 }; foreach (var word in fillerWords) { rawText rawText.Replace(word, ); } // 去掉首尾多余空格 rawText rawText.Trim(); // 按长度截断上位机指令场景只保留前50个字符 if (rawText.Length 50) { rawText rawText.Substring(0, 50); } return rawText; }逻辑说明Repeace是C#里最直接的字符串替换方法用于清洗识别结果Substring是C#截取字符串的标准接口这里只保留前50个字符以适配指令场景。如果做语音指令建议识别前就加载Grammar而不是事后截取因为命令词表规则更严格。用这类清洗函数时注意顺序先替换语气词再Trim最后截断避免替换出来的空格影响判断。参数说明语音指令场景不建议做长度截断因为命令词表本身就是有限集合直接拿e.Result.Text和命令词做精确匹配就行只有自由听写DictationGrammar场景才需要清洗和截断。4. 避坑与排查常见问题与5个现场4.1 现象SpeechRecognized 一直不触发最常见点完按钮说话界面毫无反应。原因有三个第一识别引擎没有开始异步监听或者使用的是Recognize()但不是放在正确时机第二音频流没被识别引擎消费积压的数据一直没送到引擎第三麦克风设备号不对采到的是静音。我在一个源码包里排查过只写了一句_recognizer.Recognize()在Load事件里的奇怪代码。解决方式先断开音频流直接拿一个录好的wav调用SetInputToWaveFile并同步Recognize()如果能触发说明音频链路没问题问题在实时流。如果还不能触发检查识别引擎的AudioState变化挂一个AudioSignalProblemOccurred事件看引擎对输入流是否报错。最后确认DeviceNumber是否选了正确麦克风用一个最笨的办法——录音后播放wav听听有没有声音。4.2 现象装了中文系统却识别成英文用户说了“打开风扇”界面打出“open fan”——不是翻译而是识别引擎用了英文引擎。原因基本是初始化时没指定CultureInfo而系统同时装了中英文识别引擎默认选了第一个——常见情况正是英文。另一个可能是中文语音包未装比如精简版企业镜像。解决方式在第3.2节的初始化里用InstalledRecognizers()遍历并匹配zh-CN。如果列表里压根没有中文需要打开Windows设置的“时间和语言-语音”安装中文语音包简体中文的识别包约几百MB。装完重启应用再试大概率恢复。这个问题最容易踩因为编译不报错只是运行时不按你想要的来。4.3 现象在DataAvailable回调里更新UI崩溃弹窗报InvalidOperationException提示“跨线程操作不合法”。原因很直接NAudio的回调在录音线程识别引擎的回调在识别线程都不是创建FLabel的UI线程。WinForms要求UI控件只能由其所属线程访问强行访问就崩。解决方式回调或事件里更新控件一律用BeginInvoke包一层。识别结果事件里也同理private void OnSpeechRecognized(object sender, SpeechRecognizedEventArgs e) { string text e.Result.Text; // 跨线程安全地更新 UI 控件 BeginInvoke(new Action(() { txtResult.AppendText(text Environment.NewLine); })); }这段代码我在每个项目里都会出现不是套模板是因为识别结果事件本身就在后台线程。BeginInvoke和Invoke的区别Invoke会阻塞识别线程等UI执行完长时间录音时UI卡住会把识别线程也拖死所以一律用BeginInvoke。4.4 现象长时间运行内存只升不降WinForms程序跑了几个小时后内存从50MB涨到500MB。原因每次录音都new了一个MemoryStream或WaveFileWriter把流和事件的订阅关系留在了识别引擎上——最常见的是DataAvailable匿名委托挂到_waveIn上_waveIn没有Dispose事件链就越拖越重。解决方式每次录音停止后按顺序执行_waveIn.DataAvailable - handler、_waveIn.Dispose()、_recognizer.SpeechRecognized - handler。项目中如果用了匿名委托就要把handler存成字段才能移除。另外MemoryStream用完就必须Dispose实时流的BufferedWaveProvider会在持续录音时积压数据建议定期清空或加大BufferDuration后自己控制。排查内存上升时先用性能分析器看Managed Memory中WaveInEvent和SpeechRecognitionEngine的实例数实例数只增不减就说明释放代码没走到。4.5 现象方言、地方口音识别率低用户是四川人说“把儿个灯关了”System.Speech直接给出一段莫名其妙的话。原因系统引擎在普通话训练集上学习对地方口音和方言几乎没有覆盖。解决方式这种情况建议直接切换到云API或Vosk模型。Vosk社区提供普通话和粤语的模型识别四川话、河南话等口音需要自己用对应语料做微调成本高。商用项目直接选用云端方案快速上线比如REST接口返回文本即可WinForms这边维护成本接近零。如果数据敏感不允许出内网才考虑Vosk离线模型。此处不是劝你买云服务而是从交付角度提醒系统引擎的方言短板是硬性的别花几周调参去弥补一个模型本身不具备的能力。5. 进阶玩法离线模型跑方言、批量验证识别率、做成HTTP服务5.1 用Vosk在WinForms里做离线/方言识别System.Speech应付普通话和短句没问题一旦要离线跑方言我建议看Vosk这个开源项目。Vosk提供C#示例调用思路是下载中文模型解压到本地通过P/Invoke或命令行方式启动识别进程WinForms与它通过stdin/stdout交换音频和结果。WinForms侧仍然是NAudio采集音频把PCM写入Vosk的stdin再从stdout读取JSON格式的识别结果解析出text字段显示在UI上。这个路线的优势是模型内网部署无License成本劣势是首次配置模型路径和依赖库比较繁琐而且模型准确率取决于你对模型与语料的适配程度。如果你正在做“方言语音转文字”的内网项目这是目前比较可靠的方案。准备好长期调试模型参数的预期再投入比盲目上云然后被数据保密要求绑住更稳妥。5.2 批量验证识别率的办法识别率不能靠感觉评估。我会准备20到50条覆盖不同场景的wav测试音频按“张三_20250201_001.wav”的命名方式放到test-audio文件夹然后写一个批处理脚本依次交给识别引擎输出识别结果到txt文件再与预期答案比对。每条样本记录三样东西预期文本、识别文本、置信度。置信度低于0.4的先筛出来人工复核因为这往往是边界场景。这套流程跑下来你才知道当前方案在数字、英文、口音上的真实表现也才有底气决定是否切云API。常见做法是周末抽半天录一批测试集之后每次改代码或换模型都跑一遍做回归避免改一处坏全局。5.3 把识别服务化WinForms变成只管UI的客户端如果你有多个WinForms客户端要共用识别能力不建议在每个窗体里new一个SpeechRecognitionEngine。我一般会在本机开一个轻量级TCP监听把识别做成一个独立服务进程客户端把wav文件或音频流推过去服务端返回识别文本。C#里的TcpListener可以服务多个客户端每个客户端连接后循环读取音频数据并调用识别引擎。这样做的好处识别引擎单实例全局复用不会因为多个窗体各自创建导致内存爆炸同时模型、引擎、语法配置集中在服务端更新一次全部客户端生效。这个思路跟“上位机采集服务端识别”的常见架构一致适合既有系统改造。最后说一个我踩过多次的教训不管用哪条路线先把自己要识别的范围定义成一张表——是自由听写还是固定命令是普通话还是方言是否需要标点和置信度。表列清楚了再写代码所有的参数和引擎选型都是这张表的自然结果。我以前图省事直接套系统引擎做方言需求交付后被客户反复打回后来老老实实换Vosk才收尾。希望帮到你。本文还有配套的精品资源点击获取
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。