chatglm+live2d直播

2,117 阅读9分钟

直播间: live.bilibili.com/27831626

live_room.png

前段时间在B站搭建了一个虚拟ai聊天直播——橙子陪你闲聊,上面是我的直播间。 我来分享记录下整个搭建过程,只要你有一台电脑就能够实现。

整体设计

live_design.png

live2d

首先我们来了解下什么是live2d的,这个已经很多年前就有,我们在平时百度的时候,在博客园的一些文章应该会有看到过,这是叫看板娘的一个东西。

这个是日本的一家公司搞出来的,这是它的官方网站,它提供很多个平台的sdk,比如前端用的websdk。首先sdk是拿来跑这个live2d模型,官方也提供了一些示例模型,但是我们如果要直播或者要有个性的模型一般不会用示例模型,官方也提供了模型的编辑软件,一般一个模型的制作过程,是先用ps设计整个模型人物的样子,并把人物的每个部位、器官分离并整理出来,然后再交给编辑软件去处理,这个还是比较麻烦,比如模型的表情、头发丝、动作等等,所以制作一个模型交给专业的人来做,普遍都是上千块,好的也有上万块的。我直播的模型是白嫖b站的一个大佬,她已经在视频里允许任何人用于直播等用途的,所以不担心盗窃的问题。

[官方网站](Live2D - Live2D Cubism【官网】)

live2dcom.png

提供各个平台的sdk

live2dsdk.png

VTube Studio

上面看到官方提供sdk来跑live2d模型,那个是给开发者用的,现在市面上有很多跑live2d模型的软件,比如下面这一款vts。它要在steam平台去下载并运行,它是免费的。它主要的功能就是可以利用摄像头跟踪你的脸部,还有麦克风监听,就是你做什么表情,它也能够实时显示。很早就有很多那些不想露脸的主播,用这个来直播,比如唱歌、玩游戏的那些直播,其实二次元的比较多。它的功能比较强大的,还支持插件功能,就是可以通过代码去控制人物的表情、动作等。

VTube Studio是一款适用于iPhone/iPad、Android、macOS和Windows的应用程序。该应用程序使用你的智能手机或网络摄像头来跟踪你的脸,并相应地动画Live2D立体主义模型。不支持3D模型。该模型直接显示在您的手机或PC上,通过您的本地网络从您的手机流式传输面部跟踪数据到您的PC/Mac。

vts.png

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

voice.png

cable.png

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 GB14 GB
INT88 GB9 GB
INT46 GB7 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…

找到如下

pytorch_pip.jpeg

但是我们并不执行这行命令,我们看到需要包有

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

torch.png

当三个包都下载好后,假设我们都放到了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()

torch_cuda_available.png

下载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的版本

cuda.jpeg

最终在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_MESSAGESC消息
WARNING直播警告消息
CUT_OFF直播强制切断消息
INTERACT_WORDxxx 进入了直播间

控制中心

我们现在要自己写代码了,主要是监听b站弹幕,拿到弹幕后请求ai的接口,获取文本,然后再交给浏览器播放。 我们再整体回顾下整体思路。

live_design.png

这个是我的仓库,阔以克隆下来跑,但还在完善。Zeng-J/blive-control: b站虚拟直播聊天,利用浏览器语音播报 (github.com)

obs

最后,我们要把音视频推流到b站啦

下载OBS软件地址:obsproject/obs-studio: OBS Studio - Free and open source software for live streaming and screen recording (github.com)

obs.png

这里主要推流的是:vts、浏览器声音、背景音乐播放器、自定义文本等

最后

大概就说到这里,橙子主播还在继续完善中,这是橙子的直播间live.bilibili.com/27831626。有需要的仓库在这里github.com/Zeng-J/bliv…。欢迎大家一起讨论~