mcpField
A
amazon-polly

amazon-polly

github.com/calesthioクリエイティブ・メディア221102 回インストール15 週間前に更新
リポジトリ

amazon-polly について

AWS管理の音声を使ってAmazon Pollyで音声合成を行う、本番向けのスキルです。開発者やメディアチーム向けに、エンジン選択、SSML、発音制御、タイミング情報の使い方を案内します。

主な機能

  1. 014種類の音声エンジン
  2. 02リアルタイムと非同期の合成
  3. 03SSMLと発音辞書による制御
  4. 04タイミングや口形用のスピーチマーク
  5. 05複数形式での音声出力

活用シーン

  1. 01編集動画のナレーション制作
  2. 02記事やオーディオブックの長尺音声生成
  3. 03IVRや通知音声の作成
  4. 04単語単位の字幕やアバター用キューの生成

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/calesthio/generative-media-skills --skill amazon-polly

インストール後、Claude Code で/amazon-pollyを入力して読み込まれたか確認します。

同梱ファイルEVAL.md

詳細

Amazon Polly による本番環境向け TTS

AWS ホスト型のテキスト読み上げが必要で、予測可能な API 操作、IAM ガバナンス、レキシコン、SSML、生成音声の再利用が求められる場合は、Amazon Polly を使用します。Polly は本番環境向けの TTS サービスとして扱い、音声クローン作成システムとしては扱わないでください。AWS が管理する音声とエンジンを提供しますが、カスタム音声のトレーニングや任意の話者の模倣には対応していません。

以下の情報は、2026-07-10 に AWS の公式ドキュメントで確認済みです。価格、クォータ、リージョン、音声の一覧、エンジン機能の互換性など、変動しやすい情報を根拠にする前に、AWS のドキュメントを再確認してください。

最初に決めること:操作とエンジン

まず操作を選択します。操作によって、レイテンシ、出力の管理方法、タイミングの選択肢が決まります。

  • SynthesizeSpeech:リアルタイムのリクエスト/レスポンスです。短いナレーション、UI プロンプト、音声プレビュー、バッチでのセグメント合成、音声マークの JSON に使用します。入力上限は合計 6,000 文字で、課金対象の文字数は 3,000 文字までです。音声出力は 10 分で打ち切られます。ドキュメントで確認済みの情報:https://docs.aws.amazon.com/polly/latest/dg/limits.html
  • StartSpeechSynthesisTask:Amazon S3 への非同期合成で、必要に応じて SNS 通知も利用できます。長い記事、オーディオブックの章、トレーニングモジュール、HTTP 音声ストリームを開いたままにしたくないサーバーワークフローに使用します。入力上限は合計 200,000 文字で、課金対象の文字数は 100,000 文字までです。ドキュメントで確認済みの情報:https://docs.aws.amazon.com/polly/latest/APIReference/API_StartSpeechSynthesisTask.html
  • StartSpeechSynthesisStream:HTTP/2 を介した双方向のストリーミング入出力です。テキストの到着中に生成音声をストリーミングする必要があるアプリケーションに限って使用します。ドキュメントによると、現在この操作がサポートするのは generative エンジンのみで、JSON 音声マークには対応していません。出典:https://docs.aws.amazon.com/polly/latest/APIReference/API_StartSpeechSynthesisStream.html

次に、エンジンを選択します。

  • standard:最も幅広い互換性があり、記載されている商用価格が最も低く、ユーティリティプロンプト、IVR、大量の通知音声、表現力よりもコストや対応範囲が重要なワークフローに適しています。AWS は Standard 音声を連結合成として説明しています。
  • neural:standard より自然な音声で、すべての音声マーク、多くの SSML タグ、非同期合成、一部の Newscaster 話し方スタイルに対応しています。音声マークや SSML による制御が重要なナレーション制作では、適切なデフォルトです。
  • long-form:記事、トレーニング、マーケティング動画など、長めのナラティブコンテンツ向けに設計されています。2026-07-10 時点で AWS がドキュメントに記載している long-form 音声は 6 種類のみです。en-US の Danielle、Gregory、Ruth、Patrick と、es-ES の Alba、Raúl です。利用可能なリージョンは US East (N. Virginia) のみです。長時間の読み上げ品質を重視し、音声と言語の制約が合う場合に使用します。
  • generative:Polly ファミリーの中で最も会話的で適応性の高いエンジンで、ストリーミングに対応し、人間らしい変化がより大きくなります。機能上の制約に問題がない場合、会話型アシスタントのセリフ、バーチャルトレーナー、広告風の読み上げに使用します。重要な仕様上の制約:音声マークは現在利用できません。Newscaster スタイルには対応していません。AWS は、更新後にモデルの出力が変わる可能性があると警告しています。また、不適切または途中で切れた出力のリスクを低減しますが、完全には排除しない、幻覚および緊急停止の安全機構が組み込まれています。出典:https://docs.aws.amazon.com/polly/latest/dg/generative-voices.html

本番環境では Engine の指定を省略しないでください。一部の SDK/CLI では standard がデフォルトになります。選択した音声が Standard に対応していない場合、リクエストが失敗することがあります。本番用の音声を決定する前に、DescribeVoices または最新の AWS 音声ページで、音声、エンジン、リージョンの互換性を確認してください。

メディア制作に影響する機能上の制約

確認されている事実:

制作上の経験則:

  • 単語/ビゼームマーク、安定したセグメントの再生成、SSML による制御、幅広い音声への対応が必要な場合は、編集済み動画のナレーションには Neural を優先してください。
  • Long-form は、限られた音声、言語、リージョンの選択肢で要件を満たせる場合に限り、長い章に使用してください。それ以外の場合は、Neural の合成を文の切れ目で分割し、音声をローカルで結合してください。
  • 会話の自然さを優先する場合は Generative を使用し、音声が挿入、切り詰め、または予期せず生成されていないかを確認する QA 工程を追加してください。正確なスピーチマークのタイミングが必須の場合は、合成後に別途 ASR でタイミングを取得できない限り、Generative は使用しないでください。
  • 大量のユーティリティ音声、8 kHz または μ-law/a-law が重要な電話音声、あるいは予算と高いスループットを優先する場合は Standard を使用してください。

SSML と発音の制御

台本で決定的なポーズ、日付、頭字語、外国語の区間、発音の修正、または構造マークが必要な場合は、SSML を使用します。TextType="ssml" を設定し、ペイロードを <speak>...</speak> で囲みます。

ドキュメントに記載された事実:

制作上のヒューリスティック:

  • SSML は最小限にしてください。Polly のエンジンはすでに韻律を推定します。マークアップを使いすぎると、読み上げがロボットのようになり、将来の音声の入れ替えも困難になります。
  • 極端な <prosody rate> やピッチの制御を使う前に、句読点や文の書き換えを試してください。
  • 編集上必要な箇所だけに明確なタイミングのポーズを入れてください。自然なナレーションでは、<break> タグを密に並べるのではなく、文の区切りや読点を使ってください。
  • 繰り返し使うブランド名や製品名の発音は、スクリプトごとにインラインの <phoneme> タグを指定するのではなく、レキシコンとして保存してください。
  • 多言語の挿入では、言語全体の内容にはその言語のネイティブ音声を使用してください。<lang> は短いフレーズや名前にのみ使用し、その言語がネイティブではない音声を使う場合は、アクセントのある発音になることを想定してください。

製品解説向けの SSML 例:

<speak>
  <p>
    Meet <sub alias="Acme Cloud One">ACME C1</sub>.
    <break time="250ms"/>
    It turns noisy incident data into a ranked action plan.
  </p>
  <p>
    In <say-as interpret-as="date" format="mdy">07-10-2026</say-as> tests,
    teams cut triage time by <say-as interpret-as="cardinal">42</say-as> percent.
  </p>
  <p>
    <mark name="cta_start"/>Start with one service, then expand.
  </p>
</speak>

この構成が有効な理由:<sub> は頭字語が一文字ずつ読み上げられる揺れを防ぎ、<break> は編集ポイントを作り、<say-as> はデータの読み方を明確にし、<mark> は、選択したエンジンが SSML の音声マークをサポートしている場合に、オーバーレイのタイミングを決定的に示します。

字幕、ハイライト、リップシンクのためのスピーチマーク

後続の成果物でタイミングが必要な場合は、スピーチマークを使用します。

  • word:カラオケ字幕、テキストのハイライト、字幕の同期、アクセシビリティレビュー。
  • sentence:大まかな字幕や編集の区切り。
  • ssml:ビジュアルオーバーレイ用の <mark name="..."/> タグによるキューポイント。
  • viseme:2D/3Dアバターリグ用の口形タイミング。

ドキュメントに記載されている事実:

本番ワークフロー:

  1. タイミングを生成する前に、ナレーションのテキストを確定します。
  2. 選択したエンジン、音声、テキスト、テキストタイプ、サンプルレート、レキシコンを指定して音声を合成します。
  3. テキスト、エンジン、音声、テキストタイプ、レキシコンはまったく同じにして、OutputFormat="json" と必要な SpeechMarkTypes を指定し、2回目のリクエストを行います。
  4. スピーチマークの JSON を使って字幕や口の動きのキューを作成します。テキストを後から編集した場合は、音声とマークの両方を再生成してください。
  5. オーバーレイを重ねた最終ミックス音声を再生して検証します。単語マークはタイミングの補助であり、人による字幕の品質確認の代わりにはなりません。

リップシンクでは、Polly のビジーム名をリグの口形セットに対応付け、遷移を滑らかにします。ビジームは音素レベルの正解データではありません。ブレンド区間を追加し、破裂音/摩擦音を視覚的にテストしてください。

選択した音声/エンジンでスピーチマークを提供できない場合は、互換性のある別の音声/エンジンを使うか、合成後に強制アラインメント/ASR を実行してください。これは本番環境での回避策であり、AWS のドキュメントに記載された同等の機能ではありません。

レキシコン

製品名、頭字語、独特な綴り、人名、専門用語、ロケール固有の用語など、繰り返し発生する発音の修正にはレキシコンを使用します。

ドキュメントに記載されている事実:

本番環境でのヒューリスティクス:

  • プロジェクト用のレキシコンとブランド用のレキシコンは分けて管理します。そうすれば、他の制作物に影響を与えずにプロジェクト固有の上書きを削除できます。
  • 実際に使用する音声とエンジンでレキシコンをテストします。発音の修正によって、その単語の前後のリズムが変わることがあります。
  • あらゆるケースを網羅する巨大なレキシコンは避けてください。レイテンシーが増加し、発音のデバッグが難しくなる場合があります。
  • 2 つのレキシコンが同じ書記素に一致する可能性がある場合は、リクエスト内の順序を意図的に指定し、本番チーム向けに期待する上書き動作を記載します。

PLS レキシコンの例:

<?xml version="1.0" encoding="UTF-8"?>
<lexicon version="1.0"
  xmlns="http://www.w3.org/2005/01/pronunciation-lexicon"
  alphabet="ipa"
  xml:lang="en-US">
  <lexeme>
    <grapheme>ACME C1</grapheme>
    <alias>Acme Cloud One</alias>
  </lexeme>
  <lexeme>
    <grapheme>Qdrant</grapheme>
    <phoneme>ˈkjuː drænt</phoneme>
  </lexeme>
</lexicon>

出力とマスタリングの選択肢

動画編集では、ミキシングや書き出しに耐えられる十分に高いサンプルレートを指定してください。

  • 非可逆圧縮を許容できる軽量なプレビューやウェブナレーションには、MP3を使用します。
  • オーディオに大幅な処理やノーマライズを施す場合、またはローカルのマスタリングチェーンで変換する場合は、PCMを使用します。
  • ターゲットのランタイムで必要な場合は、OGG形式を使用します。
  • 操作が対応していれば、自然な音声を制作するには24 kHz以上を使用し、TTSの音量タグに頼らず、ポスト処理でラウドネスをノーマライズします。
  • テレフォニーでは、8 kHz μ-law/a-lawやPCMなど、必要なナローバンド形式/レートを使用し、実際の電話/オーディオ経路でテストします。

制作時のQAチェックリスト:

  • 名前、数値、幻覚による単語、末尾の途切れ、不自然な息継ぎ、トーンの不一致を確認するため、部分的な確認だけでなく出力全体を聴きます。
  • 生成されたトランスクリプトやキャプションを、承認済みの台本と照合します。
  • トランスコード後に、最初と最後の500 msが途切れていないことを確認します。
  • 音楽/SFXとのミキシング後に、目標ラウドネスとトゥルーピークを確認します。
  • AWSのモデル更新や音声の変化によって新たに生成したセリフが以前のセリフと一致しなくなる場合は、その音声/エンジンのすべてのセグメントを再レンダリングします。AWSは、Long-formおよびGenerativeのテクノロジーが更新後に変わる可能性があると明示的に警告しています。
  • 複数セグメントの編集では、文または段落の区切りで合成し、クロスフェード用のハンドルを残します。

IAM、S3、カストディ、プライバシー

文書化されている事実:

本番環境でのセキュリティ上の指針:

  • 音声合成ワーカーには、必要な Polly アクション、非同期出力先となる S3 プレフィックス、必要に応じた SNS の発行権限、必要に応じた CloudWatch/CloudTrail の可視性のみを付与し、SSE-KMS を使用する場合は特定のキーに対する KMS 権限のみを付与してください。
  • ライフサイクルポリシーの設定と削除を簡素化するため、プロジェクトと環境ごとに S3 プレフィックスを分けてください(tts/dev/...、tts/prod/...)。
  • ワークフローで明示的なプライバシー承認と保持管理がない限り、シークレット、口座番号、医療情報、個人識別情報を送信しないでください。
  • 規制対象データを扱う場合は、選択したリージョン、S3 バケット、KMS キー、ログ記録、保持期間、コンプライアンスプログラムの適用範囲が、組織の義務に合致していることを確認してください。Polly がコンプライアンス要件の対象になっていても、それだけでアプリケーション全体がコンプライアンスに準拠するわけではありません。

権利、同意、開示

文書化されている範囲:Polly が提供するのは AWS の音声であり、カスタム音声のクローンサービスではありません。それでも、本番環境ではポリシーへの配慮が必要です。

  • 許可を得ておらず、かつ聞き手が状況を明確に理解できない場合は、実在の人物がセリフを話したと誤解させないでください。
  • 地域の合成メディア開示法、プラットフォームのポリシー、広告規則、アクセシビリティ要件、クライアントのブランド規則に従ってください。
  • 合成するテキストの権利を確認してください。Polly の出力に関する権利があっても、元の台本、書籍、記事、翻訳の著作権がクリアされるわけではありません。
  • 一般公開されるキャラクターについては、エンジン、音声 ID、リージョン、サンプルレート、レキシコン、発音に関する注記、例を記載したボイスバイブルを管理し、今後のセリフでも一貫性を保てるようにしてください。
  • 子ども、健康、金融、政治、法律に関するコンテンツは、公開前に台本の承認と人による音声レビューを必須にしてください。

例

例:字幕と口の動きの手がかりを付けた短い動画のナレーション

目的:単語ごとの字幕と、必要に応じてアバターの口の動きを付けて、30秒の商品ナレーションを作成します。

判断:

  • エンジン:neural。スピーチマークに対応しており、自然さがStandardより優れているためです。
  • 操作:SynthesizeSpeech。各段落が短いためです。
  • 出力:音声のMP3またはPCMと、個別のJSONスピーチマークです。
  • タイミングマーク:word、sentence、visemeです。

Pythonの例:

import boto3

polly = boto3.client("polly", region_name="us-east-1")

text = """<speak>
<p>Meet ACME Cloud One. <break time="200ms"/> It turns noisy incident data into a ranked action plan.</p>
<p><mark name="cta"/>Start with one service, then expand.</p>
</speak>"""

common = {
    "Engine": "neural",
    "VoiceId": "Joanna",
    "Text": text,
    "TextType": "ssml",
    "SampleRate": "24000",
    "LexiconNames": ["BrandLex"],
}

audio = polly.synthesize_speech(**common, OutputFormat="mp3")
with open("narration.mp3", "wb") as f:
    f.write(audio["AudioStream"].read())

marks = polly.synthesize_speech(
    **common,
    OutputFormat="json",
    SpeechMarkTypes=["word", "sentence", "viseme", "ssml"],
)
with open("narration.marks.jsonl", "wb") as f:
    f.write(marks["AudioStream"].read())

品質確認:BrandLexがus-east-1に存在すること、音声の言語が辞書の言語と一致すること、生成された字幕が承認済みのスクリプトと一致することを確認します。

例:S3への非同期の章のレンダリング

目的:多数の短いリクエストを管理せずに、長いトレーニング用の章を単一の音声ファイルに変換します。

判断:

  • 操作:章がリアルタイムのSynthesizeSpeechの制限を超えるため、StartSpeechSynthesisTaskを使用します。
  • エンジン:音声、言語、リージョンの要件を満たす場合に限りlong-formを使用します。それ以外の場合はneuralを使用して、ローカルで分割します。
  • 管理:バケットの暗号化、ライフサイクル、アクセスポリシーが設定済みの、プロジェクト専用のS3プレフィックスに書き込みます。

Pythonの例:

import boto3

polly = boto3.client("polly", region_name="us-east-1")

response = polly.start_speech_synthesis_task(
    Engine="long-form",
    VoiceId="Ruth",
    TextType="ssml",
    Text=open("chapter_01.ssml", encoding="utf-8").read(),
    OutputFormat="mp3",
    SampleRate="24000",
    OutputS3BucketName="company-media-prod",
    OutputS3KeyPrefix="tts/training-2026/chapter-01/",
    SnsTopicArn="arn:aws:sns:us-east-1:123456789012:polly-render-events",
)

print(response["SynthesisTask"]["TaskId"])
print(response["SynthesisTask"].get("OutputUri"))

品質確認:GetSpeechSynthesisTaskをポーリングするか、SNSをサブスクライブし、出力ファイルが想定したS3プレフィックスに存在することを確認します。最初から最後まで再生して聞き、章の推定時間と長さを比較します。

例:アクセシブルな字幕でGenerativeを選択するか判断する

ユーザーの依頼:「最も人間らしいAmazon Pollyの音声を使って、正確な単語単位の字幕を作成してください。」

本番環境での適切な回答:Generativeは最も会話的に聞こえる可能性がありますが、現時点ではスピーチマークの生成に対応していないため、正確な単語単位の字幕には、Pollyのマークを使用できるNeural/Long-formの音声か、合成後のアライメントワークフローが必要だと説明します。字幕が必須で、その音声で問題ない場合はNeuralを推奨します。ASRや強制アライメントによるタイミング調整を追加の品質確認手順として許容できる場合に限り、Generativeを選択します。

トラブルシューティング

  • InvalidSsmlException:XMLを検証し、予約文字をエスケープし、選択したエンジンでサポートされていないタグを削除して、入れ子になったマークアップを簡素化します。
  • LexiconNotFoundException:リージョン、辞書名のスペル、リクエストの順序、および合成クライアントが辞書のアップロード先と同じリージョンを使用しているかを確認します。
  • LanguageNotSupportedExceptionまたは音声/エンジンのエラー:使用するエンジンとリージョンを指定してDescribeVoicesを呼び出します。音声がすべてのエンジンに対応していると仮定しないでください。
  • MarksNotSupportedForFormatException:マークはOutputFormat="json"のみでリクエストし、音声は別のリクエストで生成します。
  • スロットリング:エンジンごとのTPSと同時リクエスト数のクォータを守り、バックオフとジッターを適用してバッチ処理します。トラフィックモデルに応じて、クォータの引き上げを申請してください。
  • ピックアップ後にセグメントが一致しない場合:ケイデンスとルームトーンの一貫性を保つため、変更した単語だけでなく、その前後の文または段落を再生成します。

2026-07-10 に確認した公式ソース

コメント