VoiceHue
Text to speechVoice libraryDeveloper APIPricingFeedbackGet API key
  • English
  • 简体中文Chinese (Simplified)
  • 繁體中文Chinese (Traditional)
  • EspañolSpanish
  • PortuguêsPortuguese
  • 日本語Japanese · coming soon
  • FrançaisFrench · coming soon
Get API key
VoiceHue

Free online text to speech. Paste text, pick a voice and listen in seconds. Developers get an API with a free plan.

Start free

Product

  • Online text to speech
  • Text to speech overview
  • Choosing a text to speech tool
  • Text to audio converter
  • Article to audio
  • PDF to speech
  • AI voice generator
  • Read text aloud
  • AI voice library
  • Pricing
  • Free text to speech, no sign-up

By language

  • Chinese text to speech
  • English text to speech
  • Japanese text to speech
  • Spanish text to speech
  • Korean text to speech
  • French text to speech
  • Portuguese text to speech

Use cases

  • TikTok & short video voiceover
  • YouTube narration
  • Audiobook voiceover
  • Audiobook generator
  • Podcast voice
  • E-learning narration
  • Text to speech for dyslexia
  • Language learning
  • Presentation voiceover
  • Course & training voiceover
  • Podcast intros

Developers

  • Developer API
  • OpenAI-compatible API
  • Text to speech API

Support & legal

  • FAQ
  • Contact us
  • Privacy policy
  • Terms of service
  • Licensing & copyright
© 2026 VoiceHue. All rights reserved.
  • English
  • 简体中文Chinese (Simplified)
  • 繁體中文Chinese (Traditional)
  • EspañolSpanish
  • PortuguêsPortuguese
  • 日本語Japanese · coming soon
  • FrançaisFrench · coming soon

VOICEHUE DEVELOPER API

Text to speech API for your appFree plan

One POST request turns text into audio: MP3 by default, or WAV on request. The endpoint follows the OpenAI speech format, so existing code usually needs only a new base URL and key. Every signed-in account can create 2 free keys with 10,000 characters a month each.

Get API key Quickstart
QuickstartUse with AI toolsAuthenticationRequestVoicesLimitsErrorsOpenAI clientsFAQ

Quickstart

1

Create a key

Sign in with a confirmed email address and open API keys in your dashboard. The full key is shown once: copy it and keep it on your server, never in browser code or a public repository.

Get API key
2

Make your first request

Store the key in VOICEHUE_API_KEY and run one of these. The audio is saved as hello.mp3.

curl https://voicehue.com/v1/audio/speech \
  -H "Authorization: Bearer $VOICEHUE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"voicehue-tts","input":"Hello from VoiceHue.","voice":"vh-es-alex"}' \
  --output hello.mp3
3

Check your usage

Your dashboard shows each key's characters used today and this month against its limits. A key stops working the moment you revoke it.

Open dashboard

Use with AI tools

MCP server, OpenAPI and ready-to-paste configs

VoiceHue runs a remote MCP server at https://voicehue.com/mcp (Streamable HTTP). Add it to an AI assistant and the assistant can call text_to_speech to speak text and list_voices to pick a voice. It uses the same API keys and the same free plan as the HTTP API, and the audio comes back as MP3 (or WAV) in the tool result. The API is also described as OpenAPI 3.1 at /openapi.json, which automation tools can import. Replace vh_live_YOUR_KEY with a key from your dashboard.

Let your AI set it up

Copy this prompt and paste it into your AI assistant. It explains VoiceHue and walks you through the setup for that tool. It contains no key.

ChatGPT

In ChatGPT on the web, turn on developer mode under Settings, Security and login, then create an app with the server address https://voicehue.com/mcp and OAuth authentication. Sign in to VoiceHue when asked and allow the connection. This creates an API key named after the app; revoke it in your dashboard to end the access. Developer mode depends on your ChatGPT plan.

Claude Code

Add the remote server with one command; the key stays in an environment variable.

shell
claude mcp add --transport http voicehue https://voicehue.com/mcp \
  --header "Authorization: Bearer $VOICEHUE_API_KEY"

Claude Desktop

Add this to claude_desktop_config.json and restart. Claude Desktop reaches a remote server that needs a header through the mcp-remote bridge (needs Node.js).

claude_desktop_config.json
{
  "mcpServers": {
    "voicehue": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "https://voicehue.com/mcp", "--header", "Authorization:${VOICEHUE_AUTH}"],
      "env": {"VOICEHUE_AUTH": "Bearer vh_live_YOUR_KEY"}
    }
  }
}

Cursor

Add this to ~/.cursor/mcp.json (or .cursor/mcp.json in a project). Set VOICEHUE_API_KEY in your environment.

mcp.json
{
  "mcpServers": {
    "voicehue": {
      "url": "https://voicehue.com/mcp",
      "headers": {"Authorization": "Bearer ${env:VOICEHUE_API_KEY}"}
    }
  }
}

Codex CLI

Run this once. Codex reads the key from VOICEHUE_API_KEY.

Terminal
codex mcp add voicehue --url https://voicehue.com/mcp --bearer-token-env-var VOICEHUE_API_KEY

VS Code

Add this to .vscode/mcp.json. VS Code asks for the key once and stores it securely.

mcp.json
{
  "inputs": [{"type": "promptString", "id": "voicehue-key", "description": "VoiceHue API key", "password": true}],
  "servers": {
    "voicehue": {
      "type": "http",
      "url": "https://voicehue.com/mcp",
      "headers": {"Authorization": "Bearer ${input:voicehue-key}"}
    }
  }
}

Windsurf

Add this to ~/.codeium/windsurf/mcp_config.json. Set VOICEHUE_API_KEY in your environment.

mcp_config.json
{
  "mcpServers": {
    "voicehue": {
      "serverUrl": "https://voicehue.com/mcp",
      "headers": {"Authorization": "Bearer ${env:VOICEHUE_API_KEY}"}
    }
  }
}

Gemini CLI

Add this to ~/.gemini/settings.json. Set VOICEHUE_API_KEY in your environment.

settings.json
{
  "mcpServers": {
    "voicehue": {
      "httpUrl": "https://voicehue.com/mcp",
      "headers": {"Authorization": "Bearer $VOICEHUE_API_KEY"}
    }
  }
}

OpenAI SDK (Python and Node.js)

Point the official client at https://voicehue.com/v1 and use your VoiceHue key.

Python
from openai import OpenAI

client = OpenAI(base_url="https://voicehue.com/v1", api_key="YOUR_API_KEY")

with client.audio.speech.with_streaming_response.create(
    model="voicehue-tts",
    voice="vh-es-alex",
    input="Hello from VoiceHue.",
) as response:
    response.stream_to_file("hello.mp3")
Node.js
import OpenAI from "openai";
import fs from "node:fs";

const client = new OpenAI({baseURL: "https://voicehue.com/v1", apiKey: process.env.VOICEHUE_API_KEY});

const audio = await client.audio.speech.create({
  model: "voicehue-tts",
  voice: "vh-es-alex",
  input: "Hello from VoiceHue.",
});
fs.writeFileSync("hello.mp3", Buffer.from(await audio.arrayBuffer()));

LangChain

Load the MCP tools with langchain-mcp-adapters, or wrap the endpoint as your own tool.

Python, MCP
import os
from langchain_mcp_adapters.client import MultiServerMCPClient

client = MultiServerMCPClient({
    "voicehue": {
        "transport": "streamable_http",
        "url": "https://voicehue.com/mcp",
        "headers": {"Authorization": "Bearer " + os.environ["VOICEHUE_API_KEY"]},
    }
})
tools = await client.get_tools()  # text_to_speech, list_voices
Python, tool
import os
from openai import OpenAI
from langchain_core.tools import tool

client = OpenAI(base_url="https://voicehue.com/v1", api_key=os.environ["VOICEHUE_API_KEY"])

@tool
def speak(text: str, voice: str = "VOICE_ID") -> str:
    """Convert text to speech with VoiceHue and save it as speech.mp3."""
    with client.audio.speech.with_streaming_response.create(
        model="voicehue-tts", voice=voice, input=text
    ) as response:
        response.stream_to_file("speech.mp3")
    return "speech.mp3"

n8n, Make and Zapier

Use an HTTP request step with these settings, or import /openapi.json where the tool supports OpenAPI. Keep the key in the tool's credential store.

HTTP request
Method:          POST
URL:             https://voicehue.com/v1/audio/speech
Authentication:  Header Auth
  Name:          Authorization
  Value:         Bearer vh_live_YOUR_KEY
Body (JSON):     {"model": "voicehue-tts", "input": "{{your text}}", "voice": "VOICE_ID"}
Response:        File / binary (the audio is the response body, MP3 by default)

curl

The three MCP calls an agent makes, for testing your key. The audio is in result.content, base64 encoded.

shell
# 1. handshake (no key needed)
curl -s https://voicehue.com/mcp -H "Authorization: Bearer $VOICEHUE_API_KEY" -H "Content-Type: application/json" -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"curl","version":"1"}}}'

# 2. list the tools
curl -s https://voicehue.com/mcp -H "Authorization: Bearer $VOICEHUE_API_KEY" -H "Content-Type: application/json" -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":2,"method":"tools/list"}'

# 3. speak (the audio comes back base64 in result.content)
curl -s https://voicehue.com/mcp -H "Authorization: Bearer $VOICEHUE_API_KEY" -H "Content-Type: application/json" -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"text_to_speech","arguments":{"text":"Hello from VoiceHue.","voice":"VOICE_ID"}}}'

The MCP server speaks the 2026-07-28 revision of the protocol and the earlier ones (2025-11-25 down to 2024-11-05), without sessions. A tool call that hits a limit returns the same error codes as the HTTP API (insufficient_quota, rate_limit_exceeded, invalid_api_key). One call takes up to 1,200 characters.

Authentication

Send your key as a bearer token in the Authorization header of every request. Calls are meant for your server: the API does not allow browser (CORS) requests, so a key never has to appear in a web page.

HTTP
Authorization: Bearer YOUR_API_KEY

Request

POST https://voicehue.com/v1/audio/speech

Send a JSON body. The response body is the audio file, with Content-Type audio/mpeg (MP3, the default) or audio/wav when you send response_format: "wav". Fields other than those below are rejected with invalid_request, so typos do not go unnoticed. You can send an Idempotency-Key header to retry safely: a repeated key answers 409 duplicate_request. Each response carries X-VoiceHue-Request-Id; quote it when you contact support.

FieldTypeRequiredDescription
inputstringyesThe text to speak, up to 1,200 characters.
voicestringyesA voice id from the list below.
modelstringnoAccepted for compatibility and ignored. Use "voicehue-tts".
response_formatstringnomp3 (default) or wav. MP3 is returned whenever you leave it out or send mp3. A voice that cannot produce wav answers unsupported_format.
speednumbernoSpeaking speed from 0.5 to 2. Default 1.

Base URL for OpenAI clients: https://voicehue.com/v1. There are no rate-limit headers; the limits are listed below and a request over a limit answers 429.

Voices

Standard voices, the ones a free key can use (6)

voiceNameLanguageType
vh-es-alexAlexes-ESfemale
vh-fr-camilleCamillefr-FRfemale
vh-en-skySkyen-USfemale
vh-ko-haneul하늘ko-KRfemale
vh-ja-hikariひかりja-JPfemale
vh-zh-qingyin清音zh-CNfemale

Fetch this list in your code with GET https://voicehue.com/v1/voices. No key needed; add ?language=en to filter. Each id is what you send as voice.

Premium voices use your credits (1 credit = 1 premium character; some voices cost more). They need an API plan that includes premium voices. Premium voices are marked in the voice library.

Set model to voicehue-tts; it is accepted for compatibility with OpenAI clients and does not change the voice. Listen to the voices first.

Limits (free plan)

Keys per account2
Characters per month, per key10,000
Characters per day, per key2,000
Requests per minute, per key10
Characters in one request1,200
VoicesStandard voices
Audio formatsMP3 (default), WAV

Characters are counted when a request succeeds. The daily limit resets at 00:00 UTC and the monthly limit on the 1st of each month. The service also has a daily capacity for all keys together, so a request can be refused with 429 even when your own limits are not used up. There is no paid plan yet; paid credit packs are planned for later, without a date or a price.

Errors

Errors use the OpenAI shape: an error object with message, type and code. Messages are short and generic; branch on code, not on the text.

JSON
{
  "error": {
    "message": "The usage limit for this key has been reached.",
    "type": "insufficient_quota",
    "code": "insufficient_quota"
  }
}
HTTPtypecodeWhen
400invalid_request_errorinvalid_requestThe body is not valid JSON, has an unknown field, or a field has the wrong type.
400invalid_request_errorinvalid_inputThe input contains characters that are not allowed (control characters).
400invalid_request_errorinvalid_voiceThe voice value is malformed.
400invalid_request_errorinvalid_speedspeed is outside 0.5 to 2.
400invalid_request_errorunsupported_formatThe voice does not offer the requested response_format.
401authentication_errorinvalid_api_keyThe key is missing, wrong, revoked or expired. The answer is identical in every case.
429insufficient_quotavoice_daily_limitThis voice has a daily character limit and this key reached it. The error body carries limit and resets_at (00:00 UTC).
402insufficient_quotapremium_trial_exhaustedA premium voice: today's free premium trial is used up and the account has no credits. The error body carries trial and credits.
402insufficient_quotainsufficient_creditsA premium voice: the account does not have enough credits for this input. The error body carries trial and credits (balance and needed).
403invalid_request_errorpremium_not_allowedA premium voice was requested but the plan of this key does not include premium voices.
403invalid_request_errorpremium_sign_in_requiredA premium voice needs a signed-in account; the account behind the key is not one.
403invalid_request_erroraccount_suspendedThe account is not permitted to use the service.
404invalid_request_errorvoice_not_foundThe voice does not exist or is not part of your plan.
405invalid_request_errorinvalid_requestThe method is not POST.
409invalid_request_errorduplicate_requestThe same Idempotency-Key was already processed.
413invalid_request_errorinput_too_longThe input is longer than 1,200 characters.
413invalid_request_erroraudio_too_largeThe generated audio is too large to convert to MP3. Send a shorter input.
413invalid_request_errorrequest_too_largeThe request body is larger than 16 KB.
429rate_limit_errorrate_limit_exceededMore than 10 requests in a minute for this key, or too many attempts from one address. Wait and retry.
429insufficient_quotainsufficient_quotaA key, account-wide, or shared-network free allowance has been used up.
502server_errorservice_unavailableThe service could not complete the request. Retry later.
503server_errorservice_unavailableThe API is switched off or temporarily unavailable.

OpenAI clients

The request and error format follow the OpenAI speech endpoint. With an official OpenAI client, set the base URL to https://voicehue.com/v1 and the API key to your VoiceHue key, then call audio.speech.create as in the quickstart. VoiceHue is its own service and is not affiliated with OpenAI.

FAQ

Do I need an OpenAI account or the OpenAI package?

No. The API only follows the same request and error format, so the official OpenAI clients work if you set base_url to the VoiceHue address and use a VoiceHue key. Plain HTTP works too.

What happens when I reach a limit?

The request is refused with HTTP 429 and an error code (insufficient_quota for the daily or monthly characters, rate_limit_exceeded for requests per minute). Nothing is charged. The daily limit resets at 00:00 UTC and the monthly limit on the 1st of the month.

Is my text stored?

The service keeps counts for limits, not the text or the audio you send. See the privacy page for details.

Can I get more than the free plan?

Paid credit packs are planned for later. There is no date and no price yet.

Still need help?

Tell us what you tried and what came back, and we will help you get it working.

Contact ussupport@voicehue.com
PreviousHomeNextPricing
On this page
Quickstart
Pages