希望通过一些技术,将以前自己讲过的PPT转换成有解说的短视频,从而进行一些分发
旁白到语音
从文字转换成语音我们首先想到的就是TTS,这其中我也是用了各式各样的TTS,发现发音电子音非常强,听听起来很不舒服。后来发现很多云服务商都提供了文字转语音的功能,这样就是用过阿里云、华为云、科大讯飞等提供的一些服务,最后也放弃了,其实对这几个云服务没有完全的评价主要是因为付费。
最近chatGPT很火,也导致我直接想到借用AI解决这个问题。通过搜索我发现MockingBird,可以通过模拟我们提供的声音样本模拟一些发音。项目地址:MockingBird,但是MockingBird的安装并不顺利,下面我就将我的安装过程写在下面,有一些是来自官方github。
-
安装 PyTorch,直接官网下载。如果GPU不支持CUDA,请默认选择。
-
安装 ffmpeg:
brew install ffmpeg
就可以了 -
安装了Anacoda,这样我就有了多环境的python。我是用Anacoda的UI界面来管理,挺方便的,都不用看文档,你看一下界面就知道怎么用了。
-
使用Python3.8安装MockingBird,其他会遇见各式各样的问题,建议你也别折腾了,直接Python3.8(通过Anacoda的UI面积启动terminal),然后进入MockingBird代码所在目录
pip install -r requirements.txt
就可以等着安装依赖包了。 -
本步骤可以跳过:如果你遇见了
which is required to install pyproject.toml-based projects
,那么无论你怎么pip install pyproject
这个问题依旧存在,那么你需要打开另外一个terminal,然后输入xcode-select --install
,等待安装完成就好了。这里就不告诉你安装的是什么了,你一看就知道了。 -
再次
pip install -r requirements.txt
就可以等着安装依赖包就可以了。 -
安装成功后,在MockingBird根目录执行
python demo_toolbox.py
,就可以尝试用它开始生成声音了
-
这里还需要下一些先训练好的合成器(合成器可以在README-CN.md页面里找到)
-
下载完合成器后,选择自己录制的一段语音(这段音频最好完整的一句话,不要随意截取,并且要在5到8秒之间效果最好。官方提供的合成器女生声音比男生声音更好生成)
-
先选择自己的声音,然后点击synthesize only看一看生成的声纹,如果生成的声纹波纹状很明显,说明生成的发音就很清楚,否则再点击一下synthesize only重新生成,如果ok。点击Vocode only就可以听声了。我选择的合成器如下图中显示。
-
点击Export按钮就可以到处音频了。(生成也建议一句一句的生成,效果会更好一点)
-
多个导出的音频,我通过Audactivy这个软件进行的合成。
一页PPT到MP4
微软的PPT提供了导出视频功能,通过导出功能,选择导出格式为mp4完成导出。
ppt的每一页播放时长我就写了音频的时长(因为我设计的一页ppt就是一个视频)
利用moviepy库完成视频和音频的merge
利用moviepy库,给视频添加一个背景音乐,代码如下(Github仓库https://github.com/crisschan/video_merge_audio):
#!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
@File : video_merge_audio.py
@Time : 2022/12/27 15:36:57
@Author : CrissChan
@Version : 1.0
@Site : https://blog.csdn.net/crisschan
@Desc : 利用moviepy库,给视频添加一个背景音乐
'''
from moviepy.editor import *
class VideoMergeAudio(object):
def __init__(self,video_file,audio_file,duration_flag = 0) -> None:
'''
@des :构造函数
@params :
video_file视频的绝对地址和文件名
audio_file音频的绝对地址和文件名
dration_flag如果是0,那么最终视频尝试以video_file长度为准
如果是1,那么最终视频尝试以audio_file长度为准
@return : None
'''
self.video_file = video_file
self.audio_file = audio_file
self.duration_flag = duration_flag
pass
def merge(self):
'''
@des :合并视频和音频
@params :
video_file视频的绝对地址和文件名
audio_file音频的绝对地址和文件名
duration_flag如果是0,那么最终视频尝试以video_file长度为准
如果是1,那么最终视频尝试以audio_file长度为准
@return : 返回合并后的视频文件的绝对地址
'''
video_clip = VideoFileClip(self.video_file)
audio_clip = AudioFileClip(self.audio_file)
if self.duration_flag == 0:
final_clip = video_clip.set_audio(audio_clip).set_duration(video_clip.duration)
else:
final_clip = video_clip.set_audio(audio_clip).set_duration(audio_clip.duration)
final_clip.write_videofile(self.video_file[:-4]+'_merge.mp4')
if __name__ == '__main__':
vma = VideoMergeAudio('1.mp4','1.mp3',duration_flag=1)
vma.merge()
这样我就可以完成了一页PPT生成短视频的功能,那么多页PPT可以先把每一页生成短视频,然后再拼接的方式完成,这里就不做详细表述了。