使用Python制作读单词视频(含源码)

文章目录

  • 1. 项目简介
  • 2. 项目使用
    • 2.1 功能介绍
    • 2.2 使用Colab生成视频
  • 3. 项目原理介绍

1. 项目简介

项目源码地址:https://github.com/iioSnail/read_video_generation

我们经常在B站或其他视频网站上看到那种逐条读单词的视频,但他们的视频多多少少和我们的预期都不太一致。

然而,网上很难找到和自己需求符合的视频。既然找不到,那么我们就自己制作。虽然我不知道他们的视频是怎么做的,但我们程序员可以用Python做。

使用Python生成的视频效果如下:

【COCA20000词】词频背单词4001-4500

虽然目前有点丑,但我会不断迭代

2. 项目使用

2.1 功能介绍

本项目可以很方便的生成读任何中、英文的视频(若有需要也可以加入其他语言)。用户只需要上传excel,配置相应参数即可。

没有Python基础,可参考 “2.2 节 使用Colab生成视频”

项目支持的详细参数如下:

>> python gene_video.py -h
usage: gene_video.py [-h] [--filename FILENAME] [--repeat-times REPEAT_TIMES] [--interval INTERVAL] [--inner-interval INNER_INTERVAL] [--max-minutes MAX_MINUTES] [--video] [--no-video] [--background-color BACKGROUND_COLOR][--font-color FONT_COLOR] [--video-width VIDEO_WIDTH] [--video-height VIDEO_HEIGHT] [--max-font-size MAX_FONT_SIZE] [--cache-dir CACHE_DIR] [--output-dir OUTPUT_DIR]optional arguments:-h, --help            show this help message and exit--filename FILENAME   单词文件的路径--repeat-times REPEAT_TIMES重复次数--interval INTERVAL   两个单词的间隔时间(ms)--inner-interval INNER_INTERVAL单词和释义的间隔时间(ms)--max-minutes MAX_MINUTES单个音频最大时长(分钟)--video               生成视频--no-video            不生成视频--add-volume          加减音量(分贝)。例如:10是音量加10分贝,-10是减10分贝--low-pass-filter     过滤高音部分(护耳)。例如:8000表示过滤掉频率超过8k的频率--background-color BACKGROUND_COLOR视频背景色--font-color FONT_COLOR文字颜色--video-width VIDEO_WIDTH视频宽--video-height VIDEO_HEIGHT视频高--max-font-size MAX_FONT_SIZE最大字体大小--cache-dir CACHE_DIR生成的临时文件存放的目录--output-dir OUTPUT_DIR输出文件的目录

假设我们的需求为:① 读一遍中文、读一遍英文。② 屏幕上要显示例句,但不读。③ 每个单词重复两遍。

假设我们需要生成读“单词+例句”的视频,我们需要遵循以下步骤:

  1. 准备好我们的单词excel(或csv),例如:
单词中文例句例句释义
morning早上Good morning.早上好!
  1. 配置好环境(怕麻烦或不会弄可以参考2.2节使用Colab生成视频),安装相关依赖。
pip install -r requirements.txt
  1. 安装ffmpeg,代码的部分库需要依赖它。

  2. 执行命令,生成视频。

python gene_video.py --filename ./samples/xxx.xlsx \--read-columns  单词,中文 \--show-columns  单词,中文,例句,例句释义 \--repeat-times 2

2.2 使用Colab生成视频

相比本地部署,我推荐使用Colab进行视频生成。

Colab是一个Google的AI训练平台,提供Python运行环境。在不使用GPU的情况下,基本上可以免费无限使用。

主要理由有:

  • 本地部署麻烦,使用Colab可以免部署
  • 使用Colab可以挂载Google Drive,方便保存视频。
  • 项目需要用到Google Translation进行文本转语音,本地部署可能访问不了。

使用Colab只需要访问该链接,然后更改你需要的参数,运行即可。

需要想办法上Google。网络也要稳定,中间如果断网较长时间,则生成会被终止。

3. 项目原理介绍

本项目生成视频的流程如下:

读取Excel
生成图片
生成视频
文本转语音
生成音频
合成视频与音频

该流程中,主要用到了以下库:

  • pandas:用于读取Excel、CSV等
  • PIL:内置库,用于生成图片
  • pydub:用于处理音频
  • cv2:用于生成视频
  • moviepy:用于处理视频

读取文件关键代码:

import pandas as pd# 使用pandas读取excel文件
if self.args.filename.endswith(".xlsx") or "".endswith(".xls"):data = pd.read_excel(self.args.filename, dtype=str)
elif self.args.filename.endswith(".csv"):data = pd.read_csv(self.args.filename, dtype=str)# 逐行遍历,将需要用到的数据放入data_list
data_list = []
for i, row in data.iterrows():...

生成图片关键代码:

from PIL import Image, ImageDraw, ImageFontfont_file = "./assets/font.TTF"  # 加载字体文件
font_size = self._auto_font_size(text, font_file)  # 自动尝试合适的字体大小,详见源码
font = ImageFont.truetype(font_file, font_size)width, height = self.args.video_width, self.args.video_height
line_spacing = 50  # 行间距
image = Image.new("RGB", (width, height), self.args.background_color)  # 新建图片
draw = ImageDraw.Draw(image)  # 绘制图片# 定义一个绘制多行文本的box框
bbox = draw.multiline_textbbox((0, 0, width, height), text, font=font)# 第一行文本的y坐标
text_y = (height - bbox[3]) // len(lines)# 逐行绘制文字
lines = text.split('\n')
for line in lines:line_bbox = draw.textbbox((0, 0, width, height), line, font)line_width, line_height = line_bbox[2], line_bbox[3]draw.text(((width - line_width) // 2, text_y), line, font=font, fill=self.args.font_color)text_y += line_height + line_spacing  # Move to the next lineimage.save(cache_file)

生成视频的关键代码:

frame_size = 10  # 每秒10帧
width = 1920  # 视频尺寸为1920x1080
height = 1080
video = cv2.VideoWriter(str(video_file), cv2.VideoWriter_fourcc('m', 'p', '4', 'v'), frame_size, (width, height))frame = int(duration / 1000 * frame_size)  # 计算对某张图片要写入的帧数image = cv2.imread(str(image))
for _ in range(frame):video.write(image)video.release()

文本转语音关键代码:

from gtts import gTTSdef has_chinese(content: str):for char in content:if '\u4e00' <= char <= '\u9fff':return Truereturn Falsecontent = "hello"  # 要读的内容
if has_chinese(content):  # 判断内容内容中是否包含中文lang = 'zh'
else:lang = 'en'tts = gTTS(content, lang=lang, tld='us')  # tld为地区,即用哪个地区的口音(默认用us)
tts.save("XXX.mp3")  # 保存的路径

将若干单词音频合成音频,并调节相关参数:

from pydub import AudioSegment# 加载音频
audio = AudioSegment.from_mp3("XXX.mp3")
# 在该单词的音频前后各增加100ms的渐进
audio = audio.fade_in(100).fade_out(100)
# 增加一段无声的间隔,用于插入两个单词之间
interval = AudioSegment.silent(duration=500, frame_rate=audio.frame_rate)
# XXX.mp3读两遍,中间增加500ms的无声音频
audio = audio + interval + audio
# 过滤掉3000hz以上的高频部分,这样耳朵听起来舒服一些
audio = audio.low_pass_filter(3000)
# 导出wav格式
audio.export(str("output.wav"), format("wav"))

将视频和音频和起来的关键代码:

from moviepy.editor import VideoFileClip, AudioFileClipvideo = VideoFileClip(video)  # 加载视频
audio = AudioFileClip(audio)  # 加载音频
video = video.set_audio(audio)  # 设置视频的音频
# 输出文件
video.write_videofile(str(output_path), fps=10, threads=cpu_count(), logger=None)
video.close()

详细代码请参考源码:https://github.com/iioSnail/read_video_generation

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

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

相关文章

Langchain入门到实战-第三弹

Langchain入门到实战 Langchain中RAG入门官网地址Langchain概述代码演示调用RAG功能更新计划 Langchain中RAG入门 Retrieval Augmented Generation 翻译成中文是“检索增强生成” 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容不一定100%复现, 还要以官方信息…

AB5 点击消除

原题链接&#xff1a;点击消除_牛客题霸_牛客网 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 栈。 遍历字符串。如果栈为空或者当前字符与栈顶元素不等&#xff0c;就压栈。否则如果当前字符与堆顶元素相同&#xff0c;就出栈。 遍历完字符串…

SiLM5350系列带米勒钳位的单通道隔离驱动器 助力汽车与工业应用实现稳定与高效的解决方案

带米勒钳位的隔离驱动SiLM5350系列 单通道 30V&#xff0c;10A 带米勒钳位的隔离驱动 具有驱动电流更大、传输延时更低、抗干扰能力更强、封装体积更小等优势, 为提高电源转换效率、安全性和可靠性提供理想之选。 SiLM5350系列产品描述&#xff1a; SiLM5350系列是单通道隔离驱…

大数据平台搭建2024(三)

三&#xff1a;HBase安装 提前上传hbase安装包至虚拟机 1 上传、解压 tar -zxvf hbase-2.0.0-alpha2-bin.tar.gz -C /hadoop2 修改配置文件 在/hadoop/hbase-2.0.0-alpha2-bin/conf文件夹里 vi /hadoop/hbase-2.0.0-alpha2/conf/hbase-env.sh修改hbase-env.sh文件 export…

Rust语言入门第六篇-函数

文章目录 Rust 函数函数函数&#xff08;方法&#xff09;讲解1.什么是函数&#xff08;方法&#xff09;2.方法&#xff08;函数的构成&#xff09;1. 什么是形参2.什么是实参3.定义方法&#xff08;函数&#xff09;类型&#xff08;方法&#xff09;函数类型 5.方法&#xf…

如何用JAVA如何实现Word、Excel、PPT在线前端预览编辑的功能?

背景 随着信息化的发展&#xff0c;在线办公也日益成为了企业办公和个人学习不可或缺的一部分&#xff0c;作为微软Office的三大组成部分&#xff1a;Word、Excel和PPT也广泛应用于各种在线办公场景&#xff0c;但是由于浏览器限制及微软Office的不开源等特性&#xff0c;导致…

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之十二 简单人脸识别

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之十二 简单人脸识别 目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之十二 简单人脸识别 一、简单介绍 二、简单人脸识别实现原理 三、简单人脸识别案例实现简…

数据密集型应用系统设计 PDF 电子书(Martin Kleppmann 著)

简介 《数据密集型应用系统设计》全书分为三大部分&#xff1a; 第一部分&#xff0c;主要讨论有关增强数据密集型应用系统所需的若干基本原则。首先开篇第 1 章即瞄准目标&#xff1a;可靠性、可扩展性与可维护性&#xff0c;如何认识这些问题以及如何达成目标。第 2 章我们比…

MongoDB的安装配置及使用

文章目录 前言一、MongoDB的下载、安装、配置二、检验MongoDB是否安装成功三、Navicat 操作MongoDB四、创建一个集合&#xff0c;存放三个文档总结 前言 本文内容&#xff1a; &#x1f4ab; MongoDB的下载、安装、配置 &#x1f4ab; 检验MongoDB是否安装成功 ❤️ Navicat 操…

RHCE1

一.在系统中设定延迟任务要求如下 在系统中建立easylee用户&#xff0c;设定其密码为easylee 延迟任务由root用户建立 要求在5小时后备份系统中的用户信息文件到/backup中 确保延迟任务是使用非交互模式建立 确保系统中只有root用户和easylee用户可以执行延迟任务的设定 [root…

【单例模式】饿汉式、懒汉式、静态内部类--简单例子

单例模式是⼀个单例类在任何情况下都只存在⼀个实例&#xff0c;构造⽅法必须是私有的、由⾃⼰创建⼀个静态变量存储实例&#xff0c;对外提供⼀个静态公有⽅法获取实例。 目录 一、单例模式 饿汉式 静态内部类 懒汉式 反射可以破坏单例 道高一尺魔高一丈 枚举 一、单例…

[html]一个动态js倒计时小组件

先看效果 代码 <style>.alert-sec-circle {stroke-dasharray: 735;transition: stroke-dashoffset 1s linear;} </style><div style"width: 110px; height: 110px; float: left;"><svg style"width:110px;height:110px;"><cir…

【GD32】_时钟架构及系统时钟频率配置

文章目录 一、有关时钟源二、系统时钟架构三、时钟树分析四、修改参数步骤1、设置外部晶振2、选择外部时钟源。3、 设置系统主频率大小4、修改PLL分频倍频系数 学习系统时钟架构和时钟树&#xff0c;验证及学习笔记如下&#xff0c;如有错误&#xff0c;欢迎指正。主要记录了总…

力扣152. 乘积最大子数组

Problem: 152. 乘积最大子数组 文章目录 题目描述思路复杂度Code 题目描述 思路 1.初始化&#xff1a;首先&#xff0c;我们创建两个数组maxNum和minNum&#xff0c;并将它们初始化为输入数组nums。这两个数组用于存储到当前位置的最大和最小乘积。我们还需要一个变量maxProduc…

c#数据储存栈(stack)和堆(heap)的方式

C#中&#xff0c;类的数据存储是通过堆&#xff08;Heap&#xff09;和栈&#xff08;Stack&#xff09;这两种内存结构来实现的。理解这两种数据结构的工作方式有助于更好地理解C#中的数据存储机制。 栈&#xff08;Stack&#xff09; 栈是一种后进先出&#xff08;Last In,…

Python医院挂号脚本

创建一个简单的医院挂号系统通常涉及患者注册、挂号功能&#xff0c;以及医生的安排。这里我们将使用 Python 来实现一个基本的命令行挂号系统。我们将构建以下功能&#xff1a; 患者注册&#xff1a;输入患者基本信息&#xff0c;注册后保存患者信息。挂号服务&#xff1a;根…

python 一个点运算符操作的字典库:DottedDict

DottedDict 是一种特殊的数据结构&#xff0c;它结合了字典&#xff08;Dictionary&#xff09;和点符号&#xff08;Dot Notation&#xff09;访问的优点&#xff0c;为用户提供了一种更加直观和方便的方式来处理和访问嵌套的数据。在这篇文章中&#xff0c;我们将深入探讨 Do…

Java复习第二十天学习笔记(过滤器Filter),附有道云笔记链接

【有道云笔记】二十 4.8 过滤器Filter https://note.youdao.com/s/dSofip3f 一、为什么要使用过滤器 项目开发中&#xff0c;经常会用到重复代码的实现。 1、请求每个servlet都要设置编码 2、判断用户是否登录&#xff0c;只有登录了才有操作权限。 二、过滤器相关Api int…

从汇编代码理解数组越界访问漏洞

数组越界访问漏洞是 C/C 语言中常见的缺陷&#xff0c;它发生在程序尝试访问数组元素时未正确验证索引是否在有效范围内。通常情况下&#xff0c;数组的索引从0开始&#xff0c;到数组长度减1结束。如果程序尝试访问小于0或大于等于数组长度的索引位置&#xff0c;就会导致数组…

.Net ajax 接收参数

后端部分代码 一般处理程序 public void ProcessRequest(HttpContext context){context.Response.ContentType "text/plain";string str_index context.Request.Form.AllKeys.Contains("index") ? context.Request.Form["index"].ToString(…