Published: 2026-10-20

Docs · Speech to text

Transcribe without staging the file first

One transcription alias: auto/asr, behind an OpenAI-shaped POST /v1/audio/transcriptions. It accepts a multipart upload, a public URL, or a base64 data URL, and the last of those is the one worth knowing about: it means you never have to put the audio anywhere before sending it.

The call

curl https://freemodel.online/v1/audio/transcriptions \
  -H "Authorization: Bearer sk-your-key" \
  -F "model=auto/asr" \
  -F "file=@meeting.mp3"
{ "text": "…the full transcript…" }

JSON or a URL both work as an alternative to the upload:

import base64, requests

audio = base64.b64encode(open("meeting.mp3", "rb").read()).decode()
data_url = "data:audio/mpeg;base64," + audio

r = requests.post(
    "https://freemodel.online/v1/audio/transcriptions",
    headers={"Authorization": "Bearer sk-your-key"},
    json={"model": "auto/asr", "audio_url": data_url},
)
print(r.json()["text"])

The base64 path exists because the upstream model accepts data URLs directly: verified, not assumed. Most gateways require you to host the file somewhere reachable first. That extra hop is a bucket, credentials, a lifecycle rule and a cleanup job you do not need here.

One model, so nothing can drift

auto/asr resolves to a single model. There is no candidate chain behind it, and that is consistent with how every non-chat alias here behaves: a transcription model swap would change your output silently: different punctuation, different handling of names and numbers, different segmentation. You would not get an error. You would get text that reads slightly wrong, from a pipeline you already trusted.

If the model is unavailable, the request fails and says so.

Accepted inputs

How you send itField
Multipart file uploadfile
A reachable audio URLaudio_url
Base64 data URL inlineaudio_url with a data:audio/…;base64, prefix

model is required — use auto/asr.

Bodies are capped at 25 MB and rejected with 413 before any upstream call is made. Base64 inflates the payload by roughly a third, so if your file is already close to the limit, prefer the multipart form.

Related capabilities

Same naming scheme, one alias per capability — all listed in /v1/models:

tts

auto/tts

Text to speech, returned as a temporary URL.

embedding

auto/embed

1024-dimension vectors, one candidate.

rerank

auto/rerank

Reordering retrieved documents by relevance.

image

auto/image

Text to image.

video

auto/video

Text to video, asynchronous.

Sources

Every third-party figure quoted on this site was read from the vendor documentation linked below, on the date stated. None of these links are affiliate links and none of these vendors paid to be listed. If a number here disagrees with the page it came from, the page is right — tell us and it gets corrected.

What this is

FreeModel 的 auto/asr 是免费的语音转文字 API:OpenAI 兼容的 POST /v1/audio/transcriptions。支持三种输入——文件上传、公开音频 URL、base64 data URL 内联,最后一种意味着你不必先把音频存到任何地方。

Key numbers

Call it in 3 steps

  1. 选输入:25 MB 内文件直接 multipart;不方便托管的转 base64 data URL 内联。
  2. 发送:POST /v1/audio/transcriptions,带 model=auto/asr(必填)。
  3. 取文:响应 text 字段即全文转写。

FAQ

一定要先把音频传到某个 bucket 吗?

不用。audio_url 支持 data:audio/mpeg;base64,… 内联,上游模型直接接受 data URL——省掉 bucket、凭证、生命周期规则和清理任务。

文件太大怎么办?

请求体上限 25 MB,超了直接 413。base64 内联会膨胀约三分之一,接近上限的文件用 multipart 表单上传。

模型不可用时会怎样?

直接报错。因为换转写模型会静默改变输出(标点、人名数字处理、分段都不同),而你不会收到任何错误——这种"读着有点不对"的文本比报错危险。

When to use it — and when not to

Use it when the audio is short (a meeting snippet, a voice memo, a podcast teaser) and the transcript feeds a human or a text pipeline. Three concrete cases:

Do not use it when you need word-level timestamps, speaker diarization, or live streaming. The alias exposes one transcription model and a plain text output; those features are not part of the contract. If your product needs them, pick a provider that sells them explicitly instead of bolting them onto this API.

Limits worth designing around

Cost and latency: what to expect

The alias is listed as free, which means it is backed by trial capacity rather than an unlimited guarantee. Treat it as a way to validate a pipeline, not as a permanent SLA. For sizing, measure one file first: note the upload size, the response time, and whether the output needs post-processing. Multiply by your daily file count to get the request budget; then check how the free tier behaves when quota runs out (stop, fail, or fall back).

Latency is dominated by upload and model inference, not by the gateway hop. A 5 MB file on a normal connection usually spends more time uploading than transcribing. If latency matters, transcribe close to where the audio is produced and send only the resulting text downstream.

Two more questions

Can I send a URL instead of a file? Yes — pass audio_url with a public URL, or a data: URL for inline base64. The data URL avoids hosting, at the cost of a ~33% larger request body.

What does a failed request look like? A 413 for oversized bodies, a 4xx for malformed requests, and an upstream error when the model is unavailable. Log the request id and the input size; those two fields explain most failures.