本页内容
音视频转文字 API
引用已上传的音频,或提交音视频文件直链,创建异步转录任务。默认自动识别语言,也可指定语言代码;开启 speakerLabels 后识别说话人,人数由模型自动判断。
本能力仅通过 REST 提供,不提供 MCP 工具或开发者回调。使用现有 API Key 和 API 积分,与网站、桌面端的 AI 积分分开。单价见 开发者管理中心 的「计费规则」。
接口与流程
| 接口 | 用途 |
|---|---|
POST /openapi/v1/uploads | 申请可复用上传 ID 和可选的单次 PUT 地址 |
POST /openapi/v1/transcriptions | 提交已上传音频 ID 或媒体直链,返回任务 ID |
GET /openapi/v1/transcriptions/{id} | 免费查询任务状态与结果 |
接口地址以 https://api.meowload.net 开头,鉴权为 Authorization: Bearer <你的 API Key>。只有 API 请求携带该 Key,存储 PUT 只使用返回的上传请求头。
- 本地音频先按 文件上传指南 声明
mediaType: "audio"申请上传,完成单次 PUT 后提交 uploadId;只有响应明确返回upload: null时才跳过 PUT。媒体直链无需申请上传。 - 用下方任一 JSON 输入 POST
/transcriptions。HTTP200和任务 ID 表示已持久受理,文件确认、校验和音轨准备在后台继续,之后才预扣并执行。 - 保存 ID,每 3 秒 GET 查询一次,到
completed或failed时停止。失败任务的查询仍返回 HTTP200,原因见error;停止轮询不会取消任务。
每次任务 POST 创建独立任务并分别计费,包括重复引用同一 uploadId 或直链。首版不提供公开 requestId 或 Idempotency-Key。不要自动重试 POST:回包丢失时服务端可能已经受理,再提交可能重复任务与收费。拿到任务 ID 后保存它,只重试免费的 GET。
输入参数
两种来源均使用 Content-Type: application/json,正文最多 64 KiB,必须二选一。此接口不接收 multipart 文件正文。
| 字段 | 规则 |
|---|---|
uploadId | 上传音频时必填,来自 /uploads、属于本用户的 24 位 ID;不与 fileUrl 或 fileHeaders 同传 |
fileUrl | 直链输入必填,HTTP(S) 音视频文件地址,最多 4096 字符 |
fileHeaders | 仅直链输入可选,最多 32 个头,每个值最多 8192 个 UTF-8 字节,名称和值合计最多 16384 字节 |
language | 可选,默认 auto;支持 zh、en 等语言代码,不区分大小写 |
speakerLabels | 可选布尔值,默认 false;不接受指定说话人数 |
两种来源的原文件和准备后音频均最多 1 GiB(1,073,741,824 字节)。大小通过不代表任意时长的音频都保证处理成功。
uploadId 输入必须是真实音频:纯音频的 M4A/MP4 容器或附带封面的音频可按音频处理;有真实视频轨道则不接受。本地视频应先提取音轨再上传,或自行提供音视频文件直链。不能用通用视频 uploadId 转录。
直链输入支持音频和带有效音轨的视频。不支持网页、直播流和播放列表,网页需先用 单帖提取 获得媒体直链;有独立音频时优先使用,并保持地址在后台下载期间有效。
来源请求头仅用于下载文件。拒绝受限请求头,跨源跳转时移除认证信息;不要传入哼哼猫 API Key 或内部凭据。语言全名、en-US 等地区码、未知语言码或未知字段返回 422,完整代码列表见 API 参考。
不接受自报时长、价格、模型、说话人数或内部素材 ID。计费使用验证后的真实音频时长,不提供模型选择。
提交已上传音频
按 文件上传指南 完成单次 PUT 后:
curl https://api.meowload.net/openapi/v1/transcriptions \
-H 'Authorization: Bearer <你的 API Key>' \
-H 'Content-Type: application/json' \
-d '{"uploadId":"0123456789abcdefghijklmn","language":"auto","speakerLabels":false}'不需要公开 complete 或上传状态查询,由任务在后台确认、验证文件。同一有效 uploadId 可以创建多个独立任务,仍须满足当前归属和源文件可用性;不额外设置固定 24 小时业务禁用期限,也不承诺永久保存。
提交媒体直链
curl https://api.meowload.net/openapi/v1/transcriptions \
-H 'Authorization: Bearer <你的 API Key>' \
-H 'Content-Type: application/json' \
-d '{"fileUrl":"https://media.example.com/meeting.mp4","language":"auto","speakerLabels":false}'源文件需要请求头时,在 JSON 中附加 "fileHeaders":{"Referer":"https://example.com/"}。
受理响应
{"id":"0123456789abcdefghijklmn","status":"processing"}任务 ID 是 24 位不透明字符串,后续查询时原样使用。
查询与结果
curl https://api.meowload.net/openapi/v1/transcriptions/0123456789abcdefghijklmn \
-H 'Authorization: Bearer <你的 API Key>' \
-H 'Accept-Language: zh'开启说话人识别的完成示例:
{
"id": "0123456789abcdefghijklmn",
"status": "completed",
"duration": 15.2,
"language": "zh",
"apiCreditsCost": 3,
"billingStatus": "settled",
"result": {
"text": "大家好,今天开始讨论。",
"segments": [
{"id": 0, "start": 0, "end": 3.2, "speaker": "speaker_0", "text": "大家好,今天开始讨论。"}
]
},
"error": null
}| 字段 | 含义 |
|---|---|
status | processing、completed、failed |
duration | 验证后的音频秒数,准备完成前为 null |
language | 完成时识别出的语言,此前为 null |
apiCreditsCost | 本次整数报价,尚未知晓时为 null;退款后仍保留原预扣数值 |
billingStatus | not_charged 未扣费、reserved 已预扣、settled 成功结算、refunded 已退回原预扣 |
result | 完成前为 null;完成后为原始全文和分段,不返回源音频地址 |
result.segments | 时间单位为秒,start/end 无有效值时可为 null;关闭说话人识别时不保证 speaker |
error | 非失败状态为 null;失败时为 { "message": "…", "code": "snake_case" } |
没有识别到语音的合法音频可以成功返回空文字,segments 为 null 或空数组,仍按音频时长计费。可按分段自行生成 SRT/VTT,本接口不额外提供字幕下载端点。
同一用户的不同 Key 可查询自己的任务,轮换 Key 不影响查询;余额为 0 也可查询。别人的任务及不存在的 ID 均返回 404,Web/桌面端任务不会出现在此接口。首版不新增固定的任务正文到期日,也不承诺永久保存;请自行保存所需结果。
费用和错误
按验证后的真实音频时长向上取整到整分钟,在执行前预扣 API 积分。准备失败不扣费;准备后余额不足,任务以 failed 和 insufficient_api_credits 结束,充值后需重新提交;不会等待充值后自动执行。预扣后执行明确失败,退还原预扣。网络超时或受理结果暂不明确时保持 processing,不会据此直接退款。
异步失败示例,HTTP 200:
{
"id": "0123456789abcdefghijklmn",
"status": "failed",
"duration": null,
"language": null,
"apiCreditsCost": null,
"billingStatus": "not_charged",
"result": null,
"error": {"message":"视频没有音轨","code":"audio_track_missing"}
}audio_track_missing 表示视频无音轨;file_too_large 表示超限;源下载失败、准备超时或转录失败也会返回明确原因码。按 error.code 分支,不解析消息文字。
请求本身出错使用非 200 和 {message, code?, detail?}:401 无效 Key、402 API 积分不足、422 参数错误、429 每 Key 频控、503 尚未受理时服务不可用。具体以 API 参考 为准,提取接口的 retryable 不适用于转录任务。
JavaScript:提交一次并轮询
Node.js 18 及以上可直接使用 fetch。示例只发送一次 POST,拿到 ID 后打印并定期免费查询;网络异常时先保留已有 ID,再自行恢复 GET。
const base = "https://api.meowload.net/openapi/v1"
const headers = { Authorization: "Bearer <你的 API Key>" }
const response = await fetch(`${base}/transcriptions`, {
method: "POST",
headers: { ...headers, "Content-Type": "application/json" },
body: JSON.stringify({ fileUrl: "https://media.example.com/meeting.mp3" }),
})
if (!response.ok) throw new Error(`Create failed: ${response.status} ${await response.text()}`)
const { id } = await response.json()
console.log("Save this task ID:", id)
for (;;) {
await new Promise(resolve => setTimeout(resolve, 3000))
const query = await fetch(`${base}/transcriptions/${id}`, { headers })
if (!query.ok) throw new Error(`Query failed: ${query.status} ${await query.text()}`)
const task = await query.json()
if (task.status === "processing") continue
if (task.status === "failed") throw new Error(`${task.error.code}: ${task.error.message}`)
console.log(task.result.text)
break
}