Effort: Small · Priority: High
Status: Partial — prompt_toolkit is already in use with AutoSuggestFromHistory.
- Add a custom
Completerto_make_prompt_session()that completes/quit,/exit,/help,/clear,/replay(and future commands like/pause,/stop) - Fuzzy-match support so
/h→/help - Extend to file paths for a future
/opencommand
Effort: Medium · Priority: High Dependencies: None Status: Done
- ✅ Create
PlaybackControllerclass with background thread playback - ✅ Pause/resume via
SIGSTOP/SIGCONT(Unix) - ✅ Stop via
proc.terminate() - ✅ Thread-safe state management with
threading.Lock - ✅ Integrated into interactive mode
- ✅ Zero new dependencies (stdlib
threading+signal)
Effort: Small · Priority: High Dependencies: 1.2 (non-blocking playback) ✅ Status: Ready to implement
- Add interactive commands:
/pause,/play(resume),/stop - Wire commands to
PlaybackController.pause(),.resume(),.stop() - Display playback state in prompt (e.g.,
▶ Playing…,⏸ Paused) - Add to autocomplete and
/helpoutput
Effort: Medium · Priority: High Dependencies: None Status: Done
- ✅ Create
_iter_epub_chapters()yielding(chapter_number, total_chapters, text)— mirrors_iter_pdf_pages() - ✅ Wire into
main()with.epubsuffix detection alongside the existing.pdfpath - ✅
--pagesflag selects chapters for EPUBs - ✅ Strip HTML tags from EPUB XHTML content (stdlib
html.parser) - ✅ Navigation documents filtered out via spine ordering
- ✅ Zero external dependencies — uses stdlib
zipfile+xml.etree.ElementTree
Effort: Medium · Priority: Medium Dependencies: Phase 1.2 (stop controls) ✅, Phase 2.1 (epub support desirable) ✅ Status: Ready to implement
- Create a JSON bookmarks file at
_data_dir() / "bookmarks.json" - Schema:
{ "/abs/path/to/book.pdf": { "page": 12, "char_offset": 340, "timestamp": "2026-02-18T10:00:00" } } - On
/stoporCtrl-Cduring file reading, persist current page + character offset - Add
--resume/-rflag:reed -f book.pdf --resumepicks up where it left off - Add
reed bookmarkssubcommand to list/clear saved positions - Interactive command:
/bookmarksto list,/resumeto continue last file
Effort: Large · Priority: Medium Dependencies: Phase 1.2 (playback controller) ✅ Status: Ready to implement
Currently reed generates the full WAV file before playing. Streaming removes that wait.
- Use
piper --output-rawwhich streams raw PCM to stdout - Pipe piper's stdout directly into the audio player's stdin (e.g.,
aplay -f S16_LE -r 22050 -c 1on Linux,ffplay -f s16le -ar 22050 -ac 1 -on macOS/Windows) - On macOS:
afplaydoesn't support stdin; switch toffplayorsox playfor streaming, or usepython-sounddeviceto play raw PCM frames as they arrive - Chunk-based playback loop:
- Start piper
Popenwithstdout=PIPE - Start audio player
Popenwithstdin=PIPE - Read chunks from piper → write to player
- Integrate with
PlaybackControllerfor pause/stop mid-stream
- Start piper
- Fallback: keep the current generate-then-play path when streaming isn't available
Effort: Large · Priority: Medium Dependencies: None (can be started anytime, independent of reed code changes)
No Lithuanian piper voice model exists yet — this requires training one from scratch.
- Dataset: source or record a Lithuanian speech dataset (e.g., from Common Voice, M-AILABS, or custom recordings); needs ~2–10 hours of single-speaker audio with transcripts
- Preprocessing: segment audio, normalize text, generate phoneme alignments (espeak-ng has Lithuanian support:
lt) - Training: use piper-recording-studio for data collection and piper training pipeline (VITS-based)
- Train
low,medium, andhighquality variants - Export to
.onnxformat for piper runtime
- Train
- Hosting: publish the trained model to HuggingFace (or self-host) so
_model_url()can resolve it - Reed integration: once the model is hosted, add
lt_LT-<voice>-mediumas a downloadable voice; optionally add--lang ltshorthand - Validation: native speaker review for pronunciation quality
| Phase | Feature | Effort | Dependencies | Status |
|---|---|---|---|---|
| 1.1 | Command autocomplete | Small | — | Partial |
| 1.2 | Non-blocking playback controller | Medium | — | ✅ Done |
| 1.3 | Pause / play / stop commands | Small | 1.2 | Ready |
| 2.1 | EPUB reading | Medium | — | ✅ Done |
| 3.1 | Save & resume position | Medium | 1.2, 2.1 | Ready |
| 4.1 | Streaming audio | Large | 1.2 | Ready |
| 5.1 | Lithuanian voice model training | Large | — | — |
Phase 1.2 is complete ✅. Phases 1.3, 3.1, and 4.1 now have their dependencies satisfied and are ready to implement.