| /** | |
| * 声音通知工具 | |
| * 使用 Web Audio API 播放提示音,无需音频文件 | |
| */ | |
| /** | |
| * 播放分析完成提示音 | |
| * 使用 Web Audio API 生成一个简短悦耳的提示音,表示分析任务已完成 | |
| */ | |
| export function playAnalysisCompleteSound(): void { | |
| try { | |
| // 创建一个新的 AudioContext(每次调用时创建,避免浏览器自动暂停) | |
| const audioContext = new (window.AudioContext || (window as any).webkitAudioContext)(); | |
| // 创建振荡器和增益节点 | |
| const oscillator = audioContext.createOscillator(); | |
| const gainNode = audioContext.createGain(); | |
| // 连接节点 | |
| oscillator.connect(gainNode); | |
| gainNode.connect(audioContext.destination); | |
| // 设置音调:先高后低,形成"完成"的感觉(类似 Cursor IDE 的提示音) | |
| oscillator.frequency.setValueAtTime(600, audioContext.currentTime); | |
| oscillator.frequency.setValueAtTime(900, audioContext.currentTime + 0.15); | |
| // 设置音色(sine 更柔和) | |
| oscillator.type = 'sine'; | |
| // 设置音量:淡入淡出,避免突兀 | |
| gainNode.gain.setValueAtTime(0, audioContext.currentTime); | |
| gainNode.gain.linearRampToValueAtTime(0.3, audioContext.currentTime + 0.01); | |
| gainNode.gain.exponentialRampToValueAtTime(0.01, audioContext.currentTime + 0.3); | |
| // 播放(总时长约 300ms) | |
| oscillator.start(audioContext.currentTime); | |
| oscillator.stop(audioContext.currentTime + 0.3); | |
| // 清理资源 | |
| oscillator.onended = () => { | |
| audioContext.close(); | |
| }; | |
| } catch (error) { | |
| // 静默失败,不影响主要功能 | |
| // 某些浏览器可能不支持 Web Audio API 或需要用户交互后才能播放 | |
| console.debug('无法播放提示音:', error); | |
| } | |
| } | |