args for pitch/f0 method in http handler

This commit is contained in:
Brandon Thomas 2023-05-18 00:14:42 -07:00
parent caa3e3ae53
commit bd4bcab2c2
4 changed files with 93 additions and 9 deletions

View File

@ -3,6 +3,7 @@
-- noinspection SqlResolveForFile
-- Kill routed jobs
update generic_inference_jobs
set status = 'dead' where maybe_routing_tag IS NOT NULL
limit 100;
update generic_inference_jobs set status = 'dead' where maybe_routing_tag IS NOT NULL limit 100;
-- Get pending jobs
select count(*) from generic_inference_jobs where status = 'pending';

View File

@ -2,6 +2,9 @@
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
-- Kill pending jobs
update w2l_inference_jobs set status='dead' where status IN ('pending', 'started', 'attempt_failed');
-- Unstick old jobs that might be stuck as "started"
update w2l_template_upload_jobs
set status='dead'

View File

@ -32,6 +32,16 @@ pub enum InferenceCategoryAbbreviated {
VoiceConversion,
}
#[derive(Serialize, Deserialize, Clone, Copy, Debug)]
pub enum FundamentalFrequencyMethodForJob {
#[serde(rename = "c")] // NB: DO NOT CHANGE. It could break live jobs. Renamed to be fewer bytes.
Crepe,
#[serde(rename = "d")] // NB: DO NOT CHANGE. It could break live jobs. Renamed to be fewer bytes.
Dio,
#[serde(rename = "h")] // NB: DO NOT CHANGE. It could break live jobs. Renamed to be fewer bytes.
Harvest,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub enum PolymorphicInferenceArgs {
/// Text to speech. (Short name to save space when serializing.)
@ -44,8 +54,23 @@ pub enum PolymorphicInferenceArgs {
/// Argument for so-vits-svc
/// The python model defaults to true, but that sounds awful,
/// so we default to false unless specified.
#[serde(rename = "a")] // NB: DO NOT CHANGE. It could break live jobs. Renamed to be fewer bytes.
#[serde(skip_serializing_if = "Option::is_none")]
auto_predict_f0: Option<bool>,
/// Argument for so-vits-svc
/// The python model defaults to true, but that sounds awful,
/// so we default to false unless specified.
#[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<FundamentalFrequencyMethodForJob>,
/// Argument for so-vits-svc
/// The python model defaults to true, but that sounds awful,
/// so we default to false unless specified.
#[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<i32>,
},
}
@ -78,7 +103,7 @@ impl InferenceCategoryAbbreviated {
#[cfg(test)]
mod tests {
use crate::payloads::generic_inference_args::{GenericInferenceArgs, InferenceCategoryAbbreviated, PolymorphicInferenceArgs};
use crate::payloads::generic_inference_args::{FundamentalFrequencyMethodForJob, GenericInferenceArgs, InferenceCategoryAbbreviated, PolymorphicInferenceArgs};
use enums::by_table::generic_inference_jobs::inference_category::InferenceCategory;
use tokens::files::media_upload::MediaUploadToken;
use tokens::tokens::tts_models::TtsModelToken;
@ -107,6 +132,8 @@ mod tests {
inference_category: Some(InferenceCategoryAbbreviated::VoiceConversion),
args: Some(PolymorphicInferenceArgs::Vc {
auto_predict_f0: Some(false),
override_f0_method: None,
transpose: None,
}),
};
@ -114,7 +141,28 @@ mod tests {
// NB: Assert the serialized form. If this changes and the test breaks, be careful about migrating.
assert_eq!(json,
r#"{"cat":"vc","args":{"Vc":{"auto_predict_f0":false}}}"#.to_string());
r#"{"cat":"vc","args":{"Vc":{"a":false}}}"#.to_string());
// NB: Make sure we don't overflow the DB field capacity (TEXT column).
assert!(json.len() < 1000);
}
#[test]
fn many_voice_conversion_args_serialize() {
let args = GenericInferenceArgs {
inference_category: Some(InferenceCategoryAbbreviated::VoiceConversion),
args: Some(PolymorphicInferenceArgs::Vc {
auto_predict_f0: Some(false),
override_f0_method: Some(FundamentalFrequencyMethodForJob::Dio),
transpose: Some(-1),
}),
};
let json = serde_json::ser::to_string(&args).unwrap();
// NB: Assert the serialized form. If this changes and the test breaks, be careful about migrating.
assert_eq!(json,
r#"{"cat":"vc","args":{"Vc":{"a":false,"fm":"d","t":-1}}}"#.to_string());
// NB: Make sure we don't overflow the DB field capacity (TEXT column).
assert!(json.len() < 1000);
@ -126,6 +174,8 @@ mod tests {
inference_category: Some(InferenceCategoryAbbreviated::VoiceConversion),
args: Some(PolymorphicInferenceArgs::Vc {
auto_predict_f0: None, // NB: Do not serialize
override_f0_method: None,
transpose: None,
}),
};
@ -151,6 +201,8 @@ mod tests {
inference_category: Some(InferenceCategoryAbbreviated::VoiceConversion),
args: Some(PolymorphicInferenceArgs::Vc {
auto_predict_f0: Some(true),
override_f0_method: None,
transpose: None,
}),
});
@ -158,7 +210,7 @@ mod tests {
// NB: Assert the serialized form. If this changes and the test breaks, be careful about migrating.
assert_eq!(json,
r#"{"cat":"vc","args":{"Vc":{"auto_predict_f0":true}}}"#.to_string());
r#"{"cat":"vc","args":{"Vc":{"a":true}}}"#.to_string());
// NB: Make sure we don't overflow the DB field capacity (TEXT column).
assert!(json.len() < 1000);

View File

@ -15,7 +15,7 @@ use enums::common::visibility::Visibility;
use http_server_common::request::get_request_header_optional::get_request_header_optional;
use http_server_common::request::get_request_ip::get_request_ip;
use log::{info, warn};
use mysql_queries::payloads::generic_inference_args::{GenericInferenceArgs, InferenceCategoryAbbreviated, PolymorphicInferenceArgs};
use mysql_queries::payloads::generic_inference_args::{FundamentalFrequencyMethodForJob, GenericInferenceArgs, InferenceCategoryAbbreviated, PolymorphicInferenceArgs};
use mysql_queries::queries::generic_inference::web::insert_generic_inference_job::{InsertGenericInferenceArgs, insert_generic_inference_job};
use r2d2_redis::redis::Commands;
use redis_common::redis_keys::RedisKeys;
@ -52,6 +52,24 @@ pub struct EnqueueVoiceConversionInferenceRequest {
/// The python model defaults to true, but that sounds awful,
/// so we default to false unless specified.
auto_predict_f0: Option<bool>,
/// Argument for so-vits-svc
/// f0 estimation
override_f0_method: Option<FundamentalFrequencyMethod>,
/// Argument for so-vits-svc
/// Pitch controls for so-vits-svc
transpose: Option<i32>,
}
#[derive(Deserialize, Clone, Copy)]
pub enum FundamentalFrequencyMethod {
#[serde(rename = "crepe")]
Crepe,
#[serde(rename = "dio")]
Dio,
#[serde(rename = "harvest")]
Harvest,
}
#[derive(Serialize)]
@ -231,9 +249,19 @@ pub async fn enqueue_voice_conversion_inference_handler(
let mut maybe_args = None;
if let Some(auto_predict_f0) = request.auto_predict_f0 {
let set_args = request.auto_predict_f0.is_some()
|| request.transpose.is_some()
|| request.override_f0_method.is_some();
if set_args {
maybe_args = Some(PolymorphicInferenceArgs::Vc {
auto_predict_f0: Some(auto_predict_f0),
auto_predict_f0: request.auto_predict_f0,
override_f0_method: request.override_f0_method.map(|f| match f {
FundamentalFrequencyMethod::Crepe => FundamentalFrequencyMethodForJob::Crepe,
FundamentalFrequencyMethod::Dio => FundamentalFrequencyMethodForJob::Dio,
FundamentalFrequencyMethod::Harvest => FundamentalFrequencyMethodForJob::Harvest,
}),
transpose: request.transpose,
});
}