やりたいこと
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つを追加する。
- AmazonS3FullAccess
- AmazonPollyFullAccess
テスト
新規にテストイベントを作成し、イベントJSONに以下を設定する
{
"body": "{\\"inputtext\\": \\"こんにちは\\"}"
}
テストを実行すれば指定したS3上のバケットに「zzz.mp3」ファイルが作成される