UNPKG

esp-ai

Version:

Provide a complete set of AI dialogue solutions for your development board, including but not limited to the IAT+LLM+TTS integration solution for the ESP32 series development board. | 为你的开发板提供全套的AI对话方案,包括但不限于 `ESP32` 系列开发板的 `IAT+LLM+TTS` 集成方案。

117 lines (107 loc) 4.04 kB
/** * Copyright (c) 2024 小明IO * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * Commercial use of this software requires prior written authorization from the Licensor. * 请注意:将 ESP-AI 代码用于商业用途需要事先获得许可方的授权。 * 删除与修改版权属于侵权行为,请尊重作者版权,避免产生不必要的纠纷。 * * @author 小明IO * @email 1746809408@qq.com * @github https://github.com/wangzongming/esp-ai * @websit https://espai.fun */ /** * 开始会话 */ const { t_info, error } = require("../../utils/log"); const isOutTimeErr = require("../../utils/isOutTimeErr"); async function fn({ device_id, _ws }) { try { const IAT_FN = require(`../iat`); if (!G_devices.get(device_id)) { error(`[${device_id}] start 消息错误: 设备未连接, 将忽略本次唤醒。`); _ws && _ws.close(); return; }; const { auth } = G_config; const { ws, client_params } = G_devices.get(device_id); if (auth && client_params) { const { success: auth_success, message: auth_message, code: auth_code } = await auth({ ws, client_params: client_params, type: "start_session", send_error_to_client: (code, message) => { ws.send(JSON.stringify({ type: "error", message: message, code: code })); } }); if (!auth_success) { ws.send(JSON.stringify({ type: "auth_fail", message: `${auth_message || "-"}`, code: isOutTimeErr(auth_message) ? "007" : auth_code, })); // 防止大量失效用户重复请求 setTimeout(() => { ws.close(); }, 5000) return; }; } if (!client_params) { ws.send(JSON.stringify({ type: "auth_fail", message: `未知错误`, code: "003" })); // 防止大量失效用户重复请求 setTimeout(() => { ws.close(); }, 5000) return; } const start_iat = async (connect_cb) => { if (!G_devices.get(device_id)) return; await G_Instance.stop(device_id, "打断会话时"); await G_Instance.newSession(device_id); G_devices.set(device_id, { ...G_devices.get(device_id), started: true, backlog_instruction: [], // 异步停止下一次会话 stop_next_session: false, // 重置可用流 client_out_audio_ing: 0, abort_controllers: [], }) return IAT_FN(device_id, connect_cb); }; if (!G_devices.get(device_id)) return; G_devices.set(device_id, { ...G_devices.get(device_id), started: true, start_iat, }) // 应该直接去连接 iat 服务 start_iat(); } catch (err) { console.log(err); error(`[${device_id}] start 消息错误: ${err}`) } } module.exports = fn