a416233a2d
Adds a TTS read-along to the book reader. Tap the play button in the toolbar; AVSpeechSynthesizer reads the chapter paragraph-by-paragraph with the current word highlighted in yellow, auto-scrolling the active paragraph to centre. Tap any word during read-along to pause and open the definition sheet; reading resumes when the sheet dismisses. Behavior per spec: - Tap-to-define interrupts the synth (pauseSpeaking at: .immediate) and resumes on sheet dismiss. - Voice picker sheet (waveform.circle toolbar button) lists installed Spanish voices grouped by Premium / Enhanced / Default quality, with a "Download more voices…" row that opens iOS Settings (no public deep-link to Accessibility → Spoken Content exists; the footer spells out the path). - Speed picker (Slow / Normal / Fast) drives AVSpeechUtterance.rate. - Stops at chapter end, no auto-advance to the next chapter. - Vocabulary lines shaped `palabra = meaning` are skipped — the synth would otherwise say "palabra equals meaning" and they're reference material, not prose. Audio session uses .playback + .spokenAudio mode and is properly deactivated with .notifyOthersOnDeactivation on stop() so music apps resume cleanly after reading ends. Voice/rate persisted via @AppStorage; controller picks them up onAppear and writes back through Bindings the picker mutates. Word-index space in BookSpeechController.wordRanges(in:) matches BookReaderView's split(separator: " ") rendering exactly — both split on ASCII U+0020 only, so willSpeakRange callbacks resolve to the right visible word. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>