mirror of
https://github.com/storytold/artcraft.git
synced 2026-11-05 01:38:44 +00:00
Creating the create voice job
This commit is contained in:
1 parent
25cdbf2f1d
commit
57eecb3757
3 files changed
+138
-63
No files matched your search
@@ -56,12 +56,19 @@ async fn dispatch_zero_shot_model(
|
||||
job: &AvailableInferenceJob,
|
||||
raw_inference_text: &str,
|
||||
) -> Result<JobSuccessResult, ProcessSingleJobError> {
|
||||
|
||||
|
||||
|
||||
|
||||
match job.maybe_model_type {
|
||||
Some(InferenceModelType::VallEX) => {
|
||||
|
||||
vall_e_x::process_job::process_job(VALLEXProcessJobArgs {
|
||||
job_dependencies,
|
||||
job,
|
||||
}).await
|
||||
|
||||
|
||||
}
|
||||
_ => {
|
||||
Err(ProcessSingleJobError::Other(anyhow!("not a zero-shot model")))
|
||||
|
||||
@@ -13,6 +13,7 @@ use std::path::PathBuf;
|
||||
use std::time::Instant;
|
||||
use mysql_queries::queries::generic_inference::job::list_available_generic_inference_jobs::AvailableInferenceJob;
|
||||
|
||||
use crate::job;
|
||||
use crate::job::job_loop::job_success_result::JobSuccessResult;
|
||||
use crate::job::job_loop::job_success_result::ResultEntity;
|
||||
use crate::job::job_loop::process_single_job_error::ProcessSingleJobError;
|
||||
@@ -22,6 +23,8 @@ use crate::job_dependencies::JobDependencies;
|
||||
use crate::job::job_types::tts::vall_e_x::vall_e_x_inference_command::InferenceArgs;
|
||||
use cloud_storage::bucket_path_unifier::BucketPathUnifier;
|
||||
|
||||
use super::validate_job::JobType;
|
||||
|
||||
const BUCKET_FILE_PREFIX: &str = "fakeyou_";
|
||||
const BUCKET_FILE_EXTENSION: &str = ".wav";
|
||||
const MIME_TYPE: &str = "audio/wav";
|
||||
@@ -61,14 +64,20 @@ pub struct VALLEXProcessJobArgs<'a> {
|
||||
pub job: &'a AvailableInferenceJob,
|
||||
}
|
||||
|
||||
// query using the token then grab the bucket hash
|
||||
pub async fn process_job(
|
||||
args: VALLEXProcessJobArgs<'_>
|
||||
pub async fn process_create_voice(
|
||||
args: VALLEXProcessJobArgs<'_>,
|
||||
dataset_token: String
|
||||
) -> Result<JobSuccessResult, ProcessSingleJobError> {
|
||||
let job = args.job;
|
||||
let deps = args.job_dependencies;
|
||||
let mysql_pool = &deps.mysql_pool;
|
||||
Err(ProcessSingleJobError::Other(anyhow!("Error")))
|
||||
}
|
||||
|
||||
pub async fn process_inference_voice(
|
||||
args: VALLEXProcessJobArgs<'_>,
|
||||
voice_token: String
|
||||
) -> Result<JobSuccessResult, ProcessSingleJobError> {
|
||||
let deps = args.job_dependencies;
|
||||
let job = args.job;
|
||||
let mysql_pool = &deps.mysql_pool;
|
||||
// get some globals
|
||||
let mut job_progress_reporter = deps.job_progress_reporter
|
||||
.new_generic_inference(job.inference_job_token.as_str())
|
||||
@@ -82,9 +91,7 @@ pub async fn process_job(
|
||||
}
|
||||
};
|
||||
|
||||
// get args token
|
||||
let jobArgs = validate_job(&job)?; // bubbles error up
|
||||
let voice_token = tokens::tokens::zs_voices::ZsVoiceToken(jobArgs.voice_token);
|
||||
let voice_token = tokens::tokens::zs_voices::ZsVoiceToken(voice_token);
|
||||
|
||||
// Get voice bucket hash - from voice token
|
||||
let voice_lookup_result = get_voice_by_token(&voice_token, false, &mysql_pool).await;
|
||||
@@ -179,22 +186,23 @@ pub async fn process_job(
|
||||
&result_bucket_object_pathbuf,
|
||||
&finished_file,
|
||||
&MIME_TYPE
|
||||
).await // TODO: We should check the mimetype to make sure bad payloads can't get uploaded
|
||||
)
|
||||
.await // TODO: We should check the mimetype to make sure bad payloads can't get uploaded
|
||||
.map_err(|e| ProcessSingleJobError::Other(e))?;
|
||||
|
||||
// ==================== UPLOAD AUDIO TO BUCKET ====================
|
||||
// ==================== UPLOAD AUDIO TO BUCKET ====================
|
||||
info!("Calculating sha256...");
|
||||
|
||||
let file_checksum = sha256_hash_file(&finished_file)
|
||||
.map_err(|err| {
|
||||
ProcessSingleJobError::Other(anyhow!("Error hashing file: {:?}", err))
|
||||
})?;
|
||||
|
||||
let file_size_bytes = file_size(&finished_file)
|
||||
.map_err(|err| ProcessSingleJobError::Other(err))?;
|
||||
|
||||
let file_checksum = sha256_hash_file(&finished_file).map_err(|err| {
|
||||
ProcessSingleJobError::Other(anyhow!("Error hashing file: {:?}", err))
|
||||
})?;
|
||||
|
||||
let file_size_bytes = file_size(&finished_file).map_err(|err|
|
||||
ProcessSingleJobError::Other(err)
|
||||
)?;
|
||||
|
||||
job_progress_reporter.log_status("done").map_err(|e| ProcessSingleJobError::Other(e))?;
|
||||
|
||||
|
||||
// insert into db the record
|
||||
let (media_file_token, id) = insert_media_file_from_face_zero_shot(InsertArgs {
|
||||
pool: &args.job_dependencies.mysql_pool,
|
||||
@@ -210,17 +218,48 @@ pub async fn process_job(
|
||||
worker_cluster: &args.job_dependencies.container.cluster_name,
|
||||
}).await.map_err(|e| ProcessSingleJobError::Other(e))?;
|
||||
|
||||
info!("Job {:?} complete success! Downloaded, ran inference, and uploaded. Saved model record: {}, Result Token: {}",
|
||||
job.id, id, &media_file_token);
|
||||
|
||||
info!(
|
||||
"Job {:?} complete success! Downloaded, ran inference, and uploaded. Saved model record: {}, Result Token: {}",
|
||||
job.id,
|
||||
id,
|
||||
&media_file_token
|
||||
);
|
||||
|
||||
Ok(JobSuccessResult {
|
||||
maybe_result_entity: Some(ResultEntity {
|
||||
entity_type: InferenceResultType::MediaFile,
|
||||
entity_token: media_file_token.to_string(),
|
||||
entity_type: InferenceResultType::MediaFile,
|
||||
entity_token: media_file_token.to_string(),
|
||||
}),
|
||||
inference_duration,
|
||||
})
|
||||
}
|
||||
// query using the token then grab the bucket hash
|
||||
pub async fn process_job(
|
||||
args: VALLEXProcessJobArgs<'_>
|
||||
) -> Result<JobSuccessResult, ProcessSingleJobError> {
|
||||
let job = args.job;
|
||||
let deps = args.job_dependencies;
|
||||
let mysql_pool = &deps.mysql_pool;
|
||||
|
||||
// get args token
|
||||
let jobArgs = validate_job(&job)?; // bubbles error up
|
||||
|
||||
match jobArgs.job_type {
|
||||
JobType::Create => {
|
||||
if let Some(voice_dataset_token) = jobArgs.voice_dataset_token {
|
||||
process_create_voice(args, voice_dataset_token).await
|
||||
} else {
|
||||
Err(ProcessSingleJobError::Other(anyhow!("Missing Dataset Token?")))
|
||||
}
|
||||
}
|
||||
JobType::Inference => {
|
||||
if let Some(voice_token) = jobArgs.voice_token {
|
||||
process_inference_voice(args, voice_token).await
|
||||
} else {
|
||||
Err(ProcessSingleJobError::Other(anyhow!("Missing Voice Token?")))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
mod tests {
|
||||
#[test]
|
||||
|
||||
@@ -1,53 +1,82 @@
|
||||
use anyhow::anyhow;
|
||||
use mysql_queries::payloads::generic_inference_args::generic_inference_args::{InferenceCategoryAbbreviated, PolymorphicInferenceArgs};
|
||||
use mysql_queries::payloads::generic_inference_args::generic_inference_args::{
|
||||
InferenceCategoryAbbreviated,
|
||||
PolymorphicInferenceArgs,
|
||||
};
|
||||
use mysql_queries::queries::generic_inference::job::list_available_generic_inference_jobs::AvailableInferenceJob;
|
||||
use crate::job::job_loop::process_single_job_error::ProcessSingleJobError;
|
||||
|
||||
pub enum JobType {
|
||||
Create,
|
||||
Inference
|
||||
}
|
||||
// determines the job type voice inference or voice creation
|
||||
pub struct JobArgs {
|
||||
pub voice_token: String
|
||||
pub voice_token: Option<String>, // infers
|
||||
pub voice_dataset_token: Option<String>, // creates
|
||||
pub job_type: JobType
|
||||
}
|
||||
|
||||
pub fn validate_job(job: &AvailableInferenceJob) -> Result<JobArgs, ProcessSingleJobError> {
|
||||
let inference_category = job.maybe_inference_args.as_ref()
|
||||
.map(|args|args.inference_category)
|
||||
.flatten();
|
||||
let inference_category = job.maybe_inference_args
|
||||
.as_ref()
|
||||
.map(|args| args.inference_category)
|
||||
.flatten();
|
||||
|
||||
match inference_category {
|
||||
Some(InferenceCategoryAbbreviated::TextToSpeech) => {},
|
||||
Some(category) => {
|
||||
return Err(ProcessSingleJobError::from_anyhow_error(anyhow!("wrong inference category for job: {:?}", category)));
|
||||
},
|
||||
None => {
|
||||
return Err(ProcessSingleJobError::from_anyhow_error(anyhow!("no inference category for job!")));
|
||||
}
|
||||
};
|
||||
|
||||
let inference_args = job.maybe_inference_args
|
||||
.as_ref()
|
||||
.map(|args| args.args.as_ref())
|
||||
.flatten();
|
||||
|
||||
let inference_args = match inference_args {
|
||||
Some(args) => args,
|
||||
None => {
|
||||
return Err(ProcessSingleJobError::from_anyhow_error(anyhow!("no inference args for job!")));
|
||||
match inference_category {
|
||||
Some(InferenceCategoryAbbreviated::TextToSpeech) => {}
|
||||
Some(category) => {
|
||||
return Err(
|
||||
ProcessSingleJobError::from_anyhow_error(
|
||||
anyhow!("wrong inference category for job: {:?}", category)
|
||||
)
|
||||
);
|
||||
}
|
||||
None => {
|
||||
return Err(
|
||||
ProcessSingleJobError::from_anyhow_error(anyhow!("no inference category for job!"))
|
||||
);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
let ttsArgs = match inference_args {
|
||||
PolymorphicInferenceArgs::Tts(inference_args) => inference_args,
|
||||
_ => {
|
||||
return Err(ProcessSingleJobError::from_anyhow_error(anyhow!("wrong inner args for job!")));
|
||||
let inference_args = job.maybe_inference_args
|
||||
.as_ref()
|
||||
.map(|args| args.args.as_ref())
|
||||
.flatten();
|
||||
|
||||
let inference_args = match inference_args {
|
||||
Some(args) => args,
|
||||
None => {
|
||||
return Err(
|
||||
ProcessSingleJobError::from_anyhow_error(anyhow!("no inference args for job!"))
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
let ttsArgs = match inference_args {
|
||||
PolymorphicInferenceArgs::Tts(inference_args) => inference_args,
|
||||
_ => {
|
||||
return Err(
|
||||
ProcessSingleJobError::from_anyhow_error(anyhow!("wrong inner args for job!"))
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
if let Some(voice_token) = &ttsArgs.voice_token {
|
||||
return Ok::<JobArgs, ProcessSingleJobError>(JobArgs {
|
||||
voice_token: Some(voice_token.clone()),
|
||||
voice_dataset_token: None,
|
||||
job_type: JobType::Inference
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
if let Some(voice_token) = &ttsArgs.voice_token {
|
||||
Ok(JobArgs {
|
||||
voice_token: voice_token.clone()
|
||||
})
|
||||
} else {
|
||||
return Err(ProcessSingleJobError::from_anyhow_error(anyhow!("Missing Voice Token!")))
|
||||
}
|
||||
|
||||
if let Some(dataset_token) = &ttsArgs.dataset_token {
|
||||
return Ok::<JobArgs,ProcessSingleJobError>(JobArgs {
|
||||
voice_token: None,
|
||||
voice_dataset_token: Some(dataset_token.clone()),
|
||||
job_type: JobType::Create
|
||||
});
|
||||
}
|
||||
|
||||
return Err(ProcessSingleJobError::from_anyhow_error(anyhow!("Missing Voice Token!")));
|
||||
}
|
||||
Reference in new issue
Block a user