在微软云平台Azure上创建个性化的语音(TTS)服务

------------------- 这部分是废话,不想看就跳过吧 -------------------

最近一直在研究TTS语音包,老阿姨近视越来越严重,看字儿太废眼,还是听书比较适合老年人。小居老师的榜样阅读着实把我苏到了,就萌生了个想法,把居老师的声音做成TTS语音包。最开始当然是奔着科大讯飞去的,毕竟手机里听书软件的TTS包都是下的他家的,结果发现自己想多了,科大家走的高端路线,得请明星们去棚里专门录音,不是俺们这种小老百姓可以肖想的 T_T

科大讯飞个性音库定制解决方案


一番寻觅后,发现微软家最近刚上线了个好玩的东东——Custom Voice。

微软个性音库定制解决方案


按照描述,提供2小时以上的音源,可以做个POC,声音会比较生硬和机械化;3小时以上能实现标准化的声音;如果提供8小时以上的音源,就可以接近真人发音了。感觉很酷啊,这不就是我要的么?虽然不能弄成离线的TTS包,不过能在线合成也不错啦,于是撸袖子开干。

微软个性化语音简介

准备音源真是个大工程!居老师演的片子虽多,但是用原声的并不多,而且他不同片子里的声线居然会变,会变,变……不知道声线不统一对最后的合成效果影响大不大。更更更要命的是,背景音乐和噪音混在里面,想分离出低噪音无背景音乐的句子真心困难,好怨念 T_T

https://www.zhihu.com/video/1109754690350407680

随着音频素材的增加,能感觉到发音效果有了明显的提高。从最开始机械的电子音,到可以听出声调的起伏变化,字词也相对清晰可辨了。不过还是和居老师奶萌又磁性的声音差了好远,而且整个深度学习的时间也从最几分钟拉长到了几个小时。官方给出的说明是提供2-3小时的音频素材勉强可用,8小时以上音频素材才可以接近真人发音,感觉这个工程之浩大,已经超出了本阿姨目前的承受范围了,只能慢慢弄了。

-----------------------补视频演示---------------------





----------------------------- 我是干货分隔线 -------------------------

下面进入正题,一步步演示如何创建个性化的TTS语音。

一. 创建一个微软的 Azure account

微软的TTS语音服务需要部署在他家的云平台 Azure上(孤陋寡闻了,第一次听说微软家还有这个),因此需要创建一个帐号,另外要准备一张能支付美元的信用卡,新注册的用户会赠送 $200 (别做梦了,不是真的钱啦,只能在Azure上买服务,并且有效期只有30天,所以音频没有准备好之前不要轻易开账户,我开了账户后过了一个多月才开始使用,当初送的200刀就木有了T_T)。

注册地址是: 注册主界面


点击 “Start free”后会打开一个新窗口让登录或者是注册:

点击 "Create One!"

输入邮箱作为用户名

输入密码

输入发送到注册邮箱里的验证码

输入防机器人码

注册好了,提示登录

填一下注册信息

短信验证一下

输入信用卡信息

勾选同意

这里提示要订购一个服务

自己用,当然选第四个免费的

终于注册好啦,点“Sign up”后进入Microsoft Azure 控制台


二. 开启TTS语音服务


进入控制台后,就可以开启TTS语音服务了

点击左上角的“Create a resource”

在搜索框中输入 “speech”

点击 speech 选项

点击创建按钮

输入TTS语音服务所需要的信息:

  1. 服务的名字
  2. 服务的类型(Pay-As-You-Go: 用多少付多少)
  3. 服务的区域 (因为是中文,选东亚 East Asia)
  4. 服务的级别 (免费的选 F0,付费的选S0)
  5. 给资源起个名字

点“OK“,然后点屏幕下方的 ”Create“按钮,等几秒钟初始化

初始化好了之后,右上角的会提示部署完成,点击 "Pin to Dashboard"创建一个控制台快捷方式,点击 ”Go to resource“,可以进入资源页面

获取 key,将生成的 key复制保存到记事本中

将key导入到个性化TTS定制服务中,首先进入导入页面: 导入页面

点击 ”Connect existing subscription“, 然后将刚才复制的key粘贴到窗口中

点击 ”Add“,然后进入项目管理页面: 项目管理页面

点击”data“,就可以上传供微软进行 神经网络深度学习 (写在这里装B,菜鸡表示不明觉厉,听起来好高大上的赶脚啊)的语音材料了

点击 ”Import Data“

输入语音材料的基本信息,点击”Import“


三. 语音及文本材料的注意事项


上传的 语音文件 要打成一个压缩包,语音材料的标准如下:


文件内容 单句或短语,必须是同一种语言,不支持多语言混杂

文件格式 wav

采样频率 至少16000 Hz,低于此采样率,系统拒绝接受 (推荐 44100 Hz)

采样格式 PCM, 16 bit

文件名 数字加上wav后缀,如 00000000001.wav,文件名需唯一

压缩包格式 .zip

压缩包大小 :单个压缩包 不超过 200 MB,可上传多个压缩包,屌丝免费用户最多传10个,氪金大佬可以传50个


文本文件 需采用 UTF-8 的编码(注意一定要转成此编码,文本编辑器多半默认的编码是ASCII码,可以用记事本打开编辑好的文本文件,然后点击另存为,转换成UTF-8)。

文本文件的内容为文件名编码和语音内容的组合,一行一句,二者需一一对应,文件名编码和内容之间用 tab 键分隔(注意,不是空格!不是空格!不是空格!我开始打的空格,七百多个文件好不容易传完,结果检验失败,哭死),其样式如下:

00000000001 大家好

00000000002 很高兴见到你

00000000003 八十(不建议用80)

00000000004 下午三点(不建议用“下午3点”)

00000000005 你吃饭了吗 (不建议带标点符号?)

00000000006 下午五点的航班 (不建议用 “下午 5:00的航班”)

夹带私货推荐两个工具:

  1. 视频转换及音频提取工具 ffmpeg

安装后配置环境变量,可以通过命令行直接提取视频中的音频文件,速度飞快,8个G的视频十几分钟搞定

C:\> ffmpeg -i 00001.flv -acodec copy -vn 00001.aac

2. 音频加工工具 Audacity

开源,插件多,网上教程多,基本满足需求


四. 上传音频并开始学习

准备好语音材料及文本文件并上传后,就可以让微软开始学习啦。

填写音频和文本文件的基本信息:名字,描述,语言选择(zh-CN为简体中文),性别,文本文件路径,音频文件压缩包路径

需要一点耐心,要传一阵子。在上传的过程中系统会自动检验文本文件和音频文件的格式,为了防止花很长时间上传大文件结果检验失败的情况发生,可以先传几个小文件试试,允许多次上传。

status 那一项显示的是当前文件的处理状态:

  • NotStarted : 表示文件已上传,目前正在队列中等待处理
  • Running : 表示文件已经被验证了,正在处理
  • Succeeded : 表示处理成功

Utterance 那一项显示的是文本内容和音频文件成功匹配的数量,比如音频压缩包中包含10个音频文件,结果只有7个文件和文本文件的内容能对应上,此数值就会显示为7。匹配数量越多越好

Report 那一项显示的是上传文件的质量评估报告,可以下载下来,其具体含义如下:

  • WaveID : 音频文件名编码
  • ProunciationScore : 发音准确度,100分为满分,低于70分说明有发音错误或不标准的地方,此项也会受音频质量以及噪音程度的影响
  • SnrScore : 音频噪音程度,分数越高说明噪音越低,专业录音棚可以达到50+,低于20分最终结果中也会听到明显的噪音。
  • ImportStatus :文件导入结果
  • Note : 备注

上传完成后,可以开始创建个性化的语音了: 创建语音

点击 “Create New”按钮

选择已上传的文件(可多选),输入相应的信息,然后点击“Create”按钮,系统会自动跳转到我的语音页面。

此页面上的 status 项显示了当前个性化语音的创建状态:

NotStarted 表示创建语音的请求正在队列中等待

Running 表示语音正在被创建

Succeeded 表示语音创建成功

在出现 Succeeded 之前请耐心等待,创建(传说中的神经网络深度学习)过程会根据上传的文件数量和体积有所不同,几百个utterances大概耗时几个小时;20000以上utterances的训练时间将达到40小时以上(干别的事去吧,不用一直在线盯着它看)。

当出现Succeeded后,可以点击"Test"按钮已检验效果(可多次检验)。

点击“New Testing”按钮。



如果选择的是 Plain text,则在文本框中输入普通文本;如果选择SSML,则需要输入xml格式的文本。点击“Confirm“,文本的长度限制为1024个字符。

在出现页面中,status项会显示当前测试的状态:

  • NotStarted 表示待处理
  • Running 表示正在处理
  • Succeeded 表示处理成功

当处理成功后,可以点击“Audio output”项中的“Download”链接下载刚刚生成的语音文件

点击左上角的左箭头回到之前的页面,如果对当前生成的语音满意,可以点击“Deploy”按钮部署该语音到Azure云平台上。


----------------------- 我是选修课分割线 ---------------------

五. 创建个性化语音的API (Endpoint)

如果想实时调用自己创建的个性化语音,比如智能语音设备的交互功能,或者是手机APP的交互功能,就需要将它部署到Azure云平台,并为其创建Endpoint。具体操作方法如下:


回到我的声音主界面,点击“Deploy”按钮,然后输入语音服务的名字和描述。点击“Create”按钮后页面会自动跳转到“Endpoint”页。

Status 项出现 Succeeded ,表示部署成功。此时需要记下刚刚生成的 endpoint URL。 下面开始测试这个endpoint,点击“Test”按钮。

输入要测试的文本(100字符以内),点击播放按钮,即可以听到刚才创建的个性化语音了。

六. 调用个性化语音服务的API (Endpoint)

如果想把比较大的纯文本文件转换成语音文件,并保存下来,或者是在智能设备上在线使用,就需要调用刚刚创建好的个性化语音服务的API了。如果你是苦逼码农就不多解释了,自己去微软家的github上趴拉源代码吧: TTS调用源代码

如果是 IT 小白,也没兴趣研究代码,可以去下我修改打包好的程序 (JAVA 菜鸡后端,表示不会前端和UI,只能弄个 jar 出来,前端高手们可以自己写个酷炫的UI界面)。

下载链接: 百度盘地址 提取码: j8S1

如果要运行这个jar,需要先安装配置 jdk,安装配置 jdk 的过程很简单,网上随便搜一下就能找到大把教程,这里给个参考: JDK的安装配置方法

简单介绍一下步骤:

  1. 双击运行 jdk 的安装文件
  2. 安装完成后找到jdk所在的路径,复制这个路径
  3. 控制面板 --> 系统 --> 高级系统设置 --> 环境变量

选择“系统变量”区域的“新建”功能, 在”变量名“处填写: JAVA_HOME,在”变量值“处填写刚才复制的路径。


打开“系统变量”区域的 Path ,将这条语句 ;%JAVA_HOME%\bin 追加到 Path 变量值的最后面

验证一下安装配置是否成功,可以点击”开始“,然后敲 cmd 打开命令行窗口,输入 java 回车,如果出现用法介绍的页面,就说明安装成功了


jdk 安装配置完成后,就可以开始运行 jar 文件来转换文本文件了:

  1. 找到下载的 jar 所在的文件夹,将要转换的文本文件也放在同一个文件夹中,注意,文本文件需保存为UTF-8编码。

2.在此文件夹空白处按住 Shift 键的同时点击鼠标右键,点击 ”在此处打开命令窗口”


3. 在弹出的命令行窗口中输入命令: java -jar convertTTS.jar <文件名> <个性化语音的性别> <个性化语音的名称><目标路径> <Key> <Endpoint>

这里需要传入六个参数:

1) <文本文件路径>: 就是需要转换的文本文件路径及文件名

2) <个性化语音的性别>: 创建的个性化语音服务采用的性别,M为男性,F为女性

3) <个性化语音的名称>:创建的个性化语音服务的名称

4) <目标路径>: 就是转换好之后要保存的路径

5) <Key>: 就是前文中创建语音服务时让记住的那个 Key

6) <Endpoint>:前面创建的Endpoint URL


举例如下:

java -jar ttsConvert.jar C:/test/test.txt M zyl041688 C:/test/output.mp3 <Your Key> < Your Endpoint>

回车,至此大功告成!



----------------------- 附微软的语音服务资费标准 --------------------

如果创建的是免费服务,每月可以免费转化 ≤ 五百万字符;如果创建的是标准化付费服务,每转化 一百万字符,收费 $6。

也可以在Azure 控制台上监控应用的花费状态。


参考资料:

微软个性化语音服务

Creating custom voice fonts 官方文档

Transcription guidelines for using the Speech Service 官方文档

Speech Service REST APIs 官方文档


最后,居老师美图镇楼 ^_^

能把咱们程序员专用工作服穿出这个效果,这个世界果然是看脸的 —_—!!

编辑于 2021-04-06 08:35