원클릭으로
amazon-polly-generative
Amazon Polly Generative Voices. Reference skill (loaded via skill:// from the ios agent).
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Amazon Polly Generative Voices. Reference skill (loaded via skill:// from the ios agent).
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
Amazon Location Service. Reference skill (loaded via skill:// from the ios agent).
Amazon Cognito — Custom UI with Passkeys, Social Login & Face ID. Reference skill (loaded via skill:// from the ios agent).
Builds generative AI applications on Amazon Bedrock. Covers model invocation (Converse API, InvokeModel), RAG with Knowledge Bases, Bedrock Agents, Guardrails, and AgentCore. Use when invoking models, setting up Knowledge Bases, creating agents, applying guardrails, deploying to AgentCore, troubleshooting Bedrock errors (ThrottlingException, AccessDeniedException), or choosing models (Claude, Llama, Nova, Titan). ALSO USE for prompt caching setup and debugging, quota health checks and throttling diagnosis, cost attribution and tracking, migrating between Claude model generations (4.5 to 4.6 to 4.7), chunking strategies, API selection (Converse vs InvokeModel), guardrail capabilities, and model selection. NOT for custom model training, Rekognition, or Comprehend.
| name | amazon-polly-generative |
| description | Amazon Polly Generative Voices. Reference skill (loaded via skill:// from the ios agent). |
Amazon Polly Generative engine produces the most human-like speech synthesis available on AWS. Use it for podcast-style content where naturalness, expressiveness, and conversational flow are critical.
| Voice ID | Gender | Language | Best For |
|---|---|---|---|
| Matthew | Male | en-US | Conversational, energetic host |
| Ruth | Female | en-US | Warm, articulate host |
| Stephen | Male | en-US | Authoritative, documentary |
| Gregory | Male | en-US | Calm, educational |
| Danielle | Female | en-US | Professional, clear |
import boto3
polly = boto3.client('polly', region_name='us-east-1')
response = polly.synthesize_speech(
Engine='generative',
OutputFormat='mp3',
SampleRate='24000',
Text='<speak>Hello from the road!</speak>',
TextType='ssml',
VoiceId='Matthew'
)
# Stream audio to S3
audio_stream = response['AudioStream'].read()
<speak>
<prosody rate="medium" pitch="medium">
Welcome back to the show!
</prosody>
<break time="500ms"/>
<prosody rate="slow" pitch="low">
Did you know that this highway was built in 1952?
</prosody>
</speak>
<speak>
<emphasis level="strong">Wow</emphasis>, that's incredible!
<break time="300ms"/>
<prosody rate="fast" pitch="high">
I can't believe we're already passing through Banff!
</prosody>
</speak>
<!-- Between speakers (natural conversation pause) -->
<break time="800ms"/>
<!-- Dramatic pause -->
<break time="1500ms"/>
<!-- Quick interjection pause -->
<break time="200ms"/>
<!-- Paragraph break -->
<break strength="x-strong"/>
<amazon:effect name="soft">
This is a little-known secret about this town...
</amazon:effect>
For two-host podcast content, generate the script in this structured format:
{
"segmentId": "seg-001",
"title": "The Ghost Town of Bankhead",
"duration_target_seconds": 90,
"dialogue": [
{
"speaker": "host_a",
"voiceId": "Matthew",
"text": "Okay so get this — we're about to pass through what used to be a thriving coal mining town.",
"ssml_hints": {
"rate": "medium",
"emphasis_words": ["thriving"]
}
},
{
"speaker": "host_b",
"voiceId": "Ruth",
"text": "Wait, a coal mining town? Here in the middle of the Rockies?",
"ssml_hints": {
"rate": "medium-fast",
"pitch": "high",
"emphasis_words": ["coal mining town"]
}
},
{
"speaker": "host_a",
"voiceId": "Matthew",
"text": "Yep! Bankhead. At its peak in 1911, over a thousand people lived here. They had a swimming pool, a tennis court, even a hockey rink.",
"ssml_hints": {
"rate": "medium",
"emphasis_words": ["thousand", "hockey rink"]
}
}
]
}
After generating individual voice clips per dialogue turn:
from pydub import AudioSegment
import io
def stitch_dialogue(turns: list[dict], audio_clips: list[bytes]) -> bytes:
"""Stitch individual Polly clips into a single podcast segment."""
combined = AudioSegment.empty()
for i, (turn, clip) in enumerate(zip(turns, audio_clips)):
segment = AudioSegment.from_mp3(io.BytesIO(clip))
combined += segment
# Add pause between speakers
if i < len(turns) - 1:
next_speaker = turns[i + 1]['speaker']
current_speaker = turn['speaker']
if next_speaker != current_speaker:
combined += AudioSegment.silent(duration=600) # Speaker change: 600ms
else:
combined += AudioSegment.silent(duration=300) # Same speaker continuation: 300ms
# Normalize to -16 dBFS (broadcast standard)
combined = combined.normalize()
output = io.BytesIO()
combined.export(output, format='mp3', bitrate='128k')
return output.getvalue()
from aws_cdk import aws_iam as iam
# Lambda role needs Polly access
polly_policy = iam.PolicyStatement(
actions=[
'polly:SynthesizeSpeech',
'polly:DescribeVoices',
'polly:GetSpeechSynthesisTask',
'polly:StartSpeechSynthesisTask'
],
resources=['*']
)
<break> tags at natural pause points (commas, periods aren't enough)