#php
#php
Вопрос:
Я пытаюсь реализовать преобразование текста Microsoft в речь на php, следуя инструкциям по ссылке ниже.
вот пример 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.