mcpField
C
character-naming

character-naming

github.com/jwynia创意与媒体179481 次安装35 周前更新
代码仓库

关于 character-naming

面向写作者的角色命名技能,可诊断重复命名和角色名混淆,并生成符合文化或风格的名字。它通过精选姓名列表、音素预设和脚本生成,而非依赖语言模型的常见默认值。

主要功能

  1. 01诊断常见命名问题
  2. 02从文化姓名列表生成名字
  3. 03用音素预设生成奇幻名字
  4. 04追踪角色名碰撞与分布
  5. 05支持全名和 JSON 输出

适用场景

  1. 01为历史或当代小说命名角色
  2. 02为奇幻文化创建一致的名字
  3. 03替换过度重复的名字
  4. 04检查角色名是否发音相近

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/jwynia/agent-skills --skill character-naming

安装后在 Claude Code 中输入/character-naming确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

data/
_meta.json
data/cultures/
anglo-given-female.json
anglo-given-male.json
anglo-given.json
anglo-surnames.json
arabic-given-female.json
arabic-given-male.json
arabic-given.json
arabic-surnames.json
chinese-given-female.json
chinese-given-male.json
chinese-given.json
chinese-surnames.json
eastern-european-given-female.json
eastern-european-given-male.json
eastern-european-given.json
eastern-european-surnames.json
filipino-given-female.json
filipino-given-male.json
filipino-given.json
filipino-surnames.json
hispanic-given-female.json
hispanic-given-male.json
hispanic-given.json
hispanic-surnames.json
japanese-given-female.json
japanese-given-male.json
japanese-given.json
japanese-surnames.json
jewish-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:多元背景设定

症状: 当代或历史背景中包含多个现实文化群体。需要真实地呈现多元文化,避免沦为象征性点缀。各群体的比例显得生硬或不切实际。 关键问题:

  • 这种背景设定中,现实的文化构成是什么?
  • 什么样的比例才显得真实(而非“每种文化各一个”)?
  • 是否存在构成各异的社区或街区? 干预措施: 首先确定文化分布。使用加权池,或按地点进行混合。

诊断流程

  1. 倾听症状 — 确定适用的状态
  2. 了解背景 — 在生成任何内容前,先确认设定、时代和文化
  3. 检查现有角色阵容 — 已经确定了哪些名字?
  4. 选择生成模式:
    • 当代/历史:使用文化姓名列表
    • 奇幻/科幻:使用音素预设
    • 混合:先定义分布,再按文化生成
  5. 通过熵生成 — 运行脚本,绝不要“想出”名字
  6. 与角色阵容核对 — 最终确定前检查是否有重名

可用工具

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:当代小说

用户:“我需要为我的芝加哥犯罪小说中的角色取名。”

你的处理方式:

  1. 询问故事中具体社区的文化构成
  2. 询问有多少主要角色需要取名
  3. 询问是否已有确定的姓名
  4. 使用熵从适当的文化姓名库中生成姓名
  5. 将每个建议与角色阵容比对,检查是否冲突

脚本用法:

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:奇幻小说

用户:“我需要为我的精灵王国取名。”

你的处理方式:

  1. 询问美学风格——高奇幻、黑暗还是奇趣?
  2. 询问是否有命名惯例(氏族名、本名等)
  3. 使用类精灵音素预设生成姓名
  4. 确保文化内部的一致性

脚本用法:

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 项
  • 确保维度多样(常见/不常见、区域分布)

评论

支持 Markdown