Unity 本地文字语音互转+大语言模型对话初探
前言
寄,方向被上面砍了,这周离职。大概问题还是权责不对等吧,在中台这要推进进展时成员总被项目任务占据,久之我也直接开摆研究些自己感兴趣且对项目可能有用的东西。总体来说还是收获挺多的:在邻座一位AI从训练到部署全栈的同事那接触到了ComfyUI的AIGC工作流,之后半年打算研究这个开硕士论文题目(不过他被裁的比我还早有点难绷);且之后对那种抛组长/制作人橄榄枝的也会多加谨慎(虽然这次也有我想借着实习试错机会体验各岗的原因)。
简介
这个Demo的来由其实是受whisper from the star影响在探索智能NPC,个人认为现有游戏完全靠AI驱动还是不大现实,但在现有框架下给予AI一些发挥空间还是可以的。拿冒险RPG来说,新手引导中村长委托玩家清理村庄内的史莱姆,你可以选择对话村长:“老登,我初来乍到装备不齐,爆点金币先”。根据你话语的诚恳和急切程度村长可能会给你一些药草以及「全村最好的剑」替换掉你手头的「初学者木剑」,之后每次接取/完成委托时也可以再敲诈下。但当你到达邻村时,邻村村长可能会直接开喷:“我听过你,卑劣的投机者……”(设定中两个村子经常互通有无,且邻村村长更年轻直率)。个人不大喜欢whisper from the star中的AI使用,感觉还是情景扮演的聊天GPT,到特点节点直接强制线性收束。可能更倾向在预设好人物性格,关系后,让AI根据玩家的互动增减友善度从而有不同对话并给玩家的行为以帮助/阻碍(给道具,参与助战/暗中说坏话使绊子,与玩家决斗)。说起来这套和自己创造故事的流程也挺像的,搭建好舞台,放上出场人物,故事就自然而然的发生了。可能“一个人的性格就是他的命运”,崩三还在追我。
项目目前整合了本地语音文字互转及大语言模型对话。语音转文字由whisper.unity实现,大语言模型对话由LLM for Unity实现,文字转语音由GPT-SoVITS实现。其中只有文字转语音是要在Unity外开启本地端口映射调用,现在确实有些文字转语音的Unity插件,但测过后感觉都太机械了还不如跑团电子音。于是最终选择了这个声音克隆方案,通过十秒以内的音频克隆。
仅停留于目前的对话界面是因为本地方案的延迟不大能接受(为了效果大语言模型至少4B,这样堪堪能做到实时流式文字输出。但要转语音的话要等文字生成完毕,且生成语音的耗时和生成完整文字回答相当,这样即使每生成一句完整的话后就转语音播放,从玩家输入到得到语音反馈也需要六七秒。一种解决方案是直接舍弃语音或学空洞骑士识别下对话情绪后用虫语回答,但个人可能更想探索调用在线API的方案,但这需要很多时间精力)。且目前秋招和论文占据了绝大部分精力(秋招程策美三开,论文选自己不熟悉的领域,总感觉自己的神人程度又更上一层了),只能说来日方长下次一定。
接下来的ToDoList其实还有很多:搭建好一个村庄场景,给村长,村民,卫兵等NPC以相应的提示词和参考音频交互;在本地方法外,整个语音文字互转及大语言模型对话的API调用方案;设置大语言模型的对话返回格式,将触发事件传给游戏逻辑,当前情绪传给文字转语音模块……
实操
项目将这三个功能分为三个Manager控制:STTManager,LLMManager,TTSManager。其中STTManager调用的模型位置在(Assets/StreamingAssets/Whisper)中,初始只有Tiny模型可用,识别能力一般,需要更大模型可自行下载,放入指定位置并正确命名(ggml-
小结
这套做下来最大感受是AI智能NPC的水比想象中的还要深很多,也难怪目前AI应用基本局限于角色扮演对话。其一是搭建好整套玩家与NPC,NPC与NPC交互的逻辑(斯坦福AI小镇那样精确模拟太耗了,可能骰个人物早中晚的日程,再对同一时空的人物进行情报交换即可),其二是防止玩家跳出破坏游戏(比如经典的猫娘注入,和NPC讲他们只是游戏中的NPC……)。受限于能力与精力,暂且止步于此吧,希望之后有空能回来完善下。