index.js 3.59 KB
//index.js
//获取应用实例
const app = getApp();
const selectedIndex = app.globalData.getSelectedTypeIndex();
const typeList = app.globalData.getTypeList();

let audio = null;

Page({
    data: {
        placeholder: '点击此处输入文字',
        text: '',
        typeList,
        selectedIndex: String(selectedIndex) ? selectedIndex : 5
    },
    onLoad(){
        wx.showShareMenu();
    },
    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 url = selectedType.createUrl(text);
        const type = selectedType.desc;

        wx.showLoading({
            title: '正在合成语音...',
            mask: true
        });
        // 检查文本是否合规
        const result = await new Promise((resolve, reject) => {
            app.request({
                url: `${app.globalData.domain}/open-api/wechat-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);
                }
            });
        });
        wx.hideLoading();
        // 不合规结束
        if(result.suggest !== 'pass'){
            return wx.showToast({
                title: '内容不合规',
                icon: 'error',
                mask: true,
                duration: 2000
            });
        }
        
        this.resetAudio();
        audio = wx.createInnerAudioContext({useWebAudioImplement: true});
        audio.autoplay = true;
        // 检查是否播放过  
        const audioList = app.globalData.getAudioList();
        const played = audioList.find(v => v.url === url);
        // 播放失败要移除缓存内容
        audio.onError(err => {
            if(err.errCode){
                app.globalData.setAudioList('delete', played.path);
            }
        });
        // 播放过,使用本地文件减少请求,且从播放列表中移到最前  
        if(played){
            app.globalData.setAudioList('delete', played.path);
            app.globalData.setAudioList('add', played);
            return audio.src = played.path;
        }
        // 未播放过,先下载再播放  
        wx.downloadFile({
            url,
            success (res) {
                audio.src = res.tempFilePath;
                app.globalData.setAudioList('add', {
                    // 音频文本  
                    text,
                    // 音频音效  
                    type,
                    // 音频网络地址  
                    url,
                    // 音频本地地址  
                    path: res.tempFilePath,
                    // 音频创建时间  
                    time: Date.now()
                });
            }
        });
    },
    clear(){
        this.resetAudio();
        this.setData({
            text: ''
        });
    },
    resetAudio(){
        if(audio){
            audio.destroy();
            audio = null;
        }
    },
    selectIndex(e){
        const { index } = e.target.dataset;
        this.setData({
            selectedIndex: index
        }, () => {
            this.play();
        });
        app.globalData.setSelectedTypeIndex(index);
    },
    gotoAudioList(){
        wx.navigateTo({
            url: '/pages/result/result'
        });
    }
});