JOVANA
Explore Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

構音與音素解碼:編碼模型

為何腹側感覺運動皮質編碼的是聲道動作而非音素或聲音,以及時序編碼模型如何據此建立解碼器。

構音假說

組織起現代語音 BCI 的核心發現是:vSMC 編碼的不是音素、也不是聲音,而是構音動作學——聲道發音器官連續而協調的動作。解碼這些構音動作的泛化能力,遠勝於直接解碼聲學,因為少數幾個發音姿勢重新組合,就能構成開放而無盡的詞彙。學會這些姿勢,你就能產生解碼器在訓練時從未見過的詞。

編碼模型

為使此說法精確,我們把每個電極的反應建模為構音特徵的時空濾波器。令 a_f(t) 為構音特徵 f(例如唇開度或舌尖高度)的軌跡、r_i(t) 為通道 i 的反應(通常是高伽瑪功率),則線性編碼模型為:

r_i(t) \;=\; \sum_{f=1}^{F}\sum_{\tau=0}^{T_\ell} \beta_{i,f}(\tau)\, a_f(t-\tau) \;+\; \varepsilon_i(t)

時空感受野:每個通道的反應是構音特徵在一段時間延遲範圍內的加權和。濾波器 \beta_{i,f} 即該通道的構音感受野。

每個記錄通道的反應被建模成「構音特徵的加權和」,不只取當下,還橫跨一段近期的時間延遲窗。那些權重就是該通道的感受野——它在聽什麼。

r_i(t)
通道 i 在時間 t 的反應。
a_f(t-\tau)
延遲 \tau 時的構音特徵 f
\beta_{i,f}(\tau)
特徵 f 在延遲 \tau 的權重(感受野)。
\varepsilon_i(t)
特徵無法解釋的殘餘雜訊。

一個對唇閉合調諧的通道,會在雙唇合上後約 50 毫秒放電——在那個延遲上有非零的 \beta,即構音感受野

為每個通道各配適一個這樣的濾波器,你就得到完整的編碼模型——一段關於運動意圖如何化為神經活動的正向描述。判讀配適出的權重,便能看出每個電極在意哪些發音器官、以及延遲多久;這正是狀態空間路線中貝氏解碼器所要反轉的同一個觀測模型

音素與語音特徵解碼

你也可以在音素層級解碼,或更好地在語音特徵層級——構音部位、構音方式與清濁——進行解碼。母音依類似共振峰的結構區分,子音則依聲道在何處、如何收窄而區分。先解碼特徵階層、再組裝音素,對扁平音素分類器所犯的混淆較具韌性,因為聲學上相近的音素共享特徵,失誤時也較為溫和。

聲學到構音的反演

這裡有個實務上的難處:對嘗試發聲的癱瘓使用者而言,我們無法量測其發音器官——根本沒有舌頭動作可記錄。因此我們推論其意圖的構音軌跡,通常是借用一位念出相同目標句子的參考語者,並執行聲學到構音的反演。這種反演是不適定的:許多聲道形狀會產生近乎相同的聲音。推論出的軌跡便充當偽標籤,用來訓練神經編碼與解碼模型。

從編碼到解碼

要真正驅動輸出,你得反轉模型。可解讀的基準是一個正則化的線性解碼器——從神經特徵到動作學的脊迴歸——其封閉形式是值得爛熟於心的主力工具:

\hat{W} \;=\; \arg\min_{W} \lVert A - RW \rVert_F^2 + \lambda \lVert W \rVert_F^2 \;=\; \bigl(R^{\top}R + \lambda I\bigr)^{-1} R^{\top} A

脊(Tikhonov)迴歸:在通道眾多且彼此相關、訓練資料僅有數分鐘的情況下,正則化項 \lambda 不可或缺。之後深層循環解碼器會取代這個映射,但線性配適是任何結果都應該勝過的誠實基準。

為了把編碼模型反解成解碼器,脊迴歸配適出能重現資料的權重,但透過懲罰過大的權重來保持謙遜。在通道眾多且相關、資料只有幾分鐘的情況下,正是這個懲罰讓配適不致爆掉。它是任何更花俏的解碼器都必須勝過的誠實基準。

\hat{W}
配適出的解碼權重。
\lVert A - RW \rVert_F^2
RW 偏離目標 A 有多嚴重。
\lambda \lVert W \rVert_F^2
對權重大小的懲罰;\lambda 決定它的強度。
\bigl(R^{\top}R + \lambda I\bigr)^{-1} R^{\top} A
閉式解。

即使通道近乎冗餘,\lambda I 這一項也能讓 R^{\top}R 保持可逆——這就是 Tikhonov(脊)正則化

# R: (T, C) neural features, e.g. high-gamma power per channel
# A: (T, F) target articulatory kinematics
import numpy as np
lam = 1e2
W = np.linalg.solve(R.T @ R + lam * np.eye(R.shape[1]), R.T @ A)
A_hat = R @ W          # predicted kinematics
數行程式碼即可完成的封閉形式線性構音解碼器。