python实现给视频添加字幕,并根据字幕添加语音


前言

最近尝试用python实现给一个视频添加字幕和语音,查了很多博客后有了一个拼拼凑凑的方法:

  1. 使用"pyttsx3"来实现“文字到音频”的转换;
  2. 使用"pydub"来对得到的音频进行加工和处理;
  3. 使用"moviepy"来合成字幕和语音文件。

(注:本篇仅作为个人小白的学习记录)


一、"pyttsx3"实现“文字到音频”的转换

pyttsx3是一个很方便的实现从“文字”到“语音”的库,安装和使用都很简单,windows下安装只需要:

	pip install pyttsx3

如果要简单实现“文字段”的语音播放也很简单:

import pyttsx3
#	语音模块初始化
engine = pyttsx3.init()
#	设置要播报的字符串
text = "哈哈哈哈哈哈"
engine.say(text)
#	等待运行
engine.runAndWait()

还可以在这基础上将音频文件保存下来:

outFile = "output.aiff"
engine.save_to_file(text, outFile)
#	注意下面这句不能少,否则无法正常生成音频文件
engine.runAndWait()

这里需要注意的一点是,使用pyttsx3能够将文字转为音频,但是其编码格式特殊,保存下来的文件也是"aiff"格式的音频文件,所以如果要使用"MP3"格式则需要pydub中的AudioSegment模块来对其进行更改:

AudioSegment.from_file(outFile).export("Python.mp3", format="mp3")

当然,我也尝试了强行利用“save_to_file”将文件保存为“MP3”格式,虽然能够正常播放,但是这个文件是存在问题的(比如后面使用pydub进行处理的时候会因为无法读入而报错)

参考博客:https://blog.csdn.net/qq_19394437/article/details/97567298?spm=1001.2014.3001.5506

二、"pydub"处理音频

1.安装

pip install pydub

安装完pydub之后还需要安装ffmpeg,可以选择去github下载安装包,我这里给出网盘分享(某位老哥分享了网盘链接,我找不到原文链接了抱歉)

链接: https://pan.baidu.com/s/1dsE8p9YL-ji48Mg0vTfaMA
提取码: irxi

解压后在bin文件夹下有以下三个文件:
在这里插入图片描述
复制bin文件路径,添加到环境变量中,然后在cmd窗口运行如下命令:

ffmpeg -version

若正常输出则代表安装完了
在这里插入图片描述
(当然这里安装完了,在后面实际使用的时候还可能会出问题)

2.测试

from pydub import AudioSegment

#	读入MP3音频文件
audio = AudioSegment.from_mp3('Python.mp3')

#	简单加一段空白(静音)片段
X = 2000	#ms
silent = AudioSegment.silent(duration=X)
new_audio = silent + audio

#	保存文件
new_audio.export("new_Python.mp3", format="mp3")

代码运行到这里一般都会报错,类似于"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 …"

我也不知道具体为什么,可能是因为环境路径的问题?
直接给出解决办法:

报错应该会给一个"pydub"中的一个叫“utils.py”文件的路径,
第一步:找到该文件
第二步:找到一个叫"which(program)"的函数
第三步:添加前面下载的"ffmpeg"的“bin”文件路径
第四步:重启电脑

补充(第三步实例):
在这里插入图片描述
重启后应该能够正常运行了。

三、“moviepy”合成字幕和音频

1.安装

pip install moviepy
#	实际上安装moviepy的时候会自动安装下面两个库
pip install imageio
pip install imageio-ffmpeg

另外需要单独安装ImageMagick软件并添加到环境变量中

2.测试

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,...]	#	字幕持续时间,自行设置
    start = [4,6,8,10,...]	#	字幕开始时间,自行设置
    position = ['bottom','center',...]	#	显示位置,自行设置
    
    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'))
    # 保存视频,注意加上参数audio_codec='aac',否则音频无声音
    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)

代码可能会有点问题,自行调试修改

参考博客:https://blog.csdn.net/dongfuguo/article/details/104939046?spm=1001.2014.3001.5506


总结

新手上路,小心谨慎,收获良多。

  • 14
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 要用Python实现视频字幕提取,需要用到一些第三方库。以下是一种使用Python和FFmpeg和pytesseract的方法: 1.安装FFmpeg和pytesseract 首先需要安装FFmpeg和pytesseract。在Windows上,可以从官方网站下载FFmpeg二进制文件并将其添加到PATH环境变量中。要安装pytesseract,可以使用pip: ``` pip install pytesseract ``` 2.导入所需库 在Python中,需要导入一些库以便进行视频字幕提取。这些库包括cv2、pytesseract、numpy和subprocess。您可以使用以下代码导入这些库: ```python import cv2 import pytesseract import numpy as np import subprocess ``` 3.提取视频帧 使用OpenCV(cv2库)加载视频文件并读取每个帧。可以使用以下代码: ```python vidcap = cv2.VideoCapture('video.mp4') success,image = vidcap.read() count = 0 while success: cv2.imwrite("frame%d.jpg" % count, image) # save frame as JPEG file success,image = vidcap.read() count += 1 ``` 上面的代码将读取名为“video.mp4”的视频文件,并将其帧保存为图像文件。将其保存到当前目录下,以图像序列的形式命名为“frame0.jpg”、“frame1.jpg”等。 4.使用pytesseract提取字幕 使用pytesseract库从每个帧中提取字幕。可以使用以下代码: ```python for i in range(count): img = cv2.imread('frame%d.jpg' % i) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) ret,thresh1 = cv2.threshold(gray,200,255,cv2.THRESH_BINARY) kernel = np.ones((1,1),np.uint8) img = cv2.dilate(thresh1,kernel,iterations = 1) img = cv2.erode(img,kernel,iterations = 1) out_below = pytesseract.image_to_string(img) print("frame ", i, " : \n") print(out_below) ``` 上面的代码将循环每个帧,将其加载为图像,将其转换为灰度图像,二值化处理,扩张和腐蚀处理以增强文本。然后,它使用pytesseract将文本从帧中提取出来,并将其打印到控制台中。 5.删除生成的图像文件 最后,需要删除生成的图像文件。可以使用以下代码: ```python for i in range(count): file = "frame%d.jpg" % i subprocess.run(['rm', file]) ``` 上面的代码将循环每个帧文件,并使用subprocess库中的rm命令删除它们。 总结 通过上述步骤,我们可以使用Python和第三方库实现视频字幕提取。您可以使用其他方法来进一步优化提取文本的过程,例如改变字幕区域的大小和位置,使用不同的图像处理技术等。 ### 回答2: 要实现视频字幕提取,可以使用Python中的一些库和工具来完成。以下是一种实现方法: 1. 安装所需库:使用Python的pip命令安装所需库,包括OpenCV、pytesseract和Pillow。 2. 导入所需库:在Python脚本中导入所需的库和模块。 3. 读取视频文件:使用OpenCV库的VideoCapture函数读取视频文件。可以使用视频的文件路径作为参数,返回一个视频对象。 4. 视频处理:在循环中,逐帧读取视频,对每一帧进行处理。 5. 图像处理:将每一帧转换为灰度图像,以便于后续的文字提取和识别。 6. 提取字幕:使用pytesseract库的image_to_string函数将图像转换为文字。可以设置适当的参数,例如语言和字符集,以获取更好的结果。 7. 文字处理:对提取的文字进行必要的处理,例如去除空格、标点和其他噪音。可以使用Python的字符串操作和正则表达式来完成。 8. 字幕保存:将处理后的字幕保存到文件中,以便后续使用或分析。 9. 释放资源:在处理完成后,记得释放所有资源,包括关闭视频对象和清理内存。 10. 运行脚本:使用Python解释器运行脚本,并观察输出和保存的字幕文件。 请注意,实际实现中可能会遇到一些挑战和问题,例如视频压缩格式、字幕样式和位置的变化等。因此,根据具体情况和需求进行适当的调整和优化。 ### 回答3: 要使用Python实现视频字幕提取,可以按照以下步骤进行操作: 1. 导入所需的库:安装并导入`moviepy`库,这是一个处理视频的强大库。 2. 加载视频文件:使用`VideoFileClip`函数加载视频文件,例如`video = VideoFileClip("video.mp4")`。 3. 提取视频中的音频:使用`audio = video.audio`提取视频音频部分。 4. 将音频转换为文字:使用语音转文本的API,如百度云、腾讯云或Google Cloud API,将音频转换为文字。调用相应的API,并传入音频文件,获得文字结果。例如,使用百度云API:`result = baidu_api.audio_to_text(audio)`。 5. 处理文字结果:根据API返回的结果,可以对文字进行处理和清洗。例如删除标点符号、过滤无关的字幕等。 6. 输出字幕:将处理后的文字结果保存为字幕文件,如SRT格式或VTT格式。可以使用库如`pysrt`或`webvtt-py`来生成字幕文件。 7. 完整代码示例: ```python from moviepy.editor import VideoFileClip import baidu_api # 假设有一个baidu_api.py文件,包含了百度云API的调用函数 # 加载视频文件 video = VideoFileClip("video.mp4") # 提取音频 audio = video.audio # 将音频转换为文字 result = baidu_api.audio_to_text(audio) # 处理文字结果 processed_text = text_processing(result) # 输出字幕文件 output_subtitles(processed_text) ``` 请注意,在实际操作中,你需要有一个有效的语音转文本的API,并将其与Python代码结合使用,以完成音频文字的转换。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值