Синтезируем Английскую Речь
На прошлой неделе меня попросили записать видео-инструкцию и озвучить ее на английском языке, чтобы можно было поделиться этим с интеграторами. Я написал текст и попытался бодро озвучить видео несколько раз, но акцент и не самая беглая речь давали результат, которым я не был доволен. Чтобы не мучать себя и слушателей, я нашел сервис, который сам озвучивает текст с чувством, толком, расстановкой. Внес туда написанный текст, скачал полученную звуковую дорожку, наложил на видео и остался доволен смотнированным результатом.
Все это меня натолкнуло на то, что, конечно же, нужно прокачивать язык. А еще неплохо задокументировать те знания и эксперименты, которые я проводил с использованием Text-to-Speech.
Что такое Text-to-Speech?
Наверняка многие из вас сталкивались с роботизированной озвучкой: в google translate, любимой онлайн-школе английского языка, игре или приложении. Это технология Text-to-Speech (TTS), которая буквально преобразовывает текст в речь.
Сама технология не нова и используется уже много лет. Но как и любая технология - она развивалась постепенно. Голоса современных помощников типа Алисы уже сложно отличить от человеческого, но за этим скрывалось колосальное количество работы.
Сейчас для того, чтобы использовать Text-to-Speech в своем приложении достаточно выбрать онлайн-сервис, который предоставляет эти услуги, например:
- Яндекс.Speechkit классно говорит по русски, но отвратительно звучит на английском;
- Amazon Polly выдает очень хорошую озвучку на английском (а может и на других языках, я не проверял).
Есть и другие сервисы. И все они прекрасно справляются со своими задачами, если понимать их ограничения:
- невозможность кэширования результата;
- невозможность использования внешних сервисов из-за соображениий безопасности;
- невозможность оплатить внешний сервис;
- озвучка может звучать ужасно.
Что делать, если невозможно использовать внешний сервис?
Есть несколько основных вариантов, как организовать озвучку на сайте или в приложении:
- Используя встроенные средства мобильной платформы;
- Используя встроенные средства браузера;
- Заказать предобученную модель;
- Найти предобученную модель в open source.
У первых двух вариантов качество речи оставляет желать лучшего, но если хочется запилить прототип - то это самое простое и быстрое решение.
Говоря о заказе моделей, я нашел несколько компаний, которые занимаются синтезом и распознованием речи, а также создают модели под конкретные нужды, например, голоса для игр. Я пообщался с компанией Silero, у них есть классные статьи на Хабре, а так же бот в телеге, где можно генерировать разные фразочки разными голосами, например героев из WarCraft. Вариант использования проприетарных решений хорош, если вы понимаете, что это даст буст вашему бизнесу или сэкономит операционные расходы.
Что касается поиска моделей в open source - это сплошная головная боль. Все в основном сделано для датасаентистов - установи питон, установи кучу пакетов, обучи модель. Практически все, что нашел из предобученного: либо не работало, либо давало не тот результат, который бы хотелось. Порог входа - высокий.
Но в один момент я наткнулся на 🐸 Coqui, который оказался развивающимся форком технологии от Mozilla с предобученными моделями в комплекте и хорошим произношением на английском. Насколько я понял, самые лучшие результаты базировались на использовании модели Tacotron от NVIDIA.
Я был крайне впечатлен сэмплами и, вместо изучения английского, решил попробовать развернуть и потестировать модель.
Тестируем 🐸 Coqui
Чтобы собрать такой простой docker-compose.yml
пришлось потратить не один час, так как было несколько вариантов,
как запустить модель. К счастью кокуй уже публикует образы, в которые сразу же включена страничка для тестирования.
services:
coqui-tts:
image: ghcr.io/coqui-ai/tts-cpu:latest
ports:
- "8080:5002"
volumes:
- data:/root/.local/share/tts
entrypoint: [ "python3", "TTS/server/server.py", "--model_name", "tts_models/en/ljspeech/vits" ]
# entrypoint: ["python3", "TTS/server/server.py", "--model_name", "tts_models/en/ljspeech/tacotron2-DDC"]
volumes:
data:
И развернул у себя для тестов.
Модель говорит чистым женским голосом и распространяется по лицензиям, которые позволяют использовать ее в коммерческих целях в том числе (это естественно лучше всегда перепроверять самостоятельно).
К слову, Coqui идет с 20 моделями, так что можете поэкспериментировать:
# Запускаете образ локально и заходим в консоль
docker run --rm -it -p 5002:5002 --entrypoint /bin/bash ghcr.io/coqui-ai/tts-cpu
# Вывести на экран список доступных моделей
python3 TTS/server/server.py --list_models
# Запускаете сервер с понравившейся моделью
python3 TTS/server/server.py --model_name tts_models/en/ljspeech/tacotron2-DDC
Прежде чем использовать
Приведенный пример в этой статье - это не production-вариант. Чтобы использовать ее в продакшене - нужно, как минимум, настроить кэш. А как максимум - прочитать советы по оптимизации (в документации они были).