新闻详情

新闻详情

首页 / 资讯中心 / 详情

AWS SDK for Rust 实战:Amazon Polly 语音合成与发音词典开发指南

发布时间:2026/9/29 2:27:57来源:尧图网络
AWS SDK for Rust 实战:Amazon Polly 语音合成与发音词典开发指南
示例工程教程后端【免费下载链接】aws-doc-sdk-examplesWelcome to the AWS Code Examples Repository. This repo contains code examples used in the AWS documentation, AWS SDK Developer Guides, and more. For more information, see the Readme.md file below.项目地址https://gitcode.com/gh_mirrors/aw/aws-doc-sdk-examples点击查看免费下载Amazon Polly 是 AWS 提供的文本转语音Text-to-Speech, TTS云服务可将 UTF-8 纯文本或 SSML语音合成标记语言转换为逼真的人声。本指南以当前仓库中 rustv1/examples/polly 目录下的 README 与六个 Rust 示例程序为骨架完整讲解如何用 AWS SDK for Rust 实现语音试听DescribeVoices、发音词典管理PutLexicon/ListLexicons与语音合成下载SynthesizeSpeech等核心能力并延伸到基于预签名 URL 的鉴权化请求与分页拉取等进阶用法。读完本文你可以直接在本地cargo run运行全部示例掌握一套可复用的 Polly Rust 开发模板。示例概览一个 crate 对应 Polly 核心 API本目录是一个独立的 Rust 包crate包名为polly-code-examples见 rustv1/examples/polly/Cargo.toml。它把每个 Polly 操作实现为独立的二进制目标src/bin/下的.rs文件使用cargo run --bin 程序名分别执行这种一个动作一个入口的组织方式便于对照 API 逐个学习。依赖清单中与本主题直接相关的关键 crate 如下aws-sdk-pollyv1.3.0Polly 服务的官方 SDK提供Client、types::{OutputFormat, VoiceId, Engine, Voice}以及presigning::PresigningConfig等类型aws-configv1.0.1启用behavior-version-latest负责读取环境变量、配置文件中的凭证与区域tokiov1.20.1启用full异步运行时所有示例入口都标注了#[tokio::main]clapv4.4启用derive命令行参数解析tracing-subscriberv0.3.15启用env-filter结合RUST_LOG环境变量控制日志级别。六个示例程序的职责二进制目标对应 Polly API核心功能polly-helloworld.rsDescribeVoices入门示例列出可用声音并筛选支持神经引擎Neural的语音describe-voices.rsDescribeVoices列出当前区域所有可用的声音名称与语言list-lexicons.rsListLexicons列出当前区域已存储的发音词典put-lexicon.rsPutLexicon上传自定义发音词典词条替换规则synthesize-speech.rsSynthesizeSpeech将文本合成为 MP3 并保存到本地synthesize-speech-presigned.rsSynthesizeSpeech预签名生成合成语音的预签名请求可委托给不具备 AWS 凭证的客户端发起运行前置条件运行这些示例需要满足以下条件完整说明见 rustv1/README.mdAWS 账户与凭证按 AWS SDK for Rust 官方入门文档配置默认凭证与区域。SDK 会自动读取~/.aws/credentials、~/.aws/config以及环境变量。Rust 工具链需要安装 Cargo通常通过 rustup 安装。区域选择本示例未在所有 AWS 区域经过测试Polly 部分能力尤其是神经语音依赖区域可用性建议使用us-west-2等 Polly 完整支持的区域。常用环境变量SDK 与示例程序会读取以下环境变量均摘录自 rustv1/README.mdAWS_REGION/AWS_DEFAULT_REGION请求发往的区域AWS_PROFILE指定使用哪个 AWS CLI 配置档profile中的凭证AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEYIAM 用户或角色的访问密钥RUST_LOG控制 tracing 日志级别——info显示常规输出{crate_name}debug显示单次操作细节aws_smithy_http_tower::dispatchtrace打印每次调用的完整 HTTP 请求aws_smithy_http::middlewaretrace打印完整 HTTP 响应AWS_SDK_UA_APP_ID为每个 SDK 请求的 User-Agent 附加自定义应用名。区域解析链所有示例的统一模式六个示例在main()中使用了完全相同的区域解析逻辑例如 describe-voices.rslet region_provider RegionProviderChain::first_try(region.map(Region::new)) .or_default_provider() .or_else(Region::new(us-west-2));优先级依次为命令行-r/--region参数 → SDK 默认区域提供链即AWS_REGION/AWS_DEFAULT_REGION环境变量→ 硬编码兜底us-west-2。随后通过aws_config::from_env().region(region_provider).load().await加载共享配置并创建Client::new(shared_config)。当-v/--verbose开启时还会打印PKG_VERSION来自aws_sdk_polly::meta::PKG_VERSION与最终生效区域便于排查配置问题。单动作示例详解四大 Polly 核心调用以下四个程序是 README 中列出的单动作Single actions示例分别演示一次独立服务调用并给出对应源码位置。1. 列出可用声音DescribeVoices程序入口 describe-voices.rs核心逻辑位于list_voices函数describe-voices.rsasync fn list_voices(client: Client) - Result(), Error { let resp client.describe_voices().send().await?; println!(Voices:); let voices resp.voices(); for voice in voices { println!( Name: {}, voice.name().unwrap_or(No name!)); println!( Language: {}, voice.language_name().unwrap_or(No language!)); println!(); } println!(Found {} voices, voices.len()); Ok(()) }关键点describe_voices().send()返回DescribeVoicesOutput通过voices()迭代器逐个读取Voice结构体的name()声音 ID与language_name()人类可读语言名如 US English。注意这里使用了unwrap_or做容错避免个别字段缺失时 panic。运行方式cargo run --bin describe-voices -- -r us-west-2 -v进阶手动分页与神经引擎筛选polly-helloworld.rs 展示了DescribeVoices的完整分页模式——用loop不断携带next_token发起请求直到响应中next_token()为Nonelet mut tok: OptionString None; loop { let mut req client.describe_voices(); if let Some(tok) tok { req req.next_token(tok); } let resp req.send().await?; // 收集 voice 到 VecVoice tok match resp.next_token() { Some(next) Some(next.to_string()), None break, }; }随后通过supported_engines()判断每个声音是否支持Engine::Neural输出所有神经语音 ID——这是挑选高质量语音的实用技巧let neural_voices voices .iter() .filter(|voice| { voice.supported_engines().iter() .collect::VecEngine() .contains(Engine::Neural) }) .map(|voice| voice.id().unwrap()) .collect::Vec_();2. 上传发音词典PutLexicon程序入口 put-lexicon.rs核心逻辑位于make_lexicon函数put-lexicon.rs。它动态拼装一段 PLSPronunciation Lexicon SpecificationXML把指定单词映射为自定义发音let content format!(?xml version\1.0\ encoding\UTF-8\? lexicon version\1.0\ xmlns\http://www.w3.org/2005/01/pronunciation-lexicon\ xmlns:xsi\http://www.w3.org/2001/XMLSchema-instance\ xsi:schemaLocation\http://www.w3.org/2005/01/pronunciation-lexicon http://www.w3.org/TR/2007/CR-pronunciation-lexicon-20071212/pls.xsd\ alphabet\ipa\ xml:lang\en-US\ lexemegrapheme{}/graphemealias{}/alias/lexeme /lexicon, from, to); client .put_lexicon() .name(name) .content(content) .send() .await?; println!(Added lexicon);命令行参数通过 clap derive 解析见 put-lexicon.rs-n, --name必填词典名称-f, --from必填要被替换的原始词grapheme即字素-t, --to必填替换后的词alias即别名-r, --region、-v, --verbose与其他示例一致。运行示例cargo run --bin put-lexicon -- -n mylex -f W3C -t World Wide Web ConsortiumXML 中alphabetipa表示使用国际音标字母表xml:langen-US限定适用语言lexeme是词条容器grapheme描述书面形式alias提供替代读音/念法。合成语音时 Polly 会优先套用词典中匹配的替换规则。3. 列出发音词典ListLexicons程序入口 list-lexicons.rs核心逻辑位于show_lexicons函数list-lexicons.rsasync fn show_lexicons(client: Client) - Result(), Error { let resp client.list_lexicons().send().await?; println!(Lexicons:); let lexicons resp.lexicons(); for lexicon in lexicons { println!( Name: {}, lexicon.name().unwrap_or_default()); println!( Language: {:?}\n, lexicon.attributes().as_ref() .map(|attrib| attrib.language_code.as_ref() .expect(languages must have language codes)) .expect(languages must have attributes) ); } println!(Found {} lexicons., lexicons.len()); Ok(()) }要点lexicon.attributes()返回可选的LexiconAttributes其中language_code记录词典适用的语言。示例代码对attributes的缺失直接使用expect——这是示例代码的简化写法实际生产代码建议改为match/if let做优雅降级。运行方式cargo run --bin list-lexicons -- -r us-west-24. 文本合成语音SynthesizeSpeech程序入口 synthesize-speech.rs核心逻辑位于synthesize函数synthesize-speech.rsasync fn synthesize(client: Client, filename: str) - Result(), Error { let content fs::read_to_string(filename); let resp client .synthesize_speech() .output_format(OutputFormat::Mp3) .text(content.unwrap()) .voice_id(VoiceId::Joanna) .send() .await?; // 从响应中取出 MP3 字节流并保存 let mut blob resp.audio_stream.collect().await.expect(failed to read data); let parts: Vecstr filename.split(.).collect(); let out_file format!({}{}, String::from(parts[0]), .mp3); let mut file tokio::fs::File::create(out_file) .await .expect(failed to create file); file.write_all_buf(mut blob).await.expect(failed to write to file); Ok(()) }技术细节解读output_format(OutputFormat::Mp3)指定输出格式Polly 还支持其他格式如 Ogg Vorbis、PCM本示例固定为 MP3voice_id(VoiceId::Joanna)固定使用 Joanna 声音可通过DescribeVoices的结果替换为任意可用 VoiceId含前文筛出的神经语音text()接受纯文本或 SSML 字符串输入文件为 UTF-8 编码即可响应中的audio_stream是一个异步字节流ByteStream调用.collect().await聚合全部字节后写入本地文件输出文件名与输入文件同名、扩展名替换为.mp3例如输入input.txt输出input.mp3。命令行参数-f, --filename必填指向包含待合成文本的文件-r, --region、-v, --verbose可选。运行方式echo Hello from Amazon Polly hello.txt cargo run --bin synthesize-speech -- -f hello.txt -r us-west-2进阶生成预签名请求synthesize-speech-presigned.rs 展示了无需持有 AWS 凭证即可让第三方发起合成请求的经典做法——用 SDK 生成带签名的预签名 URLasync fn make_request( client: Client, content: str, expires_in: u64, ) - Result(), Boxdyn Error { let expires_in Duration::from_secs(expires_in); let presigned_request client .synthesize_speech() .output_format(OutputFormat::Mp3) .text(content) .voice_id(VoiceId::Joanna) .presigned(PresigningConfig::expires_in(expires_in)?) .await?; println!(From client: {:?}, presigned_request); Ok(()) }关键 API 是aws_sdk_polly::presigning::PresigningConfig::expires_in(duration)用于设置预签名请求的有效期。示例中-e, --expires-in未提供时默认 900 秒15 分钟见 synthesize-speech-presigned.rs。这种方式适合把合成语音能力安全地暴露给 Web 前端或移动端有效期内的请求无需凭证即可执行。运行与测试说明运行示例所有示例使用统一命令cargo run --bin 程序名 -- 参数具体参数含义已在各小节列出。也可以先cargo build后直接执行target/debug/程序名。注意运行这些示例会产生真实的 AWS API 调用可能产生费用。运行测试本目录未内置独立测试文件按 rustv1/examples/polly/README.md 与 rustv1/README.md 的约定Rust 示例的测试统一遵循以下规则单元测试cargo test——只运行不访问 AWS 的本地测试不会产生费用集成测试cargo test -- --ignored——会真实调用 AWS 服务可能产生费用或资源变更需谨慎执行。成本与安全提醒README 中明确列出四条 ⚠ 重要提示务必遵守运行本示例可能产生 AWS 账户费用参见 AWS Pricing 与 Free Tier 说明运行测试同样可能产生费用建议遵循最小权限原则least privilege——只授予完成任务所需的最低权限例如仅为 IAM 用户配置polly:SynthesizeSpeech、polly:DescribeVoices等必要的polly:*权限示例代码并未在所有 AWS 区域经过测试请先确认目标区域提供 Polly 服务。从示例到生产调用链小结把六个示例串起来可以看到一条完整的 Polly 开发链路put_lexicon上传自定义发音词典词条替换规则list_lexicons校验词典是否就绪并查看其语言属性describe_voices含polly-helloworld的神经引擎筛选选定合适声音synthesize_speech按词典规则 选定声音 指定格式MP3完成合成需要对外鉴权分发时用synthesize-speech-presigned的预签名请求模式替代直接合成。SDK 层面对应的核心调用链为aws_config::from_env()加载共享配置 →Client::new(config)构建客户端 → 每个操作通过client.xxx().参数().send().await?发起异步请求 → 从*Output结构体中读取结果字段或字节流。这套模式在 aws-sdk-rust 的所有服务中通用掌握后可平滑迁移到其他 AWS 服务。延伸阅读本目录根 READMErustv1/examples/polly/README.md其中列出的 Amazon Polly 开发者指南、Polly API 参考与aws-sdk-pollycrate 文档均为官方一手资料可作为深入研读入口Rust 示例全局说明rustv1/README.md包含环境变量清单、Docker 镜像Beta与 Rust 版本维护说明本仓库其他语言的 Polly 实现可作为对照学习资源例如 dotnetv3/Polly 与 go/polly旧版布局下的同名操作示例。Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.SPDX-License-Identifier: Apache-2.0赞分享示例工程教程后端【免费下载链接】aws-doc-sdk-examplesWelcome to the AWS Code Examples Repository. This repo contains code examples used in the AWS documentation, AWS SDK Developer Guides, and more. For more information, see the Readme.md file below.项目地址https://gitcode.com/gh_mirrors/aw/aws-doc-sdk-examples点击查看免费下载相关推荐使用 AWS SDK for .NET 操作 Amazon Polly语音合成与发音词典的完整示例指南使用 AWS SDK for .NET 操作 Amazon Polly语音合成与发音词典的完整示例指南 导读 本指南基于开源仓库 aws doc sdk ex示例工程教程后端基于 AWS SDK for Go 的 Amazon Polly 语音合成与语音资源管理实战指南基于 AWS SDK for Go 的 Amazon Polly 语音合成与语音资源管理实战指南 导读 本文以 go/polly https://link.gi示例工程教程后端使用 AWS SDK for Python (Boto3) 开发 Amazon Polly 语音合成与唇形同步应用实战指南使用 AWS SDK for Python Boto3 开发 Amazon Polly 语音合成与唇形同步应用实战指南 导读 本文基于 aws doc sdk示例工程教程后端上一篇拆解Kubebuilder项目结构kubebuilder init生成的目录布局完全指南下一篇用sherpa-onnx实现实时语音转文字完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Python Machine Learning 2nd Edition 代码仓库导航指南:从环境搭建到 16 章实战 Notebook 全索引 2026/9/29 7:57:49

Python Machine Learning 2nd Edition 代码仓库导航指南:从环境搭建到 16 章实战 Notebook 全索引

示例工程机器学习深度学习 【免费下载链接】python-machine-learning-book-2nd-edition The "Python Machine Learning (2nd edition)" book code repository and info resource 项目地址: https://gitcode.com/gh_mirrors/py/python-machine-learning-bo…

阅读更多 →
异步加载实战指南:从懒加载到路由分包的首屏提速方案 2026/9/29 7:57:49

异步加载实战指南:从懒加载到路由分包的首屏提速方案

前端圈这两年都在聊性能优化,什么首屏加载、白屏时间、秒开率,归根结底绕不开一个核心问题:用户拿到页面到真正能操作,到底等了多久。而异步加载,恰恰是我在项目里体会到“性价比最高、收益最明显”的一招。我最早接触…

阅读更多 →
Element Select调试破局:Vue指令实现状态时间线回放 2026/9/29 7:57:48

Element Select调试破局:Vue指令实现状态时间线回放

接手前端项目的人,多少都经历过这种“鬼打墙”:测试或者用户丢来一句“下拉框有问题”,你打开页面,照着脑补的步骤狂点,它偏偏一切正常。Element Select 和调试这两个词放到一起,几乎就是这种玄学现场的代名…

阅读更多 →
Argos Translate 离线翻译排错指南:从装不上到跑得快的 5 个常见卡点 2026/9/29 7:57:42

Argos Translate 离线翻译排错指南:从装不上到跑得快的 5 个常见卡点

Argos Translate 离线翻译排错指南:从装不上到跑得快的 5 个常见卡点 【免费下载链接】argos-translate Open-source offline translation library written in Python 项目地址: https://gitcode.com/GitHub_Trending/ar/argos-translate Argos Translate 是…

阅读更多 →
Python 大麦网自动抢票脚本实战教程:3 步跑通自动下单工具 2026/9/29 7:57:42

Python 大麦网自动抢票脚本实战教程:3 步跑通自动下单工具

Python 大麦网自动抢票脚本实战教程:3 步跑通自动下单工具 【免费下载链接】Automatic_ticket_purchase 大麦网抢票脚本 项目地址: https://gitcode.com/GitHub_Trending/au/Automatic_ticket_purchase 本文以开源 Python 大麦网自动抢票脚本为对象&#xff…

阅读更多 →
C++网络联机五子棋源码拆解:Qt与TCP实战解析 2026/9/29 7:57:42

C++网络联机五子棋源码拆解:Qt与TCP实战解析

简介:面向C游戏开发与网络编程学习者,这份源码完整实现了可实时联机的五子棋小游戏。项目采用客户端/服务端架构,客户端基于QT框架完成界面与交互,网络层分别使用Windows和Linux平台下的socket编程,支持公网对局&#…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉