5D Library › Acoustic Persuasion, Prosodic Information Theory and Interpersonal Physiological Synchrony · 中文
Chapter 5 Emotional Contagion and Acoustic Roughness
Why a scream puts us on alert at once
A scream, even heard through a wall with no words to be made out, puts us on alert instantly. Arnal and colleagues explained why using the modulation power spectrum of sounds, which describes how a sound’s energy is distributed across temporal modulation rates (how fast its envelope rises and falls) and spectral modulations.
Evidence
The acoustic “niche” of screams. Arnal and colleagues analysed screams, ordinary speech, singing and various artificial alarms, and found that the energy of ordinary speech is concentrated in slow envelope modulations of a few per second (the rhythm of syllables), while a substantial part of the energy of screams falls in fast amplitude modulations of about 30–150 Hz, heard as “roughness”. This region is barely used by ordinary speech. The rougher a sound, the more frightening it was judged; functional MRI showed that rough sounds activated the amygdala more strongly (Arnal et al. 2015).
This gives an acoustic explanation for an everyday experience: when tense, angry or frightened, the voice becomes “rough” and “tight”, and listeners tense up in turn. The transmission of emotion between people through voice, face and posture is called emotional contagion in psychology (Hatfield et al. 1993).
Computing roughness
Calculation
Three synthetic one-second sounds (looking only at one frequency band centred on 1 kHz): a calm, speech-like sound with only a 4-per-second syllable rhythm; a tense voice with an added 70 Hz amplitude modulation of depth 0.3; and a scream-like sound with an added 90 Hz modulation of depth 0.9. The envelope is extracted by full-wave rectification and a 2-millisecond moving average, its modulation spectrum is computed from 1 to 250 Hz, and the roughness index is the share of modulation power at 30–150 Hz.
# Roughness as fast amplitude modulation. Arnal et al. (2015) found that screams carry much of their
# energy in temporal modulations of about 30-150 Hz ('roughness'), a range ordinary speech hardly
# uses (its envelope is dominated by syllable-rate modulation of a few hertz). Here: one 1-kHz
# frequency band of three SYNTHETIC 1-second sounds, sampled at 8 kHz. The envelope is recovered by
# full-wave rectification and a 2-ms moving average, decimated to 1 kHz; its modulation spectrum is
# a discrete Fourier transform from 1 to 250 Hz. Roughness index = share of modulation power at 30-150 Hz.
import math
FS = 8000
def sound(am): # am: list of (modulation frequency Hz, depth)
out = []
for n in range(FS):
t = n / FS
env = 1.0
for f, d in am: env *= 1 + d * math.sin(2 * math.pi * f * t)
out.append(env * math.sin(2 * math.pi * 1000 * t))
return out
def mod_spectrum(x):
r = [abs(v) for v in x]
w = int(0.002 * FS); acc = sum(r[:w]); env = []
for i in range(w, len(r)):
acc += r[i] - r[i - w]
if i % 8 == 0: env.append(acc / w) # decimate to 1 kHz
m = sum(env) / len(env); env = [e - m for e in env]; n = len(env)
spec = {}
for f in range(1, 251):
re = sum(e * math.cos(2 * math.pi * f * k / 1000) for k, e in enumerate(env))
im = sum(e * math.sin(2 * math.pi * f * k / 1000) for k, e in enumerate(env))
spec[f] = (re * re + im * im) / n
return spec
SOUNDS = {"calm speech-like: 4 Hz syllable rhythm": [(4, 0.8)],
"tense voice: + 70 Hz modulation, depth 0.3": [(4, 0.8), (70, 0.3)],
"scream-like: + 90 Hz modulation, depth 0.9": [(4, 0.8), (90, 0.9)]}
for name, am in SOUNDS.items():
s = mod_spectrum(sound(am))
total = sum(s.values()); rough = sum(v for f, v in s.items() if 30 <= f <= 150)
peak = max(s, key=s.get)
print(f"{name:43s}: roughness index {rough / total:5.1%}, strongest modulation at {peak} Hz")
# calm speech-like: 4 Hz syllable rhythm : roughness index 0.0%, strongest modulation at 4 Hz
# tense voice: + 70 Hz modulation, depth 0.3 : roughness index 14.8%, strongest modulation at 4 Hz
# scream-like: + 90 Hz modulation, depth 0.9 : roughness index 60.1%, strongest modulation at 90 HzThe calm sound has almost no roughness; the “tense” sound with moderate 70 Hz modulation has a roughness index of about 15 %, its strongest modulation still the syllable rhythm; the scream-like sound has a roughness index of about 60 %, with its strongest modulation at 90 Hz. The program is a simplification using one band, and a real modulation power spectrum is computed over many auditory bands, but it shows the physical meaning of roughness: the envelope rising and falling tens to over a hundred times a second.
Harmonics-to-noise ratio: clear and hoarse
A feature related to roughness but different from it is the harmonics-to-noise ratio. The stronger the periodic harmonics in a voice and the less the breath noise, the higher the ratio and the “clearer” the voice; breathy and hoarse voices have lower ratios.
Calculation
The harmonics-to-noise ratio estimated by autocorrelation (a simplified version of Boersma’s method, without window correction or interpolation): if the normalised autocorrelation of the signal at one pitch period is , the ratio is dB (Boersma 1993). Synthetic “vowels” with a fundamental of 120 Hz are given noise of different strengths, or 2 % period-to-period jitter.
# Harmonics-to-noise ratio (HNR) by a simplified version of Boersma's (1993) autocorrelation method
# (no window correction or interpolation): if r is the normalised
# autocorrelation of the signal at one pitch period, HNR = 10 log10(r / (1 - r)) dB.
# SYNTHETIC 0.4-s 'vowels' at f0 = 120 Hz, sampled at 8 kHz: a sum of 20 harmonics with a -6 dB per
# octave roll-off, plus white noise at a chosen level, and optional period-to-period jitter.
import math, random
FS = 8000
def vowel(noise_db, jitter=0.0, seed=1):
rng = random.Random(seed); n = int(0.4 * FS); x = [0.0] * n; phase = 0.0
for i in range(n):
f0 = 120 * (1 + jitter * rng.gauss(0, 1)) if i % 66 == 0 or i == 0 else None
if f0: cur = f0
phase += 2 * math.pi * cur / FS
x[i] = sum(math.sin(k * phase) / k for k in range(1, 21))
p = sum(v * v for v in x) / n
sd = math.sqrt(p / 10 ** (noise_db / 10))
return [v + rng.gauss(0, sd) for v in x]
def hnr(x):
n = len(x); m = sum(x) / n; x = [v - m for v in x]
e0 = sum(v * v for v in x)
best = 0.0
for lag in range(int(FS / 400), int(FS / 75)): # pitch range 75-400 Hz
r = sum(x[i] * x[i + lag] for i in range(n - lag)) / math.sqrt(
sum(v * v for v in x[:n - lag]) * sum(v * v for v in x[lag:]))
best = max(best, r)
best = min(best, 0.999999)
return 10 * math.log10(best / (1 - best))
for label, nd, j in (("clear voice (noise 25 dB below)", 25, 0.0), ("slightly breathy (noise 12 dB below)", 12, 0.0),
("breathy/hoarse (noise 3 dB below)", 3, 0.0), ("clear, with 2 % jitter", 25, 0.02)):
print(f"{label:38s}: HNR estimate {hnr(vowel(nd, j)):5.1f} dB")
# clear voice (noise 25 dB below) : HNR estimate 20.3 dB
# slightly breathy (noise 12 dB below) : HNR estimate 11.6 dB
# breathy/hoarse (noise 3 dB below) : HNR estimate 2.9 dB
# clear, with 2 % jitter : HNR estimate 12.9 dBThe estimates broadly follow the added noise: with noise 12 dB down the estimate is about 12 dB, with noise 3 dB down about 3 dB; with very weak noise (25 dB down) the estimate is low, about 20 dB, because a delay in whole samples cannot line up exactly with the pitch period. With 2 % period-to-period jitter and almost no noise, the estimate also falls to about 13 dB: slight instability of the period shows up as “noise” in this method too. The harmonics-to-noise ratio is a composite measure and cannot by itself tell a breathy voice from an unstable one.
Note
From acoustics to “presence” is many steps. Arnal and colleagues’ findings show that very high roughness (screaming) triggers alarm. Inferring that “gentle voices with low roughness and strong harmonics avoid triggering listeners’ defensive threat appraisal and so persuade better” is a reasonable hypothesis, but there is as yet no direct evidence for it: roughness in ordinary speech is usually very low, and whether small differences within that low range affect persuasion has not been studied. Persistent hoarseness can be a sign of voice disorder and calls for a doctor, not a technique to cover it.
Hypothesis · not established
The roughness and defensive-appraisal hypothesis (not yet established). Within the range of ordinary speech, artificially adding mild 30–150 Hz amplitude modulation (raising the roughness index to about 10–15 %) raises listeners’ ratings of the speaker as threatening and lowers their acceptance of the speaker’s proposal, even when listeners do not notice the change in the voice. If listeners’ ratings show no detectable change within this low range, the hypothesis is weakened, suggesting that roughness acts only at extreme, near-scream levels.
Summary
The energy of screams is concentrated in fast amplitude modulations of about 30–150 Hz, a region barely used by ordinary speech, and rough sounds activate the amygdala more strongly. Roughness can be computed from the modulation spectrum of the envelope; the harmonics-to-noise ratio is a related but different composite measure. Inferring that gentle, clear voices persuade better is reasonable but not directly tested. The next chapter turns from people to equipment: how the distance from a microphone changes the way a voice is heard.
References
Fan, Y. (2026). Acoustic Persuasion, Prosodic Information Theory and Interpersonal Physiological Synchrony: Pitch Contours, Pause Entropy and Listener Autonomic Coupling in Public Speaking and Leadership [声音说服力、韵律信息论与人际生理同步] (Version 1.0.0). 5D Library. https://doi.org/10.5281/zenodo.23753267 · Licensed under Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International (CC BY-NC-ND 4.0).