§
返回項目列表Python・VTube Studio 虛擬形象動作
遊戲 AI 伴侶「かぐや」
一個以本地運行為先的 AI 伴侶,能觀看遊戲畫面、說話,並在 Discord 上以記憶及 Live2D 虛擬形象聊天;預設使用本地模型,並可選用雲端後備。項目主要由 keithku321 開發,本人負責虛擬形象的動作部分及 Discord 圖片理解。
- 單一動作迴圈30 Hz
- 種情感以情緒座標表示16
- 個動作及安裝相關的測試函式55
- 個圖片理解測試函式35
一個主要由 keithku321 開發的私人 Windows 伴侶項目,能觀看畫面上的遊戲並加以評論,在 Discord 上以記憶聊天,並以動態 Live2D 角色現身;預設使用本地模型,並可選用雲端後備。本人負責令角色眨眼、環顧及隨說話做出手勢的動作層、透過本地視覺模型理解 Discord 聊天中的圖片,以及較新 Python 版本的安裝路徑。此處列出的技術屬於整個項目;本人的工作以 Python 配合 VTube Studio API 進行。由於程式庫為私人性質,本頁只提供文字說明及統計數字。
眨眼、視線、擺動、情緒及呼吸各自加入細微偏移,由一個混合器相加,再由單一 30 Hz 迴圈送出。- 為 VTube Studio 編寫動作引擎,646 行全部由本人提交:以種子控制的眨眼、視線及擺動,以及把 16 種情感各自表示為情緒維度(愉悅度、激發度、支配度)座標、並以 0.45 秒時間常數平滑過渡的面部表情,全部經單一 30 Hz 迴圈送出。
- 按語音片段的音量規劃語音手勢:在響亮的起音處加入細微動作,每 0.6 秒最多一次,另按片段長度加入最多三個較大的手勢;測試時使用模擬語音片段。
- 以文字驅動口部,令無人讀出的台詞同樣帶動口部及頭部;口型由文字生成,每次結果相同,並已於終端機聊天中實機驗證,Discord 一方則只以模擬物件測試。
- 視線跟隨滑鼠:每隔 25 至 70 秒,雙眼望向游標 3.5 至 7.5 秒,並會讓路給語音手勢;已讀回引擎數值,於一段 14 秒片段上核對。
- 透過本地 Ollama 視覺模型理解 Discord 聊天中的圖片,並將圖片描述視為不可信數據,確保圖片內容不會進入記憶或雲端。此功能新增 35 個測試函式,以模擬物件運行;真實視覺模型配合真實圖片尚未驗證。
- 為 Python 3.13 及 3.14 建立安裝路徑,3.11 及 3.12 的設定維持不變;較新版本尚未完成完整運行驗證。
- 項目中現存 55 個動作及安裝相關的測試函式;此數字由原始碼點算得出,並非測試運行結果。
- 1
伴侶的回覆
由 keithku321 的系統決定回覆內容、展示的情感,以及台詞是否讀出。
語音片段,或回覆文字
- 2
口型包絡
語音片段使用 keithku321 的語音跟隨口型;無人讀出的台詞則以本人的文字口型走同一路徑。
隨時間變化的音量
- 3
語音規劃器
在響亮的起音處安排細微動作,並按片段長度安排最多三個較大的手勢。
已規劃的手勢
- 4
動作層
以種子控制的眨眼、視線、擺動及呼吸,加上平滑過渡的情緒及視線跟隨滑鼠,各自產生細微偏移。
各層的偏移值
- 5
混合器與迴圈
由一個混合器疊加各層,並由單一迴圈負責寫入,因此口部與動作不會互相覆蓋。
每秒 30 次,每次一個請求
- 6
VTube Studio
接收數值,帶動畫面上的 Live2D 角色。
札記第 1 則
台詞之間一動不動的角色
- 問題
- 快捷鍵只能開關表情及道具,而虛擬形象模型本身沒有眨眼、視線或擺動,角色在台詞之間只能一動不動。
- 決定
- 本人加入多個獨立、以種子控制的控制器,由一個混合器疊加輸出;每種情感表示為一個座標,面部朝該座標平滑過渡;再由單一 30 Hz 迴圈寫入所有數值,包括口部。程式庫記錄這些構思源自一個公開的 Apache-2.0 情感 SDK,並經重新實現,沒有複製程式碼。
- 結果
- 從運行中的模型讀回數值:頭部轉動範圍為 -4.5 至 2.2 單位,眨眼時眼睛確實閉合;憤怒表情把口型值帶到 -0.54,開心表情則帶到 +0.82。這些是量度數值,並非對動作觀感的評價。
札記第 2 則
無人讀出的台詞
- 問題
- 口部只會跟隨真實音訊,因此文字回覆令角色既無聲亦不動。
- 決定
- 既然沒有聲音可量度,本人便由文字生成口型:每個假名或漢字張口一次,拉丁字母約每三個一次,遇標點則停頓;並以文字本身作為種子,令同一句台詞的口型每次相同。口型走與真實音訊相同的路徑,頭部手勢照常規劃;Discord 一方則會先檢查回覆是否真的讀出。
- 結果
- 已於終端機聊天中實機驗證:口部開合峰值為 0.82,持續約 5.6 秒,並伴隨 2 度點頭,其後閉合。Discord 一方以模擬物件編寫,尚未實機觀察。
札記第 3 則
讓路給手勢的一瞥
- 問題
- 最初的滑鼠視線只會在滑鼠移動過且角色沉默時觸發,因此說話期間或滑鼠靜止時都不會出現。
- 決定
- 首個版本完成 14 分鐘後,本人取消這兩項條件,改為每 25 至 70 秒定時觸發。由於視線會帶動頭部,現在只有已規劃的語音手勢才能阻止視線,或在 0.25 秒內令其淡出。
- 結果
- 在一段 14 秒、滑鼠靜止的片段上讀回引擎數值:視線出現於 0 至 2.3 秒、5 至 6.8 秒及 9.3 至 11.8 秒,手勢則位於 2.3 至 3.1 秒、7.0 至 8.4 秒及 11.7 至 13.0 秒。視線沒有在任何手勢期間出現,僅最後一次在淡出時與手勢重疊 0.1 秒。
2026年10月19日
Discord 圖片理解功能合併
里程碑2026年10月17日
視線跟隨滑鼠改為讓路給語音手勢
里程碑2026年10月17日
為無人讀出的台詞加入文字驅動口型
里程碑2026年10月16日
本人首次提交:Python 3.13 及 3.14 安裝路徑
里程碑2026年10月9日
keithku321 展開項目
里程碑