在 C# 中为 TTS 调用 SAPI,但它使用的是隐藏菜单而不是默认的 windows

Calling SAPI in C# for TTS but it is using a hidden menu instead of windows default

所以为了简单起见,我们就用微软提供的测试程序吧。在 运行 之前,您需要去管理项目的 NuGet 包并添加 speech.synthesis。但是这样做之后,它会起作用。

using System;
using System.Speech.Synthesis;

namespace SampleSynthesis

{
    class Program
    {
        static void Main(string[] args)
    {

        // Initialize a new instance of the SpeechSynthesizer.  
        SpeechSynthesizer synth = new SpeechSynthesizer();

        // Configure the audio output.   
        synth.SetOutputToDefaultAudioDevice();

        // Speak a string.  
        synth.Speak("This example demonstrates a basic use of Speech Synthesizer");

        Console.WriteLine();
        Console.WriteLine("Press any key to exit...");
        Console.ReadKey();
    }
}

问题来了:它会用默认语音说话。但它不使用正常的默认语音。如果您转到控制面板 - 将文本更改为语音设置,这些设置不会影响此处使用的语音。

但是如果你去这里: %windir%\sysWOW64\speech\SpeechUX\SAPI.cpl

并更改那里的设置,它会影响程序。

我正在制作一个专注于让视障人士可以访问的程序,我非常希望它使用实际的默认值,而不是这个菜单中很难找到的默认值。

我试图查看是否可以读取注册码然后让它在读取密钥后从列表中选择,但我发现的是:

Computer\HKEY_CURRENT_USER\SOFTWARE\Microsoft\Speech\Voices

显示的是 SAPI 菜单的默认值,而不是控制面板菜单。

我已经通读了所有关于命令的文档,但我没有找到一种方法让它注意用户的实际默认设置。使用他们没有通过正常选项 select 的声音似乎很奇怪,因为改变我的程序的声音需要他们进入这个奇怪的菜单。

如何让 SAPI 关注控制面板菜单?

澄清一下,获取已设置的实际文本速度和音量也同样重要。

SAPI 是一个非常非常古老的 API,并且 Windows 8(及以后)已切换到 WinRT TTS APIs。

特别是,Windows 控制面板 TTS 设置设置了 Windows.Media.SpeechSynthesis 命名空间中 WinRT TTS API 的默认值。

不过,幸运的是,更改 C# 代码以使用 WinRT APIs 非常简单;大部分工作应该只是更改命名空间和程序集引用。