diff --git a/Cargo.lock b/Cargo.lock index 06fbc9a1bf..6b32f57abe 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1742,6 +1742,19 @@ name = "traitobject" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "tts_service" +version = "0.0.1" +dependencies = [ + "hound 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rocket 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rocket_contrib 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)", + "tch 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "typeable" version = "0.1.2" diff --git a/Cargo.toml b/Cargo.toml index e3b92d180e..9f3486ce97 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,11 +8,13 @@ authors = [ "Brandon Thomas ", members = [ "tacotron_melgan", "tacotron_tensorflow", + "tts_service", "voice_converter_sidecar", ] default-members = [ "tacotron_melgan", "tacotron_tensorflow", + "tts_service", "voice_converter_sidecar", ] diff --git a/tacotron_melgan/src/server.rs b/tacotron_melgan/src/server.rs index 7824f2eda6..07e745676a 100644 --- a/tacotron_melgan/src/server.rs +++ b/tacotron_melgan/src/server.rs @@ -6,6 +6,7 @@ use model::{TacoMelModel, load_wrapped_tensor_file, load_model_file, audio_signa use tch::nn::Module; use melgan::audio_tensor_to_audio_signal; use tch::Tensor; +use std::panic; #[derive(Serialize, Deserialize)] struct Message { @@ -19,8 +20,20 @@ fn get_index() -> String { #[get("/tts?")] fn get_tts(model: State, text: &RawStr) -> Content> { - let audio_bytes = model.inner().run_tts_audio(text.as_str()); - Content(ContentType::new("audio", "wav"), audio_bytes) + + let result = panic::catch_unwind(|| { + let audio_bytes = model.inner().run_tts_audio(text.as_str()); + audio_bytes + }); + + match result { + Err(_) => { + Content(ContentType::Plain, "there was an error".as_bytes().to_vec()) + }, + Ok(audio_bytes) => { + Content(ContentType::new("audio", "wav"), audio_bytes) + } + } } fn print_mel(tensor: &Tensor, i: i64) { @@ -46,6 +59,7 @@ fn print_audio_signal(signal: &Vec, i: usize) { fn get_tts_test() -> Content> { println!("Loading melgan model..."); let melgan_filename = "/home/bt/dev/tacotron-melgan/shared_melgan_container.pt"; + let melgan_filename = "/home/bt/dev/tacotron-melgan/shared_melgan_container2.pt"; let melgan_model = load_model_file(melgan_filename); println!("Loading mel..."); @@ -101,6 +115,7 @@ pub fn run_server() { //let melgan = "/home/bt/dev/voder/tacotron_melgan/melgan_jit_model_voder_c0cac635.pt"; let melgan = "/home/bt/dev/voder/tacotron_melgan/melgan_container2.pt"; let melgan = "/home/bt/dev/tacotron-melgan/shared_melgan_container.pt"; + let melgan = "/home/bt/dev/tacotron-melgan/shared_melgan_container2.pt"; let model = TacoMelModel::create( tacotron, melgan); diff --git a/tts_service/Cargo.toml b/tts_service/Cargo.toml new file mode 100644 index 0000000000..0d6524a4d5 --- /dev/null +++ b/tts_service/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "tts_service" +version = "0.0.1" +authors = [ "Brandon Thomas ", + "Brandon Thomas " ] + +[[bin]] +name = "tts_service" +path = "src/main.rs" + +[dependencies] +hound = "3.4.0" # wav codec +rocket = "0.4.2" # http server +rocket_contrib = "0.4.2" # http server +serde = "1.0.104" +serde_derive = "1.0.104" +serde_json = "1.0.44" +tch = "0.1.3" # libtorch bindings (pytorch) + diff --git a/tts_service/README.md b/tts_service/README.md new file mode 100644 index 0000000000..ca52667612 --- /dev/null +++ b/tts_service/README.md @@ -0,0 +1,7 @@ +TTS Service +=========== +This is the deployable TTS service. Whereas most of the other sub-projects are +experimental, this one is meant for production deploys. + +Experiments for this are conducted in the `tacotron_melgan` sub-project. + diff --git a/tts_service/src/main.rs b/tts_service/src/main.rs new file mode 100644 index 0000000000..a5db02344e --- /dev/null +++ b/tts_service/src/main.rs @@ -0,0 +1,50 @@ +#![feature(proc_macro_hygiene, decl_macro)] + +#[macro_use] extern crate rocket; +#[macro_use] extern crate rocket_contrib; +#[macro_use] extern crate serde_derive; +extern crate hound; +extern crate serde; +extern crate serde_json; +extern crate tch; + +use rocket::http::{RawStr, ContentType}; +use rocket::response::content::Content; +use rocket::{Request, State, Response}; +use rocket_contrib::json::{Json, JsonValue}; +use tch::CModule; +use tch::Tensor; +use tch::nn::Module; +use tch::nn::ModuleT; + +#[catch(404)] +fn not_found(_req: &Request) -> String { + "404 Not Found".into() +} + +#[get("/")] +pub fn get_root() -> String { + "Hello World".into() +} + +#[get("/readiness")] +pub fn get_readiness() -> String { + "Ready".into() +} + +#[get("/liveness")] +pub fn get_liveness() -> String { + "Live".into() +} + +pub fn main() { + rocket::ignite() + .mount("/", routes![ + get_root, + get_readiness, + get_liveness, + ]) + //.manage(model) + .register(catchers![not_found]) + .launch(); +}