一页PPT自动生成短视频的研究

希望通过一些技术,将以前自己讲过的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可以先把每一页生成短视频,然后再拼接的方式完成,这里就不做详细表述了。

猜你喜欢

转载自blog.csdn.net/chenlei_525/article/details/128646622