Google даёт отличную библиотеку для преобразования текста в голос. Сервис Google Text to Speech позволяет преобразовать текстовый контент в mp3-файл с произношением указанной фразы.
В этой статье я расскажу вариант использования TTS при помощи консоли и cURL.
Начнём.
Получаем ключи.
Первое, что нужно сделать — зарегистрироваться и получить необходимые ключи для работы. Я не буду останавливаться на этом этапе т.к. Google часто меняет алгоритм получения ключей и информация скоро, вероятно, станет неактуальной, тем самым только больше собьет Вас с толку.
На момент написания статьи о том, как получить ключи можно узнать по ссылке в блоке Before you begin.
Добавляем переменную окружения.
Получив заветный json-файл разместите его в удобном для Вас месте на Вашем сервере.
Для работы Cloud SDK (установку рассмотрим в след. шаге) и генерации токена доступа нам нужна переменная окружения GOOGLE_APPLICATION_CREDENTIALS, в которой будет указан путь к json с ключами.
Единоразово установить это значение можно так:
export GOOGLE_APPLICATION_CREDENTIALS="/home/user/Downloads/service-account-file.json"
Не забывайте, что срок жизни переменной, в таком случае, закончится вместе с Вашей консольной сессией. Чтобы не добавлять каждый раз — добавьте строку в ~/.bash_profile.
Просто добавьте указанную выше строку EXPORT GOOGLE_APPLICATION_CREDENTIALS........... в конец файла.
Устанавливаем Google Cloud SDK.
Перейдите по ссылке.
Скачайте подходящий вариант архива и следуйте инструкциям. В этом месте не должно возникнуть проблем — мануал по установке достаточно исчерпывающий.
Если что-то пошло не так — напишите в комментарии — постараемся решить проблему.
Признаком успешности выполнения будет вывод токена в ответ на команду
gcloud auth application-default print-access-token
Работаем с API
Консоль
Для консольного обращения достаточно использовать пример с Документации:
curl -X POST \ -H "Authorization: Bearer "$(gcloud auth application-default print-access-token) \ -H "Content-Type: application/json; charset=utf-8" \ -d @request.json \ https://texttospeech.googleapis.com/v1/text:synthesize
В примере используется файл request.json — привожу его ниже:
{
"input":{
"text":"Text example"
},
"voice":{
"languageCode":"en-gb",
"name":"en-GB-Standard-A",
"ssmlGender":"FEMALE"
},
"audioConfig":{
"audioEncoding":"MP3"
}
php cURL
$data = [
'input' => [
"text" => 'Text example'
],
'voice' => [
'languageCode' => 'en-gb',
'name' => 'en-GB-Standard-A',
'ssmlGender' => 'FEMALE'
],
'audioConfig' => [
'audioEncoding' => 'MP3'
]
];
curl_setopt($ch, CURLOPT_URL, 'https://texttospeech.googleapis.com/v1/text:synthesize');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode( $data ) );
$headers = array();
$authKey = trim( file_get_contents('/var/www/html/tts-key') ); // получаем ключ
$headers[] = 'Authorization: Bearer ' . $authKey;
$headers[] = 'Content-Type: application/json; charset=utf-8';
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$result = json_decode( curl_exec($ch), true );
if (curl_errno($ch)) {
echo 'Error:' . curl_error($ch);
exit;
}
curl_close($ch);
echo '
Приведенный выше пример выведет html-тег audio, который уже сможет озвучить Ваш текст.
Также есть два момента. В моём случае получение токена для каждого обращения было не очень удобным, поэтому я создал sh-файл, который в Кроне вызывается каждые 10 минут и сохраняет ключ в файл. Php, в свою очередь, забирает ключ с этого файла и подставляет в header.
sh-файл выглядит так:
#!/bin/bash # tts key /path/to/google-cloud-sdk/bin/gcloud auth application-default print-access-token > /var/www/html/tts-key
Этот файл получит токен и сохранит его в нужный файл, с которого далее мы читаем его при помощи php. При желании можно добавить EXPORT GOOGLE_APPLICATION_CREDENTIALS........... также в sh-ник перед вызовом gcoud.
Обратите внимание — мы указываем ПОЛНЫЙ путь к gcloud. Если Вы не помните, где он находится — используйте команду:
whereis gcloud
И последнее. Если Вам нужно сохранить полученный голосовой поток в файл — используйте следующий код:
file_put_contents('path/to/file.mp3', base64_decode($result['audioContent']));
Вместо последней строки с echo.
Текста получилось много, но, по сути, ничего сложного в задаче нет. Если у Вас что-то не получилось или остались вопросы — пишите в комментарии.
Удачи!