用腾讯云语音合成(TTS)批量生成英语绘本的朗读音频

孩子进行英语启蒙,需要看很多英语绘本,而且要听配套的音频来练听力。但有些英语绘本是没有对应音频的,下面简单几步,就可以将任意英语绘本制作出对应的英语朗读音频。

先到电子书资源网站搜索这个绘本名称,如果有电子书,可以直接下载,最好是pdf格式的;

如果没有电子书,但是有实体书,比如从图书馆借的绘本,可以用手机拍照做成PDF文件。

绘本每一页拍照后,按照页码顺序选择,然后点击:更多——打印或生成PDF

点击右上角,选择:另存为PDF

选择一个文件夹,保存,然后将这个PDF文件传输到电脑。

得到绘本的PDF文件后,然后申请一个腾讯云的账号,新用户可以领取一个语音合成的免费资源包,内含800万调用字符,有效期为3个月。语音合成(Text To Speech,TTS)可以将文本转化成拟人化语音,提供多种音色选择,支持自定义音量、语速,让发音更自然、更专业、更符合场景需求。语音合成可以应用于语音导航、有声读物、机器人、语音助手、自动新闻播报等场景。

不过注意,这个语音合成-通用免费资源包不含长文本,一次最多只能支持500个英文字母的语音合成。

然后,在deepseek输入框中输入提示词:

你是一个Python编程专家,要写一个通过腾讯云的语音合成API进行批量AI英语语音合成的Python脚本,具体步骤如下:

腾讯云SecretId:XXX,SecretKey:XXX

读取文件夹“F:\aivideo”中的pdf文件,如果pdf文件是图像格式,调用Tesseract进行OCR文本识别,提取出全部的文本内容;如果不是图像格式,直接提取其全部文本内容;

对于每个pdf文件,创建一个TextToVoice基础语音合成任务(语言为英语),然后定期检查任务状态,直到任务完成或失败。完成后,将语音合成结果保存到本地文件。识别结果保存到文件夹:F:\\aivideo ,文件名为对应的pdf文件名,格式为mp3,采样率为16000 Hz

注意:

一次请求有字数限制:英文最大支持400个字母,包括标点符号在内。如果pdf文本中字母超过400个,要对文本进行拆分,然后语音合成,语音合成完成后,按顺序把语音文件合并成一个。

在保存音频文件时,需要确保传入的是字节对象而不是字符串。

如果创建任务或查询状态时发生错误,应该打印错误信息;

每一步都要输出信息到屏幕上;

输出参数

参数名称类型描述

AudioStringbase64编码的wav/mp3音频数据

示例值:UklGRlR/AABXQVZFZm10IBAAAAABAAEAgD4AAAB9AAACABAAZGF0YSx9AAD+

输出示例:

{

"Response": {

"Audio": "UklGRqRwAABXQVZFZm10IBAAAAABAAEAgD4AAAB9AAACABAAZGF0YYBwAAAA......AAAAA=",

"RequestId": "d91f1496-0514-4281-932e-15a022b67d16",

"SessionId": "session-1234",

"Subtitles": [

{

"BeginIndex": 0,

"BeginTime": 250,

"EndIndex": 1,

"EndTime": 430,

"Phoneme": "ni2",

"Text": "你"

},

{

"BeginIndex": 1,

"BeginTime": 430,

"EndIndex": 2,

"EndTime": 670,

"Phoneme": "hao3",

"Text": "好"

}

]

}

}

Deepseek生成的源代码:

import os

import time

import json

import base64

import PyPDF2

import pytesseract

from pdf2image import convert_from_path

from tencentcloud.common import credential

from tencentcloud.common.profile.client_profile import ClientProfile

from tencentcloud.common.profile.http_profile import HttpProfile

from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException

from tencentcloud.tts.v20190823 import tts_client, models

import moviepy.editor as mp

# 腾讯云API的SecretId和SecretKey

SECRET_ID = "XXX"

SECRET_KEY = "XXX"

# 文件夹路径

PDF_FOLDER = "F:\\aivideo"

def extract_text_from_pdf(pdf_path):

try:

# 尝试使用PyPDF2读取PDF文本

with open(pdf_path, 'rb') as file:

reader = PyPDF2.PdfFileReader(file)

text = ""

for page_num in range(reader.numPages):

page = reader.getPage(page_num)

text += page.extract_text()

return text

except:

# 如果失败,使用pdf2image和pytesseract进行OCR

images = convert_from_path(pdf_path)

text = ""

for image in images:

text += pytesseract.image_to_string(image, lang='eng')

return text

def split_text(text, max_length=400):

words = text.split()

chunks = []

current_chunk = []

current_length = 0

for word in words:

if current_length + len(word) + 1 > max_length:

chunks.append(' '.join(current_chunk))

current_chunk = [word]

current_length = len(word)

else:

current_chunk.append(word)

current_length += len(word) + 1

if current_chunk:

chunks.append(' '.join(current_chunk))

return chunks

def create_tts_task(client, text):

try:

req = models.TextToVoiceRequest()

params = {

"Text": text,

"SessionId": str(int(time.time())),

"ModelType": 1,

"VoiceType": 101001, # 英语女声

"SampleRate": 16000

}

req.from_json_string(json.dumps(params))

resp = client.TextToVoice(req)

return resp.Audio

except TencentCloudSDKException as err:

print(f"Error creating TTS task: {err}")

return None

def save_audio_to_file(audio, file_path):

with open(file_path, 'wb') as f:

f.write(base64.b64decode(audio))

print(f"Audio saved to {file_path}")

def merge_audio_files(file_paths, output_path):

clips = [mp.AudioFileClip(f) for f in file_paths]

final_clip = mp.concatenate_audioclips(clips)

final_clip.write_audiofile(output_path, codec='mp3')

for f in file_paths:

os.remove(f)

print(f"Merged audio saved to {output_path}")

def main():

cred = credential.Credential(SECRET_ID, SECRET_KEY)

httpProfile = HttpProfile()

httpProfile.endpoint = "http://tts.tencentcloudapi.com"

clientProfile = ClientProfile()

clientProfile.httpProfile = httpProfile

client = tts_client.TtsClient(cred, "ap-guangzhou", clientProfile)

for filename in os.listdir(PDF_FOLDER):

if filename.endswith('.pdf'):

pdf_path = os.path.join(PDF_FOLDER, filename)

print(f"Processing {pdf_path}")

text = extract_text_from_pdf(pdf_path)

if text:

chunks = split_text(text)

audio_files = []

for i, chunk in enumerate(chunks):

audio = create_tts_task(client, chunk)

if audio:

temp_file_path = os.path.join(PDF_FOLDER, f"temp_{i}.mp3")

save_audio_to_file(audio, temp_file_path)

audio_files.append(temp_file_path)

if audio_files:

output_file_path = os.path.join(PDF_FOLDER, os.path.splitext(filename)[0] + '.mp3')

merge_audio_files(audio_files, output_file_path)

else:

print(f"No text extracted from {pdf_path}")

if __name__ == "__main__":

main()

程序运行成功,pdf文本完美的转换为音频文件,朗读音色很自然,和真人非常接近。

回到腾讯云控制台,点击:语音合成资源包,可以查看刚才程序运行消耗的字符数量和剩余字符数量。

可以看到,一本简单的英文绘本消耗了3712个字符,免费的语音合成资源包支持8000000个字符,大概可以转换2000本左右英文绘本。

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

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

相关文章

三.iOS核心动画 - 关于图层几何(frame,bounds,transform,position)

引言 关于UIView的布局有一个经常被问到的问题,frame和bounds有什么区别,同样CALayer也有frame和bounds这两个属性,还有一个与UIView的center对应的position属性,本篇博客我们就来详细的探讨一下图层中的frame和bounds到底有什么…

Python酷库之旅-第三方库openpyxl(07)

目录 一、 openpyxl库的由来 1、背景 2、起源 3、发展 4、特点 4-1、支持.xlsx格式 4-2、读写Excel文件 4-3、操作单元格 4-4、创建和修改工作表 4-5、样式设置 4-6、图表和公式 4-7、支持数字和日期格式 二、openpyxl库的优缺点 1、优点 1-1、支持现代Excel格式…

十大经典排序算法——选择排序和冒泡排序

一、选择排序 1.基本思想 每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据全部排完。 2.直接选择排序 (1) 在元素集合arr[i] — arr[n - 1]中选择关键妈的最大(小…

高考十字路口:24年考生如何权衡专业与学校的抉择?

文章目录 每日一句正能量前言专业解析理工科专业商科专业人文社科专业艺术与设计专业个人经验与思考过程结论 名校效应分析名校声誉与品牌效应资源获取学术氛围就业优势个人发展结论 好专业和好学校的权衡个人职业目标行业需求教育质量资源和机会学术氛围就业优势经济和地理位置…

嵌入式学习——数据结构(单向无头链表)——day46

1. 数据结构 1.1 定义 数据结构是指计算机中数据的组织、管理和存储方式。它不仅包括数据元素的存储方式,还包括数据元素之间的关系,以及对数据进行操作的方法和算法。数据结构的选择和设计直接影响算法的效率和程序的性能,是计算机科学与编…

说一说三大运营商的流量类型,看完就知道该怎么选运营商了!

说一说三大运营商的流量类型,看完就知道该怎么选运营商了?目前三大运营商的流量类型大致分为通用流量和定向流量,比如: 中国电信:通用流量定向流量 电信推出的套餐通常由通用流量定向流量所组成,通用流量…

【Python时序预测系列】基于LSTM实现单变量时序序列多步预测(案例+源码)

这是我的第307篇原创文章。 一、引言 单站点单变量输入单变量输出多步预测问题----基于LSTM实现。 单输入就是输入1个特征变量 单输出就是预测出1个标签的结果 多步就是利用过去N天预测未来M天的结果 二、实现过程 2.1 读取数据集 # 读取数据集 data pd.read_csv(data.c…

HTML5文旅文化旅游网站模板源码

文章目录 1.设计来源文旅宣传1.1 登录界面演示1.2 注册界面演示1.3 首页界面演示1.4 文旅之行界面演示1.5 文旅之行文章内容界面演示1.6 关于我们界面演示1.7 文旅博客界面演示1.8 文旅博客文章内容界面演示1.9 联系我们界面演示 2.效果和源码2.1 动态效果2.2 源代码2.3 源码目…

笔记本电脑屏幕模糊?6招恢复屏幕清晰!

在数字化时代的浪潮中,笔记本电脑已成为我们生活、学习和工作中不可或缺的一部分。然而,当那曾经清晰明亮的屏幕逐渐变得模糊不清时,无疑给我们的使用体验蒙上了一层阴影。屏幕模糊不仅影响视觉舒适度,更可能对我们的工作效率和眼…

【AI大模型】驱动的未来:穿戴设备如何革新血液、皮肤检测与营养健康管理

文章目录 1. 引言2. 现状与挑战3. AI大模型与穿戴设备概述4. 数据采集与预处理4.1 数据集成与增强4.2 数据清洗与异常检测 5. 模型架构与训练5.1 高级模型架构5.2 模型训练与调优 6. 个性化营养建议系统6.1 营养建议生成优化6.2 用户反馈与系统优化 7. 关键血液成分与健康状况评…

WIN Semis揭幕耐湿砷化镓pHEMT技术

​犹如为无线通信领域注入了一股清新的活力。这项技术不仅支持E频带,更在晶圆级上筑起了一道坚固的防潮屏障,满足了对严苛环境条件的bHAST挑战。今日,WIN半导体公司正式公布了0.1m pHEMT技术PP10-29的测试版,预示着通信领域的新篇…

ansible 任务块以及循环

任务块 可以通过block关键字,将多个任务组合到一起可以将整个block任务组,一起控制是否要执行 # 如果webservers组中的主机系统发行版是Rocky,则安装并启动nginx [rootpubserver ansible]# vim block1.yml --- - name: block tasks hosts…

ROS2从入门到精通4-4:局部控制插件开发案例(以PID算法为例)

目录 0 专栏介绍1 控制插件编写模板1.1 构造控制插件类1.2 注册并导出插件1.3 编译与使用插件 2 基于PID的路径跟踪原理3 控制插件开发案例(PID算法)常见问题 0 专栏介绍 本专栏旨在通过对ROS2的系统学习,掌握ROS2底层基本分布式原理,并具有机器人建模和…

Go 如何使用指针灵活操作内存

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

爬虫笔记14——爬取网页数据写入MongoDB数据库,以爱奇艺为例

下载MongoDB数据库 首先,需要下载MongoDB数据库,下载的话比较简单,直接去官网找到想要的版本下载即可,具体安装过程可以看这里。 pycharm下载pymongo库 pip install pymongo然后在在python程序中我们可以这样连接MongoDB数据库…

IPD推行成功的核心要素(十三)IPD产品开发流程让企业正确地做事情

一个公司能否成功,取决于它适应市场需求和竞争环境变化的速度。公司需要不断创新,以符合客户期望并保持相关性。这意味着需要更快速地推出新产品和改进产品。简化的产品开发流程能够支持快速开发周期,帮助公司领先于市场,用优秀的…

植物大战僵尸杂交版2.1版本终于来啦!游戏完全免费

在这个喧嚣的城市里,我找到了一片神奇的绿色世界——植物大战僵尸杂交版。它不仅是一款游戏,更像是一扇打开自然奥秘的窗户,让我重新认识了植物和自然的力量。 植物大战僵尸杂交版最新绿色版下载链接: https://pan.quark.cn/s/d6…

MySQL的综合运用

MySQL版的葵花宝典,欲练此功,挥刀自。。。呃,,,说错了,是先创建两个表,分别是location表和store_info表 示例表为location表和store_info表,如下图所示: 操作一&#xf…

【C++高阶】掌握AVL树:构建与维护平衡二叉搜索树的艺术

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C “ 登神长阶 ” 🤡往期回顾🤡:STL-> map与set 🌹🌹期待您的关注 🌹🌹 ❀AVL树 📒1. AVL树…

JavaSE (Java基础):运算符

3 运算符 3.1 二元运算符 为什么下面这段代码中最后的语句中b元素要加(double)呢? 因为要计算10/40的话,他们都是int类型的在计算机中会取整,而计算机取整一般都是直接舍去小数点后面的数字,那么就会返回0&…