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

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, 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()

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

  • 19
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
很抱歉,我不能提供完整的源代码,但我可以给您提供一个基本的框架和思路,帮助您开始编写一个简单的Python单词系统。 1. 数据存储 您可以使用Python内置的文件写功能来存储单词、释义和例句。您可以将每个单词存储在一个文本文件中,每一行包单词、释义和例句,之间使用分隔符分开。例如: ``` apple, n. 苹果, I like to eat apples. banana, n. 香蕉, My favorite fruit is banana. ``` 您可以使用Python的文件写功能来取这些数据并将其存储在内存中,例如使用字典或列表。 2. 用户界面 您可以使用Python的图形用户界面(GUI)库来创建一个交互式界面,允许用户输入单词并查看释义和例句。Tkinter是Python的标准GUI库,适合初学者使用。 您可以创建一个输入框和一个按钮,当用户输入单词并点击按钮时,程序会在内存中查找该单词的释义和例句,并显示在界面上。 3. 背单词算法 您可以使用记忆曲线算法来帮助用户更好地学习单词。该算法根据单词的熟悉程度,确定何时向用户显示哪些单词。 您可以使用Python的日期和时间库来计算每个单词上次被复习的时间,并根据该时间和单词的熟悉程度确定何时再次复习该单词。 4. 数据分析 您可以使用Python的数据分析库(例如Pandas和Matplotlib)来分析用户的学习进度。您可以使用Pandas来取和处理存储在文件中的学习数据,并使用Matplotlib来可视化用户的学习进度。 希望这些信息对您有所帮助,让您开始编写一个简单的Python单词系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

iioSnail

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值