了解如何在 Google Cloud上执行光学字符识别 (OCR)。本教程演示如何将图片文件上传到 Cloud Storage、使用 Cloud Vision API 从图片中提取文本、使用 Google Cloud Translation API 翻译文本以及将译文保存回 Cloud Storage。Pub/Sub 用于将各种任务加入队列,并触发适当的 Cloud Run functions 来执行这些任务。
如需详细了解如何发送文本检测 (OCR) 请求,请参阅检测图片中的文本、检测图片中的手写内容或 检测文件中的文本 (PDF/TIFF)。
目标
- 编写和部署多个后台 Cloud Run functions 函数。
- 将图片上传到 Cloud Storage。
- 提取、翻译和保存上传的图片中包含的文本。
费用
在本文档中,您将使用 Google Cloud的以下收费组件:
- Cloud Run functions
- Pub/Sub
- Cloud Storage
- Cloud Translation API
- Cloud Vision
如需根据您的预计使用情况来估算费用,请使用价格计算器。
准备工作
- 登录您的 Google Cloud 账号。如果您是 Google Cloud新手,请 创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Cloud Functions, Cloud Build, Cloud Pub/Sub, Cloud Storage, Cloud Translation, and Cloud Vision APIs.
Roles required to enable APIs
To enable APIs, you need the
serviceusage.services.enablepermission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.-
安装 Google Cloud CLI。
-
如果您使用的是外部身份提供方 (IdP),则必须先使用联合身份登录 gcloud CLI。
-
如需初始化 gcloud CLI,请运行以下命令:
gcloud init -
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Cloud Functions, Cloud Build, Cloud Pub/Sub, Cloud Storage, Cloud Translation, and Cloud Vision APIs.
Roles required to enable APIs
To enable APIs, you need the
serviceusage.services.enablepermission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.-
安装 Google Cloud CLI。
-
如果您使用的是外部身份提供方 (IdP),则必须先使用联合身份登录 gcloud CLI。
-
如需初始化 gcloud CLI,请运行以下命令:
gcloud init - 准备开发环境。
如果您已经安装 gcloud CLI,请运行以下命令进行更新:
gcloud components update
直观呈现数据流
OCR 教程应用中的数据流涉及以下几个步骤:
- 包含任何语言文本的图片都会上传到 Cloud Storage。
- 触发一个 Cloud Run functions,该函数使用 Vision API 来提取文本并检测源语言。
- 向 Cloud Pub/Sub 主题发布消息后,文本会被加入队列等待翻译。系统会针对与源语言不同的每种目标语言将翻译加入队列中。
- 如果目标语言与源语言匹配,系统会跳过翻译队列,然后将文本发送到结果队列,即另一个 Pub/Sub 主题。
- Cloud Run functions 函数使用 Translation API 对翻译队列中的文本进行翻译。翻译后的结果将发送到结果队列。
- 另一个 Cloud Run functions 会将结果队列中的译文保存到 Cloud Storage。
- 您可以在 Cloud Storage 中找到每个翻译的结果(采用文本文件形式)。
直观展示上述步骤可能有所帮助:
准备应用
创建一个 Cloud Storage 存储桶以向其中上传图片,其中
YOUR_IMAGE_BUCKET_NAME是全局唯一的存储桶名称:gcloud storage buckets create gs://
YOUR_IMAGE_BUCKET_NAME创建一个 Cloud Storage 存储桶以将文本译文保存到该存储桶,其中
YOUR_RESULT_BUCKET_NAME是全局唯一的存储桶名称:gcloud storage buckets create gs://
YOUR_RESULT_BUCKET_NAME创建一个 Pub/Sub 主题以向其发布翻译请求,其中
YOUR_TRANSLATE_TOPIC_NAME是翻译请求主题的名称:gcloud pubsub topics create
YOUR_TRANSLATE_TOPIC_NAME创建一个 Pub/Sub 主题以向其发布已完成的翻译结果,其中
YOUR_RESULT_TOPIC_NAME是翻译结果主题的名称:gcloud pubsub topics create
YOUR_RESULT_TOPIC_NAME将示例应用代码库克隆到本地机器:
Node.js
git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git
或者,您也可以下载该示例的 zip 文件并将其解压缩。
Python
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
或者,您也可以下载该示例的 zip 文件并将其解压缩。
Go
git clone https://github.com/GoogleCloudPlatform/golang-samples.git
或者,您也可以下载该示例的 zip 文件并将其解压缩。
Java
git clone https://github.com/GoogleCloudPlatform/java-docs-samples.git
或者,您也可以下载该示例的 zip 文件并将其解压缩。
切换到包含 Cloud Run functions 函数示例代码的目录:
Node.js
cd nodejs-docs-samples/functions/ocr/app/
Python
cd python-docs-samples/functions/ocr/app/
Go
cd golang-samples/functions/ocr/app/
Java
cd java-docs-samples/functions/ocr/ocr-process-image/
了解代码
导入依赖项
应用必须导入多个依赖项才能与 Google Cloud Platform 服务进行通信:
Node.js
Python
Go
Java
处理图片
以下函数会从 Cloud Storage 中读取一个上传的图片文件,并调用一个函数来检测该图片是否含有文本:
Node.js
Python
Go
Java
以下函数使用 Vision API 从图片中提取文本,然后将文本加入队列中以进行翻译:
Node.js
Python
Go
Java
翻译文本
以下函数会翻译提取的文本,并将译文加入队列以保存回 Cloud Storage:
Node.js
Python
Go
Java
保存译文
最后,以下函数会接收译文并将其保存回 Cloud Storage:
Node.js
Python
Go
Java
部署函数
如需部署带有 Cloud Storage 触发器的图片处理函数,请在包含示例代码(如果是 Java,则为
pom.xml文件)的目录中运行以下命令:Node.js
gcloud functions deploy ocr-extract \ --runtime nodejs22 \
--trigger-bucket YOUR_IMAGE_BUCKET_NAME \
--entry-point processImage \
--set-env-vars "^:^GCP_PROJECT=YOUR_GCP_PROJECT_ID:TRANSLATE_TOPIC=YOUR_TRANSLATE_TOPIC_NAME:RESULT_TOPIC=YOUR_RESULT_TOPIC_NAME:TO_LANG=es,en,fr,ja"使用
--runtime标志可以指定支持的 Node.js 版本的运行时 ID 来运行您的函数。Python
gcloud functions deploy ocr-extract \ --runtime python312 \
--trigger-bucket YOUR_IMAGE_BUCKET_NAME \
--entry-point process_image \
--set-env-vars "^:^GCP_PROJECT=YOUR_GCP_PROJECT_ID:TRANSLATE_TOPIC=YOUR_TRANSLATE_TOPIC_NAME:RESULT_TOPIC=YOUR_RESULT_TOPIC_NAME:TO_LANG=es,en,fr,ja"使用
--runtime标志可以指定支持的 Python 版本的运行时 ID 来运行您的函数。Go
gcloud functions deploy ocr-extract \ --runtime go121 \
--trigger-bucket YOUR_IMAGE_BUCKET_NAME \
--entry-point ProcessImage \
--set-env-vars "^:^GCP_PROJECT=YOUR_GCP_PROJECT_ID:TRANSLATE_TOPIC=YOUR_TRANSLATE_TOPIC_NAME:RESULT_TOPIC=YOUR_RESULT_TOPIC_NAME:TO_LANG=es,en,fr,ja"Java
gcloud functions deploy ocr-extract \ --entry-point functions.OcrProcessImage \ --runtime java17 \ --memory 512MB \
--trigger-bucket YOUR_IMAGE_BUCKET_NAME \
--set-env-vars "^:^GCP_PROJECT=YOUR_GCP_PROJECT_ID:TRANSLATE_TOPIC=YOUR_TRANSLATE_TOPIC_NAME:RESULT_TOPIC=YOUR_RESULT_TOPIC_NAME:TO_LANG=es,en,fr,ja"使用
--runtime标志可以指定支持的 Java 版本的运行时 ID 来运行您的函数。其中,
YOUR_IMAGE_BUCKET_NAME是您要将图片上传到的 Cloud Storage 存储桶的名称。如需部署带有 Pub/Sub 触发器的文本翻译函数,请在包含示例代码(如果是 Java,则为
pom.xml文件)的目录中运行以下命令:Node.js
gcloud functions deploy ocr-translate \ --runtime nodejs22 \
--trigger-topic YOUR_TRANSLATE_TOPIC_NAME \
--entry-point translateText \
--set-env-vars "GCP_PROJECT=YOUR_GCP_PROJECT_ID,RESULT_TOPIC=YOUR_RESULT_TOPIC_NAME"使用
--runtime标志可以指定支持的 Node.js 版本的运行时 ID 来运行您的函数。Python
gcloud functions deploy ocr-translate \ --runtime python312 \
--trigger-topic YOUR_TRANSLATE_TOPIC_NAME \
--entry-point translate_text \
--set-env-vars "GCP_PROJECT=YOUR_GCP_PROJECT_ID,RESULT_TOPIC=YOUR_RESULT_TOPIC_NAME"使用
--runtime标志可以指定支持的 Python 版本的运行时 ID 来运行您的函数。Go
gcloud functions deploy ocr-translate \ --runtime go121 \
--trigger-topic YOUR_TRANSLATE_TOPIC_NAME \
--entry-point TranslateText \
--set-env-vars "GCP_PROJECT=YOUR_GCP_PROJECT_ID,RESULT_TOPIC=YOUR_RESULT_TOPIC_NAME"Java
gcloud functions deploy ocr-translate \ --entry-point functions.OcrTranslateText \ --runtime java17 \ --memory 512MB \
--trigger-topic YOUR_TRANSLATE_TOPIC_NAME \
--set-env-vars "GCP_PROJECT=YOUR_GCP_PROJECT_ID,RESULT_TOPIC=YOUR_RESULT_TOPIC_NAME"使用
--runtime标志可以指定支持的 Java 版本的运行时 ID 来运行您的函数。如需部署带有 Cloud Pub/Sub 触发器、将结果保存到 Cloud Storage 的函数,请在包含示例代码(如果是 Java,则为
pom.xml文件)的目录中运行以下命令:Node.js
gcloud functions deploy ocr-save \ --runtime nodejs22 \
--trigger-topic YOUR_RESULT_TOPIC_NAME \
--entry-point saveResult \
--set-env-vars "GCP_PROJECT=YOUR_GCP_PROJECT_ID,RESULT_BUCKET=YOUR_RESULT_BUCKET_NAME"使用
--runtime标志可以指定支持的 Node.js 版本的运行时 ID 来运行您的函数。Python
gcloud functions deploy ocr-save \ --runtime python312 \
--trigger-topic YOUR_RESULT_TOPIC_NAME \
--entry-point save_result \
--set-env-vars "GCP_PROJECT=YOUR_GCP_PROJECT_ID,RESULT_BUCKET=YOUR_RESULT_BUCKET_NAME"使用
--runtime标志可以指定支持的 Python 版本的运行时 ID 来运行您的函数。Go
gcloud functions deploy ocr-save \ --runtime go121 \
--trigger-topic YOUR_RESULT_TOPIC_NAME \
--entry-point SaveResult \
--set-env-vars "GCP_PROJECT=YOUR_GCP_PROJECT_ID,RESULT_BUCKET=YOUR_RESULT_BUCKET_NAME"Java
gcloud functions deploy ocr-save \ --entry-point functions.OcrSaveResult \ --runtime java17 \ --memory 512MB \
--trigger-topic YOUR_RESULT_TOPIC_NAME \
--set-env-vars "GCP_PROJECT=YOUR_GCP_PROJECT_ID,RESULT_BUCKET=YOUR_RESULT_BUCKET_NAME"使用
--runtime标志可以指定支持的 Java 版本的运行时 ID 来运行您的函数。
上传图片
将一张图片上传到您的图片 Cloud Storage 存储桶:
gcloud storage cp
PATH_TO_IMAGEgs://YOUR_IMAGE_BUCKET_NAME其中
PATH_TO_IMAGE是本地系统上的图片文件(其中包含文本)的路径。YOUR_IMAGE_BUCKET_NAME是您要向其中上传图片的存储桶的名称。
您可以从示例项目中下载一张图片。
查看日志以确保执行完成:
gcloud functions logs read --limit 100
您可以在用于
YOUR_RESULT_BUCKET_NAME的 Cloud Storage 存储桶中查看保存的译文。
清理
为避免因本教程中使用的资源导致您的 Google Cloud 账号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。
删除项目
为了避免产生费用,最简单的方法是删除您为本教程创建的项目。
要删除项目,请执行以下操作:
- 在 Google Cloud 控制台中,前往管理资源页面。
- 在项目列表中,选择要删除的项目,然后点击删除。
- 在对话框中输入项目 ID,然后点击关闭以删除项目。
删除函数
删除 Cloud Run functions 不会移除存储在 Cloud Storage 中的任何资源。
如需删除您在本教程中创建的 Cloud Run functions,请运行以下命令:
gcloud functions delete ocr-extract gcloud functions delete ocr-translate gcloud functions delete ocr-save
您也可以通过 Google Cloud 控制台删除 Cloud Run functions。