All articles
Clinical Audio7 min read

Voice Quality Metrics: Jitter, Shimmer, HNR, and AVQI Explained

Articles in English

What you'll learn: how jitter, shimmer and HNR are defined, how to extract them in Python with parselmouth (the Python interface to Praat), the reference values the Praat manual gives, and how the AVQI combines several measures into one score.

Perceptual voice ratings depend on the listener. Acoustic measures computed from a recording are reproducible: the same file and the same settings give the same number. This article covers three measures built into Praat (jitter, shimmer, harmonics-to-noise ratio) and one composite index, the AVQI. Every reference value below comes from the Praat manual or the AVQI publications, linked in the text.

1. Jitter: Cycle-to-Cycle Period Perturbation

Jitter measures how much the duration of the glottal period (T0 = 1/F0) changes from one cycle to the next. A perfectly periodic signal has identical successive periods. The most reported variant is jitter (local):

Jitter (local, %) = [Σ|T(i) - T(i+1)| / (N-1)] / [ΣT(i) / N] × 100

where:
  T(i)  = duration of the i-th period (seconds)
  N     = number of periods

Numerator:   mean absolute difference between consecutive periods
Denominator: mean period

Praat also computes jitter (rap), the relative average perturbation over 3 periods, and jitter (ppq5), the 5-point period perturbation quotient.

Reference Values

The Praat manual quotes the pathology thresholds of the MDVP software (Multi-Dimensional Voice Program):

Praat measureMDVP nameMDVP threshold for pathology
Jitter (local)Jitt1.040 %
Jitter (rap)RAP0.680 %
Jitter (ppq5)PPQ0.840 %

The manual adds that these numbers were based on jitter measurements influenced by noise, so the correct threshold is probably lower.

Python / Praat Computation

import parselmouth
from parselmouth.praat import call

def compute_jitter(audio_path: str) -> dict:
    """Extract jitter (local), rap and ppq5 from a sustained vowel recording."""
    snd = parselmouth.Sound(audio_path)

    pitch = call(snd, "To Pitch", 0.0, 75, 500)  # time step (0 = auto), pitch floor, pitch ceiling (Hz)

    # PointProcess: one point per glottal pulse
    point_process = call([snd, pitch], "To PointProcess (cc)")

    jitter_local = call(point_process, "Get jitter (local)", 0, 0, 0.0001, 0.02, 1.3)
    jitter_rap   = call(point_process, "Get jitter (rap)",   0, 0, 0.0001, 0.02, 1.3)
    jitter_ppq5  = call(point_process, "Get jitter (ppq5)",  0, 0, 0.0001, 0.02, 1.3)

    return {
        "jitter_local_pct": jitter_local * 100,  # convert to percent
        "jitter_rap_pct":   jitter_rap   * 100,
        "jitter_ppq5_pct":  jitter_ppq5  * 100,
    }

result = compute_jitter("sustained_a.wav")
print(f"Jitter (local): {result['jitter_local_pct']:.2f}%")

Parameter notes:

The arguments to Get jitter are: time range (0, 0 = whole file), shortest and longest period accepted (0.0001 s and 0.02 s) and maximum period factor (1.3, the largest ratio allowed between consecutive periods). Intervals outside these bounds are not counted as periods.

2. Shimmer: Cycle-to-Cycle Amplitude Perturbation

Shimmer measures how much the amplitude changes from one period to the next. The two most reported variants are shimmer (local), in percent, and shimmer (local, dB):

Shimmer (local, %)  = [Σ|A(i) - A(i+1)| / (N-1)] / [ΣA(i) / N] × 100

Shimmer (local, dB) = (1/(N-1)) × Σ|20 × log10(A(i+1) / A(i))|

where:
  A(i)  = amplitude of the i-th period
  N     = number of periods

Reference Values

The Praat manual quotes the MDVP thresholds for pathology: 3.810 % for shimmer (local) (MDVP Shim), 0.350 dB for shimmer (local, dB) (MDVP ShdB) and 3.070 % for shimmer (apq11) (MDVP APQ).

def compute_shimmer(audio_path: str) -> dict:
    """Extract shimmer (local %, local dB, apq3, apq5) from a sustained vowel."""
    snd = parselmouth.Sound(audio_path)
    pitch = call(snd, "To Pitch", 0.0, 75, 500)
    point_process = call([snd, pitch], "To PointProcess (cc)")

    shimmer_local    = call([snd, point_process], "Get shimmer (local)",    0, 0, 0.0001, 0.02, 1.3, 1.6)
    shimmer_local_dB = call([snd, point_process], "Get shimmer (local_dB)", 0, 0, 0.0001, 0.02, 1.3, 1.6)
    shimmer_apq3     = call([snd, point_process], "Get shimmer (apq3)",     0, 0, 0.0001, 0.02, 1.3, 1.6)
    shimmer_apq5     = call([snd, point_process], "Get shimmer (apq5)",     0, 0, 0.0001, 0.02, 1.3, 1.6)

    return {
        "shimmer_local_pct": shimmer_local    * 100,
        "shimmer_local_dB":  shimmer_local_dB,
        "shimmer_apq3_pct":  shimmer_apq3     * 100,
        "shimmer_apq5_pct":  shimmer_apq5     * 100,
    }

The last argument (1.6) is the maximum amplitude factor: the largest ratio allowed between the amplitudes of consecutive periods.

3. HNR: Harmonics-to-Noise Ratio

The harmonics-to-noise ratio (HNR) expresses, in decibels, the energy of the periodic part of the signal relative to its noise:

HNR (dB) = 10 × log10(Energy_periodic / Energy_noise)

Example: 99% of the energy periodic, 1% noise
  HNR = 10 × log10(99 / 1) = 20 dB

Equal energy in harmonics and noise: HNR = 0 dB

Reference Values

According to the Praat manual, a healthy speaker can produce a sustained [a] or [i] with a harmonicity of around 20 dB, and an [u] at around 40 dB. Hoarse speakers have an [a] much lower than 20 dB. The value depends on the vowel, so only compare recordings of the same vowel.

def compute_hnr(audio_path: str) -> float:
    """Mean HNR (dB) with Praat's cross-correlation method."""
    snd = parselmouth.Sound(audio_path)

    harmonicity = call(snd, "To Harmonicity (cc)", 0.01, 75, 0.1, 1.0)
    #                      time step (s), minimum pitch (Hz), silence threshold, periods per window

    return call(harmonicity, "Get mean", 0, 0)  # 0, 0 = whole file

print(f"HNR: {compute_hnr('sustained_a.wav'):.1f} dB")

4. AVQI: Acoustic Voice Quality Index

Jitter, shimmer and HNR each capture one aspect of the voice. The Acoustic Voice Quality Index (AVQI), developed by Maryn et al., combines six acoustic measures into one score of overall dysphonia severity (Maryn & Weenink, 2015):

  • smoothed cepstral peak prominence (CPPS)
  • harmonics-to-noise ratio (HNR)
  • shimmer (local), in percent
  • shimmer (local, dB)
  • slope of the long-term average spectrum (LTAS)
  • tilt of the trend line through the LTAS

AVQI is not a single Praat command but a Praat script. It needs two recordings: a sample of continuous speech, whose voiced parts are extracted and joined, and a sustained vowel appended to them. All six measures are computed on that joined signal. Version 03.01 uses the equation of Barsties & Maryn (2015):

AVQI v03.01 = (4.152 - 0.177 × CPPS - 0.006 × HNR - 0.037 × Shim
               + 0.941 × ShdB + 0.01 × Slope + 0.093 × Tilt) × 2.8902

where:
  CPPS  = smoothed cepstral peak prominence (dB)
  HNR   = harmonics-to-noise ratio (dB)
  Shim  = shimmer (local), in percent
  ShdB  = shimmer (local, dB)
  Slope = LTAS energy 0–1 kHz versus 1–10 kHz (dB)
  Tilt  = same measure on the LTAS trend line (dB)

A higher score means a more dysphonic voice. The cut-off between normal and dysphonic voices depends on the AVQI version and on the language of the recordings, so use the cut-off validated for your version and language, and report both.

5. Recording Conditions

All these measures are computed from the waveform, so anything that alters it, such as background noise or clipping, alters them too. The authors of the AVQI script state that reliable AVQI analysis requires recordings made in optimal data acquisition conditions. To relate the digital level of a recording to sound pressure, see our dBFS to dB SPL converter.

Frequently Asked Questions

What jitter value indicates a voice pathology?

The Praat manual quotes the MDVP thresholds: 1.040% for jitter (local), 0.680% for jitter (rap) and 0.840% for jitter (ppq5). It adds that these values were based on measurements influenced by noise, so the correct threshold is probably lower.

What HNR does a healthy voice have?

According to the Praat manual, a healthy speaker can produce a sustained [a] or [i] at around 20 dB and an [u] at around 40 dB, while hoarse speakers have an [a] much lower than 20 dB. The value depends on the vowel, so compare recordings of the same vowel.

What is the AVQI?

The Acoustic Voice Quality Index, developed by Maryn et al., combines six acoustic measures (CPPS, HNR, shimmer local, shimmer local dB, LTAS slope and LTAS tilt) into one score of dysphonia severity. It is computed on the voiced parts of continuous speech joined to a sustained vowel. The cut-off between normal and dysphonic voices depends on the AVQI version and the language.

Automate These Metrics in Your Clinical Workflow

Vocametrix computes jitter, shimmer, HNR, CPP and AVQI through an API, so the same settings apply to every recording.