update model language

This commit is contained in:
Brandon Thomas committed 2024-09-29 01:51:12 -04:00
1 parent 87a768890a
commit ac4a7f4612
3 files changed
+79 -8

No files matched your search

@@ -14,6 +14,8 @@ pub struct UpdateWeightArgs<'a, 't> {
pub maybe_description_markdown: Option<&'a str>,
pub maybe_description_rendered_html: Option<&'a str>,
pub creator_set_visibility: Option<&'a Visibility>,
pub ietf_language_tag: Option<&'a str>,
pub ietf_primary_language_subtag: Option<&'a str>,
pub transactor: Transactor<'a, 't>,
}
@@ -42,19 +44,19 @@ SET
let mut separated = query_builder.separated(", ");
if let Some(title) = args.title {
separated.push("title = ");
separated.push(" title = ");
separated.push_bind_unseparated(title);
}
if let Some(maybe_description_markdown) = args.maybe_description_markdown {
separated.push("maybe_description_markdown = ");
separated.push(" maybe_description_markdown = ");
separated.push_bind_unseparated(maybe_description_markdown);
}
if let Some(maybe_description_rendered_html) = args.maybe_description_rendered_html {
separated.push("maybe_description_rendered_html = ");
separated.push(" maybe_description_rendered_html = ");
separated.push_bind_unseparated(maybe_description_rendered_html);
}
if let Some(creator_set_visibility) = args.creator_set_visibility {
separated.push("creator_set_visibility = ");
separated.push(" creator_set_visibility = ");
separated.push_bind_unseparated(creator_set_visibility.to_str());
}
if let Some(cover_image_option) = args.cover_image {
@@ -63,11 +65,20 @@ SET
separated.push(" maybe_cover_image_media_file_token = NULL ");
}
CoverImageOption::SetCoverImage(media_file_token) => {
separated.push("maybe_cover_image_media_file_token = ");
separated.push(" maybe_cover_image_media_file_token = ");
separated.push_bind_unseparated(media_file_token.as_str());
}
}
}
if let Some(ietf_language_tag) = args.ietf_language_tag {
if let Some(ietf_primary_language_subtag) = args.ietf_primary_language_subtag {
separated.push(" maybe_ietf_language_tag = ");
separated.push_bind_unseparated(ietf_language_tag);
separated.push(" maybe_ietf_primary_language_subtag = ");
separated.push_bind_unseparated(ietf_primary_language_subtag);
}
}
separated.push("version = version + 1");
@@ -1,6 +1,6 @@
use std::collections::{HashMap, HashSet};
use language_tags::LanguageTag;
use once_cell::sync::Lazy;
use std::collections::{HashMap, HashSet};
/// These are language tags we try to support.
static SUPPORTED_LANGUAGES_FOR_MODELS : Lazy<HashSet<String>> = Lazy::new(|| {
@@ -39,6 +39,10 @@ static SUPPORTED_LANGUAGES_FOR_MODELS : Lazy<HashSet<String>> = Lazy::new(|| {
"de-LI", // German (Liechtenstein)
"de-LU", // German (Luxembourg)
// Hindi
"hi",
"hi-IN", // Hindi (India)
// Italian
"it",
"it-CH", // https://en.wikipedia.org/wiki/Swiss_Italian
@@ -112,9 +116,16 @@ pub fn is_valid_language_for_models(language_tag: &str) -> bool {
SUPPORTED_LANGUAGES_FOR_MODELS.contains(language_tag)
}
/// Parse a language tag like "en-US" to "en".
pub fn get_primary_language_subtag(language_tag: &str) -> Option<String> {
LanguageTag::parse(language_tag)
.map(|language_tag| language_tag.primary_language().to_string())
.ok()
}
#[cfg(test)]
mod tests {
use crate::configs::supported_languages_for_models::{get_canonicalized_language_tag_for_model, is_valid_language_for_models};
use crate::configs::supported_languages_for_models::{get_canonicalized_language_tag_for_model, get_primary_language_subtag, is_valid_language_for_models};
#[test]
fn get_canonical_language_for_model_success() {
@@ -148,5 +159,17 @@ mod tests {
assert!(!is_valid_language_for_models("foo"));
assert!(!is_valid_language_for_models("en-FOO"));
}
#[test]
fn test_primary_language_subtag() {
assert_eq!(Some("en".to_string()), get_primary_language_subtag("en-US"));
assert_eq!(Some("es".to_string()), get_primary_language_subtag("es-419"));
assert_eq!(Some("it".to_string()), get_primary_language_subtag("it-CH"));
assert_eq!(Some("ja".to_string()), get_primary_language_subtag("ja-JP"));
assert_eq!(Some("zh".to_string()), get_primary_language_subtag("zh-CN"));
assert_eq!(Some("zh".to_string()), get_primary_language_subtag("zh-HK"));
assert_eq!(Some("tr".to_string()), get_primary_language_subtag("tr-TR"));
assert_eq!(Some("ar".to_string()), get_primary_language_subtag("ar-EG"));
}
}
@@ -10,6 +10,7 @@ use sqlx::MySqlPool;
use utoipa::ToSchema;
use enums::by_table::media_files::media_file_type::MediaFileType;
use enums::by_table::model_weights::weights_types::WeightsType;
use enums::common::visibility::Visibility;
use http_server_common::response::response_success_helpers::simple_json_success;
use http_server_common::response::serialize_as_json_error::serialize_as_json_error;
@@ -21,6 +22,7 @@ use mysql_queries::utils::transactor::Transactor;
use tokens::tokens::media_files::MediaFileToken;
use tokens::tokens::model_weights::ModelWeightToken;
use user_input_common::check_for_slurs::contains_slurs;
use crate::configs::supported_languages_for_models::{get_canonicalized_language_tag_for_model, get_primary_language_subtag};
use crate::http_server::web_utils::user_session::require_user_session::RequireUserSessionError;
use crate::http_server::web_utils::user_session::require_user_session_using_connection::require_user_session_using_connection;
use crate::state::server_state::ServerState;
@@ -36,6 +38,13 @@ pub struct UpdateWeightRequest {
/// The media file token of the *image* media file.
/// Set to *empty string* to clear the cover image.
pub cover_image_media_file_token: Option<MediaFileToken>,
/// An IETF BCP47 language tag, e.g.: "en", "en-US",
/// "es-419", "ja-JP", etc.
/// This is only applicable to TTS and Voice Conversion models.
/// If set for other model types, the endpoint will 400.
pub language_tag: Option<String>,
pub visibility: Option<Visibility>,
}
@@ -164,6 +173,8 @@ pub async fn update_weight_handler(
let mut cover_image = None;
let mut description_markdown = None;
let mut description_rendered_html = None;
let mut ietf_language_tag = None;
let mut ietf_primary_language_subtag = None;
if let Some(title) = &request.title {
if contains_slurs(title) {
@@ -205,6 +216,30 @@ pub async fn update_weight_handler(
description_rendered_html = Some(html);
}
if request.language_tag.is_some() {
// Only voice models have a language.
match weight.weights_type {
WeightsType::Tacotron2 => {}
WeightsType::GptSoVits => {}
WeightsType::SoVitsSvc => {}
WeightsType::RvcV2 => {}
WeightsType::HifiganTacotron2 => {}
WeightsType::VallE => {}
_ => {
return Err(UpdateWeightError::BadInput("Language tag is not applicable to this model type".to_string()));
}
}
}
if let Some(language_tag) = request.language_tag.as_deref().map(|t| t.trim()) {
if let Some(canonical_tag) = get_canonicalized_language_tag_for_model(language_tag) {
if let Some(primary_language_subtag) = get_primary_language_subtag(canonical_tag) {
ietf_language_tag = Some(canonical_tag.to_string());
ietf_primary_language_subtag = Some(primary_language_subtag);
}
}
}
let query_result = update_weights(UpdateWeightArgs {
weight_token: &ModelWeightToken::new(path.weight_token.clone()),
title: weight_title.as_deref(),
@@ -212,6 +247,8 @@ pub async fn update_weight_handler(
maybe_description_markdown: description_markdown.as_deref(),
maybe_description_rendered_html: description_rendered_html.as_deref(),
creator_set_visibility: request.visibility.as_ref(),
ietf_language_tag: ietf_language_tag.as_deref(),
ietf_primary_language_subtag: ietf_primary_language_subtag.as_deref(),
transactor: Transactor::for_connection(&mut mysql_connection),
}).await;