From b8b10f6fc157bb80a4564bd2e2e49a80a3f4a2e0 Mon Sep 17 00:00:00 2001 From: Brandon Thomas Date: Thu, 18 May 2023 12:17:08 -0700 Subject: [PATCH] f0-method and frequency transpose for job --- .../src/payloads/generic_inference_args.rs | 12 +++---- .../job_types/vc/so_vits_svc/process_job.rs | 31 ++++++++++++++----- .../so_vits_svc_inference_command.rs | 25 +++++++++++++++ 3 files changed, 55 insertions(+), 13 deletions(-) diff --git a/crates/lib/mysql_queries/src/payloads/generic_inference_args.rs b/crates/lib/mysql_queries/src/payloads/generic_inference_args.rs index 72b12a44f2..e7236d6041 100644 --- a/crates/lib/mysql_queries/src/payloads/generic_inference_args.rs +++ b/crates/lib/mysql_queries/src/payloads/generic_inference_args.rs @@ -58,16 +58,16 @@ pub enum PolymorphicInferenceArgs { #[serde(skip_serializing_if = "Option::is_none")] auto_predict_f0: Option, - /// Argument for so-vits-svc - /// The python model defaults to true, but that sounds awful, - /// so we default to false unless specified. + /// Argument for so-vits-svc (-fm / --f0-method) + /// Crepe, dio, harvest, etc. + /// If unspecified, the model defaults to crepe #[serde(rename = "fm")] // NB: DO NOT CHANGE. It could break live jobs. Renamed to be fewer bytes. #[serde(skip_serializing_if = "Option::is_none")] override_f0_method: Option, - /// Argument for so-vits-svc - /// The python model defaults to true, but that sounds awful, - /// so we default to false unless specified. + /// Argument for so-vits-svc (-t / --transpose) + /// Pitch control. + /// If unspecified, the model uses "0". #[serde(rename = "t")] // NB: DO NOT CHANGE. It could break live jobs. Renamed to be fewer bytes. #[serde(skip_serializing_if = "Option::is_none")] transpose: Option, diff --git a/crates/service/job/inference_job/src/job/job_types/vc/so_vits_svc/process_job.rs b/crates/service/job/inference_job/src/job/job_types/vc/so_vits_svc/process_job.rs index 5fb962d84c..140c43ce46 100644 --- a/crates/service/job/inference_job/src/job/job_types/vc/so_vits_svc/process_job.rs +++ b/crates/service/job/inference_job/src/job/job_types/vc/so_vits_svc/process_job.rs @@ -155,22 +155,37 @@ pub async fn process_job(args: SoVitsSvcProcessJobArgs<'_>) -> Result None, - PolymorphicInferenceArgs::Vc { auto_predict_f0 } => *auto_predict_f0, + PolymorphicInferenceArgs::Vc { auto_predict_f0, .. } => *auto_predict_f0, }) .flatten() .unwrap_or(false); + let maybe_transpose = maybe_args + .map(|args| match args { + PolymorphicInferenceArgs::Tts { .. } => None, + PolymorphicInferenceArgs::Vc { transpose, .. } => *transpose, + }) + .flatten(); + + let maybe_override_f0_method = maybe_args + .map(|args| match args { + PolymorphicInferenceArgs::Tts { .. } => None, + PolymorphicInferenceArgs::Vc { override_f0_method, .. } => + *override_f0_method, + }) + .flatten(); + // ==================== RUN INFERENCE SCRIPT ==================== // let inference_start_time = Instant::now(); @@ -186,6 +201,8 @@ pub async fn process_job(args: SoVitsSvcProcessJobArgs<'_>) -> Result> { /// This sounds better when left off, but it defaults to *ON* if not specified. pub auto_predict_f0: bool, + /// --f0-method: f0 prediction method + pub maybe_override_f0_method: Option, + + /// --transpose: pitch adjustment + pub maybe_transpose: Option, + /// --device: cpu or cuda pub device: Device, } @@ -236,6 +243,24 @@ impl SoVitsSvcInferenceCommand { command.push_str(if args.auto_predict_f0 { "true" } else { "false" }); command.push_str(" "); + if let Some(transpose) = args.maybe_transpose { + let value = transpose.to_string(); + command.push_str(" --transpose "); + command.push_str(&value); + command.push_str(" "); + } + + if let Some(f0_method) = args.maybe_override_f0_method { + let method = match f0_method { + FundamentalFrequencyMethodForJob::Crepe => "crepe", + FundamentalFrequencyMethodForJob::Dio => "dio", + FundamentalFrequencyMethodForJob::Harvest => "harvest", + }; + command.push_str(" --f0-method "); + command.push_str(&method); + command.push_str(" "); + } + let device = match args.device { Device::Cuda => "cuda", Device::Cpu => "cpu",