# Document to Audiobook: EPUB, PDF, DOCX to MP3 (`offerastudio/document-to-audiobook`) Actor

Turn EPUB, PDF, DOCX, MOBI, AZW3, ODT, RTF, PPTX, web articles and 150+ other formats into MP3 or M4B audiobooks with chapters and SRT subtitles. Batch files or a ZIP, 322 natural voices in 75 languages, OCR for scans. $0.01 per audio minute.

- **URL**: https://apify.com/offerastudio/document-to-audiobook.md
- **Developed by:** [Offera Studio](https://apify.com/offerastudio) (community)
- **Categories:** AI, Other, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.00 / 1,000 audio minutes

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### What does Document to Audiobook do?

**Document to Audiobook** turns **e-books, documents and web articles into audiobooks**. Give it an **EPUB, PDF, DOCX, MOBI, AZW3, ODT, RTF, TXT, PPTX, XLSX, HTML page** or any of **176 file types**, and you get an **MP3 or M4B audiobook with chapters**, the **book title and author** in the tags, and a timed **SRT transcript**.

- **Batch**: up to 100 URLs, or **one ZIP / 7z / RAR / TAR with any number of documents** (up to 200 per run), in the same or different formats. Each document becomes its own audiobook, or all of them become **one audiobook** with a chapter per document.
- **Chapters**: taken from the book's headings (EPUB, DOCX, Markdown, HTML ...), the PDF's bookmarks, or lines like "Chapter 3" in plain text. Slides become one chapter each.
- **322 natural neural voices in 75 languages**, chosen automatically from the text's language, or the one you name. Speed, pitch and volume are adjustable.
- **AI OCR, handwriting included**: scanned PDFs, DjVu, photos of pages, handwritten letters and notes, and comic archives are read by an AI vision model that copes with cursive, stains and faded ink. Classic OCR (30 languages) takes over if the AI is unavailable. Handwriting is read best in Latin script; very dense cursive in other scripts (for example Arabic ruq'a) may not be read reliably.
- **Web pages**: give an article URL and only the main text is read, without menus and ads.
- **$0.01 per minute of audio.** Failed documents are free.

### Who is it for?

- **Readers and students**: listen to e-books, papers, lecture notes and long articles on the go.
- **Publishers and self-published authors**: a quick audio edition or a preview of a manuscript, chapter by chapter.
- **Accessibility teams**: audio versions of reports, policies and handouts for people who prefer to listen.
- **Language learners**: text and timed SRT side by side, at a slower speed if you like.
- **Developers and automations**: "document in, audiobook out" over the Apify API, with files you can link to directly.

### How to use it

1. **Upload a file** (or a ZIP with many), **paste document or web page URLs**, or **paste text**.
2. Leave **Language** on *Auto-detect*, or pick one; choose a **female or male voice**, or name a specific voice.
3. Pick **MP3** (plays everywhere) or **M4B** (audiobook apps show chapters), then **Start**.
4. Open the **Audiobooks** tab of the output: each row has a link to the audio file, the SRT file and the chapter list.

### Supported formats (176 extensions)

| Family | Extensions |
| --- | --- |
| Documents and markup | .bib .creole .dbk .docbook .docx .dokuwiki .epub .fb2 .htm .html .ipynb .jats .latex .man .markdown .md .mdown .mediawiki .mkd .muse .odt .opml .org .pod .rst .rtf .t2t .tex .textile .tikiwiki .twiki .typ .wiki .xht .xhtml |
| E-books | .azw .azw3 .azw4 .chm .fbz .htmlz .kepub .lit .lrf .mobi .oeb .pdb .pml .pmlz .prc .rb .recipe .snb .tcr .txtz |
| Fixed layout | .djv .djvu .oxps .pdf .xps |
| Word processors | .abw .cwk .doc .docm .dot .dotm .dotx .fodt .hwp .lwp .mw .ott .pages .sdw .stw .sxw .uot .wpd .wps .wpt .wri .zabw |
| Presentations (one chapter per slide) | .fodp .key .odp .otp .pot .potx .pps .ppsx .ppt .pptm .pptx .sdd .sxi .uop |
| Spreadsheets (rows read as sentences) | .123 .dif .fods .numbers .ods .ots .slk .sxc .uos .wk1 .wks .xls .xlsb .xlsm .xlsx .xlt .xltx |
| Plain text and data | .adoc .asc .asciidoc .csv .ini .json .jsonl .log .me .ndjson .nfo .text .toml .tsv .txt .xml .yaml .yml |
| Subtitles and lyrics | .ass .lrc .sbv .srt .ssa .sub .vtt .webvtt |
| Email | .eml .mht .mhtml .msg |
| Images (OCR) | .bmp .gif .j2k .jfif .jp2 .jpe .jpeg .jpg .pbm .pgm .png .pnm .ppm .tif .tiff .webp |
| Comics (OCR) | .cb7 .cbr .cbt .cbz |
| Archives (every document inside) | .7z .bz2 .gz .iso .lz .rar .tar .tbz2 .tgz .txz .xz .zip .zst |

The type is recognised from the file name, the server's content type and the file's first bytes, so links without an extension work too. **Google Drive, Google Docs, Dropbox and OneDrive share links** are turned into downloads (the file must be shared with "anyone with the link"). Password-protected and DRM-protected files cannot be read.

### Output

One dataset row per audiobook, plus the files in the run's key-value store (public links in the row).

| Field | Meaning |
| --- | --- |
| `status` | `completed`, `failed` (free) or `info` (a free note, for example files in a ZIP that are not documents) |
| `title`, `author` | From the book's metadata, the PDF info, the web page, or the file name |
| `audioUrl`, `audioFormat` | Link to the MP3 or M4B file |
| `subtitlesUrl` | Link to the SRT transcript (sentence by sentence) |
| `chapters` | `{chapterNumber, chapter, start, startSeconds, durationSeconds}` for each chapter |
| `chapterFiles` | One audio link per chapter, with "Also save one file per chapter" |
| `durationSeconds`, `durationText` | Length of the audiobook |
| `language`, `voice` | The voice that read it (`voicesUsed` lists more than one if the service dropped a voice during the run) |
| `characters`, `words`, `ocrPages` | What was read |
| `truncated`, `message` | True when only the beginning was read ("Max characters per document" or the run's maximum cost) |
| `chargedAudioMinutes`, `chargedOcrPages` | What this row cost |
| `error`, `message` | On failed rows: a short code (`download-failed`, `unsupported-format`, `protected-document`, `no-text`, `speech-failed`, `BUDGET_LIMIT` ...) and a plain explanation |

### How much does it cost?

| Event | Price | When |
| --- | --- | --- |
| Audio minute | **$0.01** | Per started minute of finished audio. A 10-page article is about 5 to 8 minutes ($0.05 to $0.08); a 300-page novel is about 8 to 10 hours ($5 to $6). |
| OCR page | **$0.005** | Per scanned page, photo or handwritten page read with AI OCR. Documents with a text layer never use OCR. |

- **Failed documents, unsupported files and info rows are free.**
- Faster speech means fewer minutes: at **Speed 25%** a book costs about 20% less.
- **"Max cost per run" is respected**: if a document would go over it, only the beginning is read, and the row says so (`truncated`). Documents that no longer fit are skipped for free (`BUDGET_LIMIT`).

### Input example

```json
{
    "documentUrls": [
        "https://www.gutenberg.org/ebooks/1342.epub3.images",
        "https://example.com/blog/long-article",
        "https://drive.google.com/file/d/FILE_ID/view?usp=sharing"
    ],
    "language": "auto",
    "voiceGender": "female",
    "speed": 10,
    "audioFormat": "m4b",
    "subtitles": true,
    "chapterFiles": false
}
```

### Voices

Leave **Voice** empty to pick one from the language and gender, or name one from this list (the `(f)` / `(m)` mark is the voice's gender). With **Language: Auto-detect**, each document gets a voice in its own language.

| Locale | Voices |
| --- | --- |
| af-ZA (Afrikaans) | af-ZA-AdriNeural (f), af-ZA-WillemNeural (m) |
| am-ET (Amharic) | am-ET-AmehaNeural (m), am-ET-MekdesNeural (f) |
| ar-AE (Arabic) | ar-AE-FatimaNeural (f), ar-AE-HamdanNeural (m) |
| ar-BH (Arabic) | ar-BH-AliNeural (m), ar-BH-LailaNeural (f) |
| ar-DZ (Arabic) | ar-DZ-AminaNeural (f), ar-DZ-IsmaelNeural (m) |
| ar-EG (Arabic) | ar-EG-SalmaNeural (f), ar-EG-ShakirNeural (m) |
| ar-IQ (Arabic) | ar-IQ-BasselNeural (m), ar-IQ-RanaNeural (f) |
| ar-JO (Arabic) | ar-JO-SanaNeural (f), ar-JO-TaimNeural (m) |
| ar-KW (Arabic) | ar-KW-FahedNeural (m), ar-KW-NouraNeural (f) |
| ar-LB (Arabic) | ar-LB-LaylaNeural (f), ar-LB-RamiNeural (m) |
| ar-LY (Arabic) | ar-LY-ImanNeural (f), ar-LY-OmarNeural (m) |
| ar-MA (Arabic) | ar-MA-JamalNeural (m), ar-MA-MounaNeural (f) |
| ar-OM (Arabic) | ar-OM-AbdullahNeural (m), ar-OM-AyshaNeural (f) |
| ar-QA (Arabic) | ar-QA-AmalNeural (f), ar-QA-MoazNeural (m) |
| ar-SA (Arabic) | ar-SA-HamedNeural (m), ar-SA-ZariyahNeural (f) |
| ar-SY (Arabic) | ar-SY-AmanyNeural (f), ar-SY-LaithNeural (m) |
| ar-TN (Arabic) | ar-TN-HediNeural (m), ar-TN-ReemNeural (f) |
| ar-YE (Arabic) | ar-YE-MaryamNeural (f), ar-YE-SalehNeural (m) |
| az-AZ (Azerbaijani) | az-AZ-BabekNeural (m), az-AZ-BanuNeural (f) |
| bg-BG (Bulgarian) | bg-BG-BorislavNeural (m), bg-BG-KalinaNeural (f) |
| bn-BD (Bangla) | bn-BD-NabanitaNeural (f), bn-BD-PradeepNeural (m) |
| bn-IN (Bangla) | bn-IN-BashkarNeural (m), bn-IN-TanishaaNeural (f) |
| bs-BA (Bosnian) | bs-BA-VesnaNeural (f), bs-BA-GoranNeural (m) |
| ca-ES (Catalan) | ca-ES-EnricNeural (m), ca-ES-JoanaNeural (f) |
| cs-CZ (Czech) | cs-CZ-AntoninNeural (m), cs-CZ-VlastaNeural (f) |
| cy-GB (Welsh) | cy-GB-AledNeural (m), cy-GB-NiaNeural (f) |
| da-DK (Danish) | da-DK-ChristelNeural (f), da-DK-JeppeNeural (m) |
| de-AT (German) | de-AT-IngridNeural (f), de-AT-JonasNeural (m) |
| de-CH (German) | de-CH-JanNeural (m), de-CH-LeniNeural (f) |
| de-DE (German) | de-DE-SeraphinaMultilingualNeural (f), de-DE-FlorianMultilingualNeural (m), de-DE-AmalaNeural (f), de-DE-ConradNeural (m), de-DE-KatjaNeural (f), de-DE-KillianNeural (m) |
| el-GR (Greek) | el-GR-AthinaNeural (f), el-GR-NestorasNeural (m) |
| en-AU (English) | en-AU-WilliamMultilingualNeural (m), en-AU-NatashaNeural (f) |
| en-CA (English) | en-CA-ClaraNeural (f), en-CA-LiamNeural (m) |
| en-GB (English) | en-GB-LibbyNeural (f), en-GB-MaisieNeural (f), en-GB-RyanNeural (m), en-GB-SoniaNeural (f), en-GB-ThomasNeural (m) |
| en-HK (English) | en-HK-YanNeural (f), en-HK-SamNeural (m) |
| en-IE (English) | en-IE-ConnorNeural (m), en-IE-EmilyNeural (f) |
| en-IN (English) | en-IN-NeerjaExpressiveNeural (f), en-IN-NeerjaNeural (f), en-IN-PrabhatNeural (m) |
| en-KE (English) | en-KE-AsiliaNeural (f), en-KE-ChilembaNeural (m) |
| en-NG (English) | en-NG-AbeoNeural (m), en-NG-EzinneNeural (f) |
| en-NZ (English) | en-NZ-MitchellNeural (m), en-NZ-MollyNeural (f) |
| en-PH (English) | en-PH-JamesNeural (m), en-PH-RosaNeural (f) |
| en-SG (English) | en-SG-LunaNeural (f), en-SG-WayneNeural (m) |
| en-TZ (English) | en-TZ-ElimuNeural (m), en-TZ-ImaniNeural (f) |
| en-US (English) | en-US-AvaNeural (f), en-US-AndrewNeural (m), en-US-EmmaNeural (f), en-US-BrianNeural (m), en-US-AnaNeural (f), en-US-AndrewMultilingualNeural (m), en-US-AriaNeural (f), en-US-AvaMultilingualNeural (f), en-US-BrianMultilingualNeural (m), en-US-ChristopherNeural (m), en-US-EmmaMultilingualNeural (f), en-US-EricNeural (m), en-US-GuyNeural (m), en-US-JennyNeural (f), en-US-MichelleNeural (f), en-US-RogerNeural (m), en-US-SteffanNeural (m) |
| en-ZA (English) | en-ZA-LeahNeural (f), en-ZA-LukeNeural (m) |
| es-AR (Spanish) | es-AR-ElenaNeural (f), es-AR-TomasNeural (m) |
| es-BO (Spanish) | es-BO-MarceloNeural (m), es-BO-SofiaNeural (f) |
| es-CL (Spanish) | es-CL-CatalinaNeural (f), es-CL-LorenzoNeural (m) |
| es-CO (Spanish) | es-CO-GonzaloNeural (m), es-CO-SalomeNeural (f) |
| es-CR (Spanish) | es-CR-JuanNeural (m), es-CR-MariaNeural (f) |
| es-CU (Spanish) | es-CU-BelkysNeural (f), es-CU-ManuelNeural (m) |
| es-DO (Spanish) | es-DO-EmilioNeural (m), es-DO-RamonaNeural (f) |
| es-EC (Spanish) | es-EC-AndreaNeural (f), es-EC-LuisNeural (m) |
| es-ES (Spanish) | es-ES-XimenaNeural (f), es-ES-AlvaroNeural (m), es-ES-ElviraNeural (f) |
| es-GQ (Spanish) | es-GQ-JavierNeural (m), es-GQ-TeresaNeural (f) |
| es-GT (Spanish) | es-GT-AndresNeural (m), es-GT-MartaNeural (f) |
| es-HN (Spanish) | es-HN-CarlosNeural (m), es-HN-KarlaNeural (f) |
| es-MX (Spanish) | es-MX-DaliaNeural (f), es-MX-JorgeNeural (m) |
| es-NI (Spanish) | es-NI-FedericoNeural (m), es-NI-YolandaNeural (f) |
| es-PA (Spanish) | es-PA-MargaritaNeural (f), es-PA-RobertoNeural (m) |
| es-PE (Spanish) | es-PE-AlexNeural (m), es-PE-CamilaNeural (f) |
| es-PR (Spanish) | es-PR-KarinaNeural (f), es-PR-VictorNeural (m) |
| es-PY (Spanish) | es-PY-MarioNeural (m), es-PY-TaniaNeural (f) |
| es-SV (Spanish) | es-SV-LorenaNeural (f), es-SV-RodrigoNeural (m) |
| es-US (Spanish) | es-US-AlonsoNeural (m), es-US-PalomaNeural (f) |
| es-UY (Spanish) | es-UY-MateoNeural (m), es-UY-ValentinaNeural (f) |
| es-VE (Spanish) | es-VE-PaolaNeural (f), es-VE-SebastianNeural (m) |
| et-EE (Estonian) | et-EE-AnuNeural (f), et-EE-KertNeural (m) |
| fa-IR (Persian) | fa-IR-DilaraNeural (f), fa-IR-FaridNeural (m) |
| fi-FI (Finnish) | fi-FI-HarriNeural (m), fi-FI-NooraNeural (f) |
| fil-PH (Filipino) | fil-PH-AngeloNeural (m), fil-PH-BlessicaNeural (f) |
| fr-BE (French) | fr-BE-CharlineNeural (f), fr-BE-GerardNeural (m) |
| fr-CA (French) | fr-CA-ThierryNeural (m), fr-CA-AntoineNeural (m), fr-CA-JeanNeural (m), fr-CA-SylvieNeural (f) |
| fr-CH (French) | fr-CH-ArianeNeural (f), fr-CH-FabriceNeural (m) |
| fr-FR (French) | fr-FR-VivienneMultilingualNeural (f), fr-FR-RemyMultilingualNeural (m), fr-FR-DeniseNeural (f), fr-FR-EloiseNeural (f), fr-FR-HenriNeural (m) |
| ga-IE (Irish) | ga-IE-ColmNeural (m), ga-IE-OrlaNeural (f) |
| gl-ES (Galician) | gl-ES-RoiNeural (m), gl-ES-SabelaNeural (f) |
| gu-IN (Gujarati) | gu-IN-DhwaniNeural (f), gu-IN-NiranjanNeural (m) |
| he-IL (Hebrew) | he-IL-AvriNeural (m), he-IL-HilaNeural (f) |
| hi-IN (Hindi) | hi-IN-MadhurNeural (m), hi-IN-SwaraNeural (f) |
| hr-HR (Croatian) | hr-HR-GabrijelaNeural (f), hr-HR-SreckoNeural (m) |
| hu-HU (Hungarian) | hu-HU-NoemiNeural (f), hu-HU-TamasNeural (m) |
| id-ID (Indonesian) | id-ID-ArdiNeural (m), id-ID-GadisNeural (f) |
| is-IS (Icelandic) | is-IS-GudrunNeural (f), is-IS-GunnarNeural (m) |
| it-IT (Italian) | it-IT-GiuseppeMultilingualNeural (m), it-IT-DiegoNeural (m), it-IT-ElsaNeural (f), it-IT-IsabellaNeural (f) |
| iu-Cans-CA (Inuktitut) | iu-Cans-CA-SiqiniqNeural (f), iu-Cans-CA-TaqqiqNeural (m) |
| iu-Latn-CA (Inuktitut) | iu-Latn-CA-SiqiniqNeural (f), iu-Latn-CA-TaqqiqNeural (m) |
| ja-JP (Japanese) | ja-JP-KeitaNeural (m), ja-JP-NanamiNeural (f) |
| jv-ID (Javanese) | jv-ID-DimasNeural (m), jv-ID-SitiNeural (f) |
| ka-GE (Georgian) | ka-GE-EkaNeural (f), ka-GE-GiorgiNeural (m) |
| kk-KZ (Kazakh) | kk-KZ-AigulNeural (f), kk-KZ-DauletNeural (m) |
| km-KH (Khmer) | km-KH-PisethNeural (m), km-KH-SreymomNeural (f) |
| kn-IN (Kannada) | kn-IN-GaganNeural (m), kn-IN-SapnaNeural (f) |
| ko-KR (Korean) | ko-KR-HyunsuMultilingualNeural (m), ko-KR-InJoonNeural (m), ko-KR-SunHiNeural (f) |
| lo-LA (Lao) | lo-LA-ChanthavongNeural (m), lo-LA-KeomanyNeural (f) |
| lt-LT (Lithuanian) | lt-LT-LeonasNeural (m), lt-LT-OnaNeural (f) |
| lv-LV (Latvian) | lv-LV-EveritaNeural (f), lv-LV-NilsNeural (m) |
| mk-MK (Macedonian) | mk-MK-AleksandarNeural (m), mk-MK-MarijaNeural (f) |
| ml-IN (Malayalam) | ml-IN-MidhunNeural (m), ml-IN-SobhanaNeural (f) |
| mn-MN (Mongolian) | mn-MN-BataaNeural (m), mn-MN-YesuiNeural (f) |
| mr-IN (Marathi) | mr-IN-AarohiNeural (f), mr-IN-ManoharNeural (m) |
| ms-MY (Malay) | ms-MY-OsmanNeural (m), ms-MY-YasminNeural (f) |
| mt-MT (Maltese) | mt-MT-GraceNeural (f), mt-MT-JosephNeural (m) |
| my-MM (Burmese) | my-MM-NilarNeural (f), my-MM-ThihaNeural (m) |
| nb-NO (Norwegian Bokmål) | nb-NO-FinnNeural (m), nb-NO-PernilleNeural (f) |
| ne-NP (Nepali) | ne-NP-HemkalaNeural (f), ne-NP-SagarNeural (m) |
| nl-BE (Dutch) | nl-BE-ArnaudNeural (m), nl-BE-DenaNeural (f) |
| nl-NL (Dutch) | nl-NL-ColetteNeural (f), nl-NL-FennaNeural (f), nl-NL-MaartenNeural (m) |
| pl-PL (Polish) | pl-PL-MarekNeural (m), pl-PL-ZofiaNeural (f) |
| ps-AF (Pashto) | ps-AF-GulNawazNeural (m), ps-AF-LatifaNeural (f) |
| pt-BR (Portuguese) | pt-BR-ThalitaMultilingualNeural (f), pt-BR-AntonioNeural (m), pt-BR-FranciscaNeural (f) |
| pt-PT (Portuguese) | pt-PT-DuarteNeural (m), pt-PT-RaquelNeural (f) |
| ro-RO (Romanian) | ro-RO-AlinaNeural (f), ro-RO-EmilNeural (m) |
| ru-RU (Russian) | ru-RU-DmitryNeural (m), ru-RU-SvetlanaNeural (f) |
| si-LK (Sinhala) | si-LK-SameeraNeural (m), si-LK-ThiliniNeural (f) |
| sk-SK (Slovak) | sk-SK-LukasNeural (m), sk-SK-ViktoriaNeural (f) |
| sl-SI (Slovenian) | sl-SI-PetraNeural (f), sl-SI-RokNeural (m) |
| so-SO (Somali) | so-SO-MuuseNeural (m), so-SO-UbaxNeural (f) |
| sq-AL (Albanian) | sq-AL-AnilaNeural (f), sq-AL-IlirNeural (m) |
| sr-RS (Serbian) | sr-RS-NicholasNeural (m), sr-RS-SophieNeural (f) |
| su-ID (Sundanese) | su-ID-JajangNeural (m), su-ID-TutiNeural (f) |
| sv-SE (Swedish) | sv-SE-MattiasNeural (m), sv-SE-SofieNeural (f) |
| sw-KE (Swahili) | sw-KE-RafikiNeural (m), sw-KE-ZuriNeural (f) |
| sw-TZ (Swahili) | sw-TZ-DaudiNeural (m), sw-TZ-RehemaNeural (f) |
| ta-IN (Tamil) | ta-IN-PallaviNeural (f), ta-IN-ValluvarNeural (m) |
| ta-LK (Tamil) | ta-LK-KumarNeural (m), ta-LK-SaranyaNeural (f) |
| ta-MY (Tamil) | ta-MY-KaniNeural (f), ta-MY-SuryaNeural (m) |
| ta-SG (Tamil) | ta-SG-AnbuNeural (m), ta-SG-VenbaNeural (f) |
| te-IN (Telugu) | te-IN-MohanNeural (m), te-IN-ShrutiNeural (f) |
| th-TH (Thai) | th-TH-NiwatNeural (m), th-TH-PremwadeeNeural (f) |
| tr-TR (Turkish) | tr-TR-EmelNeural (f), tr-TR-AhmetNeural (m) |
| uk-UA (Ukrainian) | uk-UA-OstapNeural (m), uk-UA-PolinaNeural (f) |
| ur-IN (Urdu) | ur-IN-GulNeural (f), ur-IN-SalmanNeural (m) |
| ur-PK (Urdu) | ur-PK-AsadNeural (m), ur-PK-UzmaNeural (f) |
| uz-UZ (Uzbek) | uz-UZ-MadinaNeural (f), uz-UZ-SardorNeural (m) |
| vi-VN (Vietnamese) | vi-VN-HoaiMyNeural (f), vi-VN-NamMinhNeural (m) |
| zh-CN (Chinese) | zh-CN-XiaoxiaoNeural (f), zh-CN-XiaoyiNeural (f), zh-CN-YunjianNeural (m), zh-CN-YunxiNeural (m), zh-CN-YunxiaNeural (m), zh-CN-YunyangNeural (m) |
| zh-CN-liaoning (Chinese) | zh-CN-liaoning-XiaobeiNeural (f) |
| zh-CN-shaanxi (Chinese) | zh-CN-shaanxi-XiaoniNeural (f) |
| zh-HK (Chinese) | zh-HK-HiuGaaiNeural (f), zh-HK-HiuMaanNeural (f), zh-HK-WanLungNeural (m) |
| zh-TW (Chinese) | zh-TW-HsiaoChenNeural (f), zh-TW-YunJheNeural (m), zh-TW-HsiaoYuNeural (f) |
| zu-ZA (Zulu) | zu-ZA-ThandoNeural (f), zu-ZA-ThembaNeural (m) |

### Tips

- **One file per chapter**: turn on "Also save one file per chapter" for players without chapter support, or to share single chapters.
- **Many small files into one book**: put them in a ZIP (they are read in natural name order: 1, 2, 10) and turn on "Merge into one audiobook".
- **Scanned books and handwriting**: AI OCR reads any language without settings. **OCR language** (for example `tur`, `deu+eng`, `chi_sim`) is used only by the classic OCR fallback.
- **Technical documents**: code blocks are skipped by default; turn on "Read code blocks" to hear them. Tables are read row by row; turn off "Read tables" to skip them.

### Limitations

- Files up to 300 MB; up to 200 documents per run; up to 2,000 OCR pages per document.
- Speech is generated by online neural voices (the Microsoft Edge read-aloud voices, through the open-source edge-tts library). The service sometimes stops answering for one voice; the Actor then tries the voice again, then moves to another voice of the same language (`voicesUsed`).
- Chapter detection depends on the document: a PDF without bookmarks and without "Chapter" lines becomes one long chapter.
- DRM-protected e-books (Kindle KFX, Adobe ADEPT) and password-protected files cannot be read.
- Only convert documents you have the right to use. Audio made from someone else's book is for your own listening unless you hold the rights.

### FAQ

**Are there extra fees?** No: you pay only the per-minute price above (and OCR pages, if any). There is no separate API key or subscription.

**Which player shows the chapters?** M4B: Apple Books, BookPlayer, Smart AudioBook Player, VLC and most audiobook apps. MP3 chapters (ID3 CHAP) are shown by VLC, Pocket Casts, Overcast, foobar2000 and many podcast players; others simply play the file from start to end.

**Can I read a web page?** Yes. Put its URL in "Document or web page URLs"; the main article is extracted (like a browser's reader view).

**My audiobook has no chapters.** The document had no headings, bookmarks or "Chapter" lines. Split it into files and use a ZIP with "Merge into one audiobook", or add headings.

**How long does a run take?** About 2 to 4 minutes per hour of audio, plus a little for OCR and large Office files.

### More tools from the same developer

All pay-per-result, no proxy or login needed, built and maintained by the same developer:

**Website audits**

- [Website Accessibility Checker: WCAG 2.2 & EAA](https://apify.com/offerastudio/website-accessibility-audit): accessibility issues with fixes, SEO basics and security headers.
- [Cookie & Tracker Audit: GDPR Consent Checker](https://apify.com/offerastudio/cookie-tracker-audit): cookies and tracking tags that load before consent.
- [AI Crawler Access Checker: robots.txt & llms.txt](https://apify.com/offerastudio/ai-crawler-access-audit): which AI crawlers a site allows, plus llms.txt.
- [Structured Data Validator: Schema & Rich Results](https://apify.com/offerastudio/structured-data-validator): JSON-LD and Microdata checked against Google's rich result rules.
- [Website Change Monitor: Diffs, Prices & Alerts](https://apify.com/offerastudio/website-change-monitor): get a row only when a page changes, with a clean diff.
- [Policy Change Monitor: Privacy & Terms Tracker](https://apify.com/offerastudio/policy-change-monitor): privacy policy and terms changes, classified clause by clause.
- [SaaS Pricing Monitor: Track Competitor Plans](https://apify.com/offerastudio/saas-pricing-monitor): competitor pricing plans as structured data, with price-change diffs.
- [Sitemap Change Monitor: New & Removed URLs](https://apify.com/offerastudio/sitemap-change-monitor): new, removed and changed URLs from a site's sitemaps.
- [Site SEO Crawler: Broken Links & On-Page Audit](https://apify.com/offerastudio/site-seo-crawler-audit): site-wide crawl for broken links, redirects and on-page SEO issues.
- [Website Tech Stack Detector: Bulk Lead Filters](https://apify.com/offerastudio/website-tech-stack-detector): technologies used by websites, with filters for lead lists.
- [Domain Availability & Expiry Checker (RDAP)](https://apify.com/offerastudio/domain-whois-availability): domain availability, registrar and expiry dates from RDAP.
- [Status Page SLA Monitor: Uptime & Incidents](https://apify.com/offerastudio/status-page-sla-monitor): SaaS vendor uptime, incidents and a monthly SLA table from public status pages.

**Company data and compliance**

- [Company Contact Finder: Emails, Phones & Socials](https://apify.com/offerastudio/company-contact-finder): contact details published on company websites.
- [UK New Companies Feed: Companies House Daily](https://apify.com/offerastudio/uk-new-companies-feed): newly incorporated UK companies with sector filters.
- [EU VAT Number Validator: Bulk VIES Checker](https://apify.com/offerastudio/eu-vat-number-validator): bulk VAT checks with name, address and consultation number.
- [LEI Corporate Tree: GLEIF Parents & Subsidiaries](https://apify.com/offerastudio/gleif-lei-corporate-tree): LEI lookup with parents, subsidiaries and a KYC summary.
- [UK Company Distress Watch: Insolvency Alerts](https://apify.com/offerastudio/uk-company-distress-watch): administrations, liquidations and winding-up petitions from The Gazette.
- [IBAN Validator: Bulk Check & Bank Lookup](https://apify.com/offerastudio/iban-bank-validator): IBAN format and checksum, plus bank name and BIC where open data exists.
- [Sanctions Screening: OFAC, EU, UN & UK Lists](https://apify.com/offerastudio/sanctions-screening): names screened against official sanctions lists, with match scores.
- [OSHA & EPA Violation Monitor: Fines by Company](https://apify.com/offerastudio/osha-epa-violation-monitor): US OSHA and EPA enforcement cases and penalties by company.
- [Email List Precheck: Syntax, MX & Disposable Check](https://apify.com/offerastudio/email-list-precheck): cheap email list hygiene before a real verification.
- [UK Company Officer Changes: Director & PSC Alerts](https://apify.com/offerastudio/uk-company-officer-changes): director, owner, address and status changes for a watchlist of UK companies.
- [FDA Warning Letters Monitor: By Company & Subject](https://apify.com/offerastudio/fda-warning-letters-monitor): FDA warning letters by company and subject, with cited regulations.
- [Supplier Risk Report: Sanctions, VAT & Insolvency](https://apify.com/offerastudio/supplier-risk-report): one risk row per supplier from eight official registers, with changes since last run.
- [Brand Impersonation Domain Monitor: Look-alikes](https://apify.com/offerastudio/brand-impersonation-domain-monitor): look-alike domains and certificates that imitate your brand, with a risk score.

**Media and AI**

- [Audio & Video Transcriber: Podcasts, SRT, Speakers](https://apify.com/offerastudio/audio-video-transcriber): audio, video, podcasts and social links to text, SRT and VTT.
- [Podcast Mention Alerts: Brand Mentions by Second](https://apify.com/offerastudio/podcast-mention-alerts): where your brand is said in new podcast episodes, with the exact second.
- [News Brand Mentions Monitor: New Articles Only](https://apify.com/offerastudio/news-brand-mentions-monitor): new news articles about your brand, people or topics.
- [YouTube Channel Monitor: New Videos & Growth](https://apify.com/offerastudio/youtube-channel-monitor): new videos and view growth of the channels you watch.

**Market signals**

- [US WARN Layoff Notices: 12 States Daily Feed](https://apify.com/offerastudio/us-warn-layoff-notices): layoff and plant closure notices from official state sources.
- [US Product Recalls Monitor: FDA & CPSC Feed](https://apify.com/offerastudio/us-product-recalls-monitor): FDA and CPSC recalls in one feed, with severity.
- [EU Tenders Feed: TED Public Procurement Alerts](https://apify.com/offerastudio/eu-tender-feed): EU public tenders from TED with CPV, country and value filters.
- [Liquor License Openings: New Bars & Stores (US)](https://apify.com/offerastudio/liquor-license-openings): new US liquor licences from official state open data.
- [Clinical Trials Change Monitor: Status & Updates](https://apify.com/offerastudio/clinicaltrials-change-monitor): status, enrollment and results changes on ClinicalTrials.gov studies.
- [Career Site Jobs Monitor: ATS Jobs & New Roles](https://apify.com/offerastudio/career-site-jobs-monitor): open roles from company career sites, with new and closed roles since the last run.
- [App Reviews Monitor: App Store & Google Play](https://apify.com/offerastudio/app-store-reviews-monitor): app reviews from both stores, only new ones in monitor mode.
- [US Federal Contracts Feed: SAM.gov & USAspending](https://apify.com/offerastudio/us-federal-contracts-feed): SAM.gov contract opportunities with the buyer's award history.
- [Grants.gov Opportunities: US Federal Grants Feed](https://apify.com/offerastudio/grants-gov-opportunities): US federal grant opportunities by keyword, eligibility and agency.
- [Federal Register Monitor: US Rules & Notices Feed](https://apify.com/offerastudio/federal-register-monitor): new US rules, proposed rules and notices by agency or topic.
- [B2B Sales Trigger Feed: Hiring + Tech Leads](https://apify.com/offerastudio/b2b-sales-trigger-feed): companies hiring for a role and using (or not using) a technology, with contacts.
- [Local Business Leads: OpenStreetMap, No Website](https://apify.com/offerastudio/local-business-leads-osm): local businesses by city and category, including those with no website.
- [Solana Token Pair Monitor: New & Trending Pairs](https://apify.com/offerastudio/solana-token-pair-monitor): new and trending Solana pairs with liquidity, volume and safety flags.

# Changelog

This Actor's version history is a separate document: https://apify.com/offerastudio/document-to-audiobook/changelog.md

# Actor input Schema

## `documentFile` (type: `string`):

Upload one document, or a ZIP / 7z / RAR / TAR archive with many documents (each becomes its own audiobook, or one audiobook with "Merge into one audiobook"). EPUB, PDF, DOCX, DOC, MOBI, AZW3, ODT, RTF, TXT, Markdown, HTML, PPTX, XLSX, FB2, LIT, CHM, DjVu, XPS, images (OCR) and 150+ more.

## `documentUrls` (type: `array`):

Direct links to documents in any supported format, Google Drive / Docs, Dropbox or OneDrive share links (shared with anyone who has the link), or web pages (only the main article is read). Up to 100; put more files in one ZIP.

## `text` (type: `string`):

Or paste text directly. Lines like "Chapter 1" start new chapters.

## `language` (type: `string`):

Language of the voice. Auto detects it from each document's text.

## `voiceGender` (type: `string`):

Used when no voice is named below.

## `voice` (type: `string`):

A specific voice, such as en-US-AndrewNeural, en-GB-SoniaNeural, de-DE-KatjaNeural or tr-TR-AhmetNeural. Overrides language and gender. The README lists all 322 voices.

## `speed` (type: `integer`):

-50 is half speed, 0 normal, 100 twice as fast. Faster speech means fewer audio minutes, so it also costs less.

## `pitch` (type: `integer`):

Lower or raise the voice.

## `volume` (type: `integer`):

Quieter or louder.

## `audioFormat` (type: `string`):

Both formats include chapter marks, title and author.

## `mergeIntoOne` (type: `boolean`):

With several documents, make one audiobook in which each document is a chapter, instead of one audiobook per document.

## `chapterFiles` (type: `boolean`):

Besides the full audiobook, save every chapter as its own file (for players without chapter support). Same price.

## `subtitles` (type: `boolean`):

Save a timed SRT transcript of the audio, sentence by sentence.

## `speakChapterTitles` (type: `boolean`):

Say each chapter heading before its text.

## `readTables` (type: `boolean`):

Read table rows as sentences. Off: skip tables.

## `readCode` (type: `boolean`):

Read program code in technical documents. Off: skip it.

## `ocr` (type: `boolean`):

Read scanned PDFs, DjVu files, photos of pages, handwriting and comic archives with AI OCR. Charged per page. Off: such files fail without charge.

## `ocrLanguage` (type: `string`):

Only for the classic OCR fallback (AI OCR detects the language itself). Tesseract codes joined with +, for example eng, tur, deu+eng, chi_sim. Empty: the Language above (English when Auto).

## `maxCharactersPerDocument` (type: `integer`):

Safety limit: longer documents are cut (2,000,000 characters is about a 40-hour audiobook). "Max cost per run" is also respected: when it would be passed, only the beginning is read.

## Actor input object example

```json
{
  "text": "Chapter 1\n\nThe morning fog lifted slowly from the harbour, and one by one the fishing boats came into view. Mara stood at the end of the pier with a cup of tea, counting them the way her grandfather had taught her.\n\nChapter 2\n\nBy noon the letter had arrived. It was short, written in a careful hand, and it changed everything she thought she knew about the old lighthouse.",
  "language": "auto",
  "voiceGender": "female",
  "speed": 0,
  "pitch": 0,
  "volume": 0,
  "audioFormat": "mp3",
  "mergeIntoOne": false,
  "chapterFiles": false,
  "subtitles": true,
  "speakChapterTitles": true,
  "readTables": true,
  "readCode": false,
  "ocr": true,
  "maxCharactersPerDocument": 2000000
}
```

# Actor output Schema

## `audiobooks` (type: `string`):

No description

## `chapters` (type: `string`):

No description

## `files` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "text": `Chapter 1

The morning fog lifted slowly from the harbour, and one by one the fishing boats came into view. Mara stood at the end of the pier with a cup of tea, counting them the way her grandfather had taught her.

Chapter 2

By noon the letter had arrived. It was short, written in a careful hand, and it changed everything she thought she knew about the old lighthouse.`
};

// Run the Actor and wait for it to finish
const run = await client.actor("offerastudio/document-to-audiobook").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "text": """Chapter 1

The morning fog lifted slowly from the harbour, and one by one the fishing boats came into view. Mara stood at the end of the pier with a cup of tea, counting them the way her grandfather had taught her.

Chapter 2

By noon the letter had arrived. It was short, written in a careful hand, and it changed everything she thought she knew about the old lighthouse.""" }

# Run the Actor and wait for it to finish
run = client.actor("offerastudio/document-to-audiobook").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "text": "Chapter 1\\n\\nThe morning fog lifted slowly from the harbour, and one by one the fishing boats came into view. Mara stood at the end of the pier with a cup of tea, counting them the way her grandfather had taught her.\\n\\nChapter 2\\n\\nBy noon the letter had arrived. It was short, written in a careful hand, and it changed everything she thought she knew about the old lighthouse."
}' |
apify call offerastudio/document-to-audiobook --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,offerastudio/document-to-audiobook"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/ppAPwU8cSJgBoaGdm/builds/a4r4bNeqjPyujPidt/openapi.json
