前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >自动化剪视频

自动化剪视频

作者头像
赵云龙龙
发布2023-09-01 09:20:50
3400
发布2023-09-01 09:20:50
举报
文章被收录于专栏:python爱好部落python爱好部落

最近需要录制视频,讲解产品,和市场人员讲解功能点。 现在AI不是很火么,想搞个AI自动播报。 开始我尝试用pyttsx3,发现机器发声,效果不好。 想想以前折腾,别人用Edge文本播报功能做了个产品。结果去搜,需要钱了。 然后继续搜,发现有个库,直接可以用这个库来实现。 虽然这方面的介绍不多,我尝试了一下,效果还是可以的。

Edge-TTS介绍 Edge-TTS是一个Python库,该库提供了一个简单的API,可以将文本转换为语音,并且支持多种语言和声音。要使用Edge-TTS库,首先需要安装上Edge-TTS库,安装直接使用pip 进行安装即可。

终端下执行以下命令安装

代码语言:javascript
复制
pip install edge-tts

安装成功后,直接在终端运行edge-tts命令:

edge-tts 显示帮助菜单即代表安装成功:

代码语言:javascript
复制
➜  Downloads edge-tts  
usage: edge-tts [-h] [-t TEXT] [-f FILE] [-v VOICE] [-l] [--rate RATE] [--volume VOLUME] [-O OVERLAPPING]  
                [--write-media WRITE_MEDIA] [--write-subtitles WRITE_SUBTITLES] [--proxy PROXY]

随后输入命令:

代码语言:javascript
复制
edge-tts --list-voices

该命令可以将Edge浏览器中,内置的语言角色列表列出来

一望而知,几乎支持所有主流的通用语,Gender字段为合成语音的性别,Male代表男性,Female代表女性,zh开头的就是中文语音角色,这里以微软的小伊为例子:

代码语言:javascript
复制
edge-tts --voice zh-CN-XiaoyiNeural --text "你好啊,我是智能语音助手" --write-media hello_in_cn.mp3

该命令含义是通过zh-CN-XiaoyiNeural角色合成语音:"你好啊,我是智能语音助手"的内容,随后将音频流写入hello_in_cn.mp3文件。

程序返回:

代码语言:javascript
复制

Downloads edge-tts --voice zh-CN-XiaoyiNeural --text "你好啊,我是智能语音助手" --write-media hello_in_cn.mp3  
WEBVTT  
  
00:00:00.100 --> 00:00:00.525  
你好

程序会自动将时间轴和语音文本匹配输出,如此一来,连字幕文件也有了,可谓是一举两得,一箭双雕。

与此同时,我们也可以调整合成语音的语速:

代码语言:javascript
复制
edge-tts --rate=-50% --voice zh-CN-XiaoyiNeural --text "你好啊,我是智能语音助手" --write-media hello_in_cn.mp3

--rate参数可以通过加号或者减号同步加快或者减慢合成语音的语速。

亦或者,调整合成语音的音量:

代码语言:javascript
复制
edge-tts --volume=-50%  --voice zh-CN-XiaoyiNeural --text "你好啊,我是智能语音助手" --write-media hello_in_cn.mp3

python脚本语音合成 除了通过命令进行语音合成,edge-tts也支持在Python脚本,编辑test.py文件:

代码语言:javascript
复制
import edge_tts
import asyncio

TEXT = "你干嘛去了?听闻远方有你"

print(TEXT)
voice = 'zh-CN-YunyangNeural'
output = 'voicetest.mp3'
rate = '+0%'
volume = '+0%'


async def my_function():
    tts = edge_tts.Communicate(text=TEXT, voice=voice, rate=rate, volume=volume)
    await tts.save(output)


if __name__ == '__main__':
    asyncio.run(my_function())

开始使用"zh-CN-XiaoyiNeural"这个主播来播放,感觉总少了那个味,于是换"zh-CN-YunyangNeura",结果是好听多了。 也可也通过条件,来查找想要的音色

代码语言:javascript
复制
import asyncio  
import random  
  
import edge_tts  
from edge_tts import VoicesManager  
  
TEXT = "中文语音测试"  
OUTPUT_FILE ="china.mp3"  
  
  
async def _main() -> None:  
    voices = await VoicesManager.create()  
    voice = voices.find(Gender="Female", Language="zh")  
  
    communicate = edge_tts.Communicate(TEXT, random.choice(voice)["Name"])  
    await communicate.save(OUTPUT_FILE)  
  
  
if __name__ == "__main__":  
    asyncio.run(_main())

你还可以通过 --rate 和 --volume 选项来调整语速和音量,-50% 代表降低语速/音量。

代码语言:javascript
复制
edge-tts --rate=-50% --text "Hello, world!" --write-media hello_with_rate_halved.mp3
edge-tts --volume=-50% --text "Hello, world!" --write-media hello_with_volume_halved.mp3

声音问题解决了,我想给视频添加字幕,用gtp生成了代碼。但是,运行报错: "This error can be due to the fact that ImageMagick", 根本原因,是本机没装ImageMagick, 其实这个包,包含了ffmeg, 在本机上装一个ImageMagick,就解决了所有问题。 moviepy 安装之ImageMagick安装 这是因为ImageMagick没有安装

3、安装ImageMagick软件:

(1)、下载对应版本的软件:[https://www.imagemagick.org/script/index.php][https_www.imagemagick.org_script_index.php] (2)、安装好,修改moviepy包(\Lib\site-packages\moviepy\)中的config_defaults.py文件,修改之后如下:

代码语言:javascript
复制
import os
FFMPEG_BINARY = os.getenv('FFMPEG_BINARY', 'ffmpeg-imageio')
# IMAGEMAGICK_BINARY = os.getenv('IMAGEMAGICK_BINARY', 'auto-detect')  # 这是注释掉原来的
IMAGEMAGICK_BINARY = r"D:\Program Files\ImageMagick-7.0.8-Q16\magick.exe"  # 这是要添加ImageMagic的安装路径

这个问题又解决了。 要生成视频,就可以用pynimate来生成数据视频:

代码语言:javascript
复制
def generate_vedio():
    df = pd.DataFrame(
        {
            "time": ["1960-01-01", "1961-01-01", "1962-01-01"],
            "Afghanistan": [1, 2, 3],
            "Angola": [2, 3, 4],
            "Albania": [1, 2, 5],
            "USA": [5, 3, 4],
            "Argentina": [1, 4, 5],
        }
    ).set_index("time")

    cnv = nim.Canvas()
    bar = nim.Barplot(df, "%Y-%m-%d", "2d")
    bar.set_time(callback=lambda i, datafier: datafier.data.index[i].year)
    cnv.add_plot(bar)
    cnv.animate()
    cnv.save("file", 24, "gif")

最后还有一个问题,那就是保存动画,有两个格式可以选择:gif或者mp4。

保存为动图一般使用:

cnv.save("file", 24, "gif")若要保存为mp4的话,ffmpeg是个不错的选择,它是保存为mp4的标准编写器。

pip install ffmpeg-python,同样也可以使用Canvas.save()来保存。 但是即便我加了ffmpeg,仍然保存不成功,于是用import moviepy.editor 来保存的。 添加背景音乐,

代码语言:javascript
复制
def add_audio_to_vedio_in_place(audio_file, vedio_file, time_place):
   video = mp.VideoFileClip(vedio_file)
   audio = mp.AudioFileClip(audio_file)
   mixed = mp.CompositeAudioClip([audio.set_duration(video.duration).set_start(2, change_end=True)])
   # video = video.set_audio(audio.set_duration(video.duration).set_start(time_place))
   video = video.set_audio(mixed)
   video.write_videofile("new_video4.mp4")

生成字幕文件:

代码语言:javascript
复制
def generate_str():
    # 创建一个新的字幕文件
    subs = pysrt.SubRipFile()

    # 添加字幕
    subs.append(pysrt.SubRipItem(index=1, start=pysrt.SubRipTime(0, 0, 1, 0), end=pysrt.SubRipTime(0, 0, 5, 0),
                                 text="世界大战"))

    subs.append(pysrt.SubRipItem(index=2, start=pysrt.SubRipTime(0, 0, 6, 0), end=pysrt.SubRipTime(0, 0, 10, 0),
                                 text="世界和平"))

    # 保存字幕文件
    subs.save("example.srt")

添加字幕:

代码语言:javascript
复制
def add_srt(src_file, video_file):
  video = mp.VideoFileClip(video_file)
    # 获取视频的宽度和高度
    w, h = video.w, video.h
    # 所有字幕剪辑
    txts = []
    content = read_srt(src_file)
    sequences = get_sequences(content)

    for line in sequences:
        if len(line) < 3:
            continue
        sentences = line[2]
        start = line[1].split(' --> ')[0]
        end = line[1].split(' --> ')[1]

        start = strFloatTime(start)
        end = strFloatTime(end)

        start, end = map(float, (start, end))
        span = end - start
        txt = (mp.TextClip(sentences, fontsize=40,
                        font='SimHei', size=(w - 20, 40),
                        align='center', color='red')
               .set_position((10, h - 150))
               .set_duration(span)
               .set_start(start))

        txts.append(txt)
    # 合成视频,写入文件
    video = mp.CompositeVideoClip([video, *txts])
    fn, ext = splitext(video_file)
    video.write_videofile(f'{fn}_2带字幕{ext}')

这样,一个自动化视频就制作完成了。 经常看到视频,自动数据播报,或者人情世故鸡汤等,估计就是用这样批量生产的,看来我找到了流量密码。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-05-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 python粉丝团 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
语音合成
语音合成(Text To Speech,TTS)满足将文本转化成拟人化语音的需求,打通人机交互闭环。提供多场景、多语言的音色选择,支持 SSML 标记语言,支持自定义音量、语速等参数,让发音更专业、更符合场景需求。语音合成广泛适用于智能客服、有声阅读、新闻播报、人机交互等业务场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档