5D Library › 嗓音生物力学、非线性源-滤波耦合与听觉-运动反馈的数学模型 · English
第五章 听觉—运动闭环:变调反射、DIVA 与带延迟的状态估计
一个慢回路
第 10 本第三章区分了音高控制的前馈(学会的指令,在听到之前就落在音上)与反馈(纠正听到的与想要的之差),并用带 120 毫秒延迟的模型 说明 超过 时纠正越用力音高越摇晃。本章问:实验中的反馈反应是什么样的?神经模型怎样组织两者?「内部模型」能把延迟问题解决到什么程度?
变调反射
证据
让受试者持续发一个音,同时用电子方法把耳机中他自己声音的音高突然升高或降低:受试者的基频多半会向与偏移相反的方向改变,反应通常只补偿偏移的一部分;偏移较大时,与偏移同向的「跟随」反应会增多 (Burnett et al. 1998)。这类反应的潜伏期常被概括为约 100–150 毫秒,但不同研究、不同反应类型报告的平均值可以长到约 200 毫秒 (Burnett et al. 1998)。哈因等人让受试者在听到偏移时主动作出反应,发现反应包含两个成分:一个较早、相对自动的成分,以及一个潜伏期长到足以由随意控制产生的较晚成分;指令改变了两者的时程与幅度 (Hain et al. 2000)。扎拉特与扎托雷用功能磁共振比较受过训练的歌者与非音乐人:被要求补偿时两组的补偿程度没有差别;被要求忽略两个半音的反馈偏移时,歌者能抑制补偿反应,基频与听到未改变反馈时相近,非音乐人却做不到 (Zarate and Zatorre 2008)。
下面的程序把变调反射写成一个带延迟的「漏积分」回路:耳机返回的是实际音高加上实验偏移(+100 音分,持续 200 毫秒),纠正作用于 120 毫秒之前听到的误差,并带有少量运动噪声。潜伏期按实验者的方法读取:40 次试验平均后,反应首次离开基线 ±2 个标准差、并持续 20 毫秒的时刻。
推导
# The pitch-shift reflex as a delayed, leaky feedback loop (a sketch, not a fitted model).
# y: sung pitch (cents re target). Headphones return h = y + s, s = +100 cents, 0.5-0.7 s.
# Correction acts on what was heard tau earlier: c' = -G h(t - tau) - c / T_leak; y = c +
# small motor noise; tau = 120 ms (assumed, inside the 100-150 ms range). Latency is read
# as experimenters do: when the mean of 40 trials leaves +/- 2 SD of the pre-shift
# baseline and stays out for 20 ms.
import math, random
DT, TAU, T_LEAK = 0.001, 0.120, 0.5
def trial(G, rnd, shift=100.0):
n, lag = 1300, int(TAU / DT)
y, h, c = [0.0] * n, [0.0] * n, 0.0
for i in range(n):
t = i * DT
c += (-G * (h[i - lag] if i >= lag else 0.0) - c / T_LEAK) * DT
y[i] = c + rnd.gauss(0, 2.0)
h[i] = y[i] + (shift if 0.5 <= t < 0.7 else 0.0)
return y
def average(G, k=40, seed=7):
rnd = random.Random(seed)
runs = [trial(G, rnd) for _ in range(k)]
return [sum(r[i] for r in runs) / k for i in range(len(runs[0]))]
print("gain G (1/s) | latency (ms after shift) | largest opposing change | share")
for G in (1.0, 2.0, 4.0):
m = average(G)
base = m[300:500]
mu = sum(base) / len(base)
sd = math.sqrt(sum((v - mu) ** 2 for v in base) / (len(base) - 1))
onset = next(i for i in range(500, 1300) if all(v < mu - 2 * sd for v in m[i:i + 20]))
peak = min(m[500:1000])
print(f" {G:4.1f} | {onset - 500:24d} | {peak:+17.1f} cents |"
f" {-peak / 100:4.0%}")
print(f"loop delay assumed: {TAU * 1000:.0f} ms; responses oppose the shift,"
" as in experiments")
# gain G (1/s) | latency (ms after shift) | largest opposing change | share
# 1.0 | 129 | -16.5 cents | 17%
# 2.0 | 122 | -32.1 cents | 32%
# 4.0 | 122 | -61.5 cents | 62%
# loop delay assumed: 120 ms; responses oppose the shift, as in experiments测得的潜伏期是 122–129 毫秒,略长于假设的 120 毫秒回路延迟:反应必须先增长到高于噪声,才能被「看见」,增益越小,看见得越晚。反应的方向总是与偏移相反,幅度与增益成正比:增益每秒 1、2、4 时,最大反向变化分别为偏移的 17%、32% 和 62%。实验中常见的部分补偿,在这个模型里对应较低的增益——而第 10 本已经说明,增益不能无限提高。
DIVA:前馈、反馈与学习
证据
根瑟的 DIVA 模型(Directions Into Velocities of Articulators)把言语产生描述为一组相互作用的皮层与皮层下区域:一个前馈控制子系统直接发出已学会的运动指令;听觉反馈与体感反馈控制子系统把实际的感觉结果与目标区域比较,在误差出现时产生纠正指令 (Guenther 2006)。图维尔与根瑟进一步把模型作为言语习得与产生的神经理论:模型先在类似咿呀学语的阶段学习运动指令与感觉结果之间的映射,再通过模仿学习每个语音的感觉目标,反馈纠正逐渐被吸收进前馈指令,于是熟练的说话者主要依靠前馈,反馈在受到扰动时才显现出来 (Tourville and Guenther 2011)。另一类理论把言语控制写成状态反馈控制:大脑利用运动指令的「传出副本」与内部模型预测当前状态,再用延迟、有噪声的感觉反馈修正这一估计,控制作用于估计出的状态 (Houde and Nagarajan 2011)。这与运动控制研究中「内部模型用于感觉—运动整合」的观点一致 (Wolpert et al. 1995),其数学原型是卡尔曼滤波 (Kalman 1960)。
状态反馈正好对着第 10 本模型的弱点:把 120 毫秒前听到的误差乘上大增益,是对着「过去」纠正;把此后已发出的指令加到延迟的测量上,就得到对「现在」的估计(史密斯预估器的形式),卡尔曼滤波负责在噪声中给出最好的估计。
程序:延迟反馈与内部模型
下面的程序以 10 毫秒为一步。音高误差像随机游走一样漂移,并被运动指令改变;听觉报告的是 12 步(120 毫秒)之前的音高,带有感觉噪声。比较两种控制器:直接延迟反馈,以及「内部模型 + 卡尔曼估计 + 对估计纠正」。
推导
# Holding a note with a 120 ms auditory delay, 10 ms steps. Pitch error y (cents) drifts:
# y[k+1] = y[k] + b u[k] + w, w ~ N(0, 1.5^2); hearing z[k] = y[k-D] + v, v ~ N(0, 8^2)
# (a) direct feedback u = -g z. (b) forward model + Kalman: estimate y[k-D] from z, add
# the commands sent since (efference copy) to predict y[k], u = -L x prediction
# (Smith-predictor form, after state-feedback accounts of speech). Noise levels and gains
# are illustrative.
import math, random
D, SW, SV = 12, 1.5, 8.0
def simulate(mode, gain, b_true=1.0, steps=2000, seed=0, trace=False):
rnd = random.Random(seed)
y, ys, us, e, P, err2, out = 0.0, [0.0] * (D + 1), [0.0] * (D + 1), 0.0, 25.0, 0.0, []
for k in range(steps):
z = ys[-D - 1] + rnd.gauss(0, SV) # heard now: y from D steps ago
if mode == "direct":
u = -gain * z
else:
# internal-model step for y[k-D]
e, P = e + us[-D - 1], P + SW ** 2
K = P / (P + SV ** 2)
# Kalman update with the late sample
e, P = e + K * (z - e), (1 - K) * P
u = -gain * (e + sum(us[-D:])) # + commands sent since then
y = y + b_true * u + rnd.gauss(0, SW)
ys, us = ys[1:] + [y], us[1:] + [u]
err2 += y * y
out.append(y)
return (math.sqrt(err2 / steps), out) if trace else math.sqrt(err2 / steps)
def rms(mode, gain, **kw): # average over 10 noise realisations
return sum(simulate(mode, gain, seed=s, **kw) for s in range(10)) / 10
if __name__ == "__main__":
print(f"no correction (feedforward only): RMS error {rms('direct', 0.0):6.1f} cents")
print("direct delayed feedback, gain per 10 ms step (G = gain / 0.01 s):")
for g in (0.02, 0.05, 0.08, 0.11, 0.13, 0.15):
r = rms("direct", g)
txt = (f"{r:6.1f} cents" if r < 60 else
f"{r:6.0f} cents <- oscillates" if r < 1000 else
" > 1000 cents <- oscillation grows")
print(f" g = {g:.2f} (G = {g * 100:4.0f}/s, G*tau = {g * D:.2f}): RMS {txt}")
print("forward model + Kalman estimate, then the same kind of correction:")
for L in (0.2, 0.5, 0.9):
print(f" L = {L:.1f}: RMS {rms('kalman', L):6.1f} cents")
print("forward model wrong by 40 % (true command effect 1.4 x the model's), L = 0.9:")
print(f" RMS {rms('kalman', 0.9, b_true=1.4):6.1f} cents")
print(f"stability limit, direct feedback: G*tau below about pi/2 = {math.pi / 2:.2f}")
print(f"floor no controller can beat: drift over the delay and one step, sqrt(D + 1) x 1.5"
f" = {math.sqrt(D + 1) * SW:.1f} cents")
# no correction (feedforward only): RMS error 30.4 cents
# direct delayed feedback, gain per 10 ms step (G = gain / 0.01 s):
# g = 0.02 (G = 2/s, G*tau = 0.24): RMS 8.6 cents
# g = 0.05 (G = 5/s, G*tau = 0.60): RMS 7.0 cents
# g = 0.08 (G = 8/s, G*tau = 0.96): RMS 7.6 cents
# g = 0.11 (G = 11/s, G*tau = 1.32): RMS 11.9 cents
# g = 0.13 (G = 13/s, G*tau = 1.56): RMS 274 cents <- oscillates
# g = 0.15 (G = 15/s, G*tau = 1.80): RMS > 1000 cents <- oscillation grows
# forward model + Kalman estimate, then the same kind of correction:
# L = 0.2: RMS 6.8 cents
# L = 0.5: RMS 6.5 cents
# L = 0.9: RMS 6.4 cents
# forward model wrong by 40 % (true command effect 1.4 x the model's), L = 0.9:
# RMS 6.8 cents
# stability limit, direct feedback: G*tau below about pi/2 = 1.57
# floor no controller can beat: drift over the delay and one step, sqrt(D + 1) x 1.5 = 5.4 cents结果分四点。
第一,完全没有反馈时(只有前馈),漂移累积,20 秒内的均方根误差达到 30.4 音分。第二,直接延迟反馈有一个狭窄的「好用」范围:增益每秒 5 时误差最小(7.0 音分),增大到每秒 11 时误差反而升到 11.9,每秒 13(,离连续时间的极限 只差一点)时已经振荡,均方根误差 274 音分,每秒 15 时振荡增长得更快。这是因为离散时间的稳定极限比连续时间的 略低(这个每步 10 毫秒、延迟 12 步的模型约为每秒 12.6),每秒 13 已经略超过它,振荡在 20 秒内缓慢增长。第三,有内部模型时,纠正增益可以大得多(每步 0.2、0.5、0.9)而不振荡,误差降到 6.4–6.8 音分;即使内部模型把指令的效果低估了 40%,误差也只是 6.8。第四,也是最容易被忽略的一点:任何控制器都无法低于约 5.4 音分的下限,因为从被听到的那一刻到下一步之间的 13 步漂移(延迟的 120 毫秒加上当前一步),大脑在那时还不可能知道。内部模型解决的是稳定性问题,而不是信息问题。
注
模型与大脑。 这里的「内部模型 + 卡尔曼滤波」只是状态反馈控制思想的一个最简单的实现,用来说明为什么延迟系统需要预测。它不说明大脑中有一个卡尔曼滤波器,也没有包括 DIVA 中的体感反馈、学习与目标区域。真实歌者的前馈指令如此准确,大部分时候反馈只需做很小的修正——这正是第 10 本讨论的外部注意焦点研究所处的背景。
「注意骨导与共鸣感」:作为假说
框架写道:「把注意力放在骨导与共鸣感知上,能瞬间稳住音准。」第一,「瞬间」与上面的计算不符:100–150 毫秒延迟期间的漂移不可能被任何策略即时消除。第二,骨导声音与气导声音经过同一个耳蜗、同样的听觉通路,延迟并不更短,第六章还会说明外界噪声同样掩蔽它。第三,可能真正独立于听觉的是喉部与胸腔的体感与振动觉,但它们对音高的分辨很粗。用状态估计的语言,这句话可以改写为可检验的假说:在严重掩蔽下,注意这些感觉可能使权重向它们转移、减少大幅音高偏离;在安静条件下则不应有好处。
假说 · 尚未验证
掩蔽下的体感加权假说(尚未确立)。在响亮的伴奏掩蔽下(歌者耳边的自身声音与伴奏之比低于 0 dB),接受「注意喉部与胸腔振动感」指令的歌者,其持续音的平均绝对音高误差小于接受「仔细听自己的声音」指令时;在安静条件下两种指令没有差别或前者更差。可以检验的预测:在一项歌者自身对照的随机交叉研究中,出现「指令 × 掩蔽」的交互作用,掩蔽条件下的差值置信区间完全低于零。如果掩蔽下两种指令也没有差别,这一假说就被推翻。(作者与这一假说的检验结果有利益关系,见序言的利益披露。)
本章小结
变调反射显示,人在发声时持续监听自己:耳机中的音高偏移会在约 100–150 毫秒后引起反向的部分补偿,训练有素的歌者还能按指令抑制它。DIVA 模型把言语与歌唱组织为前馈控制加听觉与体感反馈,反馈纠正逐渐被吸收进前馈;状态反馈控制理论则强调内部模型与预测。程序显示,直接延迟反馈只有一个狭窄的好用增益范围,增益过高即振荡;加入内部模型与卡尔曼估计后,可以用大增益而保持稳定,但延迟期间的漂移形成一个无法突破的误差下限。「注意骨导与共鸣能瞬间稳住音准」改写为一个关于掩蔽条件下体感加权的假说。下一章看噪声与耳塞怎样改变这个回路。
参考文献
Fan, Y. (2026). Vocal Biomechanics, Non-Linear Source-Filter Coupling and Auditory-Motor Feedback: From Titze's Self-Sustained Vocal Fold Oscillation and Vocal-Tract Inertance to the Lombard Effect, Read Beside Classical Chinese Vocal Aesthetics [嗓音生物力学、非线性源-滤波耦合与听觉-运动反馈的数学模型] (Version 1.0.0). 5D Library. https://doi.org/10.5281/zenodo.23770084 · Licensed under Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International (CC BY-NC-ND 4.0).