## What Does This PR Do
Добавляет функции Text-to-Speech через проприетарный се…рвис Silero с использованием нейросетей. Реализовано кэширование. Код подсмотрен у ТГ (https://github.com/tgstation/tgstation/pull/68106) и Эрис (https://github.com/discordia-space/CEV-Eris/pull/7342) и значительно улучшен. ~~Пока есть 20 голосов (19 голосов из Warcraft), из которых 6 женских. В будущем разрабы добавят больше голосов при наличии интереса у людей.~~ Имеется 92 голоса из различных игр, таких как WarCraft 3, Half-Life 2, Portal 2, Starcraft, Dota 2, League of Legends и STALKER.
TODO:
- [x] Стоит переписать всё в подсистему для нормального управления нагрузкой через MC.
- [x] Добавить поддержку сразу нескольких провайдеров
- [x] Переработать на колбэки. Сперва переработал обращение к API через колбэки, но потом столкнулся с проблемой ожидания успешного выполнения сразу двоих колбэков. Пришлось пока обратно вернуть как было. Надо подумать как будет лучше
- [x] Не понял куда правильнее воткнуть запрос на рендеринг TTS. Стоит разобраться с этим
- [x] Использовать пониженный или повышенный pitch для шёпота
- [ ] Добавить спец теги для упрощённого управления скоростью речи и питчем, а также расстановкой ударений
- [x] Добавить преференсы голоса персонажей
- [x] Использовать SSML разметку
- [x] Ускорить речь
- [x] Добавить канал TTS в микшер громкости
- [x] Добавить озвучку раций с эффектом "рации" (обрезанные высокие и низкие частоты, возможно потребуется сделать обработку через rust-g)
- [x] Вернуть акценты и скрэмблер на кириллице, т.к. сейчас Silero TTS не умеет озвучивать латиницу
- [x] Добавить модифицирование текстов для улучшения звучания (Тесла -> Тэсла, НТ -> Энтэ, и др.)
- [x] Добавить логику очереди воспроизведения голоса для каждого персонажа
- [x] Добавить измерение RPS и moving avg RPS
- [ ] Доработать вызовы для радио, чтобы звук исходил из ближайшего к персонажу динамика (?)
- [x] Добавить радио тон эффект
- [x] Добавить преобразование чисел в слова
- [x] Добавить лимитер при увеличении времени генерации
- [ ] Вынести генерацию эффектов для звуковых файлов в отдельный сервис
- [x] Пофиксить для боргов слышимость себя в рации, т.к. они не говорят в локал
- [x] Для генокрадов добавить кражу голоса
- [ ] Добавить изменение голоса в маску-войсченджер
- [ ] Прописать для NPC голоса
- [ ] Поправить слышимость озвучки раций для гостов
- [ ] Добавить промежуток между сообщениями рации
- [ ] Опция изменения питча голоса
- [x] Сделать замену паттернов на замену с учётом слов
- [x] Сделать выбор голоса для авей-ролек
- [ ] У унатхов длинные "ссссс" и "щщщщ" обрабатываются почти как одиночные. Может можно это пеработать превращая "ссссс" в "с с с"
- [ ] - Когда много говорят в общий канал идёт сплошной поток. Длинную паузу делать нельзя, так как итак ТТС не успевает всё обработать и вырастает очередь вплоть до десятка секунд. Предлагаю сделать систему тоновых сигналов - у радиопередатчика каждого отдела свой тоновый сигнал и по сигналу можно будет сразу понять, из какого отдела говорят. Сигнал должен длится 0.5-1.0 секунду перед сообщением.
- [x] Хирургическая операция на смену голоса
- [ ] Разделить очереди в рации по каналам
- [x] Ограничить количество символов в сообщениях.
- [x] Исправить сброс голоса после клонирования
- [ ] Логгирование голоса на спавне перса
- [ ] Добавить изменения питча при дыхании гелием
- [ ] Добавить возможность случайно модификации голоса через ДНК/генетику
## Why It's Good For The Game
Добавляет восприятие речей слухом, чтобы освободить глаза на другие события в чате. Надо сперва попробовать и посмотреть что выйдет. Работать будет для всех и на всех серверах.
## Images of changes
Пример раунда https://www.youtube.com/watch?v=D1OZqJjI4Eg
<details>
<summary>Видео моменты разработки</summary>
https://user-images.githubusercontent.com/8555356/192109888-105d71e2-b4f7-4951-abe1-2bb32de8ce37.mp4
https://user-images.githubusercontent.com/8555356/192109893-9a51c1da-f053-4c2b-bf0f-707b30fe70a4.mp4
https://user-images.githubusercontent.com/8555356/193365634-70740333-8575-4bad-a330-eaee283f5eb6.mp4
</details>
## Changelog
:cl:
add: integrated Silero TTS via REST API
/:cl:
## FAQ
1. **Будет ли лагать, влиять на сервера?**
> Не должно. Мы попробуем хотя бы каково это играть с ТТС и тогда выяснится.
2. **В наушнике будут накладываться звуки?**
> Каждое сообщение "по рации" будет идти по очереди.
3. **А возможно ли будет отключить озвучку ТТС у радио?**
> Будет микшер с двумя треками: локальный TTS и радио TTS, можно будет настроить отдельно громкость.
4. **Будет ли ТТS как то связан с донатом?**
> Если будут идти донаты, то TTS будет. А так, все смогут им пользоваться.
**А донатные голоса?**
> Голоса будут свободными, хотя опция для доната интересная, но пока неизвестно.
5. **Как ТТС воспринимает проблемы с речью?**
> Для каждого и так генерируется текст индивидуально для каждого персонажа.
6. **Конвертация текста в озвучку будет обрабатываться на серверной части? То есть от клиента идёт пакет с текстом на сервер, тот обработал и отправил звуковой файл клиенту?**
> Персонаж говорит, текст обрабатывается на сервере и дальше отправляется запрос на генерацию TTS
(также есть кэширование), потом голос отправляется всем, кто слышит, с учётом понимания текста.
7. **Хочу послушать примервы голосов, где это сделать?**
> https://t.me/silero_voice_bot , в данном телеграмм канале.
8. **А будет ли влиять окружение на звуки ТТС? По типу эхо в пустых помещениях и так далее?**
> Да, это уже работает, встроенная фича Byond.
9. **А как насчёт шёпота?**
> Будет шёпот, он будет работать как изменения pitch на низкий.
10. **Будет ли слышно то, что говорят игроки шёпотом не на соседней клетке, а через клетку?**
> Используется текст от рунчата, что рунчат пишет, то и будет "говорится".
(Всё что не под звёздочками будет слышно)
11. **Будут ли проигрыватся отрывки сообщений? Если к примеру: одна кукла что то долгое сказала,
а вторая чуть позже на пол секунды (или чуть дольше) подошла что что бы увидеть его.**
> Обрывков не будет, это сложно реализовать. Хотя метки сообщений в TTS есть, в будущем можно добавить.
12. **Можно ли будет зафиксировать за персонажем единый голос? Чтоб каждую смену/фразу не слышать разные голоса от одного персонажа.**
> Игрок может сам выбрать голос для персонажа в предварительных настройках персонажа, в лобби.
13. **С другими языками в игре как дела обстоят? Просто, интересно, как это будет выглядеть (слышимость), когда игрок другой расы говорит рядом с тобой. Особенно если слайм какой-нибудь.**
> Ты будешь слышать непонятные для тебя звуки вместо слов, то есть будет слышно что отображено в рунчате.
Понимающий язык человек(ксенос) услышит внятные слова.
14. **За всеми животными будут зафиксированные определенные голоса?**
> Питомцы тоже будут слышны, надо будет им прописать свои голоса. Представьте голосом Артаса: "Барк!" :D
15. **Голоса для ИИ и боргов есть?**
> Пока нет, но будут. как минимум Глэдос появится со временем. Сейчас это решено через обработку доступных голосов "под робота"
16. **Если рядом человек сказал в рацию, ты будешь слышать только его речь в рации или его рядом и рацию?**
> Ты будешь 2 раза слышать этого человека, в "локальной" среде(рядом) и в "глобальной" среде(в рации, как дойдет очередь если она конечно будет).
17. **С ТТС станет сложно играть из-за какафонии на 100 человек**
> Я думаю, что игроки адаптируются, изменив стиль и темп разговоров. Со временем должно стать комфортнее. Можно будет сфокусировать зрение на другие вещи, а общение уже ушами воспринимать.