问题描述
我想将 Azure 的 STT REST API 用于我的带有录制音频的 react-native 应用程序。 但我尝试搜索如何传递 wav 文件,但总是响应“未收到音频数据”或其他错误响应。
我非常确定订阅密钥是有效的,因为当我使用 get 令牌时,它会响应 200。 wav 文件也不是问题。因为当我将文件下载到我的计算机然后将它上传到 Azure STT 的主页时,它会响应正确的答案。 最后,我试图弄清楚如何以正确的形式传递它,但一切都是为了网站。 这是我的代码 `
const file = new ReactNativeFile({
uri:
`file://${audioFile}`,type: 'audio/wav',name: 'ABCS160101e1a011b160a3e169d7b0.wav',});
let form = new formData();
const headers = {
'Ocp-Apim-Subscription-Key': 'MyKey','Content-type': 'audio/wav; codecs=audio/pcm;samplerate=16000',Accept: 'application/json',};
const url = `https://eastasia.stt.speech.microsoft.com/speech/recognition/conversation/cognitiveservices/v1?language=en-US`;
await form.append('audio',file);
console.log('before');
let response = await axios.post(url,form,{
headers: headers,});
console.log('after');
console.log('result',JSON.stringify(response));
} catch (err) {
getlog.cw('err23',err);
return err;
}
};`
import AudioRecord from 'react-native-audio-record';
const options = {
sampleRate: 16000,// default 44100
bitsPerSample: 16,// 8 or 16,default 16,wavFile: "ABCS160101e1a011b160a3e169d7b0.wav"
};
const toggleRecord = async () => {
if (isRecording) {
const audioFile = await AudioRecord.stop();
setIsRecording(false);
// reloadRecorder();
} else {
setIsRecording(true);
AudioRecord.init(options);
AudioRecord.start();
}
};
解决方法
首先写
let form = new FormData();
代替
let form = new formData();
其次,我想您的 audioFile 看起来像这样 - file://...
。所以你不必像这样写 uri: file://${audioFile} ..你可以简单地写
uri:audioFile
SO 最终实施将是
let form = new FormData();
form.append('audio',{
uri: audioFile,type: 'audio/wav',name: 'ABCS160101e1a011b160a3e169d7b0.wav',});
const headers = {
'Ocp-Apim-Subscription-Key': 'MyKey','Content-type': 'audio/wav; codecs=audio/pcm;samplerate=16000',Accept: 'application/json',};
const url = `https://eastasia.stt.speech.microsoft.com/speech/recognition/conversation/cognitiveservices/v1?language=en-US`;
console.log('before');
let response = await axios.post(url,form,{
headers: headers,});
console.log('after');
console.log('result',JSON.stringify(response));