UNPKG

general-assistant

Version:

General Assistant components

111 lines (110 loc) 4.51 kB
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; } } }; };