"1.马克思主义" was segmented after "1." and normalised to "一.", so the number was spoken as its own sentence. A list marker (1. / 一. / (3). at a line or clause start; never a decimal, version or IP) no longer ends a server or standalone-reader segment and is read as "一、". Python and static reader.js share the rule (parity test); narration identity becomes phrases-v13-list-markers.
3 days ago
feat: add optional duration-preserving CPU pitch audition
Preserve original text/UTF-16 positions and pinned CPU models. Keep dates, versions and labelled numeric IDs whole across source plans; use the same idempotent spoken forms in contextual and acoustic frontends. Add browser-only 0.5-2 playback rates and nonpersistent clip/deadline sleep timers with progress-safe cancellation.
feat: add source clip navigation, structural pauses and pause-aware prefetch
Keep original UTF-16 text and complete MP3 API. Publish source plans before synthesis, add safe source highlighting and previous/next/click seeks, vary supplemental silence by structure, and stop speculative tasks/audio preloads while paused. Release late job capabilities and ignore obsolete play promises without changing CPU, models, voices or quote data.
feat: publish completed speech parts and add resumable long reader
Preserve complete MP3 API, quote/data contracts and pinned two-thread CPU models. Add bounded atomic part publication with cancellation-safe leases, contextual adjacent batches and idempotent retries. Audition reader supports opt-in local bookmarks, at most one following batch and MP3 preload, and explicit recovery without skipping text.