微信小程序,將文字轉換爲語音後,使用音頻進行播放。在安卓手機下能夠正常播放,在IOS下不行。javascript
微信小程序庫版本2.3.0
百度語音合成服務java
正確代碼:小程序
//建立一個音頻實例 const myaudio = wx.createInnerAudioContext(); //設置obeyMuteSwitch: false(不遵循系統靜音開關,即便用戶打開了靜音開關,也能繼續發出聲音) //設置autoplay: true(自動開始播放) if (wx.setInnerAudioOption) { wx.setInnerAudioOption({ obeyMuteSwitch: false, autoplay: true }) }else { myaudio.obeyMuteSwitch = false; myaudio.autoplay = true; } //監聽各個階段 myaudio.onCanplay(() => { console.log('能夠播放'); }); myaudio.onPlay(() => { console.log('監聽到音頻開始播放'); }); myaudio.onEnded(() => { console.log('音頻天然播放結束事件'); }); myaudio.onStop(() => { console.log('音頻中止事件'); }); myaudio.onError((res) => { console.log(res.errMsg); console.log(res.errCode); }); myaudio.onWaiting((res) => { console.log('音頻加載中事件,當音頻由於數據不足,須要停下來加載時會觸發') }); //設置播放連接 myaudio.src = 'https://tsn.baidu.com/text2audio?lan=zh&ctp=1&cuid=abcdxxx&tok=24.b63*************************************.1543030920.282335-11522973&tex=' + encodeURIComponent(encodeURIComponent('哈哈哈哈哈哈哈哈哈')) + '&vol=5&per=0&spd=5&pit=5&aue=324.b6306a3dff68e153a0d5656b3a78bd5e.2592000.1543030920.282335-11522973'; //播放 myaudio.play();
這樣,在安卓和IOS下均可以正常播放了。微信小程序
爲何老是播放不了?注意下面兩點:跨域
一、這個播放連接返回的必須是格式正確的音頻文件瀏覽器
因此若是換一個連接就能播放了,那可能就說明你原來的連接返回了錯誤的音頻格式。微信
本來個人播放連接是:ui
myaudio.src = 'https://tts.baidu.com/text2audio?lan=zh&ie=UTF-8&spd=5&text=' + encodeURIComponent('哈哈哈哈哈哈哈哈哈');
這個tts.baidu.com和tsn.baidu.com長得很是像,爲何一開始用的不是tsn?是由於在網上搜索到的好多案例都是用的tts,並且tsn須要token參數,這個參數要麼須要從百度AI開放平臺手動獲取,要麼須要調用獲取token的接口,而這個接口又不支持瀏覽器跨域,所以須要從服務端獲取token或者每隔30天手動輸入更新,我嫌麻煩,因此一開始先用了tts。編碼
tts在安卓下確實能夠正常播放,能夠看到Console中依次打印出了:3d
監聽到音頻開始播放 音頻加載中事件,當音頻由於數據不足,須要停下來加載時會觸發 能夠播放 音頻天然播放結束事件
可是在IOS下就沒法播放了,Console中依次打印出了:
音頻加載中事件,當音頻由於數據不足,須要停下來加載時會觸發 INNERERRCODE:-11850, ERRMSG:操做中止 10002
根據官方的說法,應該是由於返回的音頻格式IOS不支持。(https://developers.weixin.qq....)若是返回的音頻格式正確,是能夠正常播放的。
ps:後來查了一下發現tts這個接口應該只是他們內部demo地址,因此仍是使用正式的tsn吧。
二、須要對tsn接口的文本字符串參數進行編碼
好比: encodeURIComponent(encodeURIComponent('哈哈哈哈哈哈哈哈哈'));
沒有作編碼,直接上文本的,也會出現安卓行IOS不行的狀況。