diff --git a/tts_service/deployed_models.toml b/tts_service/deployed_models.toml index 185cea7f6e..20df07e3dc 100644 --- a/tts_service/deployed_models.toml +++ b/tts_service/deployed_models.toml @@ -1,3 +1,17 @@ +[[speakers]] +name = "Michael Rosen" +slug = "michael-rosen" +model_pipeline = "ArpabetGlowTtsMelgan" +glow_tts = "glow-tts_michael-rosen_ljstx_2020.09.05_expr-1_chkpt-5682.torchjit" +melgan = "melgan_manyvoice5.0_2020-07-23_12d5838_10760.torchjit" + +[[speakers]] +name = "Wizard (Death Battle!)" +slug = "wizard" +model_pipeline = "ArpabetGlowTtsMelgan" +glow_tts = "glow-tts_wiz_ljstx_2020.09.05_expr-1_chkpt-4500.torchjit" +melgan = "melgan_wiz_2020.09.07_d3b9647_17000.torchjit" + [[speakers]] name = "Tucker Carlson" slug = "tucker-carlson" diff --git a/tts_service/models.toml b/tts_service/models.toml index 83c36e57fc..a92b04bf9a 100644 --- a/tts_service/models.toml +++ b/tts_service/models.toml @@ -4,10 +4,24 @@ name = "Current Experiment" slug = "experiment" model_pipeline = "ArpabetGlowTtsMelgan" glow_tts = "glow_tts_single_speaker.torchjit" -melgan = "melgan_manyvoice5.0_2020-07-23_12d5838_10760.torchjit" +#melgan = "melgan_manyvoice5.0_2020-07-23_12d5838_10760.torchjit" #melgan = "melgan_manyvoice2.0_2020-07-08_12d5838_9330.torchjit" #melgan = "manyvoice1.0_2020-06-28_12d5838_6610.torchjit" -#melgan = "melgan-vocodes.torchjit" +melgan = "melgan-vocodes.torchjit" + +[[speakers]] +name = "Michael Rosen" +slug = "michael-rosen" +model_pipeline = "ArpabetGlowTtsMelgan" +glow_tts = "glow-tts_michael-rosen_ljstx_2020.09.05_expr-1_chkpt-5682.torchjit" +melgan = "melgan_manyvoice5.0_2020-07-23_12d5838_10760.torchjit" + +[[speakers]] +name = "Wizard (Death Battle!)" +slug = "wizard" +model_pipeline = "ArpabetGlowTtsMelgan" +glow_tts = "glow-tts_wiz_ljstx_2020.09.05_expr-1_chkpt-4500.torchjit" +melgan = "melgan_wiz_2020.09.07_d3b9647_17000.torchjit" [[speakers]] name = "Tucker Carlson" diff --git a/tts_service/src/endpoints/speak/api.rs b/tts_service/src/endpoints/speak/api.rs index dad7dcd518..1e23482649 100644 --- a/tts_service/src/endpoints/speak/api.rs +++ b/tts_service/src/endpoints/speak/api.rs @@ -8,8 +8,19 @@ use std::fmt; pub struct SpeakRequest { /// Slug for the speaker pub speaker: String, + /// Raw text to be spoken pub text: String, + + /// Retry attempt. + /// The first request is "0", and all subsequent requests are incremented. + /// Subsequent requests do not trigger the rate limiter. + #[serde(default)] + pub retry_attempt_number: u8, + + /// Admin/debug requests get to skip the rate limiter. + #[serde(default)] + pub skip_rate_limiter: bool, } #[derive(Serialize,Debug)] diff --git a/tts_service/src/endpoints/speak/speak.rs b/tts_service/src/endpoints/speak/speak.rs index 1ae34f7d9e..9a60d40b60 100644 --- a/tts_service/src/endpoints/speak/speak.rs +++ b/tts_service/src/endpoints/speak/speak.rs @@ -35,7 +35,7 @@ pub async fn post_speak(request: HttpRequest, let ip_address = get_request_ip(&request); - if let Err(_err) = app_state.rate_limiter.maybe_ratelimit_request(&ip_address, &request.headers()) { + if let Err(_err) = app_state.rate_limiter.maybe_ratelimit_request(&ip_address, &request.headers(), &query) { return Err(SpeakError::rate_limited()); } diff --git a/tts_service/src/endpoints/speak/speak_with_spectrogram.rs b/tts_service/src/endpoints/speak/speak_with_spectrogram.rs index a9cbd96308..26104d785b 100644 --- a/tts_service/src/endpoints/speak/speak_with_spectrogram.rs +++ b/tts_service/src/endpoints/speak/speak_with_spectrogram.rs @@ -55,7 +55,7 @@ pub async fn post_speak_with_spectrogram(request: HttpRequest, let ip_address = get_request_ip(&request); - if let Err(_err) = app_state.rate_limiter.maybe_ratelimit_request(&ip_address, &request.headers()) { + if let Err(_err) = app_state.rate_limiter.maybe_ratelimit_request(&ip_address, &request.headers(), &query) { return Err(SpeakError::rate_limited()); } diff --git a/tts_service/src/rate_limiter/noop_rate_limiter.rs b/tts_service/src/rate_limiter/noop_rate_limiter.rs index 31601ba690..de970a254d 100644 --- a/tts_service/src/rate_limiter/noop_rate_limiter.rs +++ b/tts_service/src/rate_limiter/noop_rate_limiter.rs @@ -1,11 +1,13 @@ use crate::rate_limiter::rate_limiter::{RateLimiter, RateLimiterError}; use actix_web::HttpRequest; use actix_web::http::HeaderMap; +use crate::endpoints::speak::api::SpeakRequest; pub struct NoOpRateLimiter {} impl RateLimiter for NoOpRateLimiter { - fn maybe_ratelimit_request(&self, ip_address: &str, headers: &HeaderMap) -> Result<(), RateLimiterError> { + fn maybe_ratelimit_request(&self, ip_address: &str, headers: &HeaderMap, + speak_request: &SpeakRequest) -> Result<(), RateLimiterError> { Ok(()) } diff --git a/tts_service/src/rate_limiter/rate_limiter.rs b/tts_service/src/rate_limiter/rate_limiter.rs index db5ae7a9d4..7b5ff23311 100644 --- a/tts_service/src/rate_limiter/rate_limiter.rs +++ b/tts_service/src/rate_limiter/rate_limiter.rs @@ -1,5 +1,6 @@ use actix_web::HttpRequest; use actix_web::http::header::HeaderMap; +use crate::endpoints::speak::api::SpeakRequest; #[derive(Debug)] pub enum RateLimiterError { @@ -14,7 +15,8 @@ pub enum RateLimiterError { pub trait RateLimiter : Send + Sync { /// Potentially try to rate limit. /// Certain headers can be used to bypass. - fn maybe_ratelimit_request(&self, ip_address: &str, headers: &HeaderMap) -> Result<(), RateLimiterError>; + fn maybe_ratelimit_request(&self, ip_address: &str, headers: &HeaderMap, + speak_request: &SpeakRequest) -> Result<(), RateLimiterError>; /// Attempt to acquire the rate limiter. fn acquire(&self, rate_limit_key: &str) -> Result<(), RateLimiterError>; diff --git a/tts_service/src/rate_limiter/redis_rate_limiter.rs b/tts_service/src/rate_limiter/redis_rate_limiter.rs index 84141d60f5..2fe6e41978 100644 --- a/tts_service/src/rate_limiter/redis_rate_limiter.rs +++ b/tts_service/src/rate_limiter/redis_rate_limiter.rs @@ -8,6 +8,7 @@ use actix_web::HttpRequest; use crate::endpoints::helpers::ip_address::get_request_ip; use actix_web::http::header::HeaderMap; use actix_web::http::HeaderName; +use crate::endpoints::speak::api::SpeakRequest; const RATE_LIMIT_BYPASS_HEADER : &'static str = "limitless"; @@ -71,9 +72,19 @@ impl RedisRateLimiter { } impl RateLimiter for RedisRateLimiter { - fn maybe_ratelimit_request(&self, ip_address: &str, headers: &HeaderMap) -> Result<(), RateLimiterError> { + fn maybe_ratelimit_request(&self, ip_address: &str, headers: &HeaderMap, speak_request: &SpeakRequest) -> Result<(), RateLimiterError> { + if speak_request.skip_rate_limiter { + info!("Bypassing rate limiter with request param."); + return Ok(()); + } + if headers.contains_key(&self.rate_limit_bypass_header) { - info!("Bypassing rate limiter"); + info!("Bypassing rate limiter with admin debug header."); + return Ok(()); + } + + if speak_request.retry_attempt_number > 0 { + info!("Retries bypass the rate limiter."); return Ok(()); }