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"