Convert PDF, EPUB, DOCX, Markdown, HTML, TXT, and RTF to MP3 audiobooks. Free Microsoft Edge TTS (no API key) with OCR for scanned PDFs, 70+ languages, and optional OpenAI or ElevenLabs voices. ~$0.04/min.
All notable changes to this Actor will be documented in this file.
[Unreleased]
Run reliability
Expected outcomes no longer fail the run. A bad URL, an empty input, a
document with no extractable text or a TTS refusal now writes the labelled
status: "failed" dataset row and exits 0. Only an unclassified error exits
non-zero. Crashing on these hid the explanation from the user and reported the
Actor as broken to Apify's daily health check, which runs empty input.
Several document sources no longer conflict.documentUrl carries a demo
prefill, so uploading a file used to fail validation through no fault of the
user. Sources are ranked instead — upload, pasted text, base64, URL — and the
chosen one is logged.
Audio minutes are billed per part as each part is uploaded, not once at the
end, so a run that hits its timeout mid-book still charges for the audio it
already delivered. The running total keeps the bill identical to a single
end-of-run charge.
Live default run options corrected to 7200s / 2048 MB. The 300s default could
not finish a full-length book.
[0.1.1] - 2026-06-08
Production-hardening: OCR, modern PDF engine, security, billing safety
New capabilities
OCR fallback for scanned / image-only PDFs — pages with no text layer are
auto-rendered (poppler pdftoppm) and OCR'd (Tesseract: EN, ES, FR, DE, IT,
PT, NL) and narrated. New ocr-page-processed billing event ($0.10/page),
charged only for pages that actually need OCR. Toggle with enableOcr.
Encrypted PDF support — decrypt password-protected PDFs via pdfPassword.
Proxy support — optional proxyConfiguration for the Document URL fetch.
ID3 tags on every MP3 part (title / album / track / genre=Audiobook).
Engineering
Replaced pdf-parse (2018 PDF.js, unmaintained) with unpdf — current,
serverless-friendly PDF.js. Per-page extraction via a direct array index
(no render-hook page-order invariant to desync).
Real unit test suite (Node test runner) for chunking, page-range parsing,
SSRF address checks, format detection, strippers, key sanitization, voice +
OCR-language mapping. ESLint flat config added.
Security
SSRF guard on Document URL fetch: rejects non-http(s) schemes and any host
resolving to private / loopback / link-local / CGNAT ranges (incl. cloud
metadata 169.254.169.254). Redirects are followed manually and re-validated
at every hop.
Added .dockerignore so .env / secrets / local state never enter image layers.
Pricing (PPE) — simpler + loss-proof
Single value meter: removed pdf-page-narrated; narration is now billed
purely per audio-minute-generated ($0.04/min) so the same value isn't
double-billed on two axes.
apify-actor-start raised to $0.12 (from the $0.00005 platform default):
it's the only revenue on a failed / 0-page run, so it's sized to stay
margin-positive on failures after Apify's 20% cut while remaining trivial
against value events on real documents (and absorbed by free trials).
ocr-page-processed stays $0.10. Net effect: ~90%+ margin on every real run,
no loss on failed runs.
Billing safety
maxCostUsd now also clamps the actual audio-minute charge (not just the
pre-flight estimate), so slow-speech / CJK runs can't bill past the cap.
maxCostUsd floor is now $0.12 (the unavoidable actor-start fee); sub-floor /
zero values are rejected instead of silently disabling the cap.
[0.1.0] - 2026-06-02
Initial public release as Text to Audio Narrator
Multi-format document narration: PDF, Markdown, plain text, and HTML in, MP3 out.
Supported inputs (7 formats)
PDF (.pdf) — native text-layer extraction (no OCR)
DOCX (.docx) — Word documents via mammoth: styles, lists, tables, footnotes
EPUB (.epub) — ebooks via epub2: spine-ordered chapter walk, HTML stripped per chapter
Markdown (.md, .markdown, .mdx) — syntax stripped before TTS so the voice reads natural prose
Plain text (.txt, .text) — UTF-8 with BOM handling
HTML (.html, .htm, .xhtml) — tags stripped, entities decoded