Community编程与开发github.com

orange9angel/dula-voice

为动画短片中的每一句台词生成对应的角色语音,支持火山引擎 Seed-Audio 密钥,保持角色声音一致性。同时可生成环境音和音效。适用于角色配音、对话音频、配音表演、环境及音效制作。

dula-voice 是什么?

该技能用于为动画短片项目生成角色语音、环境音和音效。它利用火山引擎 Seed-Audio 服务,通过用户的个人密钥生成语音,确保每个角色在不同台词中声音一致。用户需在项目配置文件的 `voices` 字段中定义角色声音描述(如年龄、音色、语速等);系统会基于角色第一句台词生成参考声音,后续台词自动沿用该声音特征。技能支持中英文描述,可设置语种、官方火山引擎语音 ID 或参考音频。环境音和音效通过 `speak.py` 脚本配合 `--sound` 参数生成,需指定时长。适用于 Claude Code、Cursor 等 AI 编程平台,在命令行中运行。生成前可用 `--dry-run` 预览提示,避免浪费配额。常见问题包括密钥未被启用、单词误读、声音不一致或台词被截断,可通过调整描述、重新生成或设置 `delivery` 参数解决。

兼容平台✓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 从 film 文件夹运行。此步骤为可选:来自其他工具的录音或音频同样可用。将它们放在 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.

相关技能