在亚马逊云科技上构建无服务器应用程序以自动处理发票

了解如何使用 Amazon Textract 和 Amazon Lambda 处理发票图片,并使用 Go 编程语言提取元数据。
发布时间:2023 年 6 月 13 日
Golang
无服务器
人工智能-机器学习
CDK
DynamoDB
Lambda
教程
亚马逊云科技
Olawale Olaleye
亚马逊云科技使用经验
100 - 初级
完成所需时间
20 分钟
所需费用

支持亚马逊云科技免费套餐

示例代码

本教程中使用的示例代码来自 GitHub

上次更新时间
2023 年 6 月 13 日

Amazon Transcribe 是一项基于机器学习模型自动将语音转换为文本的服务。它提供了多种可以提高文本转录准确性的功能,例如语言自定义、内容过滤、多通道音频分析和说话人语音分割。Amazon Transcribe 可用作独立的转录服务,也可以集成到应用程序中提供语音转文本功能。您可以实时转录媒体内容(流式处理),也可以转录位于 Amazon S3 存储桶中的媒体文件(批处理)。

本教程将介绍如何使用 Amazon Transcribe、Amazon Lambda 和 Go 编程语言构建用于语音(音频)转文本的无服务器应用程序。

我们将介绍如何:

所需的 Go 库:

应用程序概览

以下是应用程序的运作方式:

  1. 上传到 Amazon S3 的发票收据图片触发 Lambda 函数。
  2. Lambda 函数提取发票元数据(例如 ID、日期、金额)并将其保存到 Amazon DynamoDB 表。

前提条件

在开始之前,请了解以下信息:

使用 Amazon CDK 部署解决方案

克隆项目并切换到正确的目录:

git clone https://github.com/build-on-aws/amazon-textract-lambda-golang-example

cd amazon-textract-lambda-golang-example

Amazon CDK 是一个框架,支持将云基础设施定义为所支持编程语言的代码,并通过 Amazon CloudFormation 进行预配。

要开始部署,请调用 cdk deploy 命令。您会看到将要创建的资源列表,您确认之后流程才能继续。

cd cdk

cdk deploy

# output

Bundling asset TextractInvoiceProcessingGolangStack/textract-function/Code/Stage...

✨ Synthesis time: 5.26

//.... omitted

Do you wish to deploy these changes (y/n)? y

输入 y 开始创建应用程序所需的亚马逊云科技资源。

如果您想查看将在后台使用的 Amazon CloudFormation 模板,请运行 cdk synth 并查看 cdk.out 文件夹

您可以在终端跟踪堆栈创建进度,也可以前往亚马逊云科技管理控制台进行查看:CloudFormation > Stacks > TextractInvoiceProcessingGolangStack。

创建的资源:

  • 一个 S3 存储桶 - 用于上传图像的源存储桶。
  • Lambda 函数,用于使用 Amazon Textract 处理发票图片。
  • 一张 DynamoDB 表,用于存储每个图像的标签数据。
  • 其他一些组件(如 IAM 角色等)

您还将在终端看到以下输出(在您的使用场景中,资源名称会有所不同)- 这些是 CDK 创建的 S3 存储桶的名称:

✅ TextractInvoiceProcessingGolangStack

✨ Deployment time: 113.51s

Outputs:
TextractInvoiceProcessingGolangStack.invoiceinputbucketname = textractinvoiceprocessin-invoiceimagesinputbucket-bro1y13pib0r
TextractInvoiceProcessingGolangStack.invoiceoutputtablename = textractinvoiceprocessin-invoiceimagesinputbucket-bro1y13pib0r_invoice_output
.....

现在,您已准备好验证解决方案。

从发票中提取费用元数据

验证该解决方案时,可以使用自己的图像,也可以使用 GitHub 存储库中提供的示例文件,该存储库包含一些示例发票。使用 Amazon CLI 上传文件:

export SOURCE_BUCKET=<enter source S3 bucket name from the CDK output>

aws s3 cp ./invoice1.jpeg s3://$SOURCE_BUCKET

# verify that the file was uploaded
aws s3 ls s3://$SOURCE_BUCKET

此 Lambda 函数将从图片中提取发票数据(ID、总金额等),并将其存储在 DynamoDB 表中。

上传其他文件:

export SOURCE_BUCKET=<enter source S3 bucket name - check the CDK output>

aws s3 cp ./invoice2.jpeg s3://$SOURCE_BUCKET
aws s3 cp ./invoice3.jpeg s3://$SOURCE_BUCKET

在亚马逊云科技管理控制台中查看 DynamoDB 表,您应该会看到提取的发票信息。

DynamoDB 表在设计时使用 partition 键作为源文件名。这样,可以检索给定图片的所有发票数据。

您可以使用 Amazon CLI 查询 DynamoDB 表:

aws dynamodb scan --table-name <enter table name - check the CDK output>

Lambda 函数代码概览

下面简要概述了 Lambda 函数逻辑。请注意,为了简洁起见,此处省略了一些代码(错误处理、日志记录等),因为我们只需要关注重要的部分。

func handler(ctx context.Context, s3Event events.S3Event) {
 for _, record := range s3Event.Records {

 sourceBucketName := record.S3.Bucket.Name
 fileName := record.S3.Object.Key

 err := invoiceProcessing(sourceBucketName, fileName)
 }
}

当发票图片上传到源存储桶时,会触发 Lambda 函数。该函数遍历发票列表,并对每张发票调用 invoiceProcessing 函数。

我们来仔细研究一下 invoiceProcessing 函数。

func invoiceProcessing(sourceBucketName, fileName string) error {

 resp, err := textractClient.AnalyzeExpense(context.Background(), &textract.AnalyzeExpenseInput{
 Document: &types.Document{
 S3Object: &types.S3Object{
 Bucket: &sourceBucketName,
 Name: &fileName,
 },
 },
 })

 for _, doc := range resp.ExpenseDocuments {
 item := make(map[string]ddbTypes.AttributeValue)
 item["source_file"] = &ddbTypes.AttributeValueMemberS{Value: fileName}

 for _, summaryField := range doc.SummaryFields {

 if *summaryField.Type.Text == "INVOICE_RECEIPT_ID" {
 item["receipt_id"] = &ddbTypes.AttributeValueMemberS{Value: *summaryField.ValueDetection.Text}
 } else if *summaryField.Type.Text == "TOTAL" {
 item["total"] = &ddbTypes.AttributeValueMemberS{Value: *summaryField.ValueDetection.Text}
 } else if *summaryField.Type.Text == "INVOICE_RECEIPT_DATE" {
 item["receipt_date"] = &ddbTypes.AttributeValueMemberS{Value: *summaryField.ValueDetection.Text}
 } else if *summaryField.Type.Text == "DUE_DATE" {
 item["due_date"] = &ddbTypes.AttributeValueMemberS{Value: *summaryField.ValueDetection.Text}
 }
 }

 _, err := dynamodbClient.PutItem(context.Background(), &dynamodb.PutItemInput{
 TableName: aws.String(table),
 Item: item,
 })
 }

 return nil
}
  • invoiceProcessing 函数调用 Amazon Textract AnalyzeExpense API,以提取发票数据。
  • 然后,该函数遍历 ExpenseDocument 并从特定字段提取信息 - INVOICE_RECEIPT_ID、TOTAL、INVOICE_RECEIPT_DATE、DUE_DATE。
  • 然后,该函数将提取的发票元数据保存在 DynamoDB 表中。

清理资源

完成后,只需使用以下命令删除所有服务:

cdk destroy

#output prompt (choose 'y' to continue)

Are you sure you want to delete: RekognitionLabelDetectionGolangStack (y/n)?

总结

在本教程中,您使用 Amazon CDK 部署了 Go Lambda 函数,以使用 Amazon Textract 处理发票图片,并将结果存储在 DynamoDB 表中。