官方文档给出环境为Visual Studio 2017及以上;C#SDK为.NET4.8及以上
本文章环境介绍:
Visual Studio 2022;C#SDK为.NET6.0
语音转文字请移步:【C#语音文字互转】C#语音转文字(方法一)
一. 启动 Visual Studio 并创建控制台应用程序
1.1 首先在项目打开NuGet包管理工具下载System.Speech
。
1.2测试
下面为一个典型的输出示例
using System.Speech.Synthesis;
namespace KeepTalking
{class Program{static void Main(string[] args){var synthesizer = new SpeechSynthesizer();synthesizer.SetOutputToDefaultAudioDevice();synthesizer.Speak("支付宝到账一百万元");}}
}
注意,需要有音频输出设备。运行该示例即可听到语音输出。
二. 声音选择
2.1 列出可选语音
将下面代码放入SpeechSynthesizer实例化后
foreach (var voice in synthesizer.GetInstalledVoices())
{var info = voice.VoiceInfo;Console.WriteLine($"Id: {info.Id} | Name: {info.Name} | Age: { info.Age} | Gender: { info.Gender} | Culture: { info.Culture}");
}
运行后输出:
只有两个英语语音可用,这是windows默认自带语音,如何选择其他语音。
2.2 下载本地语音包
导航到“设置”|“时间和语言”|“语言和区域”,然后单击“添加语言”,确保在可选功能中选择“语音”。
下面以中文为例,其他语言可以点击添加语言。
2.3 手动设置声音输出
在代码中加入
synthesizer.SelectVoice("Microsoft Huihui Desktop");
三. 增强内容输入
3.1 SSMl简介
该TTS框架支持语音合成标记语言(SSML)的格式输入。SSML(Speech Synthesis Markup Language)是一种基于XML的标记语言,用于在文本到语音(TTS)系统中控制发音和语调等增强自然度。具体格式定义详见W3C SSML (www.w3.org/TR/speech-synthesis)。
常用SSML提升语音合成自然度的技巧:
- 适当的停顿:<break time=“1s”/> 标签可以用来在句子或短语之间添加适当的停顿。
- 控制语速:<prosody rate=“…”> 可以调整文本的朗读速度。rate 属性可以设置为更快或更慢的值。
- 调节音量:<prosody volume=“…”> 可以用来增加或减少特定文本段的音量。
- 调整音高:<prosody pitch=“…”> 可以用于调整文本段的音高。
- 强调重要词语:<emphasis> 标签可以用来强调文本中的某些词语或短语。
- 合适的语调:<say-as interpret-as=“…”> 可以用来指示语音合成引擎以特定的方式朗读文本,例如数字、日期、时间等。
- 朗读不同的角色:<voice name=“…”> 可以指定使用不同的声音类型来朗读文本,如男性或女性声音。
- 适当的标点符号:SSML支持标点符号的自然朗读,如问号(?)、感叹号(!)等。
- 控制段落和句子的朗读: <p> 用于段落,<s> 用于句子,这有助于语音合成引擎理解文本的结构。
- 使用电话区号和扩展:<phoneme alphabet=“…” ph=“…”> 可以指定精确的发音,特别是对于缩写或特殊术语。
- 使用子元素来细化控制:<sub alias=“…”> 可以用来定义一个别名,以便在文本中插入非标准单词或短语的特定发音。
- 利用描述来提供额外信息:<desc> 标签可以用来为合成器提供额外的上下文信息。
- 使用连接元素:<connect> 可以用来在文本中定义连读的点,这对于保持自然流畅的语音非常重要。
3.2 示例
using System.Reflection;
using System.Speech.Synthesis;
using System.Text.RegularExpressions;
namespace KeepTalking
{class Program{static void Main(string[] args){var synthesizer = new SpeechSynthesizer();var savedPrompt = new PromptBuilder();savedPrompt.AppendSsml("C:\\Users\\26366\\Desktop\\1.xml");synthesizer.Speak(savedPrompt);}}
}
其中1.xml
<?xml version="1.0" encoding="UTF-8"?>
<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3.org/2001/10/synthesis http://www.w3.org/TR/speech-synthesis11/synthesis.xsd" xml:lang="zh-cn"><p>静夜思</p><s>床前明月光,</s><s>疑是地上霜。</s><p>举头望明月,</p><s>低头思故乡。</s><!-- 添加适当的停顿 --><break time="1s"/><p>啊 !在这宁静的月光下,思绪飘向远方的<emphasis>家乡</emphasis>。</p>
</speak>
运行,即有语音输出。
参考
- https://learn.microsoft.com/zh-cn/archive/msdn-magazine/2019/june/speech-text-to-speech-synthesis-in-net
- https://www.cnblogs.com/fx_guo/archive/2011/01/14/1935388.html