Python
from magic_hour import Client
from os import getenv
client = Client(token=getenv("API_TOKEN"))
res = client.v1.ai_voice_cloner.create(
assets={"audio_file_path": "api-assets/id/1234.mp3"},
style={"prompt": "Hello, this is my cloned voice."},
name="My Voice Cloner audio",
)import { Client } from "magic-hour";
const client = new Client({ token: process.env["API_TOKEN"]!! });
const res = await client.v1.aiVoiceCloner.generate(
{
assets: { audioFilePath: "/path/to/audio.mp3" },
name: "Voice Cloner audio",
style: { prompt: "Hello, this is my cloned voice." },
},
{
waitForCompletion: true,
downloadOutputs: true,
downloadDirectory: ".",
},
);package main
import (
os "os"
sdk "github.com/magichourhq/magic-hour-go/client"
nullable "github.com/magichourhq/magic-hour-go/nullable"
ai_voice_cloner "github.com/magichourhq/magic-hour-go/resources/v1/ai_voice_cloner"
types "github.com/magichourhq/magic-hour-go/types"
)
func main() {
client := sdk.NewClient(
sdk.WithBearerAuth(os.Getenv("API_TOKEN")),
)
res, err := client.V1.AiVoiceCloner.Create(ai_voice_cloner.CreateRequest{
Assets: types.V1AiVoiceClonerCreateBodyAssets{
AudioFilePath: "api-assets/id/1234.mp3",
},
Name: nullable.NewValue("My Voice Cloner audio"),
Style: types.V1AiVoiceClonerCreateBodyStyle{
Prompt: "Hello, this is my cloned voice.",
},
})
}let client = magic_hour::Client::default()
.with_bearer_auth(&std::env::var("API_TOKEN").unwrap());
let res = client
.v1()
.ai_voice_cloner()
.create(magic_hour::resources::v1::ai_voice_cloner::CreateRequest {
assets: magic_hour::models::V1AiVoiceClonerCreateBodyAssets {
audio_file_path: "api-assets/id/1234.mp3".to_string(),
},
name: Some("My Voice Cloner audio".to_string()),
style: magic_hour::models::V1AiVoiceClonerCreateBodyStyle {
prompt: "Hello, this is my cloned voice.".to_string(),
},
})
.await;curl --request POST \
--url https://api.magichour.ai/v1/ai-voice-cloner \
--header 'accept: application/json' \
--header 'authorization: Bearer <token>' \
--header 'content-type: application/json' \
--data '
{
"name": "My Voice Cloner audio",
"assets": {
"audio_file_path": "api-assets/id/1234.mp3"
},
"style": {
"prompt": "Hello, this is my cloned voice."
}
}
'<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.magichour.ai/v1/ai-voice-cloner",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'name' => 'My Voice Cloner audio',
'assets' => [
'audio_file_path' => 'api-assets/id/1234.mp3'
],
'style' => [
'prompt' => 'Hello, this is my cloned voice.'
]
]),
CURLOPT_HTTPHEADER => [
"accept: application/json",
"authorization: Bearer <token>",
"content-type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}HttpResponse<String> response = Unirest.post("https://api.magichour.ai/v1/ai-voice-cloner")
.header("accept", "application/json")
.header("content-type", "application/json")
.header("authorization", "Bearer <token>")
.body("{\"name\":\"My Voice Cloner audio\",\"assets\":{\"audio_file_path\":\"api-assets/id/1234.mp3\"},\"style\":{\"prompt\":\"Hello, this is my cloned voice.\"}}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.magichour.ai/v1/ai-voice-cloner")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"assets\": {\n \"audio_file_path\": \"api-assets/id/1234.mp3\"\n },\n \"style\": {\n \"prompt\": \"Hello, this is my cloned voice.\"\n },\n \"name\": \"My Voice Cloner audio\"\n}"
response = http.request(request)
puts response.read_body{
"id": "cuid-example",
"credits_charged": 1
}{
"message": "Missing request body"
}{
"message": "Unauthorized"
}{
"message": "Payment required"
}{
"message": "Not Found"
}{
"message": "Unable to clone voice"
}Audio Projects
AI Voice Cloner API Reference - Magic Hour Docs
Clone a voice from an audio sample and generate speech.
- Each character costs 0.05 credits.
- The cost is rounded up to the nearest whole number
POST
/
v1
/
ai-voice-cloner
Python
from magic_hour import Client
from os import getenv
client = Client(token=getenv("API_TOKEN"))
res = client.v1.ai_voice_cloner.create(
assets={"audio_file_path": "api-assets/id/1234.mp3"},
style={"prompt": "Hello, this is my cloned voice."},
name="My Voice Cloner audio",
)import { Client } from "magic-hour";
const client = new Client({ token: process.env["API_TOKEN"]!! });
const res = await client.v1.aiVoiceCloner.generate(
{
assets: { audioFilePath: "/path/to/audio.mp3" },
name: "Voice Cloner audio",
style: { prompt: "Hello, this is my cloned voice." },
},
{
waitForCompletion: true,
downloadOutputs: true,
downloadDirectory: ".",
},
);package main
import (
os "os"
sdk "github.com/magichourhq/magic-hour-go/client"
nullable "github.com/magichourhq/magic-hour-go/nullable"
ai_voice_cloner "github.com/magichourhq/magic-hour-go/resources/v1/ai_voice_cloner"
types "github.com/magichourhq/magic-hour-go/types"
)
func main() {
client := sdk.NewClient(
sdk.WithBearerAuth(os.Getenv("API_TOKEN")),
)
res, err := client.V1.AiVoiceCloner.Create(ai_voice_cloner.CreateRequest{
Assets: types.V1AiVoiceClonerCreateBodyAssets{
AudioFilePath: "api-assets/id/1234.mp3",
},
Name: nullable.NewValue("My Voice Cloner audio"),
Style: types.V1AiVoiceClonerCreateBodyStyle{
Prompt: "Hello, this is my cloned voice.",
},
})
}let client = magic_hour::Client::default()
.with_bearer_auth(&std::env::var("API_TOKEN").unwrap());
let res = client
.v1()
.ai_voice_cloner()
.create(magic_hour::resources::v1::ai_voice_cloner::CreateRequest {
assets: magic_hour::models::V1AiVoiceClonerCreateBodyAssets {
audio_file_path: "api-assets/id/1234.mp3".to_string(),
},
name: Some("My Voice Cloner audio".to_string()),
style: magic_hour::models::V1AiVoiceClonerCreateBodyStyle {
prompt: "Hello, this is my cloned voice.".to_string(),
},
})
.await;curl --request POST \
--url https://api.magichour.ai/v1/ai-voice-cloner \
--header 'accept: application/json' \
--header 'authorization: Bearer <token>' \
--header 'content-type: application/json' \
--data '
{
"name": "My Voice Cloner audio",
"assets": {
"audio_file_path": "api-assets/id/1234.mp3"
},
"style": {
"prompt": "Hello, this is my cloned voice."
}
}
'<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.magichour.ai/v1/ai-voice-cloner",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'name' => 'My Voice Cloner audio',
'assets' => [
'audio_file_path' => 'api-assets/id/1234.mp3'
],
'style' => [
'prompt' => 'Hello, this is my cloned voice.'
]
]),
CURLOPT_HTTPHEADER => [
"accept: application/json",
"authorization: Bearer <token>",
"content-type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}HttpResponse<String> response = Unirest.post("https://api.magichour.ai/v1/ai-voice-cloner")
.header("accept", "application/json")
.header("content-type", "application/json")
.header("authorization", "Bearer <token>")
.body("{\"name\":\"My Voice Cloner audio\",\"assets\":{\"audio_file_path\":\"api-assets/id/1234.mp3\"},\"style\":{\"prompt\":\"Hello, this is my cloned voice.\"}}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.magichour.ai/v1/ai-voice-cloner")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"assets\": {\n \"audio_file_path\": \"api-assets/id/1234.mp3\"\n },\n \"style\": {\n \"prompt\": \"Hello, this is my cloned voice.\"\n },\n \"name\": \"My Voice Cloner audio\"\n}"
response = http.request(request)
puts response.read_body{
"id": "cuid-example",
"credits_charged": 1
}{
"message": "Missing request body"
}{
"message": "Unauthorized"
}{
"message": "Payment required"
}{
"message": "Not Found"
}{
"message": "Unable to clone voice"
}Authorizations
Bearer authentication header of the form Bearer <api_key>, where <api_key> is your API key. To get your API key, go to Developer Hub and click "Create new API Key".
Body
application/json
Body
Response
Success
Success
Unique ID of the audio. Use it with the Get audio Project API to fetch status and downloads.
Example:
"cuid-example"
The amount of credits deducted from your account to generate the audio. We charge credits right when the request is made.
If an error occurred while generating the audio, credits will be refunded and this field will be updated to include the refund.
Example:
1
Was this page helpful?
⌘I