How to reduce glottal resonance through exercise
reduce glottal resonance voice exercises singing speech therapy
https://www.royalberkshire.nhs.uk/media/5fvclpqw/reducing-vo…
| Principle | Why It Matters |
|---|---|
| Never start phonation with a hard glottal stop | Hard onset concentrates energy at the glottis |
| Aim for vibration at lips/nose, not throat | This is the practical feedback signal for forward resonance |
| Keep the larynx low and relaxed | A raised larynx shortens the vocal tract and concentrates glottal energy |
| Use breath support - don't squeeze out sound | Pressing vocal folds together harder is the main cause of glottal resonance |
| Progress gradually | Forward resonance is a motor skill - it takes consistent daily practice |
Create a quick-reference PDF of these glottal resonance exercises
ls -la /home/daytona/workspace/ 2>/dev/null || echo "workspace not found"
mkdir -p /home/daytona/workspace/glottal-resonance-pdf
~/glottal-resonance-pdf/build_pdf.py
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.units import mm
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.enums import TA_LEFT, TA_CENTER
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, KeepTogether
)
from reportlab.platypus import BaseDocTemplate, Frame, PageTemplate
OUTPUT = "/home/daytona/workspace/glottal-resonance-pdf/Glottal_Resonance_Exercises.pdf"
# ── Colour palette ──────────────────────────────────────────────────────────
DEEP_BLUE = colors.HexColor("#1A3A5C")
MID_BLUE = colors.HexColor("#2E6DA4")
LIGHT_BLUE = colors.HexColor("#D6E8F7")
ACCENT = colors.HexColor("#E8812A") # warm orange accent
LIGHT_GRAY = colors.HexColor("#F4F6F9")
MED_GRAY = colors.HexColor("#9EAAB8")
TEXT_DARK = colors.HexColor("#1C2B3A")
PAGE_W, PAGE_H = A4
MARGIN = 18 * mm
# ── Page header / footer ────────────────────────────────────────────────────
def on_page(canvas, doc):
canvas.saveState()
# Header bar
canvas.setFillColor(DEEP_BLUE)
canvas.rect(0, PAGE_H - 22*mm, PAGE_W, 22*mm, fill=1, stroke=0)
canvas.setFillColor(colors.white)
canvas.setFont("Helvetica-Bold", 13)
canvas.drawString(MARGIN, PAGE_H - 14*mm, "Reducing Glottal Resonance — Exercise Quick Reference")
canvas.setFont("Helvetica", 8)
canvas.setFillColor(colors.HexColor("#A8C8E8"))
canvas.drawRightString(PAGE_W - MARGIN, PAGE_H - 14*mm, "Voice Training Guide")
# Footer bar
canvas.setFillColor(DEEP_BLUE)
canvas.rect(0, 0, PAGE_W, 12*mm, fill=1, stroke=0)
canvas.setFillColor(MED_GRAY)
canvas.setFont("Helvetica", 7.5)
canvas.drawString(MARGIN, 4.5*mm, "For persistent voice problems consult a Speech-Language Pathologist.")
canvas.drawRightString(PAGE_W - MARGIN, 4.5*mm, f"Page {doc.page}")
canvas.restoreState()
# ── Document setup ───────────────────────────────────────────────────────────
doc = BaseDocTemplate(
OUTPUT,
pagesize=A4,
leftMargin=MARGIN, rightMargin=MARGIN,
topMargin=26*mm, bottomMargin=16*mm,
title="Glottal Resonance Exercises — Quick Reference",
author="Voice Training Guide",
)
frame = Frame(MARGIN, 16*mm, PAGE_W - 2*MARGIN, PAGE_H - 42*mm, id="main")
doc.addPageTemplates([PageTemplate(id="main", frames=frame, onPage=on_page)])
# ── Styles ───────────────────────────────────────────────────────────────────
base = getSampleStyleSheet()
def S(name, **kw):
return ParagraphStyle(name, **kw)
sTitle = S("sTitle",
fontName="Helvetica-Bold", fontSize=18, textColor=DEEP_BLUE,
spaceAfter=3, spaceBefore=4, alignment=TA_CENTER)
sSubtitle = S("sSubtitle",
fontName="Helvetica", fontSize=10, textColor=MID_BLUE,
spaceAfter=8, alignment=TA_CENTER)
sSectionHead = S("sSectionHead",
fontName="Helvetica-Bold", fontSize=11, textColor=colors.white,
spaceAfter=0, spaceBefore=0, leftIndent=4)
sExHead = S("sExHead",
fontName="Helvetica-Bold", fontSize=10, textColor=DEEP_BLUE,
spaceAfter=2, spaceBefore=2)
sBody = S("sBody",
fontName="Helvetica", fontSize=9, textColor=TEXT_DARK,
spaceAfter=3, leading=13)
sBullet = S("sBullet",
fontName="Helvetica", fontSize=9, textColor=TEXT_DARK,
spaceAfter=2, leading=12, leftIndent=10, bulletIndent=2)
sTip = S("sTip",
fontName="Helvetica-Oblique", fontSize=8.5, textColor=MID_BLUE,
spaceAfter=2, leading=11, leftIndent=6)
sPrincHead = S("sPrincHead",
fontName="Helvetica-Bold", fontSize=9, textColor=DEEP_BLUE)
sPrincBody = S("sPrincBody",
fontName="Helvetica", fontSize=8.5, textColor=TEXT_DARK, leading=11)
story = []
# ══════════════════════════════════════════════════════════════════════════════
# TITLE BLOCK
# ══════════════════════════════════════════════════════════════════════════════
story.append(Spacer(1, 4*mm))
story.append(Paragraph("Reducing Glottal Resonance", sTitle))
story.append(Paragraph("A progressive exercise programme to shift vocal resonance forward", sSubtitle))
story.append(HRFlowable(width="100%", thickness=2, color=ACCENT, spaceAfter=6))
# ── What is glottal resonance? ───────────────────────────────────────────────
def section_bar(label):
data = [[Paragraph(label, sSectionHead)]]
t = Table(data, colWidths=[PAGE_W - 2*MARGIN])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), MID_BLUE),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 6),
("RIGHTPADDING", (0,0), (-1,-1), 6),
("ROUNDEDCORNERS", [3]),
]))
return t
def exercise_box(number, title, steps, tip=None, avoid=None):
"""Build a single exercise card as a Table."""
col_w = PAGE_W - 2*MARGIN
header_data = [[
Paragraph(f"<b>{number}</b>", S("en", fontName="Helvetica-Bold", fontSize=14,
textColor=colors.white, alignment=TA_CENTER)),
Paragraph(title, S("et", fontName="Helvetica-Bold", fontSize=10,
textColor=DEEP_BLUE))
]]
# Steps
steps_paras = [Paragraph(f"<bullet>\u2022</bullet> {s}", sBullet) for s in steps]
inner = steps_paras[:]
if avoid:
inner.append(Spacer(1,3))
inner.append(Paragraph(f"<b>Avoid:</b> {avoid}", sTip))
if tip:
inner.append(Paragraph(f"<b>Tip:</b> {tip}", sTip))
content_data = [[inner]]
# Number badge
badge = Table(header_data, colWidths=[10*mm, col_w - 10*mm - 4*mm])
badge.setStyle(TableStyle([
("BACKGROUND", (0,0), (0,0), ACCENT),
("BACKGROUND", (1,0), (1,0), LIGHT_BLUE),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (0,0), 4),
("RIGHTPADDING", (0,0), (0,0), 4),
("LEFTPADDING", (1,0), (1,0), 6),
]))
body_tbl = Table([[inner]], colWidths=[col_w])
body_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), LIGHT_GRAY),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 8),
("RIGHTPADDING", (0,0), (-1,-1), 8),
("LINEBELOW", (0,0), (-1,-1), 0.5, MED_GRAY),
]))
outer = Table([[badge], [body_tbl]], colWidths=[col_w])
outer.setStyle(TableStyle([
("BOX", (0,0), (-1,-1), 1, MID_BLUE),
("TOPPADDING", (0,0), (-1,-1), 0),
("BOTTOMPADDING", (0,0), (-1,-1), 0),
("LEFTPADDING", (0,0), (-1,-1), 0),
("RIGHTPADDING", (0,0), (-1,-1), 0),
]))
return KeepTogether([outer, Spacer(1, 4*mm)])
# ══════════════════════════════════════════════════════════════════════════════
# SECTION 0 — Overview
# ══════════════════════════════════════════════════════════════════════════════
story.append(section_bar("What Is Glottal Resonance?"))
story.append(Spacer(1, 3*mm))
story.append(Paragraph(
"Glottal resonance is a low, buzzy quality that occurs when sound energy concentrates at the "
"larynx rather than projecting forward into the mouth and nasal cavity. It is caused by "
"over-adducted vocal folds, a raised or tense larynx, or hard glottal onsets. The goal of "
"these exercises is to shift resonance <b>anteriorly</b> — into the 'mask' of the face — "
"and to encourage balanced, easy phonation.", sBody))
story.append(Spacer(1, 3*mm))
# ══════════════════════════════════════════════════════════════════════════════
# SECTION 1 — Prep / Warm-up
# ══════════════════════════════════════════════════════════════════════════════
story.append(section_bar("Step 1 — Preparation & Relaxation (do these first every session)"))
story.append(Spacer(1, 3*mm))
story.append(exercise_box(
"A", "Yawn-Sigh",
[
"Sit or stand upright with shoulders relaxed.",
"Open your mouth wide and breathe in deeply — feel the throat widen.",
"On the exhale, let out a gentle, open-mouthed sigh. Let sound come naturally with the air.",
"Repeat 3-5x. The larynx should drop and the pharynx open.",
],
tip="If tension returns between breaths, do a slow shoulder roll before each repetition.",
avoid="Forcing the sigh or pushing the voice. It should feel effortless."
))
story.append(exercise_box(
"B", "Jaw & Neck Release",
[
"Slowly roll shoulders back 3 times, then forward 3 times.",
"Gently tilt head left, hold 5 seconds; right, hold 5 seconds. Return to centre.",
"Open your mouth as wide as comfortable — let the jaw hang heavy. Hold 5 seconds.",
"Repeat jaw drop 5x. This releases masseter tension that raises the larynx.",
],
tip="Warm up the neck and jaw before every voice session."
))
# ══════════════════════════════════════════════════════════════════════════════
# SECTION 2 — Core Exercises
# ══════════════════════════════════════════════════════════════════════════════
story.append(section_bar("Step 2 — Core Forward-Resonance Exercises"))
story.append(Spacer(1, 3*mm))
story.append(exercise_box(
"1", "Sustained Humming (Foundation)",
[
"Lips lightly closed, teeth slightly apart, shoulders relaxed.",
"Take a relaxed breath and produce a gentle 'mmmmm' hum — not forced, not whispered.",
"Focus on feeling a tingling or buzzing at the lips and bridge of the nose, not the throat.",
"Glide pitch slowly up and down through a comfortable range.",
"5-10 seconds per hum, 5-10 repetitions.",
],
tip="If vibration is felt in the chest or throat, raise pitch slightly until the buzz moves to the face.",
avoid="Pressing the lips tight together or squeezing the hum from the throat."
))
story.append(exercise_box(
"2", "Lip Trills (Lip Bubbles)",
[
"Relax your lips and blow air through them so they flap — 'brrrrr'.",
"Add voiced pitch so it sounds like a motorboat hum.",
"Glide gently up and down through your comfortable pitch range.",
"5-10 glides per session. Duration of each glide: 3-5 seconds.",
],
tip="The back-pressure from closed lips reduces strain on the vocal folds and encourages balanced adduction.",
avoid="Pressing the lips together — they should stay loose and floppy."
))
story.append(exercise_box(
"3", "Straw Phonation (SOVT — Semi-Occluded Vocal Tract)",
[
"Place a thin cocktail straw lightly at your lips (not inside the mouth).",
"Hum or phonate a comfortable pitch into the straw.",
"Feel resistance build inside the straw — this back-pressure reduces glottal tension.",
"Glide pitch up and down while maintaining sound through the straw.",
"2-5 minute sessions, once or twice daily.",
],
tip="Cocktail (narrow) straws work better than wide straws — more back-pressure effect.",
avoid="Blowing hard. The airflow should be gentle and steady."
))
story.append(exercise_box(
"4", "Nasal Consonant Chaining (M / N / NG)",
[
"Start with a sustained 'mmm' — lips closed, feel the buzz at the lips.",
"Open into 'mmmah', 'mmmee', 'mmmoh' — carry the forward buzz into the vowel.",
"Progress to loaded phrases: 'My mother makes mince', 'Many merry men make noise',",
" 'Morning moon melody', 'Moonlight mountain memories'.",
"Gradually use the forward sensation in normal conversational speech.",
],
tip="M, N, and NG physically force resonance into the nasal/oral cavities — use them as anchors."
))
story.append(exercise_box(
"5", "Vowel Glides with Forward Focus",
[
"Hum 'mmm' then open into 'mee' — sustain 'ee' while keeping the frontal buzz.",
"Continue through: mee — may — mah — moh — moo.",
"Front vowels (ee, ay) are easiest to feel forward; use them as reference points.",
"Try 'wee-woo-wee-woo' glides to keep the larynx relaxed while moving resonance.",
"10 repetitions of each vowel transition.",
],
tip="If you lose the forward buzz on back vowels (oh, oo), return to 'mee' and try again slowly."
))
# ══════════════════════════════════════════════════════════════════════════════
# SECTION 3 — Advanced
# ══════════════════════════════════════════════════════════════════════════════
story.append(section_bar("Step 3 — Advanced: Stemple Vocal Function Exercises"))
story.append(Spacer(1, 3*mm))
story.append(Paragraph(
"The Stemple protocol (Stemple et al., 1994) is a validated 4-exercise sequence that "
"strengthens and rebalances the entire phonatory system. Do each exercise twice, "
"twice daily. Avoid both hard glottal onset AND breathy onset — aim for a clean, "
"balanced start.", sBody))
story.append(Spacer(1, 2*mm))
vfe_data = [
["#", "Exercise", "How to Perform", "Goal"],
["1", "Sustain 'ee'",
"Sustain 'ee' as long as possible on a comfortable pitch. No hard glottal start.",
"Build respiratory support & phonatory endurance"],
["2", "Pitch glide UP",
"On the word 'knoll', glide from lowest to highest comfortable pitch.\nLips barely touching. Throat wide open.",
"Stretch & lengthen the vocal folds (cricothyroid)"],
["3", "Pitch glide DOWN",
"On 'knoll', glide from highest back down to lowest.\nAvoid glottal fry at the bottom.",
"Strengthen & shorten the folds (thyroarytenoid)"],
["4", "Power notes",
"Sustain 'ol' across 5 musical notes: C-D-E-F-G.\n(Women: middle C; Men: C below middle C)",
"Strengthen adductory muscles for balanced closure"],
]
col_widths = [8*mm, 28*mm, 85*mm, 52*mm]
vfe_table = Table(vfe_data, colWidths=col_widths, repeatRows=1)
vfe_table.setStyle(TableStyle([
# Header
("BACKGROUND", (0,0), (-1,0), DEEP_BLUE),
("TEXTCOLOR", (0,0), (-1,0), colors.white),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,0), 8.5),
("ALIGN", (0,0), (-1,0), "CENTER"),
# Body
("FONTNAME", (0,1), (-1,-1), "Helvetica"),
("FONTSIZE", (0,1), (-1,-1), 8.5),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("ROWBACKGROUNDS",(0,1), (-1,-1), [colors.white, LIGHT_GRAY]),
("TEXTCOLOR", (0,1), (-1,-1), TEXT_DARK),
("GRID", (0,0), (-1,-1), 0.4, MED_GRAY),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 5),
("RIGHTPADDING", (0,0), (-1,-1), 5),
# Number column
("ALIGN", (0,1), (0,-1), "CENTER"),
("FONTNAME", (0,1), (0,-1), "Helvetica-Bold"),
("TEXTCOLOR", (0,1), (0,-1), ACCENT),
]))
story.append(KeepTogether([vfe_table, Spacer(1, 5*mm)]))
# ══════════════════════════════════════════════════════════════════════════════
# SECTION 4 — Key Principles
# ══════════════════════════════════════════════════════════════════════════════
story.append(section_bar("Key Principles"))
story.append(Spacer(1, 3*mm))
principles = [
("Never start with a hard glottal stop",
"Hard onset concentrates energy at the glottis. Always begin phonation gently."),
("Target vibration at the lips and nose, not the throat",
"This is your real-time feedback signal for forward resonance."),
("Keep the larynx low and relaxed",
"A raised larynx shortens the vocal tract and amplifies glottal energy."),
("Use breath support — do not squeeze",
"Pressing the folds together harder is the primary driver of glottal resonance."),
("Progress gradually",
"Forward resonance is a motor skill. Consistent daily practice over 2-4 weeks produces results."),
("Stop if you feel pain or increased hoarseness",
"These exercises should never hurt. Consult an SLP if symptoms persist."),
]
col_w_half = (PAGE_W - 2*MARGIN - 4*mm) / 2
p_rows = []
for i in range(0, len(principles), 2):
row = []
for j in range(2):
if i+j < len(principles):
h, b = principles[i+j]
cell = [Paragraph(f"<b>{h}</b>", sPrincHead),
Paragraph(b, sPrincBody)]
else:
cell = [Paragraph("", sPrincBody)]
row.append(cell)
p_rows.append(row)
ptbl = Table(p_rows, colWidths=[col_w_half, col_w_half], hAlign="LEFT")
ptbl.setStyle(TableStyle([
("VALIGN", (0,0), (-1,-1), "TOP"),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 6),
("RIGHTPADDING", (0,0), (-1,-1), 6),
("ROWBACKGROUNDS",(0,0), (-1,-1), [LIGHT_GRAY, colors.white]),
("BOX", (0,0), (-1,-1), 0.5, MED_GRAY),
("INNERGRID", (0,0), (-1,-1), 0.3, MED_GRAY),
]))
story.append(KeepTogether([ptbl, Spacer(1, 4*mm)]))
# ══════════════════════════════════════════════════════════════════════════════
# SECTION 5 — Suggested Daily Schedule
# ══════════════════════════════════════════════════════════════════════════════
story.append(section_bar("Suggested Daily Practice Schedule"))
story.append(Spacer(1, 3*mm))
sched_data = [
["Phase", "Duration", "Exercises", "Notes"],
["Warm-up", "3-5 min",
"Yawn-sigh (5x) + Jaw release (5x)",
"Every session, without exception"],
["Core work", "8-10 min",
"Humming (5-10 reps) → Lip trills (5-10 glides)\n"
"→ Straw phonation (2 min) → Nasal chaining",
"Feel the forward buzz before moving on"],
["Advanced\n(when ready)", "5 min",
"Stemple VFE: all 4 exercises x2",
"Add after 1-2 weeks of core work"],
["Cool-down", "2 min",
"Gentle yawn-sighs (3x) + silence",
"Do not talk loudly immediately after"],
]
sched_col_widths = [22*mm, 20*mm, 90*mm, 45*mm]
sched_tbl = Table(sched_data, colWidths=sched_col_widths, repeatRows=1)
sched_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), DEEP_BLUE),
("TEXTCOLOR", (0,0), (-1,0), colors.white),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,0), 8.5),
("ALIGN", (0,0), (-1,0), "CENTER"),
("FONTNAME", (0,1), (-1,-1), "Helvetica"),
("FONTSIZE", (0,1), (-1,-1), 8.5),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("ROWBACKGROUNDS",(0,1), (-1,-1), [colors.white, LIGHT_GRAY]),
("TEXTCOLOR", (0,1), (-1,-1), TEXT_DARK),
("GRID", (0,0), (-1,-1), 0.4, MED_GRAY),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 5),
("RIGHTPADDING", (0,0), (-1,-1), 5),
("FONTNAME", (0,1), (0,-1), "Helvetica-Bold"),
("TEXTCOLOR", (0,1), (0,-1), ACCENT),
]))
story.append(KeepTogether([sched_tbl, Spacer(1, 4*mm)]))
# ══════════════════════════════════════════════════════════════════════════════
# Footer note
# ══════════════════════════════════════════════════════════════════════════════
story.append(HRFlowable(width="100%", thickness=1, color=MED_GRAY, spaceAfter=4))
story.append(Paragraph(
"<b>When to seek professional help:</b> If your voice is hoarse for more than 2-3 weeks, "
"if you feel pain on phonation, or if these exercises do not produce improvement after 4 weeks "
"of consistent practice, consult a Speech-Language Pathologist (SLP) specialising in voice. "
"Resonant Voice Therapy (RVT) delivered by an SLP is the evidence-based first-line treatment "
"for muscle tension dysphonia and related glottal resonance problems.",
S("note", fontName="Helvetica-Oblique", fontSize=8, textColor=MED_GRAY,
leading=11, spaceAfter=0)
))
# ── Build ─────────────────────────────────────────────────────────────────────
doc.build(story)
print(f"PDF saved to: {OUTPUT}")
python3 /home/daytona/workspace/glottal-resonance-pdf/build_pdf.py
ls -lh /home/daytona/workspace/glottal-resonance-pdf/
Glottal Resonance Exercises
PDF Document · PDF