简介

SpeechSynthesizer​ 是 .NET Framework 和 .NET Core/5+ 中用于文本到语音(Text-to-Speech, TTS)转换的类。它属于 System.Speech.Synthesis​ 命名空间,主要用于将文本转换为语音并播放或保存为音频文件。

SpeechSynthesizer 的主要功能

  1. 文本到语音转换

    • 将文本转换为语音并播放。

    • 支持多种语言和语音库。

  2. 语音库管理

    • 获取系统上安装的语音库。

    • 选择特定的语音库进行语音合成。

  3. 语音控制

    • 调整语速、音量和音调。

    • 支持暂停、恢复和停止语音播放。

  4. 音频输出

    • 将合成的语音保存为音频文件(如 WAV 文件)。

    • 支持直接播放到音频设备。

SpeechSynthesizer 的常用属性和方法

常用属性

  • Voice​:获取或设置当前使用的语音库。

  • Rate​:获取或设置语速(范围:-10 到 10)。

  • Volume​:获取或设置音量(范围:0 到 100)。

  • State​:获取语音合成器的当前状态(如 Speaking​、Paused​、Ready​)。

常用方法

  • ​Speak(string text)​:同步播放指定的文本。

  • ​SpeakAsync(string text)​:异步播放指定的文本。

  • Pause()​:暂停语音播放。

  • ​Resume()​:恢复语音播放。

  • ​Stop()​:停止语音播放。

  • ​SetOutputToWaveFile(string path)​:将语音输出保存为 WAV 文件。

  • SetOutputToDefaultAudioDevice()​:将语音输出到默认音频设备。

  • GetInstalledVoices()​:获取系统上安装的语音库列表。

SpeechSynthesizer 的基本用法

以下是一个简单的示例,展示如何使用 SpeechSynthesizer​ 进行文本到语音转换:

using System;
using System.Speech.Synthesis;

class Program
{
    static void Main()
    {
        // 创建 SpeechSynthesizer 实例
        using (SpeechSynthesizer synthesizer = new SpeechSynthesizer())
        {
            // 设置语音输出到默认音频设备
            synthesizer.SetOutputToDefaultAudioDevice();

            // 获取系统上安装的语音库
            foreach (var voice in synthesizer.GetInstalledVoices())
            {
                Console.WriteLine("语音库: " + voice.VoiceInfo.Name);
            }

            // 设置语音库(例如 Microsoft David Desktop)
            synthesizer.SelectVoice("Microsoft David Desktop");

            // 设置语速和音量
            synthesizer.Rate = 2;  // 语速(-10 到 10)
            synthesizer.Volume = 80; // 音量(0 到 100)

            // 播放文本
            synthesizer.Speak("Hello, welcome to the world of text-to-speech!");

            // 将语音保存为 WAV 文件
            synthesizer.SetOutputToWaveFile("output.wav");
            synthesizer.Speak("This text will be saved to a file.");
        }
    }
}

以下是对 SpeechSynthesizer​ 的简单封装示例:

using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Speech.Synthesis;

namespace UtilityClass
{
    public class VoiceUtil
    {
        public static string SelectVoice = "";
        private static readonly SpeechSynthesizer synthesizer;

        static VoiceUtil()
        {
            synthesizer = new SpeechSynthesizer();
            synthesizer.SetOutputToDefaultAudioDevice();
        }

        /// <summary> 取消所有排队、异步语音合成操作 </summary>
        public static void CancelAll()
        {
            if (synthesizer.State == SynthesizerState.Speaking)
                synthesizer.SpeakAsyncCancelAll();
        }

        /// <summary> 文本转音频输出 </summary>
        /// <param name="text"> </param>
        /// <remarks> 异步方式 </remarks>
        public static void ConvertTextToSpeechAsync(string text)
        {
            CancelAll();
            if (!string.IsNullOrEmpty(SelectVoice) && GetInstalledVoices().Contains(SelectVoice))
                synthesizer.SelectVoice(SelectVoice);
            if (!string.IsNullOrEmpty(text))
                synthesizer.SpeakAsync(text);
        }

        /// <summary> 获取系统语音库 </summary>
        /// <returns> </returns>
        public static List<string> GetInstalledVoices()
        {
            ReadOnlyCollection<InstalledVoice> list = synthesizer.GetInstalledVoices();
            List<string> voices = new List<string>();
            foreach (var item in list)
            {
                if (item.Enabled && item.VoiceInfo.Culture.Name == "zh-CN")
                    voices.Add(item.VoiceInfo.Name);
            }
            return voices;
        }
    }
}

SpeechSynthesizer 的高级用法

1. 异步语音播放

使用 SpeakAsync​ 方法可以异步播放语音,避免阻塞主线程。

synthesizer.SpeakAsync("This is an asynchronous speech.");

2. 处理语音事件

SpeechSynthesizer​ 提供了多个事件,可以用于监控语音播放状态。

synthesizer.SpeakStarted += (sender, e) => Console.WriteLine("语音播放开始");
synthesizer.SpeakCompleted += (sender, e) => Console.WriteLine("语音播放完成");
synthesizer.SpeakProgress += (sender, e) => Console.WriteLine($"正在播放: {e.Text}");

3. 选择特定语言的语音库

可以通过 VoiceInfo.Culture​ 属性选择特定语言的语音库。

foreach (var voice in synthesizer.GetInstalledVoices())
{
    if (voice.VoiceInfo.Culture.Name == "en-US")
    {
        synthesizer.SelectVoice(voice.VoiceInfo.Name);
        break;
    }
}

4. 调整语音参数

通过 PromptBuilder​ 类可以更灵活地调整语音参数。

PromptBuilder builder = new PromptBuilder();
builder.StartStyle(new PromptStyle()
{
    Rate = PromptRate.Slow,
    Volume = PromptVolume.ExtraLoud
});
builder.AppendText("This text is spoken slowly and loudly.");
builder.EndStyle();
synthesizer.Speak(builder);

SpeechSynthesizer 的局限性

  1. 平台限制:

    • ​System.Speech.Synthesis​ 仅适用于 Windows 平台。

    • 在 .NET Core 或 .NET 5+ 中,需要使用兼容库或第三方 TTS 库。

  2. 语音库依赖:

    • 需要系统上安装相应的语音库(如 Microsoft David Desktop 或 Microsoft Zira Desktop)。

  3. 功能限制:

    • 不支持高级语音合成功能(如情感语音或自定义发音)。

总结

SpeechSynthesizer​ 是一个简单易用的文本到语音转换工具,适用于 Windows 平台上的 .NET 应用程序。它支持多种语音库、语音控制和音频输出功能,适合用于语音提示、语音助手等场景。