4 回答
TA贡献1827条经验 获得超7个赞
如果第一个答案中提到的curl请求不起作用,您还可以使用PHP - Guzzle。
这是我的代码:
if($langCode == 'fa'){
$region = 'uaenorth';
$key = 'key-for-the-resource-region';
$languageCode = 'fa-IR';
$voice = 'fa-IR-DilaraNeural';
}else{
$region = 'northeurope';
$key = 'key-for-the-resource-region';
$languageCode = 'fi-FI';
$voice = 'fi-FI-SelmaNeural';
}
$body = "<speak version='1.0' xml:lang='$languageCode'><voice xml:lang='$languageCode' name='$voice'>$content</voice></speak>";
$client = new Client();
$headers = [
'Content-Type' => ' application/ssml+xml',
'Ocp-Apim-Subscription-Key' => $key,
'X-Microsoft-OutputFormat' => 'audio-16khz-128kbitrate-mono-mp3'
];
$request = new Request('POST', "https://$region.tts.speech.microsoft.com/cognitiveservices/v1", $headers, $body);
$res = $client->sendAsync($request)->wait();
$response = $res->getBody();
// Check if the request was successful
if ($response !== false) {
return base64_encode($response);
} else {
return false;
}
TA贡献1111条经验 获得超0个赞
如果您能确定一些事情,例如:
使用正确的区域,即如果您要转换波斯语,则需要确保波斯语的 URL 中有正确的区域。
例如:https: //uaenorth.tts.speech.microsoft.com/cognitiveservices/v1
uaenorth特定于中东语言。
在您的 Azure 帐户中,您需要为该区域创建资源。假设您在美国创建了一个资源,并且尝试使用在美国创建的资源的密钥转录波斯语,它将不起作用。
这是我的代码,它并不完美,但它可以工作。这是我给你的想法。
if($langCode == 'fa'){
$region = 'uaenorth';
$key = 'Key-for-resource-created-in-uaenorth';
$languageCode = 'fa-IR';
$voice = 'fa-IR-DilaraNeural';
}else{
$region = 'northeurope';
$key = 'Key-for-resource-created-in-northeurope';
$languageCode = 'fi-FI';
$voice = 'fi-FI-SelmaNeural';
}
$data = "<speak version=\'1.0\' xml:lang=\'$languageCode\'>
<voice xml:lang=\'$languageCode\' name=\'$voice\'>
$content
</voice>
</speak>";
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://$region.tts.speech.microsoft.com/cognitiveservices/v1",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS =>json_encode($data),
CURLOPT_HTTPHEADER => array(
'Content-Type: application/ssml+xml',
'Ocp-Apim-Subscription-Key: $key',
'X-Microsoft-OutputFormat: audio-16khz-128kbitrate-mono-mp3'
),
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
TA贡献1804条经验 获得超8个赞
您可以将任何字符串放入 HTTP 请求的正文中。无论它是 URL 编码、JSON、二进制、XML 还是其他形式。
对于像这样的简单情况 - 您可以创建一个简单的字符串,其中包含请求所需的 XML。像这样:
$params = "<speak version='1.0' xml:lang='en-US'><voice xml:lang='en-US' xml:gender='Female' name='en-US-AriaRUS'>Hello I need to be converted to Voice</voice></speak>";
但对于更复杂的 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
. 这不仅适用于 POST url 编码数据。
- 4 回答
- 0 关注
- 222 浏览
添加回答
举报