You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 03:42:01