使用訊飛tts+ffmpeg自動生成視訊

易墨發表於2022-02-27

參考

起因

某日,看到一個營銷號的視訊說做視訊日進斗金,大意是用軟體識別文章小說,搭配一些圖片轉換成自己的視訊。看完當時腦海裡冒出一個念頭,我也可以,於是有了這番嘗試。

方案

首先文字方面,我選擇了【聚合資料的笑話介面】(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

相關文章