167 lines
5.1 KiB
JavaScript
167 lines
5.1 KiB
JavaScript
(function () {
|
||
let iatWS;
|
||
let resultText = "";
|
||
let resultTextTemp = "";
|
||
|
||
/**
|
||
* 获取websocket url
|
||
* 该接口需要后端提供,这里为了方便前端处理
|
||
*/
|
||
function getWebSocketUrl() {
|
||
// 请求地址根据语种不同变化
|
||
var url = "wss://iat-api.xfyun.cn/v2/iat";
|
||
var host = "iat-api.xfyun.cn";
|
||
var apiKey = API_KEY;
|
||
var apiSecret = API_SECRET;
|
||
var date = new Date().toGMTString();
|
||
var algorithm = "hmac-sha256";
|
||
var headers = "host date request-line";
|
||
var signatureOrigin = `host: ${host}\ndate: ${date}\nGET /v2/iat HTTP/1.1`;
|
||
var signatureSha = CryptoJS.HmacSHA256(signatureOrigin, apiSecret);
|
||
var signature = CryptoJS.enc.Base64.stringify(signatureSha);
|
||
var authorizationOrigin = `api_key="${apiKey}", algorithm="${algorithm}", headers="${headers}", signature="${signature}"`;
|
||
var authorization = btoa(authorizationOrigin);
|
||
url = `${url}?authorization=${authorization}&date=${date}&host=${host}`;
|
||
return url;
|
||
}
|
||
|
||
function toString(buffer) {
|
||
var binary = "";
|
||
var bytes = new Uint8Array(buffer);
|
||
var len = bytes.byteLength;
|
||
for (var i = 0; i < len; i++) {
|
||
binary += String.fromCharCode(bytes[i]);
|
||
}
|
||
return binary;
|
||
}
|
||
|
||
function renderResult(resultData) {
|
||
// 识别结束
|
||
let jsonData = JSON.parse(resultData);
|
||
if (jsonData.data && jsonData.data.result) {
|
||
let data = jsonData.data.result;
|
||
let str = "";
|
||
let ws = data.ws;
|
||
for (let i = 0; i < ws.length; i++) {
|
||
str = str + ws[i].cw[0].w;
|
||
}
|
||
// 开启wpgs会有此字段(前提:在控制台开通动态修正功能)
|
||
// 取值为 "apd"时表示该片结果是追加到前面的最终结果;取值为"rpl" 时表示替换前面的部分结果,替换范围为rg字段
|
||
if (data.pgs) {
|
||
if (data.pgs === "apd") {
|
||
// 将resultTextTemp同步给resultText
|
||
resultText = resultTextTemp;
|
||
}
|
||
// 将结果存储在resultTextTemp中
|
||
resultTextTemp = resultText + str;
|
||
} else {
|
||
resultText = resultText + str;
|
||
}
|
||
document.getElementById("result").innerText =
|
||
resultTextTemp || resultText || "";
|
||
}
|
||
if (jsonData.code === 0 && jsonData.data.status === 2) {
|
||
iatWS.close();
|
||
}
|
||
if (jsonData.code !== 0) {
|
||
iatWS.close();
|
||
console.error(jsonData);
|
||
}
|
||
}
|
||
|
||
function connectWebSocket(callback) {
|
||
const websocketUrl = getWebSocketUrl();
|
||
if ("WebSocket" in window) {
|
||
iatWS = new WebSocket(websocketUrl);
|
||
} else if ("MozWebSocket" in window) {
|
||
iatWS = new MozWebSocket(websocketUrl);
|
||
} else {
|
||
alert("浏览器不支持WebSocket");
|
||
return;
|
||
}
|
||
iatWS.onopen = (e) => {
|
||
var params = {
|
||
common: {
|
||
app_id: APPID,
|
||
},
|
||
business: {
|
||
language: "zh_cn",
|
||
domain: "iat",
|
||
accent: "mandarin",
|
||
vad_eos: 5000,
|
||
dwa: "wpgs",
|
||
},
|
||
data: {
|
||
status: 0,
|
||
format: "audio/L16;rate=16000",
|
||
encoding: "raw",
|
||
},
|
||
};
|
||
iatWS.send(JSON.stringify(params));
|
||
callback();
|
||
};
|
||
iatWS.onmessage = (e) => {
|
||
renderResult(e.data);
|
||
};
|
||
iatWS.onerror = (e) => {
|
||
console.error(e);
|
||
};
|
||
}
|
||
|
||
document.getElementById("input_file").onchange = (e) => {
|
||
if (e.target.files[0]) {
|
||
connectWebSocket(() => {
|
||
const reader = new FileReader();
|
||
reader.readAsArrayBuffer(e.target.files[0]);
|
||
|
||
reader.onload = (evt) => {
|
||
console.log(evt.target.result);
|
||
const audioString = toString(evt.target.result)
|
||
// console.log(audioString.length, evt.target.result.byteLength)
|
||
let offset = 0;
|
||
|
||
while(offset < audioString.length) {
|
||
const subString = audioString.substring(offset, offset + 1280)
|
||
offset += 1280
|
||
// console.log(subString.length, subString)
|
||
const isEnd = offset >= audioString.length
|
||
iatWS.send(
|
||
JSON.stringify({
|
||
data: {
|
||
status: isEnd ? 2 : 1,
|
||
format: "audio/L16;rate=16000",
|
||
encoding: "raw",
|
||
audio: window.btoa(subString)
|
||
},
|
||
})
|
||
);
|
||
}
|
||
// const interval = setInterval(() => {
|
||
// const subString = audioString.substring(offset, offset + 1280)
|
||
// offset += 1280
|
||
// // console.log(subString.length, subString)
|
||
// const isEnd = offset >= audioString.length
|
||
// iatWS.send(
|
||
// JSON.stringify({
|
||
// data: {
|
||
// status: isEnd ? 2 : 1,
|
||
// format: "audio/L16;rate=16000",
|
||
// encoding: "raw",
|
||
// audio: window.btoa(subString)
|
||
// },
|
||
// })
|
||
// );
|
||
// if (isEnd) {
|
||
// clearInterval(interval)
|
||
// }
|
||
// }, 20)
|
||
|
||
};
|
||
reader.onerror = () => {
|
||
iatWS.close();
|
||
};
|
||
});
|
||
}
|
||
};
|
||
})();
|