AI文本转语音,再也不用担心视频配音了.

简介

  • 背景
    我想要将文本,转为语音,然后配上图片,这样就可以很快生成一个视频.
    可以说是配音吧,我还是比较喜欢通过代码来自动化.所以今天就来实现一下,同时做一下分享和记录.
  • 目标
    通过python代码,自动将文本转为配音.
  • 平台
    我选择了百度平台, 对比腾讯,付费策略比较友好.阿里云应该也有类似的业务,我没去看.大家可以货比三家.
  • 百度的宣传页面
    百度长文本在线合成

在这里插入图片描述

  • 价目表
    在这里插入图片描述

代码实现调用

百度的技术文档在这里: 百度的文本转语音技术文档

在代码统计目录需要创建2个文件

  1. .env文件: 这个是密钥,在百度官网生成的.可以看代码后面的教程如何生成.
API_KEY="YPBAzQvZR71hGwuxxxxx"
SECRET_KEY="cxlVmumX2c03v9pznlB8Zxxxxxxxxxx7"
  1. text.txt文件, 这个文件里面写上你需要转为语音的内容.
学习强国,我爱中国,中国人不骗中国人.
  1. 代码调用
  2. 最后会在代码统计目录生成一个 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)



开通百度付费包

  1. 开通付费包
    百度控制台
    在这里插入图片描述

  2. 创建一个应用
    在这里插入图片描述

  3. 获取Key和ID
    在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

早睡的叶子

你的鼓励就是我的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值