Наш небольшой скайнет уже умеет переписываться, но настало время озвучить его голоса.
Важно! Если Вы не читали предыдущих статей по Character.AI, то в первую очередь необходимо прочитать с первой статьи, иначе будет ничего не понятно.
В Python есть библиотеки, которые могут озвучивать текст, но есть одна неприятная вещь, они говорят одним голосом, а у нас разные персонажи, поэтому голоса должны быть тоже разные.
Есть такой удобный сервис APIHOST, здесь можно ввести текст и выбрать персонажа, который будет его озвучивать.
Здесь можно ввести любой текст нажать на кнопку “Озвучить” и получить озвучку. Также можно выбирать разные голоса из списка.
Здесь есть разные голоса, правда Левитан является платным (очень жаль). Можете поэкспериментировать с голосами. Но остальные параметры нас в данной теме не интересуют.
Нам необходимо сделать так, чтобы этот сервис был доступным в нашей программе. К сожалению у сервиса нет никакого API и даже библиотеки. Но мы сами с усами и сможем написать свой класс.
В папке нашего проекта с общающимися персонажами давай создадим новый файл voice.py и установим две библиотеки, которые нам понадобятся
pip install pygame requests
Библиотека pygame нам необходима для проигрывания звука с удаленного источника, т.к. мы будем получать лишь ссылку на файл, а библиотека requests нужна для того, чтобы отправлять запросы к сервису. После установки давай сразу импортируем все библиотеки, которые нам понадобятся.
Первые две библиотеки мы уже разобрали, а вот в третьей строке импортируем класс BytesIO из библиотеки io. В Python он предоставляет возможность работы с данными в виде байтового потока в памяти. Этот класс позволяет создавать и манипулировать байтовыми данными, а также использовать их вместо файлового объекта.
Этот класс нам понадобится, чтобы содержимое полученного аудиофайла сохранять в объекте BytesIO. Объект BytesIO будет предоставлять возможность работы с данными в виде байтового потока в памяти.
Четвертая библиотека random необходима для того, чтобы выбрать случайный голос.
Теперь приступи к написанию класса, определим его и метод инициализации.
В этом списке хранятся идентификаторы каждого доступного (бесплатного) голоса, я их подобрал за вас, поэтому остается просто перепечатать в свой код.
Настало время, когда нам необходимо задуматься о составлении запроса к сервису. Любой запрос состоит из трех вещей:
- Ссылка и метод, куда необходимо отправлять запрос, т.е. url;
- Заголовки, которые необходимо отправить сервису, чтобы он понимал какие данные возвращать и с кем общается;
- Данные, которые сервис должен принять и на их основе вернуть результат.
Где же нам все это взять? Конечно же в браузере. 🙂 Открывайте вкладку с сервисом, затем нажимайте клавишу F12, чтобы открыть инструмент разработчика. В открывшемся окне откройте вкладку Network (Сеть).
Чтобы нам не мешали эти запросы, давайте почистим историю нажав на корзину.
Теперь необходимо в поле текст ввести что-то и нажать кнопку “Озвучить”.
Как только вы нажмете кнопку озвучить, то в списке запросов появится две строки. Первый запрос - это непосредственно отправка данных с параметрами по озвучиванию, а в ответе от сервера ссылка на скачивание файла. Второй запрос присылает файл в формате base64. Нас интересует первый, я его на изображении выделил красным цветом. Нажми на него.
Помнишь про три составляющие запроса? Первый - это ссылка, куда отправлять и через какой метод. Видим, что метод используется POST, а рядом адрес. Тип метода держим в голове, а вот ссылку необходимо добавить в новое поле в нашем классе.
Отлично! Теперь движемся далее. Второй пункт - это заголовки, которые необходимо отправить. Их необходимо скопировать из “Заголовков запроса”.
Лучше не перепечатывайте мои, а используйте только те, что будут в вашем браузере, чтобы сервер не увидел подвоха. Теперь необходимо сформировать словарь из этих заголовков. Естественно куки будут периодически устаревать и их придется обновлять, поэтому мы и определили для них отдельный аргумент.
С инициализацией мы закончили, теперь переходим к третьему пункту - это данные, т.е. параметры, которые необходимо отправить на сервер. Для того чтобы узнать какие параметры отправлять, давайте зайдем во вкладку “Запрос”.
Вот этот словарь необходимо реализовать в виде отдельного метода, в который мы будем передавать текст для озвучки, какой голос использовать и возможно интонацию (её пока сделаем по умолчанию нормальной).
Отлично! Остается отправить запрос. Для этого создадим отдельный метод.
Если запрос будет успешен, то метод вернет ссылку на аудиофайл, иначе слово “Ошибка”. Это значение мы обработаем в следующем методе, который будет проигрывать аудиофайл. Метод так и назовем play.
На скрине все прокомментировано. Думаю, что все будет понятно. Если нет, задавайте вопросы в комментариях.
С файлом voice.py мы закончили, теперь его необходимо импортировать в основной файл и создать константу COOKIE, если помнишь мы сделали отдельный аргумент в классе. Естественно значение в константу необходимо взять из браузера, в частности из заголовков запроса.
Теперь создадим два экземпляра класса, один для первого персонажа и второй соответственно для другого.
Теперь запускаем проигрывание в двух местах: в приветствии и в основной беседе.
Заметили? Я убрал десятисекундное ожидание в функции sleep, т.к. озвучка теперь требует определенное время. Но оставил эту строчку, т.к. это дополнительный параметр, которым можно вносить корректировка в скорость работы нашего скайнет, чтобы он не так быстро захватил мир 🙂.
Всё, можно запускать программу и слушать, как ребята общаются друг с другом, каждый раз используя разные голоса. Разве это не здорово?
Подписывайся на канал, чтобы ничего не пропустить. И переходи к прочтению следующей статьи по созданию собственного персонажа.