1. 项目概述:打造会记住你的智能数字人
这个开源项目基于AWESOME-DIGITAL-HUMAN框架,整合了通义千问大模型、腾讯TTS语音合成和Live2D动画技术,构建了一个具备记忆能力的交互式数字人。不同于普通聊天机器人,它能通过会话ID维护短期记忆,利用阿里云百炼平台的记忆节点功能实现长期记忆存储,真正实现"认识你、记住你"的个性化交互体验。
技术栈的三大核心组件各司其职:
- 通义千问提供自然语言理解和生成能力,支持多轮对话和记忆存储
- 腾讯TTS实现高质量语音输出,提供多种音色选择
- Live2D赋予数字人生动的面部表情和口型同步
项目最大亮点在于解决了数字人交互中的两个关键痛点:一是通过优化流式输出处理,实现了语音与动画的自然同步;二是创新性地结合了会话记忆与长期记忆,使数字人能够随着交互次数的增加越来越了解用户。
2. 环境准备与部署
2.1 基础环境搭建
首先需要准备以下账号和服务:
- 阿里云DashScope账号:用于调用通义千问API
- 腾讯云TTS服务:开通语音合成功能
- 至少2核2G的云服务器或本地开发环境
推荐使用Docker部署,避免环境依赖问题:
git clone https://github.com/wan-h/awesome-digital-human-live2d.git cd awesome-digital-human-live2d docker-compose up --build -d部署完成后,项目目录结构如下:
├── config.yaml # 全局配置文件 ├── agents # agent配置文件目录 └── engines # 引擎配置文件目录 ├── asr # 语音识别配置 ├── llm # 大模型配置 └── tts # 语音合成配置2.2 服务账号配置
在腾讯云控制台获取TTS服务的SecretId和SecretKey,填入configs/engines/tts/tencentAPI.yaml:
PARAMETERS: [ { name: "secret_id", default: "你的腾讯云SecretId" }, { name: "secret_key", default: "你的腾讯云SecretKey" } ]在阿里云百炼平台创建应用,获取App ID和API Key,创建configs/agents/qwenAgent.yaml:
PARAMETERS: [ { name: "api_key", default: "你的DashScope API Key" }, { name: "app_id", default: "你的百炼平台App ID" } ]3. 核心功能实现
3.1 通义千问接入与记忆功能
在digitalHuman/agent/core目录下创建qwenAgent.py,实现核心对话逻辑。关键点在于处理两种记忆模式:
短期记忆:通过session_id维护单次会话的上下文
payload = { "input": { "prompt": prompt, "session_id": session_id # 传入会话ID保持上下文 }, "parameters": { "incremental_output": True # 启用流式输出 } }长期记忆:利用百炼平台的Memory Node功能存储用户特征
async def _write_memory_node_with_sdk(self, app_id: str, memory_id: str, content: str): create_memory_node_request = bailian_20231229_models.CreateMemoryNodeRequest( content=content ) await self._sdk_client.create_memory_node_with_options_async( space_id, memory_id, create_memory_node_request, headers, runtime )记忆触发机制采用关键词匹配+大模型提取的方式:
def _should_extract_memory(self, text: str) -> bool: triggers = ["名字", "喜欢", "爱好", "性格"] # 触发关键词 return any(trigger in text for trigger in triggers)3.2 语音合成优化
原始方案在流式输出时直接请求TTS会导致语音断句不自然。改进方案包括:
- 文本缓冲:累积到完整句子再触发TTS
const sentenceEndingsRegex = /[。!?!?.;;\n]/g; const parts = pendingText.current.split(sentenceEndingsRegex);- 强制刷新机制:避免长时间等待标点
const shouldFlushRemaining = charCount >= 60 || timeSinceLastUpdate > 1500;- 串行队列处理:确保语音顺序正确
const processNextTtsInQueue = () => { if (isProcessingTts.current || ttsQueue.current.length === 0) return; isProcessingTts.current = true; const { text } = ttsQueue.current.shift()!; // 处理TTS请求... };3.3 Live2D集成与同步控制
在web/app(products)/sentio/hooks/chat.ts中实现动画控制逻辑:
- 音频驱动口型:将TTS生成的音频数据传递给Live2D模型
Live2dManager.getInstance().pushAudioQueue(buffer);- 状态管理:根据交互阶段切换不同动画状态
// 思考状态 agentThinkRef.current += data; // 回答状态 Live2dManager.getInstance().playTalkAnimation();- 错误处理:网络中断时恢复默认状态
abort() { Live2dManager.getInstance().stopAudio(); Live2dManager.getInstance().resetAnimation(); }4. 常见问题与优化技巧
4.1 部署问题排查
容器启动失败:
- 检查Docker日志:
docker logs <container_id> - 确认端口8880未被占用
- 验证配置文件格式,特别是YAML缩进
TTS语音不自然:
- 调整tencentAPI.yaml中的speed参数(推荐0.8-1.2)
- 增加volume值提升音量(建议3-5)
- 尝试不同音色(如"爱小璇"、"云健")
4.2 记忆功能优化
长期记忆不生效:
- 确认百炼平台已开通记忆功能
- 检查环境变量DASHSCOPE_SPACE_ID是否设置
- 在SDK初始化时验证凭据:
def _init_sdk_client(self): try: credential = CredentialClient(Config( type='access_key', access_key_id=os.getenv("DASHSCOPE_ACCESS_KEY_ID"), access_key_secret=os.getenv("DASHSCOPE_ACCESS_KEY_SECRET") )) self._sdk_client = bailian20231229Client(credential) except Exception as e: logger.error(f"SDK初始化失败: {e}")记忆提取不准确:
- 修改_should_extract_memory方法中的触发词
- 调整_extract_memory_with_qwen_max的提示词模板
- 增加过滤条件避免存储无用信息
4.3 性能优化建议
- 前端渲染优化:
- 使用Web Worker处理音频解码
- 对Live2D模型进行轻量化处理
- 实现动画预加载
- 后端响应优化:
- 启用对话缓存
- 设置合理的超时时间(建议5-10秒)
- 对长文本进行分段处理
- 记忆存储策略:
# 对高频信息采用缓存+批量写入 memory_cache = {} async def _background_memory_update(self, ...): if memory_id in memory_cache: memory_cache[memory_id].append(content) else: memory_cache[memory_id] = [content] if len(memory_cache[memory_id]) > 3: # 累积3条后批量写入 await self._batch_write_memory(memory_cache[memory_id]) memory_cache[memory_id] = []5. 扩展应用场景
5.1 教育领域
- 个性化学习助手:记忆学生的学习进度和薄弱点
- 语言陪练:纠正发音并记住常见错误
- 知识点问答:根据学生年级调整回答难度
5.2 客户服务
- VIP客户识别:通过记忆提供个性化服务
- 投诉处理:记录客户历史问题
- 产品推荐:基于用户偏好推荐商品
5.3 智能家居
- 家庭成员识别:不同人不同交互模式
- 习惯记忆:自动调节灯光、温度等设置
- 日程提醒:结合个人作息时间
关键提示:在实际部署时,建议根据业务场景调整记忆存储策略。对于敏感信息,务必实现数据加密和访问控制,符合隐私保护要求。
6. 项目二次开发建议
- 多模态扩展:
- 增加视觉识别模块,实现人脸登录
- 集成手势识别,丰富交互方式
- 添加情绪识别,调整回答语气
- 记忆系统增强:
class EnhancedMemorySystem: def __init__(self): self.short_term = {} # 短期记忆 self.long_term = {} # 长期记忆 self.cache = LRUCache(100) # 缓存常用记忆 async def recall(self, user_id, query): # 实现分级记忆检索逻辑 pass- 分布式部署方案:
- 使用Redis缓存会话状态
- 采用Kafka处理高并发请求
- 通过Nginx实现负载均衡
- 小程序适配:
- 使用live2d-wx适配微信小程序
- 优化资源加载流程
- 实现离线缓存策略
这个项目的独特之处在于将成熟的AI技术与创新的记忆系统相结合,开发者可以基于此框架快速构建具备"个性化"能力的数字人应用。我在实际部署中发现,通过适当调整TTS参数和记忆触发条件,可以显著提升用户体验。例如将语音speed设置为0.9,同时增加"记得"、"知道"等记忆触发词,能使数字人表现更加自然。