edge-tts-rust 0.1.0

High-performance Rust client for Microsoft Edge Read Aloud TTS
Documentation

edge-tts-rust

High-performance, async-first Rust client for Microsoft Edge Read Aloud TTS.

Features

  • Async streaming synthesis for long text and backend workloads
  • Voice listing, rate, volume, pitch, and word/sentence boundary timestamps
  • Library API and simple CLI
  • Unit tests, integration tests, and optional live tests

Build

cargo build --release

CLI

cargo run -- --text "Hello, world" --voice en-US-EmmaMultilingualNeural --write-media out.mp3 --write-subtitles out.srt

List voices:

cargo run -- --list-voices

Library Usage

use edge_tts_rust::{Boundary, EdgeTtsClient, SpeakOptions};

#[tokio::main]
async fn main() -> edge_tts_rust::Result<()> {
    let client = EdgeTtsClient::new()?;
    let result = client
        .synthesize(
            "Hello from Rust",
            SpeakOptions {
                voice: "en-US-EmmaMultilingualNeural".into(),
                boundary: Boundary::Sentence,
                ..SpeakOptions::default()
            },
        )
        .await?;

    println!("audio bytes: {}", result.audio.len());
    println!("boundaries: {}", result.boundaries.len());
    Ok(())
}

Streaming:

use edge_tts_rust::{EdgeTtsClient, SpeakOptions, SynthesisEvent};
use futures_util::StreamExt;

#[tokio::main]
async fn main() -> edge_tts_rust::Result<()> {
    let client = EdgeTtsClient::new()?;
    let mut stream = client
        .stream("hello from rust", SpeakOptions::default())
        .await?;

    while let Some(event) = stream.next().await {
        match event? {
            SynthesisEvent::Audio(chunk) => println!("audio chunk: {}", chunk.len()),
            SynthesisEvent::Boundary(boundary) => println!("boundary: {}", boundary.text),
        }
    }
    Ok(())
}

Testing

cargo test

Run the optional live test:

EDGE_TTS_ONLINE_TEST=1 cargo test --test live

Run benchmarks:

cargo bench