curl --request POST \
--url https://apis.finevoice.ai/v1/audio/podcastgen \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"text": "Welcome to the FineVoice podcast. Today we discuss AI audio...",
"thumbnail": "<string>",
"speakers": [
"olivia",
"ethan"
],
"expectedDuration": "5min",
"prompt": "<string>",
"style": "conversational",
"originalText": true,
"useAsync": true
}
'import requests
url = "https://apis.finevoice.ai/v1/audio/podcastgen"
payload = {
"text": "Welcome to the FineVoice podcast. Today we discuss AI audio...",
"thumbnail": "<string>",
"speakers": ["olivia", "ethan"],
"expectedDuration": "5min",
"prompt": "<string>",
"style": "conversational",
"originalText": True,
"useAsync": True
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
text: 'Welcome to the FineVoice podcast. Today we discuss AI audio...',
thumbnail: '<string>',
speakers: ['olivia', 'ethan'],
expectedDuration: '5min',
prompt: '<string>',
style: 'conversational',
originalText: true,
useAsync: true
})
};
fetch('https://apis.finevoice.ai/v1/audio/podcastgen', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://apis.finevoice.ai/v1/audio/podcastgen",
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([
'text' => 'Welcome to the FineVoice podcast. Today we discuss AI audio...',
'thumbnail' => '<string>',
'speakers' => [
'olivia',
'ethan'
],
'expectedDuration' => '5min',
'prompt' => '<string>',
'style' => 'conversational',
'originalText' => true,
'useAsync' => true
]),
CURLOPT_HTTPHEADER => [
"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;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://apis.finevoice.ai/v1/audio/podcastgen"
payload := strings.NewReader("{\n \"text\": \"Welcome to the FineVoice podcast. Today we discuss AI audio...\",\n \"thumbnail\": \"<string>\",\n \"speakers\": [\n \"olivia\",\n \"ethan\"\n ],\n \"expectedDuration\": \"5min\",\n \"prompt\": \"<string>\",\n \"style\": \"conversational\",\n \"originalText\": true,\n \"useAsync\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://apis.finevoice.ai/v1/audio/podcastgen")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"text\": \"Welcome to the FineVoice podcast. Today we discuss AI audio...\",\n \"thumbnail\": \"<string>\",\n \"speakers\": [\n \"olivia\",\n \"ethan\"\n ],\n \"expectedDuration\": \"5min\",\n \"prompt\": \"<string>\",\n \"style\": \"conversational\",\n \"originalText\": true,\n \"useAsync\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://apis.finevoice.ai/v1/audio/podcastgen")
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 \"text\": \"Welcome to the FineVoice podcast. Today we discuss AI audio...\",\n \"thumbnail\": \"<string>\",\n \"speakers\": [\n \"olivia\",\n \"ethan\"\n ],\n \"expectedDuration\": \"5min\",\n \"prompt\": \"<string>\",\n \"style\": \"conversational\",\n \"originalText\": true,\n \"useAsync\": true\n}"
response = http.request(request)
puts response.read_body{
"status": 123,
"url": "<string>",
"taskId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"error": {
"code": "<string>",
"message": "<string>"
},
"urls": [
"<string>"
],
"service": "<string>",
"port": "<string>",
"timestamp": "<string>"
}Podcast Generation
Generate a multi-speaker AI podcast from a script or prompt, with selectable voice models for each speaker.
curl --request POST \
--url https://apis.finevoice.ai/v1/audio/podcastgen \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"text": "Welcome to the FineVoice podcast. Today we discuss AI audio...",
"thumbnail": "<string>",
"speakers": [
"olivia",
"ethan"
],
"expectedDuration": "5min",
"prompt": "<string>",
"style": "conversational",
"originalText": true,
"useAsync": true
}
'import requests
url = "https://apis.finevoice.ai/v1/audio/podcastgen"
payload = {
"text": "Welcome to the FineVoice podcast. Today we discuss AI audio...",
"thumbnail": "<string>",
"speakers": ["olivia", "ethan"],
"expectedDuration": "5min",
"prompt": "<string>",
"style": "conversational",
"originalText": True,
"useAsync": True
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
text: 'Welcome to the FineVoice podcast. Today we discuss AI audio...',
thumbnail: '<string>',
speakers: ['olivia', 'ethan'],
expectedDuration: '5min',
prompt: '<string>',
style: 'conversational',
originalText: true,
useAsync: true
})
};
fetch('https://apis.finevoice.ai/v1/audio/podcastgen', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://apis.finevoice.ai/v1/audio/podcastgen",
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([
'text' => 'Welcome to the FineVoice podcast. Today we discuss AI audio...',
'thumbnail' => '<string>',
'speakers' => [
'olivia',
'ethan'
],
'expectedDuration' => '5min',
'prompt' => '<string>',
'style' => 'conversational',
'originalText' => true,
'useAsync' => true
]),
CURLOPT_HTTPHEADER => [
"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;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://apis.finevoice.ai/v1/audio/podcastgen"
payload := strings.NewReader("{\n \"text\": \"Welcome to the FineVoice podcast. Today we discuss AI audio...\",\n \"thumbnail\": \"<string>\",\n \"speakers\": [\n \"olivia\",\n \"ethan\"\n ],\n \"expectedDuration\": \"5min\",\n \"prompt\": \"<string>\",\n \"style\": \"conversational\",\n \"originalText\": true,\n \"useAsync\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://apis.finevoice.ai/v1/audio/podcastgen")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"text\": \"Welcome to the FineVoice podcast. Today we discuss AI audio...\",\n \"thumbnail\": \"<string>\",\n \"speakers\": [\n \"olivia\",\n \"ethan\"\n ],\n \"expectedDuration\": \"5min\",\n \"prompt\": \"<string>\",\n \"style\": \"conversational\",\n \"originalText\": true,\n \"useAsync\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://apis.finevoice.ai/v1/audio/podcastgen")
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 \"text\": \"Welcome to the FineVoice podcast. Today we discuss AI audio...\",\n \"thumbnail\": \"<string>\",\n \"speakers\": [\n \"olivia\",\n \"ethan\"\n ],\n \"expectedDuration\": \"5min\",\n \"prompt\": \"<string>\",\n \"style\": \"conversational\",\n \"originalText\": true,\n \"useAsync\": true\n}"
response = http.request(request)
puts response.read_body{
"status": 123,
"url": "<string>",
"taskId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"error": {
"code": "<string>",
"message": "<string>"
},
"urls": [
"<string>"
],
"service": "<string>",
"port": "<string>",
"timestamp": "<string>"
}Authorizations
Bearer token (API key). Format: Bearer {your_api_key}
Body
The podcast generation request payload.
The podcast script content.
"Welcome to the FineVoice podcast. Today we discuss AI audio..."
The thumbnail image URL.
Voice models used by podcast speakers.
["olivia", "ethan"]
The expected generated duration.
"5min"
The generation prompt.
The desired podcast style.
"conversational"
Whether to keep the original text wording.
Set to true to process asynchronously.
true
Response
Task accepted. Returns a taskId for async polling or the result URL directly.
Standard response for audio processing tasks.
HTTP-style status code (200 for success, 202 for in-progress).
Download URL of the generated audio file (available when completed).
Task identifier for async polling. Use with GET /v1/task/{task_id}.
"a1b2c3d4-e5f6-7890-abcd-ef1234567890"
Show child attributes
Show child attributes
Multiple output URLs (e.g. for separation stems).