Clean, even sound. Out of any video.
Pull the sound out of a video, bring it to a standard loudness, add music under a voice or turn it into an audiogram.
Who uses it: Podcast and course platforms, meeting recorders, social tools and transcription pipelines.
01
Extract and convert audio
Takes the sound out of a video, or converts audio to MP3, AAC, Opus, FLAC or WAV.
- What it is for
- Podcast feeds from video episodes, audio for transcription, smaller files for listening.
- Endpoint and fields
POST /v1/audioaudio- In ffmpeg
-vn-c:a libmp3lame
curl "$VIDEXO_API_URL/v1/audio" \
-H "Authorization: Bearer $VIDEXO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"input": "https://example.com/talk.mp4",
"filename": "talk.mp3",
"audio": {
"bitrate": "192k"
}
}' import { Videxo } from '@videxo/sdk';
const videxo = new Videxo({ apiKey: process.env.VIDEXO_API_KEY, baseUrl: process.env.VIDEXO_API_URL });
const job = await videxo.audio({
"input": "https://example.com/talk.mp4",
"filename": "talk.mp3",
"audio": {
"bitrate": "192k"
}
});
const done = await videxo.jobs.wait(job.id); Install with npm i @videxo/sdk, or send the same request with curl or JavaScript. About the SDK
const response = await fetch(`${process.env.VIDEXO_API_URL}/v1/audio`, {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.VIDEXO_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"input": "https://example.com/talk.mp4",
"filename": "talk.mp3",
"audio": {
"bitrate": "192k"
}
}),
});
const job = await response.json(); ffmpeg \
-i https://example.com/talk.mp4 \
-vn \
-map 0:a:0 \
-c:a libmp3lame -b:a 192k \
talk.mp3 Output. talk.mp3: the soundtrack as a 192 kbit/s MP3.
02
Loudness normalisation
Brings the sound to a target loudness in LUFS with the EBU R128 filter, keeping the picture as it is.
- What it is for
- Every video in a feed or episode in a podcast plays at the same volume.
- Endpoint and fields
POST /v1/transcodevideoaudio- In ffmpeg
loudnorm-c:v copy
curl "$VIDEXO_API_URL/v1/transcode" \
-H "Authorization: Bearer $VIDEXO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"input": "https://example.com/talk.mp4",
"filename": "talk-normal.mp4",
"video": {
"codec": "copy"
},
"audio": {
"normalize": true,
"bitrate": "192k"
}
}' import { Videxo } from '@videxo/sdk';
const videxo = new Videxo({ apiKey: process.env.VIDEXO_API_KEY, baseUrl: process.env.VIDEXO_API_URL });
const job = await videxo.transcode({
"input": "https://example.com/talk.mp4",
"filename": "talk-normal.mp4",
"video": {
"codec": "copy"
},
"audio": {
"normalize": true,
"bitrate": "192k"
}
});
const done = await videxo.jobs.wait(job.id); Install with npm i @videxo/sdk, or send the same request with curl or JavaScript. About the SDK
const response = await fetch(`${process.env.VIDEXO_API_URL}/v1/transcode`, {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.VIDEXO_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"input": "https://example.com/talk.mp4",
"filename": "talk-normal.mp4",
"video": {
"codec": "copy"
},
"audio": {
"normalize": true,
"bitrate": "192k"
}
}),
});
const job = await response.json(); ffmpeg \
-i https://example.com/talk.mp4 \
-map 0:v:0 \
-c:v copy \
-map "0:a:0?" \
-af loudnorm=I=-16:LRA=11:TP=-1.5 \
-c:a aac -b:a 192k -movflags +faststart \
talk-normal.mp4 Output. talk-normal.mp4: the same picture, the sound at -16 LUFS with peaks under -1.5 dBTP.
03
Background music
Mixes a music track under the original sound at the level you set.
- What it is for
- Branded clips, product demos and promos that need a music bed.
- Endpoint and fields
POST /v1/transcodeextra_inputsvideoaudio- In ffmpeg
volumeamix
curl "$VIDEXO_API_URL/v1/transcode" \
-H "Authorization: Bearer $VIDEXO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"input": "https://example.com/talk.mp4",
"filename": "talk-music.mp4",
"extra_inputs": {
"music": "https://example.com/music.mp3"
},
"video": {
"codec": "copy"
},
"audio": {
"mix": [
{
"input": "music",
"volume": 0.2
}
]
}
}' import { Videxo } from '@videxo/sdk';
const videxo = new Videxo({ apiKey: process.env.VIDEXO_API_KEY, baseUrl: process.env.VIDEXO_API_URL });
const job = await videxo.transcode({
"input": "https://example.com/talk.mp4",
"filename": "talk-music.mp4",
"extra_inputs": {
"music": "https://example.com/music.mp3"
},
"video": {
"codec": "copy"
},
"audio": {
"mix": [
{
"input": "music",
"volume": 0.2
}
]
}
});
const done = await videxo.jobs.wait(job.id); Install with npm i @videxo/sdk, or send the same request with curl or JavaScript. About the SDK
const response = await fetch(`${process.env.VIDEXO_API_URL}/v1/transcode`, {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.VIDEXO_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"input": "https://example.com/talk.mp4",
"filename": "talk-music.mp4",
"extra_inputs": {
"music": "https://example.com/music.mp3"
},
"video": {
"codec": "copy"
},
"audio": {
"mix": [
{
"input": "music",
"volume": 0.2
}
]
}
}),
});
const job = await response.json(); ffmpeg \
-i https://example.com/talk.mp4 \
-i https://example.com/music.mp3 \
-filter_complex "[1:a]volume=0.2[o0m0];[0:a:0][o0m0]amix=inputs=2:duration=first:normalize=0[o0a]" \
-map 0:v:0 \
-c:v copy \
-map "[o0a]" \
-c:a aac -b:a 128k -movflags +faststart \
talk-music.mp4 Output. talk-music.mp4: the same picture, the music at a fifth of its volume under the voice, ending with the video.
04
Waveform and spectrum video
Draws the sound as a moving waveform or spectrum, and keeps the sound with it.
- What it is for
- Audiograms for sharing podcasts and voice notes where only video plays.
- Endpoint and fields
POST /v1/transcodevisualize- In ffmpeg
showwavesshowspectrum
curl "$VIDEXO_API_URL/v1/transcode" \
-H "Authorization: Bearer $VIDEXO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"input": "https://example.com/episode.mp3",
"filename": "audiogram.mp4",
"visualize": {
"style": "waveform",
"width": 1280,
"height": 720
}
}' import { Videxo } from '@videxo/sdk';
const videxo = new Videxo({ apiKey: process.env.VIDEXO_API_KEY, baseUrl: process.env.VIDEXO_API_URL });
const job = await videxo.transcode({
"input": "https://example.com/episode.mp3",
"filename": "audiogram.mp4",
"visualize": {
"style": "waveform",
"width": 1280,
"height": 720
}
});
const done = await videxo.jobs.wait(job.id); Install with npm i @videxo/sdk, or send the same request with curl or JavaScript. About the SDK
const response = await fetch(`${process.env.VIDEXO_API_URL}/v1/transcode`, {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.VIDEXO_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"input": "https://example.com/episode.mp3",
"filename": "audiogram.mp4",
"visualize": {
"style": "waveform",
"width": 1280,
"height": 720
}
}),
});
const job = await response.json(); ffmpeg \
-i https://example.com/episode.mp3 \
-filter_complex "[0:a]showwaves=s=1280x720:mode=cline:rate=25[o0v]" \
-map "[o0v]" \
-c:v libx264 -preset veryfast -crf 23 -pix_fmt yuv420p \
-map 0:a:0 \
-c:a aac -b:a 128k -shortest -movflags +faststart \
audiogram.mp4 Output. audiogram.mp4: a 1280 by 720 video of the waveform at 25 frames a second, with the episode as its sound.
Limits. Set by your plan.
- Audio formats: MP3, AAC (.aac, .m4a), Opus, Ogg Vorbis, FLAC and WAV.
- Inputs are public http or https URLs, or completed private uploads up to 100 MB and your plan’s input limit. Outputs have signed download links. A job names up to 16 input and 16 output files.
| Limit | Pay as you go | Starter | Pro | Scale |
|---|---|---|---|---|
| Longest job | 10 min | 10 min | 30 min | 60 min |
| Inputs per job | 1 GB | 1 GB | 5 GB | 10 GB |
| Outputs per job | 1 GB | 1 GB | 5 GB | 8 GB |
| Outputs expire after | 7 days | 7 days | 30 days | 30 days |
Pay as you go
- Longest job
- 10 min
- Inputs per job
- 1 GB
- Outputs per job
- 1 GB
- Outputs expire after
- 7 days
Starter
- Longest job
- 10 min
- Inputs per job
- 1 GB
- Outputs per job
- 1 GB
- Outputs expire after
- 7 days
Pro
- Longest job
- 30 min
- Inputs per job
- 5 GB
- Outputs per job
- 5 GB
- Outputs expire after
- 30 days
Scale
- Longest job
- 60 min
- Inputs per job
- 10 GB
- Outputs per job
- 8 GB
- Outputs expire after
- 30 days
Soon. Planned, not available yet.
Silence removal Soon
Find the quiet parts of a recording and cut them out.
Automatic captions and transcripts Soon
Speech to text as SRT, VTT and JSON with word times.