简介:面向 Windows 平台语音识别与 TTS 开发的 Speech SDK 5.1 及中文语言包,主要服务于需要为传统桌面程序接入语音识别、语音合成能力的中初级开发者,也可作为教学演示和旧项目维护的参考环境。压缩包共 15 个文件,约 147.88MB,包含 exe、msi 安装程序,cab 组件包,chm 帮助文档以及 ini、inf 等配置说明,兼顾部署文件与查阅资料。已有 4639 人学习下载,说明其在经典语音开发场景中仍具参考价值。包内提供 SDK 主体与中文语言包,二者配套关系明确,安装路径下附带使用示例,便于读者了解语音识别与 TTS 接口的组织方式、示例工程结构及常见配置项,适合用来搭建本地实验环境、核对旧版接口调用,或为维护遗留语音项目补充文档依据。
1. 从一台只能朗读英文的老机器说起:Speech SDK 5.1 到底装什么
前阵子接手一台做语音播报的旧工控机,系统是 Windows 7 32 位,程序里调着 SAPI 的 SpVoice,界面一切到中文就哑火,日志只留一句「没有可用的语音」。机器上装的是微软语音识别开发包 Speech SDK 5.1,英文朗读正常,中文语音包却始终没生效——TTS 语音识别这套东西,装对了是几行代码的事,装错了就是无穷无尽的「找不到语音引擎」。
Speech SDK 5.1 的存量比想象中大:老式叫号系统、无障碍朗读、语音报读、教学演示、工控上位机,很多都是拿它拼出来的。它同时提供 TTS(文字转语音)和 SR(语音识别)两套 COM 接口,VB、Delphi、C#、C++ 都能调。问题是它诞生年代早,中文语音包又是独立分发的,安装顺序、系统位数、注册表视图任何一环错了,中文就出不来。这篇按我自己的装机顺序走一遍,从环境盘点、本体安装、中文包配置写到验证和排错,适合还在维护这类老项目、或者要在干净机器上把 TTS 和中文识别跑起来的人。
2. 装前环境盘点:Speech SDK 5.1 对系统、位数和运行库的要求
装这套东西最容易犯的错,是拿到安装包就双击,装完发现控制面板里根本没有中文语音。问题往往不在安装包本身,而在装之前的机器状态:系统位数不对、运行库缺、旧版 SAPI 残留没清。这一章先把环境摸清,后面两步才不会白做。
2.1 系统版本与位数:32 位组件在 64 位系统上的真实处境
Speech SDK 5.1 是 32 位 COM 组件,这一点必须先刻在脑子里。它注册的是 32 位的sapi.dll,在 64 位 Windows 上落在WOW6432Node注册表视图里。这意味着两件事:第一,64 位进程直接CreateObject("SAPI.SpVoice")大概率拿到的是系统自带的 SAPI 5.3/5.4,不是你以为的 5.1;第二,用 .NET 的System.Speech时,如果项目平台目标是 AnyCPU 且跑在 64 位宿主上,同样会绕开 5.1。
我在 64 位系统上的一般做法是把调用方锁死为 x86。C# 项目在生成属性里把「平台目标」改成 x86,C++ 用 32 位编译,Delphi 本来就出 32 位程序,问题不大。脚本类调用(VBScript、PowerShell)默认走 32 位宿主还行,PowerShell 要注意用 32 位版本,别用默认的 64 位控制台。
系统版本方面,这套包在 Windows 2000/XP/2003 上是原生适配,Windows 7 32 位实测可用,Windows 10/11 能装但会和系统自带的 SAPI 5.3/5.4 抢注册表,语音面板可能变得不正常。我的建议很直接:能上虚拟机就上虚拟机,实在要装在物理机,先做系统还原点。下面这张表是我自己的取舍记录,不是官方兼容列表,装之前对着看一眼。
| 系统 | 能否装 5.1 | 我的处理方式 |
|---|---|---|
| Windows XP / 2003 32 位 | 原生适配 | 直接装,最省事 |
| Windows 7 32 位 | 可用 | 直接装,注意先卸旧语言包 |
| Windows 7 / 10 64 位 | 可装但受限 | 虚拟机优先,物理机锁 x86 调用 |
| Windows 10 / 11 新机 | 不建议 | 用系统自带 SAPI 或换方案 |
| Windows Server 2008 及以上 | 视版本 | 先查系统 SAPI 版本再决定 |
注意:装 5.1 会覆盖部分系统语音组件,装之前一定建还原点,或者干脆用快照。这是整套流程里唯一没有后悔药的一步。
2.2 运行库与前置组件:别漏掉 MSXML 和 .NET
Speech SDK 5.1 的安装程序本身依赖 Windows Installer,老系统上如果 Installer 版本太低,安装会中途回滚,日志里只写一句「安装失败」,很容易误判成安装包损坏。装之前先确认 Windows Installer 3.1 以上,XP 时代的老机器尤其要看。
开发侧还有两个常被漏掉的前置:
- MSXML:SDK 自带的某些示例和部分识别引擎的配置读取依赖 MSXML 4.0 或 6.0,缺了会在初始化识别引擎时报
0x80040154(类未注册),看着像 COM 没注册,其实是 XML 解析组件没装。 - .NET Framework 3.5 及以上:如果打算用
System.Speech封装调用,需要这个。.NET Framework 3.5 在 Windows 10 上要在「启用或关闭 Windows 功能」里手动勾选,默认不开。
另外,中文语音包安装时会在系统目录写语音数据文件,装之前确认 C 盘剩余空间,我遇到过空间不足导致语音文件写入一半、控制面板里语音列表空白的案例。空间留 2GB 以上比较稳。
2.3 安装包清单:开发包、语言包、合并模块分别干什么
Speech SDK 5.1 这套东西一般到手是几个独立文件,名字相近,作用完全不同,装错顺序或者只装其中一个,中文就出不来。先把每个包干什么讲清楚。
| 安装包 | 作用 | 是否必装 |
|---|---|---|
| SpeechSDK51.exe | 开发包本体,装 SAPI 运行时、COM 接口、示例代码 | 必装,第一步 |
| SpeechSDK51LangPack.exe | 语言包,提供简体中文 TTS 语音和识别资源 | 要中文就必装,第二步 |
| SpeechSDK51MSM.exe | 合并模块,给安装程序打包分发用 | 开发分发时才用 |
| 中文语音独立包 | 部分渠道单独提供的中文 TTS 引擎 | 看语言包是否已含 |
判断语言包有没有装成功,不看安装程序最后那个「完成」按钮,看控制面板「语音」里的语音列表。列表里出现中文语音条目才算数,这一步后面第 4 章会细讲。很多人以为装完 SDK 就有中文,实际上 5.1 本体只带英文语音,中文必须靠语言包,这是第一个高频误解。
3. 安装 Speech SDK 5.1 本体:安装包选择、静默参数与注册
环境确认完就可以动手了。这一章讲本体安装,重点不是「下一步」点多少次,而是安装顺序、静默参数和装完怎么确认 COM 真的注册上了。交互安装谁都会,出问题的是批量部署和装完不验证。
3.1 安装顺序:先装 SDK 还是先装语言包
顺序必须是先本体、后语言包,不能反。语言包安装时会去读HKLM\SOFTWARE\Microsoft\Speech\Voices\Tokens这个键,本体没装,这个键不存在,语言包要么直接报错退出,要么装完不注册语音条目,控制面板里空空如也。
还有一个顺序细节:如果机器上之前装过旧版 SDK 或者别的语音引擎,先卸干净再装。残留的语音 token 会让新装的语音在列表里出现重复项,代码里按索引取语音时可能取到失效的那个,朗读时静默失败。卸载后重启一次,让 COM 注册表刷新,再装新版。
我的标准顺序是:卸旧版 → 重启 → 装本体 → 重启 → 装语言包 → 重启 → 验证。重启次数看着多,但比装完发现中文不生效再回头排查省时间,这是踩过坑之后形成的习惯。
3.2 静默安装参数与安装目录
SpeechSDK51.exe是自解压包,直接带/qn这类 msiexec 参数传进去经常不生效,因为参数被自解压层吃掉了。稳妥做法是先解压、再调 msiexec,这样日志也能完整记录。下面是我批量部署时用的命令。
:: 第一步:把自解压包解到临时目录,不直接安装 SpeechSDK51.exe /C /T:C:\temp\sapi51 :: 第二步:用 msiexec 静默安装,/qn 无界面,/norestart 不自动重启 :: /l*v 输出详细日志,出问题时全靠这个日志定位 msiexec /i C:\temp\sapi51\SpeechSDK51.msi /qn /norestart /l*v C:\temp\sapi51_install.log :: 第三步:语言包同样先解压再装 SpeechSDK51LangPack.exe /C /T:C:\temp\sapi51lp msiexec /i C:\temp\sapi51lp\SpeechSDK51LangPack.msi /qn /norestart /l*v C:\temp\sapi51lp_install.log参数说明:/C /T:路径是自解压包的解压指令,/C表示只解压不运行,/T指定目标目录;/qn是 msiexec 的完全静默,/norestart禁止安装程序自行重启,避免打断批量脚本;/l*v生成最详细的安装日志,v是 verbose。日志路径别放在系统临时目录,装完重启可能被清掉,我一般固定放C:\temp并在装完后统一归档。
如果是交互安装,安装目录保持默认即可,不要改到带中文或空格的路径。SDK 的示例和部分注册逻辑对路径敏感,改到D:\我的工具\语音这种路径,后续编译示例可能找不到头文件。
3.3 安装后的 COM 注册检查
装完别急着写代码,先用注册表命令确认 COM 组件真的注册上了。32 位组件在 64 位系统上要看WOW6432Node视图,这一点前面提过,验证时同样要分视图查。
:: 查 32 位视图下的语音 token,这是 Speech SDK 5.1 真正写入的位置 reg query "HKLM\SOFTWARE\WOW6432Node\Microsoft\Speech\Voices\Tokens" /s :: 查 64 位视图,如果这里也有条目,说明系统自带 SAPI 也参与了 reg query "HKLM\SOFTWARE\Microsoft\Speech\Voices\Tokens" /s :: 确认 sapi.dll 的版本,5.1 的版本号是 5.1.x wmic datafile where "name='C:\\Windows\\System32\\sapi.dll'" get version注册表查询的输出里,每个语音 token 下面会有Attributes、Language这类子键。Language的值是关键,简体中文对应2052,英文对应1033。如果中文语音装上了但Language显示1033,那它在代码里就不会被当成中文语音匹配,这是后面第 5 章要展开的坑之一。
wmic在部分精简系统上不可用,替代命令是powershell -command "(Get-Item C:\Windows\System32\sapi.dll).VersionInfo.FileVersion"。版本号显示 5.1.x 说明本体装对了;如果显示 5.3 或 5.4,说明你查到的是系统自带的那个,5.1 可能根本没覆盖成功,得回去看安装日志。
注意:注册表检查要在装语言包之前做一次、之后再做一次,对比两次的 token 数量变化,才能确认语言包确实写入了东西,而不是「安装程序说成功、注册表没变化」。
4. 中文语音包与中文识别包配置:语言 ID、注册表和控制面板
本体装完只是有了英文语音和 COM 接口,要让 TTS 出中文、识别听中文,还得把语言包这层配置打通。这一章的三个小节分别对应控制面板、注册表和代码层,三层都对上了,中文才算真正可用。
4.1 控制面板里的语音切换与语言 ID
语言包装完,第一站是控制面板的「语音」属性。XP 和 Windows 7 的入口是「控制面板 → 语音」,里面分「语音选择」和「文字转语音」两个标签页,中文语音出现在「语音选择」的下拉列表里。
这里有个语言 ID 的细节值得说清楚。SAPI 用的语言标识遵循 LCID 规则,简体中文是2052,对应十六进制0x0804;英文美国是1033,0x0409。控制面板里显示的语音名称可能是「Microsoft Simplified Chinese」这类英文标识,别被名字骗了,判断是不是中文语音,看的是它背后的 Language 属性,不是显示名。
如果下拉列表里只有英文语音,说明语言包没注册成功,回第 3 章查注册表;如果列表里有两个中文语音但一个选了没声音,大概率是旧版残留 token,得清注册表。控制面板里改完默认语音后,点「应用」再点「确定」,只点确定不点应用,部分系统上默认语音不会真正写回注册表。
4.2 注册表里的 Voices\Tokens 怎么核对
控制面板看不到细节,注册表才是黑匣子。每个 TTS 语音在Tokens下面一个独立子键,子键名是一串 GUID,里面的值决定这个语音能不能被代码识别成中文。下面是我核对时固定看的几个值。
:: 列出所有语音 token 的子键名,GUID 形式 reg query "HKLM\SOFTWARE\WOW6432Node\Microsoft\Speech\Voices\Tokens" /s /v Language :: 看某个具体 token 的详细信息,把 GUID 换成实际值 reg query "HKLM\SOFTWARE\WOW6432Node\Microsoft\Speech\Voices\Tokens\{GUID}" /s重点看三个值:Language是不是2052或者包含804;Name是不是中文语音的标识名;CLSID指向的 COM 类能不能在HKCR\CLSID下找到对应注册项。CLSID找不到,说明语音引擎的 DLL 没注册,朗读时会直接抛「类未注册」。
识别引擎在另一条路径下:HKLM\SOFTWARE\WOW6432Node\Microsoft\Speech\Recognizers\Tokens。这里要注意,Speech SDK 5.1 的中文语言包不一定带中文识别引擎,装完先用代码列一遍识别器列表,列表里没有中文项就说明只装了 TTS 中文,识别还是英文。这一点很多资料含糊带过,实际部署时按「先列后配」处理最稳。
4.3 在代码里指定中文语音与识别引擎
注册表对了,代码层还要显式指定,不能指望系统自动挑中文。SpVoice默认用系统默认语音,默认语音往往是英文,直接Speak中文文本出来的是拼读英文腔调。下面这段 C# 是显式选中文语音的最小写法。
using System; using System.Speech.Synthesis; class Program { static void Main() { using (var synth = new SpeechSynthesizer()) { // 先把本机所有语音列出来,确认中文语音的准确 Name foreach (var v in synth.GetInstalledVoices()) { Console.WriteLine($"{v.VoiceInfo.Name} | Culture={v.VoiceInfo.Culture} | Enabled={v.Enabled}"); } // 按 Name 精确选择中文语音,Name 要和上面输出的一致 synth.SelectVoice("Microsoft Simplified Chinese"); synth.Rate = 0; // 语速,-10 到 10,0 是正常 synth.Volume = 100; // 音量,0 到 100 synth.Speak("语音合成测试,一二三四五"); } } }这段代码的要点在SelectVoice那一行:参数是语音的Name属性,不是显示名,必须和GetInstalledVoices打印出来的一致,差一个空格都会抛ArgumentException。Rate和Volume是可选项,老项目里经常因为语速设得太快听不清,调试时先归零。另外,这段代码用的是System.Speech,底层走的是系统 SAPI,在 64 位进程下会绕开 32 位的 5.1,所以项目平台目标要设成 x86,前面 2.1 节强调过。
识别侧同理,SpeechRecognitionEngine构造时要传CultureInfo("zh-CN"),传en-US就是英文识别器,中文语音喂进去识别不出来。识别引擎列表用SpeechRecognitionEngine.InstalledRecognizers()静态方法列,列出来没有zh-CN项,就说明中文识别包没装,回去补装,别在代码里硬试。
5. 安装避坑:五个把中文语音装丢的常见问题
这套环境装坏的方式高度集中,我把这几年遇到的案例归成五条,每条按现象、原因、解决写。看完这一章,前面三章的操作基本能避开八成返工。
5.1 安装与注册阶段的三个坑
坑一:装完控制面板里有中文语音,代码里GetInstalledVoices却只有英文。
现象是控制面板列表正常,程序跑起来枚举语音只有英文项。原因是调用方进程是 64 位,读的是 64 位注册表视图,而 Speech SDK 5.1 只写了 32 位视图,两套视图各看各的。解决办法是把调用方编译成 x86,或者在 32 位宿主里跑脚本验证,确认是位数问题而不是安装问题。
坑二:语言包安装程序报成功,注册表里没有任何中文 token。
现象是安装进度条走完、提示完成,reg query却查不到新增的Language=2052条目。原因是本体没装或者装到一半回滚,语言包找不到宿主键,静默失败了。解决办法是先卸语言包,确认本体注册表Tokens键存在,再重装语言包,装完立刻查注册表,别信安装程序的完成提示。
坑三:中文语音出现在列表里,选中后朗读没声音也不报错。
现象是Speak调用返回,音频设备没有任何输出,程序也不抛异常。原因是语音引擎的 DLL 实际没注册,CLSID在HKCR\CLSID下找不到对应项,SAPI 静默跳过。解决办法是拿注册表里的CLSID去reg query "HKCR\CLSID\{...}"查,查不到就用安装包修复安装,别手动regsvr32猜 DLL 路径。
5.2 运行与调用阶段的三个坑
坑四:VBScript 里中文朗读乱码或者读成乱音。
现象是脚本里写的中文文本朗读出来是杂音,或者干脆跳读。原因是.vbs文件保存成了 ANSI 编码,中文字符在脚本解析阶段就坏了,SAPI 拿到的是乱码字符串。解决办法是把脚本另存为 UTF-16 LE 或者带 BOM 的 UTF-8,用cscript //nologo test.vbs跑,别双击。这个坑和 SDK 本身无关,但排查时最容易误判成语音包问题。
坑五:识别引擎初始化抛0x80040154,类未注册。
现象是new SpeechRecognitionEngine(...)直接抛 COM 异常,错误码0x80040154。原因有两个:一是中文识别引擎根本没装,二是 MSXML 运行库缺失导致引擎初始化失败,报错码长得一样。排查顺序是先列InstalledRecognizers()看有没有中文项,没有就是没装;有还报错,就去补 MSXML 4.0 或 6.0,再看系统日志里的具体失败模块。这个错误码是典型的「一个码两种病」,别一上来就重装 SDK。
注意:五条坑里有三条和位数、注册表视图有关,两条和编码、运行库有关。真正属于「安装包坏了」的情况极少,遇到问题先查位数和注册表,比重装十遍有效。
6. 验证跑通:用 VBScript 和 C# 把 TTS 与中文识别各跑一遍
装完不验证等于没装。这一章给两段可以直接抄的验证脚本,一段用 VBScript 做最小验证,一段用 C# 做完整调用,最后给一张排查顺序表。验证的目标不是「程序没报错」,而是「中文语音真的出声、识别器真的能列出来」。
6.1 先用 VBScript 做最小验证
VBScript 不依赖编译环境,适合装完立刻验证。把下面内容存成check_tts.vbs,注意编码存 UTF-16 LE,然后命令行跑cscript //nologo check_tts.vbs。
' 创建 SAPI 语音对象,这是 32 位 COM 组件 Set voice = CreateObject("SAPI.SpVoice") ' 枚举本机所有 TTS 语音,逐个打印名称和语言 Set tokens = voice.GetVoices() WScript.Echo "共找到 " & tokens.Count & " 个语音:" For i = 0 To tokens.Count - 1 WScript.Echo i & " -> " & tokens.Item(i).GetDescription() Next ' 选第一个语音朗读,用来确认音频链路是通的 voice.Speak "Speech SDK 5.1 语音测试"这段脚本的作用是分层验证:CreateObject成功说明 COM 注册没问题;GetVoices数量大于零说明至少有语音可用;Speak出声说明音频设备和引擎都正常。三步里任何一步失败,对应的问题范围立刻缩小。如果GetVoices里没有中文项,回第 4 章查注册表;如果中文项在但朗读是英文腔,说明默认语音没选对,需要在代码里显式SelectVoice。
6.2 用 C# 做完整调用(指定中文语音 + 识别)
VBScript 只能验证 TTS,识别和中文语音精确选择要用 C#。下面这段代码把 TTS 和识别器枚举放在一起,一次跑完看清楚本机到底有什么。
using System; using System.Speech.Synthesis; using System.Speech.Recognition; class Verify { static void Main() { // TTS 部分:列出语音并显式选中文朗读 using (var synth = new SpeechSynthesizer()) { Console.WriteLine("== TTS 语音列表 =="); foreach (var v in synth.GetInstalledVoices()) Console.WriteLine($"{v.VoiceInfo.Name} | {v.VoiceInfo.Culture}"); synth.SelectVoice("Microsoft Simplified Chinese"); synth.Speak("中文语音合成验证通过"); } // 识别部分:列出本机识别器,看有没有 zh-CN Console.WriteLine("== 识别器列表 =="); foreach (var r in SpeechRecognitionEngine.InstalledRecognizers()) Console.WriteLine($"{r.Name} | {r.Culture}"); } }编译时注意两点:项目要引用System.Speech程序集,平台目标设 x86。InstalledRecognizers()列出zh-CN项,说明中文识别引擎装上了;只有en-US,说明语言包里没带中文识别,TTS 中文可用但识别还是英文。这一步的输出建议截图存档,以后换机器部署时直接对比,省得每次重新摸一遍。
6.3 验证清单与失败排查顺序
验证不通过时,按下面的顺序查,别跳步。跳步的代价是把安装问题误判成代码问题,来回折腾。
| 验证项 | 预期结果 | 失败先查什么 |
|---|---|---|
CreateObject("SAPI.SpVoice") | 不抛异常 | 32 位 COM 是否注册,查 WOW6432Node |
GetVoices().Count | 大于 0 | 本体是否装成功,查 sapi.dll 版本 |
| 语音列表含中文项 | Language=2052 | 语言包是否装、注册表 token 是否存在 |
Speak有声音 | 音频设备出声 | 默认音频设备、语音 CLSID 是否有效 |
识别器含zh-CN | 列表出现中文项 | 中文识别包是否随语言包安装 |
这张表的用法是从上往下逐行过,哪行失败就停在哪行排查,不要带着一个失败项继续往下测,后面的结果都不可信。
从那以后我每次装这套环境,都强制走一遍「注册表查 token → VBScript 出声 → C# 列识别器」三步,任何一步的输出都留档。这套东西年代久,出问题的点翻来覆去就那几个,把验证顺序固定下来,比记一堆零散的报错码管用。希望帮到你。
本文还有配套的精品资源,点击获取