你的代码本身没有问题。问题在于 Windows 的 SAPI(SAPI.SpVoice)只能看到“Desktop voice”类型的语音。
即使系统里安装了 Yaoyao 和 Kangkang,它们很多时候属于 OneCore / Mobile TTS,而不是 Desktop SAPI voice,所以 win32com.client.Dispatch("SAPI.SpVoice") 列不出来。
你现在看到的:
0: Microsoft Huihui Desktop - Chinese (Simplified)
1: Microsoft Zira Desktop - English (United States)
说明 当前 SAPI Desktop 只注册了这两个语音。
为什么 Yaoyao / Kangkang 看不到
Windows 10/11 里有 两套语音系统:
1️⃣ Desktop SAPI voices(旧接口)
- 给
SAPI.SpVoice用 -
常见:
-
Microsoft Huihui
- Microsoft Zira
2️⃣ OneCore voices(新接口)
- 给 UWP / Edge / Narrator 用
-
常见:
-
Microsoft Yaoyao
- Microsoft Kangkang
- Microsoft Xiaoxiao
你的 Python 用的是 第一种接口。
解决方法(最常用)
把 OneCore voice 注册到 Desktop SAPI。
步骤
1️⃣ 打开注册表
regedit
2️⃣ 找到 OneCore voices
HKEY_LOCAL_MACHINE
SOFTWARE
Microsoft
Speech_OneCore
Voices
Tokens
里面会有类似:
MSTTS_V110_zhCN_Yaoyao
MSTTS_V110_zhCN_Kangkang
3️⃣ 复制到 Desktop 语音位置
复制到:
HKEY_LOCAL_MACHINE
SOFTWARE
Microsoft
Speech
Voices
Tokens
自动复制(推荐)
用管理员 PowerShell:
reg copy "HKLM\SOFTWARE\Microsoft\Speech_OneCore\Voices\Tokens\MSTTS_V110_zhCN_Yaoyao" "HKLM\SOFTWARE\Microsoft\Speech\Voices\Tokens\MSTTS_V110_zhCN_Yaoyao" /s /f
reg copy "HKLM\SOFTWARE\Microsoft\Speech_OneCore\Voices\Tokens\MSTTS_V110_zhCN_KangkangM" "HKLM\SOFTWARE\Microsoft\Speech\Voices\Tokens\MSTTS_V110_zhCN_KangkangM" /s /f
然后重新运行 Python
for i, voice in enumerate(speaker.GetVoices()):
print(i, voice.GetDescription())
应该会看到类似:
0 Microsoft Huihui Desktop - Chinese (Simplified)
1 Microsoft Zira Desktop - English (United States)
2 Microsoft Yaoyao - Chinese (Simplified)
3 Microsoft Kangkang - Chinese (Simplified)
然后就可以用
speaker.Voice = speaker.GetVoices().Item(2)
speaker.Speak("你好,这是 Yaoyao 语音")
💡 额外建议(更好的 TTS)
如果你是在做 Python TTS项目,其实更推荐:
- Edge TTS(微软神经语音)
- Coqui TTS
- Piper TTS
声音质量会比 SAPI.SpVoice 高很多。
如果你愿意,我可以顺便给你一份 Python 自动检测并启用 Yaoyao / Kangkang 的完整脚本(不用手动改注册表)。 效果会比现在的代码更强。