今回は、半年前に自前AWSハッカソンでやったことを再度やった記録です。
前回は、近くに有識者がいてわからないことを聞きつつやったけど、今回は無料枠登録からPollyでテキスト⇒音声変換するまで、思い出しつつやったので、記憶に定着しました。
無駄にEc2のLinuxは動かしていますが、もちろんまだまだ無料枠の範囲です。ちなみに一番消費しているのは、30 GB of Amazon Elastic Block Storageが12.5%になっています。
###やったこと
・開発スタイルを確立する
・前回のコード
・少し改善
・音を聞く
###・開発スタイルを確立する
登録は親切なものが多いのでまんまマネをすれば作成できるように思う。
【参考】
初心者がAWSに挑戦してみるお
AWSアカウントを取得したら速攻でやっておくべき初期設定まとめ
ということで、オハイオに無事にEC2のサーバーを立てることが出来ました。
開発スタイルとしては、当初はviでプログラム作成していたけど、だんだん慣れてくると自PCのJupyterNotebookでプログラムを作成して、それをTeratermで送るスタイルになりました。
こちらの方が断然楽々です。
さらに、Billingやセキュリティは上にもあるけど、一番大切です。
当初は以下のコマンド利用しました。ただ、AWSの各ページやサービスに少し慣れてくるとS3のファイル操作もCLIからやれるけど、S3に直接ファイル弄った方が速いと思うようになってきました。
AWS CLIでS3を操作するコマンド一覧
###・前回のコード
S3使うにはkeyが必要ということで、参考を参考にしました。ちょっと画面は異なるけど、やっていることは分かると思います。
【参考】
awsのs3を操作する為のaccess keyとsecret keyを取得する(IAM)
EC2のubuntuインスタンスにいろいろPythonのLibをインストールした後、Teratermでいよいよプログラムを転送するときのユーザー名はubuntuでした。また、hostはアドレスIPv4パブリックIPアドレスをコピペして入れます。ちなみにTeratermの接続は切れずに終日接続しています。
ただ、インスタンスの所在がオハイオなのに東京に変わっていたりすると、インスタンスが0という表示になっていて、当初慌てます。
Teratermでものを自PCから転送や自PCに転送するときには、SSHSCRというコマンドで実施します。
ということで、以下の前回のコードが動きました。
このコードはboto3を使って、Textで示された文章をJoannaの音声に変換して、speech.mp3に保存するコードです。
import boto3
polly_client = boto3.Session(
aws_access_key_id=,
aws_secret_access_key=,
region_name='us-west-2').client('polly')
response = polly_client.synthesize_speech(VoiceId='Joanna',
OutputFormat='mp3',
Text = 'This is a sample text to be synthesized.')
file = open('speech.mp3', 'wb')
file.write(response['AudioStream'].read())
file.close()
次にこれを予めS3に作成したバケットに転送するコードが以下のとおりです。
# -*- coding: utf-8 -*-
import boto3
s3 = boto3.resource('s3') #S3オブジェクトを取得
bucket = s3.Bucket('s3のbucket-name')
bucket.upload_file('ec2のmp3ファイルを指定', 's3のbucketのdir指定')
でも、
s3_client = boto3.client('s3')
# Upload the file to S3
s3_client.upload_file('ec2のmp3ファイルを指定', 's3のbucket-name', 's3でのmp3ファイル名')
でも動きます。
###・少し改善
しかし、これだと両者ともS3でのファイルは非公開になっています(そういうセキュリティ設定がデフォルト)。この場合、S3サイトでファイル毎に公開にしないと外から参照(再生)できません。
参考のようにやると送信したままで、ACL=Publicに設定できるようです。しかし、今回はこの方法ではできませんでしたが、いろいろ試した(出来るを信じて調べた)結果、以下のコードで実現できました。
【参考】
boto3を使用してファイルをS3にアップロードして公開する方法は?
以下のコードでは上と比較して改善した点が二つあります。
①session = Session(profile_name="*****")により、鍵を直書きせずに済んでいる
②bucket.upload_file('ec2のファイル名', 's3でのファイル名', ExtraArgs={'ACL':'public-read'})により、転送したままで公開(参照)されているので、連続する音声を連続で公開できる
import boto3
from boto3 import Session
session = Session(profile_name="*****")
polly = session.client("polly")
response = polly.synthesize_speech(Text="こんにちわ、東京・横浜も少し曇りです。声はみずきさんです", OutputFormat="mp3", VoiceId="Mizuki")
file = open('ec2での保存ファイル名', 'wb')
file.write(response['AudioStream'].read())
file.close()
s3 = boto3.resource('s3') #S3オブジェクトを取得
bucket = s3.Bucket('s3のバケットDir名')
bucket.upload_file('ec2のファイル名', 's3でのファイル名', ExtraArgs={'ACL':'public-read'})
これで会話などのアプリの片側の仕組みができた。
###・音を聞く
以下のようなhtmlで聞ける。
※以下のindex.htmlとして、Teratermで転送し、さらに以下のコマンドでs3:バケットに転送すると普通にブラウザから聞こえます。
https://バケット名.s3.amazonaws.com/index.html
$ aws s3 cp --acl public-read index.html s3://バケット名/index.html
<html>
<body>
<figure>
<figcaption>Listen to the Answer:</figcaption>
<audio
autoplay
controls
src="speech0.mp3">
Your browser does not support the
<code>audio</code> element.
</audio>
</figure>
</body>
</html>
###まとめ
・AWSの無料枠を利用してAWSハッカソンのアプリを動かしてみた
・Pollyを使って日本語Text-音声変換して連続公開できた
・S3-ダウンロード、或いはLambda(Amazon Transcribe,Amazon Translate)で上りを作りたいと思う