Communitygithub.com

hadi-a-azeez/viral-voice

為無臉短影片添加語音旁白、逐字字幕和音效,生成最終影片。支援免費AI語音(馬拉雅拉姆語、英語、印地語、泰米爾語等多種語言)、ElevenLabs或使用者自己的錄音。

viral-voice 是什麼?

`viral-voice` 是 viral-pack 的第四個步驟,專門為無臉短影片添加專業級語音旁白、逐字字幕和音效,並輸出最終影片。它提供多種語音方案:免費的 AI 語音(使用 edge-tts 技術,支援多種印度語言)、ElevenLabs(更自然的合成語音)、以及使用者自行錄製的音訊(可逐節拍錄製以獲得最佳時間對齊)。字幕會隨語音逐字亮起,時間精確度依語音方案而異——免費語音和 ElevenLabs 可精確到字詞,而自行錄製則按音節估算。音效系統會自動添加低沉的開頭聲和安靜的滑音,並允許使用者自訂多種合成音效(如嗖嗖聲、彈出聲、敲擊聲等),無版權風險。最後,`finish.py` 會以真實語音時間渲染高品質影片、混合音效、將音量標準化至約-14 LUFS,並輸出最終的 `final.mp4`。此技能專為不同平台設計,包括 Claude Code、Cursor、Codex 等支援 Bash 和 Python 的環境,並在 SKILL.md 中提供了清晰的逐步指令和選項說明,幫助開發者高效完成短影片製作。

相容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/hadi-a-azeez/viral-agent/tree/main/skills/viral-voice

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

viral-voice 是做什麼的?

執行一次設定:bash setup.sh。本指南中的腳本與此檔案位於同一目錄,請使用它們的完整路徑。

1. 選擇語音

詢問使用者想要哪種語音,並直接說明權衡:

選項成本品質字幕時間對齊
免費語音(預設)免費清楚,略顯平淡精確,每個單詞隨朗讀亮起
ElevenLabs需付費方案或使用免費額度最自然若模型提供時間戳則精確
使用者自己的語音免費最個人化每行內估算。若按節拍錄製則更緊密

通常使用者自己的語音效果最好,因為聽得出來是認真的。無臉短影片不一定要沒聲音。

# 免費語音。馬拉雅拉姆語預設選用 Midhun。使用 --voice ml-IN-SobhanaNeural 可選擇另一種馬拉雅拉姆語語音。
python3 voice.py <project>

# ElevenLabs。需要 ELEVENLABS_API_KEY 和語音 ID。馬拉雅拉姆語需要支援它的模型,例如 eleven_v3。
python3 voice.py <project> --engine elevenlabs --voice <voice id> --model eleven_v3

# 使用者自己的錄音,一次性錄製整個腳本
python3 voice.py <project> --engine file --audio take.m4a

# 使用者自己的錄音,每個節拍一個檔案(voice/b1.m4a,voice/b2.m4a)。這樣時間對齊更精準。
python3 voice.py <project> --engine file --audio voice/

任何其他工具的輸出的音訊也可透過 --engine file 使用,因此如果有連接語音生成工具,請為每個節拍生成一個檔案,然後傳入資料夾。

對於錄音,每一行的時間是根據停頓間的單詞長度來推算的,因此在單次長錄音中,字幕可能會有約一秒的誤差。在我們對一個真實的 48 秒馬拉雅拉姆語短影片測試中,大部分字幕的誤差在半秒內。如果看起來不對,請按節拍錄製。

免費語音是透過開源工具 edge-tts,使用 Microsoft Edge 的朗讀服務。這不是官方 API,因此可能會有變動或停止服務,使用者若用於客戶或商業作品,應先查閱相關條款。如果使用者是為企業製作影片,請告知此點。

2. 需要有人聆聽

這些工具無法聽到音訊,timing.json 只顯示腳本中的單詞,永遠不會知道語音實際說了什麼。因此這裡沒有任何東西可以確認發音。請使用者聆聽 voice.wav,或者如果有連接轉錄工具,則進行轉錄並比對。如果兩者都沒有,請直接說明目前處於「未聽取」狀態。

當語音唸錯某個單詞時,請在 script.json 中對應節拍的 "tts" 屬性加入一個它會正確發音的拼寫,然後重新執行。字幕會持續使用 say。盡量保持 tts 與 say 的單詞數量相同。如果不同,voice.py 會印出提示,並且該節拍的字幕時間會變成估算值。

如果某句台詞聽起來很急促,請調整 --rate(預設 +8%)。--gap 設定節拍之間的停頓。

來自 lint_script.py 和 timing.py 的長度估算只是粗略值,可能短 10% 到 15%。實際長度是 voice.py 印出的結果。若要達到特定長度,請調整 --rate 或刪減文字,然後重新執行。

3. 再次查看畫面

真實語音已移動所有內容,因此請在最終渲染前查看:

node <viral-animate folder>/render.mjs <project> --stills beats

開啟 stills/beats.jpg。綁定到 k、d 或 kit.at 的動畫已跟上語音。任何使用固定秒數的動畫則不會跟隨,請在 scenes.js 中修正這些。

4. 音效

sfx.py 會自動執行:開頭一個低沉的撞擊聲,每個節拍變換時一個安靜的呼嘯聲。對於安靜、情感豐富的作品,請在 script.json 中設定 "sfx_auto": false 來關閉這些效果。若要添加更多音效,請列出它們,並指定在某個單詞上,以保持同步:

"sfx": [{ "beat": "b2", "word": "charger", "kind": "pop", "db": -14 }]

使用 "at": 1.1 代替 word,以指定節拍開始後的秒數。如果指定的單詞在該節拍中不存在,系統會停止並顯示明確的錯誤訊息。音效種類:

種類聽起來像適用場景
whoosh swell上升的空氣聲變化、物體飛入
swipe快速的空氣刷動聲快速移動
pop小而圓潤的爆裂聲物體出現
tick極小的乾燥滴答聲計數器、小瞬間
click清脆的開關點擊聲電燈開關、按鈕
knock指節敲木頭聲門、桌子
thump低沉的撞擊聲開場、重大揭露
stamp帶重量的硬拍打聲裁決、觀點落地

這些都是合成音效,因此沒有版權風險。此工具包不添加音樂:這樣能保持語音清晰,並避免版權警告。如果使用者想要音樂,可以在 Instagram 編輯器中添加。

5. 完成

python3 finish.py <project>

這會以真實語音時間渲染全品質的畫面,混合音效,將音量標準化至約 -14 LUFS,並寫出 final.mp4。加上 --no-render 可僅重新混音。

試用版本: 要測試其他鉤子,請複製專案資料夾,將另一個鉤子的 say 放入 b1,將其 label 放入頂層的 label,然後在複製的資料夾上執行 voice.py 和 finish.py。綁定到 k、d 或 kit.at 的動畫會跟隨。請檢查任何 kit.at 的單詞是否仍在新鉤子中。

然後前往 /viral-check。在此之前不要宣告短影片已完成。

相關技能