python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python读单词视频

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

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

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

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

单词中文例句例句释义
morning早上Good morning.早上好!
pip install -r requirements.txt
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只需要访问该链接,然后更改你需要的参数,运行即可。

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

3. 项目原理介绍

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

读取Excel

生成图片

生成视频

文本转语音

生成音频

合成视频与音频

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

读取文件关键代码:

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读单词视频的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文