使用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+Flask实现一个简易网页验证码登录系统案例
当今的互联网世界中,为了防止恶意访问,许多网站在登录和注册表单中都采用了验证码技术,验证码可以防止机器人自动提交表单,确保提交行为背后有一个真实的人类用户,本文将向您展示如何使用Python的Flask框架来创建一个简单的验证码登录系统2023-09-09python Jieba分词处理详解【模式,词库的添加、删除,自定义词库,失败处理等】
这篇文章主要介绍了python Jieba分词处理,结合实例形式详细分析了python 使用jieba分词的模式,词库的添加、删除,自定义词库,失败处理等相关操作技巧,需要的朋友可以参考下2023-07-07
最新评论