Ace Step Audio Outpaint

Ace Step Audio Outpaint

Playground

Try it on WaveSpeedAI!

ACE-Step Audio Outpaint generates seamless start or end extensions that match the original, ideal for intros, outros and longer tracks. Ready-to-use REST inference API, best performance, no coldstarts, affordable pricing.

Features

Extend your audio tracks seamlessly with AI-powered music generation. Upload any audio clip and let the model generate new content before or after it — perfectly matching the style, rhythm, and mood of your original track.

Why It Sounds Great

  • Style-aware generation: Uses tag-based guidance to match genres like lofi, hiphop, trap, drum and bass, and more.
  • Seamless transitions: Generated audio blends naturally with your original track without abrupt cuts or mismatched beats.
  • Bidirectional extension: Extend audio at the beginning, end, or both directions simultaneously.
  • Lyrics support: Optionally provide lyrics to guide vocal generation in extended sections.
  • Reproducible results: Use the seed parameter to recreate exact outputs or explore variations.

Parameters

ParameterRequiredDescription
audioYesSource audio file (upload or public URL).
tagsYesComma-separated style tags to guide generation (e.g., “lofi, hiphop, chill, trap”).
extend_before_durationNoSeconds to generate before the original audio. Default: 0.
extend_after_durationNoSeconds to generate after the original audio. Default: 30.
lyricsNoOptional lyrics to guide vocal generation in extended sections.
seedNoRandom seed for reproducibility. Use -1 for random.

How to Use

  1. Upload your audio — drag and drop or paste a public URL.
  2. Add style tags — describe the genre and mood (e.g., “lofi, hiphop, chill”).
  3. Set extension duration:
  • Use extend_after_duration to add time at the end.
  • Use extend_before_duration to add time at the beginning.
  1. Add lyrics (optional) — provide text if you want vocals in the extended section.
  2. Set seed (optional) — use -1 for random, or a specific number for reproducible results.
  3. Run — click the button and wait for generation.
  4. Download — preview and save your extended audio.

Pricing

Per-second billing based on total output duration.

MetricCost
Per second$0.0002

Billing Formula

Total cost = (original audio duration + extend_before_duration + extend_after_duration) × $0.0002

Examples

OriginalExtend BeforeExtend AfterTotal DurationTotal Cost
60s0s30s90s$0.018
90s10s30s130s$0.026
120s0s60s180s$0.036
180s30s30s240s$0.048

Best Use Cases

  • Music Production — Extend loops, intros, or outros for full-length tracks.
  • Content Creation — Generate longer background music for videos and podcasts.
  • DJ & Remix Work — Create extended mixes or seamless transitions between tracks.
  • Game & Media Audio — Produce adaptive music that can loop or extend dynamically.
  • Songwriting — Explore new directions by extending existing ideas with AI assistance.

Pro Tips for Best Results

  • Use descriptive, specific tags — “lofi, hiphop, jazzy, chill, piano” works better than just “music”.
  • For consistent style, keep the original audio and extension durations balanced.
  • Experiment with different seeds to find the perfect variation.
  • When using lyrics, match the syllable count and rhythm to the expected musical phrasing.
  • Start with shorter extensions (15-30s) to test the style match before generating longer segments.

Notes

  • If using a URL, ensure it is publicly accessible. A preview player in the interface confirms successful loading.
  • Processing time scales with total output duration.
  • For best results, use clean source audio with consistent tempo and style.

Authentication

For authentication details, please refer to the Authentication Guide.

API Endpoints

Submit Task & Query Result

set -euo pipefail

export WAVESPEED_API_KEY="your-api-key"

REQUEST_BODY=$(cat <<'JSON'
{
  "audio": "https://interactive-examples.mdn.mozilla.net/media/cc0-audio/t-rex-roar.mp3",
  "tags": "example",
  "extend_before_duration": 0,
  "extend_after_duration": 30,
  "seed": -1
}
JSON
)

# 1. Submit the prediction.
SUBMIT_RESPONSE=$(curl --silent --show-error --fail-with-body \
  -X POST "https://api.wavespeed.ai/api/v3/wavespeed-ai/ace-step/audio-outpaint" \
  -H "Authorization: Bearer ${WAVESPEED_API_KEY}" \
  -H "Content-Type: application/json" \
  -d "${REQUEST_BODY}")

TASK=$(printf '%s' "${SUBMIT_RESPONSE}" | jq 'if type == "object" and has("data") then .data else . end')
PREDICTION_ID=$(printf '%s' "${TASK}" | jq -r '.id // empty')
if [ -z "${PREDICTION_ID}" ]; then
  printf 'Submission response did not contain a prediction id
' >&2
  exit 1
fi
RESULT_URL=$(printf '%s' "${TASK}" | jq -r '.urls.get // empty')
if [ -z "${RESULT_URL}" ]; then RESULT_URL="https://api.wavespeed.ai/api/v3/predictions/${PREDICTION_ID}/result"; fi

# 2. Poll until the prediction finishes.
while true; do
  RESPONSE=$(curl --silent --show-error --fail-with-body \
    "${RESULT_URL}" \
    -H "Authorization: Bearer ${WAVESPEED_API_KEY}")
  RESULT=$(printf '%s' "${RESPONSE}" | jq 'if type == "object" and has("data") then .data else . end')
  STATUS=$(printf '%s' "${RESULT}" | jq -r '.status // empty')

  case "${STATUS}" in
    completed) printf '%s\n' "${RESULT}" | jq '.outputs'; break ;;
    failed|cancelled|timeout) printf '%s\n' "${RESULT}" | jq . >&2; exit 1 ;;
    created|processing) sleep 2 ;;
    *) printf 'Unexpected status: %s
' "${STATUS}" >&2; exit 1 ;;
  esac
done

Parameters

Task Submission Parameters

Request Parameters

ParameterTypeRequiredDefaultRangeDescription
audiostringYes--Audio file to transcribe. Provide an HTTPS URL or upload a file (MP3, WAV, FLAC up to 60 minutes).
tagsstringYes--Comma-separated list of genre tags to control the style.
extend_before_durationnumberNo00 ~ 240Duration to extend from the start in seconds.
extend_after_durationnumberNo300 ~ 240Duration to extend from the end in seconds.
lyricsstringNo--Vocal content for generation. Use [inst] or [instrumental] for no vocals.
seedintegerNo-1-The random seed for reproducibility.

Response Parameters

ParameterTypeDescription
codeintegerHTTP status code (e.g., 200 for success)
messagestringStatus message (e.g., “success”)
data.idstringUnique identifier for the prediction, Task Id
data.modelstringModel ID used for the prediction
data.outputsarrayOutput values, usually URL strings; some models return text strings or structured result objects (empty when status is not completed)
data.urlsobjectObject containing related API endpoints
data.urls.getstringURL to retrieve the prediction result
data.statusstringStatus of the task: created, processing, completed, or failed
data.created_atstringISO timestamp of when the request was created (e.g., “2023-04-01T12:34:56.789Z”)
data.errorstringError message (empty if no error occurred)
data.timingsobjectObject containing timing details
data.timings.inferenceintegerInference time in milliseconds

Result Request Parameters

ParameterTypeRequiredDefaultDescription
idstringYes-Task ID

Result Response Parameters

ParameterTypeDescription
codeintegerHTTP status code (e.g., 200 for success)
messagestringStatus message (e.g., “success”)
dataobjectThe prediction data object containing all details
data.idstringUnique identifier for the prediction
data.modelstringModel ID used for the prediction
data.outputsarray<string | object>Array of generated outputs (empty when status is not completed). Items are usually URL strings, but may be text strings or structured result objects, depending on the model.
data.urlsobjectObject containing related API endpoints
data.urls.getstringURL to poll for the prediction result
data.statusstringStatus: created, processing, completed, or failed
data.created_atstringISO timestamp of when the request was created
data.errorstringError message (empty if no error occurred)
data.timingsobjectObject containing timing details
data.timings.inferenceintegerInference time in milliseconds
© 2026 WaveSpeedAI. All rights reserved.