テキストを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
関連記事
-
-
EC2とRDSのMySQLを他のAWSアカウントへ移設する
他のAWSアカウントへシステムごと移設した場合の手順です。 構成はEC2とRDS …
-
-
Amazon EC2(Amazon Linux 2)にRedmine3.4をインストール
久しぶりに新しい環境でRedmineを構築したくなり、せっかくなのでAmazon …
-
-
AWS RDS でMySQLインスタンスを構築する
Amazon Web ServiceにはAmazon Relational Da …
-
-
AWS Summit 2016 Tokyoに参加してきました (前日 ~ Day1)
AWS Summit 2016 Tokyoにて、セッション聴講、ブース展示拝見、 …
-
-
EC2 プレイスメントグループを試してみました
やったことないのでやってみたやつです。 プレイスメントグループの作成 まず、EC …
-
-
Former2で既存リソースのCloudFormationテンプレート出力を試してみた
JAWS DAYS 2020の資料確認のお手伝いを少ししてまして、「ゼロからはじ …
-
-
Amazon FSx for Lustreのユーザーガイド入門演習
ファイルシステムの作成 FSx for Lustreを選択しました。 容量やスル …
-
-
百聞は一見にしかず!AWSセルフペースラボの無料ラボ!
※2019年5月12日現在に試してみた記録です。 AWSセルフペースラボとは A …
-
-
AWS Transfer Family EFS向けのSFTP対応サーバー
EFSファイルシステムは作成済です。 AWS Transfer Family S …
-
-
Developers Summit 2018 「AWSのフルマネージドな環境でCI/CDをやってみよう!AWS Cloud9からAWS Fargateへの継続的デプロイをご紹介」を聞きました
※写真は展示のAmazon Echoです。 以下は、思ったことや気になったことを …