curl --request POST \
--url https://api.navtalk.ai/api/open/v1/video-compose/submit \
--header 'Content-Type: multipart/form-data' \
--header 'license: <api-key>' \
--form 'title=My first synthesis task' \
--form audioFile='@example-file' \
--form audioUrl=https://cdn.example.com/voice.mp3 \
--form 'textContent=Hello, welcome to NavTalk.' \
--form characterFile='@example-file' \
--form characterUrl=https://cdn.example.com/source.mp4 \
--form avatarId=4024d39983b4d4b488bba9377268fbac \
--form bboxShift=0 \
--form extraMargin=10 \
--form parsingMode=jaw \
--form leftCheekWidth=90 \
--form rightCheekWidth=90import requests
url = "https://api.navtalk.ai/api/open/v1/video-compose/submit"
files = {
"audioFile": ("example-file", open("example-file", "rb")),
"characterFile": ("example-file", open("example-file", "rb"))
}
payload = {
"title": "My first synthesis task",
"audioUrl": "https://cdn.example.com/voice.mp3",
"textContent": "Hello, welcome to NavTalk.",
"characterUrl": "https://cdn.example.com/source.mp4",
"avatarId": "4024d39983b4d4b488bba9377268fbac",
"bboxShift": "0",
"extraMargin": "10",
"parsingMode": "jaw",
"leftCheekWidth": "90",
"rightCheekWidth": "90"
}
headers = {"license": "<api-key>"}
response = requests.post(url, data=payload, files=files, headers=headers)
print(response.text)const form = new FormData();
form.append('title', 'My first synthesis task');
form.append('audioFile', '<string>');
form.append('audioUrl', 'https://cdn.example.com/voice.mp3');
form.append('textContent', 'Hello, welcome to NavTalk.');
form.append('characterFile', '<string>');
form.append('characterUrl', 'https://cdn.example.com/source.mp4');
form.append('avatarId', '4024d39983b4d4b488bba9377268fbac');
form.append('bboxShift', '0');
form.append('extraMargin', '10');
form.append('parsingMode', 'jaw');
form.append('leftCheekWidth', '90');
form.append('rightCheekWidth', '90');
const options = {method: 'POST', headers: {license: '<api-key>'}};
options.body = form;
fetch('https://api.navtalk.ai/api/open/v1/video-compose/submit', 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://api.navtalk.ai/api/open/v1/video-compose/submit",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"title\"\r\n\r\nMy first synthesis task\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"audioFile\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"audioUrl\"\r\n\r\nhttps://cdn.example.com/voice.mp3\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"textContent\"\r\n\r\nHello, welcome to NavTalk.\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"characterFile\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"characterUrl\"\r\n\r\nhttps://cdn.example.com/source.mp4\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"avatarId\"\r\n\r\n4024d39983b4d4b488bba9377268fbac\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"bboxShift\"\r\n\r\n0\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"extraMargin\"\r\n\r\n10\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"parsingMode\"\r\n\r\njaw\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"leftCheekWidth\"\r\n\r\n90\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"rightCheekWidth\"\r\n\r\n90\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => [
"Content-Type: multipart/form-data",
"license: <api-key>"
],
]);
$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://api.navtalk.ai/api/open/v1/video-compose/submit"
payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"title\"\r\n\r\nMy first synthesis task\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"audioFile\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"audioUrl\"\r\n\r\nhttps://cdn.example.com/voice.mp3\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"textContent\"\r\n\r\nHello, welcome to NavTalk.\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"characterFile\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"characterUrl\"\r\n\r\nhttps://cdn.example.com/source.mp4\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"avatarId\"\r\n\r\n4024d39983b4d4b488bba9377268fbac\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"bboxShift\"\r\n\r\n0\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"extraMargin\"\r\n\r\n10\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"parsingMode\"\r\n\r\njaw\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"leftCheekWidth\"\r\n\r\n90\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"rightCheekWidth\"\r\n\r\n90\r\n-----011000010111000001101001--")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("license", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.navtalk.ai/api/open/v1/video-compose/submit")
.header("license", "<api-key>")
.body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"title\"\r\n\r\nMy first synthesis task\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"audioFile\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"audioUrl\"\r\n\r\nhttps://cdn.example.com/voice.mp3\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"textContent\"\r\n\r\nHello, welcome to NavTalk.\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"characterFile\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"characterUrl\"\r\n\r\nhttps://cdn.example.com/source.mp4\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"avatarId\"\r\n\r\n4024d39983b4d4b488bba9377268fbac\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"bboxShift\"\r\n\r\n0\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"extraMargin\"\r\n\r\n10\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"parsingMode\"\r\n\r\njaw\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"leftCheekWidth\"\r\n\r\n90\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"rightCheekWidth\"\r\n\r\n90\r\n-----011000010111000001101001--")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.navtalk.ai/api/open/v1/video-compose/submit")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["license"] = '<api-key>'
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"title\"\r\n\r\nMy first synthesis task\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"audioFile\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"audioUrl\"\r\n\r\nhttps://cdn.example.com/voice.mp3\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"textContent\"\r\n\r\nHello, welcome to NavTalk.\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"characterFile\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"characterUrl\"\r\n\r\nhttps://cdn.example.com/source.mp4\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"avatarId\"\r\n\r\n4024d39983b4d4b488bba9377268fbac\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"bboxShift\"\r\n\r\n0\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"extraMargin\"\r\n\r\n10\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"parsingMode\"\r\n\r\njaw\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"leftCheekWidth\"\r\n\r\n90\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"rightCheekWidth\"\r\n\r\n90\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_body{
"code": 200,
"message": "SUCCESS",
"data": {
"taskId": "6d7e24b7-412d-46ec-8d95-940099a3e979",
"status": "Processing"
}
}Submit Video Compose Task
Submit an asynchronous digital human video composition task.
Input rules:
- Exactly one of
audioFile,audioUrl, ortextContentis required - Exactly one of
characterFile,characterUrl, oravatarIdis required - If
textContentis used,avatarIdis required so the service can synthesize speech with the avatar’s bound voice and provider
curl --request POST \
--url https://api.navtalk.ai/api/open/v1/video-compose/submit \
--header 'Content-Type: multipart/form-data' \
--header 'license: <api-key>' \
--form 'title=My first synthesis task' \
--form audioFile='@example-file' \
--form audioUrl=https://cdn.example.com/voice.mp3 \
--form 'textContent=Hello, welcome to NavTalk.' \
--form characterFile='@example-file' \
--form characterUrl=https://cdn.example.com/source.mp4 \
--form avatarId=4024d39983b4d4b488bba9377268fbac \
--form bboxShift=0 \
--form extraMargin=10 \
--form parsingMode=jaw \
--form leftCheekWidth=90 \
--form rightCheekWidth=90import requests
url = "https://api.navtalk.ai/api/open/v1/video-compose/submit"
files = {
"audioFile": ("example-file", open("example-file", "rb")),
"characterFile": ("example-file", open("example-file", "rb"))
}
payload = {
"title": "My first synthesis task",
"audioUrl": "https://cdn.example.com/voice.mp3",
"textContent": "Hello, welcome to NavTalk.",
"characterUrl": "https://cdn.example.com/source.mp4",
"avatarId": "4024d39983b4d4b488bba9377268fbac",
"bboxShift": "0",
"extraMargin": "10",
"parsingMode": "jaw",
"leftCheekWidth": "90",
"rightCheekWidth": "90"
}
headers = {"license": "<api-key>"}
response = requests.post(url, data=payload, files=files, headers=headers)
print(response.text)const form = new FormData();
form.append('title', 'My first synthesis task');
form.append('audioFile', '<string>');
form.append('audioUrl', 'https://cdn.example.com/voice.mp3');
form.append('textContent', 'Hello, welcome to NavTalk.');
form.append('characterFile', '<string>');
form.append('characterUrl', 'https://cdn.example.com/source.mp4');
form.append('avatarId', '4024d39983b4d4b488bba9377268fbac');
form.append('bboxShift', '0');
form.append('extraMargin', '10');
form.append('parsingMode', 'jaw');
form.append('leftCheekWidth', '90');
form.append('rightCheekWidth', '90');
const options = {method: 'POST', headers: {license: '<api-key>'}};
options.body = form;
fetch('https://api.navtalk.ai/api/open/v1/video-compose/submit', 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://api.navtalk.ai/api/open/v1/video-compose/submit",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"title\"\r\n\r\nMy first synthesis task\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"audioFile\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"audioUrl\"\r\n\r\nhttps://cdn.example.com/voice.mp3\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"textContent\"\r\n\r\nHello, welcome to NavTalk.\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"characterFile\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"characterUrl\"\r\n\r\nhttps://cdn.example.com/source.mp4\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"avatarId\"\r\n\r\n4024d39983b4d4b488bba9377268fbac\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"bboxShift\"\r\n\r\n0\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"extraMargin\"\r\n\r\n10\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"parsingMode\"\r\n\r\njaw\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"leftCheekWidth\"\r\n\r\n90\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"rightCheekWidth\"\r\n\r\n90\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => [
"Content-Type: multipart/form-data",
"license: <api-key>"
],
]);
$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://api.navtalk.ai/api/open/v1/video-compose/submit"
payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"title\"\r\n\r\nMy first synthesis task\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"audioFile\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"audioUrl\"\r\n\r\nhttps://cdn.example.com/voice.mp3\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"textContent\"\r\n\r\nHello, welcome to NavTalk.\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"characterFile\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"characterUrl\"\r\n\r\nhttps://cdn.example.com/source.mp4\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"avatarId\"\r\n\r\n4024d39983b4d4b488bba9377268fbac\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"bboxShift\"\r\n\r\n0\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"extraMargin\"\r\n\r\n10\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"parsingMode\"\r\n\r\njaw\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"leftCheekWidth\"\r\n\r\n90\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"rightCheekWidth\"\r\n\r\n90\r\n-----011000010111000001101001--")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("license", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.navtalk.ai/api/open/v1/video-compose/submit")
.header("license", "<api-key>")
.body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"title\"\r\n\r\nMy first synthesis task\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"audioFile\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"audioUrl\"\r\n\r\nhttps://cdn.example.com/voice.mp3\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"textContent\"\r\n\r\nHello, welcome to NavTalk.\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"characterFile\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"characterUrl\"\r\n\r\nhttps://cdn.example.com/source.mp4\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"avatarId\"\r\n\r\n4024d39983b4d4b488bba9377268fbac\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"bboxShift\"\r\n\r\n0\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"extraMargin\"\r\n\r\n10\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"parsingMode\"\r\n\r\njaw\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"leftCheekWidth\"\r\n\r\n90\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"rightCheekWidth\"\r\n\r\n90\r\n-----011000010111000001101001--")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.navtalk.ai/api/open/v1/video-compose/submit")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["license"] = '<api-key>'
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"title\"\r\n\r\nMy first synthesis task\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"audioFile\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"audioUrl\"\r\n\r\nhttps://cdn.example.com/voice.mp3\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"textContent\"\r\n\r\nHello, welcome to NavTalk.\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"characterFile\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"characterUrl\"\r\n\r\nhttps://cdn.example.com/source.mp4\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"avatarId\"\r\n\r\n4024d39983b4d4b488bba9377268fbac\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"bboxShift\"\r\n\r\n0\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"extraMargin\"\r\n\r\n10\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"parsingMode\"\r\n\r\njaw\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"leftCheekWidth\"\r\n\r\n90\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"rightCheekWidth\"\r\n\r\n90\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_body{
"code": 200,
"message": "SUCCESS",
"data": {
"taskId": "6d7e24b7-412d-46ec-8d95-940099a3e979",
"status": "Processing"
}
}Authorizations
NavTalk API license key (e.g. sk_navtalk_...)
Body
Multipart form data for submitting a video composition task. Exactly one audio source and exactly one visual source are required.
Optional task title saved with the generation record.
"My first synthesis task"
Uploaded audio file. Use exactly one of audioFile, audioUrl, or textContent.
Public audio URL. Use exactly one of audioFile, audioUrl, or textContent.
"https://cdn.example.com/voice.mp3"
Text to synthesize into speech. Use exactly one of audioFile, audioUrl, or textContent. Requires avatarId.
"Hello, welcome to NavTalk."
Uploaded image or video visual source. Use exactly one of characterFile, characterUrl, or avatarId.
Public image or video visual source URL. Use exactly one of characterFile, characterUrl, or avatarId.
"https://cdn.example.com/source.mp4"
Existing trained avatar ID. Required when textContent is used. Use exactly one of characterFile, characterUrl, or avatarId.
"4024d39983b4d4b488bba9377268fbac"
Optional face crop offset.
0
Optional extra face margin.
10
Optional parsing mode.
"jaw"
Optional left cheek blend width.
90
Optional right cheek blend width.
90