This commit is contained in:
Brandon Thomas committed 2020-06-04 03:12:56 -04:00
1 parent 6f6101fa77
commit 7c2aeca5d2
6 files changed
+67 -26

No files matched your search

+5 -3
View File
@@ -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
+14 -2
View File
@@ -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
+1 -1
View File
@@ -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 ----------------
+41 -2
View File
@@ -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!(),
}
}
+4 -15
View File
@@ -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!(),
}
+2 -3
View File
@@ -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<Vec<u8>> {
melgan: &MelganModel) -> Vec<u8> {
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(