general-assistant
Version:
General Assistant components
111 lines (110 loc) • 4.51 kB
JavaScript
let broadAudio = null;
export default (defaultConfig, customConfig, set, get) => {
function createBlobAudio(_text, _blob) {
broadAudio = new Audio();
set(() => ({ broadActiveText: _text, broadFlag: 'pause' }));
broadAudio.src = URL.createObjectURL(_blob);
broadAudio.addEventListener('ended', () => {
URL.revokeObjectURL(broadAudio.src);
set(() => ({ broadActiveText: '', broadFlag: 'bobao' }));
broadAudio = null;
});
broadAudio.play();
}
return {
sourceList: [],
updateList: (_list) => set(() => ({ sourceList: _list })),
getSourceList: () => get().sourceList,
clearSourceList: () => set(() => ({ sourceList: [] })),
broadList: [],
addBroad: (_newitem) => {
const _filter = get().broadList.filter((e) => e.text !== _newitem.text);
set(() => ({ broadList: _filter.concat(_newitem) }));
},
broadFlag: 'bobao',
broadActiveText: '',
broadAudio: (openToast, text, voice) => {
if (text && voice) {
let _broadList = get().broadList;
const _filter = _broadList.filter((e) => e.text !== text);
_broadList = _filter.concat({ text, voice });
set(() => ({ broadList: _broadList }));
}
if (!voice && get().broadFlag === 'loading') {
console.log('有正在转换的文本请稍后重试!');
if (get().broadActiveText !== text) {
openToast('voiceToTextLoad');
}
set(() => ({ broadFlag: 'bobao' }));
return true;
}
const _find = (get().broadList).find((e) => e.text === text);
if (_find === undefined) {
if (broadAudio) {
broadAudio.pause();
URL.revokeObjectURL(broadAudio.src);
broadAudio = null;
}
set(() => ({ broadActiveText: text, broadFlag: 'loading' }));
return false;
}
if (voice) {
createBlobAudio(_find.text, _find.voice);
return true;
}
else {
if (!broadAudio || get().broadActiveText !== text) {
broadAudio?.pause();
URL.revokeObjectURL(broadAudio?.src);
broadAudio = null;
createBlobAudio(_find.text, _find.voice);
return true;
}
if (broadAudio?.paused) {
set(() => ({ broadFlag: 'pause' }));
broadAudio?.play();
}
else {
set(() => ({ broadFlag: 'play' }));
broadAudio?.pause();
}
}
return true;
},
stopBroadAudio: () => broadAudio && (set(() => ({ broadFlag: 'play' })), broadAudio.pause()),
changeBroadFlag: (_flag) => set(() => ({ broadFlag: _flag })),
webApiBroad: (openToast, _text) => {
if (typeof SpeechSynthesisUtterance === 'undefined') {
openToast('NotSupport');
return;
}
if (get().broadActiveText !== _text && get().broadFlag !== 'bobao') {
set(() => ({ broadFlag: 'bobao' }));
window.speechSynthesis.cancel();
}
if (get().broadFlag === 'bobao') {
window.speechSynthesis.cancel();
const utterance = new SpeechSynthesisUtterance(_text);
utterance.addEventListener('start', () => {
set(() => ({ broadActiveText: _text, broadFlag: 'pause' }));
});
utterance.addEventListener('end', () => {
set(() => ({ broadFlag: 'bobao' }));
window.speechSynthesis.cancel();
});
window.speechSynthesis.speak(utterance);
return;
}
if (get().broadFlag === 'pause') {
set(() => ({ broadFlag: 'play' }));
window.speechSynthesis.pause();
return;
}
if (get().broadFlag === 'play') {
set(() => ({ broadFlag: 'pause' }));
window.speechSynthesis.resume();
return;
}
}
};
};