前段时间在B站搭建了一个虚拟ai聊天直播——橙子陪你闲聊,上面是我的直播间。 我来分享记录下整个搭建过程,只要你有一台电脑就能够实现。
整体设计
live2d
首先我们来了解下什么是live2d的,这个已经很多年前就有,我们在平时百度的时候,在博客园的一些文章应该会有看到过,这是叫看板娘的一个东西。
这个是日本的一家公司搞出来的,这是它的官方网站,它提供很多个平台的sdk,比如前端用的websdk。首先sdk是拿来跑这个live2d模型,官方也提供了一些示例模型,但是我们如果要直播或者要有个性的模型一般不会用示例模型,官方也提供了模型的编辑软件,一般一个模型的制作过程,是先用ps设计整个模型人物的样子,并把人物的每个部位、器官分离并整理出来,然后再交给编辑软件去处理,这个还是比较麻烦,比如模型的表情、头发丝、动作等等,所以制作一个模型交给专业的人来做,普遍都是上千块,好的也有上万块的。我直播的模型是白嫖b站的一个大佬,她已经在视频里允许任何人用于直播等用途的,所以不担心盗窃的问题。
[官方网站](Live2D - Live2D Cubism【官网】)
提供各个平台的sdk
VTube Studio
上面看到官方提供sdk来跑live2d模型,那个是给开发者用的,现在市面上有很多跑live2d模型的软件,比如下面这一款vts。它要在steam平台去下载并运行,它是免费的。它主要的功能就是可以利用摄像头跟踪你的脸部,还有麦克风监听,就是你做什么表情,它也能够实时显示。很早就有很多那些不想露脸的主播,用这个来直播,比如唱歌、玩游戏的那些直播,其实二次元的比较多。它的功能比较强大的,还支持插件功能,就是可以通过代码去控制人物的表情、动作等。
VTube Studio是一款适用于iPhone/iPad、Android、macOS和Windows的应用程序。该应用程序使用你的智能手机或网络摄像头来跟踪你的脸,并相应地动画Live2D立体主义模型。不支持3D模型。该模型直接显示在您的手机或PC上,通过您的本地网络从您的手机流式传输面部跟踪数据到您的PC/Mac。
tts文本转语音
我们需要把直播开场白和聊天文案,语音读出来。有以下方案
- 使用线上第三方api生成音频文件(需要付费)
- 使用开源库tts生成音频文件,例如微软的edge-tts
- 系统自带的语音实时播放
- 使用浏览器的语音播报功能播放
由于我是前端开发,当然用浏览器自带的最为方便
使用浏览器的语音播报功能
const synth = window.speechSynthesis;
const voices = synth.getVoices();
let curVoices = voices.find((item) => item.name.includes("Xiaoyi"));
window.speechSynthesis.onvoiceschanged = () => {
// 找到xiaoyi的声音
curVoices = window.speechSynthesis
.getVoices()
.find((item) => item.name.toLocaleLowerCase().includes("xiaoyi"));
};
function handleSpeak(text) {
const msg = new SpeechSynthesisUtterance(text);
msg.onend = () => {
console.log("播放结束");
};
msg.onerror = (e) => {
console.error(e);
};
msg.volume = 1; // 声音音量:1
msg.rate = 1; // 语速:1
msg.pitch = 1; // 音高:1
if (this.curVoices) {
msg.voice = curVoices;
}
synth.speak(msg); // 语音播放
}
handleSpeak('你好');
VTube Studio嘴形同步
方案选择一——通过vts的插件,语音播放时控制嘴巴张开的大小
现在我们虚拟人物和语音都有了。现在要语音播放的时候,让人物嘴巴动起来。比如前面的vts软件,因为是虚拟人物。现在没法脸部捕获。好在它提供了插件功能,刚好有js版本的Hawkbat/VTubeStudioJS: An implementation of the VTube Studio API for Node and browser JS (github.com)。我一开始的做法是监听浏览器语音播放的时候,控制vts软件的人物嘴巴一闭一合,当然这样是比较死板的。而且浏览器语音播放有个缺点,就是浏览器提供的事件不提供获取播放每一刻的音贝大小。拿到音贝大小有啥作用?就是控制嘴巴的开合程度,让嘴巴动得更真实点。
方案选择二——使用虚拟声卡,把播放的声音作为虚拟麦克风,让vts监听虚拟麦克风
后面发现还有这种方法,电脑安装虚拟声卡,把浏览器播放声音作为虚拟声卡的输入,虚拟声卡的输出就是模拟麦克风。那么vts软件除了脸部捕获,也提供了麦克风监听。所以这就能达到很好的嘴形同步效果了。
VB-CABLE下载:VB-Audio Virtual Apps
chatglm
下面来讲下主要的一环,聊天ai。我们可以选择bing、chagpt等。这里我使用的是chatglm,它好处是开源的,可以本地部署。
ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型,基于 General Language Model (GLM) 架构,具有 62 亿参数。结合模型量化技术,用户可以在消费级的显卡上进行本地部署(INT4 量化级别下最低只需 6GB 显存)。
仓库位置:THUDM/ChatGLM-6B: ChatGLM-6B: An Open Bilingual Dialogue Language Model | 开源双语对话语言模型 (github.com)
硬件需求
| 量化等级 | 最低 GPU 显存(推理) | 最低 GPU 显存(高效参数微调) |
|---|---|---|
| FP16(无量化) | 13 GB | 14 GB |
| INT8 | 8 GB | 9 GB |
| INT4 | 6 GB | 7 GB |
显卡还是有些要求,我使用3070ti 8G只能跑个最低配置。下面来讲下如何本地把chatglm跑起来(这个网上很多教程了)
整体步骤
- 安装miniconda(python环境管理工具)
- Pytorch(深度学习框架)
- 下载cuda(NVIDIA 发明的一种并行计算平台和编程模型)
- 下载ChatGLM-6B语言模型THUDM/chatglm-6b · Hugging Face
- 克隆chatglm仓库
miniconda
安装miniconda,官网下载
conda常用命令
conda --version #查看conda版本,验证是否安装
conda update conda #更新至最新版本,也会更新其它相关包
conda update --all #更新所有包
conda update package_name #更新指定的包
conda create -n env_name package_name #创建名为env_name的新环境,并在该环境下安装名为package_name 的包,可以指定新环境的版本号,例如:conda create -n python2 python=python2.7 numpy pandas,创建了python2环境,python版本为2.7,同时还安装了numpy pandas包
conda create -p .\MyCondaEnv #指定conda新环境的路径 例如conda create -p .\MyCondaEnv
source activate env_name #切换至env_name环境
source deactivate #退出环境
conda info -e #显示所有已经创建的环境
conda create --name new_env_name --clone old_env_name #复制old_env_name为new_env_name
conda remove -n env_name -–all #删除环境
conda list #查看所有已经安装的包
conda install package_name #在当前环境中安装包
conda install --name env_name package_name #在指定环境中安装包
conda remove -- name env_name package #删除指定环境中的包
conda remove package #删除当前环境中的包
conda env remove -n env_name #采用第10条的方法删除环境失败时,可采用这种方法
创建一个虚拟环境,例如
# chatglm6b为环境名,自行定义
conda create -n chatglm6b
# 进入虚拟环境
source activate chatglm6b
安装Pytorch
PyTorch 是由 Facebook 开发,基于 Torch 开发,从并不常用的 Lua 语言转为 Python 语言开发的深度学习框架
在conda虚拟环境内,使用pip安装,我们前往pytorch.org/get-started…
找到如下
但是我们并不执行这行命令,我们看到需要包有
torch==2.0.0+cu117
torchvision==0.15.1+cu116
torchaudio==2.0.1
我们前往下载网站download.pytorch.org/whl/cu102 找对应的包,直接浏览器下载
例如torch,我的python是3.10,window版,所以下载torch-2.0.0+cu117-cp310-cp310-linux\_x86\_64.whl
当三个包都下载好后,假设我们都放到了D盘。
然后我们同样在名为chatglm6b的conda虚拟环境,执行下面的命令安装
pip install D:\torch-2.0.0+cu117-cp310-cp310-linux_x86_64.whl
pip install D:\torchaudio-2.0.1+cu117-cp310-cp310-win_amd64.whl
pip install D:\torchvision-0.15.1+cu117-cp310-cp310-win_amd64.whl
搞定后,我们验证下,python敲这两行命令,显示为true就ok了
import torch
torch.cuda.is_available()
下载cuda
CUDA 是 NVIDIA 发明的一种并行计算平台和编程模型。它通过利用图形处理器 (GPU) 的处理能力,可大幅提升计算性能。
我是参考这篇文章zhuanlan.zhihu.com/p/144311348
首先下载Visual Studio Community,前往下载 my.visualstudio.com/Downloads?q…
Visual Studio安装完成后,才能前往developer.nvidia.com/cuda-toolki… 下载cuda,我选择11.7.0的版本
最终在cmd执行nvcc --version,如果有打印信息代表成功了
下载ChatGLM-6B语言模型
THUDM/chatglm-6b · Hugging Face
克隆chatglm仓库
git clone git@github.com:THUDM/ChatGLM-6B.git
cd ChatGLM-6B
# 把要求的python依赖都安装上
pip install -r requirements.txt
紧接着把项目中的api.py改一下,找到下面这两行,把镜像位置改成你下载ChatGLM-6B语言模型的目录位置,D:\\project\\open\\chatglm-6b-int4这个是我存放的位置。
tokenizer = AutoTokenizer.from_pretrained("D:\\project\\open\\chatglm-6b-int4", trust_remote_code=True)
model = AutoModel.from_pretrained("D:\\project\\open\\chatglm-6b-int4", trust_remote_code=True).half().cuda()
最后跑python api.py,8000端口启动就OK了。
b站弹幕
到现在为止,我们有了虚拟人物、声音播放、本地ai。我们现在需要观众问ai问题,然后ai输出文本,我们再把文本语音播放出来,并且虚拟人物嘴巴跟着动,能做一些表情就更好了。
我们参考blivechat开源项目,我们找到它监听b站弹幕的代码blivechat/frontend/src/api/chat/ChatClientDirect · GitHub,copy过来。
B站的弹幕类型大概有以下
弹幕类型
| 类型 | 说明 |
|---|---|
| LIVE | 开播消息 |
| POPULAR | 人气 |
| DANMU_MSG | 弹幕消息 |
| SEND_GIFT | 礼物消息 |
| COMBO_SEND | 礼物连击消息 |
| NOTICE_MSG | 广播消息 |
| WELCOME | 欢迎进入直播间(不会触发) |
| WELCOME_GUARD | 欢迎舰长进入直播间(不会触发) |
| ENTRY_EFFECT | 舰长、高能榜、老爷进入直播间 |
| INTERACT_WORD | 用户进入直播间,用户关注直播间 |
| ROOM_BLOCK_MSG | 用户被禁言 |
| GUARD_BUY | 上舰消息 |
| SUPER_CHAT_MESSAGE | SC消息 |
| WARNING | 直播警告消息 |
| CUT_OFF | 直播强制切断消息 |
| INTERACT_WORD | xxx 进入了直播间 |
控制中心
我们现在要自己写代码了,主要是监听b站弹幕,拿到弹幕后请求ai的接口,获取文本,然后再交给浏览器播放。 我们再整体回顾下整体思路。
这个是我的仓库,阔以克隆下来跑,但还在完善。Zeng-J/blive-control: b站虚拟直播聊天,利用浏览器语音播报 (github.com)
obs
最后,我们要把音视频推流到b站啦
这里主要推流的是:vts、浏览器声音、背景音乐播放器、自定义文本等
最后
大概就说到这里,橙子主播还在继续完善中,这是橙子的直播间live.bilibili.com/27831626。有需要的仓库在这里github.com/Zeng-J/bliv…。欢迎大家一起讨论~