使用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图片合成的示例

    python图片合成的示例

    这篇文章主要介绍了python图片合成的示例,帮助大家更好的理解和使用python,感兴趣的朋友可以了解下
    2020-11-11
  • python中json、字典的区别以及相互转换方法

    python中json、字典的区别以及相互转换方法

    在Python中我们经常会用到JSON格式的数据,而将JSON格式转化为Python的字典类型是一种常见的操作,这篇文章主要给大家介绍了关于python中json、字典的区别以及相互转换方法的相关资料,需要的朋友可以参考下
    2023-11-11
  • 用Python的Django框架编写从Google Adsense中获得报表的应用

    用Python的Django框架编写从Google Adsense中获得报表的应用

    这篇文章主要介绍了用Python的Django框架编写从Google Adsense中获得报表的应用,主要利用了官方的Google Adsense API,需要的朋友可以参考下
    2015-04-04
  • Python中的代码异常处理你掌握了吗

    Python中的代码异常处理你掌握了吗

    Python 使用称为异常(exception)的特殊对象来管理程序执行期间发生的错误,那Python中代码异常处理的相关操作你都了解了吗,本文为大家进行了详细整理,需要的可以参考下
    2023-06-06
  • Python列表生成式与生成器操作示例

    Python列表生成式与生成器操作示例

    这篇文章主要介绍了Python列表生成式与生成器操作,结合实例形式分析了Python列表生成式与生成器的功能、使用方法及相关操作技巧,需要的朋友可以参考下
    2018-08-08
  • Python Selenium实现无可视化界面过程解析

    Python Selenium实现无可视化界面过程解析

    这篇文章主要介绍了Python Selenium实现无可视化界面过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • Python深入06——python的内存管理详解

    Python深入06——python的内存管理详解

    本篇文章主要介绍了python的内存管理详解,语言的内存管理是语言设计的一个重要方面。它是决定语言性能的重要因素。有兴趣的同学可以了解一下。
    2016-12-12
  • 从Python程序中访问Java类的简单示例

    从Python程序中访问Java类的简单示例

    这篇文章主要介绍了从Python程序中访问Java类的简单示例,包括给出了在安卓开发中的一个短小示例,需要的朋友可以参考下
    2015-04-04
  • numpy中np.sort返回索引的具体使用

    numpy中np.sort返回索引的具体使用

    本文主要介绍了使用numpy中np.sort函数返回索引的详细解释和使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • pytest全局变量的使用详解

    pytest全局变量的使用详解

    全局变量是在函数外部定义的变量,所有函数内部都可以使用这个变量,本文就来介绍一下pytest全局变量的使用,感兴趣的可以了解一下
    2023-11-11

最新评论