您将了解如何在 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
准备工作
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure 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.
- 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.
-
Make sure 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.
- 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 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 nodejs20 \
--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 nodejs20 \
--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 nodejs20 \
--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_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 账号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。
删除项目
为了避免产生费用,最简单的方法是删除您为本教程创建的项目。
要删除项目,请执行以下操作:
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
删除函数
删除 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。