5D Library › 发声的生物力学与注意力转移 · English
第六章 嗓音测量:基频微扰、振幅微扰与谐噪比
三个数字
真实嗓音的任何两个周期都不完全相同。有三个指标概括它们相差多少,以及伴随着多少噪声 (Boersma 1993; Boersma and Weenink 2026)。
- 基频微扰(jitter,局部)是相邻周期长度之差的绝对值的平均,除以平均周期,以百分比表示。它描述音高逐周期的不规则。
- 振幅微扰(shimmer,局部)以同样方法计算相邻周期的振幅。它描述响度逐周期的不规则。
- 谐噪比(HNR,单位分贝)比较信号中的周期成分与非周期成分。博尔斯马(Boersma)的方法用周期处的归一化自相关 来估计:。
粗糙、紧张或气息声重的嗓音,通常比清晰的嗓音有更高的基频微扰和振幅微扰、更低的谐噪比;健康成年人持续元音的谐噪比通常在 20 dB 左右。
推导
两个 220 Hz 的合成嗓音,按已知的周期与振幅不规则程度和气息噪声构建:一个「紧张粗糙」,一个「放松清晰」。程序像分析软件那样,只从波形测量:找出每个周期的峰,插值求出其位置,然后计算基频微扰、振幅微扰和谐噪比。
import math, random
FS, F0 = 44100, 220.0
def synth(jitter, shimmer, noise, dur=0.6, seed=1):
"""A sung vowel-like tone: each cycle has its own period and amplitude, plus breath noise."""
rnd = random.Random(seed)
x, t0 = [], 1 / F0
while len(x) < dur * FS:
T = t0 * (1 + rnd.gauss(0, jitter))
A = 1 + rnd.gauss(0, shimmer)
n = round(T * FS)
x += [A * sum(math.sin(2 * math.pi * h * k / n) / h ** 1.2 for h in range(1, 9)) for k in range(n)]
return [v + rnd.gauss(0, noise) for v in x]
def smooth(x, w=9):
h = w // 2
out, acc = [], sum(x[:w])
out = [0.0] * h
for k in range(h, len(x) - h - 1):
out.append(acc / w)
acc += x[k + h + 1] - x[k - h]
return out + [0.0] * (len(x) - len(out))
def measure(x):
n0 = round(FS / F0)
xs = smooth(x) # light low-pass so noise does not move the peaks
# cycle peaks: the largest sample in successive windows that follow the last peak
peaks, i = [], max(range(10, n0 + 10), key=lambda k: xs[k])
while i + int(1.3 * n0) < len(x) - 10:
j = max(range(i + int(0.7 * n0), i + int(1.3 * n0)), key=lambda k: xs[k])
a, b, c = xs[j - 1], xs[j], xs[j + 1]
peaks.append((j + 0.5 * (a - c) / (a - 2 * b + c), b)) # parabolic interpolation
i = j
P = [(q[0] - p[0]) / FS for p, q in zip(peaks, peaks[1:])]
A = [v for _, v in peaks]
jit = sum(abs(a - b) for a, b in zip(P, P[1:])) / (len(P) - 1) / (sum(P) / len(P)) * 100
shim = sum(abs(a - b) for a, b in zip(A, A[1:])) / (len(A) - 1) / (sum(A) / len(A)) * 100
# harmonics-to-noise ratio from the normalised autocorrelation at the period lag
m = sum(x) / len(x)
y = [v - m for v in x]
e = sum(v * v for v in y)
r = max(sum(y[k] * y[k + L] for k in range(len(y) - L)) / e * len(y) / (len(y) - L)
for L in range(int(0.8 * n0), int(1.2 * n0)))
hnr = 10 * math.log10(r / (1 - r))
return jit, shim, hnr
for name, j, s, nz in (("tense, rough", 0.012, 0.06, 0.25), ("relaxed, clear", 0.003, 0.02, 0.05)):
jit, shim, hnr = measure(synth(j, s, nz))
print(f"{name:15s} measured jitter {jit:4.2f} %, shimmer {shim:4.2f} %, HNR {hnr:5.1f} dB "
f"(built with jitter ≈ {1.128 * j * 100:.2f} %, shimmer ≈ {1.128 * s * 100:.1f} %)")
# tense, rough measured jitter 2.23 %, shimmer 9.50 %, HNR 9.7 dB (built with jitter ≈ 1.35 %, shimmer ≈ 6.8 %)
# relaxed, clear measured jitter 0.65 %, shimmer 2.79 %, HNR 22.7 dB (built with jitter ≈ 0.34 %, shimmer ≈ 2.3 %)三个指标清楚地区分了两个嗓音。但程序也显示了一个在实践中很重要的局限:测得的基频微扰和振幅微扰高于构建信号时设定的数值,因为噪声移动了表观的峰位。在嘈杂或很不规则的嗓音上测得的基频微扰和振幅微扰,有一部分测的是噪声。三者中谐噪比更稳健。
用好这些指标
注
这些指标只有在稳定的持续元音上才可靠:舒适的音高和响度,在安静的房间里用同一支麦克风、同样的距离录音,每次用同样的方法分析。它们会随音高、响度、元音和录音条件变化,所以学生的数据应当与自己以前的数据比较,而不是与发表的常模比较。发表的「正常值」界限来自特定的临床系统,不能直接套用到其他软件上。
证据
在关于受训歌者在不同注意焦点下音色的研究中,研究者在专家评分之外,还记录了谐噪比和较高共振峰的相对强度等声学指标 (Atkins 2015)。声学指标与听者评分并不总是一致,这也是第八章的试验同时使用一个声学结局和一个音准结局的原因之一。
假说 · 尚未验证
尚未确立。 对初学者,在触觉锚定和外部焦点下唱五分钟,与在内部焦点指令下唱五分钟相比,在音高和响度相同时,持续元音的谐噪比至少提高 2 dB。该假说预测:在第八章的试验中,两组谐噪比变化之差至少为 2 dB。如果该差值的 95% 置信区间完全低于 2 dB,假说就被推翻。
参考文献
Fan, Y. (2026). The Biomechanics of Phonation and Attentional Shift: Myoelastic-Aerodynamic Theory, the Singer's Formant, Auditory-Motor Feedback and External Focus of Attention [发声的生物力学与注意力转移] (Version 1.0.0). 5D Library. https://doi.org/10.5281/zenodo.23719625 · Licensed under Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International (CC BY-NC-ND 4.0).