Amazon Polly によって、テキストから音声合成

Amazon Polly は、文章をリアルな音声に変換するサービスで、テキストを読み上げるアプリケーションを作成して、新タイプの音声対応製品を構築できます。

Polly は、高度なディープラーニング技術を使用したテキスト読み上げ(TTS) サービスで、自然に聞こえるように人間の音声を合成します。

何十種類ものリアル音声を多数言語でサポートしているため、さまざまな国に対応した音声アプリケーションを構築できます。

Amazon Polly は、標準 TTS 音声に加えて、新しい機械学習アプローチによる音声品質の高度な改善を実現するニューラルテキスト読み上げ (NTTS) 音声を提供します。

ニューラルテキスト読み上げテクノロジーは、話し手の配信スタイルにより、ニュースキャスターの発話スタイルと、電話アプリケーションのような通信発話スタイルをサポートします。

組織専用のニューラルテキスト読み上げ (NTTS) 音声のために、カスタム音声を作成できます。

Amazon Polly の料金

実際に使用した分に対してのみ料金が発生する従量課金制モデルです。音声または Speech Marks のメタデータに変換したテキストの文字数に基づいて料金が計算されます。

生成した音声はキャッシュすることができ、追加料金なしで再生できます。

 標準音声     音声文字、または Speech Marks のリクエスト 100 万字に対して 4.00 USD
 ニューラル音声  音声文字、または Speech Marks のリクエスト 100 万字に対して 16.00 USD

 無料利用枠
  標準音声の場合、    音声の最初のリクエストから 12 か月間は 1 か月あたり 500 万文字まで、
              音声または Speech Marks リクエストが無料です。
  ニューラル音声の場合、 音声の最初のリクエストから 12 か月間は 1 か月あたり 500 万文字まで、
              音声または Speech Marks リクエストが無料です。

対話的アプリケーション:テキストの長さ音声の長さ標準 TTS コストニューラル TTS コスト
–  平均的な応答音声の長さ: 
  100 文字
各ユーザーについて
1 か月あたり 30,000 文字
~ 42 分0.12 USD0.48 USD
– 各ユーザー 1 か月あたり
  のリクエスト数:
   300 件
参考例

APIリファレンス

boto3  boto3.client関数

機能  デフォルトのセッションを使用して、低レベルのサービスクライアントを作成する
構文  boto3.client(クライアント名)
戻り値 サービスクライアントのオブジェクト

Polly  SynthesizeSpeechメソッド

機能
  UTF-8入力、プレーンテキストまたは整形式SSMLをバイトストリームに合成します。
  一部のアルファベットは、音素マッピングを使用しない限り、すべての音声で使用できない場合があります
  (たとえば、キリル文字が英語の音声でまったく読み取られない場合があります)

構文

SynthesizeSpeech{
   "Engine": "string",
   "LanguageCode": "string",
   "LexiconNames": [ "string" ],
   "OutputFormat": "string",
   "SampleRate": "string",
   "SpeechMarkTypes": [ "string" ],
   "Text": "string",
   "TextType": "string",
   "VoiceId": "string"
}

戻り値

HTTP/1.1 200
Content-Type: ContentType
x-amzn-RequestCharacters: RequestCharacters

AudioStream

構文説明

[Engine]		
		
	音声合成の入力テキストを処理するときに使用するAmazonPollyのエンジン(standard / neural)を指定します。	
	アマゾンポリーの声についてはNTTSのみ、標準のみで利用可能。	
		
	NTTSのみの声	
		
		Kevin(en-US)などのNTTSのみの音声を使用する場合、必須であり、neuralに設定する必要があります。
		エンジンが指定されていないか、standardに設定されている場合、エラーが発生します。
		タイプ:文字列
		有効な値:standard / neural
		指定は必須
		
		
	標準的な声	
		
		デフォルトは standardで、指定必須ではありません。
		指定がない場合、またはstandard指定でNTTSのみの音声が選択されている場合、エラーが発生します。
		タイプ:文字列
		有効な値: standard / neural
		指定は必須ではない
		
[LanguageCode]		
		
	SynthesizeSpeechリクエストのオプションの言語コード。
	インド英語(en-IN)またはヒンディー語(hi-IN)では、音声ID:Aditi を指定して、バイリンガル音声を使用できます。	
	言語コード指定がない場合、バイリンガルボイスのデフォルト言語(DescribeVoices操作によって返される言語)
	を使用し、Aditiはヒンディー語ではなくインド英語を使用します。	
	タイプ:文字列	
	有効な値: arb | cmn-CN | cy-GB | da-DK | de-DE | en-AU | en-GB | en-GB-WLS | en-IN | en-US | es-ES 
		| es-MX | es-US | fr-CA | fr-FR | is-IS | it-IT | ja-JP | hi-IN | ko-KR | nb-NO | nl-NL 
		| pl-PL | pt-BR | pt-PT | ro-RO | ru-RU | sv-SE | tr-TR	
	指定は必須ではない	
		
[LexiconNames]		
		
	合成中にサービスに適用する1つ以上の発音レキシコン名のリスト。
	レキシコンの言語が音声の言語と同じである場合にのみ適用されます。	
	タイプ:文字列の配列	
	配列メンバー:最大5アイテム。	
	パターン: [0-9A-Za-z]{1,20}	
	指定は必須ではない	
		
[OutputFormat]		
		
	出力のエンコード形式。オーディオストリームの場合、mp3、ogg_vorbis、pcm。スピーチマークの場合、json。	
	pcmを使用する場合、出力コンテンツは、署名付き16ビット、1チャネル(モノラル)、
	リトルエンディアン形式のaudio / pcmです。	
	タイプ:文字列	
	有効な値: json | mp3 | ogg_vorbis | pcm	
	指定は必須	
		
[SampleRate]		
		
	Hzで指定された可聴周波数。	
	mp3とogg_vorbisの有効な値は、「 8000 / 16000 / 22050 / 24000 」	
	標準音声のデフォルト値は「22050」	
	ニューラルボイスのデフォルト値は「24000」	
	pcmの有効な値は「8000 / 16000」 デフォルト値は「16000」	
	タイプ:文字列	
	指定は必須ではない	
		
[SpeechMarkTypes]		
		
	入力テキストに対して返されるスピーチマークのタイプ。	
	タイプ:文字列の配列	
	配列メンバー:最大4アイテム。	
	有効な値: sentence | ssml | viseme | word	
	指定は必須ではない	
		
[Text]		
		
	合成するテキストを入力します。ssml指定は、SSML形式に従います。	
	タイプ:文字列	
	指定は必須	
		
[TextType]		
		
	入力テキストがプレーンテキストであるかSSMLであるかを指定します。デフォルト値はプレーンテキスト。	
	タイプ:文字列	
	有効な値: ssml | text	
	指定は必須ではない	
		
[VoiceId]		
		
	合成に使用する音声ID。DescribeVoices操作を呼び出すことにより、使用可能な音声IDのリストを取得できます。	
	タイプ:文字列	
	有効な値: Aditi | Amy | Astrid | Bianca | Brian | Camila | Carla | Carmen | Celine | Chantal 
		| Conchita | Cristiano | Dora | Emma | Enrique | Ewa | Filiz | Geraint | Giorgio | Gwyneth 
		| Hans | Ines | Ivy | Jacek | Jan | Joanna | Joey | Justin | Karl | Kendra | Kevin | Kimberly
		| Lea | Liv | Lotte | Lucia | Lupe | Mads | Maja | Marlene | Mathieu | Matthew | Maxim | Mia
		| Miguel | Mizuki | Naja | Nicole | Penelope | Raveena | Ricardo | Ruben | Russell | Salli 
		| Seoyeon | Takumi | Tatyana | Vicki | Vitoria | Zeina | Zhiyu	
	指定は必須	

戻り値説明

アクションが成功すると、サービスはHTTP200応答を送り返します。		
応答は次のHTTPヘッダーを返します。		
		
	[ContentType]	タイプオーディオストリームを指定します。OutputFormat リクエストのパラメータが必要です。
		
		mp3としてリクエストしたOutputFormatの場合、 ContentTypeで返されるのは「audio / mpeg」です。
		ogg_vorbisとしてリクエストしたOutputFormatの場合、 ContentTypeで返されるのは「audio / ogg」です。
		pcmとしてリクエストするOutputFormatの場合、 ContentTypeで返されるのは、
		署名付き16ビット、1チャネル(モノラル)、リトルエンディアン形式の「audio / pcm」です。
		jsonとしてリクエストしたOutputFormatの場合、 ContentTypeで返されるのは「audio / json」です。
		
	[RequestCharacters]	
		
		合成された文字の数
		
	応答は、HTTPボディとして次を返します。	
		
	[AudioStream]	
		
		合成音声を含むストリーム

エラー内容

EngineNotSupportedException	
	
	このエンジンは、指定した音声と互換性がありません。
	エンジンと互換性のある新しいボイスを選択するか、エンジンを変更して操作を再開してください。
	HTTPステータスコード:400
	
InvalidSampleRateException	
	
	指定されたサンプルレートは無効です。
	HTTPステータスコード:400
	
InvalidSsmlException	
	
	指定したSSMLが無効です。SSML構文、タグと値のスペルを確認してから、再試行してください。
	HTTPステータスコード:400
	
LanguageNotSupportedException	
	
	指定された言語は、現在この機能でAmazonPollyによってサポートされていません。
	HTTPステータスコード:400
	
LexiconNotFoundException	
	
	AmazonPollyは指定されたレキシコンを見つけることができません。
	これは、レキシコンが欠落しているか、名前のスペルが間違っているか、別のリージョンにあるレキシコンを
	指定していることが原因である可能性があります。
	レキシコンが存在し、リージョン内にあり(ListLexiconsを参照)、名前のスペルが正しいことを確認します。
	その後、再試行してください。
	HTTPステータスコード:404
	
MarksNotSupportedForFormatException	
	
	選択した引用符はサポートされていませんOutputFormat。スピーチマークは、json形式のコンテンツでのみ使用できます。
	HTTPステータスコード:400
	
ServiceFailureException	
	
	不明な状態が原因でサービス障害が発生しました。
	HTTPステータスコード:500
	
SsmlMarksNotSupportedForTextTypeException	
	
	SSMLスピーチマークは、プレーンテキストタイプの入力ではサポートされていません。
	HTTPステータスコード:400
	
TextLengthExceededException	
	
	入力テキストのサイズは、最大1500文字の請求文字(合計3000文字)にすることができます。 
	SSMLタグは請求文字としてカウントされません。
	HTTPステータスコード:400

①テキストから音声ファイルを作成するプログラム polly_Speech.py

import boto3
import contextlib
import os
polly = boto3.client('polly')
text = 'Amazon Web Services の音声合成サービスを使って、プログラムを作りましょう。'
result = polly.synthesize_speech(Text=text, OutputFormat='mp3', VoiceId='Takumi')
path = 'polly_Speech.mp3'
with contextlib.closing(result['AudioStream']) as stream:
    with open(path, 'wb') as file:
        file.write(stream.read())
if os.name == 'nt':
    os.startfile(path)
PS C:\Users\mikol\polly> python polly_Speech.py

※ プログラム起動すると、Windowsの音声メディアを扱うアプリケーションがしゃべります

出力形式として、MP3を指定し、音声合成IDとして、日本語の男性音声である[Takumi]を指定しています。
Pythonの辞書である音声合成結果からキー ‘AudioStream’ で、音声ストリームを取得しています。
最終的に、 ‘polly_Speech.mp3’ファイルを生成しています。
os.name が ‘nt’ であることで、Windows環境であることを確認しています。

音声ID Voiceid	
	
	標準音声に対して、高音質の音声であるニューラル音声を利用できる場合もあります。
	
ニュースキャスタースタイル	
	
	英語(US)(en-US)の「Joanna」(女性)と「Matthew」(男性)ではニュースキャスター風の音声を使えます。
	SSML形式でテキストを指定する必要があります。
	
バイリンガル音声	
	
	音声ID:Aditiで、インド英語(en-IN)またはヒンディー語(hi-IN)のバイリンガル音声を使用できます。

②標準音声を合成するプログラム polly_normal.py

import boto3
import contextlib
import os
polly = boto3.client('polly')
text = 'Hi.My name is Joanna.'
result = polly.synthesize_speech(Text=text, OutputFormat='mp3', VoiceId='Joanna')
path = 'polly_standard.mp3'
with contextlib.closing(result['AudioStream']) as stream:
    with open(path, 'wb') as file:
        file.write(stream.read())
if os.name == 'nt':
    os.startfile(path)

③ニューラル音声を合成するプログラム polly_neural.py

import boto3
import contextlib
import os
polly = boto3.client('polly', 'us-east-1')
text = 'Hi.My name is Joanna.'
result = polly.synthesize_speech(Text=text, OutputFormat='mp3', VoiceId='Joanna', Engine='neural')
path = 'polly_neural.mp3'
with contextlib.closing(result['AudioStream']) as stream:
    with open(path, 'wb') as file:
        file.write(stream.read())
if os.name == 'nt':
    os.startfile(path)

④ニュースキャスタースタイルを合成するプログラム polly_newscaster.py

import boto3
import contextlib
import os
polly = boto3.client('polly', 'us-east-1')
text = '''
<speak>
<amazon:domain name="news">
Tonight was at the time of today's news. First is the topic of sports.
</amazon:domain>
</speak>
'''
result = polly.synthesize_speech(Text=text, OutputFormat='mp3', VoiceId='Joanna', Engine='neural', TextType='ssml')
path = 'polly_news.mp3'
with contextlib.closing(result['AudioStream']) as stream:
    with open(path, 'wb') as file:
        file.write(stream.read())
if os.name == 'nt':
    os.startfile(path)

Polly  describe_voicesメソッド

機能
  音声合成を要求するときに使用できる音声のリストを返します。
  SynthesizeSpeechによって音声合成するときに、 DescribeVoicesによって、必要な音声IDを指定できます。
  この操作には、polly:DescribeVoicesアクションを実行するためのアクセス許可が必要です。

構文

GET /v1/voices?Engine=Engine&IncludeAdditionalLanguageCodes=IncludeAdditionalLanguageCodes&LanguageCode=LanguageCode&NextToken=NextToken HTTP/1.1

戻り値

HTTP/1.1 200
Content-type: application/json

{
   "NextToken": "string",
   "Voices": [ 
      { 
         "AdditionalLanguageCodes": [ "string" ],
         "Gender": "string",
         "Id": "string",
         "LanguageCode": "string",
         "LanguageName": "string",
         "Name": "string",
         "SupportedEngines": [ "string" ]
      }
   ]
}

構文説明

[Engine]	
	
	音声合成の入力テキストを処理するときにAmazonPollyが使用するエンジン(standardまたはneural)を指定します。
	有効な値: standard | neural
	
[IncludeAdditionalLanguageCodes]	
	
	指定された言語を追加言語として使用するバイリンガル音声を返すかどうかを示すブール値。
	たとえば、米国英語(es-US)を使用するすべての言語を要求し、イタリア語(it-IT)と
	米国英語の両方を話すイタリア語の音声がある場合、yesでその音声が含まれますが、noは含まれません。
	
[LanguageCode]	
	
	返された音声のリストをフィルタリングするための言語識別タグ(言語名のISO639コード-ISO3166国コード)。
	このオプションのパラメーターを指定しない場合、使用可能なすべてのボイスが返されます。
	有効な値: arb | cmn-CN | cy-GB | da-DK | de-DE | en-AU | en-GB | en-GB-WLS | en-IN | en-US | es-ES 
		| es-MX | es-US | fr-CA | fr-FR | is-IS | it-IT | ja-JP | hi-IN | ko-KR | nb-NO 
	 	| nl-NL | pl-PL | pt-BR | pt-PT | ro-RO | ru-RU | sv-SE | tr-TR
	
[NextToken]	
	
	前のDescribeVoices 操作から返された不透明なページ付けトークン。存在する場合は続行する場所を示します。
	長さの制約:最小長=0 最大長=4096

戻り値説明

アクションが成功すると、サービスはHTTP200応答を送り返します。								
次のデータは、サービスによってJSON形式で返されます。								
								
[NextToken]								
								
	音声のリストを続行するために次のリクエストで使用するページネーショントークン。
	NextToken応答が切り捨てられた場合にのみ返されます。							
	タイプ:文字列							
	長さの制約:最小長は0です。最大長は4096です。							
								
[Voices]								
								
	プロパティを含む音声のリスト。							
	タイプ:Voiceオブジェクトの 配列							
								
		[Gender]		性別
		[Id]			音声ID
		[LanguageCode]		言語コード
		[LanguageName]		言語名
		[Name]			名前
		[SupportedEngines]	対応するエンジン

エラー内容

InvalidNextTokenException	
	
	NextTokenが無効です。スペルが正しいことを確認してから、再試行してください。
	HTTPステータスコード:400
	
ServiceFailureException
	
	不明な状態が原因でサービス障害が発生しました。
	HTTPステータスコード:500

②音声IDの一覧を取得するプログラム polly_voicelist.py

import boto3
import pprint
polly = boto3.client('polly')
result = polly.describe_voices()
pprint.pprint(result)
PS C:\Users\mikol\polly> python polly_voicelist.py	
	
{'ResponseMetadata': {'HTTPHeaders': {'content-length': '10425',	
                                      'content-type': 'application/json',	
                                      'date': 'Thu, 01 Jul 2021 06:34:15 GMT',	
                                      'x-amzn-requestid': '51113b47-a976-4770-9574-999999999999'},	
                      'HTTPStatusCode': 200,	
                      'RequestId': '51113b47-a976-4770-9574-999999999999',	
                      'RetryAttempts': 0},	
 'Voices': [{'Gender': 'Female',	
             'Id': 'Lotte',	
             'LanguageCode': 'nl-NL',	
             'LanguageName': 'Dutch',	
             'Name': 'Lotte',	
             'SupportedEngines': ['standard']},	
           :
           :
           :