Huang Xin
ad55375f89
fix(tts): preserve state on AbortError to keep rate changes effective on iOS, closes #3949 ( #3988 )
...
iOS WKWebView's in-flight audio.play() rejects with AbortError after audio.src is reset
during a stop+restart cycle. That rejection leaks through one of the .catch chains into
TTSController.error(), which unconditionally flipped state to 'stopped' — desyncing the
state machine so subsequent rate changes fell into the no-op else branch and #speak's
auto-forward gate stopped firing at paragraph end.
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-04-28 19:45:05 +02:00
Huang Xin
9c273d79fc
fix(tts): fixed race condition on pause/resume, closes #3825 ( #3905 )
2026-04-20 17:57:20 +02:00
Huang Xin
a5690e9a84
fix(tts): skip br elements in PDF text layer to prevent TTS interruptions at line breaks, closes #3771 ( #3811 )
...
PDF.js TextLayer renders <br> between text spans for visual line wrapping.
The TTS SSML generator was converting these to <break> elements, causing
TTS engines to pause at every PDF line break within paragraphs. Fix by
rejecting <br> (along with canvas and annotationLayer) via the node filter
when the document is detected as a PDF.
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-09 20:34:38 +02:00
Huang Xin
21795e5cd3
fix(tts): avoid race condition in preloadNextSSML causing wrong highlights ( #3748 )
...
preloadNextSSML() called tts.next() interleaved with await, creating async
gaps where the concurrent #speak() could dispatch marks against corrupted
#ranges state (replaced by next() for a different block). Since mark names
restart at "0" per block, marks resolved to the wrong text position, causing
accidental page turns and highlights far from the current sentence.
Fix: gather all tts.next() and tts.prev() calls synchronously (no await
between them) so no async code can see the intermediate #ranges state.
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-04 20:42:06 +02:00
Huang Xin
b71b246601
feat(settings): add TTS settings tab and highlight opacity, closes #3661 ( #3712 )
...
Add a new TTS tab in settings with media metadata update frequency control
(sentence/paragraph/chapter) to reduce Bluetooth notification spam, and move
TTS highlight settings from Color tab to the new TTS tab. Also add a highlight
opacity setting with live preview in the Color tab.
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-01 06:35:26 +02:00
Huang Xin
1936136596
fix: resolve various tracked exceptions in ph ( #3584 )
...
* fix: handle synced bookmarks without cfi
* chore: clean up some exceptions in ph
2026-03-22 08:16:38 +01:00
Huang Xin
1af55e24da
feat(epub): support continuous scroll and spread layout for EPUBs, closes #3419 and closes #1745 ( #3546 )
2026-03-16 18:24:07 +01:00
Huang Xin
8850e6c00f
feat(pdf): support TTS and annotation on PDFs, closes #2149 & #3462 ( #3493 )
...
* chore: bump jsdom to the latest version
* feat(pdf): support TTS and annotation on PDFs, closes #2149 & closes #3462
2026-03-09 10:28:19 +01:00
Huang Xin
1bb49ab023
fix(tts): dispose of the TTS view when shutting down the TTS controller, closes #3400 ( #3406 )
2026-02-28 08:58:02 +01:00
Huang Xin
2bd54ac236
fix(tts): also show highlight when navigating in paused mode and improve abbreviations processing ( #3396 )
...
Closes #3317 .
2026-02-27 06:46:27 +01:00
Huang Xin
fe3ab011ca
fix(tts): set document lang attribute when missing or invalid for TTS, closes #3291 ( #3393 )
2026-02-26 17:17:51 +01:00
Huang Xin
548d50a882
fix(tts): navigate to follow the current TTS location for the next section, closes #3198 ( #3276 )
2026-02-12 16:13:41 +01:00
Huang Xin
920032155b
fix(tts): fix paused tts will still read to the end of the current paragraph, closes #3244 ( #3256 )
2026-02-11 03:06:12 +01:00
Huang Xin
1ed84a3256
feat(tts): navigation in TTS mode with back to current button, closes #3100 ( #3189 )
2026-02-06 18:26:14 +01:00
Huang Xin
6c0f1b8b5f
fix(annotator): fix instant action on Android ( #3042 )
2026-01-23 17:18:51 +01:00
Huang Xin
481d8198e9
fix(tts): set playback rate after play only on Linux ( #3040 )
2026-01-23 12:14:13 +01:00
Huang Xin
017d0b0b39
fix(tts): fix setting playback rate on Linux, closes #2950 ( #2966 )
2026-01-15 17:29:26 +01:00
Huang Xin
7d97826e4b
feat(tts): replace words for TTS, closes #2057 ( #2952 )
2026-01-14 16:42:11 +01:00
Hermotimus
a312080f7c
fix(tts): footnotes anchors and superscript filtering ( #2890 )
2026-01-09 02:16:07 +01:00
Huang Xin
fb41ff5d0c
fix(tts): reduce the pause duration between sentences in Edge TTS, closes #2837 ( #2844 )
2026-01-03 08:44:15 +01:00
Huang Xin
a42897ec5c
feat(annotator): support quick actions for text selection, closes #2505 ( #2813 )
2025-12-30 10:32:01 +01:00
Huang Xin
8a43c58fd4
fix(tts): resolve Edge TTS being blocked in certain regions ( #2741 )
...
This should close #2739 and close #1821 .
2025-12-19 03:24:51 +01:00
Huang Xin
b08b7de8e9
fix(tts): fixed highlighting of current sentence for native tts on Android, closes #2620 ( #2621 )
2025-12-05 04:05:18 +01:00
Huang Xin
2ca3561093
feat(opds): support downloading ebooks from OPDS catalogs ( #2571 )
2025-11-30 21:22:54 +01:00
Huang Xin
e3f7abf7f1
fix(tts): fixed incorrectly selected voices, closes #2386 ( #2426 )
2025-11-09 19:11:12 +01:00
Huang Xin
1d87dcdb7f
feat: add options to customize the style of highlighted text of current sentence of TTS ( #2358 )
2025-10-29 10:17:36 +01:00
Huang Xin
86efcde927
feat(tts): add an option to select target language for TTS on translated books ( #2310 )
2025-10-23 19:34:43 +02:00
Huang Xin
001e836ae3
chore: bump eslint-config-next to version 16 ( #2294 )
2025-10-22 15:57:04 +02:00
Huang Xin
f66642b8ec
tts: avoid using AnaNeural as default English voice ( #2272 )
2025-10-19 14:58:51 +02:00
Huang Xin
9dda5d4c88
fix(tts): scroll more accurately to the highlighted text in TTS when header/footer bars are shown ( #2242 )
2025-10-15 17:50:56 +02:00
Huang Xin
25b44176b9
fix(tts): parse default language in ssml without translated text ( #2135 )
2025-09-27 17:52:54 +02:00
Huang Xin
c0f77b3368
fix(tts): abortable prefetch of tts data, closes #2037 ( #2110 )
2025-09-24 12:19:07 +02:00
Huang Xin
d95656b37b
fix(tts): compensate audio fade-in for resumed play on iOS and macOS, closes #2005 ( #2006 )
2025-09-09 08:29:39 +02:00
Huang Xin
5724d2eeec
feat(tts): support going previous/next by sentence in bottom TTS bar, closes #1816 ( #1967 )
2025-09-05 10:34:30 +02:00
Huang Xin
32954e025c
fix(tts): media control in the lock screen and with airpods for iOS, closes #1407 ( #1949 )
2025-09-02 17:24:16 +02:00
shaqtiktok
75dc04d598
fix(tts): reuse audio object in the same paragraph for better performance, closes #1777 ( #1853 )
...
* Remove stopInternal which causes audio delaying
* Change audio obj to not be recreated every sentence
* refactor abort signal handler
---------
Co-authored-by: Huang Xin <chrox.huang@gmail.com >
2025-08-22 17:22:34 +02:00
Huang Xin
29b5a7cb88
tts: skip text to speech for rubys and footnote anchors, closes #1334 ( #1608 )
2025-07-18 11:10:12 +02:00
Huang Xin
abb727870e
tts: handle invalid language code and show no voices hints, closes #1579 ( #1607 )
2025-07-18 09:27:51 +02:00
Huang Xin
42f50af27b
tts: each book view now has its own tts controller ( #1411 )
2025-06-18 11:37:02 +02:00
Huang Xin
07f74d8858
settings: individually adjust top, bottom, left, and right margins on the reader page ( #1410 )
2025-06-18 10:55:24 +02:00
Huang Xin
261ce95ed1
feat: add keyboard shortcut t to toggle TTS ( #1405 )
2025-06-16 08:50:10 +02:00
Huang Xin
f7f8872a13
tts: translation also when TTS is played in the background, closes #1383 ( #1399 )
2025-06-15 09:07:22 +02:00
Huang Xin
84328dcfb2
hotfix: resolve compatibility issues with Android Text-to-Speech API ( #1394 )
2025-06-14 15:39:12 +02:00
Huang Xin
658969e97a
feat: support native tts engine on Android ( #1387 )
2025-06-12 17:56:14 +02:00
Huang Xin
f8ac30adf1
tts: add native tts plugin for Android ( #1376 )
2025-06-09 16:54:12 +02:00
Huang Xin
32f9346f84
tts: more robust way to save last speaking location for tts ( #1293 )
2025-05-31 13:34:35 +02:00
Huang Xin
77fa57438e
tts: show speaking sentence and chapter info in tts media session ( #1289 )
2025-05-31 09:21:17 +02:00
Huang Xin
c7a583c53a
translator: lazy load translation observer ( #1282 )
2025-05-30 09:08:45 +02:00
Huang Xin
9f0d8b5c12
tts: select voice in bilingual TTS mode ( #1263 )
2025-05-28 16:59:45 +02:00
Huang Xin
35735cd931
fix: skip speech when the text is empty at the end of some chapters, closes #1231 ( #1243 )
2025-05-26 16:03:43 +02:00