前言:微软的azure支持文本转语音的功能,本文将利用gpt的秘钥操作一个简单的demo,操作内容包括将文本转换为语音,以及不同句子的语音转换以达到两人对话的效果。(继续浏览本文之前请大家准备好gpt的秘钥%OPENAI_KEY%)
文字转语音简单实现
下列代码是向https://oa.api2d.net/azure/tts发送post请求;
url = "https://oa.api2d.net/azure/tts"
payload = json.dumps({
"text": text,
"voiceName":voiceName,
"embedding": embedding,
"speed" : speed,
"moderation" : moderation,
"moderation_stop" : moderation_stop
})
headers = {
'Authorization': 'Bearer %OPENAI_KEY%',
'User-Agent': 'Apifox/1.0.0 (https://apifox.com)',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
上述代码中,将headers以及payload发送给azure后会得到一个反馈response,返回的是 stream 形式的 mp3 类型文件数据。response.status_code为200时表示文字转语音成功,其中:
text:
想要进行转换的文本(string)
embedding:
向量数组。目前支持的长度是 1536,也就是 OpenAI text-embedding-ada-002 模型返回的长度,如果你使用 text-embedding-ada-002 生成向量,可以直接用在这个接口(e.g embedding = [0.1] * 1536,其中1536不是固定值,list)
voiceName:
选择语音(e.g # zh-CN-XiaoyanNeural (Female) # zh-CN-XiaoyouNeural (Female, Child # en-GB-SoniaNeural (Female), string)#当选择的音色为英文时,只能读取英文文档,如果英文文本中有中文,则会忽略掉中文,如果给的是纯中文,则无法正常保存文件 #当选择的音色为中文时,中英文都能进行读取
Speed: speed <= 0 为慢语速slow; speed = 1 为正常语速middle; speed > 1 为快语速;
slow_time = 2 * middle_time = 4 * fast_time
moderation,moderation_stop(不重要):
这两个参数判断是否对内容进行审核,默认为false.
Authorization:
添加秘钥,格式:'Bearer fk....'
User-Agent, Content-Type: 采用代码中的默认值即可
下面代码是将返回信息保存为MP3格式即实现文字转语音的功能
audio_data = response.content
print(type(audio_data))
with open("audio.mp3", "wb") as f:
f.write(audio_data)
实现两个人的对话:
选择声音
voiceName_male = "zh-CN-YunjianNeural"
voiceName_female = "zh-CN-XiaoxiaoNeural"
定义一个对话函数,参数为文本内容,音色,速度,返回一个stream 形式的 mp3 类型文件数据。
def dialogue(text, voiceName, speed):
url = "https://oa.api2d.net/azure/tts"
payload = json.dumps({
"text": text,
"voiceName":voiceName,
"embedding": embedding,
"speed" : speed,
"moderation" : moderation,
"moderation_stop" : moderation_stop
})
headers = {
'Authorization': 'Bearer %OPENAI_KEY%',
'User-Agent': 'Apifox/1.0.0 (https://apifox.com)',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
return response.content
添加一个列表,模仿对话
dialogue_list = ["我正在考虑购买一辆新车,但是我不知道从哪里开始",
"首先你需要确定你的预算和购车需求,例如你需要什么类型的车,你的日常使用频率等。",
"我的预算是50000元左右,我需要一辆小型SUV,因为我需要经常出行,但是我也需要一辆车可以适应城市道路。",
"好的,现在你可以开始搜索你感兴趣的品牌和型号,然后比较不同汽车之间的价格和功能。",
"我已经找到了一些我喜欢的品牌和型号,但是我不知道在哪里购买。",
"你可以在汽车厂商的官方网站上查找附近的经销商,也可以在一些第三方汽车销售平台上进行搜索。",
"好的,我会尝试这些方法。但是我还想知道如何谈判价格和购买保险。",
"关于交易和保险,你可以在汽车经销商处进行谈判,也可以从其他渠道获得保险报价,然后选择最优惠的选项。",
"谢谢你的建议,我会考虑这些事情。"]
调用dialogue函数,并对返回的值进行累加拼接并保存为"audio_combine.mp3",
audio_combine = b""
for i, dia in enumerate(dialogue_list):
if i % 2 == 0:
audio = dialogue(dia, voiceName_female, 1)
else:
audio = dialogue(dia, voiceName_male, 1)
audio_combine += audio
with open("audio_combine.mp3", "wb") as f:
f.write(audio_combine)
耗时21.6s