wujingjing
2025-04-09 dd58c1d3a27ba48a5df050aab7c586bb9b988914
src/components/chat/components/playBar/hook/useDigitalHuman.ts
@@ -1,10 +1,12 @@
import { nextTick, onDeactivated, onMounted, ref } from 'vue';
import { SignJWT } from 'jose';
import { nextTick, onDeactivated, onMounted, ref } from 'vue';
import { markdownToTxt } from 'markdown-to-txt';
import './libs/duix.js';
import { questionStreamByPost } from '/@/api/ai/chat';
import { activeGroupType, activeRoomId } from '/@/stores/chatRoom';
import { markdownToTxt } from 'markdown-to-txt';
import axios from 'axios';
import { ElMessage } from 'element-plus';
export type UseDigitalHumanProps = {
   container: string;
@@ -29,6 +31,32 @@
   const closeDigitalHuman = () => {
      digitalHumanIsShow.value = false;
      resetDuixStatus();
   };
   /**
    * 检查数字人是否可用
    */
   const checkIsUseable = async () => {
      const config = {
         method: 'get',
         url: `https://duix.guiji.ai/duix-openapi-v2/v1/getconcurrentNumber?appId=${duixConfig.appId}`,
         headers: {
            priority: 'u=1, i',
            sig: duixConfig.sign,
         },
      };
      const response = await axios(config);
      const data = response.data.data;
      const total = data.totalConcurrentNumber;
      const user = data.userConcurrentNumber;
      if (total === null || total === 0) {
         return false;
      }
      if (total !== null && total === user) {
         return false;
      }
      return true;
   };
   const resetDuixStatus = () => {
@@ -69,15 +97,18 @@
      });
   };
   const startDuix = () =>{
   const startDuix = () => {
      const conversationId = duixConfig.conversationId; // duix平台会话id
      duix.start({ conversationId, openAsr: true,wipeGreen:true }).then((res) => {
         console.info('start', res);
      }).catch((err)=>{
         console.error('start error', err);
      });
   }
      duix
         .start({ conversationId, openAsr: true, wipeGreen: true })
         .then((res) => {
            console.info('start', res);
         })
         .catch((err) => {
            console.error('start error', err);
         });
   };
   const initDuix = () => {
      const sign = duixConfig.sign; // sign由服务端生成
@@ -118,8 +149,7 @@
      duix.on('speakEnd', (data) => {
         if (!isWaitingSpeak) {
            isReceiveRes.value = false;
            duix.openAsr().then((...a) => {
            });
            duix.openAsr().then((...a) => {});
         }
      });
      duix.on('speakSection', (data) => {
@@ -133,8 +163,7 @@
         if (isReceiveRes.value) {
            return;
         }
         duix.closeAsr().then((...a) => {
         });
         duix.closeAsr().then((...a) => {});
         let hasResult = false;
         isReceiveRes.value = true;
@@ -192,11 +221,16 @@
   let hasInitDuix = false;
   let duix: any;
   const openDigitalHuman = () => {
   const openDigitalHuman = async () => {
      duixConfig.sign = await createSig(duixConfig.appId, duixConfig.appKey, 60 * 60 * duixConfig.expired);
      const isUsable = await checkIsUseable();
      if (!isUsable) {
         ElMessage.warning('"资源占用中,请检查后再试~"');
         return;
      }
      digitalHumanIsShow.value = true;
      nextTick(async () => {
         duixConfig.sign = await createSig(duixConfig.appId, duixConfig.appKey, 60 * 60 * duixConfig.expired);
      nextTick(() => {
         if (!hasInitDuix) {
            hasInitDuix = true;