美文网首页人工智能/模式识别/机器学习精华专题
Python:TTS语音合成技术,市场各大平台对比以及实现

Python:TTS语音合成技术,市场各大平台对比以及实现

作者: Python数据分析实战 | 来源:发表于2019-03-05 09:31 被阅读7次
    TTS

    前景提要:在线的实时合成TTS技术,巴拉巴拉... 此处省略3千字
    市场的TTS平台:讯飞语音百度智能语音开放平台阿里云腾讯云思必驰捷通华声(灵云)等。

    TTS的合成简单来说就三大步:
    1️⃣创建应用
    2️⃣发起请求
    3️⃣解析音频数据,合成音频文件

    咱们废话不说一个一个来:
    一、讯飞,音频届的老大哥

    支持多种语言开发,选择适合自己的,我这里选的是WebAPI: 多种语言开发

    01、创建应用


    创建应用

    说明:
    1和3: 是在代码中具体使用到的 鉴权码
    2:表示试用期间的每天使用次数
    4:请求IP要添加白名单,不添加白名单会请求失败
    5:可以选择不同的发音人:(分初级和高级,高级的另收费)

    code:

    def tts_xunfei(text):
      # API请求地址、API KEY、APP ID等参数,提前填好备用
      api_url = "http://api.xfyun.cn/v1/service/v1/tts"
      API_KEY = "API_KEY"
      APP_ID = "APP_ID"
      OUTPUT_FILE = "讯飞.wav"  # 输出音频的保存路径,请根据自己的情况替换
      TEXT = text
    
    # 构造输出音频配置参数custom_skill.py3
      Param = {"auf": "audio/L16;rate=16000",  # 音频采样率
          "aue": "raw",  # 音频编码,raw(生成wav)或lame(生成mp3)
          "voice_name": "x_xiaoyuan", "speed": "50",  # 语速[0,100]
          "volume": "77",  # 音量[0,100]
          "pitch": "50",  # 音高[0,100]
          "engine_type": "aisound"  # 引擎类型。aisound(普通效果),intp65(中文),intp65_en(英文)
        }
      # 配置参数编码为base64字符串,过程:字典→明文字符串→utf8编码→base64(bytes)→base64字符串
      Param_str = json.dumps(Param)  # 得到明文字符串
      Param_utf8 = Param_str.encode('utf8')  # 得到utf8编码(bytes类型)
      Param_b64 = base64.b64encode(Param_utf8)  # 得到base64编码(bytes类型)
      Param_b64str = Param_b64.decode('utf8')  # 得到base64字符串
    
      # 构造HTTP请求的头部
      time_now = str(int(time.time()))
      checksum = (API_KEY + time_now + Param_b64str).encode('utf8')
      checksum_md5 = hashlib.md5(checksum).hexdigest()
      header = {"X-Appid": APP_ID, "X-CurTime": time_now, "X-Param": Param_b64str, "X-CheckSum": checksum_md5}
    
      # 构造HTTP请求Body
      body = {"text": TEXT}
      body_urlencode = urllib.parse.urlencode(body)
      body_utf8 = body_urlencode.encode('utf8')
    
      # 发送HTTP POST请求
      req = urllib.request.Request(api_url, data=body_utf8, headers=header)
      response = urllib.request.urlopen(req)
    
      # 读取结果
      response_head = response.headers['Content-Type']
      if (response_head == "audio/mpeg"):
          data = response.read()  # a 'bytes' object
          save_wav(data, OUTPUT_FILE)
      else:
          print(response.read().decode('utf8'))
    

    注意:将上面的APP_ID和API_KEY更换为自己的即可,另外记得添加IP白名单

    二、阿里平台
    用户鉴权有有效期,到期了要重新获取token

    def tts_ali(text):
    
        # 获取存储的access_token, token_expireTime  两个同时更新
        token_expireTime = 1551513046
        access_token = "9fcdcd2a190f49cb926dc5c2e24043c8"
    
        # 当前的时间戳 和 token有效期对比,如果过期则重新生成
        local_time = int(time.time())
        if local_time >= token_expireTime:
            # 重新生成并存储
            access_token, token_expireTime = get_token()
    
        headers = {
            "Content-Type": "application/json;charset=UTF-8",
            "X-NLS-Token":access_token,
            }
    
        data_info = {
            "appkey":"5dz4RRvAJufMAB6g",
            "text":text,
            "token":access_token,
            "format":"wav",
            "voice":"yina",
            "sample_rate":"16000",  # 音频采样率,默认是16000
            "volume":"50", # 音量,范围是0~100,默认50
            "speech_rate":"45", # 语速,范围是-500~500,默认是0
            "pitch_rate":"0", # 语调,范围是-500~500,默认是0
    
            # 试听发音人:https://ai.aliyun.com/nls/tts?spm=5176.8142029.388261.47.f8ed6d3e0NhBch
            # 发音人参数:https://help.aliyun.com/document_detail/84435.html?spm=a2c4g.11186623.6.581.69a853d5E4c3vM
            # 推荐:小梦 思悦 小美 伊娜
            }
    
        data = json.dumps(data_info)
    
        ret = requests.post(ALI_URL, headers=headers, data=data, timeout=5)
        save_wav(ret.content, "ali2.wav")
    

    提醒:
    token的获取我代码里有完整的
    另外开发测试期间,开发文档会提供简易的不过期token,方便测试

    三、百度
    调用方式简单,开发文档里有说明

    # 百度
    def tts_baidu(text):
        baidu_url = "http://tsn.baidu.com/text2audio?lan=zh&ctp=1&cuid=abcdxxx&tok=24.ed4dfdxxxxxff0af259fc.2592000.1553756573.282335-15631432&tex={}&vol=9&per=0&spd=5&pit=5&aue=6".format(text)
    
        ret = requests.get(baidu_url, timeout=5)
        save_wav(ret.content, "siyue.wav")
    

    四、腾讯
    正在开发测试阶段,直接舍弃了

    五、标贝

    # 标贝
    def tts_biaobei(text):
        """获取tts语音"""
        tts_url = "http://1.203.80.138:8001/tts?user_id=xxx&domain=1&volume=0&language=zh&speed=5&audiotype=5&text=" + text
        f = requests.get(tts_url)
        voice = f.content
        return voice
    

    六、思必驰

     # 思必驰
    def tts_dui(text):
        data_dict = {
            "context": {"productId": "productId"},
            "request": {"requestId": "tryRequestId",
            "audio": {"audioType": "WAV", "sampleRate": 16000, "channel": 1, "sampleBytes": 2},
                "tts": {
                "text": text,
                "textType": "text",
                "voiceId": "lili1f_shangwu"}}}
        data = json.dumps(data_dict)
    
        headers = {
            'content-type': 'application/json',
            'User-Agent': 'Mozilla/5.0 '}
    
        r = requests.post(DUI_URL, data=data, headers=headers, timeout=5)
        print(r)
    
        # 写入文件生成音频
        save_wav(r.content, "DUI.wav")
    

    七、捷通华声(灵云)

     # 灵云
    def tts_lingyun(text):
    
        linghyun_URL = "http://api.hcicloud.com:8880/tts/synthtext"
        request_data = "2014-6-18 10:10:11"
    
        data = request_data + "应用参数"
        md5 = hashlib.md5()
        md5.update(data.encode('utf-8'))  # 注意转码
        res = md5.hexdigest()
    
        headers = {"x-app-key": "c95d54cf", "x-sdk-version": "3.9", "x-request-date": request_data,
            "x-task-config": "capkey=tts.cloud.xiaokun,audioformat=mp3,speed=2,volume=9.99", "x-session-key": res,
            "x-udid": "101:1234567890"}
    
        r = requests.post(linghyun_URL, headers=headers,
                      data=text.encode('utf-8'),
                      timeout=5)
    
        # 获取音频数据
        ret = r.content
        ret = ret[ret.find(b'</ResponseInfo>') + 15:]
    
        # 写入文件生成音频
        save_wav(bytes(ret), "aasdasd.mp3")
    

    没有python示例代码,返回参数比较变态,解析出音频耗了我大量时间(因为我技术不佳)

    使用过程中:百度无人回复,没给报价,思必驰没找到任何公司人员
    各平台均有使用,每天限次数,可以开发试听一下,
    效果比较个人感觉:
    标贝 > 讯飞 > 阿里 > 百度 > 思必驰 > 灵云

    价格比较:


    讯飞 阿里

    标贝:16万/年
    灵云:2万次/100

    Git代码: 公众号后台回复 python_tts 或 tts
    python疯子

    相关文章

      网友评论

        本文标题:Python:TTS语音合成技术,市场各大平台对比以及实现

        本文链接:https://www.haomeiwen.com/subject/gspmuqtx.html