ztwcom
Version:
优化
104 lines (94 loc) • 3.18 kB
JavaScript
let speak = window.speechSynthesis;
let message = new window.SpeechSynthesisUtterance();
let msgArr = []
let idx = 0
//指定本地语言包服务为true的语言包
message.voice = speak.getVoices().filter(function (voice) { return voice.localService == true && voice.lang == "zh-CN"; })[0];;
//正在播报的报警数据
let speakingDataMap = new Map();
function speakMsg (newSpeakDataMap, interval = 2000) {
msgArr = []
//更新正在播报数据
if (speakingDataMap.size > 0) {
speakingDataMap.forEach(function (value, key, map) {
if (newSpeakDataMap.get(key) == null) {
//报警已经结束,移除此条报警信息
speakingDataMap.delete(key);
} else {
//更新相应报警信息
speakingDataMap.set(key, newSpeakDataMap.get(key));
newSpeakDataMap.delete(key);
}
});
}
//将新增报警添加到播报数据
if (newSpeakDataMap.size > 0) {
newSpeakDataMap.forEach(function (value, key, map) {
speakingDataMap.set(key, value);
})
}
for (const key in newSpeakDataMap) {
if (Object.prototype.hasOwnProperty.call(newSpeakDataMap, key)) {
const element = newSpeakDataMap[key];
// console.log(element, 'element')
msgArr.push(element)
}
}
repeat(msgArr, interval)
}
function arabicToChinese (str) {
const numMap = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九'];
return str.split('').map(char => numMap[parseInt(char)]).join('');
}
function repeat (msgArr, interval) {
console.log(idx, msgArr[idx], '---')
message.text = msgArr[idx];
speak.speak(message)
message.onend = () => {
// return new Promise((resolve, reject) => {
// resolve(message, idx, msgArr)
window.setTimeout(() => {
if (idx == (msgArr.length - 1)) {
// 最后一条
idx = 0
repeat(msgArr, interval)
} else {
// 中间条数
idx++
repeat(msgArr, interval)
}
}, interval)
// })
}
}
// 暂停
function pause () {
speak.pause()
}
// 恢复暂停
function resume () {
speak.resume()
}
// 清空
function cancel () {
message.onend = null;
speak.cancel();
}
function test (text) {
//let message = new window.SpeechSynthesisUtterance(text);
//message.voice = window.speechSynthesis.getVoices().filter(function(voice) { return voice.localService == true && voice.lang == "zh-CN"; })[0];
//message.voice = speak.getVoices().filter(function(voice) { return voice.localService == true && voice.lang == "zh-CN"; })[0];
/*message.volume = 100; // 声音的音量
message.rate = 1;// 语速,数值,默认值是1,范围是0.1到10
message.pitch = 1.5; // 表示说话的音高,数值,范围从0(最小)到2(最大)。默认值为1
message.lang = 'zh-CN'*/
message.text = text;
speak.speak(message);
//speak.speak(message);
/*for(let i = voices.length-1; i >= 0 ; i--) {
message.voice = voices[i];
message.text = text;
speak.speak(message);
}*/
}
export { speakMsg, cancel, pause, resume };