AWS

Pollyで作成した音声をS3にアップロードする

やりたいこと

Lambdaに渡した任意の文字列をPollyで自動読み上げしたmp3ファイルに変換し、作成されたファイルをS3にアップロードする。

使用するAWS サービス

  • S3
  • Lambda
  • Polly

S3バケットの作成

Pollyが作成した音声ファイルをアップロードするためのバケットを先に作成する。

手順については割愛。

Lambdaの作成

LambdaではAPIゲートウェイから読み上げる音声を受け取り、それをPollyで音声化し、最後にS3にアップロードする。

コード(.py)

from contextlib import closing
import boto3
import json

# 要修正
BUCKET_NAME='xxx'
DIRECTORY='yyy/'
FILE_NAME='zzz.mp3'

def lambda_handler(event, context):
    try:
        body = json.loads(event['body'])
        inputText = body["inputtext"]
    
        # Pollyで受け取った文字列を音声に変換
        polly = boto3.client('polly')
        response = polly.synthesize_speech(
            Engine='standard',
            LanguageCode='ja-JP',
            OutputFormat="mp3",
            Text=inputText,
            TextType='text',
            VoiceId="Mizuki")
        
        with closing(response["AudioStream"]) as stream:            
	    # S3にアップロード
            s3 = boto3.client('s3')
            s3.put_object(Key=DIRECTORY + examname + "/" + qid + ".mp3" , Body=stream.read(), Bucket=BUCKET_NAME)
    except Exception as e:
        print(e)

Responseなどは考慮していないので、必要に応じて追記する

権限

Lambdaを実行するロールに対して、PollyとS3にアクセスする権限を付与する。

【設定】タブ>【アクセス権限】>ロール名をクリックする。

IAM Management Console画面に遷移するので、許可ポリシーに以下2つを追加する。

  1. AmazonS3FullAccess
  2. AmazonPollyFullAccess

テスト

新規にテストイベントを作成し、イベントJSONに以下を設定する

{
  "body": "{\\"inputtext\\": \\"こんにちは\\"}"
}

テストを実行すれば指定したS3上のバケットに「zzz.mp3」ファイルが作成される

参考