You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Three ways to mark word stress, from simplest to most detailed:
247
-
248
-
**Inline tag** — wrap the stressed part of a word with `[stress]`:
246
+
**Inline wrap** — wrap the stressed part of a word:
249
247
250
248
```markdown
251
249
develop[stress]me[/stress]nt # Stress on "me"
252
250
[stress]in[/stress]frastructure # Stress on "in"
253
251
```
254
252
255
-
The simplest approach. The tag can wrap a single letter or a syllable — whatever part needs emphasis. Renderers should visually distinguish the stressed portion (e.g., underline, bold, or color).
253
+
The tag can wrap a single letter or a syllable. Renderers should visually distinguish the stressed portion (e.g., larger font size, underline, or bold).
256
254
257
-
**Inline accent** — place an acute accent (`´`) on the stressed vowel directly in the word:
255
+
**Stress guide** — full syllable breakdown with a parameter:
258
256
259
257
```markdown
260
-
developmént # Stress on the "e" in "-ment"
261
-
ínfrastructure # Stress on the first "i"
258
+
[stress:de-VE-lop-ment]development[/stress]
259
+
[stress:IN-fra-struc-ture]infrastructure[/stress]
262
260
```
263
261
264
-
No tags needed — the accent is visible in the text itself. Parsers should recognize acute-accented vowels (`á`, `é`, `í`, `ó`, `ú`) as stress markers. The renderer may display the accent or strip it after applying visual stress.
262
+
Hyphens separate syllables. The stressed syllable is **UPPERCASE**, unstressed are lowercase. Renderers should display the guide as a tooltip or overlay — not replace the word. Use this for complex or unfamiliar words where the reader needs the full pronunciation map.
265
263
266
-
**Stress guide tag** — for full syllable breakdown when the reader needs more guidance:
264
+
#### Delivery Mode Tags
267
265
268
266
```markdown
269
-
[stress:de-VE-lop-ment]development[/stress]
270
-
[stress:IN-fra-struc-ture]infrastructure[/stress]
267
+
[sarcasm]Oh, that went really well[/sarcasm] # Say the opposite of what you mean
268
+
[aside]By the way, we also support webhooks[/aside] # Parenthetical, "to the audience"
269
+
[rhetorical]Isn't that exactly what we need?[/rhetorical] # Question delivered as statement
270
+
[building]Each phrase gets bigger. And bigger. And BIGGER.[/building] # Gradually rising energy
271
271
```
272
272
273
-
The guide string uses hyphens to separate syllables. The stressed syllable is written in **UPPERCASE**; unstressed syllables are lowercase. Renderers should display the stress guide as a tooltip, subtitle, or overlay — not replace the word itself.
273
+
Delivery mode tags describe **how** to deliver a passage, beyond emotion and volume:
274
+
275
+
| Tag | Delivery | Use when |
276
+
|-----|----------|----------|
277
+
|`[sarcasm]`| Say it straight, but mean the opposite. Deadpan or exaggerated. | Comedy, skepticism, irony. |
278
+
|`[aside]`| Step out of the main narrative. Lower energy, more intimate. | Parenthetical comments, tangents, notes to audience. |
279
+
|`[rhetorical]`| Deliver as a statement with question syntax. No rising intonation. | Rhetorical questions that don't expect answers. |
280
+
|`[building]`| Start at lower energy, gradually increase through the passage. | Reveals, motivational build-ups, crescendo moments. |
274
281
275
282
## Keyword Reference
276
283
@@ -303,6 +310,15 @@ Renderers map each emotion to a visual style (colors, background, text treatment
303
310
|`soft`| Quieter, gentler delivery |
304
311
|`whisper`| Whispered, intimate delivery |
305
312
313
+
### Delivery Modes
314
+
315
+
| Keyword | Delivery | Use when |
316
+
|---------|----------|----------|
317
+
|`sarcasm`| Say it straight, but mean the opposite. Deadpan or exaggerated. | Comedy, skepticism, irony. |
318
+
|`aside`| Step out of the main narrative. Lower energy, more intimate. | Parenthetical comments, tangents, notes to audience. |
319
+
|`rhetorical`| Deliver as a statement with question syntax. No rising intonation. | Rhetorical questions that don't expect answers. |
320
+
|`building`| Start at lower energy, gradually increase through the passage. | Reveals, motivational build-ups, crescendo moments. |
321
+
306
322
### Inline Tags
307
323
308
324
| Tag | Syntax | Description |
@@ -326,11 +342,14 @@ Renderers map each emotion to a visual style (colors, background, text treatment
|**Emotion**|`[warm]text[/warm]`, `[urgent]...[/urgent]`, etc. | Inline emotion override (see Emotions table) |
334
353
335
354
### Speed Presets
336
355
@@ -400,9 +419,13 @@ For any word, the effective WPM is determined by (highest priority first):
400
419
401
420
When emotion changes between segments or blocks, renderers should apply a smooth visual transition (recommended: 3-second fade between color schemes).
402
421
403
-
### Inline Emotion Precedence
422
+
### Tag Precedence
423
+
424
+
**Emotion:** When inline emotion tags are nested, the **innermost tag wins** for the enclosed span. Block-level emotion serves as the default styling; inline emotion tags override it for their span only.
425
+
426
+
**Volume vs. emotion:** Volume and emotion are **independent dimensions**. `[soft]` inside an `Urgent` block means: deliver with urgent tone but at lower volume. They do not conflict — volume controls loudness, emotion controls tone.
404
427
405
-
When inline emotion tags are nested, the **innermost tag wins**for the enclosed span. Block-level emotion serves as the default styling; inline emotion tags override it for their span only.
428
+
**Delivery modes** (`[sarcasm]`, `[aside]`, `[rhetorical]`, `[building]`) override the current emotion for their span. They are specialized delivery instructions that take priority over the block emotion.
406
429
407
430
### Phrase Boundaries
408
431
@@ -411,7 +434,9 @@ A **phrase** is a unit of text delimited by:
411
434
- Pause markers: `/`, `//`, `[pause:...]`
412
435
- Block or segment boundaries
413
436
414
-
Phrases are the smallest unit for timing calculation. Words within a phrase are counted for WPM computation using whitespace tokenization: each whitespace-separated token counts as one word. Hyphenated words (e.g., `state-of-the-art`) count as one word. Tags and tag syntax are not counted.
437
+
Phrases are the smallest unit for timing calculation.
438
+
439
+
**WPM word counting** is performed on **clean text** — after all tags and markup are stripped. The parser first removes all tag syntax (`[tag]`, `[/tag]`, `[tag:param]`), then joins any text fragments split by mid-word tags (e.g., `develop[stress]me[/stress]nt` → `development`), then counts words using whitespace tokenization. Each whitespace-separated token in the clean text counts as one word. Hyphenated words (e.g., `state-of-the-art`) count as one word.
415
440
416
441
### Tag Nesting
417
442
@@ -439,17 +464,64 @@ If a TPS file has no `##` segment headers, the entire content (after front matte
439
464
440
465
Plain markdown `## Title` and `### Title` headers (without `[...]` brackets) are also recognized as segments and blocks respectively, with default (neutral) emotion and inherited WPM.
441
466
442
-
## Rendering Context
467
+
## Rendering Principles
468
+
469
+
A TPS file is **source markup**, not display output. The teleprompter application **must** process the markup and present clean, styled text to the reader. The reader should never see raw tags like `[emphasis]` or `[slow]` on screen.
470
+
471
+
### Tag Visibility
443
472
444
-
TPS is designed for **teleprompter use** — text is always rendered on a **dark background** (typically near-black: `#1A1B2E` or similar). All color choices, contrast ratios, and visibility rules assume this context.
473
+
All tags (`[emphasis]`, `[slow]`, `[loud]`, `[sarcasm]`, etc.) are **invisible in the rendered output**. The renderer applies their effects visually:
474
+
475
+
-`[emphasis]word[/emphasis]` → the word appears **bold** or in a distinct color
476
+
-`[slow]text[/slow]` → text may appear with a pacing indicator or wider spacing
477
+
-`[loud]text[/loud]` → text appears larger or bolder
478
+
-`[whisper]text[/whisper]` → text appears smaller or lighter
479
+
-`[sarcasm]text[/sarcasm]` → text styled with a distinct visual cue (e.g., italic + indicator)
480
+
-`[building]text[/building]` → text may gradually increase in size or intensity
481
+
-`[breath]` → a small visual indicator (e.g., a subtle mark or gap)
482
+
- Segment/block headers → rendered as section dividers, not raw markdown
483
+
484
+
The reader sees only the spoken text with visual styling applied. Tags are commands for the renderer, not content for the speaker.
485
+
486
+
### Content Restrictions
487
+
488
+
TPS scripts contain **spoken text only**. Do not include:
489
+
- URLs or hyperlinks — these are not spoken content
490
+
- Code blocks or technical syntax — rewrite as spoken language
491
+
- Images or embedded media references
492
+
- Raw data tables — narrate the data instead
493
+
494
+
### Rendering Context
495
+
496
+
TPS is designed for **teleprompter use** — text is always rendered on a **dark background** (typically near-black: `#1A1B2E` or similar). All visual choices assume this context.
497
+
498
+
### Visual Rendering Hints
499
+
500
+
Renderers should use **text size, letter spacing, weight, and animation** to communicate delivery cues without the reader needing to see tags. Recommended visual mappings:
501
+
502
+
| Tag | Font size | Letter spacing | Weight | Other |
|`[sarcasm]`| Normal | Normal | Normal | Italic + visual indicator |
514
+
|`[aside]`| Smaller (85–90%) | Normal | Light | Dimmed or offset |
515
+
|`[highlight]`| Normal | Normal | Normal | Background overlay |
516
+
517
+
These are **recommendations**, not requirements. Renderers may adapt the visual treatment to their platform. The key principle: the reader should **feel** the delivery instruction from the visual presentation alone.
445
518
446
519
### Dark Background Rules
447
520
448
521
1.**Text base color** is white/light (`#F8F9FA` or similar).
449
522
2.**Minimum contrast** — all styled text must produce at least **WCAG AA 4.5:1** contrast ratio against the dark background.
450
523
3.**Emotion color schemes** (background, text, accent) are pre-defined per emotion and tuned for the dark rendering context.
451
524
4.**`highlight`** uses a semi-transparent yellow background overlay, not a text color change.
452
-
5.**Volume indicators** — `[loud]` text should be visually larger or bolder; `[soft]` and `[whisper]` should be visually smaller or lighter.
453
525
454
526
## WPM Guidelines
455
527
@@ -498,9 +570,23 @@ Additional validation:
498
570
### Casing, Whitespace, Escaping
499
571
500
572
- Tags are case-insensitive; canonical form is lower-case (e.g., `[emphasis]`).
501
-
-`WPM` suffix is uppercase by convention (e.g., `140WPM`).
573
+
-`WPM` suffix is uppercase by convention (e.g., `140WPM`).`140wpm` is also valid — parsers should normalize.
502
574
- Parameters inside headers are trimmed; `140 WPM` normalizes to `140WPM`.
503
575
- Escape reserved characters in plain text with backslash: `\[`, `\]`, `\|`, `\/`, `\*`, `\\`.
576
+
- Escape sequences apply **only in plain text**, not inside tag parameters or header parameters.
577
+
578
+
### Error Handling
579
+
580
+
Parsers should handle invalid input gracefully:
581
+
582
+
-**Unknown tag:** Treat as plain text (display the brackets and content literally).
583
+
-**Unknown emotion keyword:** Parse error. Reject the keyword and use the inherited emotion.
584
+
-**Unclosed tag:** Implicitly close at the end of the current block (see Tag Nesting).
585
+
-**Closing tag without opening:** Ignore the closing tag.
586
+
-**Invalid WPM** (< 80 or > 220): Parse error. Use the inherited WPM value.
587
+
-**Malformed pause** (e.g., `[pause:abc]`): Treat as plain text.
588
+
-**Cross-nested tags:** Parse error. The parser should close tags in order and report a warning.
589
+
-**Duplicate parameters in headers** (e.g., two WPM values): Use the last one.
504
590
505
591
## Complete Example
506
592
@@ -530,7 +616,7 @@ will be a [emphasis]transformative moment[/emphasis] for our company. //
530
616
### [Purpose Block|145WPM]
531
617
[emphasis]Today[/emphasis], / we're not just launching a product – / [breath]
532
618
we're introducing a [highlight]solution[/highlight] that will [emphasis]revolutionize[/emphasis] /
533
-
how our customers interact with [stress:tech-NO-lo-gy]technology[/stress]. //
619
+
how our customers interact with tech[stress]no[/stress]logy. //
534
620
535
621
## [Problem|135WPM|Concerned]
536
622
@@ -541,7 +627,7 @@ Our industry has been [emphasis]struggling[/emphasis] with a fundamental problem
541
627
[edit_point:high]
542
628
543
629
According to recent studies, /
544
-
[slow][emphasis]73% of users abandon[/emphasis] applications within the first three interactions[/slow] /
630
+
[slow][emphasis]73% of users a[stress]ban[/stress]don[/emphasis] applications within the first three interactions[/slow] /
545
631
due to [highlight]complexity and poor user experience[/highlight]. //
546
632
547
633
### [Impact Block]
@@ -552,16 +638,16 @@ costing businesses [loud][emphasis]billions[/emphasis] in revenue[/loud] annuall
552
638
553
639
### [Introduction Block]
554
640
That's where our [emphasis]new platform[/emphasis] comes in. /
555
-
We've developed a local-first téleprompter workflow that /
556
-
[highlight]simplifies complex processes[/highlight] and [emphasis]enhances user experiénce[/emphasis]. //
641
+
[building]We've developed a local-first teleprompter workflow that /
642
+
[highlight]simplifies complex processes[/highlight] and [emphasis]enhances user experience[/emphasis].[/building] //
557
643
558
644
### [Benefits Block|150WPM|Excited]
559
645
With our solution, / you can expect a [emphasis]50% reduction[/emphasis] in user abandonment /
560
646
and a [emphasis]30% increase[/emphasis] in engagement. //
561
647
562
648
[pause:1s]
563
649
564
-
[soft]Full details are available in the handout.[/soft] /
650
+
[aside]Full details are available in the handout.[/aside] /
565
651
[highlight]Thank you[/highlight] for your time. //
566
652
567
653
[edit_point:medium]
@@ -574,7 +660,7 @@ The [`examples/`](examples/) directory contains sample TPS files demonstrating t
|[`advanced.tps`](examples/advanced.tps)| All format features — speed controls, volume, stress marks, breath marks, emotions, pronunciation, edit points, tag nesting. |
663
+
|[`advanced.tps`](examples/advanced.tps)| All format features — speed, volume, delivery modes, syllable stress, breath marks, emotions, pronunciation, edit points, tag nesting. |
578
664
|[`multi-segment.tps`](examples/multi-segment.tps)| Multi-segment script with varying speed, emotion, and delivery cues across segments. |
0 commit comments