使用Python制作读单词视频的实现代码

 更新时间:2024年04月18日 08:33:34   作者:iioSnail  
我们经常在B站或其他视频网站上看到那种逐条读单词的视频,但他们的视频多多少少和我们的预期都不太一致,然而,网上很难找到和自己需求符合的视频,所以本文给大家介绍了使用Python制作读单词视频的实现,需要的朋友可以参考下

1. 项目简介

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

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

2. 项目使用

2.1 功能介绍

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

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

>> 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
                        输出文件的目录

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

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

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

  • 执行命令,生成视频。

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, ImageFont

font_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 line

image.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 gTTS

def has_chinese(content: str):
    for char in content:
        if '\u4e00' <= char <= '\u9fff':
            return True

    return False


content = "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, AudioFileClip

video = 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()

以上就是使用Python制作读单词视频的实现代码的详细内容,更多关于Python读单词视频的资料请关注脚本之家其它相关文章!

相关文章

  • 基于Python和C++实现删除链表的节点

    基于Python和C++实现删除链表的节点

    这篇文章主要介绍了基于Python和C++实现删除链表的节点,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • python实现csdn全部博文下载并转PDF

    python实现csdn全部博文下载并转PDF

    我们学习编程,在学习的时候,会有想把有用的知识点保存下来,我们可以把知识点的内容爬下来转变成pdf格式,方便我们拿手机可以闲时翻看,是很方便的,本文就介绍一下如何实现
    2021-06-06
  • Ubuntu20下的Django安装的方法步骤

    Ubuntu20下的Django安装的方法步骤

    这篇文章主要介绍了Ubuntu20下的Django安装的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • 关于Python函数的定义和参数

    关于Python函数的定义和参数

    这篇文章主要介绍了关于Python函数的定义和参数,Python中的函数我们可以理解成是一种具有功能的包装块,也就是封装具有某一种功能的代码块,需要的朋友可以参考下
    2023-04-04
  • 基于Python+Flask实现一个简易网页验证码登录系统案例

    基于Python+Flask实现一个简易网页验证码登录系统案例

    当今的互联网世界中,为了防止恶意访问,许多网站在登录和注册表单中都采用了验证码技术,验证码可以防止机器人自动提交表单,确保提交行为背后有一个真实的人类用户,本文将向您展示如何使用Python的Flask框架来创建一个简单的验证码登录系统
    2023-09-09
  • 详细解读Python字符串的使用与f-string

    详细解读Python字符串的使用与f-string

    这篇文章主要介绍了详细解读Python字符串的使用与f-string,在 Python 中,引号内的任何内容都是字符串,但是字符串也有很多的用法,需要的朋友一起来看看吧
    2023-04-04
  • matplotlib设置legend图例代码示例

    matplotlib设置legend图例代码示例

    这篇文章主要介绍了matplotlib设置legend图例代码示例,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • Python爬虫之必备chardet库

    Python爬虫之必备chardet库

    这篇文章主要介绍了Python爬虫之必备chardet库,文中有非常详细的代码示例,对正在学习python的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-04-04
  • python Jieba分词处理详解【模式,词库的添加、删除,自定义词库,失败处理等】

    python Jieba分词处理详解【模式,词库的添加、删除,自定义词库,失败处理等】

    这篇文章主要介绍了python Jieba分词处理,结合实例形式详细分析了python 使用jieba分词的模式,词库的添加、删除,自定义词库,失败处理等相关操作技巧,需要的朋友可以参考下
    2023-07-07
  • pycharm远程linux开发和调试代码的方法

    pycharm远程linux开发和调试代码的方法

    这篇文章主要介绍了pycharm远程linux开发和调试代码的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07

最新评论