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