8
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

めちゃくちゃ簡単 Amazon Polly

Last updated at Posted at 2019-12-15

AIとか音声解析とか聞くとなんか難しそうだけど、Amazonが提供しているサービスを使うと簡単に実装できるので、試してみた!

Amazon Pollyとは

文章をリアルな音声に変換するサービス。テキスト読み上げができるアプリケーションを作成できるため、まったく新しいタイプの音声対応製品を構築できる。Polly は、高度な深層学習技術を使用したテキスト読み上げサービスで、人間の声のような音声を合成します。

ひと昔前はあきらか、機会が読んでる感じの音声だったけど、かなり人間に近い音声!!

ひとまず実装してみる

環境を作成するのが手間なのでLambdaを使って実装。
プログラムはLambdaで提供があるPython 3.7。

入力された音声をPollyを使って音声に変換し、mp3ファイルをS3に保存する。
これだけでOK。

from boto3 import Session
from boto3  mport resource
from contextlib import closing
import os
import sys

def lambda_handler(event, context):
    session = Session(region_name="ap-northeast-1")
    polly = session.client("polly")
    
    s3 = resource('s3')
    bucket = s3.Bucket("XXXXXXXX")
    
    response = polly.synthesize_speech(
        Text=event['text'],
        #Engine="neural",
        OutputFormat="mp3",
        VoiceId="Mizuki")
    with closing(response["AudioStream"]) as stream:
        bucket.put_object(Key="test1.mp3", Body=stream.read())

簡単にプログラムの解説。

from boto3 import Session
from boto3  mport resource

AWSの各種サービスを簡単に仕様できるライブラリboto3を使って実装。
resourceはS3を使用しているので必要。
※ライブライはC++、Go、Java、JavaScript,.Net、Node.js、PHP、Rubyがある

    session = Session(region_name="ap-northeast-1")
    polly = session.client("polly")

サービスを使用するためには必ずSessionというAWSとの接続情報が必要。
リージョンはアジア東京を指定。
pollyを使用するためのオブジェクト取得。

    s3 = resource('s3')
    bucket = s3.Bucket("XXXXXXXX")

S3に保存する為、保存先のバケットを取得。
XXXXXXXXはバケット名を取得

polly.synthesize_speech

これがAmazonから提供されている「プレーメテキストまたはSSMLをバイトストリームに変換」する関数。
API仕様 こちらから

おもしろそうなところだと

  • Engine : standardまたはneural
    neuralはより人間に近い自然な感じで話す
    ※2019/12/20現時点では日本語未対応

  • TextType : ssml または text
    ssmlは発音、音量、ピッチ、話す速度など、音声のさまざまな要素をカスタマイズして制御できるようになる。

下の例だと
whispered:ささゆく声で
x-slow:ゆっくり
loud:呼吸音は多め


<speak>私には秘密があります。あなたにだけこっそり教えます。
<amazon:effect name="whispered">
<prosody rate="x-slow">
<prosody volume="loud">私は人間ではありません。</prosody>
</prosody>
</amazon:effect>
信じられますか?</speak>

サポートタグは こちら

VoiceId:話す人の声を選択できる

料金

従量課金制。処理したテキストの文字数に応じて毎月請求。
100 万字あたり 4.00 USD。ニューラル音声の料金は、100 万字あたり 16.00 USD。

料金例は こちらから

捕捉

ACCESS_KEY、SECRET_KEYを指定せずに正常にsessionが取得できているのはLambdaを使っているからですね。
ポリシーを作成し、Lambda実行するロールに割り当ている。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "polly:SynthesizeSpeech",
                "s3:ListBucket",
                "s3:PutObject"
            ],
            "Resource": "*"
        }
    ]
}

polly:SynthesizeSpeechの使用とs3への保存を許可。

これがないと下記のエラーが出る。

"errorMessage": "An error occurred (AccessDeniedException) when calling the SynthesizeSpeech operation: User: arn:aws:sts::XXXXXXXX:assumed-role/[role名] is not authorized to perform: polly:SynthesizeSpeech"
8
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?