232 lines
6.8 KiB
JavaScript
232 lines
6.8 KiB
JavaScript
const audioTeam = [];
|
||
let audioStartSwitch = false;
|
||
const getAudioUrl = 'https://tsn.baidu.com/text2audio';
|
||
// #ifdef H5
|
||
const apiUrl = '/baidu';
|
||
// #endif
|
||
// #ifdef APP
|
||
const apiUrl = "https://aip.baidubce.com/oauth/2.0/token"; // 非真实,需要替换为自己的
|
||
// #endif
|
||
const BaiduApi = {
|
||
apiKey: "aHTUGGITOdNwBYjAIjyqWCPv", // 非真实key,需要替换为自己的
|
||
secKey: "AsXCAZMyG0r6GLRUa0Gof2GGTCDSBxVt" // 非真实secKey,需要替换为自己的
|
||
}
|
||
/**
|
||
* 浏览器调用语音合成接口
|
||
* 请参考 https://ai.baidu.com/docs#/TTS-API/41ac79a6
|
||
* 强烈建议后端访问接口获取token返回给前端
|
||
* client_id = API Key & client_secret = secret Key
|
||
*/
|
||
|
||
function getBDVoicToken() {
|
||
return new Promise((rs, rj) => {
|
||
uni.request({ // 强烈建议此接口由后端访问并且维护token有效期,否则前端每次访问都会刷新token
|
||
//此url为专门插件测试预览用的key和secret key, 请替换为自己申请的key
|
||
url: apiUrl,
|
||
method: 'POST', //建议使用post访问
|
||
data: 'grant_type=client_credentials&client_id=aHTUGGITOdNwBYjAIjyqWCPv&client_secret=AsXCAZMyG0r6GLRUa0Gof2GGTCDSBxVt',
|
||
// data: {
|
||
// grant_type: client_credentials,
|
||
// client_id: BaiduApi.apiKey,
|
||
// client_secret: BaiduApi.secKey
|
||
// },
|
||
header: {
|
||
'Content-Type': 'application/x-www-form-urlencoded',
|
||
},
|
||
success: (res) => {
|
||
console.log('访问成功');
|
||
rs(res);
|
||
},
|
||
fail: (err) => {
|
||
console.log('访问失败');
|
||
rj(err);
|
||
}
|
||
})
|
||
})
|
||
}
|
||
|
||
export default function openVoice(objs) { // 传入需转为语音的文本内容
|
||
console.log(objs)
|
||
let lineUp = false;
|
||
let returnAudio = false;
|
||
if (typeof(objs) !== 'string') {
|
||
if (objs && objs.lineUp === true) {
|
||
lineUp = true;
|
||
}
|
||
if (objs && objs.returnAudio === true) {
|
||
returnAudio = true;
|
||
}
|
||
}
|
||
if (returnAudio) {
|
||
console.log(returnAudio,objs)
|
||
return new Promise((resolve, reject) => {
|
||
openVoiceFc(objs, returnAudio).then(res => {
|
||
resolve(res);
|
||
}).catch(err => {
|
||
reject(err)
|
||
});
|
||
})
|
||
}
|
||
|
||
|
||
if (lineUp = true) {
|
||
audioTeam.push(objs);
|
||
}
|
||
console.log(audioTeam);
|
||
if (!audioStartSwitch) {
|
||
audioStartSwitch = true;
|
||
openVoiceFc(objs);
|
||
}
|
||
}
|
||
|
||
function openVoiceFc(objs, returnAudio) {
|
||
console.log('准备获取语音tok', objs, returnAudio);
|
||
if (returnAudio) {
|
||
return new Promise((resolve, reject) => {
|
||
getBDVoicToken().then(res => {
|
||
console.log('获取语音tok接口成功', res);
|
||
if (res.data && res.data.access_token) {
|
||
console.log('token: ' + res.data.access_token);
|
||
resolve(tts(objs, res.data.access_token, returnAudio));
|
||
} else {
|
||
console.log('获取语音tok接口为空');
|
||
reject('获取语音tok接口为空');
|
||
}
|
||
}).catch(err => {
|
||
console.log('获取语音tok接口失败');
|
||
reject(err || '获取语音tok接口失败');
|
||
})
|
||
})
|
||
} else {
|
||
getBDVoicToken().then(res => {
|
||
console.log('获取语音tok接口成功', res);
|
||
if (res.data && res.data.access_token) {
|
||
console.log('token: ' + res.data.access_token);
|
||
tts(objs, res.data.access_token);
|
||
} else {
|
||
console.log('获取语音tok接口为空');
|
||
}
|
||
}).catch(err => {
|
||
console.log('获取语音tok接口失败');
|
||
})
|
||
}
|
||
}
|
||
|
||
function tts(objs, tok, returnAudio) {
|
||
if (typeof(objs) == 'string')
|
||
objs = {
|
||
voiceSet: {
|
||
tex: objs
|
||
}
|
||
};
|
||
const data = {
|
||
tok,
|
||
cuid: tok,
|
||
ctp: 1,
|
||
lan: 'zh',
|
||
...objs.voiceSet
|
||
}
|
||
if (returnAudio)
|
||
return btts(data, objs.audioSet, objs.audioCallback, objs.lineUp, returnAudio);
|
||
btts(data, objs.audioSet, objs.audioCallback, objs.lineUp, returnAudio);
|
||
}
|
||
|
||
function setAudioSet(options, audio) {
|
||
if (options) {
|
||
audio.volume = options.volume || 1;
|
||
audio.startTime = options.startTime || 0;
|
||
audio.loop = options.loop || false;
|
||
// #ifdef MP-WEIXIN || MP-BAIDU || MP-TOUTIAO
|
||
audio.obeyMuteSwitch = options.obeyMuteSwitch && typeof(options.obeyMuteSwitch) == 'boolean' ? options
|
||
.obeyMuteSwitch :
|
||
true; //支持微信小程序、百度小程序、头条小程序
|
||
// #endif
|
||
}
|
||
}
|
||
|
||
function btts(param, options, audioCallback, lineUp, returnAudio) {
|
||
let audio = uni.createInnerAudioContext();
|
||
setAudioSet(options, audio);
|
||
console.log(param, options, audioCallback, lineUp, returnAudio)
|
||
// 序列化参数列表
|
||
let fd = [];
|
||
for (let k in param) {
|
||
fd.push(k + '=' + encodeURIComponent(encodeURIComponent(param[k])));
|
||
}
|
||
audio.src = `${getAudioUrl}?${fd.join('&')}`;
|
||
console.log(audio, returnAudio, 11111,`${getAudioUrl}?${fd.join('&')}`)
|
||
if (returnAudio) {
|
||
audio.onEnded(() => {
|
||
console.log('音频播放结束');
|
||
console.log('销毁音频实例');
|
||
audio.destroy(); //销毁音频实例
|
||
audio = null;
|
||
})
|
||
audio.onError((e) => {
|
||
if (audioCallback && audioCallback.onError && typeof(audioCallback.onError) == 'function')
|
||
audioCallback.onError(e);
|
||
console.log('音频播放错误: ' + JSON.stringify(e));
|
||
console.log('销毁音频实例');
|
||
audio.destroy(); //销毁音频实例
|
||
audio = null;
|
||
})
|
||
return audio;
|
||
}
|
||
audio.onPlay(() => {
|
||
console.log('音频播放开始');
|
||
if (audioCallback && audioCallback.onPlay && typeof(audioCallback.onPlay) == 'function') audioCallback
|
||
.onPlay();
|
||
})
|
||
audio.onPause(() => {
|
||
if (audioCallback && audioCallback.onPause && typeof(audioCallback.onPause) == 'function') audioCallback
|
||
.onPause();
|
||
})
|
||
audio.onWaiting(() => {
|
||
if (audioCallback && audioCallback.onWaiting && typeof(audioCallback.onWaiting) == 'function')
|
||
audioCallback.onWaiting();
|
||
})
|
||
audio.onStop(() => {
|
||
if (audioCallback && audioCallback.onStop && typeof(audioCallback.onStop) == 'function') audioCallback
|
||
.onStop();
|
||
})
|
||
audio.onTimeUpdate(() => {
|
||
if (audioCallback && audioCallback.onTimeUpdate && typeof(audioCallback.onTimeUpdate) == 'function')
|
||
audioCallback.onTimeUpdate();
|
||
})
|
||
audio.onSeeking(() => {
|
||
if (audioCallback && audioCallback.onSeeking && typeof(audioCallback.onSeeking) == 'function')
|
||
audioCallback.onSeeking();
|
||
})
|
||
audio.onSeeked(() => {
|
||
if (audioCallback && audioCallback.onSeeked && typeof(audioCallback.onSeeked) == 'function')
|
||
audioCallback.onSeeked();
|
||
})
|
||
audio.onEnded(() => {
|
||
console.log('音频播放结束');
|
||
console.log('销毁音频实例');
|
||
audio.destroy(); //销毁音频实例
|
||
audio = null;
|
||
if (audioCallback && audioCallback.onEnded && typeof(audioCallback.onEnded) == 'function') audioCallback
|
||
.onEnded();
|
||
|
||
if (lineUp !== false) { // 删除已经播放对象
|
||
audioTeam.splice(0, 1);
|
||
if (audioTeam.length > 0) {
|
||
console.log('队列中');
|
||
openVoiceFc(audioTeam[0]);
|
||
} else {
|
||
console.log('队列为零');
|
||
audioStartSwitch = false;
|
||
}
|
||
}
|
||
})
|
||
audio.onError((e) => {
|
||
if (audioCallback && audioCallback.onError && typeof(audioCallback.onError) == 'function') audioCallback
|
||
.onError(e);
|
||
console.log('音频播放错误: ' + JSON.stringify(e));
|
||
console.log('销毁音频实例');
|
||
audio.destroy(); //销毁音频实例
|
||
audio = null;
|
||
})
|
||
audio.play();
|
||
} |