在JavaScript中,我们使用recorder.js捕获麦克风输入,将其下采样到16kHz,将其编码为WAV文件并获得blob。 接下来,我们通过FileReader onload()回调获取原始blob字节,然后使用XMLHttpRequest将原始字节发送()到Bing。 XMLHttpRequest包含标头: ' OCP-APIM-订阅密钥' :' xxxxxx' '内容类型' :' audio / wav;编解码器=音频/ PCM;采样率= 16000' 示例blob大小为62456字节。
FireFox网络跟踪显示2个交互。首先是 请求网址:https://speech.platform.bing.com/speech/recognition/interactive/cognitiveservices/v1?language=en-US&format=simple 请求方法:选项 第二个 请求网址:https://speech.platform.bing.com/speech/recognition/interactive/cognitiveservices/v1?language=en-US&format=simple 请求方法:POST 内容长度:94476
但是,我一直收到以下回复 {" RecognitionStatus":" InitialSilenceTimeout""偏移":29000000,"持续时间":0}
FWIW,知道为什么源blob大小为62456会导致内容长度:94476?
相应的原始blob字节由Amazon Lex正确处理。
是否有任何JavaScript RESTful示例? 非常感谢。
/ ---------------------------------------------- ---------------- 将下面的测试用例放在一起后,我也尝试了以下内容,但没有成功。
console.log("Send to BING blob");
var self = this;
console.log(blob);
var msUrl = 'https://speech.platform.bing.com/speech/recognition/interactive/cognitiveservices/v1';
msUrl += '?language=en-US';
msUrl += '&format=simple';
console.log(msUrl);
var xhr = new XMLHttpRequest();
xhr.onload = function(evt) { console.log('onload', xhr, evt);};
xhr.open('POST', msUrl, true);
xhr.setRequestHeader('Accept', 'application/json;text/xml');
xhr.setRequestHeader('Ocp-Apim-Subscription-Key', 'xxx');
var bingContentType = 'audio/wav; codec=audio/pcm; samplerate=16000';
xhr.setRequestHeader('Content-Type', bingContentType);
xhr.send(blob);
答案 0 :(得分:0)
发送到Bing的较短代码版本很好。问题是录音机工作人员的编码WAV(样本)功能没有 将下采样考虑到16000.该功能错误地将捕获的采样率写为标题值。要调整的行是:
view.setUint32(24, downSampleRate, true);
view.setUint32(28, downSampleRate * 2, true); /*MONO*/
显然AWS Lex会忽略标头值,因为它只需要16kHz单声道,而Bing服务必须查看标头信息以确定支持哪种音频格式。
答案 1 :(得分:0)
今天我遇到了这个问题,花了半个小时后,我找到了问题的真正原因。让我来看看这个link中提到的步骤。
通过在
中运行以下代码验证了我的密钥$ FetchTokenHeader = @ { '内容类型' ='应用程序/ X WWW的窗体-urlencoded&#39 ;; '内容长度' =' 0&#39 ;; ' OCP-APIM-订阅密钥' ='' }
$ OAuthToken = Invoke-RestMethod -Method POST -Uri https://api.cognitive.microsoft.com/sts/v1.0/issueToken -Headers $ FetchTokenHeader
$ OAuthToken