Introduction
It transcribes the sung lyrics in an audio file and returns them as text on the task. It is tuned for vocals over music rather than for plain speech.
HeartMuLa Transcribe extracts sung lyrics from an audio file and returns them as text. One audio field, no options, multilingual, billed per transcription rather than per minute.
Key features & highlights
Tuned for the part general speech models lose
A sung line arrives compressed, doubled, drenched in reverb and competing with instruments in its own frequency range. That is the case a general speech model was never trained on, and where it tends to hand back fragments. This one is tuned for exactly that. The trade runs both ways: for an interview or a podcast, with no mix to fight, a general speech-to-text model is the better tool.
Text on the task, no asset to fetch
No file is written for you to fetch. The run ends on the task itself, with the transcript sitting in the result: no download step, no bucket to write into, and nothing from it entering the 14-day media retention. Read the text off the finished task and send it straight to wherever your lyrics already live.
A back catalog is a multiplication, a clip pile is not
Duration never enters the price, so a six-minute track costs what a twenty-second hook costs. That makes a backlog easy to budget — track count times one number — while a folder of short fragments is the relatively expensive shape. Worth planning for: a piece that turns out to be instrumental comes back nearly empty and still counts as a successful, billed run, so screen those out before you queue them.
Request parameters
| Parameter | Required | Description |
|---|---|---|
audio_url | Yes | A URL that resolves directly to an audio file. Pages that return HTML fail as an invalid asset. at least 1 characters |
Pricing
$0.05 / transcription
Billed per transcription, not per minute: a thin transcript from an instrumental track is still charged.
Use cases
Turn speech into usable text
It transcribes the sung lyrics in an audio file and returns them as text on the task. It is tuned for vocals over music rather than for plain speech. Use this mode to transcribe an audio or video source. Provide a clear recording where possible, then review names, timestamps and any passages with low confidence.
Uncensored audio products
SpicyAPI applies no content filter, so lyrics with strong language come back transcribed rather than refused or bowdlerised. You are still responsible for the rights to the audio you send.
Music catalog metadata
Generate lyric text across a catalog to improve search, display and tagging. Per-run pricing makes the cost of a backlog a simple multiplication instead of a function of total runtime.
Subtitles for music-backed video
Pull the sung lines out of a track so they can be timed into captions for short-form video, where the vocal sits over a dense mix.
Prompt guide & pro tips
Send a direct URL to the audio file
The field takes a URL, not an upload body. It should point at the audio itself — a stream page or a share link that returns HTML will fail as an invalid asset, not as a bad transcription.
Expect text on the task, not a file
The transcript is returned as text on the task result. There is no media asset to fetch, and nothing is stored in media retention for this endpoint.
Check the result before iterating
One audio URL in, lyric text out, nothing to configure: no language hint, no timestamps, no speaker labels, no confidence values and no choice of output shape. The model is tuned for sung vocals over music; heavily layered mixes, whispered or screamed vocals and very low-bitrate sources degrade the result, and instrumental audio returns little or nothing. The URL must resolve directly to an audio file — a page that returns HTML fails as an invalid asset. This endpoint produces no media asset, so nothing from it appears in the 14-day media retention.
API quick start
# Generate the idempotency key once; reuse it when retrying after a lost response.
export SPICY_IDEMPOTENCY_KEY="${SPICY_IDEMPOTENCY_KEY:-$(uuidgen)}"
curl -X POST https://api.spicyapi.ai/api/v1/jobs/createTask \
-H "Authorization: Bearer $SPICY_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $SPICY_IDEMPOTENCY_KEY" \
-d '{
"model": "heartmula/transcribe/speech-to-text",
"input": {
"audio_url": "https://example.com/reference.mp3"
}
}'
# Copy data.taskId from the response into TASK_ID, then poll the status.
TASK_ID="TASK_ID_FROM_RESPONSE"
curl "https://api.spicyapi.ai/api/v1/jobs/recordInfo?taskId=$TASK_ID" \
-H "Authorization: Bearer $SPICY_API_KEY"
See the API reference for authentication, the complete schema, polling, and error handling.
