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
55
56
57
58
59
60
|
//! 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");
if !onnx.exists() || !json.exists() {
eprintln!(
"skip: piper model not present ({} / {})",
onnx.display(),
json.display()
);
return;
}
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());
}
|