你或許已經聽說過著名的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 貓娘,不定時直播展示最新進展。
以下簡要列出了本項目支持的內容:
| 支持項 | 支持內容 |
|---|---|
| 直播平台 | 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 。
Tip
獲取直播平台API Key 可能使用到的文檔:
Bilibili:獲取Credential 類所需信息
Twitch:Twitch Developers - Authentication
Youtube:Obtaining authorization credentials
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.pyNote
此步驟是可選的。
本項目與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 : [email protected]
Github : AkagawaTsurunaki
Bilibili : 赤川鶴鳴_Channel