使用Python給視頻添加字幕和語(yǔ)音的操作方法
前言
最近嘗試用python實(shí)現(xiàn)給一個(gè)視頻添加字幕和語(yǔ)音,查了很多博客后有了一個(gè)拼拼湊湊的方法:
- 使用"pyttsx3"來(lái)實(shí)現(xiàn)“文字到音頻”的轉(zhuǎn)換;
- 使用"pydub"來(lái)對(duì)得到的音頻進(jìn)行加工和處理;
- 使用"moviepy"來(lái)合成字幕和語(yǔ)音文件。
(注:本篇僅作為個(gè)人小白的學(xué)習(xí)記錄)
一、"pyttsx3"實(shí)現(xiàn)“文字到音頻”的轉(zhuǎn)換
pyttsx3是一個(gè)很方便的實(shí)現(xiàn)從“文字”到“語(yǔ)音”的庫(kù),安裝和使用都很簡(jiǎn)單,windows下安裝只需要:
pip install pyttsx3
如果要簡(jiǎn)單實(shí)現(xiàn)“文字段”的語(yǔ)音播放也很簡(jiǎn)單:
import pyttsx3 # 語(yǔ)音模塊初始化 engine = pyttsx3.init() # 設(shè)置要播報(bào)的字符串 text = "哈哈哈哈哈哈" engine.say(text) # 等待運(yùn)行 engine.runAndWait()
還可以在這基礎(chǔ)上將音頻文件保存下來(lái):
outFile = "output.aiff" engine.save_to_file(text, outFile) # 注意下面這句不能少,否則無(wú)法正常生成音頻文件 engine.runAndWait()
這里需要注意的一點(diǎn)是,使用pyttsx3能夠?qū)⑽淖洲D(zhuǎn)為音頻,但是其編碼格式特殊,保存下來(lái)的文件也是"aiff"格式的音頻文件,所以如果要使用"MP3"格式則需要pydub中的AudioSegment模塊來(lái)對(duì)其進(jìn)行更改:
AudioSegment.from_file(outFile).export("Python.mp3", format="mp3")
當(dāng)然,我也嘗試了強(qiáng)行利用“save_to_file”將文件保存為“MP3”格式,雖然能夠正常播放,但是這個(gè)文件是存在問(wèn)題的(比如后面使用pydub進(jìn)行處理的時(shí)候會(huì)因?yàn)闊o(wú)法讀入而報(bào)錯(cuò))
參考博客:https://blog.csdn.net/qq_19394437/article/details/97567298?spm=1001.2014.3001.5506
二、"pydub"處理音頻
1.安裝
pip install pydub
安裝完pydub之后還需要安裝ffmpeg,可以選擇去github下載安裝包,我這里給出網(wǎng)盤(pán)分享(某位老哥分享了網(wǎng)盤(pán)鏈接,我找不到原文鏈接了抱歉)
鏈接: https://pan.baidu.com/s/1dsE8p9YL-ji48Mg0vTfaMA
提取碼: irxi
解壓后在bin文件夾下有以下三個(gè)文件:

復(fù)制bin文件路徑,添加到環(huán)境變量中,然后在cmd窗口運(yùn)行如下命令:
ffmpeg -version
若正常輸出則代表安裝完了

(當(dāng)然這里安裝完了,在后面實(shí)際使用的時(shí)候還可能會(huì)出問(wèn)題)
2.測(cè)試
from pydub import AudioSegment
# 讀入MP3音頻文件
audio = AudioSegment.from_mp3('Python.mp3')
# 簡(jiǎn)單加一段空白(靜音)片段
X = 2000 #ms
silent = AudioSegment.silent(duration=X)
new_audio = silent + audio
# 保存文件
new_audio.export("new_Python.mp3", format="mp3")
代碼運(yùn)行到這里一般都會(huì)報(bào)錯(cuò),類(lèi)似于"RuntimeWarning: Couldn’t find ffmpeg or avconv - defaulting to ffmpeg, but may not work warn(“Couldn’t find ffmpeg or avconv - defaulting to ffmpeg, but may not work”, RuntimeWarning)”,或者是"RuntimeWarning: Couldn’t find ffprobe or …"
我也不知道具體為什么,可能是因?yàn)榄h(huán)境路徑的問(wèn)題?
直接給出解決辦法:
報(bào)錯(cuò)應(yīng)該會(huì)給一個(gè)"pydub"中的一個(gè)叫“utils.py”文件的路徑, 第一步:找到該文件 第二步:找到一個(gè)叫"which(program)"的函數(shù) 第三步:添加前面下載的"ffmpeg"的“bin”文件路徑 第四步:重啟電腦
補(bǔ)充(第三步實(shí)例):

重啟后應(yīng)該能夠正常運(yùn)行了。
三、“moviepy”合成字幕和音頻
1.安裝
pip install moviepy # 實(shí)際上安裝moviepy的時(shí)候會(huì)自動(dòng)安裝下面兩個(gè)庫(kù) pip install imageio pip install imageio-ffmpeg
另外需要單獨(dú)安裝ImageMagick軟件并添加到環(huán)境變量中
2.測(cè)試
from moviepy.editor import *
def videocaption(src_mp4, dst_mp4, dottemp):
# input:
# src_mp4: the path of wait-to-dispose video
# dst_mp4: the path of after-dispose video
# dottemp--字幕列表['text1','text2','text3',...]
# 加載視頻
video = VideoFileClip(src_mp4)
# 逐句添加字幕
time = [2,2,2,...] # 字幕持續(xù)時(shí)間,自行設(shè)置
start = [4,6,8,10,...] # 字幕開(kāi)始時(shí)間,自行設(shè)置
position = ['bottom','center',...] # 顯示位置,自行設(shè)置
txts = []
for si,sentence in enumerate(dottemp):
txt = (TextClip(sentence, fontsize=40,
font='SimHei', size=(1900, 40),
align='center', color='red')
.set_position(position[si])
.set_duration(time[si]).set_start(start[si]))
txts.append(txt)
# 合成字幕
video = CompositeVideoClip([video, *txts])
# 合成音頻
videos = video.set_audio(AudioFileClip('Python.mp3'))
# 保存視頻,注意加上參數(shù)audio_codec='aac',否則音頻無(wú)聲音
videos.write_videofile(dst_mp4, audio_codec='aac')
if __name__ == '__main__':
# 輸入輸出路徑
src_mp4 = r'input.mp4'
dst_mp4 = r'output.mp4'
# 字幕列表
dottemp = ['test1','test2','test3']
# 合成視頻
videocaption(src_mp4,dst_mp4,dottemp)
代碼可能會(huì)有點(diǎn)問(wèn)題,自行調(diào)試修改
總結(jié)
到此這篇關(guān)于使用Python給視頻添加字幕和語(yǔ)音的操作方法的文章就介紹到這了,更多相關(guān)Python視頻添加字幕和語(yǔ)音內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python基于TCP實(shí)現(xiàn)的文件下載器功能案例
這篇文章主要介紹了python基于TCP實(shí)現(xiàn)的文件下載器功能,結(jié)合具體實(shí)例形式分析了Python使用socket模塊實(shí)現(xiàn)的tcp協(xié)議下載功能客戶(hù)端與服務(wù)器端相關(guān)操作技巧,需要的朋友可以參考下2019-12-12
玩轉(zhuǎn)Python發(fā)短信的實(shí)現(xiàn)
用Python實(shí)現(xiàn)發(fā)短信功能,當(dāng)監(jiān)控到問(wèn)題出現(xiàn)時(shí),短信報(bào)警,使問(wèn)題能得到及時(shí)的處理。當(dāng)然,我相信,用Python發(fā)短信應(yīng)用場(chǎng)景不止此一處,下面我們開(kāi)始Python發(fā)短信的實(shí)現(xiàn),感興趣的朋友參考下吧2022-01-01
Pycharm運(yùn)行加載文本出現(xiàn)錯(cuò)誤的解決方法
今天小編就為大家分享一篇Pycharm運(yùn)行加載文本出現(xiàn)錯(cuò)誤的解決方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-06-06
Python中第三方庫(kù)Requests庫(kù)的高級(jí)用法詳解
雖然Python的標(biāo)準(zhǔn)庫(kù)中urllib2模塊已經(jīng)包含了平常我們使用的大多數(shù)功能,但是它的API使用起來(lái)讓人實(shí)在感覺(jué)不好。它已經(jīng)不適合現(xiàn)在的時(shí)代,不適合現(xiàn)代的互聯(lián)網(wǎng)了。而Requests的誕生讓我們有了更好的選擇。本文就介紹了Python中第三方庫(kù)Requests庫(kù)的高級(jí)用法。2017-03-03
FFT快速傅里葉變換的python實(shí)現(xiàn)過(guò)程解析
這篇文章主要介紹了FFT快速傅里葉變換的python實(shí)現(xiàn)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10
python?Socket無(wú)限發(fā)送接收數(shù)據(jù)方式
這篇文章主要介紹了python?Socket無(wú)限發(fā)送接收數(shù)據(jù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06
python基礎(chǔ)之類(lèi)屬性和實(shí)例屬性
這篇文章主要介紹了python類(lèi)屬性和實(shí)例屬性,實(shí)例分析了Python中返回一個(gè)返回值與多個(gè)返回值的方法,需要的朋友可以參考下2021-10-10

