147 lines
4.4 KiB
JavaScript
147 lines
4.4 KiB
JavaScript
let temporaryVariable_preText = ""; // 上次播报的语音,不充分播报
|
||
let temporaryVariable_isAudio = true; // 播放状态,是否开启
|
||
|
||
// 防抖函数
|
||
function debounce(func, wait) {
|
||
let timeout;
|
||
return function (...args) {
|
||
const context = this;
|
||
clearTimeout(timeout);
|
||
timeout = setTimeout(() => func.apply(context, args), wait);
|
||
return () => clearTimeout(timeout); // 返回一个取消函数
|
||
};
|
||
}
|
||
|
||
// 语音播报 播报dom的内容
|
||
function speechDomText(event) {
|
||
// console.log("speechDomText", event);
|
||
event.stopPropagation();
|
||
|
||
let str = "";
|
||
|
||
if (
|
||
event && event.target
|
||
) {
|
||
let nodeName = event.target.nodeName
|
||
if (nodeName == "BUTTON" || nodeName == "DIV") {
|
||
str = event.target.innerText;
|
||
}
|
||
}
|
||
|
||
if (str && str !== "") {
|
||
voiceBroadcast(str);
|
||
}
|
||
}
|
||
|
||
// 使用防抖函数包装 speechDomText
|
||
const debouncedSpeechDomText = debounce(speechDomText, 500);
|
||
|
||
function speechDomTextBarrier(event) {
|
||
// console.log("speechDomTextBarrier", event);
|
||
event.stopPropagation();
|
||
|
||
let str = "";
|
||
|
||
if (
|
||
event &&
|
||
event.target &&
|
||
(event.target.ariaLabel || event.target.ariaDescription)
|
||
) {
|
||
str = event.target.ariaLabel || event.target.ariaDescription;
|
||
}
|
||
|
||
if (str && str !== "") {
|
||
voiceBroadcast(str);
|
||
}
|
||
}
|
||
|
||
// 使用防抖函数包装 speechDomTextBarrier,增加防抖时间
|
||
const debouncedSpeechDomTextBarrier = debounce(speechDomTextBarrier, 2000);
|
||
|
||
// 游戏专用的语音播报函数,增加更长的防抖时间
|
||
function speechDomTextBarrierGame(event) {
|
||
// console.log("speechDomTextBarrierGame", event);
|
||
event.stopPropagation();
|
||
|
||
let str = "";
|
||
|
||
if (
|
||
event &&
|
||
event.target &&
|
||
(event.target.ariaLabel || event.target.ariaDescription)
|
||
) {
|
||
str = event.target.ariaLabel || event.target.ariaDescription;
|
||
}
|
||
|
||
if (str && str !== "") {
|
||
// 检查虚拟老师是否正在播放语音,如果是则跳过播报
|
||
if (window.virtualTeacherPlaying || (window.virtualTeacher && window.virtualTeacher.isPlaying)) {
|
||
console.log('虚拟老师正在播放语音,跳过游戏名称播报:', str);
|
||
return;
|
||
}
|
||
voiceBroadcast(str);
|
||
}
|
||
}
|
||
|
||
// 使用更长的防抖时间包装游戏语音播报
|
||
const debouncedSpeechDomTextBarrierGame = debounce(speechDomTextBarrierGame, 3000);
|
||
|
||
// 设置是否语音播报
|
||
function setIsAudio(event) {
|
||
temporaryVariable_isAudio = !temporaryVariable_isAudio;
|
||
event.target.innerText = temporaryVariable_isAudio ? "📢" : "🔇";
|
||
voiceBroadcast(temporaryVariable_isAudio ? "开启语音播报" : "关闭语音播报");
|
||
}
|
||
|
||
// 调用讯飞接口播报语音
|
||
function voiceBroadcast(text) {
|
||
if (temporaryVariable_preText == text || !temporaryVariable_isAudio) {
|
||
return
|
||
}
|
||
|
||
// 检查虚拟老师是否正在播放语音,如果是则跳过播报
|
||
if (window.virtualTeacherPlaying || (window.virtualTeacher && window.virtualTeacher.isPlaying)) {
|
||
console.log('虚拟老师正在播放语音,跳过无障碍播报:', text);
|
||
return;
|
||
}
|
||
|
||
temporaryVariable_preText = text;
|
||
|
||
const audioPlayer = document.getElementById('audioPlayer');
|
||
|
||
const vcn = ["xiaoyan", "aisjiuxu", "aisxping", "aisjinger", "aisbabyxu", "x4_lingxiaoqi_cts", "x4_lingyouyou", "x4_lingfeizhe_zl"];
|
||
|
||
$.ajax({
|
||
url: 'http://rgclass.iflysse.com:8200/text2audio',
|
||
type: 'POST',
|
||
contentType: 'application/x-www-form-urlencoded',
|
||
data: {
|
||
text: text,
|
||
vcn: vcn[6],
|
||
speed: 50
|
||
},
|
||
headers: {
|
||
'Cache-Control': 'no-store'
|
||
},
|
||
success: function (data) {
|
||
|
||
let timer01 = setTimeout(function () {
|
||
const url = `http://rgclass.iflysse.com:8200${data}`;
|
||
audioPlayer.src = url;
|
||
audioPlayer.load();
|
||
audioPlayer.play();
|
||
clearTimeout(timer01);
|
||
// console.log("text2audio success", url, audioPlayer);
|
||
}, 800);
|
||
|
||
},
|
||
error: function (jqXHR, textStatus, errorThrown) {
|
||
console.error('text2audio error:', textStatus, errorThrown);
|
||
}
|
||
});
|
||
|
||
let timer02 = setTimeout(function () {
|
||
temporaryVariable_preText = "";
|
||
clearTimeout(timer02);
|
||
}, 5000);
|
||
} |