Amazon TranscribeのTranscription jobをBoto3を使ってLambdaで実行したらUnknown parameter(OutputStartIndex)でハマった件

2022.04.01

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 を選択することをお勧めします。

実行結果

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も作成されていました。

やったぜ

おわり