Найти в Дзене
КиберMamedov 💻🔥

Озвучка персонажей из нейросети Character.AI

Наш небольшой скайнет уже умеет переписываться, но настало время озвучить его голоса.

Важно! Если Вы не читали предыдущих статей по Character.AI, то в первую очередь необходимо прочитать с первой статьи, иначе будет ничего не понятно.

В Python есть библиотеки, которые могут озвучивать текст, но есть одна неприятная вещь, они говорят одним голосом, а у нас разные персонажи, поэтому голоса должны быть тоже разные.

Есть такой удобный сервис APIHOST, здесь можно ввести текст и выбрать персонажа, который будет его озвучивать.

Страница с сервисом озвучиванием текста
Страница с сервисом озвучиванием текста

Здесь можно ввести любой текст нажать на кнопку “Озвучить” и получить озвучку. Также можно выбирать разные голоса из списка.

Выбор голоса для озвучки
Выбор голоса для озвучки

Здесь есть разные голоса, правда Левитан является платным (очень жаль). Можете поэкспериментировать с голосами. Но остальные параметры нас в данной теме не интересуют.

Нам необходимо сделать так, чтобы этот сервис был доступным в нашей программе. К сожалению у сервиса нет никакого API и даже библиотеки. Но мы сами с усами и сможем написать свой класс.

В папке нашего проекта с общающимися персонажами давай создадим новый файл voice.py и установим две библиотеки, которые нам понадобятся

pip install pygame requests

Библиотека pygame нам необходима для проигрывания звука с удаленного источника, т.к. мы будем получать лишь ссылку на файл, а библиотека requests нужна для того, чтобы отправлять запросы к сервису. После установки давай сразу импортируем все библиотеки, которые нам понадобятся.

Импортирование всех необходимых библиотек
Импортирование всех необходимых библиотек

Первые две библиотеки мы уже разобрали, а вот в третьей строке импортируем класс BytesIO из библиотеки io. В Python он предоставляет возможность работы с данными в виде байтового потока в памяти. Этот класс позволяет создавать и манипулировать байтовыми данными, а также использовать их вместо файлового объекта.

Этот класс нам понадобится, чтобы содержимое полученного аудиофайла сохранять в объекте BytesIO. Объект BytesIO будет предоставлять возможность работы с данными в виде байтового потока в памяти.

Четвертая библиотека random необходима для того, чтобы выбрать случайный голос.

Теперь приступи к написанию класса, определим его и метод инициализации.

Определение класса
Определение класса

В этом списке хранятся идентификаторы каждого доступного (бесплатного) голоса, я их подобрал за вас, поэтому остается просто перепечатать в свой код.

Настало время, когда нам необходимо задуматься о составлении запроса к сервису. Любой запрос состоит из трех вещей:

  1. Ссылка и метод, куда необходимо отправлять запрос, т.е. url;
  2. Заголовки, которые необходимо отправить сервису, чтобы он понимал какие данные возвращать и с кем общается;
  3. Данные, которые сервис должен принять и на их основе вернуть результат.

Где же нам все это взять? Конечно же в браузере. 🙂 Открывайте вкладку с сервисом, затем нажимайте клавишу F12, чтобы открыть инструмент разработчика. В открывшемся окне откройте вкладку Network (Сеть).

Открытая вкладка Сеть
Открытая вкладка Сеть

Чтобы нам не мешали эти запросы, давайте почистим историю нажав на корзину.

Кнопка очистки
Кнопка очистки

Теперь необходимо в поле текст ввести что-то и нажать кнопку “Озвучить”.

Запрос на озвучивание
Запрос на озвучивание

Как только вы нажмете кнопку озвучить, то в списке запросов появится две строки. Первый запрос - это непосредственно отправка данных с параметрами по озвучиванию, а в ответе от сервера ссылка на скачивание файла. Второй запрос присылает файл в формате base64. Нас интересует первый, я его на изображении выделил красным цветом. Нажми на него.

Метод отправки и адрес
Метод отправки и адрес

Помнишь про три составляющие запроса? Первый - это ссылка, куда отправлять и через какой метод. Видим, что метод используется POST, а рядом адрес. Тип метода держим в голове, а вот ссылку необходимо добавить в новое поле в нашем классе.

Определение ссылки для отправки данных.
Определение ссылки для отправки данных.

Отлично! Теперь движемся далее. Второй пункт - это заголовки, которые необходимо отправить. Их необходимо скопировать из “Заголовков запроса”.

Заголовки запроса
Заголовки запроса

Лучше не перепечатывайте мои, а используйте только те, что будут в вашем браузере, чтобы сервер не увидел подвоха. Теперь необходимо сформировать словарь из этих заголовков. Естественно куки будут периодически устаревать и их придется обновлять, поэтому мы и определили для них отдельный аргумент.

Определение поля с заголовками
Определение поля с заголовками

С инициализацией мы закончили, теперь переходим к третьему пункту - это данные, т.е. параметры, которые необходимо отправить на сервер. Для того чтобы узнать какие параметры отправлять, давайте зайдем во вкладку “Запрос”.

Данные для отправки на сервер
Данные для отправки на сервер

Вот этот словарь необходимо реализовать в виде отдельного метода, в который мы будем передавать текст для озвучки, какой голос использовать и возможно интонацию (её пока сделаем по умолчанию нормальной).

Метод, который возвращает данные
Метод, который возвращает данные

Отлично! Остается отправить запрос. Для этого создадим отдельный метод.

Метод для запроса озвучки на сервере
Метод для запроса озвучки на сервере

Если запрос будет успешен, то метод вернет ссылку на аудиофайл, иначе слово “Ошибка”. Это значение мы обработаем в следующем методе, который будет проигрывать аудиофайл. Метод так и назовем play.

Метод проигрывания аудиофайла
Метод проигрывания аудиофайла

На скрине все прокомментировано. Думаю, что все будет понятно. Если нет, задавайте вопросы в комментариях.

С файлом voice.py мы закончили, теперь его необходимо импортировать в основной файл и создать константу COOKIE, если помнишь мы сделали отдельный аргумент в классе. Естественно значение в константу необходимо взять из браузера, в частности из заголовков запроса.

Подключили метод
Подключили метод

Теперь создадим два экземпляра класса, один для первого персонажа и второй соответственно для другого.

Создание двух экземпляров для озвучки текста
Создание двух экземпляров для озвучки текста

Теперь запускаем проигрывание в двух местах: в приветствии и в основной беседе.

Добавление озвучки текста в приветствии и беседе
Добавление озвучки текста в приветствии и беседе

Заметили? Я убрал десятисекундное ожидание в функции sleep, т.к. озвучка теперь требует определенное время. Но оставил эту строчку, т.к. это дополнительный параметр, которым можно вносить корректировка в скорость работы нашего скайнет, чтобы он не так быстро захватил мир 🙂.

Всё, можно запускать программу и слушать, как ребята общаются друг с другом, каждый раз используя разные голоса. Разве это не здорово?

Подписывайся на канал, чтобы ничего не пропустить. И переходи к прочтению следующей статьи по созданию собственного персонажа.