mcpField
A
amazon-polly

amazon-polly

github.com/calesthio创意与媒体221102 次安装15 周前更新
代码仓库

关于 amazon-polly

面向生产场景的 Amazon Polly 语音合成技能,使用 AWS 管理的语音,并指导开发者和媒体团队选择引擎、配置 SSML 与发音控制及时间标记。

主要功能

  1. 01四种语音引擎可选
  2. 02实时与异步语音合成
  3. 03SSML 与发音词典控制
  4. 04用于时间和口型提示的语音标记
  5. 05多种音频输出格式

适用场景

  1. 01制作剪辑视频的旁白
  2. 02生成长篇文章或有声书音频
  3. 03构建 IVR 与通知提示音
  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 文档。

首先决定:选择哪种操作和引擎

先选择操作,因为这决定了延迟、输出存储方式和时间选项:

然后选择引擎:

  • standard:兼容性最广、列出的商业价格最低,适合实用型提示、IVR、大批量通知音频,以及成本/覆盖范围比表现力更重要的工作流。AWS 将 Standard 语音描述为拼接合成。
  • neural:比 standard 更自然,支持所有语音标记、许多 SSML 标签、异步合成,以及选定的 Newscaster 说话风格。若生成旁白时需要语音标记或 SSML 控制,这是不错的默认选择。
  • long-form:专为文章、培训和营销视频等较长的叙事内容设计。截至 2026-07-10,AWS 文档仅列出六种 long-form 语音: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 语音页面核实语音、引擎和区域之间的兼容性。

影响媒体制作的能力边界

已记录的事实:

制作启发:

  • 如果需要词语/viseme 标记、稳定地重新生成片段、SSML 控制和广泛的语音覆盖范围,大多数经过剪辑的视频旁白应优先选择 Neural。
  • 仅当有限的语音、语言和区域范围符合需求时,才优先选择 Long-form 来处理较长章节;否则,应在句子边界拆分 Neural 合成,并在本地拼接音频。
  • 如果追求对话的真实感,可优先选择 Generative,但应增加质量检查环节,留意是否出现插入、截断或意外的语音;如果必须获得精确的语音标记时间,除非能在合成后通过单独的 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> 可消除数据表达的歧义,而在所选引擎支持 SSML 语音标记时,<mark> 可为叠加内容的定时提供确定性提示。

用于字幕、高亮和口型同步的语音标记

如果下游产物需要时间信息,请使用语音标记:

  • word:卡拉 OK 字幕、文本高亮、字幕对齐、无障碍审查。
  • sentence:粗略字幕或剪辑节拍。
  • ssml:通过 <mark name="..."/> 标签提供视觉叠加效果的提示点。
  • viseme:用于 2D/3D 虚拟形象骨骼的口型时间信息。

已记录的事实:

生产工作流:

  1. 生成时间信息前,先定稿旁白文本。
  2. 使用选定的引擎、语音、文本、文本类型、采样率和词典合成音频。
  3. 使用完全相同的文本、引擎、语音、文本类型和词典发起第二次请求,但将 OutputFormat="json",并设置所需的 SpeechMarkTypes。
  4. 使用语音标记 JSON 创建字幕或口型提示;之后若编辑文本,请务必重新生成音频和标记。
  5. 播放最终混音并查看叠加效果,以进行验证。单词标记仅用于辅助计时,不能替代人工字幕质量检查。

对于口型同步,请将 Polly 视素名称映射到骨骼的口型集合,并平滑过渡。视素并非音素级的真实标注;请添加混合窗口,并从视觉上测试爆破音和摩擦音。

如果所选语音/引擎无法提供语音标记,请改用兼容的语音/引擎,或在合成后运行强制对齐/ASR。这是生产环境中的变通方案,并非 AWS 文档所述的等效方案。

词典

对于重复出现的发音修正,请使用词典:产品名称、首字母缩写、特殊拼写、人名、行话和特定区域用语。

已记录的事实:

生产经验法则:

  • 将项目词典与品牌词典分开,这样移除项目覆盖项时不会影响其他制作项目。
  • 使用确切的语音和引擎测试词典。发音修正可能会影响该词周围的语调节奏。
  • 避免使用包罗万象的大型词典;这类词典可能会增加延迟,也会让发音问题更难排查。
  • 如果两个词典都可能匹配同一个字素,请有意指定请求顺序,并记录预期的覆盖行为,供制作团队参考。

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 格式,请使用 OGG。
  • 如果操作支持,请使用 24 kHz 或更高采样率制作自然的人声;后期再进行响度标准化,不要依赖 TTS 音量标签。
  • 对于电话音频,请使用所需的窄带格式和采样率,例如 8 kHz μ-law/a-law 或 PCM,然后在实际电话/音频链路中进行测试。

制作质量检查清单:

  • 完整收听所有输出,而不只是抽查,留意姓名、数字、幻觉生成的词语、结尾截断、不自然的呼吸声和音调不匹配。
  • 将生成的转录文本或字幕与已批准的脚本进行比对。
  • 转码后确认开头和结尾的 500 ms 没有被截断。
  • 与音乐/音效混音后,检查目标响度和真峰值。
  • 如果 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

意图:将较长的培训章节转换为单个音频文件,无需管理许多短请求。

决策:

  • 操作:StartSpeechSynthesisTask,因为该章节超出了实时 SynthesizeSpeech 的限制。
  • 引擎:仅当语音、语言和区域要求均满足时才使用 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 核查的官方来源

评论

支持 Markdown