Contact Us
Sign In

Slash Text-to-Speech Costs by up to 90%

Up to 10x cheaper than Eleven Labs and Play.ht.
Up to 2x cheaper than Amazon, Microsoft, and Google.

Get a Free API Key

Live Demo

Try our text-to-speech API. Click a button to generate random text:

Non-Fiction
Fiction
News
Blog
Conversation
0/250
Filesize
0 kb

The more you use it, the cheaper it gets

Start for free. Stay for volume discounts.

Number of Characters
one time
1M
Audio Duration
Estimated
~22 hours
Free
$0
Contact Us
Additional Usage
Comparison
vs
$49
a month
$510
a month
Score
Fiction
4.32
Non-Fiction
4.32
Conversation
4.32
Score
Fiction
4.32
Non-Fiction
4.32
Conversation
4.32
Get Started for Free
“Unreal Speech saved us 75% on our text-to-speech cost. It sounds better than Amazon Polly, and is much cheaper. We switched over at high volumes, and often processing 10,000+ pages per hour. Unreal was able to handle the volume, while delivering a high quality listening experience.”
7B
Characters per month
0.3s
Latency
99.9%
Uptime

Code Samples

Get started quickly with our simple text-to-speech API.

Short
Medium
Long
SDK
# Short endpoint: /stream
# - Up to 1,000 characters
# - Synchronous, instant response (0.3s+)
# - Streams back raw audio data

import requests

response = requests.post(
  'https://api.v6.unrealspeech.com/stream',
  headers = {
    'Authorization' : 'Bearer YOUR_API_KEY'
  },
  json = {
    'Text': '''<YOUR_TEXT>''', # Up to 1,000 characters
    'VoiceId': '<VOICE_ID>', # Scarlett, Dan, Liv, Will, Amy
    'Bitrate': '192k', # 320k, 256k, 192k, ...
    'Speed': '0', # -1.0 to 1.0
    'Pitch': '1', # 0.5 to 1.5
    'Codec': 'libmp3lame', # libmp3lame or pcm_mulaw
  }
)

with open('audio.mp3', 'wb') as f:
    f.write(response.content)
// Short endpoint: /stream
// - Up to 1,000 characters
// - Synchronous, instant response (0.3s+)
// - Streams back raw audio data

const axios = require('axios');
const fs = require('fs');

const headers = {
    'Authorization': 'Bearer YOUR_API_KEY',
};

const data = {
    'Text': '<YOUR_TEXT>', // Up to 1,000 characters
    'VoiceId': '<VOICE_ID>', // Scarlett, Dan, Liv, Will, Amy
    'Bitrate': '192k', // 320k, 256k, 192k, ...
    'Speed': '0', // -1.0 to 1.0
    'Pitch': '1', // 0.5 to 1.5
    'Codec': 'libmp3lame', // libmp3lame or pcm_mulaw
};

axios({
    method: 'post',
    url: 'https://api.v6.unrealspeech.com/stream',
    headers: headers,
    data: data,
    responseType: 'stream'
}).then(function (response) {
    response.data.pipe(fs.createWriteStream('audio.mp3'))
});
// Medium endpoint: /speech
// - Up to 3,000 characters
// - Synchronous, takes ~1s per 700 chars
// - Returns MP3 and JSON timestamp URLs

const axios = require('axios');

const headers = {
    'Authorization': 'Bearer YOUR_API_KEY',
};

const data = {
    'Text': '<YOUR_TEXT>', // Up to 3,000 characters
    'VoiceId': '<VOICE_ID>', // Scarlett, Dan, Liv, Will, Amy
    'Bitrate': '192k', // 320k, 256k, 192k, ...
    'Speed': '0', // -1.0 to 1.0
    'Pitch': '1', // 0.5 to 1.5
    'TimestampType': 'sentence', // word or sentence
};

axios({
    method: 'post',
    url: 'https://api.v6.unrealspeech.com/speech',
    headers: headers,
    data: data,
}).then(function (response) {
    console.log(JSON.stringify(response.data));
});
// Short endpoint: /stream
// - Up to 1,000 characters
// - Synchronous, instant response (0.3s+)
// - Streams back raw audio data

import React from "react";
import { View, Button, ActivityIndicator } from "react-native";
import { useUnrealSpeech, blobToDataURI } from "react-native-unrealspeech";
import { Audio } from "expo-av";

export default function App() {
  const { stream, requestState } = useUnrealSpeech("YOUR_API_KEY");

  const play = async (response: any) => {
    try {
      if (!response.ok) {
        throw new Error("Network response was not ok");
      }
      const blobData = await response.blob();
      const blob = new Blob([blobData], { type: "audio/mp3" });
      const uri = await blobToDataURI(blob);

      const { sound } = await Audio.Sound.createAsync({ uri }, {});
      console.log(uri);
      await sound.playAsync();
    } catch (error) {
      console.error("Error occurred while playing sound:", error);
    }
  };

  const handleSpeak = async () => {
    try {
      const response = await stream(
          "<YOUR_TEXT>", // Up to 1,000 characters
          "<VOICE_ID>", // Scarlett, Dan, Liv, Will, Amy
          "192k", // 320k, 256k, 192k, ...
          0, // Speed: -1.0 to 1.0
          1, // Pitch: 0.5 to 1.5
          "libmp3lame" // Codec: libmp3lame or pcm_mulaw
      );
      play(response);
    } catch (error) {
      console.error("Error occurred while handling speak:", error);
    }
  };

  return (
    <View style={{ flex: 1, justifyContent: "center" }}>
      {requestState === "loading" ? (
        <ActivityIndicator />
      ) : ( 
        <Button title="Speak" onPress={handleSpeak} />
      )}
    </View>
  );
}
// Medium endpoint: /speech
// - Up to 3,000 characters
// - Synchronous, takes ~1s per 700 chars
// - Returns MP3 and JSON timestamp URLs

import React from "react";
import { StatusBar } from "expo-status-bar";
import { StyleSheet, Button, View, ActivityIndicator } from "react-native";
import { useUnrealSpeech } from "react-native-unrealspeech";

export default function App() {
  const { speech, requestState } = useUnrealSpeech("YOUR_API_KEY");

  const handleSpeak = async () => {
    const mySpeech = await speech(
      "<YOUR_TEXT>", // Up to 3,000 characters
      "<VOICE_ID>", // Scarlett, Dan, Liv, Will, Amy
      "192k", // 320k, 256k, 192k, ...
      "sentence" // word or sentence
    );

    console.log(mySpeech);
  };

  return (
    <View style={styles.container}>
      <StatusBar style="auto" />
      {requestState === "loading" ? (
        <ActivityIndicator />
      ) : (
        <Button title="Speak" onPress={handleSpeak} />
      )}
    </View>
  );
}

const styles = StyleSheet.create(
  {
    container: {
      flex: 1,
      backgroundColor: "#fff",
      alignItems: "center",
      justifyContent: "center"
    }
  }
);
# Short endpoint: /stream
# - Up to 1,000 characters
# - Synchronous, instant response (0.3s+)
# - Streams back raw audio data

curl -X POST "https://api.v6.unrealspeech.com/stream" -H "Content-Type: application/json" -H "Authorization: Bearer YOUR_API_KEY" --data '{"Text": "<YOUR_TEXT>", "VoiceId": "<VOICE_ID>", "Bitrate": "128k", "Speed": "0", "Pitch": "1", "Codec": "libmp3lame"}' --output audio.mp3

Ready to dive in?

Get a Free API Key

Per-word Timestamps

Highlight words in sync with the speech.

How To Get Timestamps
Use /speech or /synthesisTasks with TimestampType set to word or sentence (see docs).
The response will have a TimestampsUri containing JSON like this:
[
  {
    "word": "It", // word or sentence 
    "start": 0.542, // seconds
    "end": 0.622,
    "score": 0.682, // confidence
    "text_offset": 0 // position within text
  }, 
  ...
]

Super Fast Text-to-Speech API

Build real-time apps. Generate long-form audio fast.

Play audio in
0.3s
Create 10-hour audio in
15 min
Get Started for Free

Unreal Speech Studio

Make studio-quality voice overs for podcasts, videos & more.

Open Studio

FAQ

Do you offer voices in other languages?
We currently only have English speaking voices. But we're working on multilingual voice support, expected to be available in 3-6 months.
Can I create custom voices (voice cloning)?
Not right now, but we're working on it!
What happens if I use all of my monthly characters?
Additional usage over the monthly allowance will be charged daily at the rate of your current plan:
  • Basic – $16 per 1M characters
  • Plus – $12 per 1M characters
  • Pro – $10 per 1M characters
  • Enterprise – $8 per 1M characters
What happens to unused characters at the end of the month?
  • Free plan – Characters are reset on the 1st of every month.
  • Paid plan – Unused characters roll over to the next billing cycle.
Can I use generated audio commercially?
Yes, audio generated with Unreal Speech can be used commercially. The following terms apply, based on your subscription plan:
  • Free plan – You must attribute Unreal Speech when publishing audio by including a link to "unrealspeech.com" in the description.
  • Paid plan – You do not need to include any attribution.
How do I update my payment method?
Go to your Dashboard and choose "Manage Subscription".
How do I cancel my subscription?
You can cancel your subscription at any time. Go to your Dashboard and choose "Manage Subscription".
Do you have an affiliate program?
Yes! You can earn 15% recurring on all paid referrals. Click here to sign up.
Sign In