
Amazon TranscribeのTranscription jobをBoto3を使ってLambdaで実行したらUnknown parameter(OutputStartIndex)でハマった件
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
Amazon Transcribeでは音声データから文字起こしをしてjsonファイルで出力されますが、いつの間にか出力フォーマットにSRT (SubRip)とVTT (WebVTT)も指定できるようになっていました。

動画データに字幕を埋め込むために、Transcription jobで作成されたjsonファイルからVTTにするスクリプトをLambdaで実行していたのですが、 これが不要になるかもと思ったので試しにLambdaで実行してみました。
Python3.9のランタイムを使用しています。
やってみた
サンプルコード
Adding subtitles to your Amazon Transcribe video files に載っているPython (Boto3)のサンプルコードをそのまま利用しました。
字幕のフォーマット指定は、Subtitlesというパラメータで指定します。
transcribe.start_transcription_job(
TranscriptionJobName=job_name,
Media={'MediaFileUri': job_uri},
MediaFormat='mp4',
LanguageCode='ja-JP',
Subtitles={
'Formats': [
'vtt'
],
'OutputStartIndex': 1
}
)
- Subtitles(dict)
- Formats
- 字幕ファイルの出力形式を指定。srt と vtt の両方の形式を選択した場合、2 つの出力ファイルが生成されます
- OutputStartIndex
- 最初の字幕セグメントに割り当てられる開始値を定義。Amazon Transcribe のデフォルトの開始インデックスは 0 で、より広く使われている標準の 1 とは異なります。どちらの値を使用するか不明な場合は、他のサービスとの互換性を高めるために 1 を選択することをお勧めします。
- Formats
実行結果
lambdaのコンソールからテストを実行してみたら、

エラーとなってしまいました。
メッセージには
Parameter validation failed:\nUnknown parameter in Subtitles: \"OutputStartIndex\", must be one of: Formats
と OutputStartIndexが使えない という内容です。
ドキュメントにはちゃんと書いてあるのになぜ。。。

原因
最終的に原因は、
Lambdaのランタイムで使用されるboto3のバージョンがOutputStartIndexに未対応のものだった。
ということでした。
boto3のchange logを調べる
transcribeのOutputStartIndexに関することが書いていないか調べてみることに。
changelogにバージョン1.21.26で
Amazon Transcribeのバッチジョブで字幕を作成するための追加パラメータ: outputStartIndexが追加されました というのを発見。

python3.9のランタイムでのboto3、botocoreのバージョンを調べる
ドキュメント には
boto3-1.18.55 botocore-1.21.55 と書かれていました。

boto3が1.18.55なので、確かに対応はしていないですね。
実際に関数から確認してみます。
import boto3
import botocore
print('boto3 vertion: {0}'.format(boto3.__version__))
print('botocore vertion: {0}'.format(botocore.__version__))
を実行したら、

boto3 vertion: 1.20.32 botocore vertion: 1.23.32
となっていました。
1.20.32なのでboto3のバージョンが未対応のやつだったかとわかりました。
対応方法
Lambda LayerにBoto3のバージョンを上げたやつを適用することで実行できるようになります。
ローカルPCでboto3の最新版をインストールし、zipに固めて適用していきます。
zipのファイル構造は
boto3.zip │ python/boto3 └ python/~~~~~~
のように、pythonフォルダの中にライブラリが入っている必要があります。

レイヤー作成 を参照しながらLambda Layerを作成しました。
関数から作成したレイヤーを使うには、

Lambdaのコード画面の下部にあるレイヤーの追加を押して作成したレイヤーを選択すればOKです。

追加後、再度バージョンをチェックするコードを実行すると

boto3 vertion: 1.21.30 botocore vertion: 1.24.30
にちゃんと変わっていました。 1.21.26以上なのでOutputStartIndexも使えるはずなので、エラーになったstart_transcription_jobを実行する関数を再度動かしてみると、エラーなく関数は終了しました。

transcription jobも無事実行され、VTTも作成されていました。

やったぜ
おわり








