weken.news
pexelswhisperffmpeg短影音影片自動化

只給一段錄音,AI自動配畫面剪成短影音:Pexels加Whisper實作紀錄

直接回答

只有錄音檔沒有影像也能做短影音:用Whisper轉逐字稿加逐字時間戳,把句子按語意分組,每組配一組英文查詢詞去Pexels免費影片API抓直式素材,裁成1080x1920接起來再燒字幕。我用82.2秒的錄音實作,扣掉開頭8.6秒空白、結尾4.4秒辨識幻聽、中間4.0秒氣口,產出65.5秒成品共16個鏡頭,全程26分鐘,素材成本0元。

週末哥 ·

只丟一個 82.2 秒的錄音檔,沒有任何影像素材,26 分鐘後拿到一支 65.5 秒的成品:16 個直式空景鏡頭、繁中字幕、畫面跟著內容走。素材成本 0 元。

流程是:Whisper 轉逐字稿加逐字時間戳,把句子按語意分組,每組配一組英文查詢詞去 Pexels 免費影片 API 抓直式素材,裁成 1080x1920 加慢推鏡,接起來燒字幕再疊回旁白。

中間踩了 4 個坑,其中一個讓 2 秒的素材變成 317 秒、單檔 123MB。

為什麼是「只給錄音」這個起點

一般做短影音的順序是先拍再剪。但很多內容其實是「話先想好了,畫面還不知道要拍什麼」,尤其是講觀念、講心得這種沒有具體場景可拍的題材。

這時候如果還卡在「要先去拍素材」,那支影片就永遠不會出生。

所以我想試的是反過來:話先錄,畫面交給程式去配。

82.2秒錄音檔,0個影像素材,26分鐘產出65.5秒成品,16個鏡頭,素材成本0元。畫面來自Pexels免費影片API,每小時200次額度,一支影片用15到20次。

第一步:辨識完不要直接用,先量兩頭的音量

Whisper 轉完 82.2 秒的錄音,逐字稿看起來很完整。但把音量印出來看,開頭 8.6 秒是 -45 到 -52dB,就是底噪,沒有人在講話。

結尾更麻煩。辨識結果最後多出這幾句:

  • 都沒有了
  • 感覺是兩個人
  • 也沒見過
  • ARTMRO
  • 感謝觀看

量那段的音量只有 -47 到 -51dB,跟開頭的底噪同一個層級。也就是說,這幾句是 Whisper 在靜音上自己生出來的,錄音的人根本沒講。

這件事如果沒抓到,最後成品會多出十幾秒沒有聲音、字幕卻在跑的畫面。

真正有內容的範圍是 8.62 到 77.84 秒,再扣掉中間 4.0 秒的氣口,剩下 65.2 秒。

第二步:鏡頭長度照語意,不要照秒數

我先拆了一支 IG 上同類型的影片:33.6 秒、17 個鏡頭、平均 2 秒換一次。

但如果直接照 2 秒切,出來的東西會有機械感,因為講話的節奏本來就不平均。

改成照語意分組之後,16 個鏡頭的長度從 1.5 秒到 6.7 秒都有:

  • 「我是一個失敗的人」1.5 秒,配一個人的背影,話落下去畫面就切走
  • 「我不值得被愛」1.6 秒,配窗簾自己在飄的空房間
  • 「可是很多時候 / 消失的並不是那個事情的全部 / 而只是它原來的一個形狀」三句同一個意思,共用一個山霧的畫面 6.7 秒

短句自己一個短鏡頭,長的鋪陳三句共用一個畫面。節奏跟著話走,不跟著碼表走。

第三步:查詢詞要錨定實際的句子

第一版我把查詢詞按比例平均分給字幕行,結果畫面跟話對不起來:講「AI 的能力」配到咖啡廳的女生。

原因很單純:平均切不管每句話多長,錨點會一路飄掉。

改成每個鏡頭錨定一句實際的字幕文字,畫面從那句開始、到下一組的錨點為止,才對得上。

踩到的 4 個坑

坑 1:zoompan 的 d 不是總長度。

我給每個鏡頭加了慢推鏡,寫成 d=dur*30(我以為是總畫格數)。實際上 d 的意思是「每一張輸入畫格要輸出幾張」。

結果 2 秒的素材被撐成 317 秒,單個鏡頭的檔案 123MB,整條線卡在那邊磨了 15 分鐘。影片素材要用 d=1,zoom 會沿著畫格自己累積。

坑 2:Python 呼叫 Pexels 會 403。

urllib 的預設 User-Agent 被擋。要帶 User-Agent: curl/8.4.0Accept: */*。順帶一提,不帶金鑰時大約五個查詢會通一個(打到 CDN 快取),但那不可靠,還是要申請金鑰。

坑 3:查詢詞會帶回調性完全相反的東西。

有一支講「放下」的內容,我搜 smoke drifting slow 想要煙霧慢慢飄散,抓回來是一輛跑車燒胎的煙。抽格才看到。

做法是抓完全部鏡頭之後拼成一張長圖一次看完,不要只看數量對不對。

坑 4:查詢詞盡量避開有臉的素材。

Pexels 的人物素材多半是外國面孔,配上自己的故事會很出戲。空景(海、霧、光影、走路、窗、雲)安全得多,而且更容易對上抽象的內容。

畫面怎麼對上話

實際配出來的對照,可以感覺一下這個做法的效果:

講的話配的畫面
都在躺平亂掉的床
事業上有阻礙跟困擾烏雲
平常要花費非常多時間時鐘特寫
我們以前是一起桌上的舊照片
靠到凌晨一點多夜裡的筆電
那種戰友感兩個人的剪影
很慶幸有這個能力日出

zoompan的d參數是「每張輸入畫格輸出幾張」不是總畫格數。寫成d=dur*30會把2秒素材撐成317秒、單檔123MB。影片素材要用d=1,zoom沿畫格自己累積。

結論:畫面可以外包,節奏不行

這條路走得通,而且成本是 0。但真正決定成品好不好看的不是素材庫,是兩件事:鏡頭長度有沒有跟著語意走,以及每個畫面有沒有對上它那句話。

這兩件事程式做不到,是人要先想清楚的。我目前的查詢詞還是人工對的,因為自動翻譯出來的英文在素材庫幾乎搜不到東西,而畫面對不對題就是這種片型的成敗。

要往下一步走,我會先解決素材的味道問題:改成抓自己手機裡的隨手拍建素材庫,讓畫面真的是自己的生活,而不是別人的庫存。

常見問題

只有錄音檔沒有影片素材,可以做成短影音嗎?
可以。畫面來源有三條路:免費素材網(Pexels有影片API,商用免授權免標出處)、自己手機的隨手拍、AI生影片(要付費)。我實作的是第一條,82.2秒錄音配16個Pexels直式空景鏡頭,素材成本0元。缺點是部分素材看得出是素材庫的味道,出現外國人的臉會跟自己的故事有距離。
Pexels影片API要錢嗎?怎麼申請?
免費,不用信用卡。到pexels.com/api用Google登入,填一段用途說明就直接給金鑰,大約一分鐘。額度是每小時200次、每月20000次,一支影片大概用15到20次查詢。查詢時帶orientation=portrait拿直式、size=medium避免抓4K浪費頻寬。
為什麼Python呼叫Pexels API會回403?
因為Python的urllib預設User-Agent被擋。要在header帶User-Agent: curl/8.4.0加Accept: */*才會通。另外實測不帶金鑰時大約五個查詢只有一個會回資料(應該是打到CDN快取),不能拿來當正式流程用,還是要申請金鑰。
鏡頭要多久換一次?
不要用固定秒數。我拆過IG上這類影片,平均約2秒一個鏡頭,但照2秒硬切會有機械感。改成照語意排:一個意思講完才換畫面。實作出來長度從1.5秒到6.7秒都有,短促的結論句自己一個1.5秒短鏡頭讓話落下去就切走,三句同一個意思共用一個畫面6.7秒。
Whisper辨識純錄音檔要注意什麼?
兩頭一定要先量音量。Whisper會在靜音上產生幻聽,我那支82.2秒的錄音,結尾4.4秒被辨識出「都沒有了 感覺是兩個人 也沒見過 ARTMRO 感謝觀看」,但那段量出來只有-47到-51dB,全部不是人講的。開頭8.6秒同理是純底噪。做法是先印兩頭每0.5秒的dB,找出真正有內容的範圍再送進流程。