【C#语音文字互转】.NET的TTS文本转语音合成

官方文档给出环境为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>

运行,即有语音输出。

参考

  1. https://learn.microsoft.com/zh-cn/archive/msdn-magazine/2019/june/speech-text-to-speech-synthesis-in-net
  2. https://www.cnblogs.com/fx_guo/archive/2011/01/14/1935388.html
  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值