Community程式設計與開發github.com

orange9angel/dula-voice

為動畫短片的每一句台詞配音,使用使用者自己的火山引擎 Seed-Audio 金鑰,並保持每個角色的聲音一致性。同時也能生成環境音與音效。

dula-voice 是什麼?

這是一個專為 AI 代理(如 Claude Code)設計的技能,用於自動化動畫短片的語音生成流程。它利用使用者自己的火山引擎 Seed-Audio API 金鑰,為劇本中的每個角色生成一致的聲音,並支援環境音與音效的生成。使用者只需在 `config/film.json` 中定義角色聲音描述(如年齡、語氣、節奏),技能便會根據台詞內容與傳遞要求自動生成語音。 技能支援可選的語言、官方聲音 ID 或參考音頻,以進一步微調聲音。首次生成時,每個角色的第一句台詞會作為後續台詞的聲音參考,因此需要仔細檢查第一句的生成效果。如果不符合預期,可以修改聲音描述並重新生成,之後使用 `--only` 選項僅重新生成該角色的後續台詞。 除了語音,技能還能透過 `--sound` 參數單獨生成環境音與音效,但強烈建議指定 `--seconds` 參數以控制長度與費用。生成的音頻剪輯通常音量較低,可在 `film.json` 中設定 `level_db` 調整音量。 技能也內建了常見問題的除錯指南,例如金鑰被拒絕、詞語誤讀、角色聲音不一致或台詞結尾被截斷等情況的處理方法。它適用於角色聲音、對話音頻、配音、環境音與音效等多種場景,是動畫短片製作中不可或缺的自動化工具。

相容平台✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/orange9angel/dula-craft/tree/HEAD/skills/dula-voice

Installed? Explore more 程式設計與開發 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

在你喜歡的 AI 中提問

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

說明文件

聲音

腳本路徑相對於此 SKILL.md,而 speak.py 從影片資料夾執行。此步驟為選用:來自其他工具的音訊或錄音也可以直接使用。將它們放在 audio/voice/<台詞 ID>.wav,或在台詞上設定 file 欄位。

用對方的語言與他們交談。

設定金鑰(僅需一次)

費用由使用者自己承擔。請要求他們在自己的終端機中執行以下指令:

python <dula-start 資料夾>/scripts/configure.py

在 Claude Code 中,他們可以輸入 ! python <路徑>/configure.py。

絕對不要在對話中索取金鑰,也不要讀取或列印 ~/.dula-craft/config.env。 若要檢查是否已設定金鑰,請使用 configure.py --status。如果有人將金鑰貼到對話中,請告訴他們在控制台撤銷該金鑰並建立一個新的。

設計聲音

在 config/film.json 的頂層加入 voices:

"voices": {
  "mochi": {"desc": "一個約八歲的男孩,聰明活潑,語速快,呼吸輕盈"},
  "gran": {"desc": "一位七十歲的婦女,溫暖略帶沙啞,語速慢,咬字非常清晰"}
}

台詞可以包含 delivery 欄位:

{"id": "l03", "who": "mochi", "text": "真、真的嗎?", "delivery": "又驚又喜,第一個字顫抖,結尾上揚"}

可選的聲音欄位:lang 設定語言(預設為台詞的語言);speaker 設定官方的火山引擎聲音 ID;reference 指向使用者有權使用的參考音訊。

請使用英文或台詞的語言來撰寫 desc 和 delivery。描述聲音本身:年齡、緊繃感、氣息、節奏和重量。僅寫「快樂」無法改變聲音。不要寫「聽起來像某個演員或角色」,也不要選擇模仿知名角色或真人的聲音。聲音也存在肖像權和版權風險。

生成

python <此資料夾>/scripts/speak.py --dry-run   # 在不花費任何費用的情況下預覽提示
python <此資料夾>/scripts/speak.py

每個角色的第一句台詞會成為該角色後續台詞的聲音參考,因此請先聆聽第一句台詞。如果聽起來不對,請修改 desc 並重新生成。修改第一句台詞後,請使用 --only 重新生成該角色的後續台詞,使其跟隨新的聲音。

當你修改台詞或聲音並再次執行時,只有變更的部分會被重新生成。

環境音與音效

python <此資料夾>/scripts/speak.py --sound "一個安靜的老房間,偶爾遠處有鳥叫" --seconds 10 --out audio/sfx/room.wav

務必提供 --seconds。 計費取決於長度,若未指定,一段音訊可能長達 30 秒或更久。這只是一個近似值,非常短的請求往往會生成較長的結果。生成的音訊剪輯通常音量偏低,因此請在 film.json 中為故事音效設定 level_db(請參閱 film.json 參考)。

一次只生成一種內容。不要在同一個提示中要求同時生成對話、音效和音樂,否則你無法分別調整音量,而且口型也會對不上。

檢查結果

  • 如果可以,請聆聽。如果無法聆聽,請告訴使用者「這段音訊尚未經人耳檢查」。
  • 你可以自行檢查的事項:確認長度合理(一句短台詞長達 5 秒就是有問題)。如果有可用的語音轉文字工具(如 Whisper),請將其文字與劇本比對。非常輕微的詞語可能會遺漏,這是需要重新生成的跡象。
  • delivery 只是一個請求,並非精確的控制。尤其是停頓長度不可靠,因此如果節奏不對,請縮短台詞或重新生成。
  • 相同的提示每次都會產生不同的結果,因此出現錯誤時請重新生成。

常見問題

症狀解決方法
金鑰被拒絕,或未啟用 Audio Generation 1.0檢查該服務是否已啟用。金鑰必須來自語音控制台,Ark 金鑰無效
某個詞被誤讀重新生成,或修改該句台詞
多句台詞聽起來不像同一個人確認第一句台詞是正確的,然後使用 --only 重新生成後續台詞,或設定 speaker
台詞結尾被截斷要求更慢的 delivery,或重新生成

Individual skills in this repo

This repo contains 1 individual skill — each has its own dedicated page.

相關技能