如何将Rusoto Polly返回的流式Future对象的MP3数据保存到磁盘
依赖配置
首先确认你的Cargo.toml包含以下依赖:
[dependencies] rusoto_core = "0.48" rusoto_polly = "0.48" tokio = { version = "1.0", features = ["full"] } futures = "0.3"
可直接运行的完整代码
extern crate rusoto_core; extern crate rusoto_polly; use rusoto_core::Region; use rusoto_polly::{PollyClient, SynthesizeSpeechInput, Polly}; use tokio::fs::File; use tokio::io::AsyncWriteExt; use futures::StreamExt; #[tokio::main] async fn main() { let region = Region::UsEast1; let polly_client = PollyClient::new(region); let speech_input = SynthesizeSpeechInput{ engine: Option::from(String::from("neural")), language_code: None, lexicon_names: None, output_format: "mp3".to_string(), sample_rate: None, speech_mark_types: None, text: String::from("hello world!"), text_type: None, voice_id: String::from("Amy") }; // await触发异步任务执行并获取结果,生产环境请替换unwrap为自定义错误处理逻辑 let response = polly_client.synthesize_speech(speech_input).await.unwrap(); // 取出音频字节流 let mut audio_stream = response.audio_stream.unwrap(); // 创建异步文件句柄,不要使用std::fs的同步文件接口,会阻塞异步运行时 let mut output_file = File::create("output.mp3").await.unwrap(); // 逐块写入文件,也可以用下面一行代码简化拷贝逻辑: // tokio::io::copy(&mut audio_stream, &mut output_file).await.unwrap(); while let Some(chunk) = audio_stream.next().await { let chunk = chunk.unwrap(); output_file.write_all(&chunk).await.unwrap(); } println!("MP3文件已成功保存为output.mp3"); }
核心解决思路
- 异步方法返回的
Future本身是“待执行的任务定义”,不会主动运行,必须通过await触发执行并获取结果,不需要额外封装闭包 - Rust异步代码必须运行在异步运行时上,这里使用生态最通用的tokio运行时,给main函数添加
#[tokio::main]宏即可快速完成配置,同时要把main函数声明为async类型 - 所有异步操作后都需要加
await等待操作完成,否则会出现“任务未执行程序就退出”的问题
内容的提问来源于stack exchange,提问作者ghukill
相关产品推荐
相关产品推荐

