你或许已经听说过著名的 Neurosama,或者是来自中国的木几萌。你是否也想要拥有一个自己的 AI 虚拟形象陪你直播、聊天、打游戏?开源的 Zerolan Live Robot 正致力于实现您的梦想!而这仅仅需要一张消费级显卡!
Zerolan Live Robot 是一款多功能的直播机器人(AI VTuber),它可以自动在 Bilibili 直播间中读取弹幕,观察电脑屏幕的指定窗口,理解其画面内容,操纵 Minecraft 中的游戏角色,做出带情感的语音聊天回应。
与其关联的项目 KonekoMinecraftBot、zerolan-core、zerolan-data、zerolan-ui。
Note
本项目持续开发中,当前的版本为 2.0
,您可以关注开发者的 Bilibili 账号赤川鹤鸣_Channel,正在根据此项目调教 AI 猫娘,不定时直播展示最新进展。
- 💭 基于大语言模型的自然语言对话
- 🍻 根据直播间弹幕挑选并回复
- 🎙️ 识别用户麦克风语音输入内容,理解并回复
- 📣 根据回复文本的带情感的语音合成
- 📄 识别指定窗口中的文字内容
- 🖼️ 识别指定窗口中的图像(或视频),并理解其中的含义
- 🛠️ 根据上下文语境采取行动或挑选工具(百度百科、萌娘百科等)
- 🕹 根据语音指令控制 Minecraft AI 智能体
- Live2D 形象的控制
- 智能体的记忆功能
以下简要列出了本项目支持的内容:
支持项 | 支持内容 |
---|---|
直播平台 | Bilibili | Twitch |
大语言模型 | THUDM/GLM-4 | THUDM/ChatGLM3 | Qwen/Qwen-7B-Chat | 01ai/Yi-6B-Chat | augmxnt/shisa-7b-v1 |
自动语音识别模型 | iic/speech_paraformer_asr |
语音合成模型 | RVC-Boss/GPT-SoVITS |
图像字幕模型 | Salesforce/blip-image-captioning-large |
光学字符识别模型 | paddlepaddle/PaddleOCR |
视频字幕模型 | iic/multi-modal_hitea_video-captioning_base_en |
外部可调用工具 | 火狐浏览器、百度百科、萌娘百科 |
游戏插件 | Minecraft |
Caution
Zerolan Live Robot 2.0 版本与旧版本 1.0 不兼容,因此您可能需要重新配置环境、安装依赖。
Zerolan 框架由 Zerolan Live Robot、Zerolan Core、Zerolan Data、Zerolan UI 共同组成。下表简要地介绍了各个项目的用途:
项目名 | 用途 |
---|---|
Zerolan Live Robot | 直播机器人的控制框架,通过采集环境数据,并综合分析做出动作响应。 |
Zerolan Core | 为直播机器人提供 AI 推理服务的核心模块,例如大语言模型的 Web API 服务化。 |
Zerolan Data | 定义各个服务之间利用网络请求交换的数据格式。 |
Zerolan UI | 基于 PyQT6 的 GUI 界面,包括顶部弹窗和提示音等。 |
Important
此步骤是必须的!
请移步至此处进完成 Zerolan Core 的相关部署工作,Zerolan Live Robot 强依赖于此核心服务。
运行指令,这会创建一个虚拟环境并激活,然后自动安装本项目需要的依赖包:
conda create --name ZerolanLiveRobot python=3.10
conda activate ZerolanLiveRobot
pip install -r requirements.txt
如果您在 dev
开发分支,您可能需要手动安装:
pip install git+https://github.com/AkagawaTsurunaki/zerolan-ui.git@dev
pip install git+https://github.com/AkagawaTsurunaki/zerolan-data.git@dev
找到 resources/config.template.yaml
配置文件,更名为 config.yaml
,然后根据配置文件中的注释修改为您需要的配置。
pipeline
配置项中,您需要注意的是,server_url
应该包含协议、IP以及端口号,例如 http://127.0.0.1:11001
、https://myserver.com:11451
等,这是您部署 Zerolan Core 的网络地址,每一类模型可能有不同的端口。
Tip
服务器只能开启一个端口?那么请尝试使用 Nginx 转发你的请求。
service
配置项中,您需要注意的是,host
应仅包含 IP 地址,port
应仅包含端口号。
game.platform
字段支持的有 minecraft
,live_stream
字段支持的有 bilibili
、twitch
、youtube
。
character.chat.filter.strategy
的值可以为 default
。
character.chat.filter.bad_words
可以填写一系列的过滤词。
character.chat.injected_history
这个数组必须为偶数个,即必须为 AI 回复的消息结尾。
character.chat.max_history
指明了最多保留多少条消息,即消息窗口的大小。
character.speech.prompts_dir
指明了你的 TTS 音频文件的存放位置,你的文件名的格式应为 [语言][情感标签]文本内容.wav
。例如[zh][开心]哇!今天真是一个好天气.wav
,其中“语言”仅支持zh
、en
、ja
;“情感标签”任意,只要能让大语言模型判别即可;“文本内容”为这段音频中人声所代表的文本内容。
Caution
Microsoft Edge 浏览器可能存在内存泄露,因此此项目不支持。
external_tool.browser.driver
可选的值有 firefox
。
external_tool.browser.profile_dir
是为了保证在 Selenium 的控制下,您的账号登录等信息不会丢失,留空程序会自动检测位置(但不代表一定能找到)。
Tip
建议启动前利用 Postman 等 API 测试工具测试运行本项目的计算机与 Zerolan Core 的连接是否正常。Zerolan Live Robot 会在管线连接出错时提供一些建议,仍需要您手动排查。
使用以下命令运行 Zerolan Live Robot 的主程序:
python main.py
Note
此步骤是可选的。
本项目与 KonekoMinecraftBot 共同实现了一套接口,可以从本项目控制在 Minecraft 游戏中的机器人。如有需要请移步至此处查看详细。
Zerolan Live Robot 1.0 旧版本使用的是简单的按秒轮询,从各个服务模块中的缓存列表中读取环境信息。而在 Zerolan Live Robot 2.0 旧版本,转而使用事件驱动的设计模式。
在本项目中,机器人是在一系列事件的发送和处理过程中运行的。换句话说,没有事件发生,机器人就不会有任何回应。
每一个事件 Event
包含一个事件名,本质上是一个字符串。本项目中使用的所有事件名都定义在 common.enumerator.EventEnum
中,您也可以拓展添加自己的事件名。我们以处理用户输入语音这个事件为例,它的事件名为 EventEnum.SERVICE_VAD_SPEECH_CHUNK
。
emitter
是一个全局对象,用以处理事件发送和监听器的执行,emitter
始终拥有主线程,然而整个系统的运行过程中会有多个线程同时运行,因为每个线程可能都有属于自己的 EventEmitter 的实例。
使用装饰器 @emitter.on(EventEnum.某个事件)
可以快捷地注册某个监听器。监听器既可以是同步函数,也可以是异步函数。当我们需要发送事件时,可以使用异步方法 emitter.emit(EventEnum.某个事件, *args, **kwargs)
。
例如,当系统检测到一段人声音频时,将会发送 SERVICE_VAD_SPEECH_CHUNK
事件,并调用所有注册这个事件的监听器,进行某种处理:
@emitter.on(EventEnum.SERVICE_VAD_SPEECH_CHUNK)
async def on_service_vad_speech_chunk(speech: bytes, channels: int, sample_rate: int):
response = ... # 假设这里获得了语音识别的结果
await emitter.emit(EventEnum.PIPELINE_ASR, response) # 发送自动语音识别事件
这里的监听器即 on_service_vad_speech_chunk
,本质上是一个函数,它会在 SERVICE_VAD_SPEECH_CHUNK
发生时被调用,并接受几个参数,这里的参数完全由事件发送方规定。
管线(Pipeline)是沟通 Zerolan Core 的重要实现。管线的使用非常简单,只需要传入一个配置对象,就可以得到一个可用的管线对象。然后调用管线对象中的 predict
或 stream_predict
方法即可使用 Zerolan Core 中的 AI 模型。
以大语言模型为例,指定目标服务器的地址(你的 Zerolan Core 开放端口的地址),传入 LLMPipelineConfig
对象到 LLMPipeline
,即可建立管线。
config = LLMPipelineConfig(server_url="...")
llm = LLMPipeline(config)
query = LLMQuery(text="你好,你叫什么名字?", history=[])
prediction = llm.predict(query)
print(prediction.response)
这样就应该可以得到模型的回复。
如果你想知道更多实现细节,可以查看 Zerolan Data 中的数据定义,可能也需要结合管线的实现和 Zerolan Core 中 app.py
文件中的内容进行理解。简单来说,它们都是基于 HTTP 的。
模块 | 作用 | 支持内容 |
---|---|---|
browser | 基于 Selenium 的浏览器控制 | Firefox 的打开浏览器、搜索和关闭浏览器 |
device | 麦克风、截屏、扬声器控制 | 仅在 Windows 测试过 |
filter | 对话屏蔽器 | 简单的匹配过滤器 |
game | 游戏控制插件 | 详见 KonekoMinecraftBot |
live_stream | 直播平台的弹幕读取 | Bilibili、Twitch、Youtube |
vad | 人声音频检测 | 基于能量阈值的音频检测机制 |
启动后日志显示“在其上下文中,该请求的地址无效。”。
解决方案,检查配置文件中,host
的配置是否正确。如果想要仅本机访问,请指定为 '127.0.0.1'
。
本项目使用 MIT License,请勿将本软件用于非法用途。
Feel free to enjoy open-souce!
MIT License
Copyright (c) 2024 AkagawaTsurunaki
Email: AkagawaTsurunaki@outlook.com
Github: AkagawaTsurunaki
Bilibili: 赤川鹤鸣_Channel