目录
需求
最近需要在程序中实现语音合成功能,Windows已经提供了两个发音人库,但转换效果不甚理想。
解决思路
实际上微软在Windows10及后续版本(windows11)中已经提供了其他发音人库,但需要添加相应访问入口才行。
具体实现
需要修改注册表,手工建立三个发音人的键值,然后使用程序调用发音人进行TTS。
修改注册表
新建一个文本文件,扩展名为.reg
内容如下:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SPEECH\Voices\Tokens\MSTTS_V110_zhCN_KangkangM]
@="Microsoft Kangkang Mobile - Chinese (Simplified, PRC)"
"LangDataPath"="%windir%\\Speech_OneCore\\Engines\\TTS\\zh-CN\\MSTTSLoczhCN.dat"
"VoicePath"="%windir%\\Speech_OneCore\\Engines\\TTS\\zh-CN\\M2052Kangkang"
"804"="Microsoft Kangkang Mobile - Chinese (Simplified, PRC)"
"CLSID"="{179F3D56-1B0B-42B2-A962-59B7EF59FE1B}"
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SPEECH\Voices\Tokens\MSTTS_V110_zhCN_KangkangM\Attributes]
"Version"="11.0"
"Language"="804"
"Gender"="Male"
"Age"="Adult"
"DataVersion"="11.0.2013.1022"
"SharedPronunciation"=""
"Name"="Microsoft Kangkang Mobile"
"Vendor"="Microsoft"
"SampleText"="您已选择 %1 作为默认语音"
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\SPEECH\Voices\Tokens\MSTTS_V110_zhCN_YaoyaoM]
@="Microsoft Yaoyao Mobile - Chinese (Simplified, PRC)"
"LangDataPath"="%windir%\\Speech_OneCore\\Engines\\TTS\\zh-CN\\MSTTSLoczhCN.dat"
"VoicePath"="%windir%\\Speech_OneCore\\Engines\\TTS\\zh-CN\\M2052Yaoyao"
"804"="Microsoft Yaoyao Mobile - Chinese (Simplified, PRC)"
"CLSID"="{179F3D56-1B0B-42B2-A962-59B7EF59FE1B}"
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\SPEECH\Voices\Tokens\MSTTS_V110_zhCN_YaoyaoM\Attributes]
"Version"="11.0"
"Language"="804"
"Gender"="Female"
"Age"="Adult"
"DataVersion"="11.0.2013.1022"
"SharedPronunciation"=""
"Name"="Microsoft Yaoyao Mobile"
"Vendor"="Microsoft"
"SampleText"="您已选择 %1 作为默认语音"
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\SPEECH\Voices\Tokens\MSTTS_V110_zhCN_HongyuM]
@="Microsoft Cortana - China"
"804"="Microsoft Cortana - China"
"CLSID"="{179F3D56-1B0B-42B2-A962-59B7EF59FE1B}"
"LangDataPath"=hex(2):25,00,77,00,69,00,6e,00,64,00,69,00,72,00,25,00,5c,00,53,\
00,70,00,65,00,65,00,63,00,68,00,5f,00,4f,00,6e,00,65,00,43,00,6f,00,72,00,\
65,00,5c,00,45,00,6e,00,67,00,69,00,6e,00,65,00,73,00,5c,00,54,00,54,00,53,\
00,5c,00,7a,00,68,00,2d,00,43,00,4e,00,5c,00,4d,00,53,00,54,00,54,00,53,00,\
4c,00,6f,00,63,00,7a,00,68,00,43,00,4e,00,2e,00,64,00,61,00,74,00,00,00
"VoicePath"=hex(2):25,00,77,00,69,00,6e,00,64,00,69,00,72,00,25,00,5c,00,53,00,\
70,00,65,00,65,00,63,00,68,00,5f,00,4f,00,6e,00,65,00,43,00,6f,00,72,00,65,\
00,5c,00,45,00,6e,00,67,00,69,00,6e,00,65,00,73,00,5c,00,54,00,54,00,53,00,\
5c,00,7a,00,68,00,2d,00,43,00,4e,00,5c,00,4d,00,32,00,30,00,35,00,32,00,48,\
00,6f,00,6e,00,67,00,79,00,75,00,00,00
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\SPEECH\Voices\Tokens\MSTTS_V110_zhCN_HongyuM\Attributes]
"Age"="Adult"
"DataVersion"="11.0.2013.1022"
"Gender"="Female"
"Language"="804"
"Name"="Microsoft Hongyu Mobile"
"SharedPronunciation"=""
"Vendor"="Microsoft"
"Version"="11.0"
双击这个.reg文件,将上述内容加入注册表
读取系统自带发音人
在c#中获取Windows10自带的发音人
,后续程序可以使用下面代码进行遍历并填充至下拉列表框控件中:
// 引入命名空间,假设使用的是System.Speech
using System.Speech.Synthesis;
// 在某个方法或事件处理程序中
using (SpeechSynthesizer synthesizer = new SpeechSynthesizer()) // 使用using语句确保资源被正确释放
{
// 遍历系统中安装的所有语音
foreach (var voice in synthesizer.GetInstalledVoices())
{
// 获取当前语音的详细信息
var info = voice.VoiceInfo;
// 将语音的名称添加到comboBox1的项中,供用户选择
comboBox1.Items.Add(info.Name);
}
}
程序调用实现TTS
// 使用微软的TTS服务来朗读文本
private void SpeakWithMicrosoftTTS(string text)
{
// 使用SpeechSynthesizer类创建一个语音合成器的实例
using (var synthesizer = new SpeechSynthesizer())
{
// 设置输出设备为默认音频设备
synthesizer.SetOutputToDefaultAudioDevice();
// 根据comboBox控件中选中的文本选择语音
synthesizer.SelectVoice(comboBox1.Text);
// 设置音量,使用界面控件的值
synthesizer.Volume = this.trbVolume.Value;
// 设置语速,使用界面控件的值
synthesizer.Rate = this.trbSpeed.Value;
// 开始朗读文本
synthesizer.Speak(text);
}
}