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

news2025/2/24 23:09:49

文章目录

  • 简介
    • 代码实现调用
    • 开通百度付费包

简介

  • 背景
    我想要将文本,转为语音,然后配上图片,这样就可以很快生成一个视频.
    可以说是配音吧,我还是比较喜欢通过代码来自动化.所以今天就来实现一下,同时做一下分享和记录.
  • 目标
    通过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
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1902092.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL:如何在已经使用的数据表中增加一个自动递增的字段

目录 一、需求 二、实现步骤 &#xff08;一&#xff09;数据表students &#xff08;二&#xff09;添加整型字段 &#xff08;三&#xff09;更新SID字段的值 1、使用用户定义的变量和JOIN操作 2、用SET语句和rownum变量 &#xff08;1&#xff09;操作方法 &#x…

法向量 - 平面上的法向量和曲面上的法向量

法向量 - 平面上的法向量和曲面上的法向量 flyfish 平面上的法向量 &#xff1a; 定义了一个平面 z 0 z 0 z0。 法向量是 (0, 0, 1)&#xff0c;表示垂直于平面的向上方向。 使用 quiver 函数在平面上绘制法向量。 曲面上的法向量 &#xff1a; 定义了一个曲面 z x 2…

硬件开发工具Arduino IDE

招聘信息共享社群 关联上篇文章乐鑫ESPRESSIF芯片开发简介 Arduino IDE&#xff08;集成开发环境&#xff09;是为Arduino硬件开发而设计的一款软件&#xff0c;它提供了一个易于使用的图形界面&#xff0c;允许用户编写、编辑、编译和上传代码到Arduino开发板。Arduino IDE的…

封装日历uniapp,只显示年月不显示日

默认展示最新日期 子组件 <template><view class"date-picker"><picker mode"date" fields"month" change"onDateChange" :value"selectedDate"><view class"picker">{{ selectedDate…

SQL-DCL(三)

一.DCL介绍 DCL英文全称是Data Control Language(数据库控制语言),用来管理数据库 用户,控制数据库的访问权限。 二.两个方面 1.数据库可以由那些用户访问 2.可以访问那些内容 三.DCL-管理用户 1.查询用户 USE mysql SELECT * FROM user 2.创建用户 CREATE USER…

Raylib 坐标系

draftx 符号调整为正数 发现采样坐标系原点0&#xff0c;0 在左上角&#xff0c;正方向 右&#xff0c;下 绘制坐标系 原点0&#xff0c;0 在左下角&#xff0c;正方向 右&#xff0c;上 拖拽可得 #include <raylib.h> // 重整原因&#xff1a;解决新函数放大缩小之下…

代码随想录算法训练营第23天|LeetCode 39. 组合总和、40.组合总和II、131.分割回文串

1. LeetCode 39. 组合总和 题目链接&#xff1a;https://leetcode.cn/problems/combination-sum/description/ 文章链接&#xff1a;https://programmercarl.com/0039.组合总和.html 视频链接&#xff1a;https://www.bilibili.com/video/BV1KT4y1M7HJ 思路&#xff1a; 本题和…

【算法笔记自学】第 6 章 C++标准模板库(STL)介绍

6.1vector常见用法详解 #include <cstdio> #include <vector> using namespace std;int main() {int n, x;scanf("%d", &n);vector<int> v;for (int i 0; i < n; i) {scanf("%d", &x);v.push_back(x);}for (int i 0; i <…

方法引用详解

什么是方法引用&#xff1f;&#xff1a;针对于函数式接口中的抽象方法 为什么用方法引用&#xff1f;&#xff1a;避免代码的重复&#xff0c;简便书写&#xff0c;提高效率 在使用Lambda表达式的时候&#xff0c;我们实际上传递进去的代码就是一种解决方案&#xff1a;拿参数…

第15章 奇异值分解:习题解答及其案例

这一章初学建议看该视频学习&#xff0c;讲得歪瑞古德&#xff1a; 《统计学习方法》李航 第15章奇异值分解 1.矩阵的奇异值分解是指将 m n m \times n mn实矩阵 A A A表示为以下三个实矩阵乘积形式的运算 A U Σ V T A U \Sigma V ^ { T } AUΣVT 其中 U U U是 m m m阶正…

文件读写操作之c语言、c++、windows、MFC、Qt

目录 一、前言 二、c语言文件读写 1.写文件 2.读文件 三、c文件读写 1.写文件 2.读文件 四、windows api文件读写 1.写文件 2.读文件 五、MFC文件读写 1.写文件 2.读文件 六、Qt文件读写 1.写文件 2.读文件 七、总结 一、前言 我们在学习过程中&#xff0c…

图像分类-数据驱动方法

K近邻算法&#xff08;K-Nearest Neighbors&#xff0c;简称KNN&#xff09; KNN算法通过比较新样本与训练集中的样本的距离&#xff0c;然后根据最近的K个邻居的投票结果来决定新样本的分类。 如图所示&#xff0c;K越大的边界会更加平滑&#xff0c;本质上是根据某一样本最近…

从0到1:培训老师预约小程序开发笔记二

背景调研 培训老师预约小程序&#xff1a; 教师和学生可以更便捷地安排课程&#xff0c;并提升教学质量和学习效果&#xff0c;使之成为管理和提升教学效果的强大工具。培训老师可以在小程序上设置自己的可预约时间&#xff0c;学员可以根据老师的日程安排选择合适的时间进行预…

对接海康sdk-linux下复制jar包中resource目录的文件夹

背景 在集成海康sdk时,需要将一些组件放到项目中作为静态资源,并且海康的sdk初始化也需要加载这些静态资源,在windows下,使用一些File路径的方式是可以正确加载的,但是在linux上就会加载失败。 首先我是将海康的sdk组件放到resource下的,并且按照windows和linux设置了两…

【硬件产品经理】硬件产品手板设计

目录 简介 硬件手板 手板资料 作者简介 简介 今天来聊聊产品手板这个话题。 到了手板这个层面其实就属于产品设计细节了&#xff0c; 无论你对整个开发体系如何如何了解&#xff0c; 对公司管理流程如何如何精通。 最终都是要回归到业务细节中去的&#xff0c; 你可能…

6800和8080单片机读写时序和液晶屏接口

前言&#xff1a; 随着单片机发展&#xff0c;集成度越来越高&#xff0c;因此目前单片机较少使用RD和WR信号操作外设&#xff0c;因此很多时候&#xff0c;变成了6800和8080单片机读写液晶屏了。早期的读写本质上是对一个地址进行即时的操作&#xff0c;现在可能是等数据送到…

信号与系统-实验6-离散时间系统的 Z 域分析

一、实验目的 1、掌握 z 变换及其性质&#xff1b;了解常用序列的 z 变换、逆 z 变换&#xff1b; 2、掌握利用 MATLAB 的符号运算实现 z 变换&#xff1b; 3、掌握利用 MATLAB 绘制离散系统零、极点图的方法&#xff1b; 4、掌握利用 MATLAB 分析离散系统零、极点的方法&a…

Docker部署Seata与Nacos整合

本文来自 Apache Seata官方文档&#xff0c;欢迎访问官网&#xff0c;查看更多深度文章。 本文来自 Apache Seata官方文档&#xff0c;欢迎访问官网&#xff0c;查看更多深度文章。 Docker部署Seata与Nacos整合 Docker 部署 Seata 与 Nacos 整合 运行所使用的 demo项目地址 …

最近你悟出来什么道理?

点击上方△腾阳 关注 转载请联系授权 大家伙&#xff0c;我是腾阳。 活了近30年的我&#xff0c;终于领悟到&#xff0c;人生的旅途是一场深刻而复杂的自我发现与灵魂成长的壮丽征途。 这不仅仅是对外在世界的探索&#xff0c;更是内心深处的一场革命&#xff0c;是灵魂从懵…

移动应用开发课设——原神小助手文档(1)

2023年末&#xff0c;做的移动应用开发课设&#xff0c;分还算高&#xff0c;项目地址&#xff1a;有帮助的话&#xff0c;点个赞和星呗~ GitHub - blhqwjs/-GenShin_imp: 2023年移动应用开发课设 本文按照毕业论文要求来写&#xff0c;希望对大家有所帮助。 xxxx大学课程设计报…