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