Repository navigation
M12: add local Read out loud on Windows, macOS and Linux - #1476
Open
robertobulltech wants to merge 8 commits into
Open
robertobulltech wants to merge 8 commits into
robertobulltech wants to merge 8 commits into
Conversation
Generated with Codex for @robertobulltech.
Use system say and external espeak-ng synthesis with private temporary WAV staging and safe playback. Keep speech voice independent from interface language and cover English/Italian selection, bounded subprocesses and same-position pause/resume. Add opt-in native synthesis checks and document physical audio validation still required. Generated with Codex for @robertobulltech.
Require Send only when an injected backend crosses into the worker, so CoreAudio streams can stay thread-bound without unsafe wrappers. Keep native backend factories before the test module for cross-platform Clippy. Avoid a premature SIGPIPE when detecting an installed Italian macOS voice. Generated with Codex for @robertobulltech.
Set 0700 atomically when creating temporary speech folders instead of relying on tempfile defaults or the user's umask. The native permission regression caught the issue before desktop playback validation. Generated with Codex for @robertobulltech.
Merge current upstream main while retaining bounded session-wide text caching, auto-tag Apply, folder batching, title-bar and link-consent translations alongside read-aloud controls. Regenerate translation hashes and preserve both sets of roadmap progress. Preserve deferred tool commands across asynchronous opening and delay startup downloads until pending opens finish. Existing UI regressions wait for background completion while retaining their original assertions. Generated with Codex for @robertobulltech.
Integrate upstream b5467d9 native-opening improvements while preserving speech controls and physical Linux validation. Validation: 320 targeted tests passed, 4 opt-in UI checks ignored. Strict all-target Clippy, fmt, layering, assets, parity and all 31 Wasm crate checks passed.
This was referenced Oct 14, 2026
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Main integration — 2026-10-17
Integrated upstream
mainat924c4da4in91bc67e3, preserving the existing feature scope and branch history.Local validation passed: formatting; strict all-target Clippy on affected crates; relevant library/integration tests; layering, asset attribution and parity gates; CLI without default features; dependency licence/advisory checks; and all 31 library crates on WASM with the pinned craft-fonts input. Native builds/tests use Rust 1.99, the low-disk profile, two build jobs and isolated Cargo targets. Existing ignored hardware/measurement probes remain explicit in the logs.
Preserved main’s automation read/write roots, accessibility additions, independent PDF oracle requirements and portable RPM dependency names alongside speech support. Added the ten missing Vietnamese labels and refreshed attribution hashes. Workflow actionlint and ALSA packaging YAML checks also passed.
Full-workspace Linux/Windows CI for this exact commit: https://github.com/robertobulltech/pdfcraft/actions/runs/39020796825. The run is still in progress at publication; workflow dispatch also starts the additional nightly mutation-fuzz job.
The earlier validation history and feature limitations below remain for context.
Read extracted PDF text aloud through local voices on Windows, macOS and Linux. The dialog and CLI/MCP tools expose page/range, installed voice, speed, Pause/Resume and Stop. English and Italian voice selection is independent of interface language; no automatic document-language detection is claimed.
Windows uses safe WinRT synthesis and MediaPlayer. macOS uses the system
sayexecutable; Linux requiresespeak-ng. Unix synthesis produces bounded WAV audio in an owner-private temporary directory, followed by Rodio/CPAL playback with same-position pause/resume. The permissively licensed Hound decoder is selected explicitly; no copyleft speech-engine library, models, shell, cloud transport or runtime download is added. Text goes through stdin, embedded speech-command delimiters are escaped, and temporary text/audio is removed before playback or on cancellation/error.The source PDF is immutable; preparation is off the UI thread and limited to 64 pages, 1 MiB and 4,096 Unicode-safe chunks. Closing, switching or changing the source stops speech. Automation includes prepare/start/control/status/voices/wait; CLI scripts can wait for audio completion. The voice/speed/dialog labels are localized in all 21 existing translation catalogs, with attribution hashes regenerated. Linux build/CI and deb/rpm audio prerequisites are updated.
Validation:
Physical Linux validation (2026-10-13):
50cf2cewas built and tested on a physical CachyOS / KDE Plasma Wayland desktop with Rust 1.99.0, eSpeak NG 1.52.0, PipeWire 1.6.9 and USB Audio Speakers. Platform tests: 22 passed, 0 failed, 4 opt-in tests initially ignored. All three opt-in Unix speech checks were then explicitly run and passed: non-silent English/Italian WAV synthesis at 0.5x, 1x and 2x, and muted playback on the real audio device with position-preserving pause/resume and resource release on Stop. All three read-aloud UI regressions passed; strict platform Clippy and fmt passed.b5467d93, the published merge at30f4879passed 320 targeted tests: 8 native-opening regressions, 299 affected UI tests, 10 batch tests and 3 speech-automation tests. Four opt-in UI checks remained ignored. Strict all-target Clippy on the affected UI/automation crates, fmt, layering, asset attribution, parity and all 31 Wasm crate checks passed. The Wasm check used a temporary, checksum-verified Rust target installation without changing the system toolchain.Remaining validation and limits:
espeak-ngexecutable and default audio output. In a sandboxed package the executable must be accessible inside the sandbox; host installation alone may not suffice. Shared release builders need ALSA development files.Integrated with upstream
b5467d93(0.7.1) in merge commit30f4879. GitHub reports the PR as mergeable without conflicts; the post-integration verification scope is listed above. Conflict resolution preserves the bounded session-wide text cache, auto-tag Apply, folder batching and both sets of translations/documentation. Upstream native-opening improvements are retained: chosen tools survive preparation, conversion and password retries, startup intake waits for pending preparation, and shared state-based waits keep the stronger document-identity assertions. No release or upstream merge is performed by this PR.