Files
Hfive/js_sdk/QuShe-baiduYY/QS-baiduyy/QS-baiduyy.js
魏啾 56863dd624 H5
2024-04-30 18:07:59 +08:00

232 lines
6.8 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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();
}