Amazon TranscribeがAmazon CloudWatch Eventsに対応しました

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Amazonが提供する文字起こしサービス Amazon Transcribe はジョブキューベースで処理します。

これまではジョブの完了イベントはジョブステータスをポーリングしてチェックする必要がありましたが、今後は Amazon CloudWatch イベントルールを利用して、イベントドリブンに通知されるようになりました。

Amazon Transcribe is Now Integrated with AWS CloudTrail and Amazon CloudWatch Events(Jun 28, 2018)

この記事では、Amazon CloudWatch イベントルールを利用し、ジョブ完了後にに文字起こしされたテキストの URL を返す Lambda 関数を実装します。

Amazon Transcribe のイベントについて

2018/07/06時点で Amazon Transcribe のイベントはステート変更("Transcribe Job State Change")だけです。

ジョブステータスが IN_PROGRESS から

  • COMPLETED(文字起こし成功)
  • (文字起こし失敗)

のどちらかに遷移したときに呼び出されます。

アーキテクチャの概要

Amazon CloudWatch イベントルールで Transcribe のステート変更イベントに対して、Lambda を紐づけています。

(A-1) でユーザーは Transcription ジョブを作成します。

このジョブが完了すると

  1. CloudWatch Events にイベント発火
  2. Lambda を呼び出し
  3. イベント情報をもとに Lambda 関数で Transcription とゴニョゴニョ

します。

Amazon Transcribe 利用可能なリージョンについて

2018/07/06 時点では以下のリージョンで Amazon Transcribe は利用可能です。

  • US East (N. Virginia)
  • US East (Ohio)
  • US West (Oregon)
  • EU (Ireland)

対応言語も英語、スペイン語のみです。

東京リージョンや日本語には対応していないため、お気をつけください。

Lambda の実装

"Transcribe Job State Change" のイベント発生時に呼び出され、文字起こしファイルの URL を返す Lambda 関数を Python 3 で実装します。

イベント発生時、Lambda には次の形式の JSON データが渡ります。

{
  "version": "0",
  "id": "event ID",
  "detail-type":"Transcribe Job State Change",
  "source": "aws.transcribe",
  "account": "account ID",
  "time": "timestamp",
  "region": "region",
  "resources": [],
  "detail": {
    "TranscriptionJobName": "unique job name",
    "TranscriptionJobStatus": "status"
  }
}

重要なのは detail のブロックです

  • TranscriptionJobName : ジョブ作成時に指定したジョブ名
  • TranscriptionJobStatus : COMPLETED(成功) または FAILED(成功)

(ジョブ名, 遷移先ステータス) だけが連携され、文字起こし結果の詳細は含まれていません。 そのため、ジョブ名をキーに GetTranscriptionJob API で詳細情報を取得します。

GetTranscriptionJob API のレスポンスは次の形式の JSON データで、response['Transcript'] に求める文字起こしファイルの URL が含まれています。

{
   "TranscriptionJob": {
      "CompletionTime": number,
      "CreationTime": number,
      "FailureReason": "string",
      "LanguageCode": "string",
      "Media": {
         "MediaFileUri": "string"
      },
      "MediaFormat": "string",
      "MediaSampleRateHertz": number,
      "Settings": {
         "MaxSpeakerLabels": number,
         "ShowSpeakerLabels": boolean,
         "VocabularyName": "string"
      },
      "Transcript": {
         "TranscriptFileUri": "string"
      },
      "TranscriptionJobName": "string",
      "TranscriptionJobStatus": "string"
   }
}

上記を諸々詰め込んだのが次の Lambda 関数です。

import logging
import boto3

logger = logging.getLogger()
logger.setLevel(logging.INFO)

transcribe = boto3.client('transcribe')

def lambda_handler(event, context):
    logger.info(event)
    job_name = event['detail']['TranscriptionJobName']
    job_status = event['detail']['TranscriptionJobStatus']

    if job_status in ['COMPLETED']:
        # ジョブが成功した場合のみ呼び出す
        logger.info("COMPLETED")
        job = transcribe.get_transcription_job(TranscriptionJobName=job_name)
        logger.info(job)
        logger.info(job['TranscriptionJob']['Transcript'])
        return job['TranscriptionJob']['Transcript']
    elif job_status in ['FAILED']:
        # ジョブが失敗した場合の処理は今回は未実装
        logger.info("FAILED")
        pass
    else:
        logger.error("Unknown Status Found : {}".format(job_status))
        raise Exception

成功した過去のTranscribeジョブをもとにテストイベントを用意して Lambda を実行し、以下のようなレスポンスがかえってくれば成功です。

{
  "TranscriptFileUri": "https://s3.amazonaws.com/aws-transcribe-us-east-1-prod/123456789012/unique-job-name/asrOutput.json?X-Amz-Security-Token=..."
}

今回は、ジョブ完了後に文字起こしテキストの URL である TranscriptFileUri だけを返しましたが、本来は、この文字起こし結果をどのようにゴニョゴニョするのかが、サービスの差別化につながるかと思います。

Amazon CloudWatch イベントルール の設定

Event Source

Event Source は次の通り設定します。

  • Service Name : Transcribe
  • Event Type : Transcribe Job State Change

結果、イベントパターンは

{
  "source": [
    "aws.transcribe"
  ],
  "detail-type": [
    "Transcribe Job State Change"
  ]
}

となります。

Targets

Targests に先程作成した Lambda 関数を設定します。

Transcribe ジョブの実行

最後に、なにか音源をもとに Amazon Transcribe ジョブを作成します。

Lambda がエラーなく呼び出され、Lambda の実行ログに TranscriptFileUri が含まれていれば成功です。

まとめ

今回は Amazon Transcribe のジョブを Amazon CloudWatch イベントルールを使って、イベントドリブンに処理する方法を紹介しました。

  • ジョブのワークフロー全体を Amazon Step Functions などで管理
  • メッセージキューでジョブの enqueue/dequeue を管理

のようなポーリングベースではなく、イベントドリブンにジョブを処理したい方におすすめです。

参考