Перейти к основному содержимому
Версия: Bbrain 2.0

Документация: ROS2 нода silero_tts

Общее описание

Нода silero_tts выполняет офлайн-синтез речи (Text-to-Speech) на основе модели Silero TTS v5_3_ru. Модель загружается локально через torch.package — подключение к интернету не требуется. Поддерживается 5 русских голосов, автоматическая расстановка ударений и буквы «ё». Сгенерированный WAV-файл может быть сохранён на диск/в RAM и опционально воспроизведён через media_driver.


Сервисы

<namespace>/speak

ПолеЗначение
Типrobohead_interfaces/srv/Speak
Имя по умолчаниюspeak (настраивается параметром srv_speak_name)

Запрос

ПолеТипОписание
textstringТекст для озвучки. Для ручного ударения — символ + перед ударной гласной (например, зам+ок)
voiceint16Индекс голоса (0–4, см. таблицу)
path_to_savestringПуть для сохранения WAV-файла. Пустая строка — сохранение в default_dir (/dev/shm/tmp_silero_tts.wav)
put_accentbooltrue — автоматическая расстановка ударений моделью
put_yobooltrue — автоматическая замена е на ё где необходимо
playbooltrue — после синтеза воспроизвести WAV через media_driver

Ответ

ПолеТипОписание
dataint16Код результата

Коды ответа

КодЗначение
0Успех
-1Пустой текст
-2Недопустимый индекс голоса (вне диапазона 0–4)
-3Ошибка синтеза (исключение в Silero)
-4Синтез вернул None (ошибка записи файла или создания директории)
-5play=true, но параметр srv_play_media не настроен
-6Ошибка воспроизведения через media_driver

Доступные голоса

Индекс (voice)ИмяПол
0aidarМужской
1bayaЖенский
2kseniyaЖенский
3eugeneМужской
4xeniaЖенский

Параметры конфигурации

Файл: config/silero_tts.yaml

ПараметрТипПо умолчаниюОписание
model_pathstring"v5_3_ru.pt"Имя файла модели (относительно <package>/model/).
devicestring"cpu"Устройство PyTorch ("cpu" или "cuda")
sample_rateint48000Частота дискретизации выходного аудио (8000 / 24000 / 48000)
default_dirstring"/dev/shm"Директория для WAV-файлов, когда path_to_save пустой
srv_speak_namestring"speak"Имя сервиса синтеза речи
srv_play_mediastring""Полное имя сервиса media_driver/play_media. Пустая строка — воспроизведение через play=true невозможно

Модель

Модель хранится локально в директории silero_tts/silero_tts/model/. Загрузка из интернета не выполняется при работе ноды.

Скачивание модели (однократно, требуется интернет)

При скачивании пакета из репозитория необходимо дополнительно установить модель синтеза.

cd ~/robohead_ws/src/robohead2/silero_tts/silero_tts/model/
./download_model.sh

Структура файлов

silero_tts/
├── config
│ └── silero_tts.yaml # Конфиг-файл
├── launch
│ └── silero_tts.launch.py # Launch-фал
├── package.xml
├── README.md # Документация
├── resource
│ └── silero_tts
├── setup.cfg
├── setup.py
├── silero_tts
│ ├── __init__.py
│ ├── main.py # Главный скрипт для синтеза
│ ├── model
│ │ ├── download_model.sh # Скрипт для скачивания модели
│ │ └── v5_3_ru.pt # Модель для синтеза
└── test
├── test_copyright.py
├── test_flake8.py
└── test_pep257.py

Управление ударениями

Режимput_accentФормат текстаПример
АвтоматическийtrueОбычный текст"Красивый замок на горе"
Ручнойfalse+ перед ударной гласной"Красивый з+амок на гор+е"
Комбинированныйtrue+ для исправления авто-ударений"Он открыл зам+ок"

Поддержка SSML

Silero TTS поддерживает подмножество SSML (Speech Synthesis Markup Language) для тонкого управления произношением: скорость, высота голоса, паузы, разделение на параграфы и предложения.

Поддерживаемые теги

ТегОписаниеПример
<speak>Корневой элемент (обязательный)<speak>Текст</speak>
<p>Параграф (пауза между параграфами)<p>Первый параграф.</p><p>Второй.</p>
<s>Предложение (пауза между предложениями)<s>Первое.</s><s>Второе.</s>
<break>Пауза заданной длительности<break time="2000ms"/>
<prosody>Скорость и высота голоса<prosody rate="fast">быстро</prosody>

Атрибуты <prosody>

АтрибутДопустимые значенияОписание
ratex-slow, slow, medium, fast, x-fastСкорость речи
pitchx-low, low, medium, high, x-highВысота голоса

Атрибуты <break>

АтрибутФорматПример
timeМиллисекунды (ms)<break time="500ms"/>, <break time="2000ms"/>

Пример SSML

<speak>
<p>
Когда я просыпаюсь, <prosody rate="x-slow">я говорю довольно медленно</prosody>.
Пот+ом я начинаю говорить своим обычным голосом,
<prosody pitch="x-high">а могу говорить тоном выше</prosody>,
или <prosody pitch="x-low">наоборот, ниже</prosody>.
Пот+ом, если повезет – <prosody rate="fast">я могу говорить и довольно быстро.</prosody>
А еще я умею делать паузы любой длины, например, две секунды <break time="2000ms"/>.
<p>
Также я умею делать паузы между параграфами.
</p>
<p>
<s>И также я умею делать паузы между предложениями</s>
<s>Вот например как сейчас</s>
</p>
</p>
</speak>

Использование SSML через сервис

Важно: При использовании SSML текст передаётся в поле text. Нода автоматически определяет SSML по наличию тега <speak> в начале текста.

Из командной строки

ros2 service call /silero_tts/speak robohead_interfaces/srv/Speak "{
text: '<speak><p>Привет <break time=\"1000ms\"/> <prosody rate=\"slow\">Я говорю медленно.</prosody></p></speak>',
voice: 4,
path_to_save: '',
put_accent: true,
put_yo: true,
play: true
}"

Примечание: Параметры put_accent и put_yo применяются только к обычному тексту. При SSML-вводе они игнорируются — ударения в SSML задаются вручную через + перед гласной.


Примеры использования

Из командной строки

# Синтез в RAM без воспроизведения
ros2 service call /silero_tts/speak robohead_interfaces/srv/Speak \
"{text: 'Привет', voice: 4, path_to_save: '', put_accent: true, put_yo: true, play: false}"


# Синтез + воспроизведение через media_driver
ros2 service call /silero_tts/speak robohead_interfaces/srv/Speak \
"{text: 'Озвучиваю и воспроизвожу.', voice: 4, path_to_save: '', put_accent: true, put_yo: true, play: true}"

# Сохранить на диск
ros2 service call /silero_tts/speak robohead_interfaces/srv/Speak \
"{text: 'Сохраняю файл.', voice: 2, path_to_save: '/home/pi/speech.wav', put_accent: true, put_yo: true, play: false}"

# Ручное ударение
ros2 service call /silero_tts/speak robohead_interfaces/srv/Speak \
"{text: 'Он открыл з+амок или зам+ок', voice: 4, path_to_save: '', put_accent: false, put_yo: false, play: true}"

# Мужской голос (aidar)
ros2 service call /silero_tts/speak robohead_interfaces/srv/Speak \
"{text: 'Мужской голос.', voice: 0, path_to_save: '', put_accent: true, put_yo: true, play: true}"

# Прослушать сгенерированный файл вручную
aplay /dev/shm/tmp_silero_tts.wav

После каждой перегенерации в default_dir файл tmp_silero_tts.wav перезаписывается!

Сборка и запуск

# Скачать модель (однократно)
cd ~/robohead_ws/srс/robohead2/silero_tts/silero_tts/model/
./download_model.sh

# Сборка
colcon build --symlink-install --packages-select robohead_interfaces silero_tts

# Запуск
ros2 launch silero_tts silero_tts.launch.py