文章目录
- 简介
- 代码实现调用
- 开通百度付费包
简介
- 背景
我想要将文本,转为语音,然后配上图片,这样就可以很快生成一个视频.
可以说是配音吧,我还是比较喜欢通过代码来自动化.所以今天就来实现一下,同时做一下分享和记录. - 目标
通过python代码,自动将文本转为配音. - 平台
我选择了百度平台, 对比腾讯,付费策略比较友好.阿里云应该也有类似的业务,我没去看.大家可以货比三家. - 百度的宣传页面
百度长文本在线合成
- 价目表
代码实现调用
百度的技术文档在这里: 百度的文本转语音技术文档
在代码统计目录需要创建2个文件
.env
文件: 这个是密钥,在百度官网生成的.可以看代码后面的教程如何生成.
API_KEY="YPBAzQvZR71hGwuxxxxx"
SECRET_KEY="cxlVmumX2c03v9pznlB8Zxxxxxxxxxx7"
text.txt
文件, 这个文件里面写上你需要转为语音的内容.
学习强国,我爱中国,中国人不骗中国人.
- 代码调用
- 最后会在代码统计目录生成一个
data.wav
的文件,该文件就是生成的音频,可以直接播放.
import json
import os
import time
import requests
from dotenv import load_dotenv
# api 地址:
# https://ai.baidu.com/ai-doc/SPEECH/ulbxh8rbu
load_dotenv(dotenv_path = ".env",override = True)
API_KEY = os.environ.get("API_KEY")
SECRET_KEY = os.environ.get("SECRET_KEY")
print("api:", API_KEY)
print("key:", SECRET_KEY)
def query_task_status(task_id = "66891cb35d73020001d58e2a"):
url = "https://aip.baidubce.com/rpc/2.0/tts/v1/query?access_token=" + get_access_token()
payload = json.dumps({
"task_ids": [
f"{task_id}" #create获取的task_id
]
})
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.post(url, headers=headers, data=payload)
if response.json()["tasks_info"][0]["task_status"] != "Running":
print("download url: ", response.json()["tasks_info"][0]["task_result"]["speech_url"])
return response.json()["tasks_info"][0]["task_result"]["speech_url"], True
else:
print("--->wait, voice gen ing")
# print(response.json())
return None, False
def create_task(txt = "欢迎使用百度语音技术", config = None):
url = "https://aip.baidubce.com/rpc/2.0/tts/v1/create?access_token=" + get_access_token()
payload = json.dumps({
"text": f"{txt}", #待合成的文本
"format": "wav", #音频格式
"voice": 106, #音库 试听地址: https://ai.baidu.com/tech/speech/long_tts
# 基础音库:度小宇=1,度小美=0,度逍遥(基础)=3,度丫丫=4;
# 精品音库:度逍遥(精品)=5003,度小鹿=5118,度博文=106,度小童=110,度小萌=111,度米朵=103,度小娇=5。默认为度小美
"lang": "zh", #语言,固定zh
"speed": 6, #语速 取值0-15,默认为5中语速
"pitch": 5, #音调 取值0-15,默认为5中语调
"volume": 9, #音量 音量,基础音库取值0-9,精品音库取值0-15,默认为5
"enable_subtitle": 1, #是否开启字幕时间戳,取值范围0, 1, 2·· 取值范围0, 1, 2,默认为0。0表示不开启字幕时间戳,1表示开启句级别字幕时间戳,2表示开启词级别字幕时间戳
"break": 500 #段落间隔 取值 0-5000 ,单位ms,用于合成文本分段传入时设置段落间间隔。
})
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.post(url, headers=headers, data=payload)
# print(response.json())
print("create task id:", response.json()["task_id"])
return response.json()["task_id"]
def download_file(url, local_filename):
print(f"down load : {url} --> {local_filename}")
folder = os.path.dirname(__file__)
file_save_path = os.path.join(folder, local_filename)
# 发送一个HTTP GET请求到指定的URL
with requests.get(url, stream=True) as r:
# 如果请求成功(状态码为200)
r.raise_for_status()
# 打开一个本地文件以二进制写模式
with open(file_save_path, 'wb') as f:
# 分块写入内容到本地文件
for chunk in r.iter_content(chunk_size=8192):
f.write(chunk)
print(f"file save on: {file_save_path}")
return local_filename
def get_access_token():
"""
使用 AK,SK 生成鉴权签名(Access Token)
:return: access_token,或是None(如果错误)
"""
url = "https://aip.baidubce.com/oauth/2.0/token"
params = {"grant_type": "client_credentials", "client_id": API_KEY, "client_secret": SECRET_KEY}
return str(requests.post(url, params=params).json().get("access_token"))
if __name__ == '__main__':
with open("./text.txt", "r") as f:
content = f.read()
task_id = create_task(txt=content)
max_attempts = len(content) / 3 if len(content) > 5 else 5
attempts = 0
while attempts < max_attempts:
down_load_url , status = query_task_status(task_id)
if (status):
download_file(down_load_url, "data.wav")
break
else:
attempts = attempts + 1
time.sleep(1)
开通百度付费包
-
开通付费包
百度控制台
-
创建一个应用
-
获取Key和ID