How to reduce glottal resonance through exercise

Finding Sources
Searching the Web

reduce glottal resonance voice exercises singing speech therapy

Finding Sources
Reading Web Page

https://www.royalberkshire.nhs.uk/media/5fvclpqw/reducing-vo…

Here is a thorough breakdown of how to reduce glottal resonance through targeted exercises.

What Glottal Resonance Is and Why It Happens

Glottal resonance is a low, dark, buzzy quality in the voice that results from sound energy concentrating at the level of the larynx - near the glottis (the gap between the vocal folds). It typically happens when:
  • The vocal folds are pressed together too tightly (hyperadduction)
  • The larynx is held high or tense
  • Phonation is initiated with a hard glottal attack rather than a smooth, breathy onset
  • Resonance is "sitting in the throat" rather than being projected forward into the oral and nasal cavities
The fix is to shift resonance anteriorly (forward) - into the "mask" of the face - and to reduce laryngeal tension so the glottis vibrates more freely.

Core Exercise Categories

1. Relaxation and Prep (Do These First)

Before any phonation exercise, release tension in the neck, jaw, and larynx:
  • Yawn-sigh: Take a deep breath in with your mouth wide open (feel the throat widen), then sigh on the exhale - just let air and sound come out together without pushing. This drops the larynx and opens the pharynx.
  • Neck and shoulder rolls: Roll shoulders back slowly, gently tilt the head side to side. Tension in the neck directly restricts laryngeal mobility.
  • Jaw drops: Open your mouth as wide as comfortable, release your jaw completely. Tension in the masseter and digastric muscles raises the larynx.

2. Humming - The Foundation Exercise

Humming is the single most direct way to pull resonance forward away from the glottis.
How to do it:
  1. Sit upright, lips lightly closed, teeth slightly apart.
  2. Take a relaxed breath and produce a gentle "mmmmm" hum - not forced, not whispered.
  3. Aim to feel a tickling or tingling sensation on your lips and nose bridge, not in your throat.
  4. Glide the pitch gently up and down (a slow, comfortable glide, not a full range) while maintaining that forward sensation.
  5. Duration: 5-10 seconds per hum, 5-10 repetitions.
What to avoid: If you feel the vibration primarily in your chest or throat, you are still glottal-dominant. Raise pitch slightly until you find the "buzz" in the face.

3. Lip Trills (Lip Bubbles)

Lip trills are a semi-occluded vocal tract (SOVT) exercise - the back pressure from the closed lips helps equalize subglottic pressure and reduces the tendency to push the folds together hard.
How to do it:
  1. Relax your lips and blow air through them so they flap ("brrrrr").
  2. Add voiced sound so it sounds like a motorboat with pitch.
  3. Glide up and down through a comfortable pitch range.
  4. 5-10 glides per session.
The back-pressure effect is the key mechanism: it takes strain off the glottis and encourages a more balanced, easy adduction.

4. Nasal Consonant Chaining (M, N, NG)

These sounds physically force resonance into the nasal and oral cavities, training your system to feel what "forward" sounds and feels like.
Progression:
  • Start with sustained "mmm" (lips closed, feel buzz at lips)
  • Move to "mmmah" - let the vowel carry some of that forward buzz
  • Practice phrases loaded with nasals: "My mother makes mince", "Many merry men make noise", "Morning moon melody"
  • Gradually replace with normal speech while maintaining that forward sensation

5. Forward-Focused Vowel Work

Once you have found the forward buzz through humming, carry it into vowels:
  • Hum "mmm" then open into "mmmah" without losing the frontal vibration
  • Try "mee," "may," "mah," "moh," "moo" - front vowels (ee, ay) are easiest to feel forward
  • "Wee-woo-wee-woo" glides keep the larynx relaxed while moving resonance around

6. Straw Phonation

Phonating through a narrow cocktail straw is another SOVT technique that has strong research support for reducing laryngeal hyperfunction:
How to do it:
  1. Place a thin drinking straw at your lips (not inside your mouth).
  2. Hum or phonate into the straw while gliding pitch up and down.
  3. Feel resistance build in the back of the straw - this back-pressure reduces glottal tension.
  4. 5-minute sessions, once or twice daily.
This is one of the most evidence-backed voice warm-up tools and is widely used by SLPs and vocal coaches.

7. Vocal Function Exercises (Stemple Protocol)

This is a structured 4-exercise sequence developed by Joseph Stemple that addresses phonatory balance across the whole vocal system:
  1. Sustain "ee" as long as possible on a comfortable pitch (building respiratory support)
  2. Glide from lowest to highest pitch on "knoll" - lips barely touching, throat wide open
  3. Glide from highest to lowest pitch on "knoll" - avoid glottal fry at the bottom
  4. Sustain "ol" across 5 musical notes starting on middle C (women) or one C lower (men)
Do each 2x, twice daily. The instruction is to avoid both hard glottal onset AND breathy onset - you want a balanced, clean start.

Key Principles to Keep in Mind

PrincipleWhy It Matters
Never start phonation with a hard glottal stopHard onset concentrates energy at the glottis
Aim for vibration at lips/nose, not throatThis is the practical feedback signal for forward resonance
Keep the larynx low and relaxedA raised larynx shortens the vocal tract and concentrates glottal energy
Use breath support - don't squeeze out soundPressing vocal folds together harder is the main cause of glottal resonance
Progress graduallyForward resonance is a motor skill - it takes consistent daily practice

Context Matters

  • For singers: These techniques are standard in classical and contemporary commercial music (CCM) training. The concept of "placement" in the "mask" is the same thing as reducing glottal resonance.
  • For trans voice training: Shifting resonance from glottal/chest-dominant to oral/nasal-forward is a major goal of feminizing voice work.
  • For voice disorders (nodules, polyps, muscle tension dysphonia): Resonant Voice Therapy (RVT), developed by Katherine Verdolini Abbott, is a well-validated clinical approach built around exactly these techniques. If symptoms persist, working with a speech-language pathologist (SLP) specializing in voice is strongly recommended.

A consistent daily practice of 10-15 minutes combining yawn-sighs, humming, lip trills, and nasal-loaded phrases will produce noticeable results within 2-4 weeks for most people.

Create a quick-reference PDF of these glottal resonance exercises

Reading File
Reading File
Running Command

ls -la /home/daytona/workspace/ 2>/dev/null || echo "workspace not found"

Running Command

mkdir -p /home/daytona/workspace/glottal-resonance-pdf

Writing File

~/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}")
Running Command

python3 /home/daytona/workspace/glottal-resonance-pdf/build_pdf.py

Running Command

ls -lh /home/daytona/workspace/glottal-resonance-pdf/

Your PDF is ready. Here's what it includes:

Glottal Resonance Exercises

PDF Document · PDF


Contents of the quick-reference sheet:
  • Header/footer on every page with title and page number
  • What is glottal resonance? - brief explanation of the mechanism
  • Step 1 - Prep exercises - Yawn-Sigh and Jaw/Neck Release (colour-coded exercise cards)
  • Step 2 - Core exercises - Humming, Lip Trills, Straw Phonation, Nasal Consonant Chaining, Vowel Glides (each with steps, tips, and what to avoid)
  • Step 3 - Stemple Vocal Function Exercises - formatted as a reference table with all 4 exercises
  • Key Principles - 6 principles in a two-column grid
  • Daily Practice Schedule - phased warm-up / core / advanced / cool-down table
  • Clinical note at the bottom about when to seek an SLP
This is a shared conversation. Sign in to Orris to start your own chat.