您将了解如何在 Google Cloud Platform 上执行光学字符识别 (OCR)。本教程演示如何将图片文件上传到 Cloud Storage、使用 Cloud Vision 从图片中提取文本、使用 Cloud Translation API 翻译文本以及将译文保存回 Cloud Storage。Pub/Sub 用于将各种任务加入队列,并触发适当的 Cloud Functions 函数来执行这些任务。
如需详细了解如何发送文本检测 (OCR) 请求,请参阅检测图片中的文本、检测图片中的手写内容或 检测文件中的文本 (PDF/TIFF)。
目标
- 编写和部署多个事件驱动型函数。
- 将图片上传到 Cloud Storage。
- 提取、翻译和保存上传的图片中包含的文本。
费用
在本文档中,您将使用 Google Cloud 的以下收费组件:
- Cloud Functions
- Cloud Build
- Pub/Sub
- Artifact Registry
- Eventarc
- Cloud Run
- Cloud Logging
- 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.
-
Enable the Cloud Functions, Cloud Build, Cloud Run, Artifact Registry, Eventarc, Logging, Pub/Sub, Cloud Storage, Cloud Translation, and Cloud Vision APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Enable the Cloud Functions, Cloud Build, Cloud Run, Artifact Registry, Eventarc, Logging, Pub/Sub, Cloud Storage, Cloud Translation, and Cloud Vision APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
- 准备开发环境。
如果您已经安装 gcloud CLI,请运行以下命令进行更新:
gcloud components update
直观呈现数据流
OCR 教程应用中的数据流涉及以下几个步骤:
- 包含任何语言文本的图片都会上传到 Cloud Storage。
- 触发一个 Cloud Functions 函数,该函数使用 Vision API 来提取文本并检测源语言。
- 向 Cloud Pub/Sub 主题发布消息后,文本会被加入队列等待翻译。系统会针对与源语言不同的每种目标语言将翻译加入队列中。
- 如果目标语言与源语言匹配,系统会跳过翻译队列,然后将文本发送到结果队列,即另一个 Pub/Sub 主题。
- Cloud Functions 函数使用 Translation API 对翻译队列中的文本进行翻译。翻译后的结果将发送到结果队列。
- 另一个 Cloud Functions 函数会将结果队列中的译文保存到 Cloud Storage。
- 您可以在 Cloud Storage 中找到每个翻译的结果(采用文本文件形式)。
直观展示上述步骤可能有所帮助:
准备应用
创建一个 Cloud Storage 存储分区以向其中上传图片,其中
YOUR_IMAGE_BUCKET_NAME
是全局唯一的存储分区名称:gsutil mb gs://
YOUR_IMAGE_BUCKET_NAME
创建一个 Cloud Storage 存储分区以将文本译文保存到该存储分区,其中
YOUR_RESULT_BUCKET_NAME
是全局唯一的存储分区名称:gsutil mb gs://
YOUR_RESULT_BUCKET_NAME
创建一个 Cloud Pub/Sub 主题以向其发布翻译请求,其中
YOUR_TRANSLATE_TOPIC_NAME
是翻译请求主题的名称:gcloud pubsub topics create
YOUR_TRANSLATE_TOPIC_NAME
创建一个 Cloud 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 Functions 函数示例代码的目录:
Node.js
cd nodejs-docs-samples/functions/v2/ocr/app/
Python
cd python-docs-samples/functions/v2/ocr/
Go
cd golang-samples/functions/functionsv2/ocr/app/
Java
cd java-docs-samples/functions/v2/ocr/ocr-process-image/
了解代码
本部分介绍构成 OCR 示例的依赖项和函数。
导入依赖项
应用必须导入多个依赖项才能与 Google Cloud Platform 服务进行通信:
Node.js
Python
Go
Java
处理图片
以下函数会从 Cloud Storage 中读取一个上传的图片文件,并调用一个函数来检测该图片是否含有文本:
Node.js
Python
Go
Java
以下函数使用 Cloud 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
文件)的目录中运行以下命令:// LINT.IfChange(nodejs_version) // LINT.ThenChange(:nodejs_version_console_text) // LINT.IfChange(nodejs_version_console_text) // LINT.ThenChange(:nodejs_version) // LINT.IfChange(nodejs_version) // LINT.ThenChange(:nodejs_version_console_text) // LINT.IfChange(nodejs_version_console_text) // LINT.ThenChange(:nodejs_version)
Node.js
gcloud functions deploy ocr-extract \ --gen2 \ --runtime=nodejs20 \ --region=
REGION
\ --source=. \ --entry-point=processImage \
--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
标志可以指定支持的 Node.js 版本的运行时 ID 来运行您的函数。Python
gcloud functions deploy ocr-extract \ --gen2 \ --runtime=python312 \ --region=
REGION
\ --source=. \ --entry-point=process_image \
--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
标志可以指定支持的 Python 版本的运行时 ID 来运行您的函数。Go
gcloud functions deploy ocr-extract \ --gen2 \ --runtime=go121 \ --region=
REGION
\ --source=. \ --entry-point=process-image \
--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"Java
gcloud functions deploy ocr-extract \ --gen2 \ --runtime=java17 \ --region=
REGION
\ --source=. \ --entry-point=functions.OcrProcessImage \ --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 来运行您的函数。替换以下内容:
- REGION:要在其中部署函数的 Google Cloud 区域的名称(例如
us-west1
)。 - YOUR_IMAGE_BUCKET_NAME:要向其中上传图片的 Cloud Storage 存储桶的名称。部署第 2 代函数时,请仅指定不含前导
gs://
的存储桶名称;例如--trigger-event-filters="bucket=my-bucket"
。
- REGION:要在其中部署函数的 Google Cloud 区域的名称(例如
如需部署带有 Cloud Pub/Sub 触发器的文本翻译函数,请在包含示例代码(如果是 Java,则为
pom.xml
文件)的目录中运行以下命令:// LINT.IfChange(nodejs_version) // LINT.ThenChange(:nodejs_version_console_text) // LINT.IfChange(nodejs_version_console_text) // LINT.ThenChange(:nodejs_version) // LINT.IfChange(nodejs_version) // LINT.ThenChange(:nodejs_version_console_text) // LINT.IfChange(nodejs_version_console_text) // LINT.ThenChange(:nodejs_version)
Node.js
gcloud functions deploy ocr-translate \ --gen2 \ --runtime=nodejs20 \ --region=
REGION
\ --source=. \ --entry-point=translateText \
--trigger-topic YOUR_TRANSLATE_TOPIC_NAME \
--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 \ --gen2 \ --runtime=python312 \ --region=
REGION
\ --source=. \ --entry-point=translate_text \
--trigger-topic YOUR_TRANSLATE_TOPIC_NAME \
--set-env-vars "GCP_PROJECT=YOUR_GCP_PROJECT_ID,RESULT_TOPIC=YOUR_RESULT_TOPIC_NAME"使用
--runtime
标志可以指定支持的 Python 版本的运行时 ID 来运行您的函数。Go
gcloud functions deploy ocr-translate \ --gen2 \ --runtime=go121 \ --region=
REGION
\ --source=. \ --entry-point=translate-text \
--trigger-topic YOUR_TRANSLATE_TOPIC_NAME \
--set-env-vars "GCP_PROJECT=YOUR_GCP_PROJECT_ID,RESULT_TOPIC=YOUR_RESULT_TOPIC_NAME"Java
gcloud functions deploy ocr-translate \ --gen2 \ --runtime=java17 \ --region=
REGION
\ --source=. \ --entry-point=functions.OcrTranslateText \ --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
文件)的目录中运行以下命令:// LINT.IfChange(nodejs_version) // LINT.ThenChange(:nodejs_version_console_text) // LINT.IfChange(nodejs_version_console_text) // LINT.ThenChange(:nodejs_version) // LINT.IfChange(nodejs_version) // LINT.ThenChange(:nodejs_version_console_text) // LINT.IfChange(nodejs_version_console_text) // LINT.ThenChange(:nodejs_version)
Node.js
gcloud functions deploy ocr-save \ --gen2 \ --runtime=nodejs20 \ --region=
REGION
\ --source=. \ --entry-point=saveResult \
--trigger-topic YOUR_RESULT_TOPIC_NAME \
--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 \ --gen2 \ --runtime=python312 \ --region=
REGION
\ --source=. \ --entry-point=save_result \
--trigger-topic YOUR_RESULT_TOPIC_NAME \
--set-env-vars "GCP_PROJECT=YOUR_GCP_PROJECT_ID,RESULT_BUCKET=YOUR_RESULT_BUCKET_NAME"使用
--runtime
标志可以指定支持的 Python 版本的运行时 ID 来运行您的函数。Go
gcloud functions deploy ocr-save \ --gen2 \ --runtime=go121 \ --region=
REGION
\ --source=. \ --entry-point=save-result \
--trigger-topic YOUR_RESULT_TOPIC_NAME \
--set-env-vars "GCP_PROJECT=YOUR_GCP_PROJECT_ID,RESULT_BUCKET=YOUR_RESULT_BUCKET_NAME"Java
gcloud functions deploy ocr-save \ --gen2 \ --runtime=java17 \ --region=
REGION
\ --source=. \ --entry-point=functions.OcrSaveResult \ --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 存储分区:
gsutil cp
PATH_TO_IMAGE
gs://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 Functions 函数
删除 Cloud Functions 函数不会移除存储在 Cloud Storage 中的任何资源。
如需删除您在本教程中创建的 Cloud Functions 函数,请运行以下命令:
gcloud functions delete ocr-extract gcloud functions delete ocr-translate gcloud functions delete ocr-save
您也可以通过 Google Cloud 控制台删除 Cloud Functions 函数。