Материал получился объёмный и потому разделен на части, все части выполнены со ссылками-якорями для удобства навигации, вот эта структура-содержание:
- Краткая история синтезаторов речиМеханические синтезаторы речиЭлектронные синтезаторы речиСинтез речи с помощью компьютеров
- “Старый” способ-Программа eSpeak NGУстановка eSpeak NGЗапуск eSpeak NG из командной строкиЗапуск eSpeak NG из программы Python
- Используемнейросеть-Синтезатор речи Piper TTSУстановка Piper TTSЗапуск Piper TTS из командной строкиЗапуск Piper TTS из программы Python
- Сервер синтеза речи на базе Piper и Repka-Pi 4Исходный код сервераUnit-файл для запуска синтезатораКлиент сервера синтеза речи
- Итоги
Современные микрокомпьютеры вполне могут синтезировать речь с приемлемым качеством, используя технологии нейросетей. В этой статье расскажем о том, как добавить «голос» к Российскому "одноплатнику" или, иначе говоря, микрокомпьютеру,Repka Pi 4.
Используем программные синтезаторы речи (TTS, Text-to-Speech) eSpeak NG и Piper.
Можно использовать приведённые в статье примеры кода сервера синтезатора речи, созданного на базе Piper и FastAPI. Этот сервер запускается через systemd автоматически при включении питания Repka Pi и получает запросы на синтез речи от внешних клиентов через HTTP. Получив такой запрос, сервер ставит его в очередь на «озвучивание». При этом клиент может не дожидаться окончания синтеза, а продолжать свою работу.
Буквально со дня на день, по утверждению команды разработчиков проекта Репка, в продаже появится более мощный микрокомпьютер Repka-Pi 5 с объемом оперативной памяти до 32 Гб, очень мощным процессором и, вроде как, он будет превосходить по производительности топовую 5-ую модель от Raspberry Pi ровно в два раза. На таком мощном одноплатнике синтез речи будет выполняться быстрее и эффективнее, можно будет использовать более крупные модели и даже объединить вместе задачи синтеза и распознавания речи (о распознавании была отдельнаястатья). Такое решение может быть использовано, например, в системах умного дома, киосках, говорящих умных игрушках, а также в учебных проектах.
Краткая история синтезаторов речи
Прежде чем перейти к практике и основному кейсу сначала коротко расскажем об истории развития технологий синтеза речи, от первых механических синтезаторов до применения нейросетей.
Механические синтезаторы речи
Первые попыткисинтеза речибыли предприняты еще в конце XVIII века. Для примера на рис. 1 показана копияговорящей машины Фабера, созданная в 1846 году.
При помощи ножной педали и воздушного меха в устройство подавался воздух. Для имитации человеческого органа речи изобретатель установил в надставной трубе своей машины вертикально одну за другой шесть металлических диафрагм, подымающихся и опускающихся на различную высоту.
Комбинируяпри помощи пальцев расположение этих диафрагм, а также форму надставной трубы, можно было получать звуки различного тембра, напоминающие человеческую речь.
Другой пример — Euphonia Иосифа Фабера. Это гибрид механического синтезатора речи на основе акустических устройств и клавиш, созданный в 1845–1846 годах (рис. 2).
Конечно, качество «речи», полученной от механических синтезаторов, для практического применения было очень низким. Однако такие синтезаторы смогли продемонстрировать саму идею синтеза речи.
Электронные синтезаторы речи
Следующий этап развития синтезаторов речи был связан с применением электроники. В 1930 году Хомер Дадли из Bell Telephone Laboratories создан электронный синтезатор речиVoder(voice operating demonstrator). Схема его работы показана на рис. 3.
Для синтеза речи здесь использовались клавиши, педаль, генераторы тона и шума, а также фильтры.
Среди других электронных синтезаторов можно упомянутьPattern playback, созданный Haskins Labs в 1940-1950 годы. Это устройство создавало звук из спектрограмм речи.
Синтез речи с помощью компьютеров
Когда наступила эра компьютеров, их сразу же попытались применить для синтеза речи.
В 1961 году в Bell Labs для синтеза слов песни Daisy Bell сделалимоделирование речевого тракта на программном уровне. При этом был использован компьютер IBM 704.
В 1968 году в японской лаборатории Electrotechnical Laboratory была создана первая система программного синтезатора речи TTS. В нём применялсяформантный синтезна основе правил фонетической транскрипции.
Также можно упомянуть системуMUSA(1975-1978 годы). Это была одна из первых систем синтеза речи в реальном времени. Она «говорила» на итальянском языке, но речь была больше похожа на голос робота.
В период с 1980 по 1990 годы велись разработки синтезаторов на основе формантного синтеза с лингвистическим анализом текста, а также с использованием детализированных фонем и правил для генерации речи.
Начиная с 1990 года в синтезаторах речи стали применяться статистические методы. Однако действительно высококачественный синтез речи стал возможен только с применением нейросетей.
Подробнее об использовании нейросетей для синтеза речи читайте в статье «Что такое технология TTS, как устроена и каких сферах используется синтез речи». Об истории создания синтезаторов речи можно прочитать в статье «A History of Text-to-Speech: From Mechanical Voices to AI Assistants».
Программа eSpeak NG
Если вы ищите легковесный синтезатор речи для микрокомпьютера и вам не так уж важно качество речи, то можно испытать программный синтезатор речиeSpeak NG. Это проект с открытыми исходными кодами (Open Source),использующий метод формантного синтеза.
Не вдаваясь в подробности, скажу, что при использовании этого метода голос генерируется алгоритмически, без записи реальных голосов. В результате будет создан «голос робота», который звучит неестественно.
Из преимуществ eSpeak NG можно отметить нетребовательность к ресурсам компьютера, что позволяет запускать этот синтезатор на Repka-Pi 4 с объёмом памяти всего 2 ГБайта.
Вы можете использовать eSpeak NG, например, для чтения уведомлений, в учебных и других проектах, где нет особых требований к качеству речи.
Установка eSpeak NG
Процесс установки eSpeak NG несложен. Нужно обновить пакеты и запустить процесс установки:
После установки проверьте, доступен ли русский язык:
Запуск eSpeak NG из командной строки
Для запуска eSpeak NG используйте командную строку:
Или на английском языке:
Вы можете запустить синтез из большого текста через командную строку:
Если нужно произнести текст, записанный в файл, воспользуйтесь такой командой:
В параметре -v можно задать разные голоса:
- ru — стандартный русский;
- ru+m1 … m7 — разные мужские русские голоса;
- ru+f1 … f5 — разные женские русские голоса
Например, так можно выбрать женский голос f5:
Запуск eSpeak NG из программы Python
Ниже я привёл программу на Pythonespeak-ng-test.py(есть в моём репозитории Github), запускающую синтез речи с помощью espeak-ng:
Здесь тестируются два голоса для русского языка и один для английского.
Для запуска программы используйте команду:
Синтезатор речи Piper TTS
Меня совсем не впечатлило качество звука, синтезированного при помощи eSpeak NG. Да, звук появляется в колонках практически сразу после запуска, но по моим ощущениям это голос робота из 80-х.
Намного лучше получилась речь, синтезированная локальным нейросетевым синтезатором речиPiper TTS. Этот синтезатор вполне работоспособен на микрокомпьютере Repka-Pi 4.
Хорошее качество речи достигается обучением по архитектуре вариационного вывода с использованием состязательного обучения для сквозного преобразования текста в речьVITS(Variational Inference with adversarial learning for end-to-end Text-to-Speech). При этом применяются модели, экспортированные в форматONNX.
За счёт применения ONNX и облегчённых моделей возможно выполнение синтеза в реальном времени на микрокомпьютерах. Это позволяет применять Piper TTS для голосовых ассистентов, умных устройств, роботов, информационных проектов, а также в учебных проектах на Repka-Pi.
Установка Piper TTS
Установку Piper TTS можно выполнить в виртуальном окружении:
Далее нужно скачать голоса:
Ссылки на другие голоса для Piper можно найтина сайтеhuggingface.co.
Запуск Piper TTS из командной строки
Для проверки качества синтеза используйте такую команду:
Здесь синтезированная речь будет записана в звуковой файл большой_текст.wav, котрый затем можно будет проиграть с помощью программы aplay:
Если нужно прочитать голосом текст из файла, используйте такую команду:
В данном случае звуковой файл не создаётся — результаты синтеза сразу отправляются программе aplay.
Сообщение, показанное ниже, говорит о том, что не обнаружен GPU:
Действительно, микрокомпьютер Repka-Pi 4 не оборудован GPU. Вы можете игнорировать это сообщение.
Также при запуске команды синтеза без формирования звукового файла на консоли может появится такое сообщение:
Оно возникает из-за того, что процессор не успевает готовить аудиоданные достаточно быстро. На более производительном микрокомпьютере Repka-Pi 5, который скоро будет доступен такое сообщение может не появляться.
В любом случае качество звука и на Repka-Pi 4 получается вполне удовлетворительным.
Запуск Piper TTS из программы Python
Синтезатор речи Piper TTS можно запускать из программ, составленных на Python. Для запуска программ, которые я привёл в статье, установите необходимые зависимости:
Первая программаpiper_stream_aplay.pyпроигрывает синтезированную речь через утилиту aplay без создания промежуточного wav-файла на диске.
В начале программы задаются такие параметры, как путь к исполнимому файлу Piper, к модели ONNX, частота дискретизации, формат создаваемого звука и устройство вывода:
Функция main проверяет передан ли путь к файлу с текстом, и если передан, то вызывает функцию speak_from_file:
В свою очередь, функция speak_from_file выполняет весь цикл синтеза речи.
Первым делом функция проверяет наличие файла, и если файл есть, читает его в переменную text, убирая пробелы в начале и в конце текста:
Далее функция запускает Piper в режиме потока:
Параметр --output_raw указывает, что нужно выдать сырой PCM, а не wav-файл. Параметры stdin и stdout нужны для получения текста и выдачи данных аудио, соответственно.
На следующем шаге функция запускает процесс aplay для воспроизведения звука:
Это аналогично запуску команды:
Программа aplay получает сырые данные в формате PCM с частотой 22050 Гц из потока piper.stdout.
Перед завершением своей работы функция speak_from_file передаёт текст в piper.stdin и ждёт завершения обоих процессов:
Запустить эту программу можно так:
Здесь я передаю ей в качестве параметра путь к файлу hello-repka-pi.txt с текстом, для которого нужно синтезировать речь.
Ещё одна программаpiper-stream.pyпередаёт результаты синтеза текста сразу в звуковое устройство (колонки, подключенные к Repka-Pi). Она воспроизводит через библиотеку sounddevice, минуя запуск внешних программ.
Основные отличия здесь в функции speak_from_file:
Она использует библиотеку sounddevice для воспроизведения аудио в реальном времени через PulseAudio. Функция обрабатывает ошибки, такие как отсутствие файла или пустое содержимое, и выходит с кодом ошибки в случае проблем.
Для запуска используйте команду:
Вы можете увидеть на консоли сообщение, связанное с недостаточной производительностью процессора:
Его можно игнорировать, оно не влияет на качество звука.
Сервер синтеза речи на базе Piper и Repka-Pi 4
Чтобы ваша программа могла отправлять текстовые сообщения на синтезатор, я подготовил программу сервера синтеза речи на базе Piper и FastAPI. Для воспроизведения аудио используется библиотека sounddevice.
В этом сервере реализовано разделение HTTP-обработчиков и воспроизведение аудио с помощью многопоточности и очереди задач.
Сервер запускается на микрокомпьютере Perka-Pi 4 и занимает порт 8000 локального сетевого интерфейса. К нему можно обращаться как непосредственно с узла Repka-Pi, на котором работает сервер, так и с другого узла по сети и адресу IP сервера.
Для отправки текста серверу синтеза можно использовать такую команду:
Сервер удобен тем, что программа клиента может быстро передать ему строку текста для синтеза и сразу же продолжить своё выполнение. Синтез будет выполняться одновременно с работой программы клиента в другом потоке.
Задержка при получении синтезированной речи составляет от одной до нескольких секунд и зависит от длины передаваемого текста.
Далее в статье вы также найдёте исходный код клиента, отправляющего подобный запрос из программы, составленной на Python.
Исходный код сервера
Исходный текст сервераtts_server_pcm.pyопубликован в моём репозитории на GitHub. При запуске он загружает и инициализирует модели, чтобы не выполнять эту длительную операцию каждый раз при получении текста для синтеза.
Для установки зависимостей используйте команду:
Перечислю основные функции и их назначение.
Функцияsynthesize_textпреобразует текст с аудиоданные. Она разделяет входной текст на строки, очищает строки от лишних пробелов и запускает последовательный синтез каждой строки с использованием модели Piper.
Далее она объединяет полученные фрагменты аудио в один массив, добавляет к нему начальную и конечную паузы для предотвращения проглатывания начальных и конечных звуков.
Выполнив все эти действия, функция возвращает аудиоданные в формате массива int16 numpy.
Для управления воспроизведением аудио в отдельном потоке используется классAudioPlayerThread.
Методinit_streamэтого класса создаёт и настраивает аудио поток через sounddevice, конфигурируя необходимые параметры.
Методrunзапускает воспроизведение в отдельном потоке.
Методaudio_worker, играющий роль фонового обработчика очереди задач, создаёт бесконечный цикл обработки задач из очереди. В этом цикле происходит ожидание доступных задач, вызывается синтез звука и запуск потока воспроизведения.
Контекстный менеджерlifespanуправляет жизненным циклом приложения. При запуске он инициализирует фоновый поток audio_worker и стартует его в режиме демона. При остановке — очищает очередь от ожидающих задач и завершает работу.
Теперь о маршрутах.
Чтобы принять текст для синтеза и воспроизведения определен маршрутPOST /say. Он проверяет входные данные, добавляет задачи в фоновую очередь и сразу возвращает ответ клиенту без ожидания воспроизведения синтезированной речи.
Пример вызова маршрута/say:
МаршрутGET /statusпозволяет получить текущее состояние сервера. Он возвращает JSON с информацией об общем статусе сервера, факте воспроизведения в данный момент, о количестве задач в очереди и частоте дискретизации аудио.
Пример вызова и ответа маршрута /status, когда сервер готов, но не занят синтезом речи:
А это пример ответа, когда сервер занят синтезом речи:
Если сервер занят синтезом, и в очереди еще два текста, ответ будет такой:
Unit-файл для запуска синтезатора
Для того чтобы сервер синтеза речи запускался автоматически при загрузке OS на Repka-Pi, создайтеUnit-файл/etc/systemd/system/tts-server.service:
Для запуска сервера используйте такие команды:
После запуска проверьте статус сервиса:
Также включите автозапуск при загрузке:
С помощью следующей команды вы сможете просматривать журнал сервиса:
Клиент сервера синтеза речи
Как я уже писал выше, для отправки текста на сервер синтеза речи можно использовать команду curl такого вида:
Здесь нужно указать адрес IP вашей Repki-Pi, который можно узнать из консоли при помощи команды «ip -a».
В файлеtts_client_pcm_play.pyвы найдете пример несложного клиента для описанного в этой статье синтезатора речи:
Эта программа читает текст из файла, который передаётся ей в качестве параметра, а затем отправляет его через POST-запрос на сервер распознавания речи. Вы можете запустить её такой командой:
На сегодняшний день для микрокомпьютера Repka-Pi 4 доступны как очень легковесные синтезаторы речи, работающие быстро, но с невысоким качеством, так и качественные синтезаторы, такие как Piper TTS.
В статье я рассмотрел только такие, которые способны «говорить» на русском языке при доступном объёме оперативной памяти 2 ГБайта и без GPU. Ожидаю, что с появлением более производительного микрокомпьютера Repka-Pi 5 можно будет использовать и другие модели, а также ускорить синтез звука.
Количество проектов и задач, в которых можно использовать данные решения, просто огромное. Озвучивание входящих сообщений, собственная читалка книг и т.д. и т.п. А если брать за основу своих проектов верхне-уровневую логику как на изображении, приведённом ниже:
и добавить к ней распознавание речи как встатьеи ещё в качестве модуля исполнения команд добавить собственный алгоритм - от самого простого набора условий, до системы поддержки принятия решений с применением нейросетевых моделей для принятия решения, то можно сделать свою локальную условную “алису” или помощника или общаться с роботом и получать от него голосовые запросы на подтверждение действий или принимаемых решений… и тут место для реализации замыслов и фантазий просто не ограничено.
Если Вам понравились эксперименты с синтезаторами речи на Repka-Pi, ставьте лайки, этот функционал недавно добавлен вРепкаБлогеи используйте Идеи из этой статьи в своих проектах.
Интересных творческих проектов!
Для создания данной статьи использован авторский материал технического писателя, инженера-программиста и известного разработчика и популяризатора IT-решенийАлександра Фролова, а так же материалы техническогоблогапроекта Репка.
Комментарии (0)