使用Python制作讀單詞視頻的實現(xiàn)代碼
1. 項目簡介
我們經(jīng)常在B站或其他視頻網(wǎng)站上看到那種逐條讀單詞的視頻,但他們的視頻多多少少和我們的預期都不太一致。
然而,網(wǎng)上很難找到和自己需求符合的視頻。既然找不到,那么我們就自己制作。雖然我不知道他們的視頻是怎么做的,但我們程序員可以用Python做。
2. 項目使用
2.1 功能介紹
本項目可以很方便的生成讀任何中、英文的視頻(若有需要也可以加入其他語言)。用戶只需要上傳excel,配置相應參數(shù)即可。
項目支持的詳細參數(shù)如下:
>> 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
重復次數(shù)
--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. | 早上好! |
| … | … | … | … |
- 配置好環(huán)境(怕麻煩或不會弄可以參考2.2節(jié)使用Colab生成視頻),安裝相關依賴。
pip install -r requirements.txt
安裝ffmpeg,代碼的部分庫需要依賴它。
執(zhí)行命令,生成視頻。
python gene_video.py --filename ./samples/xxx.xlsx \ --read-columns 單詞,中文 \ --show-columns 單詞,中文,例句,例句釋義 \ --repeat-times 2
2.2 使用Colab生成視頻
相比本地部署,我推薦使用Colab進行視頻生成。
Colab是一個Google的AI訓練平臺,提供Python運行環(huán)境。在不使用GPU的情況下,基本上可以免費無限使用。
主要理由有:
- 本地部署麻煩,使用Colab可以免部署
- 使用Colab可以掛載Google Drive,方便保存視頻。
- 項目需要用到Google Translation進行文本轉語音,本地部署可能訪問不了。
使用Colab只需要訪問該鏈接,然后更改你需要的參數(shù),運行即可。
需要想辦法上Google。網(wǎng)絡也要穩(wěn)定,中間如果斷網(wǎng)較長時間,則生成會被終止。
3. 項目原理介紹
本項目生成視頻的流程如下:

讀取Excel
生成圖片
生成視頻
文本轉語音
生成音頻
合成視頻與音頻
該流程中,主要用到了以下庫:
- pandas:用于讀取Excel、CSV等
- PIL:內(nèi)置庫,用于生成圖片
- 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)
# 逐行遍歷,將需要用到的數(shù)據(jù)放入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) # 計算對某張圖片要寫入的幀數(shù)
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" # 要讀的內(nèi)容
if has_chinese(content): # 判斷內(nèi)容內(nèi)容中是否包含中文
lang = 'zh'
else:
lang = 'en'
tts = gTTS(content, lang=lang, tld='us') # tld為地區(qū),即用哪個地區(qū)的口音(默認用us)
tts.save("XXX.mp3") # 保存的路徑
將若干單詞音頻合成音頻,并調(diào)節(jié)相關參數(shù):
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制作讀單詞視頻的實現(xiàn)代碼的詳細內(nèi)容,更多關于Python讀單詞視頻的資料請關注腳本之家其它相關文章!
相關文章
windows 10下安裝搭建django1.10.3和Apache2.4的方法
最近發(fā)現(xiàn)很多教程都是在linux上搭建,windows上似乎天生不太適合,但是我還是愿意試試這個坑。下面這篇文章主要給大家介紹了在windows 10系統(tǒng)下安裝搭建django1.10.3和Apache2.4的方法,需要的朋友可以參考借鑒,下面來一起看看吧。2017-04-04
python實現(xiàn)字符串完美拆分split()的方法
今天小編就為大家分享一篇python實現(xiàn)字符串完美拆分split()的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07
Python語法糖for?else循環(huán)語句里的break使用詳解
這篇文章主要介紹了Python語法糖之for?else循環(huán)語句里的break使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-05-05
python動態(tài)網(wǎng)站爬蟲實戰(zhàn)(requests+xpath+demjson+redis)
本文主要介紹了python動態(tài)網(wǎng)站爬蟲實戰(zhàn)(requests+xpath+demjson+redis),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-09-09
Python進行word模板內(nèi)容替換的實現(xiàn)示例
本文介紹了使用Python自動化處理Word模板文檔的常用方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2025-09-09

