5D Library › 嗓音生物力学、非线性源-滤波耦合与听觉-运动反馈的数学模型 · English

第五章 听觉—运动闭环:变调反射、DIVA 与带延迟的状态估计

一个慢回路

第 10 本第三章区分了音高控制的前馈(学会的指令,在听到之前就落在音上)与反馈(纠正听到的与想要的之差),并用带 120 毫秒延迟的模型 ẋ(t)=−Gx(t−τ)\dot x(t) = -Gx(t-\tau) 说明 GτG\tau 超过 π/2\pi/2 时纠正越用力音高越摇晃。本章问:实验中的反馈反应是什么样的?神经模型怎样组织两者?「内部模型」能把延迟问题解决到什么程度?

变调反射

证据

让受试者持续发一个音,同时用电子方法把耳机中他自己声音的音高突然升高或降低:受试者的基频多半会向与偏移相反的方向改变,反应通常只补偿偏移的一部分;偏移较大时,与偏移同向的「跟随」反应会增多 (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
120 毫秒听觉延迟下,三种控制器在同一次噪声实现中保持音高的过程(前 4 秒)。直接反馈增益较低(深青)时误差在几音分内漂移;增益提高到每秒 13(暗红)时回路开始振荡;内部模型加卡尔曼估计(蓝)可以用大得多的纠正增益而不振荡。参数为示意值。

结果分四点。

第一,完全没有反馈时(只有前馈),漂移累积,20 秒内的均方根误差达到 30.4 音分。第二,直接延迟反馈有一个狭窄的「好用」范围:增益每秒 5 时误差最小(7.0 音分),增大到每秒 11 时误差反而升到 11.9,每秒 13(Gτ=1.56G\tau = 1.56,离连续时间的极限 π/2\pi/2 只差一点)时已经振荡,均方根误差 274 音分,每秒 15 时振荡增长得更快。这是因为离散时间的稳定极限比连续时间的 π/2\pi/2 略低(这个每步 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 模型把言语与歌唱组织为前馈控制加听觉与体感反馈,反馈纠正逐渐被吸收进前馈;状态反馈控制理论则强调内部模型与预测。程序显示,直接延迟反馈只有一个狭窄的好用增益范围,增益过高即振荡;加入内部模型与卡尔曼估计后,可以用大增益而保持稳定,但延迟期间的漂移形成一个无法突破的误差下限。「注意骨导与共鸣能瞬间稳住音准」改写为一个关于掩蔽条件下体感加权的假说。下一章看噪声与耳塞怎样改变这个回路。

参考文献

Burnett, Theresa A., M. B. Freedland, Charles R. Larson, and Timothy C. Hain. 1998. “Voice F0 Responses to Manipulations in Pitch Feedback.” Journal of the Acoustical Society of America 103 (6): 3153–61.
Guenther, Frank H. 2006. “Cortical Interactions Underlying the Production of Speech Sounds.” Journal of Communication Disorders 39 (5): 350–65.
Hain, Timothy C., Theresa A. Burnett, Swathi Kiran, Charles R. Larson, Shajila A. Singh, and M. K. Kenney. 2000. “Instructing Subjects to Make a Voluntary Response Reveals the Presence of Two Components to the Audio-Vocal Reflex.” Experimental Brain Research 130 (2): 133–41. https://doi.org/10.1007/s002219900237.
Houde, John F., and Srikantan S. Nagarajan. 2011. “Speech Production as State Feedback Control.” Frontiers in Human Neuroscience 5: 82. https://doi.org/10.3389/fnhum.2011.00082.
Kalman, Rudolf E. 1960. “A New Approach to Linear Filtering and Prediction Problems.” Journal of Basic Engineering 82 (1): 35–45. https://doi.org/10.1115/1.3662552.
Tourville, Jason A., and Frank H. Guenther. 2011. “The DIVA Model: A Neural Theory of Speech Acquisition and Production.” Language and Cognitive Processes 26 (7): 952–81.
Wolpert, Daniel M., Zoubin Ghahramani, and Michael I. Jordan. 1995. “An Internal Model for Sensorimotor Integration.” Science 269 (5232): 1880–82. https://doi.org/10.1126/science.7569931.
Zarate, Jean Mary, and Robert J. Zatorre. 2008. “Experience-Dependent Neural Substrates Involved in Vocal Pitch Regulation During Singing.” NeuroImage 40 (4): 1871–87. https://doi.org/10.1016/j.neuroimage.2008.01.026.

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).