为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 PHP 中正确实现 Microsoft 文本转语音

如何在 PHP 中正确实现 Microsoft 文本转语音

PHP
摇曳的蔷薇 2023-09-22 14:44:21
我正在尝试按照下面链接中的教程在 php 中实现 Microsoft 文本到语音。微软API链接这是 API 示例发布请求POST /cognitiveservices/v1 HTTP/1.1X-Microsoft-OutputFormat: raw-16khz-16bit-mono-pcmContent-Type: application/ssml+xmlHost: westus.tts.speech.microsoft.comContent-Length: 225Authorization: Bearer [Base64 access_token]<speak version='1.0' xml:lang='en-US'><voice xml:lang='en-US' xml:gender='Female'    name='en-US-AriaRUS'>        Microsoft Speech Service Text-to-Speech API</voice></speak>我已经获得了我的访问令牌。这是我的问题。 如何添加我将转换为语音的文本。我试过这个$params = "Hello I need to be converted to Voice"; 但什么也没发生。没有错误消息。这是到目前为止的完整编码$url = 'https://westus.tts.speech.microsoft.com/cognitiveservices/v1';$curl = curl_init();$params = "Hello I need to be converted to Voice";$myApp_name = 'Text-to-Speech-App';$header = ["Authorization: Bearer mytoken-goes-here",    "Content-Type: application/ssml+xml","X-Microsoft-OutputFormat: raw-16khz-16bit-mono-pcm","User-Agent: $myApp_name","Content-Length:". 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);
查看完整描述

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;

    }


查看完整回答
反对 回复 2023-09-22
?
catspeake

TA贡献1111条经验 获得超0个赞

如果您能确定一些事情,例如:

  1. 使用正确的区域,即如果您要转换波斯语,则需要确保波斯语的 URL 中有正确的区域。

例如:https: //uaenorth.tts.speech.microsoft.com/cognitiveservices/v1

uaenorth特定于中东语言

  1. 在您的 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;


查看完整回答
反对 回复 2023-09-22
?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

如果其他人遇到此问题 - 首先您需要获取访问令牌,然后将其作为标头与原始代码一起发送。


查看完整回答
反对 回复 2023-09-22
?
胡说叔叔

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 编码数据。


查看完整回答
反对 回复 2023-09-22
  • 4 回答
  • 0 关注
  • 222 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信