add speed parameter

This commit is contained in:
ANLGBOY
2025-11-19 19:42:24 +09:00
parent c31b6745e4
commit 8518b839c1
30 changed files with 246 additions and 61 deletions

View File

@@ -26,6 +26,10 @@ struct Args {
#[arg(long, default_value = "5")]
total_step: usize,
/// Speech speed factor (higher = faster)
#[arg(long, default_value = "1.05")]
speed: f32,
/// Number of times to generate
#[arg(long, default_value = "4")]
n_test: usize,
@@ -53,6 +57,7 @@ fn main() -> Result<()> {
// --- 1. Parse arguments --- //
let args = Args::parse();
let total_step = args.total_step;
let speed = args.speed;
let n_test = args.n_test;
let voice_style_paths = &args.voice_style;
let text_list = &args.text;
@@ -85,11 +90,11 @@ fn main() -> Result<()> {
let (wav, duration) = if batch {
timer("Generating speech from text", || {
text_to_speech.batch(text_list, &style, total_step)
text_to_speech.batch(text_list, &style, total_step, speed)
})?
} else {
let (w, d) = timer("Generating speech from text", || {
text_to_speech.call(&text_list[0], &style, total_step, 0.3)
text_to_speech.call(&text_list[0], &style, total_step, speed, 0.3)
})?;
(w, vec![d])
};

View File

@@ -484,6 +484,7 @@ impl TextToSpeech {
text_list: &[String],
style: &Style,
total_step: usize,
speed: f32,
) -> Result<(Vec<f32>, Vec<f32>)> {
let bsz = text_list.len();
@@ -511,7 +512,12 @@ impl TextToSpeech {
})?;
let (_, duration_data) = dp_outputs["duration"].try_extract_tensor::<f32>()?;
let duration: Vec<f32> = duration_data.to_vec();
let mut duration: Vec<f32> = duration_data.to_vec();
// Apply speed factor to duration
for dur in duration.iter_mut() {
*dur /= speed;
}
// Encode text
let style_ttl_value = Value::from_array(style.ttl.clone())?;
@@ -584,6 +590,7 @@ impl TextToSpeech {
text: &str,
style: &Style,
total_step: usize,
speed: f32,
silence_duration: f32,
) -> Result<(Vec<f32>, f32)> {
let chunks = chunk_text(text, None);
@@ -592,7 +599,7 @@ impl TextToSpeech {
let mut dur_cat: f32 = 0.0;
for (i, chunk) in chunks.iter().enumerate() {
let (wav, duration) = self._infer(&[chunk.clone()], style, total_step)?;
let (wav, duration) = self._infer(&[chunk.clone()], style, total_step, speed)?;
let dur = duration[0];
let wav_len = (self.sample_rate as f32 * dur) as usize;
@@ -619,8 +626,9 @@ impl TextToSpeech {
text_list: &[String],
style: &Style,
total_step: usize,
speed: f32,
) -> Result<(Vec<f32>, Vec<f32>)> {
self._infer(text_list, style, total_step)
self._infer(text_list, style, total_step, speed)
}
}