哼哼猫文档
本页内容

音视频转文字 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 只使用返回的上传请求头。

  1. 本地音频先按 文件上传指南 声明 mediaType: "audio" 申请上传,完成单次 PUT 后提交 uploadId;只有响应明确返回 upload: null 时才跳过 PUT。媒体直链无需申请上传。
  2. 用下方任一 JSON 输入 POST /transcriptions。HTTP 200 和任务 ID 表示已持久受理,文件确认、校验和音轨准备在后台继续,之后才预扣并执行。
  3. 保存 ID,每 3 秒 GET 查询一次,到 completed 或 failed 时停止。失败任务的查询仍返回 HTTP 200,原因见 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
}
字段含义
statusprocessing、completed、failed
duration验证后的音频秒数,准备完成前为 null
language完成时识别出的语言,此前为 null
apiCreditsCost本次整数报价,尚未知晓时为 null;退款后仍保留原预扣数值
billingStatusnot_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
}