Make a presentation on topic voice rehabilitation in laryngectomy take reference from dinghra and mbbs 4 th year
tracheoesophageal voice prosthesis laryngectomy stoma
"laryngectomy" AND "voice rehabilitation"
mkdir -p /tmp/workspace/laryngectomy-voice-ppt/assets && ls -la /tmp/workspace/
cd /tmp/workspace/laryngectomy-voice-ppt/assets && python /tmp/skills/shared/scripts/fetch_images.py \ "https://cdn.orris.care/cdss_images/11632b58de8894966e6da57f0dd480444b0bffd45a9239fe33b60720e0366fbc.png" \ "https://cdn.orris.care/cdss_images/45d86bd8ce7a8350ed108fa697cecc06e93f4f3cd2fcde7bf2dc5dad0daf0682.png" \ "https://cdn.orris.care/cdss_images/2f4cdd0bda9075841cc0ef9b464a656bb9350941b339f18ef1760053b2688cf8.png" \ "https://cdn.orris.care/cdss_images/57bb0f6b9cd786451fd6a25fc31b1319aed2f7b69105324c6aabe762bd24716f.png" \ > images.json python -c " import json d = json.load(open('images.json')) for x in d: print(x['url'][-20:], bool(x['base64']), x.get('error')) "
~/laryngectomy-voice-ppt/build_ppt.py
import json, base64
from io import BytesIO
from pptx import Presentation
from pptx.util import Inches, Pt, Emu
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN, MSO_ANCHOR
from pptx.enum.shapes import MSO_SHAPE
# ---------- Colors ----------
NAVY = RGBColor(0x0B, 0x2C, 0x4D)
TEAL = RGBColor(0x0E, 0x7C, 0x7B)
LIGHT = RGBColor(0xF4, 0xF7, 0xF9)
WHITE = RGBColor(0xFF, 0xFF, 0xFF)
DARK = RGBColor(0x22, 0x28, 0x2E)
ACCENT = RGBColor(0xE0, 0x7A, 0x2C)
GREY = RGBColor(0x5A, 0x63, 0x6B)
prs = Presentation()
prs.slide_width = Inches(13.333)
prs.slide_height = Inches(7.5)
BLANK = prs.slide_layouts[6]
SW, SH = prs.slide_width, prs.slide_height
# ---------- Load images ----------
imgs = json.load(open('/tmp/workspace/laryngectomy-voice-ppt/assets/images.json'))
img_bytes = {}
names = ['blom_singer', 'provox', 'electrolarynx', 'esophageal_speech']
for n, im in zip(names, imgs):
img_bytes[n] = BytesIO(base64.b64decode(im['base64'].split(',', 1)[1]))
def add_bg(slide, color=WHITE):
rect = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE, 0, 0, SW, SH)
rect.fill.solid(); rect.fill.fore_color.rgb = color
rect.line.fill.background()
rect.shadow.inherit = False
slide.shapes._spTree.remove(rect._element)
slide.shapes._spTree.insert(2, rect._element)
return rect
def add_textbox(slide, left, top, width, height, text, size=18, bold=False, color=DARK,
align=PP_ALIGN.LEFT, font='Calibri', italic=False, line_spacing=1.0):
tb = slide.shapes.add_textbox(left, top, width, height)
tf = tb.text_frame
tf.word_wrap = True
lines = text.split('\n')
for i, line in enumerate(lines):
p = tf.paragraphs[0] if i == 0 else tf.add_paragraph()
p.text = line
p.alignment = align
p.line_spacing = line_spacing
r = p.runs[0] if p.runs else p.add_run()
r.font.size = Pt(size)
r.font.bold = bold
r.font.italic = italic
r.font.name = font
r.font.color.rgb = color
return tb
def add_bullets(slide, left, top, width, height, items, size=15, color=DARK, bold_first=False,
space_after=8, font='Calibri', bullet_color=TEAL):
tb = slide.shapes.add_textbox(left, top, width, height)
tf = tb.text_frame
tf.word_wrap = True
for i, item in enumerate(items):
level = 0
txt = item
if isinstance(item, tuple):
txt, level = item
p = tf.paragraphs[0] if i == 0 else tf.add_paragraph()
prefix = ('• ' if level == 0 else ' - ')
p.text = prefix + txt
p.space_after = Pt(space_after)
p.line_spacing = 1.05
r = p.runs[0]
r.font.size = Pt(size - (2 if level else 0))
r.font.color.rgb = color
r.font.name = font
r.font.bold = False
return tb
def header(slide, title, subtitle=None, num=None, total=None):
add_bg(slide, WHITE)
bar = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE, 0, 0, SW, Inches(1.15))
bar.fill.solid(); bar.fill.fore_color.rgb = NAVY
bar.line.fill.background(); bar.shadow.inherit = False
accent = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE, 0, Inches(1.15), SW, Pt(4))
accent.fill.solid(); accent.fill.fore_color.rgb = ACCENT
accent.line.fill.background(); accent.shadow.inherit = False
add_textbox(slide, Inches(0.5), Inches(0.18), Inches(11.5), Inches(0.6), title,
size=26, bold=True, color=WHITE, font='Calibri')
if subtitle:
add_textbox(slide, Inches(0.5), Inches(0.68), Inches(11.5), Inches(0.4), subtitle,
size=13, italic=True, color=RGBColor(0xC9, 0xD8, 0xE4))
if num:
add_textbox(slide, SW - Inches(1.1), Inches(0.35), Inches(0.7), Inches(0.4), f"{num}/{total}",
size=12, color=RGBColor(0xC9,0xD8,0xE4), align=PP_ALIGN.RIGHT)
def add_picture_boxed(slide, img_key, left, top, width, height, caption=None):
pic = slide.shapes.add_picture(img_bytes[img_key], left, top, height=height)
# center horizontally within given width if picture narrower
if pic.width > width:
pic.width = width
pic.left = left
else:
pic.left = left + int((width - pic.width) / 2)
img_bytes[img_key].seek(0)
if caption:
add_textbox(slide, left, top + height + Pt(4), width, Inches(0.35), caption,
size=11, italic=True, color=GREY, align=PP_ALIGN.CENTER)
TOTAL = 13
# ================= SLIDE 1: TITLE =================
s = prs.slides.add_slide(BLANK)
add_bg(s, NAVY)
band = s.shapes.add_shape(MSO_SHAPE.RECTANGLE, 0, Inches(4.7), SW, Pt(4))
band.fill.solid(); band.fill.fore_color.rgb = ACCENT; band.line.fill.background(); band.shadow.inherit=False
add_textbox(s, Inches(1), Inches(2.3), Inches(11.3), Inches(1.4),
"Voice Rehabilitation in Laryngectomy", size=44, bold=True, color=WHITE, align=PP_ALIGN.LEFT)
add_textbox(s, Inches(1), Inches(3.55), Inches(11.3), Inches(0.7),
"Restoring communication after total laryngectomy", size=20, italic=True,
color=RGBColor(0xC9,0xD8,0xE4))
add_textbox(s, Inches(1), Inches(4.95), Inches(11.3), Inches(0.5),
"MBBS Final Professional Part I - ENT (Otorhinolaryngology)", size=16, color=WHITE)
add_textbox(s, Inches(1), Inches(5.4), Inches(11.3), Inches(0.5),
"Reference: Dhingra's Diseases of Ear, Nose and Throat & Head and Neck Surgery", size=14, color=RGBColor(0xC9,0xD8,0xE4))
# ================= SLIDE 2: LEARNING OBJECTIVES =================
s = prs.slides.add_slide(BLANK)
header(s, "Learning Objectives", num=2, total=TOTAL)
add_bullets(s, Inches(0.7), Inches(1.5), Inches(11.9), Inches(5.2), [
"Recall why total laryngectomy abolishes normal (laryngeal) voice production",
"Classify the methods available for post-laryngectomy voice rehabilitation",
"Describe the mechanism, technique, advantages and limitations of oesophageal speech",
"Describe the artificial larynx (electrolarynx) - types and use",
"Explain tracheo-oesophageal (TE) speech with a voice prosthesis (Blom-Singer / Provox)",
"Outline surgical methods of voice restoration (neoglottic reconstruction)",
"List complications of voice prostheses and their management",
"Appreciate the multidisciplinary approach to rehabilitation of a laryngectomee",
], size=17, space_after=14)
# ================= SLIDE 3: WHY VOICE REHAB NEEDED =================
s = prs.slides.add_slide(BLANK)
header(s, "Total Laryngectomy: The Problem", num=3, total=TOTAL)
add_bullets(s, Inches(0.6), Inches(1.5), Inches(6.6), Inches(5.2), [
"Total laryngectomy = complete removal of the larynx, done for advanced (T3/T4) laryngeal or hypopharyngeal cancer, or as salvage after failed radiotherapy/chemoradiation",
"The airway is permanently separated from the digestive tract:",
("Trachea is brought out as a separate end tracheostome on the neck (permanent 'neck breather')", 1),
("Pharynx/oesophagus is repaired to restore swallowing", 1),
"Consequences for voice:",
("The vibratory sound source (vocal cords) is lost", 1),
("Expired lung air no longer passes through the pharynx/mouth, so it cannot power speech", 1),
"Voice rehabilitation aims to give the patient a new sound source and a way to direct air/vibration into the vocal tract for articulation",
], size=15.5, space_after=10)
add_picture_boxed(s, 'esophageal_speech', Inches(7.6), Inches(1.6), Inches(4.9), Inches(3.6))
add_textbox(s, Inches(7.6), Inches(5.35), Inches(4.9), Inches(1.3),
"Goal of rehabilitation:\nAudible, intelligible, hands-free speech + preserved swallowing, smell and quality of life",
size=13.5, bold=True, color=TEAL, align=PP_ALIGN.CENTER)
# ================= SLIDE 4: CLASSIFICATION =================
s = prs.slides.add_slide(BLANK)
header(s, "Methods of Voice Rehabilitation - Overview", num=4, total=TOTAL)
add_textbox(s, Inches(0.6), Inches(1.4), Inches(11.5), Inches(0.5), "Three broad approaches:", size=18, bold=True, color=NAVY)
cols = [
("A. Non-surgical /\nAlaryngeal speech", ["Oesophageal speech", "Pharyngeal/buccal speech (rare)"]),
("B. Mechanical / Electronic\ndevices", ["Artificial larynx - Electronic (electrolarynx)", "Pneumatic (Tokyo-type) artificial larynx"]),
("C. Surgical voice\nrestoration", ["Tracheo-oesophageal (TE) puncture + voice prosthesis (Blom-Singer, Provox)", "Neoglottic reconstruction (Asai, Staffieri, Amatsu techniques)"]),
]
x = Inches(0.6); w = Inches(3.95); gap = Inches(0.15)
for title, items in cols:
box = s.shapes.add_shape(MSO_SHAPE.ROUNDED_RECTANGLE, x, Inches(2.1), w, Inches(4.6))
box.fill.solid(); box.fill.fore_color.rgb = LIGHT
box.line.color.rgb = TEAL; box.line.width = Pt(1.25)
box.shadow.inherit = False
hd = s.shapes.add_shape(MSO_SHAPE.ROUNDED_RECTANGLE, x, Inches(2.1), w, Inches(1.0))
hd.fill.solid(); hd.fill.fore_color.rgb = NAVY
hd.line.fill.background(); hd.shadow.inherit=False
tf = hd.text_frame; tf.word_wrap = True
tf.margin_left=Pt(6); tf.margin_right=Pt(6)
p = tf.paragraphs[0]; p.text = title; p.alignment = PP_ALIGN.CENTER
r = p.runs[0]; r.font.size = Pt(16); r.font.bold = True; r.font.color.rgb = WHITE
add_bullets(s, x + Inches(0.2), Inches(3.25), w - Inches(0.4), Inches(3.3), items, size=13.5, space_after=10)
x = x + w + gap
# ================= SLIDE 5: OESOPHAGEAL SPEECH =================
s = prs.slides.add_slide(BLANK)
header(s, "Oesophageal Speech", num=5, total=TOTAL)
add_bullets(s, Inches(0.6), Inches(1.5), Inches(7.0), Inches(5.2), [
"Oldest and simplest method - requires no device or surgery",
"Mechanism:",
("Air is injected/swallowed into the upper oesophagus (by tongue-pumping or gulping)", 1),
("Air is then belched back (regurgitated) in a controlled way", 1),
("The vibrating pharyngo-oesophageal (PE) segment mucosa acts as the new 'neo-glottis' / sound source", 1),
("Sound is articulated into speech by tongue, lips, palate as usual", 1),
"Advantages: no device, no cost, hands-free, no surgery",
"Disadvantages:",
("Difficult and slow to learn (needs speech therapy, weeks-months)", 1),
("Only a small volume of air can be trapped - short phrases, low volume, low pitch", 1),
("Only 25-50% of patients achieve useful fluency", 1),
], size=14.5, space_after=7)
add_picture_boxed(s, 'esophageal_speech', Inches(7.9), Inches(1.6), Inches(4.6), Inches(3.4),
caption="Production of oesophageal speech (Bailey & Love, Fig. 52.62)")
box = s.shapes.add_shape(MSO_SHAPE.ROUNDED_RECTANGLE, Inches(7.9), Inches(5.4), Inches(4.6), Inches(1.3))
box.fill.solid(); box.fill.fore_color.rgb = LIGHT; box.line.color.rgb=ACCENT; box.shadow.inherit=False
tf = box.text_frame; tf.word_wrap=True; tf.margin_left=Pt(8); tf.margin_top=Pt(6)
p = tf.paragraphs[0]; p.text = "Clinical pearl:"; p.runs[0].font.bold=True; p.runs[0].font.size=Pt(13); p.runs[0].font.color.rgb=NAVY
p2 = tf.add_paragraph(); p2.text = "Often taught first by a speech-language therapist before offering TEP/electrolarynx."
p2.runs[0].font.size = Pt(12.5); p2.runs[0].font.color.rgb = DARK
# ================= SLIDE 6: ARTIFICIAL LARYNX / ELECTROLARYNX =================
s = prs.slides.add_slide(BLANK)
header(s, "Artificial Larynx (Electrolarynx)", num=6, total=TOTAL)
add_bullets(s, Inches(0.6), Inches(1.5), Inches(6.9), Inches(5.2), [
"External mechanical/electronic device used when surgery/TEP is not possible or as an early aid",
"Two main types:",
("Electronic (transcervical / neck-type): battery-powered vibrating diaphragm held against the neck (or an intra-oral tube). Vibration is transmitted through soft tissues into the pharynx and shaped into speech by the tongue, lips and palate", 1),
("Pneumatic type: uses the patient's own pulmonary air, directed from the tracheostome through a tube with a reed, into the mouth", 1),
"Advantages:",
("Easy and quick to learn, usable within days of surgery", 1),
("Reliable, works even with poor pharyngeal mucosa/after radiotherapy", 1),
"Disadvantages:",
("Sound is monotonous and mechanical/robotic", 1),
("Needs a free hand to hold the device against the neck", 1),
("Ongoing battery/device cost", 1),
], size=14, space_after=7)
add_picture_boxed(s, 'electrolarynx', Inches(8.0), Inches(1.8), Inches(4.4), Inches(3.2),
caption="Electrolarynx device (Bailey & Love, Fig. 52.61)")
# ================= SLIDE 7: TE PUNCTURE / VOICE PROSTHESIS =================
s = prs.slides.add_slide(BLANK)
header(s, "Tracheo-oesophageal (TE) Speech: Voice Prosthesis", num=7, total=TOTAL)
add_bullets(s, Inches(0.6), Inches(1.5), Inches(7.0), Inches(5.3), [
"Currently the gold standard for post-laryngectomy voice restoration",
"Principle: a surgically created tracheo-oesophageal fistula (TE puncture, TEP) allows pulmonary air to be shunted from the trachea into the oesophagus, driving vibration of the PE segment (neoglottis) for louder, more fluent, near-normal-sounding speech",
"A one-way silicone voice prosthesis is placed in the puncture tract:",
("Allows air trachea -> oesophagus during expiration (occlude stoma with finger/valve)", 1),
("Closes automatically to prevent aspiration of food/fluid oesophagus -> trachea", 1),
"Can be done as primary TEP (at the time of laryngectomy) or secondary TEP (later)",
"Common devices: Blom-Singer prosthesis, Provox (indwelling, low-resistance) prosthesis",
"Advantages: best voice quality, fluent, loud, near-normal intonation, learned quickly",
"Disadvantages: device cost, needs periodic replacement, risk of leakage/aspiration if valve fails",
], size=14, space_after=7)
add_picture_boxed(s, 'blom_singer', Inches(7.9), Inches(1.55), Inches(4.6), Inches(3.3),
caption="Blom-Singer valve in a TE fistula with stoma valve (Fig. 52.59)")
add_picture_boxed(s, 'provox', Inches(9.1), Inches(5.05), Inches(2.3), Inches(1.75),
caption="Provox prosthesis in situ")
# ================= SLIDE 8: SURGICAL NEOGLOTTIS RECONSTRUCTION =================
s = prs.slides.add_slide(BLANK)
header(s, "Surgical Voice Restoration (Historical / Alternative Techniques)", num=8, total=TOTAL)
add_bullets(s, Inches(0.6), Inches(1.5), Inches(11.9), Inches(5.3), [
"Before modern voice prostheses, several surgical shunt/neoglottis techniques were devised to create a permanent tracheo-pharyngeal air channel:",
("Asai's technique - a skin/mucosal tube fashioned as a permanent tracheo-pharyngeal shunt for TE voicing", 1),
("Staffieri's operation (phonatory neoglottis) - creation of a neoglottis from residual mucosa to permit voicing", 1),
("Amatsu's technique - single-stage tracheo-oesophageal shunt operation", 1),
"Popular in the late 1970s-80s, but largely abandoned because of a difficult trade-off: good voice quality was associated with troublesome aspiration, whereas an aspiration-free shunt often gave poor or absent voice",
"Superseded in most centres by voice-prosthesis-based TEP (Singer-Blom, 1980 onward), which uses a one-way valve to solve the aspiration problem while retaining good voice",
"Still occasionally relevant in patients unsuitable for a prosthesis or where prostheses are unavailable/unaffordable",
], size=15.5, space_after=12)
# ================= SLIDE 9: COMPARISON TABLE =================
s = prs.slides.add_slide(BLANK)
header(s, "Comparison of Voice Rehabilitation Methods", num=9, total=TOTAL)
rows = [
["Feature", "Oesophageal speech", "Electrolarynx", "TE speech (prosthesis)"],
["Sound source", "PE segment mucosa", "Mechanical vibrator", "PE segment (pulmonary air driven)"],
["Ease of learning", "Difficult, slow", "Easy, quick", "Easy-moderate, quick"],
["Voice quality", "Low pitch, limited volume", "Monotonous, robotic", "Best - fluent, louder"],
["Hands-free", "Yes", "No (device held to neck)", "Mostly yes (with auto valve)"],
["Cost", "None", "Device + batteries", "Prosthesis + replacement"],
["Main drawback", "Low success rate", "Mechanical sound", "Device care, leakage risk"],
]
tbl_left, tbl_top, tbl_w, tbl_h = Inches(0.6), Inches(1.6), Inches(12.1), Inches(4.9)
gtable = s.shapes.add_table(len(rows), 4, tbl_left, tbl_top, tbl_w, tbl_h).table
colw = [Inches(2.6), Inches(3.2), Inches(3.1), Inches(3.2)]
for i, w_ in enumerate(colw):
gtable.columns[i].width = w_
for r_i, row in enumerate(rows):
for c_i, val in enumerate(row):
cell = gtable.cell(r_i, c_i)
cell.text = val
cell.vertical_anchor = MSO_ANCHOR.MIDDLE
cell.margin_left = Pt(6); cell.margin_right = Pt(6)
para = cell.text_frame.paragraphs[0]
para.font.size = Pt(13 if r_i else 14)
para.font.bold = (r_i == 0)
para.font.color.rgb = WHITE if r_i == 0 else DARK
cell.fill.solid()
cell.fill.fore_color.rgb = NAVY if r_i == 0 else (LIGHT if r_i % 2 == 0 else WHITE)
# ================= SLIDE 10: COMPLICATIONS =================
s = prs.slides.add_slide(BLANK)
header(s, "Complications of Voice Prosthesis / TEP", num=10, total=TOTAL)
add_bullets(s, Inches(0.6), Inches(1.5), Inches(5.9), Inches(5.2), [
"Device-related:",
("Leakage through the valve (candida biofilm degrading the silicone) - most common cause of replacement", 1),
("Leakage around the prosthesis - fistula tract widening/hypotonicity of PE segment", 1),
("Granulation tissue at the puncture site", 1),
("Dislodgement or accidental removal", 1),
], size=14.5, space_after=8)
add_bullets(s, Inches(6.9), Inches(1.5), Inches(5.9), Inches(5.2), [
"General surgical complications:",
("Pharyngocutaneous fistula (higher risk after prior radiotherapy)", 1),
("Stomal stenosis - may need a laryngectomy tube/appliance", 1),
("Aspiration pneumonia (if valve incompetent)", 1),
"Management principles:",
("Regular follow-up, antifungal (nystatin) rinses to reduce candida colonisation", 1),
("Timely prosthesis replacement (can be an outpatient/bedside procedure)", 1),
], size=14.5, space_after=8)
# ================= SLIDE 11: HOLISTIC REHABILITATION =================
s = prs.slides.add_slide(BLANK)
header(s, "Beyond Voice: Holistic Rehabilitation of the Laryngectomee", num=11, total=TOTAL)
add_bullets(s, Inches(0.6), Inches(1.5), Inches(11.9), Inches(5.3), [
"Voice rehabilitation is only one part of comprehensive laryngectomee care - a multidisciplinary team approach is essential:",
("Speech-language therapist - trains oesophageal/TE speech, counsels on device use", 1),
("ENT/Head-neck surgeon - performs TEP, manages stoma and prosthesis issues", 1),
("Heat and moisture exchanger (HME) - improves pulmonary humidification and can improve TE speech", 1),
("Olfaction rehabilitation - 'polite yawning' / nasal-airflow-inducing manoeuvre helps restore smell (lost due to diverted airflow)", 1),
("Stoma care and education - lifelong neck-breather precautions (showering, swimming, emergency resuscitation via stoma)", 1),
("Psychological support and laryngectomy support groups - address anxiety, depression and body-image concerns", 1),
("Dietitian - for swallowing and nutrition once oral intake resumes", 1),
], size=16, space_after=12)
# ================= SLIDE 12: RECENT EVIDENCE =================
s = prs.slides.add_slide(BLANK)
header(s, "Recent Evidence & Quality of Life", num=12, total=TOTAL)
add_bullets(s, Inches(0.6), Inches(1.5), Inches(11.9), Inches(4.6), [
"Tracheoesophageal (prosthetic) speech consistently shows the best voice-related quality of life scores compared with oesophageal speech and electrolarynx across recent systematic reviews and meta-analyses",
"Provox and Blom-Singer indwelling prostheses show comparable long-term functional outcomes; device choice is often guided by local expertise and patient factors",
"Early involvement of speech-language pathology and structured voice/swallow rehabilitation protocols improve overall communication and quality-of-life outcomes after total laryngectomy and after chemoradiation-related voice dysfunction",
], size=16, space_after=14)
note = s.shapes.add_shape(MSO_SHAPE.ROUNDED_RECTANGLE, Inches(0.6), Inches(5.5), Inches(11.9), Inches(1.4))
note.fill.solid(); note.fill.fore_color.rgb = LIGHT; note.line.color.rgb = TEAL; note.shadow.inherit=False
tf = note.text_frame; tf.word_wrap = True; tf.margin_left=Pt(10); tf.margin_top=Pt(8)
p = tf.paragraphs[0]; p.text = "Supporting literature (PubMed):"
p.runs[0].font.bold = True; p.runs[0].font.size = Pt(13); p.runs[0].font.color.rgb = NAVY
p2 = tf.add_paragraph()
p2.text = ("Maniaci A et al. Voice-Related Quality of Life After Total Laryngectomy: Systematic Review and Meta-Analysis. "
"J Voice. 2024. PMID 34763996 | Zhao M et al. Rehabilitation training on radiotherapy-related voice abnormalities: "
"SR & meta-analysis. PLoS One 2025. PMID 40063657")
p2.runs[0].font.size = Pt(12); p2.runs[0].font.color.rgb = DARK
# ================= SLIDE 13: SUMMARY / REFERENCES =================
s = prs.slides.add_slide(BLANK)
header(s, "Summary & References", num=13, total=TOTAL)
add_textbox(s, Inches(0.6), Inches(1.4), Inches(11.9), Inches(0.4), "Key take-home points", size=18, bold=True, color=NAVY)
add_bullets(s, Inches(0.6), Inches(1.85), Inches(11.9), Inches(2.5), [
"Total laryngectomy removes the sound source and separates the airway from the vocal tract",
"Three rehabilitation pathways: oesophageal speech, artificial larynx (electrolarynx), and tracheo-oesophageal speech with a voice prosthesis (TEP)",
"TEP with an indwelling voice prosthesis (Blom-Singer/Provox) gives the best voice outcomes and is now the standard of care",
"Rehabilitation is multidisciplinary - surgeon, speech therapist, and long-term stoma/device care are all essential",
], size=15.5, space_after=8)
add_textbox(s, Inches(0.6), Inches(4.55), Inches(11.9), Inches(0.4), "References", size=18, bold=True, color=NAVY)
add_bullets(s, Inches(0.6), Inches(5.0), Inches(11.9), Inches(2.0), [
"Dhingra PL, Dhingra S. Diseases of Ear, Nose and Throat & Head and Neck Surgery (as per MBBS curriculum) - Larynx / Laryngectomy chapter",
"Bailey BJ, Love RJ. Bailey & Love's Short Practice of Surgery, 28th ed. - 'Voice rehabilitation' section",
"Flint PW et al. Cummings Otolaryngology - Head and Neck Surgery - Chapter on Alaryngeal Voice and Speech Rehabilitation",
"Maniaci A et al. J Voice 2024 (PMID 34763996); Zhao M et al. PLoS One 2025 (PMID 40063657)",
], size=13.5, space_after=6)
prs.save('/tmp/workspace/laryngectomy-voice-ppt/Voice_Rehabilitation_in_Laryngectomy.pptx')
print("Saved.")
cd /tmp/workspace/laryngectomy-voice-ppt && python build_ppt.py
cd /tmp/workspace/laryngectomy-voice-ppt && python -c " from pptx import Presentation prs = Presentation('Voice_Rehabilitation_in_Laryngectomy.pptx') print('slides:', len(prs.slides)) for i, slide in enumerate(prs.slides,1): pics = sum(1 for sh in slide.shapes if sh.shape_type==13) print(i, 'pics:', pics) " ls -la /tmp/workspace/laryngectomy-voice-ppt/
Voice Rehabilitation in Laryngectomy
Presentation · PPTX