【CSharp】使用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
进行文本到语音转换:
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 的局限性
平台限制:
System.Speech.Synthesis
仅适用于 Windows 平台。在 .NET Core 或 .NET 5+ 中,需要使用兼容库或第三方 TTS 库。
语音库依赖:
需要系统上安装相应的语音库(如 Microsoft David Desktop 或 Microsoft Zira Desktop)。
功能限制:
不支持高级语音合成功能(如情感语音或自定义发音)。
总结
SpeechSynthesizer
是一个简单易用的文本到语音转换工具,适用于 Windows 平台上的 .NET 应用程序。它支持多种语音库、语音控制和音频输出功能,适合用于语音提示、语音助手等场景。
- 感谢你赐予我前进的力量