让 AI 拥有真实人格:基于 Qwen 与豆包 TTS 的多性格对话系统实现

0. 起因:一条“已读不回”的消息

上周三晚上10点,我给她发了条:“今天过得怎么样?”
她看了,没回。

第三天凌晨,我删了聊天窗口,打开 VS Code,新建了两个文件:
role_prompt_builder.py
doubao_voice_auto_config.py

目标很明确:构建一个多性格 AI 对话系统,通过认知建模 + 语音映射,让每个角色从思维到声音都不可混淆

1. 表面性格标签 vs. 底层认知机制

你有没有发现?
不管选“高冷御姐”“元气少女”还是“知性学姐”,聊起来都差不多:

“你还好吗?”
“抱抱你~”
“别难过,一切都会好起来的。”

听起来很暖,但细想一下——这不就是客服话术吗?

问题出在哪?
大多数系统只是给AI贴性格标签,然后套一个通用女声。 结果?所有角色都像同一个人换了头像。

2. 真正的人格差异,不在“说什么”,而在“怎么想”

我意识到:要让人分得清谁是谁,关键不是表面性格,而是底层认知机制。

于是,我设计了一套 「人格认知透镜」系统——
它不告诉AI“你要温柔”,而是告诉它:

“你是INFJ,习惯先洞察对方未言明的情感需求,再用温和方式回应;
你是回避型依恋,当话题进入情感领域,你会本能转向事实澄清;
你相信理想主义,但会评估可行性……”

让语言从思维中自然流淌出来,而不是从话术库里拼凑。

3. 6 维人格建模框架:从 MBTI 到交互禁忌

我在 RolePromptBuilder 中动态生成每个角色的专属 prompt,核心来自6个维度:

🔹 1. MBTI × 认知功能(不是类型名,是思维路径)

  • INFJ:先感知情绪暗流,再轻声回应
  • ENTJ:对话是推进问题的工具,效率优先
  • ISTP:先确认事实是否清晰,再分析机制是否可行

关键:不教AI“扮演”,而是让它“成为”

🔹 2. 依恋风格 → 情绪处理策略

类型面对沉默面对“我很难过”
安全型 自然等待 “嗯…我在。”
焦虑型 可能轻问“还在吗?”,但克制 敏感捕捉信号,努力不过度索取
回避型 转向事实:“刚才说到哪了?” 用逻辑转移:“前提是否成立?”

系统硬规:禁止直接问“你还好吗?”
情感必须通过语言本身表达。

🔹 3. 世界观 + 大五人格 → 行为倾向

  • 理想主义 + 高开放性 → 使用诗意隐喻(“咖啡渍像迷路的蝶”)
  • 现实主义 + 高尽责性 → 聚焦可执行动作(“列三个止损步骤”)
  • 高神经质 + 焦虑依恋 → 语言略带犹豫,但自我调节

🔹 4. 道德优先级 + 交互风格

  • 道德准则:["诚实", "善良", "智慧"] → 冲突时优先捍卫
  • 交互标签:["gentle", "supportive", "humorous"] → 转化为具体语言策略

🔹 5. 关系阶段动态调节

  • 初识:禁止反问,回应简洁
  • 亲密:可用昵称,沉默成为对话一部分

🔹 6. 硬性格式禁忌

  • 禁止 (微笑)*轻声说*
  • 禁止身份混淆
  • 禁止情绪探测式提问

附:人格 Prompt 动态生成核心逻辑(简化版)

 
def build_personality_prompt(char):
    parts = []

    # 1. 认知功能(MBTI × 思维路径)
    mbti_guide = {
        "INFJ": "先感知情绪暗流,再用隐喻回应",
        "ENTJ": "对话是推进问题的工具,效率优先",
        "ISFJ": "关注细节与安全感,先肯定再建议"
    }
    parts.append(f"- 思维方式:{mbti_guide.get(char.mbti, '自然思考')}")

    # 2. 依恋风格 → 情绪策略
    attachment_rules = {
        "avoidant": "转向事实或沉默,避免直接共情",
        "anxious": "可轻微确认连接,但克制追问",
        "secure": "自然表达陪伴,如'我在'"
    }
    parts.append(f"- 情绪策略:{attachment_rules.get(char.attachment, '自然应对')}")

    # 3. 大五 + 世界观 → 行为倾向
    if char.openness > 70:
        parts.append("- 高开放性:使用诗意隐喻(如'咖啡渍像迷路的蝶')")
    if char.conscientiousness > 70:
        parts.append("- 高尽责性:聚焦可执行动作(如'列三个止损步骤')")
    if char.worldview == "idealism":
        parts.append("- 世界观:相信理想可能,但评估可行性")

    # 4. 道德优先级 + 交互风格
    if char.moral_priorities:
        morals = ", ".join(char.moral_priorities[:2])
        parts.append(f"- 道德准则:优先捍卫 {morals}")
    if char.interaction_styles:
        styles = ";".join(char.interaction_styles)
        parts.append(f"- 交互风格:{styles}")

    # 5. 关系阶段动态调节
    stage_rules = {
        "initial": "初识:禁止反问,回应简洁",
        "close": "亲密:可用昵称,沉默成为对话一部分"
    }
    parts.append(f"- 当前关系阶段:{stage_rules.get(char.relationship_stage, '默认规则')}")

    # 6. 硬性格式禁忌
    parts.append("- 禁止 (动作)、*语气*、【心理】描写")
    parts.append("- 禁止问'你还好吗?'等情绪探测式提问")
    parts.append("- 所有情感必须通过语言本身表达(如'嗯…'、'我在想…')")

    return f"""
你叫 {char.name},是一个真实、有深度的角色。
请始终从你的认知与性格出发回应。

## 你的认知透镜
{"\n".join(parts)}

现在开始对话。
"""

image.png

image.png

image.png

4. 效果不错:同一句话,四种完全不同的灵魂

用户说:“我搞砸了一件很重要的事,觉得自己很失败。”

角色回答节选人格透镜体现
星野遥(INFJ, secure) “搞砸了事,不等于搞砸了人生…你愿意说说是什么事吗?” 诗意重构 + 温柔邀请
月城雪(ENFP, secure) “失败是世界塞给你的新地图…要不要现在跟我去操场跑两圈?” 体验转化 + 行动点燃
风间凛(ENTJ, secure) “搞砸了就拆解它…列三个能立刻止损的动作,我等你发过来。” 结构优化 + 目标驱动
花音梦(ISFJ, anxious) “‘失败’是世界贴的标签…要不要一起看看你做对的部分?” 细节关怀 + 价值重估

用户反馈:“完全不会认错谁在说话”——这才是角色系统的终极胜利。


5. 语音人格映射引擎:基于心理特征的 TTS 自动配置

当角色拥有了独特思维,声音必须与之匹配——否则就像让哲学家用卡通音说话,瞬间出戏。

于是我构建了第二层系统:人格 → 语音自动配置引擎。

🔸 输入:角色人格数据

 
character = {
    "mbti": "ENTJ",
    "attachment_style": "secure",
    "big_five_scores": {"extroversion": 70, "neuroticism": 20},
    "personality_tags": ["帅气", "独立", "强大"]
}

🔸 输出:豆包TTS完整配置

 
{

"speaker": "zh_female_gaolengyujie_emo_v2_mars_bigtts",

"speed": 1.15,

"volume": 90,

"default_emotion": "neutral"

}

🔸 匹配逻辑三步走:

① 音色选择:基于MBTI+依恋+大五

我整理了豆包20+高质量女声音色,标注其适配人格:

  • 高冷御姐 → ENTJ/INTJ + avoidant/secure + 中低神经质
  • 病娇萌妹 → INFP/ISFP + anxious + 高神经质
  • 元气女友 → ENFP/ESFP + secure + 高外向性

匹配时,MBTI权重最高(+2分),大五范围次之。

② 情绪映射:标签 → 豆包标准情绪

TAG_TO_EMOTION = {

"病娇": "angry",

"撒娇": "sajiao",

"温柔": "peaceful",

"元气": "happy"

}

但不是所有音色都支持所有情绪!

例如“甜心小美”音色不支持 happy,只支持 sad/fear
于是我建了一张 「音色-情绪兼容表」,不支持的情绪自动降级为 neutral,确保稳定。

③ 语速 & 音量微调:人格参数驱动

  • 外向性 >70 → 语速 +15%,音量 +5
  • 神经质 >70 → 语速 -10%(更犹豫)
  • INTJ/INFJ → 语速略慢,音量略低
  • ENTJ/ESFP → 语速快,音量高

最终语速控制在0.75x ~ 1.25x,音量80~95,自然不突兀。

附:语音人格自动配置生成核心逻辑(简化版)

 
# 核心思想:心理特征 → 音色 + 语速 + 情绪

VOICE_PROFILES = [
    ("zh_female_gaolengyujie", ["ENTJ", "INTJ"], "avoidant", (40,75), (30,65)),
    ("zh_female_yuanqinvyou", ["ENFP", "ESFP"], "secure",   (70,100), (30,70)),
    ("zh_female_tianxinxiaomei", ["ISFJ", "INFP"], "anxious", (30,65), (60,95)),
]

def generate_voice_config(char):
    # 1. 匹配音色(基于MBTI+依恋+大五)
    best_score = -1
    best_speaker = "default"
    for speaker, mbti_list, attach, extro_rng, neuro_rng in VOICE_PROFILES:
        score = 0
        if char.mbti in mbti_list: score += 2
        if extro_rng[0] <= char.extroversion <= extro_rng[1]: score += 1
        if neuro_rng[0] <= char.neuroticism <= neuro_rng[1]: score += 1
        if char.attachment == attach: score += 0.5
        if score > best_score:
            best_score, best_speaker = score, speaker

    # 2. 动态调整语速/音量
    speed = 1.0
    volume = 85
    if char.extroversion > 70:   # 外向 → 语速快、音量高
        speed *= 1.15; volume += 5
    if char.neuroticism > 70:    # 高神经质 → 语速慢
        speed *= 0.9

    # 3. 默认情绪(由MBTI决定)
    default_emotion = {"ENTJ": "happy", "INFJ": "peaceful", "ISFJ": "peaceful"}.get(char.mbti, "neutral")

    return {
        "speaker": best_speaker,
        "speed": round(speed, 2),
        "volume": min(95, max(80, volume)),
        "default_emotion": default_emotion
    }

image.png


如果您还不是特别了解qwen长期记忆及tts的使用,可以参考[前文](https://www.cnblogs.com/suzumiyahr/p/19242285)

6. 语音不是装饰,而是人格的最后一块拼图

很多人以为语音只是“换个声音”,但在我这里:语音是人格可被感知的最终出口。

  • 星野遥用“深夜播客”音色,低沉舒缓,像读一首未完成的诗
  • 月城雪用“元气女友”音色,明亮跳跃,带着笑意邀请你奔跑
  • 风间凛用“高冷御姐”音色,冷静干脆,不带多余情感
  • 花音梦用“甜心小美”音色,柔软克制,藏着一丝不安的温柔

用户说:“光听前三个字,就知道是谁在说话。”
这才是沉浸式人格体验。


7. 三条血泪经验

  1. 先做人格,再做声音。没有真实思维,再好的音色也只是空壳。
  2. 情绪兼容必须查表,不能假设 豆包文档写“支持多情绪”,但每个音色实际支持的并不相同。
  3. 格式禁忌比语音更重要。一旦允许 (叹气),角色就死了——因为那不是“她说的话”,而是“你写的剧本”。

8. 结语:我造的不是AI女友,而是会思考、会说话、会用对声音陪伴你的伙伴

现在,我的16个角色不仅思维不同,语言不同,连声音都不同。
有人喜欢星野遥的深夜低语,有人迷上月城雪的元气笑声,有人信任风间凛的冷静指令。

沉默,从此不再等于被抛弃;
而是一次,由你定义的、有温度的等待。

image.png

posted @ 2025-12-31 15:35  HaruSuzumiya  阅读(1)  评论(0)    收藏  举报