基于 Azure 的认知服务将文本合成语音

基于 Azure 的认知服务将文本合成语音

Intro

前几天发了一个 .NET 20 周年祝福视频,语音是通过 Azure 的认知服务合成的,

下面就来介绍一下如何将使用 Azure 的认识服务实现将文本合成为语音

Prepare

你可以在 Azure Portal 上创建一个免费的语音服务,搜索 Speech 即可,在创建的时候可以 Pricing tier 可以选择 Free F0 就是对应的免费版本,免费版有调用次数限制,但是对于测试应该足够了,详细可以参考:

https://azure.microsoft.com/zh-cn/pricing/details/cognitive-services/speech-services/

44c9ded9eb227478bb3401536c9e15f3.png

在创建成功之后可以在对应的资源界面中 “密钥和终结点” 页面里找到调用 API 需要的密钥

d898ab5574211d46d492e93775bc0e35.png


微软的语音服务支持很多不同的语言,不同的语音类型,我们可以根据需要进行选择,你可以在这个页面试用,来选择合适的语音

https://azure.microsoft.com/zh-cn/services/cognitive-services/text-to-speech/#features

7268ab9194ebe9818f7bef6060594393.png

Sample

首先我们需要使用到语音服务的 SDK ,引用 NuGet 包Microsoft.CognitiveServices.Speech

文本合成语音首先需要指定一个语音类型,语音类型是分语言的,我们可以指定语言直接合成:

const string locale = "zh-CN";
// 将 key 直接替换为自己的密钥或者设置环境变量值为自己的密钥
var key = Environment.GetEnvironmentVariable("SpeechSubscriptionKey");
var config = SpeechConfig.FromSubscription(key, "eastasia");// 支持的语言列表:https://docs.microsoft.com/en-us/azure/cognitive-services/speech-service/language-support
config.SpeechSynthesisLanguage = locale;using var synthesizer = new SpeechSynthesizer(config);
await synthesizer.SpeakTextAsync(text);

除了指定的语言,我们也可以指定语言对应的语音类型,可以通过 SDK 获取指定语言的语音类型,支持的语言列表可以参考:https://docs.microsoft.com/en-us/azure/cognitive-services/speech-service/language-support

// Creates a speech synthesizer
using var synthesizer = new SpeechSynthesizer(config);
using var voicesResult = await synthesizer.GetVoicesAsync(locale);
var voices = voicesResult.Voices;

1baecd2edb523907be92708fe9953825.png

每个语音类型支持不同的语音风格

8124f17f101a14836fa93f63b7b096e9.png

可以在微软的线上示例 https://azure.microsoft.com/zh-cn/services/cognitive-services/text-to-speech/#features 尝试不同的语音类型,选择合适的语音类型,然后就可以进行下一步的语音合成

27d316670bae00caf30c49fb3daf7cfc.png

语音对应的 value 就是对应的语音类型,配置 config 的 SpeechSynthesisVoiceName,也可以使用上面获取到的语音对应的 ShortName

var text = @".NET 20 周年生日快乐";
var voiceName = "zh-CN-XiaoxiaoNeural";config.SpeechSynthesisVoiceName = voiceName;
using var speechSynthesizer = new SpeechSynthesizer(config);
await speechSynthesizer.SpeakTextAsync(text);

我们可以使用多种方式进行合成语音,前面使用是默认方式,默认方式语音会直接通过本地的麦克风直接播放

我们也可以输出语音到指定文件,示例如下:

var text = @".NET 20 周年生日快乐";
var voiceName = voices[0].ShortName;
config.SpeechSynthesisVoiceName = voiceName;
var outputFileName = $"output-{voice.ShortName}.wav";
using (var output = AudioConfig.FromWavFileOutput(outputFileName))
{using var speechSynthesizer = new SpeechSynthesizer(config, output);using var speechSynthesisResult = await speechSynthesizer.SpeakTextAsync(text);Console.WriteLine($"Result: {speechSynthesisResult.Reason}");
}

除此之外我们还可以输出到一个数据流中,我们可以使用 AuditDataStream 来实现:

using var streamSynthesizer = new SpeechSynthesizer(config, null);
var streamResult = await streamSynthesizer.SpeakTextAsync(text);
using var audioDataStream = AudioDataStream.FromResult(streamResult);// SaveToFile
//await audioDataStream.SaveToWaveFileAsync(outputFileName);// Reads data from the stream
using var ms = new MemoryStream();
var buffer = new byte[32000];
uint filledSize;
while ((filledSize = audioDataStream.ReadData(buffer)) > 0)
{ms.Write(buffer, 0, (int)filledSize);
}
Console.WriteLine($"Totally {ms.Length} bytes received.");

除了前面之前使用一段文本,我们还可以使用 SSML 来定制语音

语音合成标记语言 (SSML) 是一种基于 XML 的标记语言,可让开发人员指定如何使用文本转语音服务将输入文本转换为合成语音。与纯文本相比,SSML 可让开发人员微调音节、发音、语速、音量以及文本转语音输出的其他属性。SSML 可自动处理正常的停顿(例如,在句号后面暂停片刻),或者在以问号结尾的句子中使用正确的音调。

使用 SSML 时请注意,特殊字符必须要转义

var ssml = $@"<speak xmlns=""http://www.w3.org/2001/10/synthesis"" xmlns:mstts=""http://www.w3.org/2001/mstts"" xmlns:emo=""http://www.w3.org/2009/10/emotionml"" version=""1.0"" xml:lang=""en-US""><voice name=""zh-CN-XiaoxiaoNeural""><prosody rate=""0%"" pitch=""50%"">{text}</prosody></voice></speak>";
using var ssmlSynthesisResult = await synthesizer.SpeakSsmlAsync(ssml);
Console.WriteLine($"Result: {ssmlSynthesisResult.Reason}");

可以通过 <voice name="zh-CN-XiaoxiaoNeural">测试</voice> 来指定某一段文本要使用的语音类型,不同的文本可以使用不同的语音类型,语音可以通过 style 来配置,支持的 style 需要从前面的语音支持的 StyleList 中获取,如:

<voice name="zh-CN-XiaoxiaoNeural"><mstts:express-as style="cheerful">你可将此文本替换为所需的任何文本。你可在此文本框中编写或在此处粘贴你自己的文本</mstts:express-as>
</voice>

也可以配置语音的语速和音调,如下面的 prosody 中的 rate 就是语速,0是正常语速,rate="10%" 就是加快 10%,pitch 是音调的控制,pitch="10%" 就是音调提高 10%

<speakxmlns="http://www.w3.org/2001/10/synthesis"xmlns:mstts="http://www.w3.org/2001/mstts"xmlns:emo="http://www.w3.org/2009/10/emotionml" version="1.0" xml:lang="en-US"><voice name="zh-CN-XiaoxiaoNeural"><mstts:express-as style="cheerful" ><prosody rate="10%" pitch="10%">你可将此文本替换为所需的任何文本。你可在此文本框中编写或在此处粘贴你自己的文本。</prosody></mstts:express-as></voice>
</speak>

使用 SSML 生成语音示例如下:

var ssml = $@"<speak xmlns=""http://www.w3.org/2001/10/synthesis"" xmlns:mstts=""http://www.w3.org/2001/mstts"" xmlns:emo=""http://www.w3.org/2009/10/emotionml"" version=""1.0"" xml:lang=""en-US""><voice name=""zh-CN-XiaoxiaoNeural""><prosody rate=""0%"" pitch=""50%"">{text}</prosody></voice></speak>";
using var ssmlSynthesisResult = await synthesizer.SpeakSsmlAsync(ssml);
Console.WriteLine($"Result: {ssmlSynthesisResult.Reason}");

More

一般的我们基本可以使用普通的文本合成语音,如果要实现高级的语音服务,可以尝试一下 SSML 用法

使用 SSML 时,SSML 里定义的语音类型优先级最高,不会被 config 中的语音类型覆盖

更多用法可以自己再去发掘一下~~

References

  • https://azure.microsoft.com/zh-cn/services/cognitive-services/text-to-speech/

  • https://docs.microsoft.com/en-us/azure/cognitive-services/speech-service/language-support

  • https://github.com/WeihanLi/SamplesInPractice/blob/master/AzureSamples/SpeechSample/Program.cs

  • https://docs.microsoft.com/en-us/azure/cognitive-services/speech-service/language-support

  • https://docs.microsoft.com/zh-cn/azure/cognitive-services/speech-service/speech-synthesis-markup?tabs=csharp

  • https://github.com/Azure-Samples/cognitive-services-speech-sdk

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/291287.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sql查询结果集根据指定条件排序的方法

oracle认为 null 最大。 升序排列&#xff0c;默认情况下&#xff0c;null值排后面。 降序排序&#xff0c;默认情况下&#xff0c;null值排前面。 有几种办法改变这种情况&#xff1a; &#xff08;1&#xff09;用 nvl 函数或decode 函数 将null转换为一特定值 &#xff08;2…

mysql怎么改字体编码_mysql怎么改字符编码?

mysql命令行修改字符编码1、修改数据库字符编码mysql> alter database mydb character set utf8 ;2、创建数据库时&#xff0c;指定数据库的字符编码mysql> create database mydb character set utf8 ;3、查看mysql数据库的字符编码mysql> show variables like charac…

如何编译 dotnet/runtime 源代码

前言最近&#xff0c;准备为 dotnet/runtime 修改 issue&#xff0c;但是在 clone 代码后&#xff0c;发现要编译成功&#xff0c;远没有想象中那么容易。因此&#xff0c;将整个过程进行记录&#xff0c;以供大家参考。以下操作都是在 Windows 10 下完成。0.环境准备详见官方文…

jenkins maven testng selenium自动化持续集成

准备环境 首先我们新建一个maven的工程&#xff0c;并且在pom.xml中配置好我们依赖的一些jar包 <dependencies><dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>2.46.0<…

java程序 开发工具_15款Java程序员必备的开发工具

如果你是一名Web开发人员&#xff0c;那么用膝盖想也知道你的职业生涯大部分将使用Java而度过。这是一款商业级的编程语言&#xff0c;我们没有办法不接触它。对于Java&#xff0c;有两种截然不同的观点&#xff1a;一种认为Java是最简单功能***大的编程语言之一&#xff0c;另…

SQLite编译问题

从http://www.sqlite.org/主页上获得了SQLite的源文件&#xff0c;还没有时间研究就在编译上发生了不小的问题。 首先是碰到是&#xff0c;编译之后&#xff0c;只产生了sqlite3.dll文件&#xff0c;不产生对应的lib库文件。 查看了下sqlite3.h代码&#xff0c;发现了SQLITE_AP…

mysql的调试与分析_mysql日志管理分析调试实例_MySQL

以下的文章主要介绍的是MySQL 操作日志查看的实际操作步骤以及对其实际操作步骤的具体描述&#xff0c;假如你在实际操作中遇到相似的情况&#xff0c;但是你却不知道对其如何正确的解决&#xff0c;那么以下的文章对你而言一定是良师益友。刚接触MySQL不久&#xff0c;发现缺少…

.NET 7 预览版 1 发布

宣布 .NET 7 预览版 1Jeremy 2022 年 2 月 17 日今天&#xff0c;我们很高兴地宣布 .NET 历史上的下一个里程碑。在庆祝社区和 20 年创新的同时&#xff0c;.NET 7 Preview 1 标志着迈向 .NET 下一个 20 年的第一步。ASP.NET Core Preview 1 和 EF7 Preview 1 也在今天发布。.N…

你一写长文章就焦虑拖延?

这是病&#xff0c;得治。 症状 每年春季学期&#xff0c;总会有一些人很烦躁。 别人晒朋友圈&#xff0c;他留言说不中听的话&#xff1b;你见他突然妄自菲薄&#xff0c;开导劝慰他&#xff0c;却被辩驳甚至骂一通&#xff1b;一点儿小事儿&#xff0c;都能激起他胸中的愤怒&…

5.7.21mysql数据库_【数据库】mysql5.7.21 winx64安装配置图文分享

本文主要为大家详细介绍了mysql 5.7.21 winx64安装配置方法图文教程&#xff0c;具有一定的参考价值&#xff0c;感兴趣的小伙伴们可以参考一下&#xff0c;希望能帮助到大家。1、将下载好的mysql压缩包解压到安装目录下2、新建文件my.ini&#xff0c;放置到mysql安装目录下&am…

.NET7的七项重大改进!

.NET 7 Preview1发布了&#xff0c;没时间实操&#xff1f;先快来看看.NET7的七项重大改进&#xff01;1、不再支持.NET 7应用程序、运行时和SDK的多级查找&#xff08;MLL&#xff09;2、PATH停止向.NET 7运行时和SDK添加32位.NET3、默认情况下&#xff0c; dotnet build/publ…

Spring Boot 入门小目标 3 --- 先来试着热部署

2019独角兽企业重金招聘Python工程师标准>>> Spring Boot 入门小目标---先来试着热部署 这次写的主要就是 使用 springloaded 来实现 热部署。 很多时候&#xff0c;我们在修改和添加了新的方法或代码&#xff0c;都需要重启服务器。这样很麻烦&#xff0c;而且 不合…

基于事件驱动架构构建微服务第19部分:使用 SignalR 和 Azure Active Directory 构建和保护实时通信...

原文链接&#xff1a;https://logcorner.com/building-micro-services-through-event-driven-architecture-part19-building-and-securing-real-time-communications-using-signalr-and-azure-active-directory/命令 HTTP API 将事件存储到事件存储&#xff0c;但不直接将它们发…

Orchard之生成新模板

一&#xff1a;启用 Code Generation 进入后台&#xff0c; Modules –> Developer Enable 之。 二&#xff1a;生成模版 首先&#xff0c;进入 Orchard 命令行 在 CMD 下到达解决方案的 Web 的 Bin 目录下&#xff0c;打开 Orchard 命令&#xff0c;输入&#xff1a; code…

Java设计模式-状态模式(State)

核心思想就是&#xff1a;当对象的状态改变时&#xff0c;同时改变其行为&#xff0c;很好理解&#xff01;就拿QQ来说&#xff0c;有几种状态&#xff0c;在线、隐身、忙碌等&#xff0c;每个状态对应不同的操作&#xff0c;而且你的好友也能看到你的状态&#xff0c;所以&…

基于Prometheus的.NET 4.x应用服务监控

【.NET监控】| 总结/Edison Zhou0Why 监控&#xff1f;Edison所在团队95%以上的应用都是基于.NET 4.5开发的&#xff0c;只能跑在Windows Server服务器上的IIS中&#xff0c;公司运维也没有意愿对Windows Server进行有效的管理和提供监控支持&#xff0c;整得我们无法及时查看有…

高效沟通的7C原则

2019独角兽企业重金招聘Python工程师标准>>> 怎样确保沟通的顺畅和高效性呢&#xff1f;成功人士已经总结了很多方法&#xff0c;七项基本原则是一种基本的方法&#xff0c;起到了检查列表的作用&#xff0c;在你发送信息之前&#xff0c;对照检查可以帮助你确认信息…

WTMPlus 1.4 Uniapp来了

点击上方蓝字关注我们1.4版本长期以来&#xff0c;WTM都是后台管理系统的开发利器&#xff0c;对于移动端支持的不够。这次WTMPlus 1.4我们加入了对UniApp的支持&#xff0c;你可以轻松的使用WTMPlus同时制作后台管理系统和各种移动端小程序了。前后台模式切换用户现在可以自由…

php真随机数,php 的伪随机数与真随机数实例详解

这篇文章主要介绍了PHP的伪随机数与真随机数详解,本文首先讲解了真随机数和伪随机数的相关概念,并给出了比用mt_rand()函数产生更好的伪随机数的一段例子代码,需要的朋友可以参考下首先需要声明的是&#xff0c;计算机不会产生绝对随机的随机数&#xff0c;计算机只能产生“伪随…

C#中的表达式和运算符

欢迎您成为我的读者&#xff0c;希望这篇文章能给你一些帮助。前言今天和大家一起学习下C#中的表达式和运算符&#xff0c;都是很基础的知识点。在日常的编码过程中&#xff0c;对于表达式和运算符我们每天都在使用。比如像下面的代码int age27;就是一种表达式。运算符是一个符…