目标
跑一个tts的人任务,利用现在的大厂的api服务
主要是集成代码,也很简单
本质上这个和ai无关,就是一个集成的工作
之前的工作同步笔记
今天要说的也就是第三点的内容
1. 跑tts模型-tacotron2的训练(以后用来重新收集人声素材训练)
问题1:显卡的硬件环境:ncvv --version ,CUDA.11.1,支持2080Ti
问题2:电脑的软件环境,还卡着,没有跑起来(python版本,conda版本,项目依赖包指定版本对应的python不明确,导致一些包装不上)
2. 实现现成模型的推理服务(1的产出也是模型,本地服务)
模型以包形式存在的,比如,from gtts import gTTS(简陋模型)
模型以文件形式存在的,比如,model.load_state_dict(torch.load('xxxx.pt'))
3. 调用在线的tts服务
我调研了微软、序列猴子、百度、科大讯飞等多家,选择非默认的配音人,听感还是舒服不少的,且收费也不是很贵(默认的2分/万字,有配音员的是2元/万字),有API接入很方便(已实现序列猴子/百度/科大讯飞)。
操作
所有的操作都类似
- 找大厂的ai服务
- 申请额度,获取apikey
- 找api sdk集成的demo
- 下载后配置apikey,跑起来
- 集成到我们自己的业务中去
代码
下面这个是序列猴子的
import time
import hashlib
import os
import json
import requests
timestamp = str(int(time.time()))
appkey = ''
secret = ''
message = '+'.join([appkey, secret, timestamp])
m = hashlib.md5()
m.update(message.encode("utf8"))
signature = m.hexdigest()
http_url = 'https://open.mobvoi.com/api/tts/v1'
def sample():
data = {
'text': "虎扑11月24日讯,雄鹿球员阿德托昆博在接受采访时,谈到了明年的目标。阿德托昆博说道:希望我们能够夺得总冠军。在那之后,尝试得到奥运会的入场券,因为我们还没有获得参赛资格。如果这一切都按顺序发生了,(如果)我们晋级奥运会了,我会非常激动地在那里(出战奥运会)。",
'speaker': 'manchaozn_meet_24k@xili',
'audio_type': 'mp3',
'speed': 1.0,
#'symbol_sil': 'semi_250,exclamation_300,question_250,comma_200,stop_300,pause_150,colon_200', # 停顿调节需要对appkey授权后才可以使用,授权前传参无效。
#'ignore_limit': True, # 忽略1000字符长度限制,需要对appkey授权后才可以使用
'gen_srt': False, # 是否生成srt字幕文件,默认不开启。如果开启生成字幕,需要额外计费。生成好的srt文件地址将通过response header中的srt_address字段返回。
'appkey': appkey,
'timestamp': timestamp,
'signature': signature
}
try:
headers = {'Content-Type': 'application/json'}
response = requests.post(url=http_url, headers=headers, data=json.dumps(data))
content = response.content
with open(os.path.join(os.path.dirname(os.path.abspath("__file__")), "monkey-manchaozn_meet_24k@xili.mp3"), "wb") as f:
f.write(content)
except Exception as e:
print("error: {0}".format(e))
def sampleWithSrt():
data = {
'text': '出门问问成立于2012年,是一家以语音交互和软硬结合为核心的人工智能公司,为全球40多个国家和地区的消费者、企业提供人工智能产品和服务。',
'speaker': 'xiaoyi_meet',
'audio_type': 'wav',
'speed': 1.0,
#'symbol_sil': 'semi_250,exclamation_300,question_250,comma_200,stop_300,pause_150,colon_200', # 停顿调节需要对appkey授权后才可以使用,授权前传参无效。
#'ignore_limit': True, # 忽略1000字符长度限制,需要对appkey授权后才可以使用
'gen_srt': True, # 是否生成srt字幕文件,默认不开启。如果开启生成字幕,需要额外计费。生成好的srt文件地址将通过response header中的srt_address字段返回。
'appkey': appkey,
'timestamp': timestamp,
'signature': signature
}
try:
headers = {'Content-Type': 'application/json'}
print(json.dumps(data))
response = requests.post(url=http_url, headers=headers, data=json.dumps(data))
content = response.content
with open(os.path.join(os.path.dirname(os.path.abspath("__file__")), "sample.mp3"), "wb") as f:
f.write(content)
srtUrl = response.headers.get('srt_address', None)
if srtUrl is None:
print('not found srt url from response header')
return
print('srt url:', srtUrl)
content = requests.get(url=srtUrl).content
with open(os.path.join(os.path.dirname(os.path.abspath("__file__")), "sample.srt"), "wb") as f:
f.write(content)
except Exception as e:
print("error: {0}".format(e))
def sampleWithSsml():
data = {
'text': '<speak version="1.0" xml:lang="zh-CN" xmlns="http://www.w3.org/2001/10/synthesis">9月10日,庆祝2019年<w phoneme="jiao4 shi1 jie2">教师节</w>暨全国教育系统先进集体和先进个人表彰大会在京举行。<break time="500ms" />习近平总书记在人民大会堂亲切会见受表彰代表,<break time="500ms" />向受到表彰的先进集体和先进个人表示热烈祝贺,<break time="500ms" />向全国广大<p phoneme="jiao4">教</p>师和教育工作者致以节日的问候。</speak>',
'speaker': 'xiaoyi_meet',
'audio_type': 'wav',
'speed': 1.0,
#'symbol_sil': 'semi_250,exclamation_300,question_250,comma_200,stop_300,pause_150,colon_200', # 停顿调节需要对appkey授权后才可以使用,授权前传参无效。
#'ignore_limit': True, # 忽略1000字符长度限制,需要对appkey授权后才可以使用
'gen_srt': True, # 是否生成srt字幕文件,默认不开启。如果开启生成字幕,需要额外计费。生成好的srt文件地址将通过response header中的srt_address字段返回。
'appkey': appkey,
'timestamp': timestamp,
'signature': signature
}
try:
headers = {'Content-Type': 'application/json'}
print(json.dumps(data))
response = requests.post(url=http_url, headers=headers, data=json.dumps(data))
content = response.content
with open(os.path.join(os.path.dirname(os.path.abspath("__file__")), "ssmlSample.mp3"), "wb") as f:
f.write(content)
except Exception as e:
print("error: {0}".format(e))
def main():
sample()
# sampleWithSrt()
# sampleWithSsml()
if __name__ == '__main__':
main()