• 使用讯飞tts+ffmpeg自动生成视频


    参考

    起因

    某日,看到一个营销号的视频说做视频日进斗金,大意是用软件识别文章小说,搭配一些图片转换成自己的视频。看完当时脑海里冒出一个念头,我也可以,于是有了这番尝试。

    方案

    首先文字方面,我选择了【聚合数据的笑话接口】(https://www.juhe.cn/docs/api/id/95),就不需要费力去自己找资源了
    其次需要将文字转换为音频,我选择了【讯飞的语音合成】,因为其有Windows离线版SDK,修改了一些就可以根据需要使用了
    最后是音频转视频方面,采用了【FFmpeg】,为视频添加了封面图与滚动字幕

    使用脚本实现自动生成视频

    准备笑话文本

    将笑话文本复制保存到一个文本中即可

    下载讯飞语音合成离线包

    • 需要注册并身份认证后在控制台下载,下载地址
    • 安装文档中使用vs运行samples中的解决方案(使用的是VS2010),若项目加载失败则升级下项目的框架版本:项目右键->重定向项目->安装最新版本即可。

    升级项目

    • 为了能够在后续可以直接调用sdk,则根据需要改动此示例即可,此处改动了入参和退出。

    tts示例代码改动

    重新生成后,找到外层bin目录下的exe,就可以直接使用tts_offline_sample hello.wav "hello word"调用程序合成文本音频到指定路径。

    合成音频示例

    将bin和libs目录拷贝到需要的地方,或者将bin目录添加到环境变量中,就可以在任意地方使用了

    下载ffmpeg

    现在已经使用tts生成了音频文件,接下来使用 ffmpeg 将音频转换为视频并且生成字幕即可得到一个新鲜出炉的视频了
    ffmpeg下载地址
    下载解压后将ffmpeg所在目录设置到环境变量,这样就可以在任意地方使用

    生成视频

    先从pixabay获取一个无版权的素材图片保存为 cover.jpg 作为封面,执行以下命令即可生成视频

    ffmpeg -y -loop 1 -i cover.jpg -i hello.wav -c:v libx264 -c:a aac -b:a 192k -shortest hello.mp4

    视频生成示例

    生成滚动字幕

    创建一个content.txt文件,写入内容“hello word,你好世界”
    x,y为坐标,根据需要调整即可,fontfile设置为中文字体,不设置,中文将会乱码,执行命令后即可得到一个带滚动字幕的视频。

    ffmpeg -y -i hello.mp4 -vf "drawtext=fontfile=C\\:/Windows/Fonts/msyh.ttc:fontcolor=ffcc00:fontsize=40:shadowx=2:shadowy=2:textfile=./content.txt:reload=1:y=h/5:x=w-(mod(8*n\,w+tw)-tw/100)" -c:a copy hellofull.mp4

    注意vf参数中的路径需要特殊处理,Replace("\\", "/").Replace(":", "\\:")

    自此,技术点已经说明完毕,后续的就是一些优化和脚本的组合了。

    图片转视频

    注意:./ 为图片目录,且 img_ 为前缀,%03d 为格式( C语言中的格式化输出 %0nd ),不足3位长度的左补齐0,即必须为img_001,img_002这种格式,并且图片需要从第一张图片开始的序号开始依次排列,图片后缀与其格式需要一致。否则都不能成功
    以下命令正确执行文件名需要为:img_001.png,img_002.png,img_003.png...
    -r 0.500 ,1/0.500= 2秒 一张图片显示
    -y 覆盖生成的文件
    ffmpeg -y -r 0.500 -i ./img_%03d.png ./output.mp4

    完整脚本

    set coverPath=F:\\Project\\JokeBox\\cover.jpg
    set contentPath=F:\\Project\\JokeBox\\content.txt
    set /P jokeContent=<%contentPath%
    set videoName=video%date:~0,4%%date:~5,2%%date:~8,2%0%time:~1,1%%time:~3,2%%time:~6,2%
    set outDic=F:\\Project\\JokeBox\\output\\%videoName%
    set voicePath=%outDic%\\voice.wav
    set videoPath=%outDic%\\video.mp4
    set videoFullPath=%outDic%\\每日笑话-%date:~5,2%-%date:~8,2%.mp4
    set srtPath=F\\:/Project/JokeBox/zimu.txt
    
    echo 音频:%voicePath% 
    echo 视频:%videoPath%
    echo 字幕:%srtPath%
    echo 文本:%jokeContent%
    
    echo 创建输出目录
    mkdir %outDic%
    
    echo 生成音频
    tts_offline_sample.exe "%voicePath%" "%jokeContent%"
    
    echo 生成视频
    ffmpeg -loop 1 -i %coverPath% -i %voicePath%  -c:v libx264 -c:a aac -b:a 192k -shortest %videoPath%
    
    echo 生成字幕
    ffmpeg -y -i %videoPath% -vf "drawtext=fontfile=C\\:/Windows/Fonts/msyh.ttc:fontcolor=ffcc00:fontsize=40:shadowx=2:shadowy=2:textfile=%srtPath%:reload=1:y=h/5:x=w-(mod(8*n\,w+tw)-tw/100)"  -c:a copy %videoFullPath%
    
    copy %contentPath% %outDic%
    
    echo 移除音频视频
    del %voicePath:\\=\%
    del %videoPath:\\=\%
    
    pause
    
  • 相关阅读:
    【零基础】极星量化入门九:找到boll的最优回测参数
    【零基础】极星量化入门八:简单的boll实盘
    【零基础】极星量化入门七:简单的boll回测
    解决element-ui中el-menu组件作为vue-router模式在刷新页面后default-active属性与当前路由页面不一致问题的方法
    vue+elementui selet框组件封装 传值
    b模块 小结
    移动端最简单的适配
    判断移动机型字符串
    前端记录cookie 点赞只能点一次
    用chrome预览微信浏览器访问需要OAuth2.0网页授权的页面 适合 微信朋友圈小游戏 HTML5小游戏 微信游戏网页
  • 原文地址:https://www.cnblogs.com/morang/p/15943065.html
Copyright © 2020-2023  润新知