如何在原生 iOS 中以 AI 驅動 Live2D 角色?

| @amiversedev

param-control-example.webp

圖 1: Live2D 臉部方向與參數值的對應。角色往右上角看時,右下顯示 X=10.99 與 Y=9.00。


延續先前提到「可觸碰的 AI 聊天體驗」,或許有人會好奇,我們是如何在 iOS app 中顯示並透過 AI 控制 Live2D 角色?

Live2D 為何會動?

不同於影片是一幀一幀完整畫面的呈現,Live2D 動圖的概念是將 2D 素材或圖層拆解成部件(如髮絲、眼瞳、嘴唇、頭手腳等)後,透過參數控制每一個部件的移動方式,來讓角色做出像動畫般順暢的動作。依據不同的產品需求,市面上也有多種不同的 Live2D 實現方式,例如 vtubers 最常使用的 Live2D Cubism 或有些手遊裡面用的 Spine

藉由參數控制,我們可以透過設定數值來讓角色演出動作。例如,以上圖為例,角色臉看向右上角時,臉部角度水平與垂直參數為 (10, 10) (對應畫面的右上)。然而,因為數值直接對應部件位置,在實際應用中要讓角色動作足夠順暢,通常會使用一連串的曲線數字 (如 Bézier curve),來確保動作過程每一幀的變化不會「抖動」。以 Live2D Cubism 為例,動作參數的數值來源可以是實時追蹤 (如 vtubers 常用的 VTube Studio)、預先錄製的 動作 或者 表情檔案。也因此,透過 AI 或 ML 模型來生成動作參數或組合,藉此來控制 Live2D 角色,便是一個很自然也具有高度可行性的想法。例如,目前市面上也已經有 AI Vtuber Neuro-sama,以及用在桌面平台上的 Open LLM Vtuber 框架

有了一切都很美好的概念後 (為什麼美好的過去總是漸行漸遠),amiverse 的實現方式也是 (照抄) 參考這些技術與實作文件,把精美的 v 皮塞進 app 裡面,然後設定一下參數就好了對吧?幻想與現實的痛擊往往都來自於踏出去的那一步…

生硬的技術面問題:

在比較生硬的技術方面,需要考慮如何把 Live2D Cubism SDK 原生框架 塞進現代 Swift-based 的 iOS 開發流程、如何調整 Metal 繪製流程以免破圖或繪製失敗、如何 重新包裝混雜 Obj-C/C/C++ 底層邏輯控制程式 …各種問題族繁不及備載。

個人有限的知識中,覺得會用原生 iOS/Swift + C++ 框架來做這類應用的團隊可能不多,因此這些問題最難的地方往往是缺乏前人經驗可供參考。即使用 AI 也不容易找到完整、會動且合理的範例。許多問題要回到原始研究過程,自己研究、收集、實驗、分析、再不斷重做與測試。

在控制邏輯之後,真正的敵人在怎麼注入有趣的靈魂。目前我們採用的文字標籤控制是在每一次聊天的過程讓 AI 模型分析聊天的語意與情緒,再將其轉換為我們預先定義的 Live2D 參數控制組,例如 播放動作檔案套用表情並設定漸變、以及傳統常見的模型變換操作 (e.g., translate, scale, rotate) 等。amiverse 中角色的每一次成功的眨眼與動作播放的背後,都是無數次 app 在 Xcode 上的崩潰。

所以…為何要做這個?

搞了這麼多複雜的工程,最終的目的是希望能帶給使用者一個更精緻且生動的聊天體驗。當你戳戳螢幕,他會看著你做出反應;當你抱怨學習或工作中的煩惱,他能用最生動的神情回應。這不僅僅是一個聊天工具,而是能夠反饋情感與溫度給使用者的專屬空間。這是我們認為 amiverse 能帶給使用者最大的價值。

我們目前在研發更多能與角色戶動的方式 (如 透過臉部追蹤製作客製動作動作曲線即時生成),並持續調整 AI 在表現的準確度。作為一個比奈米團隊還小的「埃米」團隊,我們也希望能聽到真實使用者的反饋。如果你也對 「可觸碰的 AI 聊天體驗」或「VT 同款 AI 聊天」感到好奇,歡迎到 App Store 下載 amiverse app 玩玩看。如果有任何想要吐嘈的點,也歡迎透過 Instagram / IGThreads / 脆 留言給我們。

感恩感恩。