C# 使用 SpeechSynthesizer 类将文本转换为语音
简介
SpeechSynthesizer 是 .NET Framework 和 .NET Core/5+ 中用于文本到语音(Text-to-Speech, TTS)转换的类。它属于 System.Speech.Synthesis 命名空间,主要用于将文本转换为语音并播放或保存为音频文件。
SpeechSynthesizer 的主要功能
- 文本到语音转换:
- 将文本转换为语音并播放。
- 支持多种语言和语音库。
- 语音库管理:
- 获取系统上安装的语音库。
- 选择特定的语音库进行语音合成。
- 语音控制:
- 调整语速、音量和音调。
- 支持暂停、恢复和停止语音播放。
- 音频输出:
- 将合成的语音保存为音频文件(如 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 进行文本到语音转换:
代码语言:javascript代码运行次数:0运行复制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 的简单封装示例:
代码语言:javascript代码运行次数:0运行复制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 的高级用法
异步语音播放
使用 SpeakAsync 方法可以异步播放语音,避免阻塞主线程。
代码语言:javascript代码运行次数:0运行复制synthesizer.SpeakAsync("This is an asynchronous speech.");
处理语音事件
SpeechSynthesizer 提供了多个事件,可以用于监控语音播放状态。
代码语言:javascript代码运行次数:0运行复制synthesizer.SpeakStarted += (sender, e) => Console.WriteLine("语音播放开始");
synthesizer.SpeakCompleted += (sender, e) => Console.WriteLine("语音播放完成");
synthesizer.SpeakProgress += (sender, e) => Console.WriteLine($"正在播放: {e.Text}");
选择特定语言的语音库
可以通过 VoiceInfo.Culture 属性选择特定语言的语音库。
代码语言:javascript代码运行次数:0运行复制foreach (var voice in synthesizer.GetInstalledVoices())
{
if (voice.VoiceInfo.Culture.Name == "en-US")
{
synthesizer.SelectVoice(voice.VoiceInfo.Name);
break;
}
}
调整语音参数
通过 PromptBuilder 类可以更灵活地调整语音参数。
代码语言:javascript代码运行次数:0运行复制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 的局限性
- 平台限制:
- System.Speech.Synthesis 仅适用于 Windows 平台。
- 在 .NET Core 或 .NET 5+ 中,需要使用兼容库或第三方 TTS 库。
- 语音库依赖:
- 需要系统上安装相应的语音库(如 Microsoft David Desktop 或 Microsoft Zira Desktop)。
- 功能限制:
- 不支持高级语音合成功能(如情感语音或自定义发音)。
总结
SpeechSynthesizer 是一个简单易用的文本到语音转换工具,适用于 Windows 平台上的 .NET 应用程序。它支持多种语音库、语音控制和音频输出功能,适合用于语音提示、语音助手等场景
发布评论