Amazon Transcribeが文字起こし結果をユーザーのS3バケットに出力できるようになりました

2018.07.19

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

Amazon Transcribe が文字起こし結果をユーザーの管理する S3 バケットに出力できるようになりました。

この機能追加により、

  • 文字起こし結果へのアクセス管理・ライフサイクル管理
  • S3 への書き込みイベントをもとに処理を呼び出し

といったことが柔軟にできるようになりました。

これまでは、文字起こし結果は AWS の管理する S3 バケットにしか出力されなかったため、出力結果へのアクセスは有効期限付きの presigned URL 経由に限定されており、出力結果のアクセス管理・ライフサイクル管理なども行えませんでした。

Amazon Transcription ジョブの完了検知が楽になります

例として、Amazon Transcription ジョブの完了を検知する方法を考えてみます。

AWS の管理する S3 バケットに出力する場合

AWS の管理する S3 バケットに出力した場合、ジョブの完了は

  • ジョブステータスのポーリング(サービス開始当初から)
  • CloudWatch Events(2018年7月上旬に対応)

で検知できます。完了検知後は、有効期限付きの presigned URL で出力結果にアクセスします。

ポーリングベースの場合、下図のように処理します。

CloudWatch Events を利用する方法は、次のブログを参照ください。

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

ユーザーの管理する S3 バケットに出力する場合

ユーザーの管理する S3 バケットに出力する場合、ジョブの完了は S3 への書き込みイベントで検知できます。

検知後は、通常の S3 REST APIで出力結果にアクセスします。

transcription 結果をユーザーの S3 バケットに出力してみる

実際に、ユーザーの S3 バケットに transcription 結果を出力してみます。

ジョブ結果の出力先 S3 バケットの作成

Amazon Transcribe と同じリージョンに S3 バケットを作成します。

Amazon Transcribe(transcribe.amazonaws.com) が この S3 バケットにオブジェクトを更新(s3:PutObject)できるようにするためのバケットポリシーは不要です。

ジョブの作成

今回は管理コンソールからジョブを作成します。

ジョブ作成画面の最下部に ”Choose output locationInfo” という入力欄が追加されています。

デフォルトでは「Amazon default bucket」が選択されていますが、「My own bucket」を選択すると、バケット名を入力できるようになります。

S3 バケットは、Amazon Transcribe ジョブと同じリージョンにある必要があります。 また、現時点ではバケット名のみ指定可能で、バケット内でのパスは指定できません。

ジョブの出力ファイルの確認

ジョブの完了後、管理コンソールからジョブの詳細画面を確認します。

文字起こし結果をユーザーの S3 バケットに出力すると、管理コンソールからは、文字起こしテキストの確認や、文字起こし出力ファイルのダウンロードができません。

管理コンソールからテキストを確認していた方は、お気をつけください。

次に、ジョブの出力先に指定した S3 バケットを確認します。

$ aws s3 ls s3://TRANSCRIBE-BUCKET-NAME
2018-07-18 12:40:57          2 .write_access_check_file.temp
2018-07-18 12:44:19      93996 JOB-NAME.json

S3 バケットのルート直下に .write_access_check_file.temp という書き込み確認用のオブジェクトが作成されています。

また JOB-NAME.json というキー名でジョブの実行結果が出力されています。

$ aws s3 cp s3://TRANSCRIBE-BUCKET-NAME/JOB-NAME.json .

のように通常の S3 REST API を使用して、ジョブの実行結果を取得できます。

AWS CLI から S3 の出力先を指定

AWS CLI での操作方法も紹介します。

文字起こし結果をユーザーの S3 バケットに出力する場合、ジョブ実行時に出力先 S3 バケット名を --output-bucket-name 引数で指定します。

$ aws transcribe start-transcription-job \
   --transcription-job-name JOB-NAME \
   --media-format mp3 \
   --language-code en-US \
   --media MediaFileUri=https://s3.amazonaws.com/AUDIO-BUCKET-NAME/AUDIO.mp3 \
   --output-bucket-name TRANSCRIBE-BUCKET-NAME
{
    "TranscriptionJob": {
        "TranscriptionJobName": "JOB-NAME",
        "Media": {
            "MediaFileUri": "https://s3.amazonaws.com/AUDIO-BUCKET-NAME/AUDIO.mp3"
        },
        "MediaFormat": "mp3",
        "LanguageCode": "en-US",
        "CreationTime": 1531905215.327,
        "TranscriptionJobStatus": "IN_PROGRESS"
    }
}

レスポンスには --output-bucket-name 情報は含まれていません。

ジョブ実行中に、ジョブの詳細情報を取得します。

$ aws transcribe get-transcription-job --transcription-job-name JOB-NAME
{
    "TranscriptionJob": {
        "TranscriptionJobStatus": "IN_PROGRESS",
        "LanguageCode": "en-US",
        "Transcript": {},
        "MediaFormat": "mp3",
        "Media": {
            "MediaFileUri": "https://s3.amazonaws.com/AUDIO-BUCKET-NAME/AUDIO.mp3"
        },
        "CreationTime": 1531905215.327,
        "TranscriptionJobName": "JOB-NAME",
        "MediaSampleRateHertz": 44100,
        "Settings": {}
    }
}

やはりレスポンスには --output-bucket-name 情報は含まれていません。

最後に、ジョブが完了したあとで詳細を確認します。

$ aws transcribe get-transcription-job --transcription-job-name JOB-NAME
{
    "TranscriptionJob": {
        "CompletionTime": 1531905416.885,
        "CreationTime": 1531905215.327,
        "MediaFormat": "mp3",
        "Transcript": {
            "TranscriptFileUri": "https://s3.amazonaws.com/TRANSCRIBE-BUCKET-NAME/JOB-NAME.json"
        },
        "LanguageCode": "en-US",
        "MediaSampleRateHertz": 44100,
        "Media": {
            "MediaFileUri": "https://s3.amazonaws.com/AUDIO-BUCKET-NAME/AUDIO.mp3"
        },
        "TranscriptionJobStatus": "COMPLETED",
        "Settings": {},
        "TranscriptionJobName": "JOB-NAME"
    }
}

TranscriptionJob -> Transcript -> TranscriptFileUri を確認すると、ジョブ作成時に指定した S3 バケット名に対して、 ジョブ名.JSON というキー名で文字起こし結果が出力されています。

出力先を Amazon 標準の S3 バケットにすると、この部分は

"Transcript": {
    "TranscriptFileUri": "https://s3.amazonaws.com/aws-transcribe-us-east-1-prod/123456789012/123/asrOutput.json?PRESIGNED_URL_PARAMETER"
}

というようになります。

この URL は有効期限付き presigned URL のため、HTTPS GET リクエストでジョブ実行結果を取得します。

まとめ

Amazon Transcribe で文字起こし結果をユーザーの S3 バケットにも出力できるようになりました。

ジョブ実行結果の出力先の違いによる影響を表にまとめます。

| ジョブ実行結果の出力先バケット | ユーザー | Amazonデフォルト | | ------ | ------ | ------ | | イベントの完了検知 | S3 Events | ジョブステータスのポーリング CloudWatch Events | | 文字起こしファイルの取得 | S3 REST API | presigned URLに対するHTTPS GET | | アクセス制御 | S3 オブジェクトと同じ | URLを知っていれば誰でもアクセス可能 | | 管理コンソールでの文字起こし結果の表示 | なし | あり | | 管理コンソールからジョブ結果のダウンロード | なし | あり | | ジョブの保持期間終了後の影響 | ジョブは削除される ジョブ実行結果はS3バケットに残る。ユーザーが独自にライフサイクルを設定する | ジョブ・実行結果ともに削除される |

参考