使用Python+百度AI把文字转成语音

随着AI技术的发展,音视频的自动生成转换技术已经被越来越多的应用,很多内容网站都在文章内容页面嵌入了语音朗读功能,AI合成主播也开始在新闻媒体中应用。

知乎文章页面的朗读功能
新华社的AI合成主播

这个就是新华社联合搜狗公司在京发布全新升级的站立式AI合成主播,如果不预先说明的话,猛然看去还看真的有点难分真假。

以现在的发展趋势,AI技术将是所有行业竞争的核心能力,甚至是国家、政策之间竞争的关键因素。现在BAT大厂都有自己的AI开放平台,开放一些AI接口给企业或个人使用,一方面可以让AI技术更加快速的普及,另一方面也可以通过用户反馈进行算法的优化和迭代。

最近与业务部门沟通,聊到可能需要制作大量的短视频内容,有些培训类的可以采用PPT动画+配音的方式来实现。按照通常的做法,要么边讲边录,再后期剪辑,要么先制作PPT动画,再找专业人员配音合成。这两种方式都需要耗费大量的时间精力,那是否可以在制作完成PPT动画之后,采用文字转语音的方式生成配音文件,再进行合成呢?

我用Python+百度AI的方式做了个简单的测试,是可以的:

百度AI开放平台的网址:

​ai.baidu.com

在百度AI开放平台的开放能力中,进入语音技术,可以看到【语音合成】

点击【语音合成】后,会看到下面的页面,再点击【立即使用】,进入到管理中心页面。

百度AI语音合成

在管理中心页面可以看到,很多服务接口都是免费的,或者提供了足够多了免费调用次数,除非是做商用,一般的测试甚至是解决一点企业内部的需求用免费的就够了。

百度AI的语音技术服务有很多免费

要使用服务,首先要创建一个应用:

在百度AI平台创建应用

创建应用很简单,跟着提示简单填写一下应用名称之类就可以了,完成后就会得到APIKey,SecretKey了,这两个调用服务的必填参数:

在百度AI平台创建好的应用

到这一步为止,需要在百度AI平台上要做的事情已经结束了,平台上有技术文档,也有demo供参考,接下来就可以用自己熟悉的任何语言调用接口服务达到我们想要的目的了。我这里用的是Python,主要还是用到request模块,调用接口并把服务生成的音频数据以mp3的格式保存到本地电脑上,完整代码如下:

# -*- coding: utf-8 -*-
""" Created on Fri May 22 16:01:26 2020
功能:调用百度AI语音接口,把文字转换为mp3格式的语音
@author: zxz ​
"""
import time
import requests
import urllib.parse
import urllib.request ​ ​
def fetch_token(): # 提交请求,拿到
token api_key = "KPDENK867fZG************" # 使用百度AI平台管理中心中创建的应用的API Key
 secret_key = "YtdRTsQuLgZkO680m3db************" # 使用百度AI平台管理中心中创建的应用的Secret Key
 token_url = "https://openapi.baidu.com/oauth/2.0/token"
 # print("fetch token begin")
params = {"grant_type": "client_credentials", "client_id": api_key, "client_secret": secret_key}
r = requests.get(url=token_url, params=params)
if r.status_code == 200:
     rstr = r.json() # print(r.status_code)
     # print(rstr) # print(r.text)
     # print(rstr['access_token'])
    tok = rstr['access_token']
     return(tok)

else: print(r.text)
print('请求错误!') ​ ​
""" TOKEN end """ ​ ​
if __name__ == '__main__':
    token = fetch_token()
    TTS_URL = "https://tsn.baidu.com/text2audio"
    # text = u"莫听穿林打叶声,何妨吟啸且徐行。竹杖芒鞋轻胜马。谁怕?一蓑烟雨任平生。料峭春风吹酒醒,微冷,山头斜照却相迎。回首向来萧瑟处,归去。也无风雨也无晴。".encode('utf8')
text = u"如今,有关品牌的闲谈远比精准的广告宣传更为可信。社交圈子接过了外部营销交流和个人喜好的火炬,成为影响力的主要来源。用户在选择品牌时倾向于听取朋友的经验,好像在建起一座社交圈子筑成的堡垒,免受虚假品牌宣传和营销手段的欺骗。".encode('utf8')
# 发音人选择, 基础音库:0为度小美,1为度小宇,3为度逍遥,4为度丫丫,
# 精品音库:5为度小娇,103为度米朵,106为度博文,110为度小童,111为度小萌,默认为度小美 PER = 106 # 语速,取值0-15,默认为5中语速
SPD = 5 # 音调,取值0-15,默认为5中语调
PIT = 5 # 音量,取值0-9,默认为5中音量
VOL = 5 # 下载的文件格式, 3:mp3(default) 4: pcm-16k 5: pcm-8k 6. wav AUE = 3 ​
FORMATS = {3: "mp3", 4: "pcm", 5: "pcm", 6: "wav"}
FORMAT = FORMATS[AUE]
data = urllib.parse.urlencode({'tex': text, 'per': PER, 'tok': token, 'cuid': '20009514', 'ctp': 1, 'lan': 'zh', 'aue': AUE})
# print('test on Web Browser' + TTS_URL + '?' + data) ​
req = requests.post(TTS_URL, data) ​ print(req.status_code)
if req.status_code == 200:
    # print(req.content)
    result_str = req.content
    save_file = time.strftime("%Y%m%d%H%M%S", time.localtime()) + '.' + FORMAT
with open(save_file, 'wb') as of:
    of.write(result_str)
    print('success!')
else: 
    print('has error!')

以上代码在python3.8环境下完美运行通过,执行的结果会以“日期时间数字.mp3”为文件名把生成的语音文件保存在代码的同目录中。这段代码只是为了测试实现调用百度AI语音接口把文字生成语音的过程,没有太多考虑代码的结构优化、错误处理等问题,可以在此基础上进行完善。

小结:

百度语音合成服务目前有基础音库和精品音库两种,共9种语音,可以根据需要进行合成。我在代码中测试了两条中文,一条是诗词、一条是论述。从生成的结果对比来看,基础音库和精品音库只是音色不同,在自然流畅度的效果上没有感觉出有太大差异。

合成的语音在切词方面比较自然,但在连贯性和轻重音方面会有一点显得不那么自然。所以,如果是需要输出一些说明文、论述文、教程类文字的语音,用这种方式还是可以接受的,即快又省啊。但如果是需要有感情地朗读的内容,我觉得目前的算法还是有待改进的,不知道其它平台怎么样?如果有类似经验的朋友可以留言交流一下。

你可能感兴趣的:(使用Python+百度AI把文字转成语音)