基于 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/

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


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

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

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;

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

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

语音对应的 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

基于 Azure 的认知服务将文本合成语音相关推荐

  1. 微软 Azure人工智能认知服务打造语音提醒喝水助手(带源码和演示地址)

    目录 一.写在前面 二.创建认知服务资源 1. 创建语音服务 2. 创建文本服务 三.语音提醒助手 1. 文本转语音,提醒我喝水 2. 语音转文本,我也能做回应 3. 文本分析,得出喝水频率 4. 实 ...

  2. 【微软 Azure 认知服务】零基础搭建微软 Azure AI 认知服务实验分享

    Azure人工智能认知服务实验 Azure认知服务(语音合成产品系列)是微软云服务里面的明星产品,基于行业领先的Hifi-net语音模型打造,可以提供高质量神经网络版声音,发音更准确.韵律更自然.高保 ...

  3. 【0元试用微软 Azure人工智能认知服务】我做了个群聊天机器人

    前言 我这边参加了CSDN与微软Azure举办的0元试用微软Azure人工智能认知服务活动.第一次使用微软Azure 认知服务,老实说,还是满心期待的. 文章目录 前言 正式开始试用 环境 SDK的位 ...

  4. Azure人工智能认知服务(AI·机器学习)

    最近CSDN开展了<0元试用微软 Azure人工智能认知服务,精美礼品大放送>,当前目前活动还在继续,热心的我已经第一时间报名参与,只不过今天才有时间实际的试用. 目前我在试用了 语音转文 ...

  5. 【0元试用微软 Azure人工智能认知服务】这个人脸识别功能太强大啦

    导读:这个由美丽的客服小姐姐提前申请好了企业试用的账号,个人的话还得需要visa卡. 官网地址:azure.cn 登录地址:portal.azure.cn 目录 1.简介 2.Azure 认知服务是什 ...

  6. 基于Bluemix云平台的一个文本转语音应用

    林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:Text to Speech 服务提供的应用程序编程接口 (API) 使用 IBM 的语 ...

  7. 腾讯云---语音合成---一段文本合成语音

    一.导包 <!--腾讯云 语音识别 语音合成--><dependency><groupId>com.tencentcloudapi</groupId>& ...

  8. 使用Azure认知服务快速搭建一个目标检测平台

    文章目录 前言 1. 认知服务 2. 环境配置 2.1 创建资源 2.2 创建python环境 3. 代码实现 3.1 图片检测 3.2 视频检测 4. 检测效果 结束语 前言   博主参与了由CSD ...

  9. Azure认知服务之表单识别器

    认知服务 Azure 认知服务的目标是帮助开发人员创建可以看.听.说.理解甚至开始推理的应用程序.Azure 认知服务中的服务目录可分为五大主要支柱类别:视觉.语音.语言.Web 搜索和决策.开发人员 ...

最新文章

  1. 北京冬奥又曝黑科技:连气象主播都是AI虚拟人
  2. ACM Fellow发文抨击「同行评审」作弊:有「门道」的作者带飞,垃圾论文也能轻松中顶会...
  3. 行为模式之Iterator模式
  4. ggplot2设置坐标轴范围_ggplot2画图时出现重合的点以及标签如何处理?有现成的包ggrepel
  5. 前深度学习时代CTR预估模型的演化之路 [王喆观点]
  6. OpenSSL 编程 - RSA 加密解密
  7. 通过mod_limitipconn模块来限制apache的并发连接数
  8. 网页防篡改系统的使用体验
  9. 【爬虫】selenium动态页面请求与模拟登录知乎
  10. java库房仓库管理系统_Java学员作品-仓库管理系统
  11. 更改google桌面搜索的索引文件位置
  12. PTA - 数据库合集15
  13. 51单片机入门教程(2)——实现流水灯
  14. 从零开始学前端:查找替换+进度条+随机颜色+随机选择今日任务 --- 今天你学习了吗?(JS:Day18)
  15. 解决Visio中Mathtype公式插入Word或复制后变形
  16. Android4.4电池管理
  17. js实现图片放大预览(jq+css)
  18. [K210]Maixpy self learning classifier 自学习分类器
  19. iis php 缓存时间,推荐 IIS7.0下ThinkPHP提示“缓存文件写入失败!” 需要设置user的权限即可 Home/Runtime/Cache/...
  20. PSIM软件的数字控制官方例程

热门文章

  1. VS2013配置pro*C/C++开发环境
  2. View controller-based status bar
  3. conversion to dalvik format failed with error 1的解决办法
  4. 思科路由器由于IP INPUT进程导致cpu负荷高的判断方法
  5. c++ explicit关键字_聊一聊 C++的特性 explicit 匿名空间
  6. 我需要别人承认才快乐吗?
  7. 全向轮底盘磁导轨寻迹
  8. js控制图像等比例缩放
  9. Linux - 命令
  10. DEV-aspxgridview中的aspcheckbox