如何使用所有可用的声音?

Vit*_*mel 5 c# speechsynthesizer windows-10

我正在使用此命令列出可用的声音

private static SpeechSynthesizer sprecher;

...

sprecher = new SpeechSynthesizer();

...

private static List<VoiceInfo> GetInstalledVoices()
{
    var listOfVoiceInfo = from voice
                          in sprecher.GetInstalledVoices()
                          select voice.VoiceInfo;

    return listOfVoiceInfo.ToList<VoiceInfo>();
}
Run Code Online (Sandbox Code Playgroud)

我只有4种不同的声音(Hedda,Hazel,David和Zira),但Windows本身显示了更多扬声器。

在此处输入图片说明

因此,我仅收到“ -Desktop”语音。如何通过c#访问其他扬声器?

M Y*_*M Y 4

编辑2:OP通过使用导出而不是命令行复制来使其工作

将 Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech_OneCore\Voices 的整个令牌目录导出到文件。将文件中的每个 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech_OneCore\Voices\Tokens 替换为 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices\Tokens 并运行该文件(我删除了之前已有的语音)。

以下线程中,MSDN 用户 A.Kelany 提出了类似的问题,他只从GetInstalledVoices方法中得到了两种声音。

他说他可以通过执行以下操作来解决此问题:

我通过执行以下操作设法让它在测试项目中工作:我打开注册表并注意到有一个节点: Quote: Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices

其中包含应用程序 GetInstalledVoices 方法中出现的声音

还有另一个节点:

引用: Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech_OneCore\Voices

包含所有声音,包括上述方法中没有出现的声音,

因此,我将其中一个声音从第二个节点复制到第一个节点,它成功了!

他还表示,在此更改后他无法继续构建Any CPU,必须将构建类型更改为x64

  • Wow6432Node 是 64 位 Windows 上 32 位注册表项所在的位置。您需要复制它们才能在任何 CPU 上正常工作。只需按照将 HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Speech_OneCore\Voices 条目导出到 HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\SPEECH\Voices 的相同过程即可。 (2认同)