Google API 如何统计 Android OCR 请求并收费?
明确结论
com.google.android.gms:play-services-vision:10.0.1 使用的是 Android 端的 Mobile Vision API。OCR 在设备本地完成,不会把每一帧图片发送到 Google Cloud Vision API。因此:
- 不需要 Google API Key、Cloud 项目或付款方式;
- Google 不会按 OCR 调用次数收费;
- 不存在”每月前 1000 次免费,超出后收费或停止识别”的限制。
按请求计费的是通过网络调用的 Google Cloud Vision API,与这个 Android 本地 OCR 组件无关。
为什么没有 API Key
教程中的 TextRecognizer 通过 Google Play services 在设备端识别文字:
TextRecognizer textRecognizer =
new TextRecognizer.Builder(context).build();
if (!textRecognizer.isOperational()) {
// 识别组件尚未准备好,或者设备环境不满足要求
}
图片数据会直接交给本地识别器:
Frame frame = new Frame.Builder()
.setBitmap(bitmap)
.build();
SparseArray<TextBlock> textBlocks = textRecognizer.detect(frame);
这里的 detect() 是本地方法调用,并非 Cloud Vision API 的 HTTP 请求。即使连续处理摄像头画面,也不会因调用次数增加而产生 Cloud Vision API 费用。
有些设备需要通过 Google Play services 下载 OCR 模型或相关组件,首次使用时 isOperational() 可能暂时返回 false。这是组件下载,与按 OCR 请求计费无关。
使用完毕后,应释放识别器:
textRecognizer.release();
哪种情况才会按请求收费
只有应用或后端主动调用 Google Cloud Vision API,才会涉及云端配额和计费。例如,请求可能发送到下面这样的服务端接口:
POST https://vision.googleapis.com/v1/images:annotate
典型的云端调用流程包括:
- 创建 Google Cloud 项目;
- 启用 Cloud Vision API;
- 为项目启用结算;
- 使用 API Key、OAuth 2.0 或服务账号进行身份认证;
- 将图片或 Cloud Storage 地址提交到云端;
- Google Cloud 根据项目、功能和请求量统计用量。
云端 OCR 的计费单位和免费额度可能随时间、地区及具体功能变化,应以实际调用时的官方定价和配额页面为准。
超过免费额度后会怎样
当前使用的是 Mobile Vision 本地实现,没有免费额度耗尽的问题。即使识别次数超过 1000 次,Google 也不会按照云端计费规则阻止识别。
如果改用 Cloud Vision API,超过免费额度后的情况取决于项目配置:
- 已启用有效结算:请求通常会继续处理,并按适用价格收费;
- 未启用结算或结算账户无效:请求可能失败;
- 达到项目配额或人为设置的用量上限:请求可能返回配额错误;
- 触发速率限制:可能暂时返回
429 Too Many Requests等错误。
免费额度并不一定是硬性调用上限。
新项目应考虑迁移到 ML Kit
play-services-vision:10.0.1 是一个很旧的依赖,Mobile Vision API 也已有后续替代方案。新项目建议使用 ML Kit Text Recognition,并按需求选择模型交付方式:
- Bundled 模型:模型随应用打包,安装后通常可以立即使用,但会增加应用体积;
- Google Play services 模型:应用体积较小,但首次识别前可能需要下载模型。
ML Kit 的设备端文字识别同样主要在本地完成,不应与 Google Cloud Vision API 的按请求计费混淆。具体依赖版本应查阅最新官方文档,不建议继续沿用旧教程中的版本号。
注意事项
- 不要仅凭产品名称中的
"Google OCR"判断是否收费,应先确认识别是在设备端还是云端执行。 - 本地 OCR 消耗的主要是设备的 CPU、内存、电量和模型存储空间,不会产生云端请求费用。
- 如果以后改用 Cloud Vision API,不要将服务账号私钥直接放进 Android APK。APK 很容易被反编译,使用服务账号的调用应放在受控后端。
- 即使使用受限制的 API Key,也应设置应用限制、API 限制、配额和预算告警。
- 判断本地识别是否需要联网时,应区分”首次下载模型”和”上传图片执行识别”。需要下载模型,不代表每次识别都会调用付费云 API。
备注:内容仅供参考。
