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 it | Field |
|---|---|
| Multipart file upload | file |
| A reachable audio URL | audio_url |
| Base64 data URL inline | audio_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:
auto/tts
Text to speech, returned as a temporary URL.
auto/embed
1024-dimension vectors, one candidate.
auto/rerank
Reordering retrieved documents by relevance.
auto/image
Text to image.
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.
- OpenRouter — credit-purchase fees and free-model rate limits
- OpenRouter — rate-limit reference
- OpenRouter — public model list
- LiteLLM — licence, deployment options and supported models
- Cloudflare AI Gateway — features and pricing
- Vercel AI Gateway — features
- Portkey — plans
- Helicone — plans
- Model Context Protocol — specification
- OpenAI Python SDK — base_url and OPENAI_BASE_URL
- Anthropic Messages API — request format
What this is
FreeModel 的 auto/asr 是免费的语音转文字 API:OpenAI 兼容的 POST /v1/audio/transcriptions。支持三种输入——文件上传、公开音频 URL、base64 data URL 内联,最后一种意味着你不必先把音频存到任何地方。
Key numbers
- 3 种输入方式:multipart
file上传 /audio_url公开 URL /audio_url传data:audio/…;base64,内联。 - 请求体上限 25 MB:超了直接 413,且在调用上游之前就拒绝。
- base64 会把体积膨胀约三分之一:文件接近上限时优先用 multipart。
- 别名后固定 1 个模型,无候选链;模型不可用时请求直接失败并说明,不静默换。
Call it in 3 steps
- 选输入:25 MB 内文件直接 multipart;不方便托管的转 base64 data URL 内联。
- 发送:
POST /v1/audio/transcriptions,带model=auto/asr(必填)。 - 取文:响应
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:
- Voice memos into notes: one 3-minute file, one request, one text field. No storage, no cleanup job.
- Support call transcripts: upload the recording, feed
textinto your summarizer, keep the transcript next to the ticket. - Batch archive indexing: transcribe once, index the text, delete the audio if policy allows.
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
- 25 MB request cap: checked before the upstream call, so an oversized file fails fast and costs nothing.
- One model per alias: transcription output style is stable until the alias version changes; a silent model swap would change punctuation and numbers without an error.
- Sync request: a long file holds the HTTP connection open. Split anything above 20 minutes into segments and transcribe them in parallel.
- No built-in retry: a failed request returns an error. Retry with backoff on 429/5xx, and do not retry 4xx validation errors.
- Data path: the audio goes to the gateway and then to the upstream provider. Do not send audio you are not allowed to send to a third party.
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.