
不少写同人的朋友都有过这样的经历脑海里闪过了特别好的画面——某个角色站在雾里远远看着另一个人一句台词已经在嘴边了——于是立刻打开文档敲了几百字然后……卡住了。灵感散落在一起人物关系模糊情绪线写着写着就断了最终只能点右上角的红叉。这种“有灵感但写不完”的情况在同人创作里特别常见。原因往往不是文笔不够而是整个创作过程缺少一个可执行的框架。这篇教程就围绕一个问题展开如果你手里只有一行标题比如“【原神/奥黛塔】我在《雾里》爱着你”怎么把它扩写成一篇结构完整、节奏对味、角色不崩的完整作品我会从创作蓝图拆解讲起再给出一个用 Python 辅助整理灵感、检查节奏、统计角色出镜频率的“同人创作小工具箱”最后聊 AI 辅助写作时怎么设计提示词才不会写出千篇一律的“AI 腔”。整个过程不依赖某款神秘工具只要求你有基本的 Python 运行环境就行。好开始。1. 创作背景为什么同人创作也需要“工程化”先澄清一个概念同人创作的“工程化”不是让你把作品写成需求文档而是把“凭感觉写”变成“有方法地写”。很多作者对创作有误解觉得真正的灵感型选手应该一坐下就文思泉涌直接从头写到尾。但实际创作过程几乎都是混乱的今天对某个角色有了新理解明天看到一个雾景画面想塞进章节后天又想推翻人物关系重新来过。这些碎片本身没有问题问题在于它们没有统一存放、没有归类和排序。一旦缺少整理创作的推进速度会越来越慢最终放弃。工程化的核心是把创作拆成几个独立环节构思阶段确定角色、世界观、情感主线。整理阶段把零散灵感归类变成可用的素材。写作阶段按章节推进正文保持节奏。检查阶段验证角色是否走形、用词是否重复、情绪线是否符合预期。发布阶段整理文案、标签、发布渠道。每个阶段都可以用简单的工具辅助不一定多高级一条记录灵感的笔记一个统计关键词的脚本一个情绪打分表都能让创作过程稳定不少。这篇文章适合这几类读者刚开始写原神同人不知道怎么从一句标题发展成完整故事。已经写了几章但感觉节奏不对、角色性格飘忽想把控质量。对 AI 辅助写作感兴趣但不想让作品带上明显的“AI 味”。想把日常写作流程整理得更规范顺带学一点 Python 文本处理技能。读完后你能得到一套可复用的创作流程以及 3 个可以直接运行的 Python 辅助脚本。2. 创作蓝图把标题拆解成可执行的创作锚点拿到“我在《雾里》爱着你”这个标题先别急着动笔。标题本身就是最好的创作蓝图关键是怎么拆。2.1 标题拆解四个锚点把标题拆成四个部分锚点对应内容创作时需要回答的问题原神世界观与背景故事发生在原神的哪个国家、哪座城市奥黛塔核心角色她是谁她和旅行者什么关系雾里核心意象雾代表什么是环境、心理还是信息遮蔽爱着你情感主线这份爱是什么状态说出口了没有拆完之后这四个锚点就成了后续所有创作决策的基准。比如你写到一个场景发现这段描写和“雾”完全没有关系那就说明节奏可能偏了如果一段对话让奥黛塔跳出了角色性格说明角色锚点没有约束住笔触。2.2 角色设定卡先立人设再写故事很多同人作品角色走形根因是人设停在脑子里没有落成文字。所以建议为奥黛塔单独建一份“角色设定卡”。这里注意一个原则涉及原神原作已有信息时以游戏内实际展示为准不要凭印象或二创内容随意改写角色的关键经历、性格底色和能力设定。设定卡中不应出现编造的“官方设定”只能填你依据游戏内容做的合理推测和二次创作方向。一个基础角色卡模板如下# 角色卡奥黛塔 ## 基本信息 - 姓名 - 所属 - 外观特征 - 性格底色 ## 关系网 - 与旅行者的关系 - 与派蒙的关系 - 其他重要关系 ## 说话风格 - 常用语气词 - 句式特点 - 绝对不能说的台词类型 ## 当前故事中的目标 - 追求什么 - 害怕失去什么 - 和标题「雾里」的关联填这张卡的时候尽量具体。比如“说话风格”不要只写“温柔”要写“语速不快很少直接表达内心想法习惯用天气或景物来转移话题”。有了这种细节后面写对话时才不会让读者觉得“这个角色突然换了个人”。2.3 故事要素表把灵感框进骨架再用一张表把故事骨架列出来要素内容时间故事发生在哪个时间段持续多久地点核心场景在哪里雾出现的主要位置人物出场的角色有哪些谁推动剧情核心冲突奥黛塔和“你”之间隔什么情感走向从什么状态变化到什么状态结局给出答案还是停在迷雾里表格不需要一步到位但至少要写出“核心冲突”和“情感走向”这两项决定了整个故事有没有张力。有了这张表你的创作就不再是“跟着感觉走到哪算哪”而是“知道终点在哪再决定路上怎么弯”。3. 环境准备用最简单的工具管理创作创作本身不需要很复杂的工具但一个清晰的项目目录能让你在写第 20 章时还找得到第 3 章的人物伏笔。下面这套目录结构适合中长篇同人创作oudeita-story/ ├── notes/ │ ├── spark.md # 灵感碎片 │ ├── setting.md # 世界观与设定 │ ├── characters.md # 角色卡 │ └── sorted/ # 灵感分类后的输出目录 ├── drafts/ │ ├── chapter01.md │ ├── chapter02.md │ └── ... ├── final/ # 定稿 ├── assets/ # 配图、封面 └── scripts/ ├── classify_spark.py # 灵感分类脚本 ├── emotion_curve.py # 情绪曲线脚本 └── char_counter.py # 角色出场统计脚本这个结构并不复杂核心思路是灵感归笔记草稿归草稿脚本归脚本。每类东西有固定位置你就不会出现“明明写过那个设定却翻遍文档找不到”的情况。3.1 灵感碎片模板notes/spark.md建议按“卡片”格式记录每条灵感只写一个画面、一句台词或一个冲突# 灵感卡片 ## 2025-06-10 - 雾里的桥奥黛塔撑着伞停在桥中央像是在等谁。 - 台词「雾散之前你都可以当作我什么都没说过。」 - 冲突她不知道对方已经听见了。 ## 2025-06-12 - 想写一个反差场景平时果断的她在雾里却犹豫了。每张卡片只记录事实不急着判断能不能用。后面统一分类效率更高。3.2 Python 环境说明后面的辅助脚本依赖 Python 3.8 及以上版本建议 3.9原因是示例中会用到list[str]这种类型注解写法在低版本里会语法报错。如果你暂时不方便升级把类型注解删掉也能跑。需要安装的第三方库只有两个matplotlib画情绪曲线用。jieba中文分词用于简单的关键词提取。安装命令pip install matplotlib jieba如果你的网络环境有特殊限制装不上这两个库也不影响核心流程文章会逐一说明每个脚本的“非必须之处”。3.3 Markdown 编辑工具推荐直接用支持 Markdown 预览的编辑器比如 Typora 或 VS Code。文档用 Markdown 而不是 Word 的好处就是版本管理方便、脚本可以直接读取.md文件做统计不需要额外解析。4. 用 Python 辅助同人创作三个实战脚本下面这部分是这个教程的重点。我会给出 3 个可以直接运行的 Python 脚本分别解决创作中三个真实痛点灵感太乱、节奏不稳、角色边缘化。这 3 个脚本都很轻量不需要搭建框架。你只要把它们存到scripts/目录下按需求执行就行。4.1 灵感碎片分类整理写了几周后spark.md里会有几十条灵感又杂又乱。手动分类很费时间不妨用关键词匹配自动分桶。脚本思路定义几个分组每个分组对应若干关键词逐行读取灵感卡片命中哪个分组就归到哪个分组文件里。# 文件路径scripts/classify_spark.py 灵感碎片分类脚本 用法编辑 GROUPS 和 NOTES_FILE运行 python scripts/classify_spark.py import os NOTES_FILE notes/spark.md OUTPUT_DIR notes/sorted GROUPS { 雾与场景: [雾, 朦胧, 看不清, 雾气, 桥, 雨], 情感: [爱, 想念, 心跳, 温柔, 目光, 没说出口], 角色: [奥黛塔, 旅行者, 对话, 声音, 犹豫], 冲突: [离开, 失去, 秘密, 误会, 真相], } def read_notes() - str: with open(NOTES_FILE, encodingutf-8) as f: return f.read() def classify_line(line: str) - str: for group, keywords in GROUPS.items(): if any(keyword in line for keyword in keywords): return group return 未分类 def main(): content read_notes() lines [line.strip() for line in content.splitlines() if line.strip() and not line.startswith(#)] result: dict[str, list[tuple[int, str]]] {} for idx, line in enumerate(lines, 1): result.setdefault(classify_line(line), []).append((idx, line)) os.makedirs(OUTPUT_DIR, exist_okTrue) for group, items in result.items(): path os.path.join(OUTPUT_DIR, f{group}.md) with open(path, w, encodingutf-8) as f: for idx, text in items: f.write(f- [第{idx}条] {text}\n) print(f已生成{path}共 {len(items)} 条) if __name__ __main__: main()运行方式cd oudeita-story python scripts/classify_spark.py运行后notes/sorted/目录下会出现按分组命名的 Markdown 文件。这样你写“雾中相逢”的时候直接打开雾与场景.md和情感.md就能看到所有相关片段不用再翻原始笔记。注意这个脚本的关键词匹配非常原始只适合做初步整理不要指望它能理解语境。比如“雾散之前”会同时命中“雾”和“之前”相关的分组但分组重复并不影响使用你只是找素材不是让机器帮你做最终判断。4.2 情绪曲线可视化写长篇最容易出现的问题是“情绪线失真”。比如你计划前几章是克制、压抑的暗恋结果动手写的时候第一章就写成了强烈告白加泪奔——因为当下情绪上头你会下意识把感情浓度拉满。要避免这个问题可以给每一章打分然后画出情绪走势曲线。打分标准很简单0 分代表压抑、平静、日常5 分是小幅波动10 分是情绪爆发。你根据章纲给每章预估一个分值然后画成曲线。# 文件路径scripts/emotion_curve.py 情绪曲线可视化脚本 先把章节名和情绪分维护在下面的列表里 import matplotlib.pyplot as plt chapters [第1章, 第2章, 第3章, 第4章, 第5章, 第6章, 第7章] scores [3, 5, 6, 4, 8, 9, 7] plt.figure(figsize(10, 5)) plt.plot(chapters, scores, markero, linewidth2, color#2c7fb8) plt.fill_between(chapters, scores, alpha0.2, color#2c7fb8) plt.title(故事情绪走势曲线) plt.xlabel(章节) plt.ylabel(情绪强度0-10) plt.ylim(-0.5, 10.5) plt.grid(alpha0.4) plt.show()运行python scripts/emotion_curve.py画出来的曲线就是你当前故事的情绪节奏。在“我在《雾里》爱着你”这种以含蓄情感为主的故事里理想的曲线通常不是直线上升而是“谷底—缓升—回落—爆发”的波浪形。如果曲线太平说明故事缺少层次如果第三四章就冲到了 9 分后面就很难再写出更强的情绪爆发。这个脚本本质上是把“感觉”变成“可看到的图形”。你不需要画得多复杂一张简单折线图就足够支撑创作决策。4.3 角色出场频率统计同人创作里还有个常见问题标题写着“奥黛塔”结果写了几章后发现男主角派蒙的戏份快超过她了。这未必是坏事但在以角色为中心的作品里主角的出场频率掉下去会产生明显的叙事重心偏移。用 Python 统计每个角色的名字在章节里出现多少次能快速发现问题。# 文件路径scripts/char_counter.py 角色出场频率统计 用法修改 chapters 和 characters 后运行 python scripts/char_counter.py import re from collections import Counter def count_keywords(file_path: str, keywords: list[str]) - dict[str, int]: with open(file_path, encodingutf-8) as f: text f.read() counter Counter() for kw in keywords: counter[kw] len(re.findall(kw, text)) return dict(counter) chapters [ drafts/chapter01.md, drafts/chapter02.md, drafts/chapter03.md, ] characters [奥黛塔, 旅行者, 派蒙] print(f{角色:8}{第1章:8}{第2章:8}{第3章:8}总计) for name in characters: row [name ] total 0 for path in chapters: count count_keywords(path, [name])[name] total count row.append(str(count).ljust(6)) row.append(str(total)) print(.join(row))运行示例输出角色 第1章 第2章 第3章 总计 奥黛塔 12 18 6 36 旅行者 14 10 5 29 派蒙 9 7 2 18看到第 3 章奥黛塔只有 6 次出场你就该想一想这一章是不是写偏了是不是有整整一段剧情里她在场但没有被提到注意名字出现次数不等于角色实际存在感。一个角色可能名字只出现 3 次但每场戏都推进了她的成长。所以这个统计只是预警不是最终裁判。你需要结合内容判断而不是看到一个数字就盲目修改。4.4 重复用词检测最后一个脚本用来检查“用词重复”。很多同人作者写“雾”这个意象时会不自觉地反复用“雾气弥漫”“迷雾笼罩”之类的搭配。短时间看两遍还行整章看下来就会显得词汇量单薄。用正则简单提取 2~4 字的词统计高频词# 文件路径scripts/word_freq.py 高频词检测脚本 粗略统计 2~4 个汉字的词频供作者检查用词重复 import re from collections import Counter def find_repeated_words(text: str, top_n: int 15) - list[tuple[str, int]]: words re.findall(r[\u4e00-\u9fa5]{2,4}, text) counter Counter(words) return counter.most_common(top_n) with open(drafts/chapter01.md, encodingutf-8) as f: data f.read() for word, count in find_repeated_words(data): print(f{word}: {count})这个脚本的问题是它会把“我们”“他们”“没有”“一个”这种高频虚词也统计出来。所以更实用的做法是维护一个“停用词表”把这些词过滤掉。这里是基础版本你先跑一遍再根据结果手动修改即可。高频词统计之所以重要不是因为“重复”是致命错误而是因为它是读者阅读疲劳的来源之一。你可以在初稿阶段用脚本快速定位然后决定哪些词该替换哪些词是刻意强调的部分保留不变。5. AI 辅助写作提示词设计与内容审核AI 辅助写作是当前同人创作绕不开的话题但很多作者要么完全排斥要么直接让 AI 生成大段正文然后复制粘贴导致作品带着明显的“AI 腔”。正确姿势是把 AI 当协作者而不是代笔。让它帮你发散灵感、生成描写模板、给出对白方向但最终的文字必须经过你的判断和改写。5.1 角色设定提示词模板如果你想用 AI 快速生成角色理解可以这样设计提示词你是一位熟悉原神世界观与角色设定的创作顾问。 请基于以下要求帮我梳理角色「奥黛塔」的创作要点 1. 只分析已确认的原作信息不要编造官方未公布的设定。 2. 给出她的性格关键词、说话风格、在「雾」意象故事中的可能冲突点。 3. 如果信息不充分请明确说明哪些是你基于通用创作逻辑做的推测。 请注意 - 你的回答只能作为创作参考不能替代我对原作信息的核对。 - 不确定的内容请明确标注为「推测」。这个提示词的技巧在于“先定义 AI 的角色”和“明确 AI 的能力边界”。你没有让 AI 编设定而是让它以“顾问”身份帮你分析并要求区分事实与推测这样得到的输出就不会被误当成原作设定。5.2 场景描写提示词当你需要写“雾中的奥黛塔”这个场景时可以先让 AI 拉出 3 个不同的描写角度请给我 3 个「雾中人物」的画面构思要求 - 以第三人称为视角。 - 场景发生在原神风格的城邦与自然环境中。 - 雾不仅是天气还要映射人物的心情。 - 每个构思不超过 100 字。 - 不要直接写正文只给方向。AI 的输出不需要直接用而是从中挑选一个你没想到的细节方向比如“雾遮住了她的脚步声”“雾在伞沿凝成水珠滴落”——这才是 AI 辅助的正确价值。5.3 对话风格提示词同人创作里 OOCOut of Character角色性格偏离最常出现在对话中。AI 写对白容易把不同角色写成“同一个声音”解决办法是先把角色卡喂给 AI这是角色「奥黛塔」的人设卡 - 语速不快很少直接表达内心想法 - 习惯用天气或景物来转移话题 - 不喜欢命令句常用反问句为自己留退路 请根据这个人设写一段她在「雾里」和旅行者的对话场景是 两人在雾中的桥头相遇她有一件重要的事没说出口。 要求 1. 对白要符合上述人设尤其是回避直接表达的部分 2. 每句对白不超过两行 3. 在对话后标注她为什么这样回应这个提示词的关键在于“给了 AI 很具体的人设约束并且要求它解释对白动机”。如果 AI 输出的对白太直白、不像奥黛塔你可以根据它标注的“动机”部分判断问题出在哪里再手动改写。5.4 AI 内容审核清单无论 AI 生成什么发布前都建议过一遍这个清单[ ] 有没有编造原神原作未出现的“官方设定”[ ] 角色对话是否保持人设一致[ ] 有没有明显的 AI 腔调比如排比句过多、每段都总结升华[ ] 核心情节是否是自己想写的还是被 AI 带偏了[ ] 是否有与安全底线冲突的内容6. 正文写作要点如何写好“雾里”的朦胧情感工具只解决“怎么组织”的问题真正决定作品好坏的是正文本身。“雾里”这个意象有非常大的创作空间关键是怎么写透。6.1 雾的三种写法第一种是“环境之雾”。纯客观描写雾的形态、光线和空间感雾从河面漫上来漫过桥栏把整座城泡成一张显影不全的旧照片。奥黛塔站在原地伞沿凝着一排水珠像是在等一个连自己都不确定会不会来的人。第二种是“情绪之雾”。雾映射角色的内心状态雾的浓度、温度、流动感都代表情绪她迈出一步雾就退一步像在给她让路又像在把她往原点推。她忽然明白自己不想穿过这团雾——穿过去答案就清楚了。第三种是“关系之雾”。雾是信息遮蔽的象征角色之间隔着看不清的东西他们之间隔着的不是距离是雾。她能听见他的声音却看不见他的表情。正是这份“看不清”让她所有的话都堵在了喉咙里。三种写法可以在不同章节交替使用。环境之雾负责渲染场景情绪之雾负责进入角色内心关系之雾负责推动冲突。6.2 “爱着你”的情感铺垫标题中藏着强烈的感情但同人创作中尤其是放在“雾里”这个意象下的故事情绪越是直接表达反而越容易失真。更好的方式是铺垫到位后再让情感自然溢出。实操上可以这样控制前几章写“雾”时的克制她看他的眼神、说话的停顿、在伞下挪开一步又补回来的距离。中段写“雾变浓”时的拉扯想靠近又退缩想坦白又掩饰。最后“雾散”时刻的爆发一旦看清彼此情绪水到渠成不需要大段心理描写一句“原来你也在这里”就够炸。简单总结就是情绪靠积累不靠喊。前面铺垫得越足最后的情感爆发越有力量。6.3 避免 OOC 的写作自查写完每章对话后可以用最简单的办法自查打开角色设定卡找到“绝对不能说的台词类型”这一栏。如果你发现自己让奥黛塔说了一句话和这一栏描述冲突哪怕这句话自己再喜欢也要删掉。这也是角色卡最重要的作用它不只是创作前用来找灵感的工具更是创作中用来对抗“自我感动”的护栏。7. 常见问题与排查思路问题现象常见原因解决思路灵感碎片太多写作时找不到可用素材灵感没有分类堆在一个文档里用 4.1 的 classify_spark.py 自动分类章节情绪节奏不对该爆发时没爆发全凭感觉写没有量化节奏用 4.2 的情绪曲线脚本画出走势标题角色出场太少变成配角主线被支线带偏用 4.3 的人物出场统计核对角色对话不像本人没立角色卡或AI生成的对话没有复核人设先填角色卡用 5.3 的模板约束 AI文风前后差异大创作间隔时间长没有统一基准维护术语表和风格示例文档全文出现大量“雾”字阅读疲劳意象重复替代表达不足用 4.4 的高频词脚本检查AI 生成内容“AI 腔”太重直接复制 AI 输出只把 AI 输出当方向必须人工改写8. 最佳实践与创作工程建议8.1 版本与备份写长篇同人最怕文件丢失尤其是写到二十万字的时候。建议至少用两种方式备份本地把项目目录纳入 Git 管理每次写完一章提交一次。云端同步到网盘或在线文档。如果不会 Git至少每次改动前把原文件复制一份带时间戳的副本。不要嫌麻烦——文件丢过一次之后你就会明白备份不是可选项。8.2 忠于原作信息原神同人的根基是对原作的尊重。写作前务必核对角色语音、剧情文本和角色故事。遇到不确定的内容宁可模糊处理也不要自行创造“官方设定”。例如你不确定奥黛塔的某个经历是否官方内容就写“她似乎有一段不愿提起的过去”而不是拍板“她曾经在 XX 地经历过 XX 事件”。8.3 发布规范与标签发布时注意标题保留核心信息比如“【原神/奥黛塔】我在《雾里》爱着你”就已经很规范读者一眼能看到游戏、角色和标题。标签加上角色名、CP对象、文体风格方便读者搜索和避雷。如果涉及对原作剧情的延伸建议在开头标注涉及剧透风险。有争议的情节设计提前在简介中用温和方式说明。8.4 创作节奏管理“等灵感来了再写”是烂尾率最高的创作模式。更好的方法是设置一个最低创作量每天只写 300 字不管好不好先写出来。写得烂没关系因为改烂稿的难度远低于面对空白页。配合情绪曲线和角色卡检查每天 300 字的质量会越来越高。9. 结语回到题目本身“【原神/奥黛塔】我在《雾里》爱着你”这行字看起来只是一句话但它实际上包含了世界观、角色、意象、情感四个完整的创作锚点。从这句话到一篇完整作品差的不是天赋而是把灵感落地的流程。创作工具和脚本只能帮你整理素材、检查节奏、核对出场率最终让文字有温度的还是你对角色和世界的理解。希望这篇教程里的小工具能帮你少踩几个坑让奥黛塔在迷雾里好好走完她的故事。如果觉得有帮助可以先收藏备用。下次想写同人又不知道如何下手时记得从“拆标题”开始做先把四个锚点拆清楚再打开 Python 脚本整理素材——你会发现写完一篇完整作品并没有想象中那么难。