テキストを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
関連記事
-
Amazon CloudWatch Syntheticsでハートビートモニタリングを実行
このブログに対してハートビートモニタリングのCanaryを実行してみました。 C …
-
ブログのアーキテクチャをコストベースで見直しました
当ブログはAWSで構築しています。 アーキテクチャをコストを最重視して見直しまし …
-
ParquetフォーマットのデータにS3 Select SQLを実行する
RDSスナップショットのS3エクスポート結果確認で出力したデータが、S3にPar …
-
Apple Silicon M1 MacBook ProにAWS CLI v2をインストール
公式手順どおりにインストールしました。 macOS での AWS CLI バージ …
-
AWS WAFをSIEM on Amazon OpenSearch Serviceで可視化
SIEM on Amazon OpenSearch Serviceを構築の環境に …
-
Amazon Linux2(EC2)にEC-CUBE 4をインストール
こちらのHOMEお知らせ・コラムAmazon Linux2にEC-CUBE4.0 …
-
よくあるサーバーレスアーキテクチャで質問フォーム
この記事はServerless2 Advent Calendar 2018に参加 …
-
Amazon SESの受信ルールでSNSトピックを追加
SESの受信ルールにSNSトピックを設定してみました。 [View Active …
-
AWS Transfer Family S3向けのSFTP対応サーバー
S3バケットは作成済です。 IAMロールの作成 [crayon-662b13a5 …
-
ENAが有効なEC2インスタンスの帯域幅をiperf3で確認してみた
同じ Amazon VPC 内で Amazon EC2 Linux インスタンス …