テキストを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認定資格試験テキスト AWS認定AIプラクティショナー」という本を書きました。
「ポケットスタディ AWS認定 デベロッパーアソシエイト [DVA-C02対応] 」という本を書きました。
「要点整理から攻略するAWS認定ソリューションアーキテクト-アソシエイト」という本を書きました。
「AWSではじめるLinux入門ガイド」という本を書きました。
開発ベンダー5年、ユーザ企業システム部門通算9年、ITインストラクター5年目でプロトタイプビルダーもやりだしたSoftware Engineerです。
質問はコメントかSNSなどからお気軽にどうぞ。
出来る限りなるべく答えます。
このブログの内容/発言の一切は個人の見解であり、所属する組織とは関係ありません。
このブログは経験したことなどの共有を目的としており、手順や結果などを保証するものではありません。
ご参考にされる際は、読者様自身のご判断にてご対応をお願いいたします。
また、勉強会やイベントのレポートは自分が気になったことをメモしたり、聞いて思ったことを書いていますので、登壇者の意見や発表内容ではありません。
関連記事
-
-
AWS EC2 Amazon Linux にEC-CUBE3をnginx+MySql環境へインストール(手順検証中)
EC2インスタンスを作成する 少し古い記事で恐縮ですが試したい事があるのでAWS …
-
-
Extend Switch Roles(Chromeのアドオン)で6つ以上のスイッチロール履歴
最近アカウントIDを忘れたりすることも多くなったので、切り替えに手間取ることがあ …
-
-
webフォームからの問い合わせをRedmineに自動登録して対応状況を管理する(API Gateway + Lambda)
先日、検証目的で作成したRedmineの冗長化の一機能として、webフォームから …
-
-
当ブログ(WordPress)のCloudFrontのキャッシュヒット率があがった
当ブログの構成です。 S3とALB+EC2 Auto Scalingで構成してい …
-
-
IAMセッションポリシーの利用(GetFederationToken)
GetFederationTokenでのセッションポリシーは、呼び出し元のIAM …
-
-
AWS Application Discovery Serviceのエージェントを実行
本来はオンプレミスのサーバーにエージェントをインストールして、自動でアプリケーシ …
-
-
ECR(Amazon Elastic Container Registry)にコンテナイメージをアップロードする
「Pandocサーバーのコンテナイメージを作成する」で作成したイメージをAWS …
-
-
Systems Manager デフォルトのホスト管理設定(Default Host Management Configuration)を確認しました
2023/2/17のアップデートAWS Systems Manager をアカウ …
-
-
Backlogの実績工数をAmazon QuickSightで可視化してわかったこと
今年に入ってから、Backlogで個人タスクを登録しだして、予定工数、実績工数を …
-
-
WordPress、プラグインのアップデートしてBlue/Greenデプロイ
現在のブログの構成です。 WordPressとプラグインのアップデートをして、デ …



