diff --git a/Content.Server/White/TTS/TTSManager.cs b/Content.Server/White/TTS/TTSManager.cs index 0352fe593f..5e39f75d95 100644 --- a/Content.Server/White/TTS/TTSManager.cs +++ b/Content.Server/White/TTS/TTSManager.cs @@ -55,7 +55,7 @@ public sealed class TTSManager /// SSML formatted text /// OGG audio bytes /// Throws if url or token CCVar not set or http request failed - public async Task ConvertTextToSpeech(string speaker, string text, string pitch, string rate) + public async Task ConvertTextToSpeech(string speaker, string text, string pitch, string rate, string? effect = null) { var url = _cfg.GetCVar(WhiteCVars.TtsApiUrl); var maxCacheSize = _cfg.GetCVar(WhiteCVars.TtsMaxCacheSize); @@ -78,7 +78,8 @@ public sealed class TTSManager Text = text, Speaker = speaker, Pitch = pitch, - Rate = rate + Rate = rate, + Effect = effect }; var request = CreateRequestLink(url, body); @@ -132,6 +133,9 @@ public sealed class TTSManager query["rate"] = body.Rate; query["file"] = "1"; query["ext"] = "ogg"; + if (body.Effect != null) + query["effect"] = body.Effect; + uriBuilder.Query = query.ToString(); return uriBuilder.ToString(); } @@ -164,6 +168,9 @@ public sealed class TTSManager [JsonPropertyName("rate")] public string Rate { get; set; } = default!; + + [JsonPropertyName("effect")] + public string? Effect { get; set; } } private struct GenerateVoiceResponse diff --git a/Content.Server/White/TTS/TTSSystem.cs b/Content.Server/White/TTS/TTSSystem.cs index 56386271d9..e29501eefc 100644 --- a/Content.Server/White/TTS/TTSSystem.cs +++ b/Content.Server/White/TTS/TTSSystem.cs @@ -58,7 +58,7 @@ public sealed partial class TTSSystem : EntitySystem return; var message = FormattedMessage.RemoveMarkup(ev.Message); - var soundData = await GenerateTTS(null, message, ttsPrototype.Speaker); + var soundData = await GenerateTTS(null, message, ttsPrototype.Speaker, speechRate: "slow", effect: "announce"); if (soundData == null) return; @@ -211,7 +211,7 @@ public sealed partial class TTSSystem : EntitySystem _ttsManager.ResetCache(); } - private async Task GenerateTTS(EntityUid? uid, string text, string speaker, string? speechPitch = null, string? speechRate = null) + private async Task GenerateTTS(EntityUid? uid, string text, string speaker, string? speechPitch = null, string? speechRate = null, string? effect = null) { var textSanitized = Sanitize(text); if (textSanitized == "") @@ -238,7 +238,7 @@ public sealed partial class TTSSystem : EntitySystem rate = speechRate; } - return await _ttsManager.ConvertTextToSpeech(speaker, textSanitized, pitch, rate); + return await _ttsManager.ConvertTextToSpeech(speaker, textSanitized, pitch, rate, effect); } } diff --git a/Resources/Locale/ru-RU/white/tts/tts-voices.ftl b/Resources/Locale/ru-RU/white/tts/tts-voices.ftl index 05bf95882d..ed0cf12be2 100644 --- a/Resources/Locale/ru-RU/white/tts/tts-voices.ftl +++ b/Resources/Locale/ru-RU/white/tts/tts-voices.ftl @@ -39,3 +39,18 @@ tts-voice-name-sheogorath = Шеогорат tts-voice-name-turret-floor = Турель tts-voice-name-cirilla = Цири tts-voice-name-lambert = Ламберт +tts-voice-name-polina = Полина +tts-voice-name-arthas = Артас +tts-voice-name-xrenoid = Хреноид +tts-voice-name-azir = Азир +tts-voice-name-caitlyn = Кэйтлин +tts-voice-name-ekko = Экко +tts-voice-name-twitch = Твич +tts-voice-name-strelok = Стрелок +tts-voice-name-ziggs = Зиггс +tts-voice-name-tracer = Трейсер +tts-voice-name-illidan = Иллидан +tts-voice-name-rexxar = Рексар +tts-voice-name-voljin = Вол'джин +tts-voice-name-forester = Лесник +tts-voice-name-sidorovich = Сидорович diff --git a/Resources/Prototypes/White/tts-voices.yml b/Resources/Prototypes/White/tts-voices.yml index d79825a510..b21b062b38 100644 --- a/Resources/Prototypes/White/tts-voices.yml +++ b/Resources/Prototypes/White/tts-voices.yml @@ -254,3 +254,93 @@ name: tts-voice-name-lambert sex: Male speaker: lambert + +- type: ttsVoice + id: Polina + name: tts-voice-name-polina + sex: Female + speaker: polina + +- type: ttsVoice + id: Arthas + name: tts-voice-name-arthas + sex: Male + speaker: arthas + +- type: ttsVoice + id: Xrenoid + name: tts-voice-name-xrenoid + sex: Male + speaker: xrenoid + +- type: ttsVoice + id: Azir + name: tts-voice-name-azir + sex: Male + speaker: azir + +- type: ttsVoice + id: Caitlyn + name: tts-voice-name-caitlyn + sex: Female + speaker: caitlyn + +- type: ttsVoice + id: Ekko + name: tts-voice-name-ekko + sex: Male + speaker: ekko + +- type: ttsVoice + id: Twitch + name: tts-voice-name-twitch + sex: Male + speaker: twitch + +- type: ttsVoice + id: Strelok + name: tts-voice-name-strelok + sex: Male + speaker: strelok + +- type: ttsVoice + id: Ziggs + name: tts-voice-name-ziggs + sex: Male + speaker: ziggs + +- type: ttsVoice + id: Tracer + name: tts-voice-name-tracer + sex: Female + speaker: tracer + +- type: ttsVoice + id: Illidan + name: tts-voice-name-illidan + sex: Male + speaker: illidan + +- type: ttsVoice + id: Rexxar + name: tts-voice-name-rexxar + sex: Male + speaker: rexxar + +- type: ttsVoice + id: Voljin + name: tts-voice-name-voljin + sex: Male + speaker: voljin + +- type: ttsVoice + id: Forester + name: tts-voice-name-forester + sex: Male + speaker: forester + +- type: ttsVoice + id: Sidorovich + name: tts-voice-name-sidorovich + sex: Male + speaker: sidorovich