この記事は公開されてから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 ジョブを作成します。
このジョブが完了すると
- CloudWatch Events にイベント発火
- Lambda を呼び出し
- イベント情報をもとに 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 を管理
のようなポーリングベースではなく、イベントドリブンにジョブを処理したい方におすすめです。