关于 character-naming
面向写作者的角色命名技能,可诊断重复命名和角色名混淆,并生成符合文化或风格的名字。它通过精选姓名列表、音素预设和脚本生成,而非依赖语言模型的常见默认值。
主要功能
- 01诊断常见命名问题
- 02从文化姓名列表生成名字
- 03用音素预设生成奇幻名字
- 04追踪角色名碰撞与分布
- 05支持全名和 JSON 输出
适用场景
- 01为历史或当代小说命名角色
- 02为奇幻文化创建一致的名字
- 03替换过度重复的名字
- 04检查角色名是否发音相近
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ jwynia/ agent-skills --skill character-naming安装后在 Claude Code 中输入/character-naming确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
data/_meta.jsondata/cultures/anglo-given-female.jsonanglo-given-male.jsonanglo-given.jsonanglo-surnames.jsonarabic-given-female.jsonarabic-given-male.jsonarabic-given.jsonarabic-surnames.jsonchinese-given-female.jsonchinese-given-male.jsonchinese-given.jsonchinese-surnames.jsoneastern-european-given-female.jsoneastern-european-given-male.jsoneastern-european-given.jsoneastern-european-surnames.jsonfilipino-given-female.jsonfilipino-given-male.jsonfilipino-given.jsonfilipino-surnames.jsonhispanic-given-female.jsonhispanic-given-male.jsonhispanic-given.jsonhispanic-surnames.jsonjapanese-given-female.jsonjapanese-given-male.jsonjapanese-given.jsonjapanese-surnames.jsonjewish-given-female.json详细介绍
角色命名:打破“陈”泛滥
帮助作家生成摆脱大模型统计默认值的角色姓名。你的职责是诊断命名问题、为生成提供外部熵,并追踪角色阵容的一致性。
核心原则
大模型默认选择统计中位数。外部熵是唯一的解法。
当用户要求“多样化”的姓名时,大模型会针对每个感知到的类别,生成训练数据中出现频率最高的姓名。“陈”反复出现,是因为它是“东亚姓氏”的统计中心。受到纠正后,大模型会“跳到另一个中位数”——改用另一个族群中最常见的姓名,而不是真正提供多样性。
解决办法:绝不让大模型挑选姓名。使用经过筛选的列表,并进行真正的随机化。
各种状态
状态 CN1:没有上下文
症状: 用户想要角色姓名,却还没有设定背景、文化或时代。比如只说“给我一些名字”,没有提供任何上下文。 关键问题:
- 类型和背景是什么?
- 故事发生在哪个时代?
- 这个世界中有哪些文化?
- 角色阵容应当有多大程度的多样性? 干预措施: 生成姓名前先询问背景。不要默认采用“当代美国式多元化”。
状态 CN2:“陈”泛滥
症状: 姓名集中在统计中位数附近。多个角色的姓氏都是 Chen、Patel、Garcia、Kim 等。名字重复出现 Maya、Marcus、Sofia、Aiden 等模式。角色阵容感觉像是由算法生成的。 关键问题:
- 你的背景设定中,各文化的实际分布是什么?
- 你是否已定义有哪些文化,以及各自所占的比例?
- 你已经用过哪些姓名? 干预措施: 使用文化姓名列表,并通过外部随机化。绝不要让大模型“推荐”姓名——始终使用熵源抽取。
状态 CN3:文化不协调
症状: 奇幻/科幻作品中,同一虚构文化的姓名听起来毫无关联。“Kael”、“Zephyrine”和“Bob”出现在同一个王国。姓名仿佛从不同的审美类别中随意拼凑而来。 关键问题:
- 这种虚构文化是否定义了音系规则?
- 命名惯例是什么(父名制、描述性命名、氏族制)?
- 如果有的话,这种虚构文化受哪些现实文化启发? 干预措施: 使用音素预设,保持发音模式一致。对于复杂文化,可考虑使用 conlang 技能(如果有)。
状态 CN4:角色姓名冲突
症状: 多个角色的姓名相似。Sarah/Sara、Mike/Mark/Michael、Lee/Leigh。读者会混淆角色。姓名的起始音相同,或节奏相似。 关键问题:
- 这个项目中已经用了哪些姓名?
- 哪些起始音出现得过于频繁?
- 角色阵容中哪些音节模式占主导? 干预措施: 确定姓名前,先运行角色阵容追踪器分析。检查发音特征,确保姓名具有辨识度。
状态 CN5:角色与姓名不匹配
症状: 姓名与角色的背景、身份或故事逻辑不符。在历史背景中使用现代姓名。角色的出身与其文化背景不符。姓名引发的联想削弱了角色形象。 关键问题:
- 这个角色在故事中的文化背景是什么?
- 他们出生于哪个时代?
- 姓名应传达哪些阶级/地位信号?
- 是否有需要避开的特定联想? 干预措施: 添加明确约束后重新生成。时代背景小说应使用历史姓名列表。
状态 CN6:多元背景设定
症状: 当代或历史背景中包含多个现实文化群体。需要真实地呈现多元文化,避免沦为象征性点缀。各群体的比例显得生硬或不切实际。 关键问题:
- 这种背景设定中,现实的文化构成是什么?
- 什么样的比例才显得真实(而非“每种文化各一个”)?
- 是否存在构成各异的社区或街区? 干预措施: 首先确定文化分布。使用加权池,或按地点进行混合。
诊断流程
- 倾听症状 — 确定适用的状态
- 了解背景 — 在生成任何内容前,先确认设定、时代和文化
- 检查现有角色阵容 — 已经确定了哪些名字?
- 选择生成模式:
- 当代/历史:使用文化姓名列表
- 奇幻/科幻:使用音素预设
- 混合:先定义分布,再按文化生成
- 通过熵生成 — 运行脚本,绝不要“想出”名字
- 与角色阵容核对 — 最终确定前检查是否有重名
可用工具
character-name.ts
根据精选列表或音素模式生成姓名。
# Contemporary/historical from cultural lists
deno run --allow-read scripts/character-name.ts --culture chinese --gender female
deno run --allow-read scripts/character-name.ts --culture anglo --count 5
deno run --allow-read scripts/character-name.ts --pool contemporary-american --count 10
# Fantasy from phoneme presets
deno run --allow-read scripts/character-name.ts --fantasy elvish-like --count 10
deno run --allow-read scripts/character-name.ts --fantasy harsh-fantasy --syllables 2-3
# With cast collision checking
deno run --allow-read scripts/character-name.ts --culture korean --cast project-cast.json
选项:
--culture <name>— 使用指定的文化姓名库(chinese、anglo、hispanic 等)--pool <name>— 使用混合姓名库(contemporary-american 等)--fantasy <preset>— 根据音素预设生成(elvish-like、harsh-fantasy、neutral)--gender <m|f|n>— 在可用时按性别筛选姓名列表--count <n>— 生成的姓名数量(默认:5)--syllables <range>— 奇幻姓名的音节范围(例如:"2-3")--cast <file>— 用于检查重名的角色阵容跟踪器 JSON 文件路径--full-name— 生成名和姓的组合--json— 以 JSON 格式输出
cast-tracker.ts
管理角色阵容跟踪,以检测重名并分析分布。
# Initialize new project
deno run --allow-read --allow-write scripts/cast-tracker.ts init "Novel Title"
# Add character to tracking
deno run --allow-read --allow-write scripts/cast-tracker.ts add "Sarah Chen" --role protagonist --culture chinese-american
# Check if a name collides with existing cast
deno run --allow-read scripts/cast-tracker.ts check "Marcus"
# View current distribution
deno run --allow-read scripts/cast-tracker.ts distribution
# Get suggestions for underrepresented cultures
deno run --allow-read scripts/cast-tracker.ts suggest
反面模式
又是陈
问题: 把“Chen”改成“Kim”或“Patel”仍然是在热门名字之间来回切换。你只是在各个族裔群体中轮流选用最热门的名字。 解决方法: 绝不要让大模型提出替代选项。使用熵脚本从列表深处抽取名字。
多样性打勾
问题: 每个族裔恰好添加一个角色,会显得像是在做表面文章。角色阵容读起来就像一张多样性合规表格。 解决方法: 根据设定逻辑确定文化分布。以首尔为背景的故事不该每种文化都有一个角色。以伦敦为背景的故事则可以有充分理由呈现真正的多样性。
难以读写的奇幻姓名
问题: 生成的奇幻姓名难以阅读或念出。“Xzylthrix”会破坏沉浸感。 解决方法: 使用带有易读性约束的音素预设。限制辅音连缀。通过大声朗读来测试。
角色阵容重名
问题: 读者会把 Mark 和 Mike、Sarah 和 Sara、Lee 和 Leigh 搞混。相似的读音会让名字模糊不清。 解决方法: 最终确定前务必运行角色阵容跟踪检查。分析读音特征——改变首辅音、音节数和重音模式。
时代错配
问题: 中世纪英格兰出现“Jennifer”。维多利亚时代伦敦出现“Jayden”。这些名字在当时并不存在。 解决方法: 使用历史姓名列表。研究名字从何时开始使用。默认选择当时常见的名字。
文化混搭
问题: 日本姓氏搭配中文名。第一代移民使用父母不可能为其取的英语化名字。 解决方法: 使用完整的文化姓名组合。考虑角色所属的世代、背景和家庭决策。
关键问题
生成前
- 设定是什么(地点、时代、文化构成)?
- 哪些名字已经确定?
- 哪些读音需要避免(重名风险)?
- 这个角色的名字是父母取的,还是自己取的?
当代背景
- 这个角色的具体文化背景是什么?
- 他们属于哪一代(移民、第二代等)?
- 该文化遵循什么命名惯例?
- 这个名字符合他们所在年龄群体的常见取名习惯吗?
历史背景
- 这个角色出生于何时何地?
- 当时当地有哪些常见名字?
- 这个名字应该体现怎样的阶级/身份?
- 是否存在命名惯例(父名制等)?
奇幻/科幻背景
- 这种文化具有什么美学风格?
- 它受到了哪些现实世界语言的启发(如果有)?
- 不同社会阶层是否有不同的命名模式?
- 是否存在命名惯例(氏族名、常用名等)?
数据文件
文化姓名库
位于 data/cultures/。所有文化都有生产级列表(每个约 100 项),包含姓氏、名字(合并)、男性名字和女性名字变体:
| 文化 | 描述 |
|---|---|
chinese | 东亚——普通话中文,包含常见和地区性姓氏 |
anglo | 英格兰/英国/美国,涵盖英国和美国传统 |
hispanic | 西班牙/拉丁美洲,具有地区多样性 |
west-african | 约鲁巴、阿坎、伊博及其他西非传统 |
south-asian | 印度教、穆斯林、锡克教及印度地区传统 |
korean | 传统和现代韩国姓名 |
japanese | 传统和现代日本姓名 |
vietnamese | 传统越南命名惯例 |
arabic | 来自中东不同地区的阿拉伯姓名 |
eastern-european | 俄罗斯、波兰、乌克兰及斯拉夫传统 |
jewish | 阿什肯纳兹、塞法迪、希伯来语、意第绪语及英语化姓名 |
filipino | 源自西班牙语的、菲律宾本土的及现代姓名 |
混合姓名库
位于 data/mixed-pools/:
contemporary-american.json— 适用于现代美国背景的加权混合姓名库
音素预设
位于 data/phoneme-presets/:
elvish-like.json— 流畅、元音丰富,包含双元音harsh-fantasy.json— 喉音、辅音丰富、塞音明显neutral.json— 均衡、易于发音、通用
交互示例
示例 1:当代小说
用户:“我需要为我的芝加哥犯罪小说中的角色取名。”
你的处理方式:
- 询问故事中具体社区的文化构成
- 询问有多少主要角色需要取名
- 询问是否已有确定的姓名
- 使用熵从适当的文化姓名库中生成姓名
- 将每个建议与角色阵容比对,检查是否冲突
脚本用法:
deno run --allow-read scripts/cast-tracker.ts init "Chicago Crime Novel"
deno run --allow-read scripts/character-name.ts --culture anglo --full-name --count 5
deno run --allow-read scripts/character-name.ts --culture hispanic --full-name --count 5
示例 2:奇幻小说
用户:“我需要为我的精灵王国取名。”
你的处理方式:
- 询问美学风格——高奇幻、黑暗还是奇趣?
- 询问是否有命名惯例(氏族名、本名等)
- 使用类精灵音素预设生成姓名
- 确保文化内部的一致性
脚本用法:
deno run --allow-read scripts/character-name.ts --fantasy elvish-like --syllables 2-3 --count 20
示例 3:检测到 Chen 泛滥
用户:“我的角色名叫 Chen Wei、Sarah Chen、Michael Chen 和 Dr. Chen。”
**你的诊断:**状态 CN2 — Chen 泛滥。四个角色使用了相同的姓氏。
你的回复: “你的四个角色都姓 Chen。除非他们有亲属关系,否则这就是 Chen 泛滥——大模型默认采用了中文姓氏的统计中位数。我来使用熵生成一些替代姓名。”
脚本用法:
deno run --allow-read scripts/character-name.ts --culture chinese --count 10 --json
# Pick from deep in the list, not the top
你不会做的事
- 不要自己“想出”姓名——始终使用熵脚本
- 不要为任何文化推荐最常见的姓名
- 不要在缺乏背景信息时默认采用美国命名模式
- 不要在检查现有角色阵容之前生成姓名
- 不要假设奇幻风格就意味着“随机音节”
- 不要跳过收集背景信息的步骤
- 不要在检查冲突之前认可姓名
输出持久化
处理项目时,将角色阵容跟踪信息保存到:
- 检查是否存在
context/output-config.md,以确定首选输出位置 - 默认位置:
{project-root}/cast-tracker.json
角色文件会在不同会话间保留,并累积角色数据。
可选集成
这些技能能增强角色命名能力,但并非必需:
与 conlang 技能配合(如果可用)
对于复杂的奇幻语言,交由该技能创建音系:
# Generate full phoneme inventory with conlang
deno run --allow-read ../conlang/scripts/phonology.ts --preset elvish_like --json > custom-phonology.json
# Then use it for names
deno run --allow-read scripts/character-name.ts --phonology custom-phonology.json --count 20
与命名技能配合(如果可用)
用于从四个层面(声音、含义、文化、功能)评估具体姓名选择:
- 当某个特定姓名需要深入分析时,使用命名技能
- 角色命名负责生成;命名技能负责评估
使用 list-builder 技能(如果可用)
将入门级列表扩充至生产级时:
- 使用 list-builder 方法和研究工具
- 每个列表的目标数量为 75-150 项
- 确保维度多样(常见/不常见、区域分布)