[免费配音软件]语音合成,阿里云小姐姐为你配音

[免费配音软件]语音合成,阿里云小姐姐为你配音

@ NH4L

轻松实现语音合成,让阿里云小姐姐为你的视频配音 本次调用的是阿里云的语音合成SDK,调用接口进行语音合成。 下面来看看具体实现步骤以及两种利用python进行语音的代码。

直接查看软件更新并下载请点击下方链接

一、注册登录阿里云获取appkey

1.登入阿里云: aliyun.com/ 2.需要 实名认证 才行哟 3.点击控制台

4.在搜索界面搜索 智能语音交互 ,进入智能语音交互控制台

5.点击进入后点击我的项目--创建项目


6.随便输入项目名词和描述即可

7.即可得到项目appkey

8.点击总览,点击获取AccessToken

在其中还有很多音频可以试听,可以选择自己喜欢的声音。 这是语音合成的接口说明,不同的声音又不用的voice参数值。 help.aliyun.com/documen


二、普通方式获得语音合成

通过将网址放入浏览器获取语音,修改自己的appkey和accessToken和需要语音合成的语句即可。

https://nls-gateway.cn-shanghai.aliyuncs.com/stream/v1/tts?appkey=你的appkey&token=你的accesstoken&format=mp3&voice=Aixia&speech_rate=0&volume=100&text=你好呀,小姐姐

下面是各个参数说明

将你的语句修改即可,这种方式最多300个字符,如果需要更多的话,就需要利用python来解决了。

三、配音软件开发成功

下载地址

更新文章 https://zhuanlan.zhihu.com/p/195459302


四、利用python调用SDK进行语音合成

有两种方式

1.官方SDK

第一种是调用阿里云SDK,大家可以到 help.aliyun.com/documen 中了解详情及配制相关包。 下面铺上代码:

# -*- coding: utf-8 -*-
import threading
import ali_speech
from ali_speech.callbacks import SpeechSynthesizerCallback
from ali_speech.constant import TTSFormat
from ali_speech.constant import TTSSampleRate
class MyCallback(SpeechSynthesizerCallback):
    # 参数name用于指定保存音频的文件
    def __init__(self, name):
        self._name = name
        self._fout = open(name, 'wb')
    def on_binary_data_received(self, raw):
        print('MyCallback.on_binary_data_received: %s'




    
 % len(raw))
        self._fout.write(raw)
    def on_completed(self, message):
        print('MyCallback.OnRecognitionCompleted: %s' % message)
        self._fout.close()
    def on_task_failed(self, message):
        print('MyCallback.OnRecognitionTaskFailed-task_id:%s, status_text:%s' % (
            message['header']['task_id'], message['header']['status_text']))
        self._fout.close()
    def on_channel_closed(self):
        print('MyCallback.OnRecognitionChannelClosed')
def process(client, appkey, token, text, audio_name, voice):
    callback = MyCallback(audio_name)
    synthesizer = client.create_synthesizer(callback)
    synthesizer.set_appkey(appkey)
    synthesizer.set_token(token)
    synthesizer.set_voice(voice)
    synthesizer.set_text(text)
    synthesizer.set_format(TTSFormat.WAV)
    synthesizer.set_sample_rate(TTSSampleRate.SAMPLE_RATE_16K)
    synthesizer.set_volume(50)
    synthesizer.set_speech_rate(0)
    synthesizer.set_pitch_rate(0)
    try:
        ret = synthesizer.start()
        if ret < 0:
            return ret
        synthesizer.wait_completed()
    except Exception as e:
        print(e)
    finally:
        synthesizer.close()
def process_multithread(client, appkey, token, number):
    thread_list = []
    for i in range(0, number):
        text = "这是线程" + str(i) + "的合成。"
        audio_name = "sy_audio_" + str(i) + ".wav"
        thread = threading.Thread(target=process, args=(client, appkey, token, text, audio_name))
        thread_list.append(thread)
        thread.start()
    for thread in thread_list:
        thread.join()
if __name__ == "__main__":
    client = ali_speech.NlsClient()
    client.set_log_level('INFO')
    voice = 'Aixia'
    appkey = '你的appkey'
    token = '你的token'
    text = "哼!都怪你,也不哄哄人家,人家超想哭的,捶你胸口,大坏蛋!捶你胸口你好讨厌!要抱抱嘤嘤嘤哼,人家拿小拳拳捶你胸口!大坏蛋,打死你..."
    audio_name = 'audio.mp3'
    process(client, appkey, token, text, audio_name, voice)
    # 多线程示例
    # process_multithread(client, appkey, token, 2)

2.访问url获取

这种方式唯一的好处就是不用安装SDK,pip中有requests即可。 这里我自己做了一个根据句号的中文字符串切割算法,限制结束符为 句号"。" ,同时一段文字只能小于300字符(免费的情况下),进行循环获取每段语音的音频文件(voice1.mp3, voice2.mp3,·····)。 代码如下:

# encoding:utf-8
import requests
from requests.exceptions import RequestException
import urllib.parse
import urllib.request
import re
import os
headers = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36"}
def request_url(url, name):
    response = requests.get(url, headers=headers)
    print('状态码: ' ,response.status_code)
    try:
        if response.status_code == 200:
            download_voice(url, name)
        return None
    except RequestException:
        return None
def download_voice(url, name):
    if not os.path.exists('./audioFiles'):
        os.makedirs('./audioFiles')
    file_path = r'./audioFiles/{}.mp3'.format(name)
    print('正在下载:', name, '.mp3\n')
    urllib.request.urlretrieve(url, file_path)
    logging.info(name, '.mp3下载完成!!!!!!!!!')
def not_empty(s):
    return s and s.strip()
def cut_text(text, length):
    text = re.sub('[\r\n\t]', '', text)
    text_array = list(filter(not_empty, text.split('。')))
    text_i = [0]
    text_len = 0
    list_1 = []
    for i in range(len(text_array)):
        list_1.append(i)
        text_len = text_len + len(text_array[i])
        # print(text_len)
        if text_len > length:
            text_len = 0
            text_len = text_len + len(text_array[i])
            # print(text_len)
            text_i.append(i-1)
            list_1.clear()
    if text_i[-1] < (len(text_array) -1):
        text_i.append(len(text_array) -1)
    # print(text_i)
    new_text_i = []
    for i in range(len(text_i) - 1):
        list1 = []
        for a in range(text_i[i] + 1, text_i[i+1] + 1):
            list1.append(a)
        new_text_i.append(list1)
    new_text_i[0].insert(0, 0)
    # print(new_text_i)
    new_text_array = []
    for t in new_text_i:
        x = ''
        for t1 in range(len(t)):
            x += text_array[t[t1]] + '。'
        new_text_array.append(x)
    return new_text_array
def get_voice(appkey, token, voice, speech_rate, format, volume, file_name, text, id):
    url = 'https://nls-gateway.cn-shanghai.aliyuncs.com/stream/v1/tts?appkey=' + appkey \
          + '&token=' + token + '&format=' + format + '&voice=' + voice + '&speech_rate=' + \
          str(speech_rate) + '&volume=' + str(volume) + '&text=' + text
    request_url(url, file_name + str(id))
def get_network():
    response = requests.get('https://www.baidu.com')
    return response.status_code
def get_token_expire(appkey, token):
    url = 'https://nls-gateway.cn-shanghai.aliyuncs.com/stream/v1/tts?appkey=' + appkey \
          + '&token=' + token + '&text=你好'
    response = requests.get(url, headers=headers)
    return response.status_code
def compose(appkey, token, voice, speech_rate, format, volume, file_name, text):
    if get_network() == 200:
        res = get_token_expire(appkey, token)
        if res != 400:
            if len(text) < 300:
                get_voice(appkey, token, voice, speech_rate, format, volume, file_name, urllib.parse.quote(text), 0)
            else:
                text_array = cut_text(text, 300)
                # print(text_array)
                for id in range(len(text_array)):
                    get_voice(appkey, token, voice, speech_rate, format, volume, file_name, urllib.parse.quote(text_array[id]), id)
            return 'success'
        else:
            return 'token expired'
    else:
        return 'network fail'
if __name__ == '__main__':
    voice = 'Aixia'
    appkey = 'VNSQETOK5RRVSeRH'
    token = '0f3947bec58446c581dc46544bb3224e'
    speech_rate = -200
    format = 'mp3'