# 需求分析

## 一、项目介绍

### 1. 背景

在 2022 年中山大学软件工程学院的三下乡实践活动中，实践团队利用大语言模型、文本转语音和虚幻引擎等技术，推迟数字人 1.0 版本，为丰阳镇电商中心打造一个“24 小时直播间”，提供全天候的善品介绍和产品展示

如今，正值中山大学百年校庆，为了将新时代的信息技术与中大百年悠久的历史相结合，我们项目团队在数字人 1.0 版本的基础上进行二次开发，推出中大校史介绍官的虚拟数字人。

### 2. 简述

本项目仍基于大语言模型、文本转语音和图像生成等最新 AI 技术进行开发。为了保证数字人能够契合中大校史介绍官的身份，我们项目会为数字人设计一套人设，并且通过引入外部知识库，确保其能够准确地应对中大校史相关的问题。

为了更好地发挥数字人的展示性，我们以直播间的方式部署数字人，能够让包括学生、教职工以及校外认识共同参与到与介绍官的交互中来。

## 二、功能介绍

从架构层面上讲，本系统是各种模块和接口的聚合，模块是项目核心内部的划分，接口是项目核心与外部用户交互的接口。

![img](https://1405676983-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FHsuGv0gxJq9qRu2oKB9e%2Fuploads%2Fgit-blob-f705313ec8b8b46a95e182b313ad7d45d9d61df2%2Fbasic_structure.svg?alt=media)

### 1. 核心

项目核心的目的是接收来自外部传输的消息，然后通过调用内部的模块生成回答，最终通过接口输出结果。

值得注意的是，由于本项目最终需要部署在直播间的场景中，而其面对的消息量是十分巨大的，因此我们引入了一个动态消息队列（Dynamic Message Queue），这个队列能够接收来自外部发送的消息并存储在内部，并根据消息的关联性、时效性、无害性等评估指标，实时地为每个接受的消息进行打分和排序，然后输出分值最高的一个回答，交给其他模块进行处理。

动态消息队列的引入为整个系统的输入设置了一个统一的过滤器，能够最大化地利用核心中的处理器去处理用户发送的消息。

### 2. 模块

#### 1. 大语言模型

在本项目中，我们仍使用大语言模型作为消息处理的基础，但是传统的大语言模型面对专业相关问题或者垂直问题时，他们常常会出现幻觉的问题，也就是说他们会开始胡说八道，显然其作为校史介绍官的是十分失职的。其次，介绍官对外是作为一个独立的个体存在的，换句话说，介绍官需要具有独立的人格。很多通用的大模型中，模型的身份都是普通的机器人，缺少作为人的特性。

针对产生幻觉的情况，我们打算通过建立外部知识库来解决这样的不足。 在目前的解决方案中，我们手动地在学校官网以及相关网站中收集和整理中大校史相关的信息，作为一个外部知识库。然后在核心在处理用户发送的消息时，其会从该知识库中搜索相关信息内容，再通过提示词工程相关方法将这些相关信息添加到提示词中，让大语言模型生成合适的回答。通过这样的方式进一步减少大语言模型产生的幻觉现象。

针对大语言模型的风格化问题，我们也主要通过提示词工程的方式进行对文本的生成结果进行优化。通过引入合适的角色人设相关的提示词，能够让大语言模型生成具有一定风格性的文本。

#### 2. 文本转语言

文本转语音是本项目中重要的一部分，它是能让数字人张嘴说话中的重要一环。

在此模块中，我们也分别从两种方法来提供文本转语音的服务。第一个是通过一些文本转语音的服务提供商，通过调用外部 API 的方式以实现文本转语音。第二种则是通过部署本地模型的方式。两种方法都有各自的优点，前者通过外部系统解决，能够给减轻部署环境的负担，而后者则可以使用本地模型，则可以通过预训练的方式定制音源。

目前本项目将集合这两种实现方式，在提供定制声库，丰富数字人的前提下，也通过调用外部 API 保证一定的系统稳定性。

### 3. 接口

接口是系统与用户交互的桥梁，无论是观看直播的观众还是管理数字人的运维人员，都需要通过通过这些接口与系统内部进行交互。本项目提供的接口主要分为三类，分别负责供管理员进行控制的控制器接口，负责收集直播间弹幕消息的直播间爬虫接口，以及负责展示数字人视图层接口。

#### 1. 控制器

控制器主要负责开启和关闭整个数字人程序，在程序被动之后并不意味着真正被启动了，只有管理员通过启动指令运行，系统自检无误之后，才能真正进行运行状态。

除此之外，控制器还能够直接向核心发送消息，Core 也拥有更高的优先级来处理由管理员发送的消息，这部分主要是用于开发调试。同时，管理员可通过发送一些固定的指令，比如“打个招呼”、“自我介绍”等，项目核心会按照固定的逻辑去处理这些指令，以应对一些常见的场景。

本项目中推出两种控制逻辑，分别是通过命令行和 Webui 两种交互逻辑。在前一种中，主要是面向开发场景，通过命令行的方式，允许开发更方便地进行调试。而后者则面向实际的部署场景，在项目部署之后，用户可以再局域网内，可以再各种设备上通过浏览器访问控制后台页面，对数字人的实际运行情况进行控制。

#### 2. 直播爬虫

直播爬虫主要是面向部署的直播间，爬虫会与直播间建立长连接，通过长期监听获取直播间发出的弹幕信息，再将其格式化，统一传输到内核中进行处理。

目前项目仅支持同一时间监听一个平台中的一个直播间。

#### 3. 视图层

视图层主要目的是将数字人形象进行可视化的展示，并输出包括视频和音频数据到直播间。视图层的程序通常是独立的外部系统，数据层接口则负责将外部系统封装成统一的调用接口，供本项目控制外部系统，并于外部系统进行交互。

## 三、 项目分工

本项目组团队包括 5 名同学，具体的分工如下。

* 同学 A：负责筒体的项目架构设计，
* 同学 B，C：负责实现大语言模型模块，
* 同学 D：负责实现文本转语音模块，
* 同学 E：名同学负责确定视图层解决方案，并实现视图层接口。
