aboutsummaryrefslogtreecommitdiffstats
path: root/tests/tts_smoke.rs
blob: e98d56dd1e42dcad05fde388bba1eeba18d3059b (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
//! Smoke test: verify piper-rs loads the Polish model and synthesizes audio.

use std::path::Path;

#[test]
fn piper_load_and_synthesize() {
    let model_dir = Path::new(env!("CARGO_MANIFEST_DIR")).join("piper");
    let onnx = model_dir.join("pl_PL-bass-high.onnx");
    let json = model_dir.join("pl_PL-bass-high.onnx.json");

    assert!(onnx.exists(), "model file missing: {}", onnx.display());
    assert!(json.exists(), "config file missing: {}", json.display());

    let mut piper =
        piper_rs::Piper::new(&onnx, &json).expect("failed to load piper model");

    let text = "Kamil sie zespawnił";
    let (samples, sample_rate) = piper
        .create(text, false, None, None, None, None)
        .expect("synthesis failed");

    assert!(!samples.is_empty(), "no samples produced");
    assert!(sample_rate > 0, "invalid sample rate: {sample_rate}");
    assert!(
        samples.len() as u32 > sample_rate / 10,
        "suspiciously short output: {} samples at {} Hz",
        samples.len(),
        sample_rate
    );

    let duration = samples.len() as f64 / sample_rate as f64;
    println!(
        "OK: '{}' → {} samples @ {} Hz ({:.2}s)",
        text,
        samples.len(),
        sample_rate,
        duration,
    );

    // Second call measures cached-model synthesis speed
    let start = std::time::Instant::now();
    let (samples2, sr2) = piper
        .create("Kamil jest chujem", false, None, None, None, None)
        .expect("second synthesis failed");
    let elapsed = start.elapsed();
    println!(
        "Cached: '{}' → {} samples @ {} Hz in {:?}",
        "Kamil jest chujem",
        samples2.len(),
        sr2,
        elapsed,
    );
    assert!(!samples2.is_empty());
}