Как правильно реализовать Microsoft text to speech в PHP

#php

#php

Вопрос:

Я пытаюсь реализовать преобразование текста Microsoft в речь на php, следуя инструкциям по ссылке ниже.

Ссылка на Microsoft API

вот пример post-запроса API

 POST /co&nitiveservices/v1 HTTP/1.1

X-Microsoft-OutputFormat: raw-16khz-16bit-mono-pcm
Content-Type: application/ssml xml
Host: westus.tts.speech.microsoft.com
Content-Len&th: 225
Authorization: Bearer [Base64 access_token]

<speak version='1.0' xml:lan&='en-US'&&t;<voice xml:lan&='en-US' xml:&ender='Female'
    name='en-US-AriaRUS'&&t;
        Microsoft Speech Service Text-to-Speech API
</voice&&t;</speak&&t;
  

Я уже получил свой токен доступа.

Вот моя проблема. Как я добавил текст, который я буду преобразовывать в речь. Я пробовал, пробовал это

 $params = "Hello I need to be converted to Voice"; 
  

но ничего не приходит.нет сообщения об ошибке.

Вот весь код на данный момент

 $url = 'https://westus.tts.speech.microsoft.com/co&nitiveservices/v1';
$curl = curl_init();
$params = "Hello I need to be converted to Voice";


$myApp_name = 'Text-to-Speech-App';
$header = [
"Authorization: Bearer mytoken-&oes-here",
    "Content-Type: application/ssml xml",
"X-Microsoft-OutputFormat: raw-16khz-16bit-mono-pcm",
"User-A&ent: $myApp_name",
"Content-Len&th:". strlen($params)
];


curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $params);

echo $response = curl_exec($curl);
  

Комментарии:

1. Попробуйте curl_&etinfo, чтобы получить дополнительную информацию об ответе. Вы сначала пробовали это вне PHP? Как в Postman? Просто чтобы привыкнуть к их API?

2. спасибо за ответ. судя по образцу запроса API. Кажется, что мне нужно отправлять данные в этом формате, и это моя главная проблема <speak version='1.0' xml:lan&='en-US'&&t;<voice xml:lan&='en-US' xml:&ender='Female' name='en-US-AriaRUS'&&t; Microsoft Speech Service Text-to-Speech API </voice&&t;</speak&&t;

3. @vuryss curl_&etinfo($curl, CURLINFO_HTTP_CODE) curl_info возвращает ошибку 400, которая по кодам ошибок API означает недопустимый запрос

4. Попробуйте использовать это в $params переменной, затем

5. Заполните $params переменную XML в виде чистой строки. Как вы вставили здесь. Если вы хотите сконструировать его более причудливым способом — вы можете использовать некоторые расширения PHP XML, но для простых случаев, подобных этому, подойдет однострочный вариант.

Ответ №1:

Если у кого-то еще возникла эта проблема — сначала вам нужно получить токен доступа, который затем отправляется с исходным кодом в виде заголовка.

Подробности здесь в разделе «Как получить токен доступа». Этот токен действителен только в течение 10 минут.

Ответ №2:

Вы можете поместить любую строку в тело HTTP-запроса. Неважно, закодирован ли это URL, JSON, двоичный файл, XML или что-то еще.

Для простых случаев, подобных этому, вы можете создать простую строку, содержащую XML, который вам нужен для вашего запроса. Вот так:

 $params = "<speak version='1.0' xml:lan&='en-US'&&t;<voice xml:lan&='en-US' xml:&ender='Female' name='en-US-AriaRUS'&&t;Hello I need to be converted to Voice</voice&&t;</speak&&t;";
  

Но для более сложных XML-файлов и чтобы быть уверенным, что вы генерируете допустимый XML-файл, вы можете использовать одну из библиотек PHP XML, таких как:

https://www.php.net/manual/en/book.simplexml.php

https://www.php.net/manual/en/book.dom.php

Где вы можете создать XML объектно-ориентированным способом, а затем преобразовать его в допустимую строку, убедившись в отсутствии синтаксической ошибки.

И CURL API может быть немного запутанным, но тело запроса переходит в CURLOPT_POSTFIELDS . Это касается не только данных, закодированных в URL-адресе POST.