基于Python完成云知声平台的语音合成接口

众所周知,语音合成和语音设别技术是实现人机语音通信,建立一个有听和讲能力的口语系统所必需的两项关键技术。使电脑具有类似于人一样的说话能力,是当今时代信息产业的重要竞争市场。和语音识别相比,语音合成的技术相对说来要成熟一些,并已开始向产业化方向成功迈进,大规模应用指日可待。尤其近几年,人工智能发展迅速,语音合成和语音识别技术,让人工智能插上翅膀,腾飞指日可待。

语音合成技术的应用目前主要有:

阅读听书

使用语音合成技术的阅读类APP,能够为用户提供多种音库的朗读功能,释放用户的双手和双眼,提供更极致的阅读体验。

资讯播报

提供专为新闻资讯播报场景打造的特色音库,让手机、音箱等设备化身专业主播,随时随地为用户播报新鲜资讯。

订单播报

可应用于打车软件、餐饮叫号、排队软件等场景,通过语音合成进行订单播报,让您便捷获得通知信息。

智能硬件

可集成到儿童故事机、智能机器人、平板设备等智能硬件设备,使用户与设备的交互更自然、更亲切。支持多语言多音色支持中文、英文、中英文混读合成,提供基础音库和精品音库共11种音库供您选择,让您的应用拥有个性化的声音。

最近在调试语音合成的AI功能,寻找平台过程中意外发现云知声AI开放平台,感觉还不错,所以就选择该平台先进行调试。云知声智能科技股份有限公司是专注于语音识别及语言处理技术的移动互联网公司,2012年成立之后异军突起,发展迅猛,目前已成为语音行业内最重量级的技术和产品供应商。

  本篇文章是基于Python完成的云知声语音平台接口,具体实现情况如下:

  1. 注册登录后,每月免费提供1000次调用,认证后提供5000次免费调用,有效期半年。

  2. 控制台中有创建应用,会有AppKey和AppSecret,后期在代码中需要。

  3. 控制台中有添加发音人,需自行添加,当调用时,需与代码匹配,否则调用失败。

 代码如下:

import websocket
import hashlib
import json
import time
import ssl
import base64
from functools import partial
try:
    import thread
except ImportError:
    import _thread as thread
from log_util import log_format
import logging
import os
import re

logger = logging.getLogger("output")

class Ws_parms(object):
    '''
    参数类,websocket测试需要的参数相关
    '''
    
    def __init__(self, url, appkey, secret, pid, vcn, text, user_id, tts_format, tts_sample):
        # 参数可以参考云知声的技术文档
        self.url = url
        self.appkey = appkey
        self.secret = secret
        self.user_id = user_id

        self.tts_format =tts_format 
        self.tts_sample =tts_sample 
        self.tts_text = text
        self.tts_vcn = vcn
        self.tts_speed = 50
        self.tts_volume = 50
        self.tts_pitch = 50
        self.tts_bright = 50
        self.tts_stream =b''
        self.punc = ''
        self.status = False
        self.message = ''
        self.code = 0
        self._pid = pid



        self.logger = logging.getLogger("RunLog")

        # 指定logger输出格式
        formatter = logging.Formatter('%(asctime)s %(levelname)-8s: %(message)s')

        # 文件日志
        file_handler = logging.FileHandler("logs/log_%s" % self._pid)
        file_handler.setFormatter(formatter)  # 可以通过setFormatter指定输出格式

        # 为logger添加的日志处理器
        self.logger.addHandler(file_handler)
        #self.logger.addHandler(console_handler)

        # 指定日志的最低输出级别,默认为WARN级别
        self.logger.setLevel(logging.INFO)
        pass


    def get_sha256(self, timestamp):
        hs = hashlib.sha256()
        hs.update((self.appkey + timestamp + self.secret).encode('utf-8'))
        signature = hs.hexdigest().upper()
        return signature

    def get_url(self):
        timestamp = str(int(time.time() * 1000))
        self.url = self.url+'?' + 'time=' + timestamp + '&appkey=' + \
                   self.appkey + '&sign=' + self.get_sha256(timestamp)
        return self.url

def on_message(ws, data, wsParms):
    if type(data) is str:
        print('rec text msg:',data)
    if type(data) is bytes:
        wsParms.tts_stream+=data
    print('rec byte msg:',len(data))

def on_error(ws, error):
    print("error: ", error)

def on_close(ws):
    print("### closed ###")

def on_open(ws, wsParms):
    print('open!')
    def run(*args):
        d={
            "format":wsParms.tts_format,
            "sample":wsParms.tts_sample,
            "text":wsParms.tts_text,
            "vcn":wsParms.tts_vcn,
            "user_id":wsParms.user_id,
            "speed":wsParms.tts_speed,
            "volume":wsParms.tts_volume,
            "pitch":wsParms.tts_pitch,
            "bright":wsParms.tts_bright,
        }
        print("data:",d)
        ws.send(json.dumps(d))
        print("my send:",wsParms.tts_vcn,wsParms.tts_format,wsParms.tts_text)

    thread.start_new_thread(run, ())


def ensure_dir(dir_path):
    if not os.path.exists(dir_path):
        os.makedirs(dir_path)

def rm_logs(dir_path):
    log_file = os.listdir(dir_path)
    for logf in log_file:
        if os.path.exists(dir_path+logf) and logf != "log.output":
            os.remove(dir_path+logf)


def do_ws(wsP):
    ws_url = wsP.get_url()
    websocket.enableTrace(False)
    print(ws_url)
    ws = websocket.WebSocketApp(url=ws_url,
    on_error = on_error,
    on_close = on_close)
    ws.on_open = partial(on_open, wsParms=wsP)
    ws.on_message = partial(on_message, wsParms=wsP)
    ws.run_forever()
    if wsP.code == 0:
        pass
    else:
        pass
    return wsP
    

def write_results(wsParms):
    ensure_dir('results')
    t1 = str(int(time.time()))
    tts_stream = os.path.join('results/', t1+'.'+wsParms.tts_format)
    with open(tts_stream, 'wb') as f:
        f.write(wsParms.tts_stream)

    

# 添加控制台中的AppKey
# 添加控制台中的AppSecret
ws_url='wss://ws-stts.hivoice.cn/v1/tts'
user_id = 'unisound-python-demo'
vcn = 'xiaofeng-base' # 添加控制台中的发音人,
text = '今天天气怎么样?'
tts_format = 'mp3'
tts_sample = '16k'
if __name__ == "__main__":
    ensure_dir('logs')
    rm_logs('logs/')
    pid=1
    wsP = Ws_parms(
        url=ws_url,
        appkey=appkey,
        secret=secret,
        pid=pid,
        vcn=vcn,
        text=text,
        tts_format=tts_format,
        tts_sample=tts_sample,
        user_id=user_id,
    )
    do_ws(wsP)
    print('test done')
    write_results(wsP)   

发音人列表:

 执行结果如下:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

疯狂的豆包

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值