返回項目列表

Python・VTube Studio 虛擬形象動作

遊戲 AI 伴侶「かぐや」

  • 協作項目
  • 人工智能

一個以本地運行為先的 AI 伴侶,能觀看遊戲畫面、說話,並在 Discord 上以記憶及 Live2D 虛擬形象聊天;預設使用本地模型,並可選用雲端後備。項目主要由 keithku321 開發,本人負責虛擬形象的動作部分及 Discord 圖片理解。

眨眼 · 視線 · 擺動30 Hz
據程式庫內容繪製的海報

數字紀錄

646行動作引擎程式碼,全部出自本人提交
  • 單一動作迴圈30 Hz
  • 種情感以情緒座標表示16
  • 個動作及安裝相關的測試函式55
  • 個圖片理解測試函式35
§ 01

概覽

一個主要由 keithku321 開發的私人 Windows 伴侶項目,能觀看畫面上的遊戲並加以評論,在 Discord 上以記憶聊天,並以動態 Live2D 角色現身;預設使用本地模型,並可選用雲端後備。本人負責令角色眨眼、環顧及隨說話做出手勢的動作層、透過本地視覺模型理解 Discord 聊天中的圖片,以及較新 Python 版本的安裝路徑。此處列出的技術屬於整個項目;本人的工作以 Python 配合 VTube Studio API 進行。由於程式庫為私人性質,本頁只提供文字說明及統計數字。

§ 02

動態摘要

眨眼視線擺動情緒呼吸30 Hz
眨眼、視線、擺動、情緒及呼吸各自加入細微偏移,由一個混合器相加,再由單一 30 Hz 迴圈送出。
§ 03

本人貢獻

  • 為 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 個動作及安裝相關的測試函式;此數字由原始碼點算得出,並非測試運行結果。
§ 04

運作方式

  1. 伴侶的回覆

    由 keithku321 的系統決定回覆內容、展示的情感,以及台詞是否讀出。

  2. 口型包絡

    語音片段使用 keithku321 的語音跟隨口型;無人讀出的台詞則以本人的文字口型走同一路徑。

  3. 語音規劃器

    在響亮的起音處安排細微動作,並按片段長度安排最多三個較大的手勢。

  4. 動作層

    以種子控制的眨眼、視線、擺動及呼吸,加上平滑過渡的情緒及視線跟隨滑鼠,各自產生細微偏移。

  5. 混合器與迴圈

    由一個混合器疊加各層,並由單一迴圈負責寫入,因此口部與動作不會互相覆蓋。

  6. VTube Studio

    接收數值,帶動畫面上的 Live2D 角色。

§ 05

工程札記

札記第 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 秒。
§ 06

開發時間線

此項目沒有錄影片段。

  1. 2026年10月19日

    Discord 圖片理解功能合併

    里程碑
  2. 2026年10月17日

    視線跟隨滑鼠改為讓路給語音手勢

    里程碑
  3. 2026年10月17日

    為無人讀出的台詞加入文字驅動口型

    里程碑
  4. 2026年10月17日

    加入動作引擎

    里程碑
  5. 2026年10月16日

    本人首次提交:Python 3.13 及 3.14 安裝路徑

    里程碑
  6. 2026年10月9日

    keithku321 展開項目

    里程碑