見出し画像

DjangoからAmazon Pollyを使う

Amazon PollyはAmazon Web Serviceの機械学習サービスの1つで、テキスト情報を音声に変換してくれるサービスです。

文字から音声に変換することで、眼が悪い人にとってユーザービリティの高いサービスにしたり、テキストを読み上げてもらうサービスもできるかもしれませんね。動画の音声を作ってもいいかもしれません。

では、さっそくAmazon Pollyを使っていきましょう!

パッケージのインストール

DjangoからAmazon Pollyを使うには3つのパッケージが必要になります。django、boto3、そしてawscliです。

boto3は、AWS SDK for Pythonと呼ばれるもので、要するにAWSにアクセスしたい時に使う、Python用のSDKですね(SDK:Software Development Kit)。名前の由来はよくわからないので、覚えにくいです(´;ω;`)

そして、awscliはAWS Command Line Interfaceの略で、AWSにコマンドラインからアクセスできるようにするツールです。

この2つを連携させることでAmazon Pollyを使うことができるようになります。

というわけで、仮想環境に入って、これらのパッケージをインストールしていきます。

pip install django
pip install boto3
pip install awscli

インストールはこれだけで完了です!

AWSでIAMユーザーの作成

続いて、Amazon Pollyで利用するIAMユーザーを作成します。

IAMは、AWSにおけるユーザー作成やその権限などを設定できるサービスです。AWSアカウントを作成するとそのユーザーはルートユーザーと呼ばれる、全ての権限をもったユーザーが作成されます。ただ、そのルートユーザーでなんでもできてしまう、というのが問題になることがあります。

ルートユーザーが乗っ取られた場合、悪意を持った人がなんでもできてしまうかもしれません。アカウントを共有していたら、誰が何を変更したのかわからない状態になります。

このような状態を避けるために、IAMユーザーで各ユーザーにそれぞれ必要な必要最低限の権限を与えることで、もしもの場合に備えておくことが多いです。

今回はAmazon Pollyだけを使うので、Amazon Pollyしか利用できないユーザーを作成するというわけですね。

まずは、AWSマネジメントコンソールでIAMサービスを選択します。

スクリーンショット 2021-04-03 11.40.28

画面上部にある[ユーザーを追加]ボタンを押して、ユーザーの作成を始めます。

スクリーンショット 2021-04-03 11.42.21

適当に名前をつけてユーザーを作成します。名前はなんでもいいですが、あとでどんなユーザーかわかりやすいようにしておく方が良いです。

下の、[AWSアクセスの種類を選択]に関しては、今回は[AWSマネジメントコンソールへのアクセス]は必要ないので、[プログラムによるアクセス]にだけチェックを入れます。

スクリーンショット 2021-04-03 11.43.20

次に進むと、アクセス許可を設定する画面になります。

[ユーザーをグループに追加]は、同じような権限を持ったユーザーを複数作成するのであれば、グループを作成しておくと便利です。そのグループにユーザーを追加/削除するだけで、そのグループに設定した権限を与えたりなくしたりすることができます。

[アクセス権限を既存のユーザーからコピー]はそのままですね。

今回は新しく作るので、[既存のポリシーを直接アタッチ]を選択します。ポリシーはAWSのサービスの利用権限を細かくわけています。このポリシーの一覧の中から必要な権限を選んで、ユーザーに付与することができます。

Amazon Pollyを使う場合は、検索バーに"polly"と入力して、Amazon Polly関連のポリシーをフィルターしましょう。

スクリーンショット 2021-04-03 11.46.23

[AmazonPollyFullAccess]にチェックを入れて次に進みましょう。

スクリーンショット 2021-04-03 11.47.17

タグの追加は任意です。作成しているサービスごとにタグを作っておくと、一覧にしたい時に便利です。

最後に確認画面があります。

スクリーンショット 2021-04-03 11.49.36

確認して問題なければ、下の方にある「ユーザーの作成」ボタンを押します。

スクリーンショット 2021-04-03 11.50.43

成功すると、サインイン用のアドレスや、アクセスキーID、シークレットアクセスキーをダウンロードできる画面になります。(画像ではセキュリティのため表示しません)

これらのキーを記憶するのは困難なので、忘れずに.csvファイルをダウンロードしておきましょう。このファイルは厳重管理しておきます。

AWS CLIのインストール

boto3からAWSサービスにアクセスするためには、利用するIAMユーザーを設定しなければなりません。そのための事前設定として、awscliに先ほど作成したキーを登録する必要があります。

awscliインストール後に、以下のコマンドを入力するとセットアップが開始されます。

aws configure

すると先ほどIAMユーザーで作成したアクセスキーIDなどを求められますので、それぞれ入力していきます。

下の2つに関しては、設定しなくても問題ないので、そのままデフォルトを利用したい場合は、何も入力せずにEnterキーを押します。

Default region name [us-west-2]: 
Default output format [None]:

※一応利用しているリージョンでAmazon Pollyが利用できるかは確認してくださいね。


これでAWS側の準備は完了です。

あとは、DjangoでAmazon Pollyを使ったモデルを作っていきましょう。

DjangoのPollyアプリケーションの作成

これからpollyというアプリケーションを作成していきますが、大部分は以前に書いたこちらの記事と一緒なので、違うところだけ紹介していきます。

今回は、以下コマンドでpollyアプリケーションを作成し、このアプリケーションにCRUDのCreateとRead部分を実装していきます。

python manage.py startapp polly

pollyアプリケーションのモデル

今回はシンプルに作りたいので、モデルにも最低限の情報だけつけていきます。(本当はモデルも作る必要はありませんが、このほうがわかりやすいと思うので…)

# polly/models.py

from django.db import models
import uuid

VOICE_CHOICES = [
   ('Takumi', '男性'),
   ('Mizuki', '女性'),
]

class Polly(models.Model):
   id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) 
   talker = models.CharField(max_length=10,choices=VOICE_CHOICES)
   remark = models.TextField(max_length=400)
   audio = models.FileField(upload_to="polly_speech", blank=True, null=True)

まずidにUUIDを設定します。これは作成した音声ファイル名にUUIDを設定して被らないようにするためです。

talkerは、Amazon Pollyで話す人を設定します。Amazon Pollyで日本語を使える音声は、現在2種類あります。男性の"Takumi"と女性の"Mizuki"です。これを設定するためのフィールドとしてtalkerを作成しています。これ以外の文字列を入力されるとエラーになってしまうので、選択肢を事前に用意してそこから選んでもらうようにします。

remarkは文字列情報です。ここに入力した文字列をAmazon Pollyに送信して音声に変換してもらいます。

audioは作成した音声ファイルを保存するフィールドです

FileFieldは静的ファイルを利用するので、settings.pyとurls.pyに以下を設定するのを忘れないようにしてください。

# settings.py

MEDIA_URL = 'media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
# urls.py 

from django.conf import settings
from django.conf.urls.static import static

...省略...

if settings.DEBUG:
  urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

pollyアプリケーションのCreateView

さて、ここがちょっと悩むところです。Djangoでデータを作成する場合、Amazon Pollyからの音声ファイルはいつどうやって作成すればいいのでしょうか。

CreateViewの入力フォームから、男性/女性の種類とテキスト情報を入力してもらうので、その後に作る必要がありますよね。

そこで、フォームに入力した後に、Djangoが呼ぶ関数がありますので、それを使うことにします。それは[form_valid]という関数です。

[form_valid]はフォームに入力された内容に問題がなかった場合に呼ばれる関数です。ここでtalkerとremarkに入力された情報をAmazon Pollyに渡して、音声ファイルを入手することにします。

まずはPollyCreateViewがどうなっているかみてみましょう。

# polly/views.py

from django.views import generic 
from django.urls import reverse_lazy
from boto3 import Session
from contextlib import closing
from .models import Polly
from django.conf import settings
from django.core.files.base import ContentFile

class PollyCreateView(generic.CreateView):
 model = Polly
 template_name = 'polly/create.html'
 success_url = reverse_lazy('polly:list')
 fields = ['talker','remark']
 
 def form_valid(self, form):
   polly = form.save(commit=False)
   response = use_polly(polly.talker,polly.remark)
   if "AudioStream" in response:
       with closing(response["AudioStream"]) as streamingbody:
           data = streamingbody.read()
           polly.audio.save(str(polly.id)+'.mp3',ContentFile(data))
   polly.save()
   return super().form_valid(form)

フォームで入力するフィールドは、talkerとremarkだけなので、この2つに限定します。audioはtalkerとremarkから作成するファイルなので、入力されては困りますからね。

前のView作成と大きく変わっているのはform_validの部分ですね。ここがフォーム入力後に呼ばれる処理です。

まずは、form.save(commit=False)と呼ぶことによって、フォームで入力した内容から作成されるモデル(polly)を取得します。commit=Falseとしているのはまだデータベースに保存する必要がないからです。このモデルにaudioを足してから保存することにします。

続いて、response = use_polly(polly.talker,polly.remark)でAmazon Pollyからデータを入手します。この関数については後述しますが、talkerとremarkを引数にとって、音声データを作成して返してくれます。

このデータはまだファイルになっていないので、データを受け取って、音声ファイルとして保存しているのが最後の部分です。作成したデータはresponse["AudioStream"]に入っているので、そこからデータを読み取って音声ファイルを作成しています。

with closing(response["AudioStream"])は、段落が終わったら最後にclose()を呼んでくれるだけです。

音声ファイルの保存は以下のコードで行っています。

 polly.audio.save(str(polly.id)+'.mp3',ContentFile(data))

最初の引数でファイルの名前を指定し、2つ目の引数にファイルの中身を入れています。DjangoのFileFieldはFileかContentFile型でないと受け付けないので、ContentFileで渡しています。

これでaudioに音声ファイルを保存することができてモデルデータが完成しました。最後にpolly.save()でデータベースに保存して完了です。

Amazon Pollyへのアクセス方法

最後にuse_polly関数の中身を紹介しておきます。最低限の実装として以下のようにしました。

def use_polly(voice,remark):

   # create session
   session = Session(profile_name="default")
   polly = session.client("polly")

   # create audio data
   response = polly.synthesize_speech(
               Text = remark,
               OutputFormat = "mp3",
               VoiceId = voice)

   return response

最初にboto3を利用してAWSと接続するセッションを作成します。profile_name="default"と指定すると、aws configureで設定したアクセスキーIDなどでAWSに接続します。

そして、次の行で"polly"を使うクライアントを作成します。これで事前準備が完了しました。

次のpolly.synthesize_speechで、実際にAmazon Pollyに接続しに行っています。Textに音声に変換して欲しい文字列、OutputFormatで音声ファイルのフォーマット、VoiceIdで音声の種類を設定しています。

この関数の中で音声ファイルを作成してしまうと、変な場所にファイルが作成されてしまうので、ここではデータのresponseを返すようにしています。

これでAmazon Pollyから、テキスト情報を音声ファイルに変換して、データベースに保存することができるようになりました。

あとは、いろいろ遊んでみてください!(*´꒳`*)

サンプルサイト

repl.itにここまでに作成した内容を残しておきます。真ん中の再生ボタンを押すと、今回作成した部分を確認できます。また、左側にあるCodeタブを選択すると、ファイル構成やファイルの内容を確認できます。

※repl.itからAmazon Pollyに接続できないので、データの追加/変更はできません。

もし試したい方は、自分の環境にサンプルサイトをダウンロードして、awscliにあなたのアクセスキーIDやシークレットアクセスキーを設定してください。


ここまで読んでいただけたなら、”スキ”ボタンを押していただけると励みになります!(*´ー`*)ワクワク

この記事が気に入ったらサポートをしてみませんか?