# Text To Speech (NO API) (`dead00/text-to-speech-no-api`) Actor

Convert text to natural speech in 43 curated voices across 8 languages. Clone any voice from a 15-second sample. Long text splits automatically. No API key, no subscription — pay only for what you convert.

- **URL**: https://apify.com/dead00/text-to-speech-no-api.md
- **Developed by:** [Dead](https://apify.com/dead00) (community)
- **Categories:** AI, Developer tools, Other
- **Stats:** 2 total users, 1 monthly users, 60.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.04 / 1,000 text converted (per character)s

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Text to Speech

Turn text into natural-sounding audio. Paste your text, pick a voice, run it — you get MP3 files back.

No API key to set up, no subscription, no monthly credits to manage. You pay only for what you convert.

**[🔊 Listen to samples of all 43 voices](https://api.apify.com/v2/key-value-stores/KuJ6yID5mFe9C3BYV/records/voice-samples.html?signature=JjJnchXRA4cVNJqP3xhO)**

***

### What it does

- Converts text to speech in **43 curated voices** across 8 languages
- **Clones a voice** from a short audio sample you provide
- Handles **long text automatically** — paste a whole article, no length juggling
- Returns MP3, WAV or Opus files with direct download links

***

### Quick start

1. Paste your text into **Text to convert** — one line per audio file
2. Pick a **Voice** from the dropdown
3. Click **Start**

That's it. Your audio files appear in the run's output, each with a link.

***

### Voices

43 voices, hand-picked and checked. No celebrity impressions, no cartoon characters — just clean, general-purpose voices you can use without worrying about whose likeness you're borrowing.

| Language | Voices |
|---|---|
| English | 20 (6 female, 13 male, 1 neutral) |
| Spanish | 6 (2 female, 4 male) |
| Russian | 4 (3 female, 1 male) |
| Arabic | 3 (3 female) |
| French | 3 (3 female) |
| Japanese | 3 (3 female) |
| Portuguese | 3 (1 female, 2 male) |
| Chinese | 1 (1 male) |

Each is labelled by language, gender and style — for example *"English, female — Laura, confident narrator"* — so you can pick without guessing.

**Hear them first:** the samples page linked above has a play button for every voice saying the same sentence. Worth two minutes before your first real run.

***

### Expression tags

Drop these anywhere in your text to shape the delivery:

```
[excited] I can't believe it! [pause] [whisper] Come closer.
```

Available: `[whisper]` `[excited]` `[pause]` `[emphasis]` `[laughing]` `[sigh]` `[angry]` `[sad]` `[shouting]`

***

### Voice cloning

Want it to sound like a specific person? Two fields under **Voice cloning**:

**Clone a voice from an audio sample** — a direct link to a 10–30 second recording. It has to be a link that downloads the file, not a page with a player on it.

- ✅ Works: raw GitHub links, S3 URLs, Dropbox links ending in `?dl=1`
- ❌ Doesn't work: Google Drive share pages, SoundCloud pages, YouTube links

**What is said in that sample** — type out the exact words spoken in the recording. Optional, but it noticeably improves how closely the clone matches, because the words can be lined up against the audio.

When you fill these in, the sample overrides whichever voice you picked from the dropdown.

> Only clone voices you have permission to use.

***

### How long text is handled

**You don't have to think about this.** Paste an entire article and it just works.

Behind the scenes there's a 10,000-byte limit per audio file. If a line goes over, it's split at a **sentence boundary** — never mid-word — and you get two files instead of one. Nothing is lost or cut off.

For reference, 10,000 bytes is roughly **1,500 English words**. Longer than that and you'll simply get more than one file back.

***

### Pricing

Two charges:

| | Price |
|---|---|
| Each audio file created | **$0.015** |
| Each byte of text | **$0.00004** |

That works out to **$0.04 per 1,000 characters** of English. Billing is per byte with no rounding, so a short line is never charged like a long one. Failed lines aren't charged at all.

#### What "bytes" means

**For English, bytes and characters are the same thing.** If your word processor says 4,000 characters, that's 4,000 bytes. Nothing to convert.

It only differs for other scripts, because those characters take more space:

| Script | Bytes per character |
|---|---|
| English, Spanish, Portuguese, French | 1 |
| Russian, Arabic | 2 |
| Chinese, Japanese, Korean | 3 |

So 1,000 bytes is about 1,000 English characters, or about 330 Chinese characters.

#### Real examples

| What you're converting | Cost |
|---|---|
| A tweet (150 characters) | $0.02 |
| A product description (400 characters) | $0.03 |
| A short blog post (1,000 characters) | $0.055 |
| A video script (4,500 characters) | $0.20 |
| A long article (13,000 characters, 2 files) | $0.56 |

#### A tip worth knowing

You're charged $0.015 for each audio file, so ten short sentences as ten separate lines cost $0.15 in file fees, while the same text on one line costs $0.015.

Combining short pieces into one line also produces better audio, since a single continuous generation keeps the voice more consistent than ten separate ones.

***

### How it compares

Prices for the same text through this Actor and through ElevenLabs' published API rates:

| What you're converting | This Actor | ElevenLabs Flash | ElevenLabs Multilingual v2 |
|---|---|---|---|
| Tweet (150 characters) | $0.02 | $0.01 | $0.02 |
| Short description (400 characters) | $0.03 | $0.02 | $0.04 |
| Blog post (1,000 characters) | $0.055 | $0.05 | $0.10 |
| Video script (4,500 characters) | **$0.20** | $0.23 | $0.45 |
| Long article (13,000 characters) | **$0.56** | $0.66 | $1.33 |

**Per hour of generated audio:**

| | Cost per hour |
|---|---|
| **This Actor** | **$2.55** |
| ElevenLabs Flash | $3.00 |
| ElevenLabs Multilingual v2 | $6.00 |

#### The short version

- **15% cheaper** than ElevenLabs Flash
- **57% cheaper** than ElevenLabs Multilingual v2

Those margins hold for anything paragraph-length or longer.

**Where it doesn't win:** very short text. Each audio file carries a $0.015 fee, which is nothing against a 13,000-character article but triples the price of a tweet. The break-even point against ElevenLabs Flash is around 1,500 characters — below that, a per-character service works out cheaper.

So if you're converting articles, scripts, chapters or product copy, this is the cheaper option. If you're generating thousands of one-line notifications, it isn't.

#### Beyond price

- **No subscription** — pay per job, not per month
- **No credits** to buy in advance or watch expire
- **No API key** to create or manage
- **Runs in your Apify workflows** and schedules alongside everything else
- **Voice cloning included**, not gated behind a higher tier

ElevenLabs figures are their published API rates as of early 2026 — check their current pricing before relying on these. Note also that their API rates sit on top of a monthly subscription, so the real cost to an existing subscriber differs from the table above.

***

### Output

Each line produces one row:

```json
{
  "index": 0,
  "text": "The morning began quietly as the first rays of sunlight...",
  "audioUrl": "https://api.apify.com/v2/key-value-stores/.../audio-0000.mp3",
  "format": "mp3",
  "bytes": 616906,
  "status": "ok",
  "error": null
}
```

- **audioUrl** — direct link to the MP3
- **bytes** — size of the audio file
- **status** — `ok` or `failed`
- **error** — what went wrong, if anything

Files are also in the run's **Storage** tab, named `audio-0000.mp3`, `audio-0001.mp3` and so on.

***

### Limits

| | |
|---|---|
| Lines per run | 200 |
| Bytes per audio file | 10,000 (longer text is split automatically) |
| Timeout per file | 300 seconds, adjustable up to 1,800 |

***

### Tips

**Paste whole paragraphs, not single sentences.** Cheaper, and the voice stays consistent across the whole piece.

**Try a short line first.** One sentence in your chosen voice costs about $0.02 and tells you whether it's the right one before you run a hundred pages.

**Use `[pause]` if it feels rushed.** Placing it between sentences gives the delivery room to breathe.

**Check the seams on split files.** Very long text becomes multiple files, and the voice can shift slightly between them.

***

### Common problems

**"The voice sample could not be downloaded"**
Your link opens a page rather than downloading a file. Use a raw or direct-download URL.

**"The service quota has been used up"**
Temporary capacity limit. Wait a few minutes and try again.

**"This text could not be processed"**
Usually unusual characters or formatting. Try simplifying the text.

**A file stops earlier than expected**
Check the log — long lines get split into multiple files, so the rest is in the next one.

# Actor input Schema

## `texts` (type: `array`):

One audio file is created per line. Long text is split automatically at sentence breaks, so you can paste a whole article without worrying about length. You can shape the delivery with inline tags placed anywhere in the sentence, for example: \[whisper] come closer \[excited] I found it! Useful tags include \[pause], \[emphasis], \[laughing], \[sigh], \[angry], \[sad], \[shouting], \[whisper] and \[excited].

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

Choose the voice used for every line above.

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

File format for the generated audio.

## `referenceAudioUrl` (type: `string`):

Paste a direct link to a 10-30 second recording and the output will imitate that speaker instead of the voice chosen above. The link must download the file directly (for example a raw GitHub or S3 link, or a Dropbox link ending in ?dl=1) - a page that opens a player will not work. Only use recordings you have permission to clone.

## `referenceText` (type: `string`):

Type out the exact words spoken in the sample above, word for word. This is optional, but it noticeably improves how closely the clone matches, because the words can be lined up against the audio.

## `requestTimeoutSecs` (type: `integer`):

How long to wait for each audio file before giving up on it. Raise this if you are converting very long pieces of text in a single line.

## Actor input object example

```json
{
  "texts": [
    "[excited] Hello! [chuckle] This audio was generated from plain text."
  ],
  "voice": "802e3bc2b27e49c2995d23ef70e6ac89",
  "audioFormat": "mp3",
  "requestTimeoutSecs": 300
}
```

# Actor output Schema

## `results` (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 = {
    "texts": [
        "[excited] Hello! [chuckle] This audio was generated from plain text."
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("dead00/text-to-speech-no-api").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 = { "texts": ["[excited] Hello! [chuckle] This audio was generated from plain text."] }

# Run the Actor and wait for it to finish
run = client.actor("dead00/text-to-speech-no-api").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "texts": [
    "[excited] Hello! [chuckle] This audio was generated from plain text."
  ]
}' |
apify call dead00/text-to-speech-no-api --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=dead00/text-to-speech-no-api",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

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