基于python3实现Azure机器学习最接近人声的文本转语音功能
off999 2024-11-13 11:43 34 浏览 0 评论
上期文章,我们介绍了如何使用Azure来创建一个语音服务API,哪里,我们得到了API的key,以及语音服务的基本信息,包含地区等,这些都是本期代码需要的参数
听了那么多AI合成的语音,Azure机器学习的文本转语音最接近人声
下图是Azure官方的一个语音合成流程图,大致包含如下步骤
- 准备需要合成语音的text文件或者SSML文件
- 向API发送请求
- API服务提供文本转语音功能(本步骤直接在Azure服务器上执行)
- 用户端检查服务状态,若提示为succeeded,说明服务完成(由于是长语言转换功能,服务器需要时间较长,程序可以循环判断目前的转换状态)
- 下载转换完成的语言
——1——
文本准备
对于文本的要求如下:
文件是纯文本文件 (.txt) 或 SSML 文本 (.txt)。
文件已编码为UTF-8 格式。
文件是单个文件,而不是 zip 文件。
文件包含 400 多个字符(对于纯文本),或 400 个可计费字符(对于 SSML 文本),并且少于 10,000 个段落。
对于纯文本,通过点击 Enter/Return 来分隔每个段落。
对于 SSML 文本,每个 SSML的每个部分都被视为一个段落。 按不同段落分隔 SSML 部分。
——2——
获取支持的语音列表
由于不同的API服务会使用不同的地区与付费标准,Azure API 在进行访问之前,我们首先查看一下自己API对应的语音列表,我们后期需要合成的语音只能从语音列表中选取,否则API会返回错误信息
import json
import ntpath
import requests
input_file_path_text = 'input_text.txt'
TTS_voicename = "zh-CN-XiaoxiaoNeural"
TTS_KEY = 'your key'
TTS_region = 'eastus'
TTS_locale = "zh-CN"
#获取受支持语音列表
def get_voices():
region = TTS_region
key = TTS_KEY
url = 'https://{}.customvoice.api.speech.microsoft.com/api/texttospeech/v3.0/longaudiosynthesis/voices'.format(region)
header = {
'Ocp-Apim-Subscription-Key': key
}
response = requests.get(url, headers=header)
print(response.text)
get_voices()首先我们加载第三方库,由于我已经运行过代码,因此这里定义了一些常量,方便后面的代码统一使用,这里需要配置自己的
TTS_voicename = "zh-CN-XiaoxiaoNeural" 合成语音的名称,这里我们通过以上代码便可以知道自己API支持的语音列表
TTS_KEY = 'your key' 这里替换成自己的API key
TTS_region = 'eastus' 这里替换成自己API语音资源的区域
TTS_locale = "zh-CN" 这里需要设置需要转换的源文本
脚本成功运行提示如下:
{
"values": [
{
"locale": "ko-KR",
"voiceName": "ko-KR-SunHiNeural",
"description": "{\"Version\":\"20211130133950\"}",
"gender": "Female",
"createdDateTime": "2021-11-30T15:12:34.717Z",
"properties": {
"publicAvailable": true
}
},
{
"locale": "de-DE",
"voiceName": "de-DE-KatjaNeural",
"description": "{\"Version\":\"20211130133950\"}",
"gender": "Female",
"createdDateTime": "2021-11-30T13:48:10.387Z",
"properties": {
"publicAvailable": true
}
},
{
"locale": "zh-CN",
"voiceName": "zh-CN-XiaoyouNeural",
"description": "{\"Version\":\"20211130133950\"}",
"gender": "Male",
"createdDateTime": "2021-11-30T16:55:21.760Z",
"properties": {
"publicAvailable": true
}
}
}这里只截取了部分语音列表,详细的列表可以根据自己的API 进行代码的输出
如果 properties.publicAvailable 为 true,则是公共神经语音。 否则,它是自定义神经语音。
——3——
将文本转换为语音
将文本转换为语音
def submit_synthesis():
region = TTS_region
key = TTS_KEY
input_file_path = input_file_path_text
locale = TTS_locale
url = 'https://{}.customvoice.api.speech.microsoft.com/api/texttospeech/v3.0/longaudiosynthesis'.format(region)
header = {
'Ocp-Apim-Subscription-Key': key
}
voice_identities = [
{
'voicename': TTS_voicename
}
]
payload = {
'displayname': 'long audio synthesis sample',
'description': 'sample description',
'locale': locale,
'voices': json.dumps(voice_identities),
'outputformat': 'riff-16khz-16bit-mono-pcm',
'concatenateresult': True,
}
filename = ntpath.basename(input_file_path)
files = {
'script': (filename, open(input_file_path, 'rb'), 'text/plain')
}
response = requests.post(url, payload, headers=header, files=files)
print('response.status_code: %d' % response.status_code)
print(response.headers['Location'])
submit_synthesis()将 TTS_KEY 替换为语音服务API的自己key
将TTS_region 替换为创建语音资源的区域
将input_file_path_text 替换为准备进行文本转语音的文本文件的路径。
将 TTS_locale 替换为所需的输出区域设置。
通过第二步,我们已经得到了自己API所支持的语音list,这里选择自己的喜欢的语音名称,替换TTS_voicename
concatenateResult 是一个可选参数。 如果未设置此参数,则将按段落生成音频输出。 你还可以通过加入该参数,将音频连接成一个输出。
outputFormat 也是可选的。 默认情况下,音频输出设置为 riff-16khz-16bit-mono-pcm,支持的语音输出格式如下
riff-8khz-16bit-mono-pcm
riff-16khz-16bit-mono-pcm
riff-24khz-16bit-mono-pcm
riff-48khz-16bit-mono-pcm
audio-16khz-32kbitrate-mono-mp3
audio-16khz-64kbitrate-mono-mp3
audio-16khz-128kbitrate-mono-mp3
audio-24khz-48kbitrate-mono-mp3
audio-24khz-96kbitrate-mono-mp3
audio-24khz-160kbitrate-mono-mp3成功运行后,代码提示如下:
response.status_code: 202
https://<endpoint>/api/texttospeech/v3.0/longaudiosynthesis/<guid>其中202 代表请求成功, print(response.headers['Location'])会输出一个URL,通过这个URL,我们可以访问此API合成语音的进度,参考下面第四步,uid 是我们第五步下载合成音频的参数
——4——
获取有关已提交请求的状态
通过第三步,我们已经成功提交了API请求,并API 返回了URL,通过此URL,我们来获取API的运行状态
获取有关已提交请求的详细信息
def get_synthesis():
url = URL
key = TTS_KEY
header = {
'Ocp-Apim-Subscription-Key': key
}
response = requests.get(url, headers=header)
print(response.text)
get_synthesis()
这里的URL 需要替换成第三步中代码返回的URL 链接
输出如下
{
"models": [
{
"voiceName": "zh-CN-XiaoxiaoNeural"
}
],
"properties": {
"outputFormat": "riff-16khz-16bit-mono-pcm",
"concatenateResult": true,
"totalDuration": "PT0S",
"billableCharacterCount": 0
},
"id": "7e3d9994-d319-44f3-9b35-02fe253a7643",
"lastActionDateTime": "2022-03-24T05:33:48.440Z",
"status": "Running",
"createdDateTime": "2022-03-24T05:28:50.267Z",
"locale": "zh-CN",
"displayName": "long audio synthesis sample",
"description": "sample description"
}status 属性从 NotStarted 状态变更为 Running,最后变更为 Succeeded 或 Failed。 可以使用循环轮询此 API,直到状态变为 Succeeded 或 Failed。最后Succeeded ,说明服务已经完成,我们就可以把合成的语音下载下来了
——5——
下载已经完成的语音服务
##下载音频结果
def get_files():
id = ID
region = TTS_region
key = TTS_KEY
url = 'https://{}.customvoice.api.speech.microsoft.com/api/texttospeech/v3.0/longaudiosynthesis/{}/files'.format(region, id)
header = {
'Ocp-Apim-Subscription-Key': key
}
response = requests.get(url, headers=header)
print('response.status_code: %d' % response.status_code)
print(response.text)
get_files()
这里的ID 需要替换成第三步中URL 最后的UID,输出如下response.status_code: 200
{
"values": [
{
"name": "3e322b4a-0aed-49e3-874e-5066c12e15a2.txt",
"kind": "LongAudioSynthesisScript",
"properties": {
"size": 4668
},
"createdDateTime": "2022-03-24T05:28:50.190Z",
"links": {
"contentUrl": "https://cvoiceprodeus.blob.core.windows.net/bestor-c6e3ae79-1b48-41bf-92ff-940bea3e5c2d/VoiceSynthesisData/3e322b4a-0aed-49e3-874e-5066c12e15a2.txt?sv=2019-07-07&sr=b&sig=iGHOI1h%2BiCT%2Brb%2F3rDE1GH2FyOFK8ALr%2FkhoMuVxqDY%3D&st=2022-03-24T05:35:32Z&se=2022-03-24T17:40:32Z&sp=rl"
}
},
{
"name": "voicesynthesis_waves.zip",
"kind": "LongAudioSynthesisResult",
"properties": {
"size": 8877068
},
"createdDateTime": "2022-03-24T05:35:38.140Z",
"links": {
"contentUrl": "https://cvoiceprodeus.blob.core.windows.net/bestor-c6e3ae79-1b48-41bf-92ff-940bea3e5c2d/VoiceSynthesisData/8a8cb7b2-2fc6-4102-b57c-06d0cf0a7740?sv=2019-07-07&sr=b&sig=8SG%2BGAOx0UV2BslaI5xi5xEqZO%2BZ5IhPVPyd5lHVa1s%3D&st=2022-03-24T05:35:32Z&se=2022-03-24T17:40:32Z&sp=rl"
}
}
]
}response.status_code: 200 说明成功
此示例输出包含两个文件的信息。 包含 "kind": "LongAudioSynthesisScript" 文件是已提交的输入脚本。
包含 "kind": "LongAudioSynthesisResult" 的另一个文件是此请求的结果。
结果是 zip 文件,其中包含生成的音频输出文件,以及输入文本的副本。
可以从其 links.contentUrl 属性的 URL 中下载这两个文件。
得到2个链接后,直接输入到浏览器里面,会自动下载文件,当然也可以使用urllib.request.urlretrieve(URL1, "123.txt"),第一个链接返回一个输入的源文本文件
urllib.request.urlretrieve(URL2, "123.zip"),第二个链接返回一个压缩包,里面有合成的wav的语音
——6——
REST API 中的 HTTP 响应代码和消息
下表详细介绍了 REST API 中的 HTTP 响应代码和消息。
API HTTP 状态代码 说明 解决方案
400 此区域未启用语音合成。 使用受支持区域更改语音订阅密钥。
400 只有此区域的标准语音订阅才有效。 将语音订阅密钥更改为“标准”定价层。
400 超过 Azure 帐户的 20,000 个请求限制。 在提交新请求之前需删除一些请求。 服务器将为每个 Azure 帐户最多保留 20,000 个请求。 请在提交新请求之前删除一些请求。
400 此模型不能用于语音合成:{modelID}。 请确保 {modelID} 的状态正确。
400 请求区域与模型区域不一致:{modelID}。 请确保 {modelID} 区域与请求区域匹配。
400 语音合成仅支持使用包含字节顺序标记的 UTF-8 编码中的文本文件。 请确保输入文件使用包含字节顺序标记的 UTF-8 编码。
400 语音合成请求中只允许有效的 SSML 输入。 请确保输入 SSML 表达式正确。
400 在输入文件中找不到语音名称 {voiceName}。 输入 SSML 语音名称与模型 ID 不对齐。
400 输入文件中的段落数应小于 10,000。 请确保文件中的段落数小于 10,000。
400 输入文件应超过 400 个字符。 请确保输入文件超过 400 个字符。
404 找不到语音合成定义中声明的模型:{modelID}。 请确保 {modelID} 正确。
429 超出活动语音合成限制。 请耐心等待,直至一些请求处理完成。 对于每个 Azure 帐户,服务器最多可以运行 120 个请求并将其排入队列。 请耐心等待,避免在某些请求处理完成之前提交新请求。
全部 429 请求太多。 对于每个 Azure 帐户,客户端每秒最多可以向服务器提交 5 个请求。 请减少每秒请求数量。
Delete 400 语音合成任务仍在使用中。 只能删除“已完成”或“已失败”的请求。
GetByID 404 找不到指定的实体。 请确保合成 ID 正确。相关推荐
- 魔兽争霸3冰封王座官网下载(魔兽争霸3冰封王座1.20e中文版下载_魔兽争霸3下载)
-
没法下载,因为没有说明在什么平台下载可以在网易的官方网站上进行下载,下载地址如下:https://dz.blizzard.cn/下载的时候请选择中间的“平台完整版”,这个版本包含了《魔兽争霸3》游戏本...
- 四人麻将(四人麻将图片)
-
1.标准打法:常规的打缺打法,不附加任何的特殊规则。2.标准下雨:在标准打法的基础上,加入下雨的功能,也就是杠牌。下雨分为明杠和暗杠。明杠:①玩家手中有三张一样的牌,其它玩家打出了第四张一样的牌,...
- 美图秀秀app下载安装免费(美美秀图手机版下载)
-
美图秀秀下载了找不到,应该是因为你的内存的原因,安装失败了。美图秀秀是一款使用很普遍的美图软件,可以满足大多数用户的需求,比如自己p图,或者是拼图都很好。可是,你发现你下载了美图秀秀,却在手机桌面没有...
- 街机游戏厅app(街机游戏厅app大全)
-
以下是几个不错的iOS街机游戏厅:MAME4iOS:这是一款非常流行的iOS街机游戏厅,可以让你在iPhone或iPad上运行多个街机游戏。iCade:这是一款专门为iCade控制器设计的街机游戏...
- 海外加速器下载(加速器中国免费)
-
迅游不能下载海外游戏的原因是因为一些海外游戏需要进行版权验证,而迅游没有获得这些游戏的版权许可。此外,由于不同国家的游戏法规和政策不同,迅游有时需要根据不同的规定进行调整,这也可能会限制用户下载一些海...
- 日语输入法app下载(simeji日语输入法官网下载)
-
谷歌输入法。安卓可以用的最好用的了吧,在设置里下载好所需要语言,打字时按那个切换即可。另外还有一个触宝,个人觉得不如谷歌。可以打出日文的输入法,很不错的日语输入法。安装后请在系统中添加输入法,即可使...
-
- 字体设计网站(字体设计 网站)
-
那就到这个网站,每次只能输入一个字,从小篆到甲骨文:http://www.internationalscientific.org就玩个静态页,很简单啊,教你一个作弊方法(反正你来这里讨教也不是自己完成作业),就是找一个你认为合适你作业要求...
-
2026-01-17 01:51 off999
-
- windows7旗舰版下载地址(win7官方旗舰版下载教程)
-
最简单的方法就是,下载完镜像文件后,直接把镜像文件解压,解压到非C盘,然后在解压文件里面找到setup.exe,点击运行即可。安装系统完成后,在C盘找到一个Windows.old(好几个GB,是旧系统打包在这里,垃圾文件了)删除即可。扩展资...
-
2026-01-17 01:43 off999
- 全民斗地主免费(全民斗地主免费下载·点开即玩版.直达首页.top)
-
趣头条是开发的比较早的一款阅读看新闻资讯以及看视频听音乐能赚钱的软件了,而且在下载软件排行榜上也是名次靠前的存在,这充分说明了这个软件的内容是得到了广大网民的认可和喜爱,趣头条里有很多好玩的游戏包括这...
- 五十本巅峰带颜色的书(五十本巅峰带颜色的书高僧修行手册)
-
《我的时尚穿搭规则》,是中信出版社2011年出版的图书,作者是尼娜·加西亚。 《我的时尚穿搭规则:让你在每个场合都焕发光彩》内容简介:这个时代,任何人都无法拒绝时尚,它和我们的生活息息相关。 “最...
- 7723游戏盒子官方正版(7723游戏盒子官方正版2023)
-
1、7723是通过在互联网上下载和安装得到的。2、因为7723是一款软件,需要从官方网站或第三方下载站点下载。下载过程需要考虑到网络速度、软件版本、安全性等因素,如果没有良好的网络环境或下载方式不正确...
- 广场资源看电视app(搜索电视广场)
-
电视机投屏没有投屏设备的原因是因为手机和电视没有在同一网络下,将电视和手机连接到同一网络即可实现投屏,具体的操作步骤如下:1,打开糖豆广场舞,选择要学习的舞蹈视频并打开2.点击【TV】键,与电视设备连...
- 纯净系统之家官网(纯净系统基地官网)
-
系统之家发布的Win10纯净版是没有预装激活工具的,您需要自行激活。以下是操作步骤:1.打开“设置”页面,选择“更新和安全”选项。2.在左侧菜单栏中,选择“激活”。3.点击“更改产品密钥”按钮,...
- 免费无限破解版游戏大全下载
-
靠谱助手、烧饼、葫芦侠修改器、八门神器、全能破解就是不用花钱就能买游戏里的商品安全岂见打开飞行模式内购更安全不会扣费手机先ROOT,之后下对应的破解软件,这样成功率比较高。虎牙YOWA云游戏...
-
- 视频相册制作软件免费版(视频相册制作下载)
-
电脑端的软件推荐第一个会声会影,会声会影这个软件简单易上手,制作出来电子相册很美,软件本身简单容易操作,没有水印。第二个推荐快剪辑,快剪辑也是一个制作电子相册非常好的软件,这个软件简单易上手,没有什么操作难度。第三个电脑端的软件编辑星,编辑...
-
2026-01-16 23:51 off999
欢迎 你 发表评论:
- 一周热门
-
-
抖音上好看的小姐姐,Python给你都下载了
-
全网最简单易懂!495页Python漫画教程,高清PDF版免费下载
-
飞牛NAS部署TVGate Docker项目,实现内网一键转发、代理、jx
-
Python 3.14 的 UUIDv6/v7/v8 上新,别再用 uuid4 () 啦!
-
python入门到脱坑 输入与输出—str()函数
-
Python三目运算基础与进阶_python三目运算符判断三个变量
-
(新版)Python 分布式爬虫与 JS 逆向进阶实战吾爱分享
-
失业程序员复习python笔记——条件与循环
-
系统u盘安装(win11系统u盘安装)
-
Python 批量卸载关联包 pip-autoremove
-
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
