Microsoft的文字转语音的CORS政策问题

时间:2019-03-27 11:19:48

标签: angular text-to-speech microsoft-cognitive

当我尝试与Microsoft进行语音对话时,我收到此错误:

  

在以下位置访问XMLHttpRequest   原产地的“ https://westeurope.tts.speech.microsoft.com/”   “ http://localhost:4200”已被CORS政策屏蔽:对   预检请求未通过访问控制检查:否   请求中存在“ Access-Control-Allow-Origin”标头   资源。   我天生就在Angular中,我的代码是这样的:

this.http.post<any>('https://westeurope.api.cognitive.microsoft.com/sts/v1.0/issueToken', null, {headers: new HttpHeaders({'Ocp-Apim-Subscription-Key': '3e17428195894a8f9de3e76ee431ff80'})}).subscribe(
      () => {},
      (err) => {
        console.log(err.error.text);
        let body = '<speak version=\'1.0\' xmlns="https://www.w3.org/2001/10/synthesis" xml:lang=\'en-US\'><voice  name=\'Microsoft Server Speech Text to Speech Voice (en-US, Jessa24kRUS)\'>Welcome to Microsoft Cognitive Services <break time="100ms" /> Text-to-Speech API.</voice> </speak>';
        let headersSpeech = new HttpHeaders({
          'Authorization': 'Bearer ' + err.error.text,
          'cache-control': 'no-cache',
          'X-Microsoft-OutputFormat': 'riff-24khz-16bit-mono-pcm',
          'Content-Type': 'application/ssml+xml'
        });
        this.http.post<any>('https://westeurope.tts.speech.microsoft.com/', body, {headers: headersSpeech}).subscribe(
          (resultData) => console.log(resultData)
        );
      });

是的,如您所见,当我询问令牌时,Microsoft向我发送了一个错误,但他们在文本错误内向我发送了该令牌(我也没收到。) 我尝试了以下解决方案:

let headersSpeech = new HttpHeaders({
      'Access-Control-Allow-Origin': 'http://localhost:4200/',
      'Access-Control-Allow-Methods': 'GET,PUT,POST,DELETE,OPTIONS',
      'Access-Control-Allow-Headers': '*',
      'Authorization': 'Bearer ' + err.error.text,
      'cache-control': 'no-cache',
      'X-Microsoft-OutputFormat': 'riff-24khz-16bit-mono-pcm',
      'Content-Type': 'application/ssml+xml'
    });

但这不起作用。我认为问题出在微软,但我想确定。

1 个答案:

答案 0 :(得分:0)

您遇到CORS问题:

有几种方法可以解决此问题

1)关闭CORS。例如:how to turn off cors in chrome

2)为您的browser

使用插件

3)使用代理,例如nginx。 example of how to set up

更详细地说,您正在尝试从本地主机访问api.serverurl.com。这是跨域请求的确切定义。

通过关闭它只是为了完成工作(好吧,如果您访问其他站点会给您带来较差的安全性,并且只会使您无法使用),您可以使用代理,使您的浏览器认为所有请求都来自本地主机,实际上您有本地服务器然后可以调用远程服务器。

因此api.serverurl.com可能会变为localhost:8000 / api,并且您的本地nginx或其他代理将发送到正确的目的地。