【上手AI】2-跑一个tts的服务(利用大厂的apikey)

111 阅读4分钟

目标

跑一个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()