百度TTS QuickStart(Python)

作为出行类app开发者的大姚,面向的用户基本上是出租车司机师傅,为他们提供乘客的实时订单信息。App上线后,不断有司机师傅提到说大部分时间在开车,盯着手机看订单太危险,而且订单字数太多字太小,有时候看不清还得停车才能看,很浪费时间,有时候刚停下车订单就被人抢跑了。久而久之,这成了司机师傅们接单的痛点,也是摆在大姚面前的一项巨大挑战。

开车的时候盯着手机看订单,是非常危险的驾驶行为,既然这样为什么不直接把订单内容朗读出来,让司机师傅们直接听单呢?大姚想到了机器语音合成方案,让机器把乘客的订单信息读出来,如乘客的地点,距离乘客多少米,目的地等信息都读出来让司机师傅听到。于是大姚展开了对市场上机器语音合成方案的调研,下载安装,编译测试,加了一个星期的班,最后测试的结果均无法让人满意。

大姚认为寻找成熟的方案才是可行的,从同为开发者的朋友那里打听到百度的语音合成服务还是比较靠谱的,服务稳定性高,发音流畅清晰,几乎没有读错的字。一起来看一下大姚是如何将百度语音合成技术应用到订单播报场景,让司机师傅们从此听单无忧的。

下面跟着我们一起和大姚使用百度语音合成服务来把整段的文字播放出来吧。

实现步骤

只需三步1小时内即可完成语音合成接口的调用,让您的应用“开口说话”。

image

Step1:成为百度AI开放平台的开发者

要调用百度AI开放平台的语音合成能力先要成为百度AI开放平台的开发者,首先让我们花5分钟来注册百度AI开放平台的开发者,并新建一个百度语音合成应用。

先点击此处注册百度账户进入 如下图 的页面快速的建立一个百度账号吧。

图片

我们有账号之后登录,并且点击此处创建一个应用如下图

图片

然后就能看到创建完的应用和 API KEY 以及 Secret KEY

图片

Step2:准备数据

语音合成是将文本转换为可以播放的音频文件的服务,我们从大姚的订单库中找一段订单信息的文本如下:

三分钟前,由北京市顺义区二经路与二纬路交汇处北侧,北京首都国际机场T3航站楼 去往 东城区北三环东路36号喜来登大酒店(北京金隅店)

Step3: 编写一个示例程序

第一步API KEY 以及 Secret KEY,以及第二步的数据,我们就可以写一个示例代码调用百度AI开放平台的语音合成能力

准备开发环境

大姚选择用python来快速搭建一个原型,那我们就安装一下python。可以参考下表列出的不同操作系统的安装方法进行安装。

Python的官方下载地址:下载python

image

Windows 快速测试包

windows平台的用户如果对上述的python安装感到困难,可以下载我们的一键测试包,下载地址:windows测试包

解压zip文件后,双击run.bat即可测试。

编写代码

新建一个 main.py

粘贴以下内容,不要忘记替换你的 API_KEY 以及 SECRET_KEY

# coding=utf-8

import sys
import json

# 保证兼容python2以及python3
IS_PY3 = sys.version_info.major == 3
if IS_PY3:
    from urllib.request import urlopen
    from urllib.request import Request
    from urllib.error import URLError
    from urllib.parse import urlencode
    from urllib.parse import quote_plus
else:
    import urllib2
    from urllib import quote_plus
    from urllib2 import urlopen
    from urllib2 import Request
    from urllib2 import URLError
    from urllib import urlencode

# 替换你的 API_KEY
API_KEY = 'nu9r2plGFi3s1ugayDPSM6Mk'

# 替换你的 SECRET_KEY
SECRET_KEY = 'G62YGnq84eKTqu0mBgvdpmC6gNBzHdai'

# 大姚的订单信息内容文本
TEXT = "三分钟前,由北京市顺义区二经路与二纬路交汇处北侧,北京首都国际机场T3航站楼 去往 东城区北三环东路36号喜来登大酒店(北京金隅店)"

TTS_URL = 'http://tsn.baidu.com/text2audio'

"""  TOKEN start """

TOKEN_URL = 'http://openapi.baidu.com/oauth/2.0/token'

"""
    获取token
"""
def fetch_token():
    params = {'grant_type': 'client_credentials',
              'client_id': API_KEY,
              'client_secret': SECRET_KEY}
    post_data = urlencode(params)
    if (IS_PY3):
        post_data = post_data.encode('utf-8')
    req = Request(TOKEN_URL, post_data)
    try:
        f = urlopen(req, timeout=5)
        result_str = f.read()
    except URLError as err:
        print('token http response http code : ' + str(err.code))
        result_str = err.read()
    if (IS_PY3):
        result_str = result_str.decode()

    result = json.loads(result_str)

    if ('access_token' in result.keys() and 'scope' in result.keys()):
        if not 'audio_tts_post' in result['scope'].split(' '):
            print ('please ensure has check the tts ability')
            exit()
        return result['access_token']
    else:
        print ('please overwrite the correct API_KEY and SECRET_KEY')
        exit()

"""  TOKEN end """

if __name__ == '__main__':

    token = fetch_token()

    tex = quote_plus(TEXT)  # 此处TEXT需要两次urlencode

    params = {'tok': token, 'tex': tex, 'cuid': "quickstart",
              'lan': 'zh', 'ctp': 1}  # lan ctp 固定参数

    data = urlencode(params)

    req = Request(TTS_URL, data.encode('utf-8'))
    has_error = False
    try:
        f = urlopen(req)
        result_str = f.read()

        headers = dict((name.lower(), value) for name, value in f.headers.items())

        has_error = ('content-type' not in headers.keys() or headers['content-type'].find('audio/') < 0)
    except  URLError as err:
        print('http response http code : ' + str(err.code))
        result_str = err.read()
        has_error = True

    save_file = "error.txt" if has_error else u'大姚的订单信息.mp3'

    with open(save_file, 'wb') as of:
        of.write(result_str)

    if has_error:
        if (IS_PY3):
            result_str = str(result_str, 'utf-8')
        print("tts api  error:" + result_str)

    print("file saved as : " + save_file)

运行代码

在命令行中运行python main.py

结果

代码运行成功后,在main.py的同级目录中会产生一个 大姚的订单信息.mp3 文件,大姚打开一听觉得这就是他想要的效果,让我们一起来听听看:
地址

了解更多

示例源代码

您可以在我们的官方github上下载示例源码

https://github.com/Baidu-AIP/QuickStart/tree/master/TTS

更丰富的应用场景

除上文提到的订单播报场景外,语音合成还可以集成到阅读类app中实现听书的功能,将文字载体转换为声音载体,让AI把文本内容读给您听,释放您的双手和双眼,获得更极致的阅读体验。

点击这里了解更多应用案例。

更多相关AI能力

百度语音合成服务提供了具有不同特色的发音人供您选择,点击这里进行试听。

百度AI开放平台提供了多种多样的语音服务,您还可以选用语音识别服务,高效便捷的实现音频->文字的转换。详见 语音识别

更多参考

百度语音合成REST API文档

如何获取API Key及Secret Key

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,384评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,845评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,148评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,640评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,731评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,712评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,703评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,473评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,915评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,227评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,384评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,063评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,706评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,302评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,531评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,321评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,248评论 2 352

推荐阅读更多精彩内容