//index.js //获取应用实例 const app = getApp(); const typeList = app.globalData.getTypeList(); const selectedIndex = typeList.length > 1 ? app.globalData.getSelectedTypeIndex() : 0; let audio = null; let videoAd = null; Page({ data: { placeholder: '点击此处输入文字', text: '', typeList, selectedIndex: String(selectedIndex) ? selectedIndex : 0, isAudioPlaying: false, currentAudioText: '' }, onLoad(){ wx.showShareMenu(); this.initVideoAd(); }, // 初始化激励视频广告 initVideoAd() { // 若在开发者工具中无法预览广告,请切换开发者工具中的基础库版本 if (wx.createRewardedVideoAd) { videoAd = wx.createRewardedVideoAd({ adUnitId: 'adunit-aedf0933f69de926' }); videoAd.onLoad(() => { console.log('激励视频广告加载成功'); }); videoAd.onError((err) => { console.error('激励视频广告加载失败', err); }); videoAd.onClose((res) => { if (res && res.isEnded) { // 用户看完广告,重置使用次数 this.resetTtsCount(); } else { // 用户中途退出 wx.showToast({ title: '请看完广告获取次数', icon: 'none' }); } }); } }, // 显示激励视频广告 showVideoAd() { if (videoAd) { videoAd.show().catch(() => { // 失败重试 videoAd.load() .then(() => videoAd.show()) .catch(err => { console.error('激励视频广告显示失败', err); wx.showToast({ title: '广告加载失败,请稍后重试', icon: 'none' }); }); }); } else { wx.showToast({ title: '广告功能暂不可用', icon: 'none' }); } }, // 重置TTS使用次数 async resetTtsCount() { wx.showLoading({ title: '正在重置次数...', mask: true }); try { const result = await new Promise((resolve, reject) => { app.request({ url: `${app.globalData.domain}/open-api/wx330e54aa6000516d/tts-count-reset`, success(res) { resolve(res.data); }, fail(err) { reject(err); } }); }); wx.hideLoading(); if (result.code === 2000000) { wx.showToast({ title: '获得10次使用机会!', icon: 'success' }); } else { wx.showToast({ title: result.msg || '重置失败', icon: 'none' }); } } catch (error) { wx.hideLoading(); wx.showToast({ title: '网络错误', icon: 'none' }); } }, // 显示次数用完弹窗 showLimitDialog() { wx.showModal({ title: '使用次数已用完', content: '今日免费次数已用完,观看广告可获得额外10次使用机会', confirmText: '观看广告', cancelText: '明日再试', success: (res) => { if (res.confirm) { this.showVideoAd(); } } }); }, inputText(e){ this.data.text = e.detail.value; }, async play(){ const text = this.data.text || this.data.placeholder; const selectedType = this.data.typeList[this.data.selectedIndex]; const type = selectedType.desc; this.resetAudio(); audio = wx.createInnerAudioContext({useWebAudioImplement: true}); audio.autoplay = true; // 显示播放蒙层 this.setData({ isAudioPlaying: true, currentAudioText: text }); // 初始化蒙层组件的音频监听 setTimeout(() => { const overlayComponent = this.selectComponent('audio-overlay'); if (overlayComponent) { overlayComponent.initAudio(audio); } }, 100); // 检查是否播放过 const audioList = app.globalData.getAudioList(); let played = audioList.find(v => v.text === text && v.type === type); // 播放过,直接使用本地文件,无需检查合规性 if(played){ played.time = Date.now(); app.globalData.setAudioList('delete', played.path); app.globalData.setAudioList('add', played); // 播放失败要移除缓存内容 audio.onError(err => { app.globalData.setAudioList('delete', played.path); this.setData({ isAudioPlaying: false }); wx.showModal({ title: '提示', content: '该语音播放过但缓存失效,点击确定重新播放', showCancel: false, success: res => { this.play(); } }); }); return audio.src = played.path; } // 未播放过,先检查文本是否合规 wx.showLoading({ title: '正在合成语音...', mask: true }); const result = await new Promise((resolve, reject) => { app.request({ url: `${app.globalData.domain}/open-api/mp/msg-sec-check`, data: { appid: 'wx330e54aa6000516d', content: text, openid: wx.getStorageSync('openid') }, success(res){ resolve(JSON.parse(res.data?.data)?.result); }, fail(err){ reject(err); } }); }); // 不合规结束 if(result.suggest !== 'pass'){ wx.hideLoading(); this.setData({ isAudioPlaying: false }); return wx.showToast({ title: '内容不合规', icon: 'error', mask: true, duration: 2000 }); } // 未播放过,调用TTS接口生成语音 try { const url = await selectedType.createUrl(text); // 下载并播放 wx.downloadFile({ url, success (res) { wx.hideLoading(); audio.src = res.tempFilePath; app.globalData.setAudioList('add', { // 音频文本 text, // 音频音效 type, // 音频网络地址 url, // 音频本地地址 path: res.tempFilePath, // 音频创建时间 time: Date.now() }); }, fail(err) { console.log(err); wx.hideLoading(); this.setData({ isAudioPlaying: false }); wx.showToast({ title: '下载失败', icon: 'none' }); } }); } catch (error) { wx.hideLoading(); this.setData({ isAudioPlaying: false }); // TTS接口调用失败的错误已经在app.js中处理了 } }, clear(){ this.resetAudio(); this.setData({ text: '' }); }, resetAudio(){ if(audio){ audio.destroy(); audio = null; } this.setData({ isAudioPlaying: false, currentAudioText: '' }); }, // 音频停止播放的回调 onAudioStop() { this.resetAudio(); }, selectIndex(e){ const { index } = e.target.dataset; this.setData({ selectedIndex: index }, () => { this.play(); }); app.globalData.setSelectedTypeIndex(index); }, gotoAudioList(){ wx.navigateTo({ url: '/pages/result/result' }); } });