dataV-xunfei/input-file.js

167 lines
5.1 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

(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();
};
});
}
};
})();