adhit-r / adhit-r/holocron

Per-character TTS in Story Mode quotes (Web Speech API)

Ouverte
#27 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub
area: a11y area: audio creative help wanted
Langage dominant
TypeScript
Étoiles
0
Forks
1
Métriques de merge des PR
Aucune PR mergée en 30 j

Description

> **Skills:** Web Speech API · TypeScript · per-speaker voice mapping
> **Time:** ~6 hours
> **Good for:** Voice-UI devs · accessibility advocates · audio engineers
> **Difficulty:** Intermediate

---

## Context

Story Mode currently surfaces quotes as text-on-card during each beat. Adding TTS narration would make stories accessible to low-vision users AND give them more cinematic weight. The Web Speech API's `SpeechSynthesis` is built into browsers — no model download, no copyright issue (synthetic voices aren't actor likenesses).

## Goal

Each `StoryBeat.quote` is read aloud when its beat starts (provided audio is enabled and the user opted in). Different speakers get different voice characteristics — pitch, rate, perceived "weight" — chosen for canon resonance, NOT impersonation.

## Where to start

- `components/cinematic/StoryMode.tsx` — beat changes already trigger an effect; hook TTS there.
- New `lib/audio/tts.ts` — speaker → SpeechSynthesisUtterance config (rate, pitch, voice).
- Suggested mappings (canon-evocative, not actor-faithful):
- Anakin / Luke: default rate, mid pitch
- Obi-Wan: slightly slower, slight pitch lift
- Yoda: very slow, low pitch
- Vader: very slow, very low pitch
- Padmé / Leia: default rate, slight pitch lift
- Palpatine: slow, low, raspy (try `voice` filter for "gravelly" available voices)
- Honor existing audio toggle. If audio is off, no TTS.
- Stop in-flight utterance on beat advance, pause, end-story.

## Acceptance criteria

- TTS opt-in alongside the existing audio toggle (don't autoplay synthesized speech without user gesture)
- Per-speaker variation audible
- Stops cleanly on Esc / pause / next-beat
- Reduced-motion is irrelevant; reduced-data optionally suppresses
- Browser support: SpeechSynthesis is in all browsers but voice availability varies — pick by `lang === 'en-US'` and pitch/rate, not by named voice
- Captions stay readable even with TTS active

## Reference

https://developer.mozilla.org/en-US/docs/Web/API/SpeechSynthesis

Guide de contribution

Ouvrir le guide de contribution

Évaluation

Cette issue n'a pas encore été évaluée.

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.