文档上传音频和视频
上传音频和视频
不超过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日