文档上传音频和视频

上传音频和视频

不超过95MB的文件可以直接提交;更大的文件分块上传,最大2GB,中断后可续传。

本地音频和视频都可以上传后交给AI转录。文件不使用平台字幕,因此source只能设为auto或stt。语言和说话人分离由language、diarize控制,详见来源与转录设置。

文件格式和大小限制

支持的文件后缀为mp3、wav、m4a、flac、ogg、opus、mp4、mov、webm和mkv。提交其他后缀会收到422 unsupported_media。文件中必须有音轨,否则任务会报unsupported_media。

上传方式或限制上限
直接上传(multipart/form-data)95MB
分块上传的文件大小2GB(2,000,000,000字节),具体套餐的上限可能更低。
每个团队同时等待完成的分块上传20

文件超出上限时,接口返回413 media_too_large,并用max_bytes给出允许的最大字节数。

小文件直接上传

文件不超过95MB时,直接调用POST /v1/transcriptions,用multipart/form-data发送,文件字段名为file。需要调整设置时,在表单中添加language、diarize(true或false)、source(auto或stt)或webhook_url,这些字段均可省略。

curl -X POST "https://api.transcript1.com/v1/transcriptions?wait=60" \
  -H "Authorization: Bearer $TRANSCRIPT1_API_KEY" \
  -F [email protected] \
  -F language=en \
  -F diarize=true

接口返回转录对象,其中source.platform为upload。状态码与提交视频链接时一致:仍在处理则返回202,任务结束则返回200。提交空文件会收到422 invalid_request。

大文件分块上传

大文件可以分块发送。如果上传中断,只需补传缺失的分块,不必从头开始。流程如下。

1. 申请上传

先用JSON提交文件名和文件大小,mime_type可以不填。带上Idempotency-Key请求头,后续就能安全重试这次创建操作:

curl -X POST "https://api.transcript1.com/v1/transcriptions" \
  -H "Authorization: Bearer $TRANSCRIPT1_API_KEY" \
  -H "Idempotency-Key: interview-2026-10-13" \
  -H "Content-Type: application/json" \
  -d '{"upload":{"filename":"interview.m4a","size":48210334,"mime_type":"audio/mp4"},"language":"auto","diarize":true}'

创建成功会返回201。此时任务状态为awaiting_upload,上传信息在upload对象中:

{
  "id": "tr_8fK2Lm0PqRsTuVwXyZaBcD",
  "object": "transcription",
  "status": "awaiting_upload",
  "upload": {
    "chunk_url_template": "https://api.transcript1.com/v1/transcriptions/tr_8fK2Lm0PqRsTuVwXyZaBcD/upload/chunks/{index}",
    "headers": { "X-Upload-Token": "t1u_..." },
    "expires_at": "2026-10-13T10:30:00.000Z",
    "chunks": [
      { "index": 0, "offset": 0, "size": 8388608 },
      { "index": 1, "offset": 8388608, "size": 8388608 }
    ]
  }
}

无需自行决定如何分块。服务器会在chunks中列出每块的范围和大小,每块约8MiB(8,388,608字节);上例只展示了部分清单。X-Upload-Token仅用于本次上传,应妥善保管。它的有效期为1小时,过期时间见expires_at。

2. 按清单上传分块

逐块读取文件:从offset位置开始,取出size个字节。将chunk_url_template中的{index}替换为该块的index,向这个地址发送PUT请求。请求体使用application/octet-stream,字节数必须与清单中的size完全一致。认证只需带X-Upload-Token,不需要Authorization请求头。

curl -X PUT "https://api.transcript1.com/v1/transcriptions/tr_8fK2Lm0PqRsTuVwXyZaBcD/upload/chunks/0" \
  -H "X-Upload-Token: t1u_..." \
  -H "Content-Type: application/octet-stream" \
  --data-binary @chunk-0.bin

上传成功后,每块都会收到类似{ "object": "upload_chunk", "index": 0, "size": 8388608 }的响应。重复上传同一块会覆盖之前的数据。字节数不符或index不在清单中时,返回422 invalid_request;未带Token或Token已过期时,返回401 unauthorized。

3. 从中断处继续

调用GET /v1/transcriptions/:id/upload,检查服务器已收到哪些分块:

{
  "object": "upload",
  "status": "awaiting_upload",
  "total_bytes": 48210334,
  "uploaded_bytes": 16777216,
  "received_chunks": [0, 1],
  "chunks": [ { "index": 0, "offset": 0, "size": 8388608 } ],
  "expires_at": "2026-10-13T10:30:00.000Z"
}

对照received_chunks,补传尚未收到的分块即可。如果Token已经过期,重新发送步骤1的创建请求,保持Idempotency-Key和所有参数不变。接口会返回原来的转录任务,并附上新的上传Token。

4. 确认上传完成

curl -X POST "https://api.transcript1.com/v1/transcriptions/tr_8fK2Lm0PqRsTuVwXyZaBcD/upload/complete" \
  -H "Authorization: Bearer $TRANSCRIPT1_API_KEY"

所有分块发送完毕后,调用POST /v1/transcriptions/:id/upload/complete。服务器会逐块核对是否收到、大小是否正确,再合并文件并将转录任务加入队列。成功时返回202和转录对象。

如果返回409 upload_incomplete,按missing_chunks中的索引补传缺失分块,再次确认完成。上传已经完成或已取消时,会返回409 invalid_state。开始转录后,用GET /v1/transcriptions/:id?wait=60轮询状态,或通过Webhook接收通知。

用Python完成上传流程

import os
import requests
 
API = "https://api.transcript1.com"
auth = {"Authorization": f"Bearer {os.environ['TRANSCRIPT1_API_KEY']}"}
path = "interview.m4a"
 
created = requests.post(
    f"{API}/v1/transcriptions",
    headers={**auth, "Idempotency-Key": "interview-2026-10-13"},
    json={"upload": {"filename": os.path.basename(path), "size": os.path.getsize(path)}},
)
created.raise_for_status()
transcription = created.json()
upload = transcription["upload"]
 
with open(path, "rb") as file:
    for chunk in upload["chunks"]:
        file.seek(chunk["offset"])
        url = upload["chunk_url_template"].replace("{index}", str(chunk["index"]))
        response = requests.put(
            url,
            data=file.read(chunk["size"]),
            headers={**upload["headers"], "Content-Type": "application/octet-stream"},
        )
        response.raise_for_status()
 
done = requests.post(f"{API}/v1/transcriptions/{transcription['id']}/upload/complete", headers=auth)
done.raise_for_status()
print(done.json()["status"])

上传配额和文件保留时间

  • 每个团队同时最多有20个上传处于awaiting_upload状态。超过这个数量,创建接口会返回429 too_many_active_jobs,并带上Retry-After响应头。
  • 上传创建后24小时内未完成,系统会取消任务并删除已上传的分块。
  • 任务进入completed、failed或canceled状态24小时后,系统会删除上传的音频或视频。转录文本会保留,直到调用DELETE /v1/transcriptions/:id删除。
  • 如果转录失败或被取消,就不会扣费。文件时长确定后,按录音或视频的分钟数向上取整扣费。详见计费与限制。

最后更新 2026年10月14日