otter.ai 无官方 php sdk,需手动调用 rest api:先获取短期 access_token 并自动刷新,上传音频用 curlfile 发送 multipart/form-data,轮询 transcription 状态直至 completed,注意限流与文件名唯一性。

Otter.ai 没有官方 PHP SDK,得自己调 API
Otter.ai 不提供 PHP 官方 SDK,所有 PHP 集成都依赖其 REST API(https://otter.ai/api/v1/)。你不能用 composer require otterai/sdk 这类命令直接装——压根不存在这个包。必须手动构造 HTTP 请求,处理认证、上传、轮询状态等流程。
关键前提:你得先在 Otter.ai 注册账号,进入 API Settings 页面 获取 access_token(不是 API Key,是短期有效的 bearer token);该 token 默认 24 小时过期,需定期刷新(通过 /api/v1/token/refresh)。
上传音频文件要用 multipart/form-data + 正确的 Content-Type
调用 /api/v1/transcriptions 创建识别任务时,必须用 multipart/form-data 提交,且 file 字段值是原始二进制流(不是 base64),同时显式设置 Content-Type 为音频真实类型(如 audio/mpeg、audio/wav、audio/mp4)。常见错误是传了 base64 字符串或漏设 Content-Type,导致返回 400 Bad Request 或 "Invalid file format"。
实操建议:
- 用
cURL而非file_get_contents+stream_context_create,后者难控制 multipart 边界和 header -
curl_setopt($ch, CURLOPT_POSTFIELDS, ['file' => new CURLFile($path, 'audio/mpeg', 'recording.mp3')])—— 必须用CURLFile实例,不能传字符串路径 - 音频时长建议 ≤ 2 小时;超长文件可能被静默截断或失败,无明确错误提示
获取结果要轮询 /api/v1/transcriptions/{id},别硬等固定秒数
提交后 API 返回 { "id": "tr_abc123", "status": "queued" },不代表马上能取结果。Otter.ai 处理耗时取决于音频长度和当前队列压力,短音频可能 20 秒,长音频可能 5–10 分钟。不能写 sleep(30) 然后直接 GET,而应循环请求 /api/v1/transcriptions/{id} 直到 status 变成 "completed" 或 "failed"。
注意点:
- 每次轮询间隔至少 2 秒,太频繁会被限流(返回
429 Too Many Requests) - 响应体里真正文本在
data.result.text(v1 API),不是text顶层字段 - 若
status === "failed",看data.error.message,常见原因是"Unsupported audio format"(格式不支持)或"Audio too long"(超 2 小时)
PHP 中处理 token 刷新和错误重试容易漏掉边界情况
token 过期不是只发生在首次调用时——它可能在上传中途或轮询一半时失效。如果只在开头获取一次 access_token,后续请求大概率收到 401 Unauthorized 并卡死。必须把 token 刷新逻辑封装进请求函数内部,且对 401 响应做自动重试(先换 token,再重发原请求)。
另一个易忽略点:transcriptions 接口不支持并发上传同一文件名(哪怕内容不同),会返回 409 Conflict。解决方案是上传时强制用唯一文件名,比如 date('YmdHis') . '_' . uniqid() . '.mp3'。
复杂点在于:Otter.ai 的 API 文档没明说 rate limit 具体阈值,但实测每分钟超过 10 次 transcriptions 创建请求就可能触发限流;生产环境务必加本地缓存或队列削峰。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











