7 changed files with 320 additions and 17 deletions
Binary file not shown.
Binary file not shown.
@ -0,0 +1,247 @@ |
|||
// 心跳间隔
|
|||
const HEART_BEAT_TIME = 15000; |
|||
// 心跳最大失败次数(超过此次数重连)
|
|||
const HEART_BEAT_FAIL_NUM = 1; |
|||
// 重连间隔
|
|||
const RECONNECT_TIME = 3000; |
|||
|
|||
import { generateRequestId1 } from "./util"; |
|||
|
|||
export default class Audio { |
|||
constructor(option) { |
|||
this._options = option; |
|||
this.socket = null; |
|||
this.session_id = null; |
|||
this.selfCloseStatus = false |
|||
this.connectSocketTimeOut = null |
|||
|
|||
this.appkey = 'hi93syrOZPxi7AZr'; |
|||
this.token = '66df6ddcb4b643f08450cdf77d3de768'; |
|||
} |
|||
getToken() { |
|||
return new Promise((resolve, reject) => { |
|||
console.log("-----开始请求token-----"); |
|||
uni.request({ |
|||
method: "GET", |
|||
dataType: "json", |
|||
// url: `http://192.168.124.118:8083/xcx/framework/agent/${this._options.agentId}`,
|
|||
url: `https://des.js-dyyj.com/getDemoToken?id=${this._options.agentId}`, |
|||
success: (res) => { |
|||
console.log("请求token成功", res); |
|||
resolve(res); |
|||
}, |
|||
fail: (err) => { |
|||
wx.showToast({ |
|||
title: "创建失败", |
|||
icon: "none", |
|||
}); |
|||
console.log("请求token失败", err); |
|||
reject(); |
|||
}, |
|||
}); |
|||
}); |
|||
} |
|||
async init() { |
|||
return this.createSocket(); |
|||
} |
|||
async createSocket(options) { |
|||
console.log("开始创建socket", options); |
|||
return new Promise(async (resolve, reject) => { |
|||
const origin = `wss://nls-gateway-cn-beijing.aliyuncs.com/ws/v1?token=${this.token}`; |
|||
// 建立连接
|
|||
const socket = wx.connectSocket({ |
|||
url: `${origin}`, |
|||
binaryType: 'arraybuffer', |
|||
success: (e) => { |
|||
console.log("创建语音长链接成功", e); |
|||
}, |
|||
complete: (e) => { |
|||
console.log("socket - complete", e); |
|||
}, |
|||
}); |
|||
this.socket = socket; |
|||
|
|||
socket.onOpen((e) => { |
|||
console.log("socket.onOpen", e); |
|||
// 监听发送
|
|||
options && options.complete && options.complete(); |
|||
|
|||
const socketParams = { |
|||
header: { |
|||
name: 'StartSynthesis', |
|||
appkey: this.appkey, |
|||
message_id: '1c17d4f8e7894a20aecb9f774b54ba06', //generateRequestId1(),
|
|||
task_id: '1c17d4f8e7894a20aecb9f774b54ba06',//generateRequestId1(),
|
|||
namespace: 'FlowingSpeechSynthesizer' |
|||
}, |
|||
payload: { |
|||
voice: 'xiaoyun', |
|||
format: 'pcm', |
|||
sample_rate: 16000 |
|||
} |
|||
}; |
|||
this.send({ data: JSON.stringify(socketParams) }, 'txt'); |
|||
}); |
|||
|
|||
socket.onMessage((e) => { |
|||
const { data } = e; |
|||
|
|||
if (data instanceof ArrayBuffer) { |
|||
this._options.onMessage && this._options.onMessage(data); |
|||
} else { |
|||
if ( Object.prototype.toString.call(data) === "[object String]" ) { |
|||
const tmp = JSON.parse(data); |
|||
if (Object.prototype.toString.call(tmp.type) === "[object Number]") { |
|||
this._options.onMessage && this._options.onMessage(tmp); |
|||
} else { |
|||
if (!this.session_id) { |
|||
this.session_id = tmp.data |
|||
} |
|||
} |
|||
} |
|||
} |
|||
// this.on(type, e);
|
|||
this.createInter(); |
|||
resolve(); |
|||
}); |
|||
// 失败
|
|||
socket.onError((e) => { |
|||
console.log("websocket error 创建语音长链接报错", e); |
|||
//
|
|||
}); |
|||
// 关闭
|
|||
socket.onClose((e) => { |
|||
console.log("websocket close 语音长链接关闭", e); |
|||
this.connectSocketTimeOut && clearTimeout(this.connectSocketTimeOut); |
|||
//非自动关闭重连
|
|||
if (e.code != 1000) { |
|||
this.doConnectTimeout(); |
|||
} |
|||
}); |
|||
}); |
|||
} |
|||
|
|||
doConnectTimeout() { |
|||
if (this.selfCloseStatus){ |
|||
// 主动退出 不在重连
|
|||
return |
|||
} |
|||
// 重连一次
|
|||
console.log("websocket 异常关闭 开始重连"); |
|||
this.connectSocketTimeOut = setTimeout(() => { |
|||
this.createSocket({ |
|||
complete: function (res) { |
|||
// this.reconnectLock = false;
|
|||
}, |
|||
}); |
|||
}, RECONNECT_TIME); |
|||
} |
|||
|
|||
send(e, t) { |
|||
console.log("开始请求 websocket send", e); |
|||
this.socket && this.socket.send(e); |
|||
} |
|||
|
|||
getMsgData(e) { |
|||
if (e && typeof e == "string") { |
|||
const status = e.indexOf("42"); |
|||
const index = e.indexOf("["); |
|||
if (status > -1 && index > -1) { |
|||
const txt = e.substring(index); |
|||
const item = JSON.parse(txt); |
|||
const [type, obj] = item; |
|||
const payload = obj.payload ? obj.payload : {}; |
|||
const params = { |
|||
chatId: this._options.agentId, |
|||
type, |
|||
contentType: "text", //默认文字
|
|||
timestamp: new Date().getTime(), |
|||
...payload, |
|||
}; |
|||
// 缓存聊天记录
|
|||
return params; |
|||
} |
|||
} |
|||
return null; |
|||
} |
|||
|
|||
emit(type, text, contentType) { |
|||
console.log("emit", type, text, generateRequestId1()); |
|||
switch (type) { |
|||
case "send": |
|||
// 发送消息
|
|||
// 发送消息
|
|||
// const socketParams = {
|
|||
// request_id: generateRequestId1()
|
|||
// };
|
|||
const socketParams = { |
|||
header: { |
|||
name: 'RunSynthesis', |
|||
appkey: this.appkey, |
|||
namespace: 'FlowingSpeechSynthesizer', |
|||
message_id: '1c17d4f8e7894a20aecb9f774b54ba06', |
|||
task_id: '1c17d4f8e7894a20aecb9f774b54ba06', // generateRequestId1(),
|
|||
}, |
|||
payload: { |
|||
text: text |
|||
} |
|||
// action: "ACTION_SYNTHESIS",
|
|||
// data: text,
|
|||
}; |
|||
this.send({ data: JSON.stringify(socketParams) }, contentType); |
|||
break; |
|||
} |
|||
} |
|||
// 监听
|
|||
on(type, params) { |
|||
switch (type) { |
|||
case "reply": |
|||
// 回复结束
|
|||
const tmpParams = { |
|||
...params, |
|||
name: this.robotObj.name, |
|||
headImage: this.robotObj.headImage, |
|||
}; |
|||
if ( |
|||
params && |
|||
params.type === "reply" && |
|||
!params.is_from_self && |
|||
params.can_rating |
|||
) { |
|||
// 回复消息
|
|||
console.log("reply回复内容", tmpParams.content, tmpParams); |
|||
this._options.onMessage && this._options.onMessage(tmpParams); |
|||
} |
|||
|
|||
if (!params.is_from_self && params.is_final) { |
|||
if (this.failMsg[tmpParams.request_id]) { |
|||
this.failMsg[tmpParams.request_id].status = true; |
|||
// 已回复 状态为true
|
|||
} |
|||
|
|||
// 回复结束 写入缓存
|
|||
// setMsgData(tmpParams);
|
|||
} |
|||
// 回复
|
|||
break; |
|||
} |
|||
} |
|||
|
|||
createInter() { |
|||
if (this.timeoutObj) { |
|||
clearTimeout(this.timeoutObj); |
|||
} |
|||
this.timeoutObj = setTimeout(() => { |
|||
console.log(111111, this.socket) |
|||
this.socket && this.socket.send && this.socket.send({ data: 3 }); |
|||
}, HEART_BEAT_TIME); |
|||
} |
|||
|
|||
// 关闭socket
|
|||
destroy() { |
|||
if (this.socket && this.socket.readyState == 1) { |
|||
this.socket && this.socket.close(); |
|||
this.socket = null; |
|||
} |
|||
} |
|||
} |
Loading…
Reference in new issue