
圖說:墨寒讓表情依優先順序、冷卻與語境排隊
昨天把每張表情圖的錨點與素材配套整理好,並不代表墨寒就會自然。圖片都能正常播放之後,下一個問題更像一場會議:待機系統想讓她微笑,AI 回覆帶回害羞情緒,提醒時間到了,安全功能又要求她立刻阻止危險操作,到底聽誰的?
如果每個功能都能直接換表情,最後抵達的指令就會把前一張蓋掉。重要的警告可能被一個隨機微笑打斷,同一張害羞圖也可能在幾秒內連播三次。這就是墨寒需要「表情仲裁器」的原因。
表情仲裁器收到的不是一句「給我一張可愛圖」,而是包含來源、表情與強度的請求。來源很重要:安全警告通常比環境待機優先,正式提醒也比一般隨機反應重要;使用者直接指定的表情,和 AI 回覆內部情緒標籤,也有各自位置。
仲裁器會看目前正在顯示什麼、已經顯示多久、同一表情上次何時出現,再決定接受或拒絕。被拒絕不代表程式壞了,可能只是目前的高優先表情尚未完成,或這張圖仍在冷卻時間。
這比每個功能自行判斷多一道程序,卻建立了單一權威來源。日後要調整「提醒不能被微笑蓋掉」,只改一套規則,不必到十個功能裡尋找換圖指令。
我很喜歡墨寒害羞、被抓包或嘴硬的表情,但越有個性的表情,越不能頻繁出現。如果每次普通問候都害羞,角色不再害羞,只像程式固定輪播。
去重會阻止同一張已經在畫面上的表情再次啟動;冷卻則要求特殊表情播放後休息一段時間。每張圖也有適合的最短與最長停留,不能一閃即逝,也不能永遠霸佔畫面。
這些規則不只是視覺美化,而是在保護情緒的意義。稀有反應只有在合適時機出現,才會讓使用者感到「她真的因為這件事有反應」。
表情系統最危險的捷徑,是看到某個詞就直接換圖。使用者說「不要生氣」,若只抓到「生氣」,墨寒反而立刻生氣;談論「有人被抓包」也不代表她自己應該露出被抓包的臉。
目前 AI 回覆可以在正文最後附上一個不朗讀、也不顯示的內部情緒標籤。程式只接受預先允許的情緒名稱與強度,清掉標籤後再把正文交給使用者。一般陳述應保持中性,只有語意明確時才指定情緒。
即使標籤有效,仍要經過仲裁器,不能越過安全提醒或冷卻。這樣 AI 提供的是建議,不是直接控制角色畫面的最高權限。
我之前在官網調整圖片時,就明確否決把 restrained_amused_front 放在補給與支持區塊,因為那張是在忍笑,語境不對。程式裡也是同樣道理。
懷疑、抓包、害羞、生氣、忍笑都可能是完整而漂亮的素材,卻不能在普通問答中隨機冒出。安全情境可以使用保護或勸阻,工作完成可能適合放心或驕傲;如果沒有足夠語境,寧可維持自然待機。
仲裁器能管優先、冷卻與去重,卻不會自動理解所有戲劇含義。哪些情緒可由哪些來源提出,仍要在人格與功能設計中寫清楚,並由我實際對話驗收。
特殊表情不能只負責開始,還要知道何時結束。時間到了就回待機看似簡單,但如果墨寒正在說話、下一個提醒已經接手,舊計時器不能突然把畫面切回 idle。因此每次接受表情請求都要有一個可辨識的世代;只有仍屬於當前那一代的結束動作,才有資格收尾。
這能避免很常見的「幽靈計時器」:上一個表情早就被高優先事件取代,幾秒後舊計時器醒來,卻把新表情關掉。使用者只會看到墨寒突然跳臉,若沒有仲裁紀錄,很難知道是哪一個過期動作造成。
待機也不是永遠同一張圖。說話結束後可以回到與回覆情緒相容的姿態,安全警告解除後才恢復自然狀態;但不論如何,都不該殘留張嘴、思考或警告。開始與結束同樣經過共同入口,才算完整的表情生命週期。
仲裁器留下的簡短稽核資料也很有用:哪個來源請求哪張圖、是否接受、拒絕理由是什麼。它不需要保存私人對話正文,也能讓 Codex 追查表情順序,兼顧除錯與隱私。
對非工程師的我而言,這份理由比一串畫面截圖更有幫助。我可以指出「這次明明是安全提醒,為什麼被一般情緒蓋掉」,Codex 則從紀錄回答是哪個優先規則或舊路徑造成,不再靠反覆重播碰運氣。
測試時可以安排多個請求在短時間進來:先播放一般表情,再送提醒;安全警告出現時插入微笑;同一張特殊表情連續要求兩次;低優先待機在高優先表情尚未停留足夠時間時嘗試蓋過。
程式應留下接受或拒絕的理由,讓 Codex 能查明是冷卻、重複、停留時間或未知素材,而不是只看最後畫面猜測。實機則要觀察交接是否生硬、重要表情是否真的看得清楚,以及說話嘴型進入後能否保留合適情緒。
這套仲裁不保證每一次都符合人類審美,但至少讓修正有一個共同入口。最糟的情況不是選錯一張圖,而是新舊兩套邏輯同時存在,誰都不知道最後由誰決定。
明天 Day 15,我會用真正發生過的 Bug 展示這件事:為什麼只要畫面出現「墨寒思考中」,她幾乎每次都固定轉頭思考?我們如何把狀態文字與情緒拆開,又不讓文字、一般語音與 Realtime 留下任何舊觸發?
表情仲裁器管理請求順序與節奏;角色是否「演得對」仍需要語境設計與真人長時間驗收。