@tencentcloud/roomkit-electron-vue3 2.7.0 → 2.7.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/es/components/AITools/AISubtitles.vue.mjs +1 -1
- package/es/components/AITools/AISubtitles.vue2.mjs +18 -19
- package/es/components/AITools/AITranscription.vue.mjs +1 -1
- package/es/components/AITools/AITranscription.vue2.mjs +65 -76
- package/es/components/Chat/ChatEditor/index.vue2.mjs +1 -1
- package/es/components/Chat/ChatKit/components/TUIChat/chat-header/index.vue2.mjs +1 -1
- package/es/components/Chat/ChatKit/components/TUIChat/emoji-config/default-emoji.mjs +4 -4
- package/es/components/Chat/ChatKit/components/TUIChat/emoji-config/index.mjs +1 -1
- package/es/components/Chat/ChatKit/components/TUIChat/index.vue2.mjs +1 -1
- package/es/components/Chat/ChatKit/components/TUIChat/message-input/message-input-quote/index.vue2.mjs +1 -1
- package/es/components/Chat/ChatKit/components/TUIChat/message-input-toolbar/emoji-picker/emoji-picker-dialog.vue2.mjs +1 -1
- package/es/components/Chat/ChatKit/components/TUIChat/message-input-toolbar/image-upload/index.vue2.mjs +1 -1
- package/es/components/Chat/ChatKit/components/TUIChat/message-input-toolbar/video-upload/index.vue2.mjs +1 -1
- package/es/components/Chat/ChatKit/components/TUIChat/message-list/index.vue2.mjs +2 -2
- package/es/components/Chat/ChatKit/components/TUIChat/message-list/message-elements/message-audio.vue2.mjs +1 -1
- package/es/components/Chat/ChatKit/components/TUIChat/message-list/message-elements/message-record/index.vue2.mjs +1 -1
- package/es/components/Chat/ChatKit/components/TUIChat/message-list/message-group-application/index.vue2.mjs +2 -2
- package/es/components/Chat/ChatKit/components/TUIChat/offlinePushInfoManager/offlinePushInfoManager.mjs +1 -1
- package/es/components/Chat/ChatKit/components/TUIChat/utils/sendMessage.mjs +1 -1
- package/es/components/Chat/ChatKit/components/common/BottomPopup/index.vue2.mjs +1 -1
- package/es/components/Chat/ChatKit/components/common/Dialog/index.vue2.mjs +1 -1
- package/es/components/Chat/ChatKit/components/common/Drawer/index.vue2.mjs +1 -1
- package/es/components/Chat/ChatKit/components/common/Icon.vue2.mjs +1 -1
- package/es/components/Chat/ChatKit/components/common/Overlay/index.vue2.mjs +1 -1
- package/es/components/Chat/ChatKit/components/common/Toast/index.mjs +1 -1
- package/es/components/Chat/ChatKit/components/common/Toast/index.vue2.mjs +1 -1
- package/es/components/Chat/ChatKit/components/common/Transfer/index.vue2.mjs +1 -1
- package/es/components/Chat/ChatKit/locales/index.mjs +4 -4
- package/es/components/Chat/ChatKit/plugins/plugin-components/message-plugin.vue2.mjs +1 -1
- package/es/components/ManageMember/MemberControl/index.vue.mjs +1 -1
- package/es/components/ManageMember/MemberControl/index.vue2.mjs +6 -4
- package/es/components/ManageMember/MemberControl/useMemberControlHooks.mjs +1 -1
- package/es/components/ManageMember/MemberItemCommon/MemberInfo.vue.mjs +1 -1
- package/es/components/ManageMember/index.vue2.mjs +1 -1
- package/es/components/PreRoom/PasswordDialog.vue2.mjs +1 -1
- package/es/components/RoomContent/StreamRegion/StreamPlay/index.vue2.mjs +1 -1
- package/es/components/RoomFooter/ApplyControl/MasterApplyControl/index.vue2.mjs +1 -1
- package/es/components/RoomFooter/ApplyControl/MemberApplyControl.vue2.mjs +1 -1
- package/es/components/RoomFooter/AudioControl.vue2.mjs +1 -1
- package/es/components/RoomFooter/BasicBeauty.vue.mjs +1 -1
- package/es/components/RoomFooter/BasicBeauty.vue2.mjs +5 -3
- package/es/components/RoomFooter/ChatControl.vue.mjs +2 -0
- package/es/components/RoomFooter/EndControl/index.vue2.mjs +1 -1
- package/es/components/RoomFooter/ScreenShareControl/Index.vue2.mjs +1 -1
- package/es/components/RoomFooter/ScreenShareControl/ScreenWindowSelectDialog.vue2.mjs +1 -1
- package/es/components/RoomFooter/VideoControl.vue2.mjs +2 -2
- package/es/components/RoomFooter/VirtualBackground.vue2.mjs +1 -1
- package/es/components/RoomFooter/WhiteboardControl.vue.mjs +1 -1
- package/es/components/RoomHeader/UserInfo/index.vue.mjs +1 -1
- package/es/components/RoomHeader/UserInfo/index.vue2.mjs +2 -1
- package/es/components/RoomHeader/index/LayoutControl.vue2.mjs +1 -1
- package/es/components/RoomHome/RoomControl/index.vue2.mjs +2 -2
- package/es/components/RoomInvite/InvitationNotification.vue2.mjs +1 -1
- package/es/components/RoomInvite/index.vue2.mjs +1 -1
- package/es/components/RoomSetting/index.vue2.mjs +1 -1
- package/es/components/ScheduleConference/Contacts.vue2.mjs +1 -1
- package/es/components/ScheduleConference/ScheduleConferencePanel/index.vue2.mjs +2 -2
- package/es/components/ScheduleConference/ScheduleRoomControl.vue2.mjs +2 -2
- package/es/components/ScheduleConference/ScheduleRoomList.vue2.mjs +1 -1
- package/es/components/ScheduleConference/ShareLink.vue2.mjs +1 -1
- package/es/components/common/VideoProfile.vue2.mjs +1 -1
- package/es/components/common/VideoSettingTab.vue2.mjs +2 -2
- package/es/components/common/base/Button.vue2.mjs +1 -1
- package/es/components/common/base/Dialog/index.vue2.mjs +1 -1
- package/es/components/common/base/Input/index.vue2.mjs +1 -1
- package/es/components/common/base/Message/Message.vue2.mjs +1 -1
- package/es/components/common/base/MessageBox/index.vue2.mjs +1 -1
- package/es/components/common/base/SvgIcon.vue2.mjs +1 -1
- package/es/constants/room.mjs +1 -3
- package/es/extension/RoomMessageCard/RoomMessageCard.vue2.mjs +1 -1
- package/es/extension/chatExtension.mjs +3 -6
- package/es/hooks/useDeviceManager.mjs +1 -1
- package/es/index.mjs +134 -126
- package/es/services/function/aiTask.d.ts +13 -17
- package/es/services/function/aiTask.mjs +63 -100
- package/es/services/manager/MediaManager.mjs +1 -1
- package/es/services/manager/dataReportManager.d.ts +4 -1
- package/es/services/manager/dataReportManager.mjs +3 -0
- package/es/services/manager/roomActionManager.mjs +1 -1
- package/es/services/roomService.mjs +1 -1
- package/es/stores/basic.mjs +1 -1
- package/es/stores/room.mjs +1 -4
- package/es/utils/common/logger/index.mjs +1 -1
- package/es/utils/utils.d.ts +2 -0
- package/es/utils/utils.mjs +33 -0
- package/lib/components/AITools/AISubtitles.vue.js +1 -1
- package/lib/components/AITools/AISubtitles.vue2.js +17 -18
- package/lib/components/AITools/AITranscription.vue.js +1 -1
- package/lib/components/AITools/AITranscription.vue2.js +64 -75
- package/lib/components/Chat/ChatKit/components/TUIChat/message-input/index.vue2.js +6 -6
- package/lib/components/Chat/ChatKit/components/TUIChat/message-list/index.vue2.js +8 -8
- package/lib/components/Chat/ChatKit/components/TUIChat/message-list/message-elements/message-quote/index.vue2.js +4 -4
- package/lib/components/Chat/ChatKit/components/TUIChat/message-list/message-tool/index.vue2.js +10 -10
- package/lib/components/Chat/ChatKit/locales/index.js +4 -4
- package/lib/components/ManageMember/MemberControl/index.vue.js +1 -1
- package/lib/components/ManageMember/MemberControl/index.vue2.js +5 -3
- package/lib/components/ManageMember/MemberItemCommon/MemberInfo.vue.js +1 -1
- package/lib/components/RoomContent/StreamContainer/index.vue2.js +6 -6
- package/lib/components/RoomFooter/AudioControl.vue2.js +4 -4
- package/lib/components/RoomFooter/BasicBeauty.vue.js +1 -1
- package/lib/components/RoomFooter/BasicBeauty.vue2.js +3 -1
- package/lib/components/RoomFooter/ChatControl.vue.js +2 -0
- package/lib/components/RoomFooter/ScreenShareControl/Index.vue2.js +5 -5
- package/lib/components/RoomFooter/VideoControl.vue2.js +4 -4
- package/lib/components/RoomHeader/UserInfo/index.vue.js +1 -1
- package/lib/components/RoomHeader/UserInfo/index.vue2.js +2 -1
- package/lib/components/ScheduleConference/ScheduleConferencePanel/index.vue2.js +1 -1
- package/lib/components/ScheduleConference/ScheduleRoomControl.vue2.js +1 -1
- package/lib/components/ScheduleConference/ScheduleRoomList.vue2.js +1 -1
- package/lib/conference.vue2.js +12 -12
- package/lib/constants/room.js +1 -3
- package/lib/extension/chatExtension.js +1 -4
- package/lib/hooks/useMasterApplyControl.js +9 -9
- package/lib/index.js +134 -126
- package/lib/preConference.vue2.js +7 -7
- package/lib/services/function/aiTask.d.ts +13 -17
- package/lib/services/function/aiTask.js +63 -100
- package/lib/services/manager/dataReportManager.d.ts +4 -1
- package/lib/services/manager/dataReportManager.js +3 -0
- package/lib/stores/room.js +0 -3
- package/lib/utils/utils.d.ts +2 -0
- package/lib/utils/utils.js +33 -0
- package/package.json +2 -2
- package/src/TUIRoom/components/AITools/AISubtitles.vue +26 -23
- package/src/TUIRoom/components/AITools/AITranscription.vue +106 -101
- package/src/TUIRoom/components/ManageMember/MemberControl/index.vue +8 -3
- package/src/TUIRoom/components/ManageMember/MemberItemCommon/MemberInfo.vue +1 -1
- package/src/TUIRoom/components/RoomFooter/BasicBeauty.vue +2 -1
- package/src/TUIRoom/components/RoomFooter/ChatControl.vue +2 -1
- package/src/TUIRoom/components/RoomHeader/UserInfo/index.vue +2 -5
- package/src/TUIRoom/services/function/aiTask.ts +79 -113
- package/src/TUIRoom/services/manager/dataReportManager.ts +3 -0
- package/src/TUIRoom/stores/room.ts +0 -3
- package/src/TUIRoom/utils/utils.ts +47 -0
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
|
|
3
3
|
const Vue = require("vue");
|
|
4
|
-
const index = require("./components/RoomHeader/UserInfo/index.vue.js");
|
|
5
|
-
const index$
|
|
4
|
+
const index$1 = require("./components/RoomHeader/UserInfo/index.vue.js");
|
|
5
|
+
const index$2 = require("./components/RoomHome/RoomControl/index.vue.js");
|
|
6
6
|
const Language_vue_vue_type_script_setup_true_lang = require("./components/common/Language.vue.js");
|
|
7
7
|
const SwitchTheme_vue_vue_type_script_setup_true_lang = require("./components/common/SwitchTheme.vue.js");
|
|
8
8
|
require("./services/main.js");
|
|
@@ -16,7 +16,7 @@ require("@tencentcloud/tui-core");
|
|
|
16
16
|
const environment = require("./utils/environment.js");
|
|
17
17
|
const ScheduleRoomList = require("./components/ScheduleConference/ScheduleRoomList.vue.js");
|
|
18
18
|
const Logo = require("./components/common/Logo.vue.js");
|
|
19
|
-
const index
|
|
19
|
+
const index = require("./components/common/base/MessageBox/index.js");
|
|
20
20
|
const Message = require("./components/common/base/Message/Message.js");
|
|
21
21
|
const InvitationNotification = require("./components/RoomInvite/InvitationNotification.vue.js");
|
|
22
22
|
const _hoisted_1 = { class: "header" };
|
|
@@ -75,7 +75,7 @@ const _sfc_main = /* @__PURE__ */ Vue.defineComponent({
|
|
|
75
75
|
callback = () => {
|
|
76
76
|
}
|
|
77
77
|
} = data;
|
|
78
|
-
index
|
|
78
|
+
index.default({
|
|
79
79
|
title,
|
|
80
80
|
message,
|
|
81
81
|
duration,
|
|
@@ -111,7 +111,7 @@ const _sfc_main = /* @__PURE__ */ Vue.defineComponent({
|
|
|
111
111
|
]),
|
|
112
112
|
Vue.createElementVNode("div", _hoisted_3, [
|
|
113
113
|
Vue.createVNode(Language_vue_vue_type_script_setup_true_lang.default, { class: "header-item language" }),
|
|
114
|
-
Vue.createVNode(index.default, {
|
|
114
|
+
Vue.createVNode(index$1.default, {
|
|
115
115
|
class: "header-item user-info",
|
|
116
116
|
"user-id": props.userInfo.userId,
|
|
117
117
|
"user-name": props.userInfo.userName,
|
|
@@ -122,7 +122,7 @@ const _sfc_main = /* @__PURE__ */ Vue.defineComponent({
|
|
|
122
122
|
}, null, 8, ["user-id", "user-name", "avatar-url", "is-show-edit-name"])
|
|
123
123
|
])
|
|
124
124
|
]),
|
|
125
|
-
Vue.unref(environment.isMobile) ? (Vue.openBlock(), Vue.createBlock(index$
|
|
125
|
+
Vue.unref(environment.isMobile) ? (Vue.openBlock(), Vue.createBlock(index$2.default, {
|
|
126
126
|
key: 0,
|
|
127
127
|
ref_key: "roomControlRef",
|
|
128
128
|
ref: roomControlRef,
|
|
@@ -136,7 +136,7 @@ const _sfc_main = /* @__PURE__ */ Vue.defineComponent({
|
|
|
136
136
|
[Vue.vShow, props.isShowLogo]
|
|
137
137
|
]),
|
|
138
138
|
Vue.createElementVNode("div", _hoisted_5, [
|
|
139
|
-
Vue.createVNode(index$
|
|
139
|
+
Vue.createVNode(index$2.default, {
|
|
140
140
|
ref_key: "roomControlRef",
|
|
141
141
|
ref: roomControlRef,
|
|
142
142
|
"given-room-id": props.roomId,
|
|
@@ -1,22 +1,21 @@
|
|
|
1
1
|
import { IRoomService } from '../';
|
|
2
2
|
|
|
3
|
-
interface SubtitleMessage {
|
|
4
|
-
|
|
3
|
+
export interface SubtitleMessage {
|
|
4
|
+
sender: string;
|
|
5
5
|
text: string;
|
|
6
|
-
|
|
6
|
+
translationText: string;
|
|
7
|
+
end?: boolean;
|
|
8
|
+
startMsTs: number;
|
|
7
9
|
}
|
|
8
10
|
export declare enum AI_TASK {
|
|
9
11
|
TRANSCRIPTION_TASK = "transcription"
|
|
10
12
|
}
|
|
11
13
|
export interface AITaskEvent {
|
|
12
14
|
[AI_TASK.TRANSCRIPTION_TASK]: {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
value: string;
|
|
16
|
-
};
|
|
17
|
-
transcriptionText: {
|
|
18
|
-
value: string;
|
|
15
|
+
subtitleMessages: {
|
|
16
|
+
[key: string]: SubtitleMessage;
|
|
19
17
|
};
|
|
18
|
+
transcribedMessageList: SubtitleMessage[];
|
|
20
19
|
};
|
|
21
20
|
[key: string]: unknown;
|
|
22
21
|
[key: symbol]: unknown;
|
|
@@ -25,13 +24,11 @@ export declare class AITask {
|
|
|
25
24
|
private emitter;
|
|
26
25
|
private trtc;
|
|
27
26
|
private service;
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
value: string;
|
|
31
|
-
};
|
|
32
|
-
transcriptionText: {
|
|
33
|
-
value: string;
|
|
27
|
+
subtitleMessages: {
|
|
28
|
+
[key: string]: SubtitleMessage;
|
|
34
29
|
};
|
|
30
|
+
transcribedMessageList: SubtitleMessage[];
|
|
31
|
+
private subtitleTimeout;
|
|
35
32
|
constructor(service: IRoomService);
|
|
36
33
|
private bindCtx;
|
|
37
34
|
on<T extends keyof AITaskEvent>(eventType: T, callback: (data?: AITaskEvent[T]) => void): void;
|
|
@@ -41,8 +38,7 @@ export declare class AITask {
|
|
|
41
38
|
private handleMount;
|
|
42
39
|
private handleUnmount;
|
|
43
40
|
private bindEvent;
|
|
41
|
+
private resetSubtitleTimeout;
|
|
44
42
|
private handleAIMessage;
|
|
45
43
|
private handleMessage;
|
|
46
|
-
StartAITranscription(): void;
|
|
47
44
|
}
|
|
48
|
-
export {};
|
|
@@ -5,18 +5,20 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
|
|
|
5
5
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
6
6
|
const mitt = require("mitt");
|
|
7
7
|
const environment = require("../../utils/environment.js");
|
|
8
|
+
const utils = require("../../utils/utils.js");
|
|
8
9
|
var AI_TASK = /* @__PURE__ */ ((AI_TASK2) => {
|
|
9
10
|
AI_TASK2["TRANSCRIPTION_TASK"] = "transcription";
|
|
10
11
|
return AI_TASK2;
|
|
11
12
|
})(AI_TASK || {});
|
|
13
|
+
const ASR_EVENT_CODE = 1e4;
|
|
12
14
|
class AITask {
|
|
13
15
|
constructor(service) {
|
|
14
16
|
__publicField(this, "emitter", mitt());
|
|
15
17
|
__publicField(this, "trtc");
|
|
16
18
|
__publicField(this, "service");
|
|
17
|
-
__publicField(this, "
|
|
18
|
-
__publicField(this, "
|
|
19
|
-
__publicField(this, "
|
|
19
|
+
__publicField(this, "subtitleMessages", {});
|
|
20
|
+
__publicField(this, "transcribedMessageList", []);
|
|
21
|
+
__publicField(this, "subtitleTimeout", {});
|
|
20
22
|
this.service = service;
|
|
21
23
|
if (environment.isElectron || environment.isMobile) return;
|
|
22
24
|
this.bindCtx();
|
|
@@ -45,126 +47,87 @@ class AITask {
|
|
|
45
47
|
if (typeof ((_a = this.service.roomEngine.instance) == null ? void 0 : _a.getTRTCCloud) === "undefined" || typeof ((_c = (_b = this.service.roomEngine.instance) == null ? void 0 : _b.getTRTCCloud()) == null ? void 0 : _c._trtc) === "undefined") {
|
|
46
48
|
return;
|
|
47
49
|
}
|
|
48
|
-
|
|
49
|
-
this.trtc
|
|
50
|
-
trtc.on("custom-message", this.handleAIMessage);
|
|
50
|
+
this.trtc = (_d = this.service.roomEngine.instance) == null ? void 0 : _d.getTRTCCloud()._trtc;
|
|
51
|
+
this.trtc.on("custom-message", this.handleAIMessage);
|
|
51
52
|
}
|
|
52
53
|
handleUnmount() {
|
|
53
54
|
var _a;
|
|
54
|
-
this.
|
|
55
|
-
this.
|
|
56
|
-
this.transcriptionText.value = "";
|
|
55
|
+
this.subtitleMessages = {};
|
|
56
|
+
this.transcribedMessageList = [];
|
|
57
57
|
(_a = this.trtc) == null ? void 0 : _a.off("custom-message", this.handleAIMessage);
|
|
58
58
|
}
|
|
59
59
|
bindEvent() {
|
|
60
60
|
this.service.lifeCycleManager.on("mount", this.handleMount);
|
|
61
61
|
this.service.lifeCycleManager.on("unmount", this.handleUnmount);
|
|
62
62
|
}
|
|
63
|
-
|
|
63
|
+
resetSubtitleTimeout(id, fn) {
|
|
64
|
+
if (this.subtitleTimeout[id]) {
|
|
65
|
+
clearTimeout(this.subtitleTimeout[id]);
|
|
66
|
+
}
|
|
67
|
+
this.subtitleTimeout[id] = setTimeout(fn, 3e3);
|
|
68
|
+
}
|
|
64
69
|
handleAIMessage(event) {
|
|
65
70
|
if (event.cmdId !== 1) return;
|
|
66
71
|
const data = new TextDecoder().decode(event.data);
|
|
67
72
|
const jsonData = JSON.parse(data);
|
|
68
73
|
this.handleMessage(jsonData);
|
|
69
74
|
this.emit("transcription", {
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
subtitleMsg: this.subtitleMsg
|
|
75
|
+
subtitleMessages: this.subtitleMessages,
|
|
76
|
+
transcribedMessageList: this.transcribedMessageList
|
|
73
77
|
});
|
|
74
78
|
}
|
|
75
79
|
handleMessage(data) {
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
80
|
+
if (data.type !== ASR_EVENT_CODE) return;
|
|
81
|
+
const { sender, payload } = data;
|
|
82
|
+
const { end } = payload;
|
|
83
|
+
const createSubtitleMsg = () => {
|
|
84
|
+
return {
|
|
85
|
+
sender,
|
|
86
|
+
text: payload.text,
|
|
87
|
+
translationText: payload.translation_text,
|
|
88
|
+
startMsTs: data.start_ms_ts,
|
|
89
|
+
end
|
|
90
|
+
};
|
|
87
91
|
};
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
text: data.payload.text,
|
|
102
|
-
translation_text: data.payload.translation_text
|
|
103
|
-
});
|
|
104
|
-
}
|
|
105
|
-
refreshSubtitle();
|
|
106
|
-
} else if (data.type === 1e4 && data.payload.end === true) {
|
|
107
|
-
for (let i = 0; i < this.subtitleMsg.length; i++) {
|
|
108
|
-
if (data.sender === this.subtitleMsg[i].userid) {
|
|
109
|
-
this.subtitleMsg[i].text = data.payload.text;
|
|
110
|
-
this.subtitleMsg[i].translation_text = data.payload.translation_text;
|
|
111
|
-
break;
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
refreshSubtitle();
|
|
115
|
-
let content = `${data.payload.start_time}->${data.payload.end_time} ${data.sender}: ${data.payload.text}
|
|
116
|
-
`;
|
|
117
|
-
if (data.payload.translation_text !== "") {
|
|
118
|
-
content += `${data.payload.start_time}->${data.payload.end_time} ${data.sender}: ${data.payload.translation_text}
|
|
119
|
-
`;
|
|
92
|
+
const updateMsg = (msg) => {
|
|
93
|
+
msg.text = payload.text;
|
|
94
|
+
msg.translationText = payload.translation_text;
|
|
95
|
+
msg.end = end;
|
|
96
|
+
};
|
|
97
|
+
const appendMsg = (msg, target) => {
|
|
98
|
+
if (Array.isArray(target)) {
|
|
99
|
+
target.push(msg);
|
|
100
|
+
} else if (typeof target === "object") {
|
|
101
|
+
const recordTarget = target;
|
|
102
|
+
recordTarget[msg.sender] = msg;
|
|
103
|
+
} else {
|
|
104
|
+
throw new Error("Invalid target type");
|
|
120
105
|
}
|
|
121
|
-
|
|
106
|
+
};
|
|
107
|
+
const existingSubtitle = this.subtitleMessages[sender];
|
|
108
|
+
if (existingSubtitle) {
|
|
109
|
+
updateMsg(existingSubtitle);
|
|
110
|
+
} else {
|
|
111
|
+
appendMsg(createSubtitleMsg(), this.subtitleMessages);
|
|
122
112
|
}
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
if (!exist) {
|
|
134
|
-
this.subtitleMsg.push({
|
|
135
|
-
userid: data.userid,
|
|
136
|
-
text: data.text,
|
|
137
|
-
translation_text: data.translation_text
|
|
138
|
-
});
|
|
139
|
-
}
|
|
140
|
-
refreshSubtitle();
|
|
141
|
-
} else if (data.type === "transcription") {
|
|
142
|
-
for (let i = 0; i < this.subtitleMsg.length; i++) {
|
|
143
|
-
if (data.userid === this.subtitleMsg[i].userid) {
|
|
144
|
-
this.subtitleMsg[i].text = data.text;
|
|
145
|
-
this.subtitleMsg[i].translation_text = data.translation_text;
|
|
146
|
-
break;
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
refreshSubtitle();
|
|
150
|
-
let content = `${formatTimestampToTime(data.start_ms_ts)}->${formatTimestampToTime(data.end_ms_ts)} ${this.service.roomStore.getDisplayName(data.userid)}: ${data.text}
|
|
151
|
-
`;
|
|
152
|
-
if (data.translation_text !== "") {
|
|
153
|
-
content += `${formatTimestampToTime(data.start_ms_ts)}->${formatTimestampToTime(data.end_ms_ts)} ${this.service.roomStore.getDisplayName(data.userid)}: ${data.translation_text}
|
|
154
|
-
`;
|
|
155
|
-
}
|
|
156
|
-
this.transcriptionText.value += content;
|
|
113
|
+
const transcriptionIndex = utils.findLastIndex(
|
|
114
|
+
this.transcribedMessageList,
|
|
115
|
+
(msg) => msg.sender === sender && !msg.end
|
|
116
|
+
);
|
|
117
|
+
if (transcriptionIndex !== -1) {
|
|
118
|
+
updateMsg(this.transcribedMessageList[transcriptionIndex]);
|
|
119
|
+
} else {
|
|
120
|
+
appendMsg(createSubtitleMsg(), this.transcribedMessageList);
|
|
157
121
|
}
|
|
122
|
+
this.resetSubtitleTimeout(sender, () => {
|
|
123
|
+
if (!end) return;
|
|
124
|
+
delete this.subtitleMessages[sender];
|
|
125
|
+
this.emit("transcription", {
|
|
126
|
+
subtitleMessages: this.subtitleMessages,
|
|
127
|
+
transcribedMessageList: this.transcribedMessageList
|
|
128
|
+
});
|
|
129
|
+
});
|
|
158
130
|
}
|
|
159
|
-
StartAITranscription() {
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
function formatTimestampToTime(timestamp) {
|
|
163
|
-
const date = new Date(timestamp);
|
|
164
|
-
const hours = date.getHours().toString().padStart(2, "0");
|
|
165
|
-
const minutes = date.getMinutes().toString().padStart(2, "0");
|
|
166
|
-
const seconds = date.getSeconds().toString().padStart(2, "0");
|
|
167
|
-
return `${hours}:${minutes}:${seconds}`;
|
|
168
131
|
}
|
|
169
132
|
exports.AITask = AITask;
|
|
170
133
|
exports.AI_TASK = AI_TASK;
|
|
@@ -10,7 +10,10 @@ export declare enum MetricsKey {
|
|
|
10
10
|
disableScreenSharing = 106053,
|
|
11
11
|
enableWatermark = 106054,
|
|
12
12
|
enableVirtualBackground = 106055,
|
|
13
|
-
hideFeatureButton = 106056
|
|
13
|
+
hideFeatureButton = 106056,
|
|
14
|
+
openChat = 106057,
|
|
15
|
+
setBasicBeauty = 106058,
|
|
16
|
+
aiTask = 106059
|
|
14
17
|
}
|
|
15
18
|
export declare class DataReportManager {
|
|
16
19
|
private taskQueue;
|
|
@@ -18,6 +18,9 @@ var MetricsKey = /* @__PURE__ */ ((MetricsKey2) => {
|
|
|
18
18
|
MetricsKey2[MetricsKey2["enableWatermark"] = 106054] = "enableWatermark";
|
|
19
19
|
MetricsKey2[MetricsKey2["enableVirtualBackground"] = 106055] = "enableVirtualBackground";
|
|
20
20
|
MetricsKey2[MetricsKey2["hideFeatureButton"] = 106056] = "hideFeatureButton";
|
|
21
|
+
MetricsKey2[MetricsKey2["openChat"] = 106057] = "openChat";
|
|
22
|
+
MetricsKey2[MetricsKey2["setBasicBeauty"] = 106058] = "setBasicBeauty";
|
|
23
|
+
MetricsKey2[MetricsKey2["aiTask"] = 106059] = "aiTask";
|
|
21
24
|
return MetricsKey2;
|
|
22
25
|
})(MetricsKey || {});
|
|
23
26
|
class DataReportManager {
|
package/lib/stores/room.js
CHANGED
|
@@ -412,9 +412,6 @@ const useRoomStore = pinia.defineStore("room", {
|
|
|
412
412
|
updateVideoQuality(quality) {
|
|
413
413
|
this.localVideoQuality = quality;
|
|
414
414
|
},
|
|
415
|
-
setLocalUser(obj) {
|
|
416
|
-
Object.assign(this.localUser, obj);
|
|
417
|
-
},
|
|
418
415
|
setDeviceList(type, deviceList) {
|
|
419
416
|
switch (type) {
|
|
420
417
|
case TUIRoomEngine.TUIMediaDeviceType.kMediaDeviceTypeVideoCamera:
|
package/lib/utils/utils.d.ts
CHANGED
|
@@ -60,3 +60,5 @@ export declare function convertSecondsToHMS(seconds: number): {
|
|
|
60
60
|
seconds: number;
|
|
61
61
|
};
|
|
62
62
|
export declare function getNanoId(size?: number): string;
|
|
63
|
+
export declare function findLastIndex<T>(array: T[], predicate: (value: T, index: number, obj: T[]) => boolean, thisArg?: any): number;
|
|
64
|
+
export declare function formatTimestampToTime(timestamp: number, format?: string): string;
|
package/lib/utils/utils.js
CHANGED
|
@@ -147,12 +147,45 @@ function getNanoId(size = 21) {
|
|
|
147
147
|
}
|
|
148
148
|
return id;
|
|
149
149
|
}
|
|
150
|
+
function findLastIndex(array, predicate, thisArg) {
|
|
151
|
+
const len = array.length >>> 0;
|
|
152
|
+
let k = len - 1;
|
|
153
|
+
while (k >= 0) {
|
|
154
|
+
const kValue = array[k];
|
|
155
|
+
if (predicate.call(thisArg, kValue, k, array)) {
|
|
156
|
+
return k;
|
|
157
|
+
}
|
|
158
|
+
k = k - 1;
|
|
159
|
+
}
|
|
160
|
+
return -1;
|
|
161
|
+
}
|
|
162
|
+
function formatTimestampToTime(timestamp, format = "MM-DD HH:mm") {
|
|
163
|
+
const date = new Date(timestamp);
|
|
164
|
+
const padStart = (value, length = 2) => value.toString().padStart(length, "0");
|
|
165
|
+
const replacements = {
|
|
166
|
+
YYYY: date.getFullYear().toString(),
|
|
167
|
+
YY: (date.getFullYear() % 100).toString().padStart(2, "0"),
|
|
168
|
+
MM: padStart(date.getMonth() + 1),
|
|
169
|
+
DD: padStart(date.getDate()),
|
|
170
|
+
HH: padStart(date.getHours()),
|
|
171
|
+
hh: padStart(date.getHours() % 12),
|
|
172
|
+
mm: padStart(date.getMinutes()),
|
|
173
|
+
ss: padStart(date.getSeconds()),
|
|
174
|
+
A: date.getHours() >= 12 ? "PM" : "AM"
|
|
175
|
+
};
|
|
176
|
+
return format.replace(
|
|
177
|
+
/YYYY|YY|MM|DD|HH|hh|mm|ss|A/g,
|
|
178
|
+
(match) => replacements[match]
|
|
179
|
+
);
|
|
180
|
+
}
|
|
150
181
|
exports.addSuffix = addSuffix;
|
|
151
182
|
exports.calculateByteLength = calculateByteLength;
|
|
152
183
|
exports.convertSecondsToHMS = convertSecondsToHMS;
|
|
153
184
|
exports.debounce = debounce;
|
|
154
185
|
exports.deepClone = deepClone;
|
|
155
186
|
exports.exitFullScreen = exitFullScreen;
|
|
187
|
+
exports.findLastIndex = findLastIndex;
|
|
188
|
+
exports.formatTimestampToTime = formatTimestampToTime;
|
|
156
189
|
exports.getNanoId = getNanoId;
|
|
157
190
|
exports.getUrlParam = getUrlParam;
|
|
158
191
|
exports.getUrlWithRoomId = getUrlWithRoomId;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tencentcloud/roomkit-electron-vue3",
|
|
3
|
-
"version": "2.7.
|
|
3
|
+
"version": "2.7.2",
|
|
4
4
|
"main": "./lib/index.js",
|
|
5
5
|
"module": "./es/index.mjs",
|
|
6
6
|
"types": "./es/index.d.ts",
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"dependencies": {
|
|
21
21
|
"@tencentcloud/chat": "latest",
|
|
22
22
|
"@tencentcloud/tui-core": "latest",
|
|
23
|
-
"@tencentcloud/tuiroom-engine-electron": "^2.7.
|
|
23
|
+
"@tencentcloud/tuiroom-engine-electron": "^2.7.2",
|
|
24
24
|
"@tencentcloud/chat-uikit-engine": "2.2.7",
|
|
25
25
|
"@tencentcloud/chat-uikit-vue": "2.2.7",
|
|
26
26
|
"@tencentcloud/universal-api": "^2.0.9",
|
|
@@ -1,37 +1,40 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<div v-if="subtitleLines.length" class="ai-subtitles">
|
|
3
|
-
<div v-for="
|
|
3
|
+
<div v-for="line in subtitleLines" :key="line.sender">
|
|
4
|
+
{{
|
|
5
|
+
`${roomService.roomStore.getDisplayName(line.sender)}: ${line?.text}`
|
|
6
|
+
}}
|
|
7
|
+
</div>
|
|
4
8
|
</div>
|
|
5
9
|
</template>
|
|
6
10
|
|
|
7
11
|
<script setup lang="ts">
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
const
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
rawSubtitleText.value = '';
|
|
25
|
-
}, 3000);
|
|
26
|
-
};
|
|
12
|
+
import { computed, onMounted, onUnmounted, ref } from 'vue';
|
|
13
|
+
import {
|
|
14
|
+
AI_TASK,
|
|
15
|
+
AITaskEvent,
|
|
16
|
+
MetricsKey,
|
|
17
|
+
roomService,
|
|
18
|
+
SubtitleMessage,
|
|
19
|
+
} from '../../services';
|
|
20
|
+
|
|
21
|
+
const subtitleMessages = ref<Record<string, SubtitleMessage>>({});
|
|
22
|
+
const subtitleLines = computed(() => {
|
|
23
|
+
const arr = Object.keys(subtitleMessages.value).map(userId => {
|
|
24
|
+
return subtitleMessages.value[userId];
|
|
25
|
+
});
|
|
26
|
+
return arr.sort((a, b) => a.startMsTs - b.startMsTs);
|
|
27
|
+
});
|
|
27
28
|
|
|
28
29
|
const handleAISubtitles = (data?: AITaskEvent[AI_TASK.TRANSCRIPTION_TASK]) => {
|
|
29
30
|
if (!data) return;
|
|
30
|
-
|
|
31
|
-
resetSubtitleTimeout();
|
|
31
|
+
subtitleMessages.value = Object.assign({}, data.subtitleMessages);
|
|
32
32
|
};
|
|
33
33
|
|
|
34
|
-
|
|
34
|
+
onMounted(() => {
|
|
35
|
+
roomService.dataReportManager.reportCount(MetricsKey.aiTask);
|
|
36
|
+
roomService.aiTask.on(AI_TASK.TRANSCRIPTION_TASK, handleAISubtitles);
|
|
37
|
+
});
|
|
35
38
|
|
|
36
39
|
onUnmounted(() => {
|
|
37
40
|
roomService.aiTask.off(AI_TASK.TRANSCRIPTION_TASK, handleAISubtitles);
|