语音合成,让阿里云小姐姐为你的视频配音
轻松实现语音合成,让阿里云小姐姐为你的视频配音
本次调用的是阿里云的语音合成SDK,调用接口进行语音合成。
下面来看看具体实现步骤以及两种利用python进行语音的代码。
一、注册登录阿里云获取appkey
1.登入阿里云:https://www.aliyun.com/
2.需要实名认证才行哟
3.点击控制台
4.在搜索界面搜索智能语音交互,进入智能语音交互控制台
5.点击进入后点击我的项目–创建项目
6.随便输入项目名词和描述即可
7.即可得到项目appkey
8.点击总览,点击获取AccessToken
在其中还有很多音频可以试听,可以选择自己喜欢的声音。
这是语音合成的接口说明,不同的声音又不用的voice参数值。
https://help.aliyun.com/document_detail/84435.html?spm=a2c4g.11186623.6.591.73831e0duk4FNT
二、普通方式获得语音合成
通过将网址放入浏览器获取语音,修改自己的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://blog.youkuaiyun.com/LeeGe666/article/details/106604378
三、利用python调用SDK进行语音合成
有两种方式
1.官方SDK
第一种是调用阿里云SDK,大家可以到https://help.aliyun.com/document_detail/120699.html?spm=a2c4g.11186623.6.594.3e86259esNOsnh中了解详情及配制相关包。
下面铺上代码:
# -*- 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'
volume = 100
file_name = 'audio'
# text = '''岁月匆匆而过,悄悄回首,我已走进小学生活近六年了,念及往事,不生唏嘘。那人生道路上的无数个第一次就像波涛起伏的海浪,荡漾在我的心头。是那样的亲切而有熟悉,又是那样的美好而和谐。第一次上台表演的经历就一直使我不能忘怀。那是我在五岁第一次上台时,在上台前,我的心忐忑不安,总是无法调整出好的情绪。开始表演了,强烈的镁光灯直射下来,就像一双犀利的眼睛,盯着我喘不过气来。我就更紧张了。当我看到台下这么多人的目光聚集在我的身上,原来就担心的我一下子忘了自己的动作,傻呆呆的站在幕布旁。那一刹那,我听到的音乐就像奔驰的野马,嗡嗡作响;镁光灯则是一把锋利而尖锐的箭,射进了我的内心深处。好在这时,老师在幕布旁不断地鼓励我,小声地说:“你一定能行!”我深深的吸了一口气,很快镇静下来。我微笑着自信地走上了舞台。一上台,我就好像置于一池碧水中,身体变得那样的舒展,跳的每一个动作都是那么娴熟而自然。那音乐如潺潺的溪水,镁光灯也如正午的暖阳。我的舞姿犹如一只傲气的白天鹅在湖面上游动;又像一缕纯洁的阳光,干净而温暖;更像一直蓬勃的向日葵,正努力地向上生长。终于,我在观众们的掌声中退了场。事后,我一直在想:有自信不一定能成功。但是,如果你充满自信,就有成功的希望。自信是飞向蓝天的翅膀,是航行的船桨。在任何时候,自信都会助你一臂之力,助你到达成功的彼岸。让自己成为一个充满自信的人吧!我爱第一次,他教会了我成功的秘笈:充满自信,挑战自信。*'''
text = '''是这样的,欠款相关的情况呢,可以在您的支付宝查看,您记得处理一下这个事情。'''
res = compose(appkey, token, voice, speech_rate, format, volume, file_name, text)
print(res)
总结
通过语音合成,经常做视频配音的人压力可以小点了,阿里云的语音技术拟人化也比较高,声音也比较甜美,听起来也舒服,也不会出错,确实是一种很好的配音选择。
用第二种方法文本的字数都没有限制,大家可以放心使用。
token隔几个小时就会失效,尽量自己注册阿里云账户获取自己的!!!
这里是看到b站@JOKER鹏少的视频来的灵感,看到有这么好的语音合成技术,便把免费语音合成的代码写出来与大家分享。
同时也可以到知乎@NH4L看看语音合成的具体效果:https://zhuanlan.zhihu.com/p/123930042
参考链接:https://help.aliyun.com/document_detail/120699.html?spm=a2c4g.11174283.6.594.59e87275VzZhum
https://www.bilibili.com/video/BV1MV411f7Uc