Бессерверные технологии расширяют возможности специальных возможностей: преобразование текста в речь с помощью Amazon Polly

Мы живем в невероятную эпоху технологических достижений и инноваций, меняющих каждый аспект нашей жизни. От искусственного интеллекта и машинного обучения до автоматизации и больших данных нельзя отрицать, что будущее уже здесь.
Например, заголовок этого сообщения в блоге был написан с помощью ChatGPT, чтобы сделать его SEO-оптимизированным. Изображение попугая было сделано с помощью DALL-E.
А как насчет аудиоплеера, который читает этот текст для вас? Оказывается, это тоже можно автоматизировать.
И это то, что мы обсудим сегодня, автоматизируя преобразование текста в речь (TTS) с помощью Amazon Polly.
Я предоставлю полностью работающее бессерверное решение на GitHub с кодом Python и AWS CDK. Вы можете развернуть код и наслаждаться преобразованием текста в речь за считанные минуты.
Нажмите здесь , чтобы перейти к проекту GitHub.

Этот пост в блоге изначально был опубликован на моем веб-сайте «Ran The Builder».
Доступность важна
Я запустил свой веб-сайт RanTheBuilder , чтобы поделиться с миром своими знаниями об AWS и бессерверных технологиях. Доступный веб-сайт способствует инклюзивности и гарантирует, что все люди могут получить доступ к контенту и взаимодействовать с ним. Доступность вышла на первый план в последние годы, и все больше веб-сайтов обращают на это внимание.
Недавно я заметил, что Medium добавил аудиоплеер для сообщений в блоге, который читает сообщения для вас, что является отличной функцией доступности.
Я понятия не имел, как они это сделали, и это казалось недосягаемым.
Однако я был вдохновлен на немедленные действия, когда увидел следующее видео на YouTube:
В этом видео строитель AWS Community Йоханнес Кох берет интервью у Джимми Далквиста , коллеги по строительству. Они обсуждают, как Джимми автоматизировал создание своего блога с помощью AWS Step Functions, что привело к созданию речевой версии текста сообщения с помощью Amazon Polly.
Я никогда не слышал об Amazon Polly, но почувствовал вдохновение попробовать его сам и, наконец, решить важную отсутствующую функцию доступности моего веб-сайта.
Я разработал простое решение, которое идеально соответствует моим относительно скромным потребностям.
Прежде чем мы перейдем к деталям, давайте узнаем об Amazon Polly.
Введение в службу преобразования текста в речь Amazon Polly
Amazon Polly — это облачный сервис преобразования текста в речь (TTS). Он использует передовые технологии глубокого обучения для преобразования письменного текста в реалистичную речь, что позволяет разработчикам создавать голосовые приложения с естественным звучанием голоса.
Polly поддерживает широкий спектр языков (24 на момент написания), и пользователи могут выбирать из нескольких мужских и женских голосов с разными акцентами и тонами (всего 47). Служба также предоставляет расширенные функции, такие как автоматическое распознавание речи (ASR) и язык разметки синтеза речи (SSML), что позволяет разработчикам точно настраивать произношение, выделение и интонацию выходной речи.
Одной из самых сильных сторон Amazon Polly является то, что это бессерверный сервис. Он будет выводить аудиофайлы непосредственно в корзину S3, что упрощает встраивание в любую архитектуру, основанную на событиях. Он будет обрабатывать любой размер текста, который вы ему набросите автоматически, вам не нужно раскручивать дополнительные машины, и вы платите только за количество символов, которые вы преобразуете в речь.
С моего короткого времени использования это просто; текст входит, mp3-файл выходит в корзину S3.

Бесплатный уровень впечатляет и удовлетворит потребности многих людей, включая мои.
Подробнее о ценах .
Давайте посмотрим, как автоматизировать преобразование текста в речь с помощью API Amazon Polly.
Мой сервис Python для преобразования текста в речь
Давайте рассмотрим цель сервиса, детали дизайна и реализации.
Цель
Я хочу иметь возможность создавать файлы .mp3 из своих сообщений в блоге и загружать их на свой веб-сайт при работе над новыми сообщениями. Сервис должен быть бессерверным, простым в использовании и развернутым с помощью AWS CDK.
Я хочу, чтобы использование было максимально простым:
- Добавьте новый текстовый файл в папку «текст» службы TST (преобразование текста в речь).
- Разверните сервис на AWS.
- Получите mp3-файл, доставленный на мой адрес электронной почты.
Подводя итог: добавьте текстовый файл в папку «текст», разверните его на AWS, подождите минуту и получите mp3-файл, доставленный на ваш почтовый ящик. Простой!
Если вы хотите попробовать это сами, перейдите к проекту на GitHub и следуйте инструкциям и использованию в файле readme.
Дизайн высокого уровня
С точки зрения дизайна сервис довольно прост. У вас есть объект облачного хранилища, который используется для ввода и промежуточной обработки.
Тогда у вас есть два основных игрока: производитель и потребитель.
Производитель загружает текстовые файлы в облачное хранилище, которые отправляются потребителю.
Потребитель преобразует текстовый файл в mp3-файл и отправляет его по электронной почте в качестве вложения.

Сервисная архитектура
Давайте заглянем в архитектуру и посмотрим, как я реализовал каждую сущность.
Отказ от ответственности: этот сервис уровня POC обеспечивает автоматизацию для моих нужд самым простым способом. Добавление кода приветствуется!

Поток событий
- Пользователь добавляет новый текстовый файл в папку text в корневой папке проекта.
- Пользователь развертывает сервис с помощью AWS CDK (можно использовать команду make deploy).
- Файл загружен на S3.
- Функция Consumer Lambda запускается с событием «объект, созданный в S3», и считывает имя файла и имя корзины из события.
- Функция Consumer Lambda отправляет текстовое содержимое в Amazon Polly и приостанавливает/опрашивает, пока задача не будет завершена.
- После завершения задачи выходной mp3-файл загружается из корзины S3 и удаляется из нее. Поскольку мы отправляем его по электронной почте, нет необходимости хранить его на S3, но вы можете отключить его и отправить по электронной почте ссылку на объект вместо файла mp3.
- Функция Lambda использует Amazon SES для отправки mp3-файла по электронной почте в виде вложения на предварительно определенный адрес электронной почты.
Мы используем корзину Amazon S3 как для входных данных, так и для выходного хранилища Amazon Polly для объекта облачного хранилища. Polly имеет встроенную интеграцию с Polly, так что это имеет смысл. Код CDK корзины можно найти здесь .
Производитель — это специальная конструкция AWS CDK, которая загружает файлы в S3 из определенной папки. Обычно я добавляю по одному файлу и развертываю сервис. Вы также можете вручную загрузить файл в корзину, но это не имеет смысла; мы хотим автоматизации. Код CDK производителя можно посмотреть здесь .
Потребитель — это функция Lambda, которая подписывается на события корзины S3 «при создании объекта» и срабатывает при записи новых объектов.
Функция будет принимать каждое событие, считывать его и отправлять его содержимое в Amazon Polly. Он использует API «start_speech_synchronous_task» . Я использовал официальный образец SDK- обертки Amazon Polly , который получает содержимое текстового файла и возвращает mp3-файл в качестве вывода — довольно просто!
Код потребительского CDK можно найти здесь .
А код лямбда-функции можно найти здесь .
Использование обертки Polly в моем коде можно посмотреть здесь .
Производительность и открытые вопросы
В моем случае запись в блоге из 11 000 символов занимает около 40–50 секунд, чтобы превратиться в mp3-файл на моем адресе электронной почты после завершения развертывания. Это неплохо.
Вы можете задаться вопросом, почему я удаляю mp3-файл с S3 и отправляю его в виде вложения электронной почты.
Ну, я хочу, чтобы mp3-файл был удален и отправлен в виде вложения электронной почты, потому что я хочу загрузить его на свой веб-сайт, где хранилище уже оплачено, вместо того, чтобы хранить и воспроизводить его из моей личной учетной записи разработчика AWS.
Вы также можете задаться вопросом: ну, это хорошая реализация, но оптимальна ли она? Это лучший вариант дизайна?
Ну нет.
Лямбда-функция-потребитель ожидает и опрашивает Polly до тех пор, пока ее задача синтеза не будет завершена, что является плохой практикой как с точки зрения производительности, так и с точки зрения затрат. Однако для проекта POC, который запускается раз в две недели (когда я публикую новый пост), это приемлемо, по крайней мере, на данный момент.
Лучшим решением является использование пошаговых функций с состоянием ожидания. Полли может уведомить тему SNS, когда задача будет выполнена; что SNS может отправить сообщение в сообщение SQS, а затем в Lambda, которое разбудит пошаговую функцию с токеном ожидания, чтобы продолжить отправку файла на мою электронную почту.
Итак, почему я предпочел лямбда-функцию пошаговой реализации конечного автомата? Несколько причин:
- Обертка AWS Polly позволила мне быстро продвинуться вперед, и она делает все в одном процессе (она выполняет спящий режим и опрос для вас), поэтому функцию Lambda проще использовать по сравнению с функцией шага, которая не сможет использовать SDK.
- Вы не можете разрабатывать и отлаживать пошаговые функции в среде IDE, в отличие от функций Lambda. Я хотел как можно быстрее предоставить ценность для этого варианта использования и быстро получить результаты.
- Это больше касается обеспечения доступности и изучения чего-то нового, а не создания наилучшего из возможных готовых к производству решений.
Да, конечно. Я сделаю это как часть v2 сервиса, но вклады в код также приветствуются!
Еще одна область улучшений заключается в том, что я не использую лексиконы или язык разметки синтеза (SSML), что позволяет разработчикам точно настраивать произношение, акцент и интонацию выходной речи. Это может изменить правила игры, но требует дополнительных исследований, чтобы понять эту функцию и то, как ее автоматизировать.
И, наконец, обработку ошибок, повторные попытки и тесты — все еще нужно создать. Я тестировал код в IDE (называемый обработчиком Lambda с генерируемым событием) и во время развертывания в качестве сквозного теста.
Хотите узнать больше о том, как тестировать бессерверные приложения? Посмотрите мой пост здесь .