テキストをAmazon PollyでMP3に変換してS3に格納(AWS Lambda Python)
Google Calendar Twilio ReminderのテキストをAmazon Pollyを使ってMP3ファイルに変換してS3に格納する部分の説明です。
目次
AWS側の設定
MP3格納用S3バケット作成
Pollyのためというよりも後でTwilioでアクセスするための設定です。
Static website hostingを有効にします。
バケットポリシーを作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
{ "Version": "2008-10-17", "Statement": [ { "Sid": "PublicReadForGetBucketObjects", "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::bucket_name/*" } ] } |
ライフサイクルを設定します
生成されたMP3ファイルは不要になるのでライフサイクルルールで削除します。
Lambda実行用ロールの作成
ここで作ったロールをLambdaに設定します。
雑ですが、管理ポリシーに以下を設定しました。
- AWSLambdaFullAccess
- AmazonS3FullAccess
- AmazonPollyFullAccess
あと、インラインポリシーに下記を設定しました。
これがないとログが出力されませんでした。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": "arn:aws:logs:*:*:*" } ] } |
AWS Lambdaの環境変数
変数名 | 設定値 |
---|---|
BUCKET_NAME | Amazon Pollyが生成するMP3ファイルを格納するS3バケット名 |
BUCKET_REGION | ap-northeast-1など S3バケットがあるリージョン名 |
VOICE_ID | Amazon PollyのボイスID 日本語なので Mizuki |
POLLY_REGION | Amazon Pollyのリージョン名 |
ソースコードの説明
AWSのサンプルコードをベースにして少し変えてます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
# coding:utf-8 import os import logging import sys import traceback from boto3 import Session from boto3 import resource from contextlib import closing logger = logging.getLogger() logger.setLevel(logging.INFO) class PollyMp3(object): def __init__(self): self.polly_region = os.environ['POLLY_REGION'] self.bucket_name = os.environ['BUCKET_NAME'] self.bucket_region = os.environ['BUCKET_REGION'] self.voice_id = os.environ['VOICE_ID'] def set_twiml(self,file_name,twiml_str): try: s3 = resource('s3') bucket = s3.Bucket(self.bucket_name) twiml_file_name = '%s.xml' % file_name bucket.put_object( Key=twiml_file_name, Body=twiml_str, ContentType='application/xml' ) ENTRY_URL = "https://s3-{region}.amazonaws.com/{bucket}/{filename}" entry_url = ENTRY_URL.format( bucket=self.bucket_name, region=self.bucket_region, filename=twiml_file_name ) return entry_url except Exception as e: logger.error(traceback.format_exc(sys.exc_info()[2])) def set_mp3(self,file_name,polly_text): try: session = Session(region_name=self.polly_region) polly = session.client("polly") s3 = resource('s3') bucket = s3.Bucket(self.bucket_name) response = polly.synthesize_speech( Text=polly_text, OutputFormat="mp3", VoiceId=self.voice_id) mp3_file_name = '%s.mp3' % file_name with closing(response["AudioStream"]) as stream: bucket.put_object( Key=mp3_file_name, Body=stream.read(), ContentType = 'audio/mpeg' ) ENTRY_URL = "https://s3-{region}.amazonaws.com/{bucket}/{filename}" entry_url = ENTRY_URL.format( bucket=self.bucket_name, region=self.bucket_region, filename=mp3_file_name ) return entry_url except Exception as e: logger.error(traceback.format_exc(sys.exc_info()[2])) |
set_twiml
- Twilioを実行するためのTwiml(Twilio独自のXML)をS3に格納しています。
- ContentType=’application/xml’ がないとTwilioが認識出来ません。
set_mp3
- PollyがテキストをMP3ファイルに変換してS3に格納しています。
- synthesize_speech にテキストを渡して変換結果を受け取っています。
- response[“AudioStream”]をput_objectでS3にContentType = ‘audio/mpeg’で書き込んでいます。
最後までお読みいただきましてありがとうございました!
「AWS認定資格試験テキスト&問題集 AWS認定ソリューションアーキテクト - プロフェッショナル 改訂第2版」という本を書きました。
「AWS認定資格試験テキスト AWS認定クラウドプラクティショナー 改訂第3版」という本を書きました。
「ポケットスタディ AWS認定 デベロッパーアソシエイト [DVA-C02対応] 」という本を書きました。
「要点整理から攻略するAWS認定ソリューションアーキテクト-アソシエイト」という本を書きました。
「AWSではじめるLinux入門ガイド」という本を書きました。
開発ベンダー5年、ユーザ企業システム部門通算9年、ITインストラクター5年目でプロトタイプビルダーもやりだしたSoftware Engineerです。
質問はコメントかSNSなどからお気軽にどうぞ。
出来る限りなるべく答えます。
このブログの内容/発言の一切は個人の見解であり、所属する組織とは関係ありません。
このブログは経験したことなどの共有を目的としており、手順や結果などを保証するものではありません。
ご参考にされる際は、読者様自身のご判断にてご対応をお願いいたします。
また、勉強会やイベントのレポートは自分が気になったことをメモしたり、聞いて思ったことを書いていますので、登壇者の意見や発表内容ではありません。
ad
ad
関連記事
-
CloudFront用のAWS管理プレフィックスリストを使用しました
このブログでは、CloudFrontのカスタムヘッダーとALBのルーティングを組 …
-
AWS LambdaをVPC設定したときに「The provided execution role does not have permissions to call CreateNetworkInterface on EC2」
The provided execution role does not hav …
-
Amazon Chimeのチャットを使ってみました
Amazon Chimeはビデオミーティングや配信したりというサービスですが、チ …
-
Amazon Elasticsearch ServiceにMySQLのデータを投入してkibanaで可視化してみる
MySQLのデータの可視化にAmazon Elasticsearch Servi …
-
WordPress(EC2)の画像のS3へのオフロードをMedia Cloudで
タイトル通りですが、画像をwebサーバー(EC2)からではなく、S3バケットから …
-
AWSアカウント内特定リージョン内のDynamoDBテーブルを全削除するLambda(Python)
やりたいこと タイトル通りですが、特定アカウントの特定リージョン内のDynamo …
-
S3バケットポリシーですべてDenyにしてしまったらルートユーザーの出番
特定のConditionsを指定して、それ以外はすべて拒否するS3バケットポリシ …
-
Developers Summit 2018 「AWSのフルマネージドな環境でCI/CDをやってみよう!AWS Cloud9からAWS Fargateへの継続的デプロイをご紹介」を聞きました
※写真は展示のAmazon Echoです。 以下は、思ったことや気になったことを …
-
RDSスナップショットのS3エクスポート結果確認
RDSのスナップショットをS3へエクスポートが日本語マネジメントコンソールでもで …
-
S3署名付きURL(GetObject)生成後にオブジェクトを上書きアップロードしたら
ダウンロードリクエストを実行したタイミングのオブジェクトがダウンロードされるので …