テキストを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
関連記事
-
SIEM on Amazon OpenSearch Serviceを構築
このブログまわりのモニタリングをSIEM on Amazon OpenSearc …
-
WordPressをAmazon CloudFrontで配信してついでにACM(AWS Certificate Manager)を使って常時SSL化する
当サイトの500と502の発生状況がドイヒーであるとの苦情をいただきまして、Am …
-
特定AWSアカウント特定リージョンのSQSキューを削除するLambda(Python)
やりたいこと 特定アカウント内特定リージョン内のSQSキューを全部削除したいです …
-
macOSにAWS Schema Conversion Toolをインストール
環境 macOS BigSur バージョン11.5(20G71) MacBook …
-
AWS Lambda(Python)からZoom投票作成
以前、Zoomの投票(アンケート)をAPI経由で作成するというブログで書きました …
-
AlexaにAWSの最新Feedを読み上げてもらう(Lambda Python)
年末にAmazon Echo Dotを購入しましたので、練習がてらAlexaスキ …
-
Organizations組織でAWS SSOを有効にする
先日AWS Control Towerで環境を作ったら、自動でAWS SSOがで …
-
JAWS-UG関西IoT専門支部 ✕ SORACOM UG 関西「Wio LTE + 絶対圧センサーで遊ぼう!」ワークショップにいってきた
JAWS-UG関西IoT専門支部 ✕ SORACOM UG 関西「Wio LTE …
-
Lambdaバージョンとエイリアスとトリガー
Lambdaのバージョン、エイリアスにはそれぞれ別のトリガーが設定できます。 上 …
-
RocketChat(EC2インスタンス)でCPU80%以上を10分間継続したら再起動する
先日、数日間のやり取り用で完全に使い捨てとして使っているRocketChatで、 …