はじめに
S3に画像を追加すると、自動的にその画像内のテキストを抽出し、テキストファイルとして保存する、というシステムをLambda・Amazon Textract・Golangを利用して作りました。
作成手順を共有します。
完成イメージ
Textractとは
Amazon TextractはAWSが提供するクラウドOCRサービスです。詳しくは以下の記事を参照してください。
料金
利用料金はこちらのページにまとまっています。無料枠で使用可能です。
注意点
- 日本リージョンに対応していない
- 日本語には対応していない
ブラウザで試す
こちらのページでかんたんに試すことができます。
実装手順
S3バケットを作成する
手順は割愛しますが、入力用のバケットと出力用のバケットを作成します。
参考: https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/create-bucket-overview.html
Lambdaを作成する
入力用のバケットへの画像ファイル(今回はpngファイルのみとします)書き込みをトリガーとするLambdaを作成します。
今回はランタイムにGolangを指定しました。
実行ロールには以下の権限を持つものを指定してください。
- 入力用のS3バケットの読み込み権限
- 出力用のS3バケットの書き込み権限
- TextractのAPIへのアクセス権限(AmazonTextractFullAccess?)
トリガーを設定
コード
コードは以下です。
package main
import (
"context"
"strings"
"time"
"github.com/aws/aws-lambda-go/lambda"
"github.com/aws/aws-sdk-go/service/s3/s3manager"
"github.com/aws/aws-lambda-go/events"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/textract"
)
func lambdaHandler(ctx context.Context, event events.S3Event) {
// S3から画像オブジェクト取得
sess := session.Must(session.NewSession(&aws.Config{
Region: aws.String("us-east-1"),
}))
inputBucket := event.Records[0].S3.Bucket.Name
inputKey := event.Records[0].S3.Object.Key
// Textract API呼び出し
textractSession := textract.New(sess)
input := &textract.DetectDocumentTextInput{
Document: &textract.Document{
S3Object: &textract.S3Object{
Bucket: aws.String(inputBucket),
Name: aws.String(inputKey),
},
},
}
resp, err := textractSession.DetectDocumentText(input)
if err != nil {
panic(err)
}
// レスポンスからテキストデータを抽出
var output string
for _, w := range resp.Blocks {
if *w.BlockType == "LINE" { // PAGE, WORD, LINEから指定できる
output += *w.Text
output += "\n"
}
}
// S3に書き込み
outputBucket := // 出力用バケット名
outputObjectKey := inputKey + time.Now().String() + ".txt"
uploader := s3manager.NewUploader(sess)
_, err = uploader.Upload(&s3manager.UploadInput{
Bucket: aws.String(outputBucket),
Key: aws.String(outputObjectKey),
Body: strings.NewReader(output),
})
if err != nil {
panic(err)
}
}
func main() {
lambda.Start(lambdaHandler)
}
コードをアップロード
ビルドしてzipファイルを作成します。
% GOOS=linux go build -o lambda
% zip lambda.zip lambda
動かしてみる
以下の画像で試してみます(参考)。
出力されたテキストファイルの中身は以下。
Amazon.com, Inc. is located in Seattle, WA
It was founded July 5th, 1994 by Jeff Bezos
Amazon.com allows customers to buy everything from books to blenders
Seattle is north of Portland and south of Vancouver, BC.
上記をすべてコードで定義する
(まだやってないのでやり次第追記します)
おわりに
今回は抽出したテキストをテキストファイルとして保存しましたが、CSVファイルとして出力する等、様々な方法で活用することが可能です。
間違い等あればご指摘お願いいたします。