From 7c2aeca5d289b3871e887703957a2d6cff169e95 Mon Sep 17 00:00:00 2001 From: Brandon Thomas Date: Thu, 4 Jun 2020 03:12:56 -0400 Subject: [PATCH] fix --- deployment.yaml | 8 +++-- tts_service/deployed_models.toml | 16 +++++++-- tts_service/models.toml | 2 +- tts_service/src/endpoints/legacy_speak.rs | 43 +++++++++++++++++++++-- tts_service/src/endpoints/speak.rs | 19 +++------- tts_service/src/model/pipelines.rs | 5 ++- 6 files changed, 67 insertions(+), 26 deletions(-) diff --git a/deployment.yaml b/deployment.yaml index 954190b006..53eb5cd2c7 100644 --- a/deployment.yaml +++ b/deployment.yaml @@ -84,13 +84,15 @@ spec: # LSpeech model that sounds 100% amazing # image: docker.pkg.github.com/echelon/voder/tts-service:6b5c22567614 # - image: docker.pkg.github.com/ml-applications/voder/tts-service:2bafa7cec0c5 + image: docker.pkg.github.com/ml-applications/voder/tts-service:6f6101fa7730 resources: limits: - memory: "2048Mi" # 2048 MiB = 2 GiB + #memory: "2048Mi" # 2048 MiB = 2 GiB + memory: "1048Mi" # 2048 MiB = 2 GiB cpu: "700m" # 700 milliCPU requests: - memory: "2048Mi" # 2048 MiB = 2 GiB + #memory: "2048Mi" # 2048 MiB = 2 GiB + memory: "1048Mi" # 2048 MiB = 2 GiB cpu: "700m" # 700 milliCPU volumeMounts: - name: downloads diff --git a/tts_service/deployed_models.toml b/tts_service/deployed_models.toml index 10093e11f2..596090cb65 100644 --- a/tts_service/deployed_models.toml +++ b/tts_service/deployed_models.toml @@ -4,8 +4,9 @@ name = "Donald Trump" slug = "trump" model_pipeline = "ArpabetTacotronMelgan" tacotron = "tacotron2_trump_txlearn_ljs_arpabet_2020-05-25_chkpt26500.jit" -#melgan = "melgan_trump-txlearn-2020.05.05_13675.jit" -melgan = "melgan_trump_txlearn_2020-05-30_steno_chkpt9800.torchjit" +#melgan = "melgan_trump-txlearn-2020.05.05_13675.jit" (OLD) +#melgan = "melgan_trump_txlearn_2020-05-30_steno_chkpt9800.torchjit" (BEST TACOTRON) +glow_tts = "glow_tts_ljs_txlearn_arpabet_2020-06-01_G_1007.torchjit" [[speakers]] name = "High-pitched Linda Johnson" @@ -20,6 +21,10 @@ melgan = "melgan_ljs-high-pitch_container.pt" model_type = "ArpabetTacotron" base_directory = "/data/downloads/downloaded/models/tacotron2-nvidia/" +[[model_locations]] +model_type = "ArpabetGlowTts" +base_directory = "/data/downloads/downloaded/models/glow-tts-jaywalnut/" + [[model_locations]] model_type = "Melgan" base_directory = "/data/downloads/downloaded/models/melgan-swpark/" @@ -103,6 +108,13 @@ description = "High-quality high-pitched LJS; arpabet encodings." # description = "Unknown (broken)" +# ---------------- Glow TTS---------------- + +[[glow_tts]] +file_path = "glow_tts_ljs_txlearn_arpabet_2020-06-01_G_1007.torchjit" +description = "First experiments" + + # ---------------- Melgan ---------------- # TODO: Get a high-quality LJS Melgan diff --git a/tts_service/models.toml b/tts_service/models.toml index 77f787384a..f7bdc30501 100644 --- a/tts_service/models.toml +++ b/tts_service/models.toml @@ -138,7 +138,7 @@ description = "Unknown (broken)" # ---------------- Glow TTS---------------- [[glow_tts]] -file_path = "glow-experimental.torchjit" +file_path = "glow_tts_ljs_txlearn_arpabet_2020-06-01_G_1007.torchjit" description = "First experiments" # ---------------- Melgan ---------------- diff --git a/tts_service/src/endpoints/legacy_speak.rs b/tts_service/src/endpoints/legacy_speak.rs index 0fe32be9fd..c9ba87b84c 100644 --- a/tts_service/src/endpoints/legacy_speak.rs +++ b/tts_service/src/endpoints/legacy_speak.rs @@ -13,7 +13,7 @@ use crate::model::model_config::ModelPipeline; use crate::model::old_model::TacoMelModel; use crate::database::model::NewSentence; use crate::text::cleaners::clean_text; -use crate::model::pipelines::arpabet_tacotron_melgan_pipeline; +use crate::model::pipelines::{arpabet_tacotron_melgan_pipeline, arpabet_glow_tts_melgan_pipeline}; /// Example request: v=trump&vol=3&s=this is funny isn't it #[derive(Deserialize)] @@ -152,7 +152,46 @@ pub async fn legacy_get_speak(request: HttpRequest, }, } }, - ModelPipeline::ArpabetGlowTtsMelgan => unimplemented!(), + ModelPipeline::ArpabetGlowTtsMelgan => { + let glow_tts_model = speaker.glow_tts + .as_ref() + .map(|s| s.clone()) + .expect("TODO ERROR HANDLING"); + + let melgan_model = speaker.melgan + .as_ref() + .map(|s| s.clone()) + .expect("TODO ERROR HANDLING"); + + debug!("Glow-TTS Model: {}", glow_tts_model); + debug!("Melgan Model: {}", melgan_model); + + let glow_tts = match app_state.model_cache.get_or_load_arbabet_glow_tts(&glow_tts_model) { + Some(model) => model, + None => { + warn!("Couldn't load glow-tts model: {}", glow_tts_model); + return Ok(HttpResponse::build(StatusCode::INTERNAL_SERVER_ERROR) + .content_type("text/plain") + .body("Couldn't load model.")); + }, + }; + + let melgan = match app_state.model_cache.get_or_load_melgan(&melgan_model) { + Some(model) => model, + None => { + warn!("Couldn't load melgan model: {}", melgan_model); + return Ok(HttpResponse::build(StatusCode::INTERNAL_SERVER_ERROR) + .content_type("text/plain") + .body("Could not load model.")); + }, + }; + + let wav_data = arpabet_glow_tts_melgan_pipeline(&cleaned_text, &glow_tts, &melgan); + + Ok(HttpResponse::build(StatusCode::OK) + .content_type("audio/wav") + .body(wav_data)) + }, ModelPipeline::RawTextTacotronMelgan => unimplemented!(), } } diff --git a/tts_service/src/endpoints/speak.rs b/tts_service/src/endpoints/speak.rs index 88a4881880..1131075b4e 100644 --- a/tts_service/src/endpoints/speak.rs +++ b/tts_service/src/endpoints/speak.rs @@ -111,22 +111,11 @@ pub async fn post_speak(_request: HttpRequest, let melgan = app_state.model_cache.get_or_load_melgan(&melgan_model) .expect(&format!("Couldn't load melgan model: {}", melgan_model)); - let result = arpabet_glow_tts_melgan_pipeline(&cleaned_text, &glow_tts, &melgan); + let wav_data = arpabet_glow_tts_melgan_pipeline(&cleaned_text, &glow_tts, &melgan); - match result { - None => { - Ok(HttpResponse::build(StatusCode::TOO_MANY_REQUESTS) - .content_type("text/plain") - .body("The service is receiving too many requests. Although there are many worker \ - containers, model access is serialized on a per-container basis until the \ - segfaults are fixed.")) - }, - Some(wav_data) => { - Ok(HttpResponse::build(StatusCode::OK) - .content_type("audio/wav") - .body(wav_data)) - }, - } + Ok(HttpResponse::build(StatusCode::OK) + .content_type("audio/wav") + .body(wav_data)) }, ModelPipeline::RawTextTacotronMelgan => unimplemented!(), } diff --git a/tts_service/src/model/pipelines.rs b/tts_service/src/model/pipelines.rs index fcb55cee63..772466d936 100644 --- a/tts_service/src/model/pipelines.rs +++ b/tts_service/src/model/pipelines.rs @@ -17,7 +17,7 @@ use crate::model::arpabet_glow_tts_model::ArpabetGlowTtsModel; pub fn arpabet_glow_tts_melgan_pipeline( cleaned_text: &str, arpabet_glow_tts: &ArpabetGlowTtsModel, - melgan: &MelganModel) -> Option> { + melgan: &MelganModel) -> Vec { let arpabet = Arpabet::load_cmudict(); // TODO: Inefficient. let arpabet_encodings = text_to_arpabet_encoding_glow_tts(arpabet, &cleaned_text); @@ -27,8 +27,7 @@ pub fn arpabet_glow_tts_melgan_pipeline( let audio_tensor = melgan.tacotron_mel_to_audio(&mel_tensor); let audio_signal = mel_audio_tensor_to_audio_signal(audio_tensor); - let wav = audio_signal_to_wav_bytes(audio_signal); - Some(wav) + audio_signal_to_wav_bytes(audio_signal) } pub fn arpabet_tacotron_melgan_pipeline(