@webex/internal-plugin-voicea 3.0.0 → 3.1.0-next.10
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/dist/constants.js +17 -9
- package/dist/constants.js.map +1 -1
- package/dist/types/constants.d.ts +46 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/utils.d.ts +1 -0
- package/dist/types/voicea.d.ts +128 -0
- package/dist/types/voicea.types.d.ts +73 -0
- package/dist/voicea.js +70 -53
- package/dist/voicea.js.map +1 -1
- package/dist/voicea.types.js.map +1 -1
- package/package.json +13 -12
- package/src/constants.ts +14 -6
- package/src/voicea.ts +96 -122
- package/src/voicea.types.ts +1 -0
- package/test/unit/spec/voicea.js +118 -11
- package/tsconfig.json +6 -0
package/dist/constants.js
CHANGED
|
@@ -4,7 +4,7 @@ var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/defi
|
|
|
4
4
|
_Object$defineProperty(exports, "__esModule", {
|
|
5
5
|
value: true
|
|
6
6
|
});
|
|
7
|
-
exports.
|
|
7
|
+
exports.VOICEA = exports.TURN_ON_CAPTION_STATUS = exports.TRANSCRIPTION_TYPE = exports.EVENT_TRIGGERS = exports.ANNOUNCE_STATUS = exports.AIBRIDGE_RELAY_TYPES = void 0;
|
|
8
8
|
var EVENT_TRIGGERS = exports.EVENT_TRIGGERS = {
|
|
9
9
|
VOICEA_ANNOUNCEMENT: 'voicea:announcement',
|
|
10
10
|
CAPTION_LANGUAGE_UPDATE: 'voicea:captionLanguageUpdate',
|
|
@@ -14,14 +14,20 @@ var EVENT_TRIGGERS = exports.EVENT_TRIGGERS = {
|
|
|
14
14
|
TRANSCRIBING_OFF: 'voicea:transcribingOff',
|
|
15
15
|
NEW_CAPTION: 'voicea:newCaption',
|
|
16
16
|
EVA_COMMAND: 'voicea:wxa',
|
|
17
|
-
HIGHLIGHT_CREATED: 'voicea:highlightCreated'
|
|
17
|
+
HIGHLIGHT_CREATED: 'voicea:highlightCreated',
|
|
18
|
+
NEW_MANUAL_CAPTION: 'aibridge:newManualCaption'
|
|
18
19
|
};
|
|
19
|
-
var
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
20
|
+
var AIBRIDGE_RELAY_TYPES = exports.AIBRIDGE_RELAY_TYPES = {
|
|
21
|
+
VOICEA: {
|
|
22
|
+
ANNOUNCEMENT: 'voicea.annc',
|
|
23
|
+
CLIENT_ANNOUNCEMENT: 'client.annc',
|
|
24
|
+
TRANSLATION_REQUEST: 'voicea.transl.req',
|
|
25
|
+
TRANSLATION_RESPONSE: 'voicea.transl.rsp',
|
|
26
|
+
TRANSCRIPTION: 'voicea.transcription'
|
|
27
|
+
},
|
|
28
|
+
MANUAL: {
|
|
29
|
+
TRANSCRIPTION: 'aibridge.manual_transcription'
|
|
30
|
+
}
|
|
25
31
|
};
|
|
26
32
|
var TRANSCRIPTION_TYPE = exports.TRANSCRIPTION_TYPE = {
|
|
27
33
|
UNKNOWN: 'unknown',
|
|
@@ -30,7 +36,9 @@ var TRANSCRIPTION_TYPE = exports.TRANSCRIPTION_TYPE = {
|
|
|
30
36
|
EVA_CANCEL: 'eva_cancel',
|
|
31
37
|
HIGHLIGHT_CREATED: 'highlight_created',
|
|
32
38
|
TRANSCRIPT_INTERIM_RESULTS: 'transcript_interim_results',
|
|
33
|
-
TRANSCRIPT_FINAL_RESULT: 'transcript_final_result'
|
|
39
|
+
TRANSCRIPT_FINAL_RESULT: 'transcript_final_result',
|
|
40
|
+
MANUAL_CAPTION_INTERIM_RESULTS: 'manual_caption_interim_results',
|
|
41
|
+
MANUAL_CAPTION_FINAL_RESULT: 'manual_caption_final_result'
|
|
34
42
|
};
|
|
35
43
|
var VOICEA = exports.VOICEA = 'voicea';
|
|
36
44
|
var ANNOUNCE_STATUS = exports.ANNOUNCE_STATUS = {
|
package/dist/constants.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["EVENT_TRIGGERS","exports","VOICEA_ANNOUNCEMENT","CAPTION_LANGUAGE_UPDATE","SPOKEN_LANGUAGE_UPDATE","CAPTIONS_TURNED_ON","TRANSCRIBING_ON","TRANSCRIBING_OFF","NEW_CAPTION","EVA_COMMAND","HIGHLIGHT_CREATED","
|
|
1
|
+
{"version":3,"names":["EVENT_TRIGGERS","exports","VOICEA_ANNOUNCEMENT","CAPTION_LANGUAGE_UPDATE","SPOKEN_LANGUAGE_UPDATE","CAPTIONS_TURNED_ON","TRANSCRIBING_ON","TRANSCRIBING_OFF","NEW_CAPTION","EVA_COMMAND","HIGHLIGHT_CREATED","NEW_MANUAL_CAPTION","AIBRIDGE_RELAY_TYPES","VOICEA","ANNOUNCEMENT","CLIENT_ANNOUNCEMENT","TRANSLATION_REQUEST","TRANSLATION_RESPONSE","TRANSCRIPTION","MANUAL","TRANSCRIPTION_TYPE","UNKNOWN","EVA_WAKE","EVA_THANKS","EVA_CANCEL","TRANSCRIPT_INTERIM_RESULTS","TRANSCRIPT_FINAL_RESULT","MANUAL_CAPTION_INTERIM_RESULTS","MANUAL_CAPTION_FINAL_RESULT","ANNOUNCE_STATUS","IDLE","JOINED","JOINING","TURN_ON_CAPTION_STATUS","ENABLED","SENDING"],"sources":["constants.ts"],"sourcesContent":["export const EVENT_TRIGGERS = {\n VOICEA_ANNOUNCEMENT: 'voicea:announcement',\n CAPTION_LANGUAGE_UPDATE: 'voicea:captionLanguageUpdate',\n SPOKEN_LANGUAGE_UPDATE: 'voicea:spokenLanguageUpdate',\n CAPTIONS_TURNED_ON: 'voicea:captionOn',\n TRANSCRIBING_ON: 'voicea:transcribingOn',\n TRANSCRIBING_OFF: 'voicea:transcribingOff',\n\n NEW_CAPTION: 'voicea:newCaption',\n EVA_COMMAND: 'voicea:wxa',\n HIGHLIGHT_CREATED: 'voicea:highlightCreated',\n NEW_MANUAL_CAPTION: 'aibridge:newManualCaption',\n};\n\nexport const AIBRIDGE_RELAY_TYPES = {\n VOICEA: {\n ANNOUNCEMENT: 'voicea.annc',\n CLIENT_ANNOUNCEMENT: 'client.annc',\n TRANSLATION_REQUEST: 'voicea.transl.req',\n TRANSLATION_RESPONSE: 'voicea.transl.rsp',\n TRANSCRIPTION: 'voicea.transcription',\n },\n MANUAL: {\n TRANSCRIPTION: 'aibridge.manual_transcription',\n },\n};\n\nexport const TRANSCRIPTION_TYPE = {\n UNKNOWN: 'unknown',\n EVA_WAKE: 'eva_wake',\n EVA_THANKS: 'eva_thanks',\n EVA_CANCEL: 'eva_cancel',\n HIGHLIGHT_CREATED: 'highlight_created',\n TRANSCRIPT_INTERIM_RESULTS: 'transcript_interim_results',\n TRANSCRIPT_FINAL_RESULT: 'transcript_final_result',\n MANUAL_CAPTION_INTERIM_RESULTS: 'manual_caption_interim_results',\n MANUAL_CAPTION_FINAL_RESULT: 'manual_caption_final_result',\n};\n\nexport const VOICEA = 'voicea';\n\nexport const ANNOUNCE_STATUS = {\n IDLE: 'idle',\n JOINED: 'joined',\n JOINING: 'joining',\n};\n\nexport const TURN_ON_CAPTION_STATUS = {\n IDLE: 'idle',\n ENABLED: 'enabled',\n SENDING: 'sending',\n};\n"],"mappings":";;;;;;;AAAO,IAAMA,cAAc,GAAAC,OAAA,CAAAD,cAAA,GAAG;EAC5BE,mBAAmB,EAAE,qBAAqB;EAC1CC,uBAAuB,EAAE,8BAA8B;EACvDC,sBAAsB,EAAE,6BAA6B;EACrDC,kBAAkB,EAAE,kBAAkB;EACtCC,eAAe,EAAE,uBAAuB;EACxCC,gBAAgB,EAAE,wBAAwB;EAE1CC,WAAW,EAAE,mBAAmB;EAChCC,WAAW,EAAE,YAAY;EACzBC,iBAAiB,EAAE,yBAAyB;EAC5CC,kBAAkB,EAAE;AACtB,CAAC;AAEM,IAAMC,oBAAoB,GAAAX,OAAA,CAAAW,oBAAA,GAAG;EAClCC,MAAM,EAAE;IACNC,YAAY,EAAE,aAAa;IAC3BC,mBAAmB,EAAE,aAAa;IAClCC,mBAAmB,EAAE,mBAAmB;IACxCC,oBAAoB,EAAE,mBAAmB;IACzCC,aAAa,EAAE;EACjB,CAAC;EACDC,MAAM,EAAE;IACND,aAAa,EAAE;EACjB;AACF,CAAC;AAEM,IAAME,kBAAkB,GAAAnB,OAAA,CAAAmB,kBAAA,GAAG;EAChCC,OAAO,EAAE,SAAS;EAClBC,QAAQ,EAAE,UAAU;EACpBC,UAAU,EAAE,YAAY;EACxBC,UAAU,EAAE,YAAY;EACxBd,iBAAiB,EAAE,mBAAmB;EACtCe,0BAA0B,EAAE,4BAA4B;EACxDC,uBAAuB,EAAE,yBAAyB;EAClDC,8BAA8B,EAAE,gCAAgC;EAChEC,2BAA2B,EAAE;AAC/B,CAAC;AAEM,IAAMf,MAAM,GAAAZ,OAAA,CAAAY,MAAA,GAAG,QAAQ;AAEvB,IAAMgB,eAAe,GAAA5B,OAAA,CAAA4B,eAAA,GAAG;EAC7BC,IAAI,EAAE,MAAM;EACZC,MAAM,EAAE,QAAQ;EAChBC,OAAO,EAAE;AACX,CAAC;AAEM,IAAMC,sBAAsB,GAAAhC,OAAA,CAAAgC,sBAAA,GAAG;EACpCH,IAAI,EAAE,MAAM;EACZI,OAAO,EAAE,SAAS;EAClBC,OAAO,EAAE;AACX,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export declare const EVENT_TRIGGERS: {
|
|
2
|
+
VOICEA_ANNOUNCEMENT: string;
|
|
3
|
+
CAPTION_LANGUAGE_UPDATE: string;
|
|
4
|
+
SPOKEN_LANGUAGE_UPDATE: string;
|
|
5
|
+
CAPTIONS_TURNED_ON: string;
|
|
6
|
+
TRANSCRIBING_ON: string;
|
|
7
|
+
TRANSCRIBING_OFF: string;
|
|
8
|
+
NEW_CAPTION: string;
|
|
9
|
+
EVA_COMMAND: string;
|
|
10
|
+
HIGHLIGHT_CREATED: string;
|
|
11
|
+
NEW_MANUAL_CAPTION: string;
|
|
12
|
+
};
|
|
13
|
+
export declare const AIBRIDGE_RELAY_TYPES: {
|
|
14
|
+
VOICEA: {
|
|
15
|
+
ANNOUNCEMENT: string;
|
|
16
|
+
CLIENT_ANNOUNCEMENT: string;
|
|
17
|
+
TRANSLATION_REQUEST: string;
|
|
18
|
+
TRANSLATION_RESPONSE: string;
|
|
19
|
+
TRANSCRIPTION: string;
|
|
20
|
+
};
|
|
21
|
+
MANUAL: {
|
|
22
|
+
TRANSCRIPTION: string;
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
export declare const TRANSCRIPTION_TYPE: {
|
|
26
|
+
UNKNOWN: string;
|
|
27
|
+
EVA_WAKE: string;
|
|
28
|
+
EVA_THANKS: string;
|
|
29
|
+
EVA_CANCEL: string;
|
|
30
|
+
HIGHLIGHT_CREATED: string;
|
|
31
|
+
TRANSCRIPT_INTERIM_RESULTS: string;
|
|
32
|
+
TRANSCRIPT_FINAL_RESULT: string;
|
|
33
|
+
MANUAL_CAPTION_INTERIM_RESULTS: string;
|
|
34
|
+
MANUAL_CAPTION_FINAL_RESULT: string;
|
|
35
|
+
};
|
|
36
|
+
export declare const VOICEA = "voicea";
|
|
37
|
+
export declare const ANNOUNCE_STATUS: {
|
|
38
|
+
IDLE: string;
|
|
39
|
+
JOINED: string;
|
|
40
|
+
JOINING: string;
|
|
41
|
+
};
|
|
42
|
+
export declare const TURN_ON_CAPTION_STATUS: {
|
|
43
|
+
IDLE: string;
|
|
44
|
+
ENABLED: string;
|
|
45
|
+
SENDING: string;
|
|
46
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const millisToMinutesAndSeconds: (millis: number) => string;
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { WebexPlugin } from '@webex/webex-core';
|
|
2
|
+
import { IVoiceaChannel } from './voicea.types';
|
|
3
|
+
/**
|
|
4
|
+
* @description VoiceaChannel to hold single instance of LLM
|
|
5
|
+
* @export
|
|
6
|
+
* @class VoiceaChannel
|
|
7
|
+
*/
|
|
8
|
+
export declare class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
|
|
9
|
+
namespace: string;
|
|
10
|
+
private seqNum;
|
|
11
|
+
private areCaptionsEnabled;
|
|
12
|
+
private hasSubscribedToEvents;
|
|
13
|
+
private vmcDeviceId?;
|
|
14
|
+
private announceStatus;
|
|
15
|
+
private captionStatus;
|
|
16
|
+
/**
|
|
17
|
+
* @param {Object} e
|
|
18
|
+
* @returns {undefined}
|
|
19
|
+
*/
|
|
20
|
+
private eventProcessor;
|
|
21
|
+
/**
|
|
22
|
+
* Listen to websocket messages
|
|
23
|
+
* @returns {undefined}
|
|
24
|
+
*/
|
|
25
|
+
private listenToEvents;
|
|
26
|
+
/**
|
|
27
|
+
* Listen to websocket messages
|
|
28
|
+
* @returns {void}
|
|
29
|
+
*/
|
|
30
|
+
deregisterEvents(): void;
|
|
31
|
+
/**
|
|
32
|
+
* Initializes Voicea plugin
|
|
33
|
+
* @param {any} args
|
|
34
|
+
*/
|
|
35
|
+
constructor(...args: any[]);
|
|
36
|
+
/**
|
|
37
|
+
* Process manual Transcript and send alert
|
|
38
|
+
* @param {TranscriptionResponse} transcriptPayload
|
|
39
|
+
* @returns {void}
|
|
40
|
+
*/
|
|
41
|
+
private processManualTranscription;
|
|
42
|
+
/**
|
|
43
|
+
* Process Transcript and send alert
|
|
44
|
+
* @param {TranscriptionResponse} voiceaPayload
|
|
45
|
+
* @returns {void}
|
|
46
|
+
*/
|
|
47
|
+
private processTranscription;
|
|
48
|
+
/**
|
|
49
|
+
* Processes Caption Language Response
|
|
50
|
+
* @param {CaptionLanguageResponse} voiceaPayload
|
|
51
|
+
* @returns {void}
|
|
52
|
+
*/
|
|
53
|
+
private processCaptionLanguageResponse;
|
|
54
|
+
/**
|
|
55
|
+
* processes voicea announcement response and triggers event
|
|
56
|
+
* @param {Object} voiceaPayload
|
|
57
|
+
* @returns {void}
|
|
58
|
+
*/
|
|
59
|
+
private processAnnouncementMessage;
|
|
60
|
+
/**
|
|
61
|
+
* Sends Announcement to add voicea to the meeting
|
|
62
|
+
* @returns {void}
|
|
63
|
+
*/
|
|
64
|
+
private sendAnnouncement;
|
|
65
|
+
/**
|
|
66
|
+
* Set Spoken Language for the meeting
|
|
67
|
+
* @param {string} languageCode
|
|
68
|
+
* @returns {Promise}
|
|
69
|
+
*/
|
|
70
|
+
setSpokenLanguage: (languageCode: string) => Promise<void>;
|
|
71
|
+
/**
|
|
72
|
+
* Request Language translation
|
|
73
|
+
* @param {string} languageCode
|
|
74
|
+
* @returns {void}
|
|
75
|
+
*/
|
|
76
|
+
requestLanguage: (languageCode: string) => void;
|
|
77
|
+
/**
|
|
78
|
+
* request turn on Captions
|
|
79
|
+
* @param {string} [languageCode] - Optional Parameter for spoken language code. Defaults to English
|
|
80
|
+
* @returns {Promise}
|
|
81
|
+
*/
|
|
82
|
+
private requestTurnOnCaptions;
|
|
83
|
+
/**
|
|
84
|
+
* is announce processing
|
|
85
|
+
* @returns {boolean}
|
|
86
|
+
*/
|
|
87
|
+
private isAnnounceProcessing;
|
|
88
|
+
/**
|
|
89
|
+
* announce to voicea data chanel
|
|
90
|
+
* @returns {void}
|
|
91
|
+
*/
|
|
92
|
+
announce: () => void;
|
|
93
|
+
/**
|
|
94
|
+
* is turn on caption processing
|
|
95
|
+
* @returns {boolean}
|
|
96
|
+
*/
|
|
97
|
+
private isCaptionProcessing;
|
|
98
|
+
/**
|
|
99
|
+
* Turn on Captions
|
|
100
|
+
* @param {string} [spokenLanguage] - Optional Spoken language code
|
|
101
|
+
* @returns {Promise}
|
|
102
|
+
*/
|
|
103
|
+
turnOnCaptions: (spokenLanguage?: any) => undefined | Promise<void>;
|
|
104
|
+
/**
|
|
105
|
+
* Toggle transcribing for highlights
|
|
106
|
+
* @param {bool} activate if true transcribing is turned on
|
|
107
|
+
* @param {string} spokenLanguage language code for spoken language
|
|
108
|
+
* @returns {Promise}
|
|
109
|
+
*/
|
|
110
|
+
toggleTranscribing: (activate: boolean, spokenLanguage?: string) => undefined | Promise<void>;
|
|
111
|
+
/**
|
|
112
|
+
* Toggle turn on manual caption
|
|
113
|
+
* @param {bool} enable if true manual caption is turned on
|
|
114
|
+
* @returns {Promise}
|
|
115
|
+
*/
|
|
116
|
+
toggleManualCaption: (enable: boolean) => undefined | Promise<void>;
|
|
117
|
+
/**
|
|
118
|
+
* get caption status
|
|
119
|
+
* @returns {string}
|
|
120
|
+
*/
|
|
121
|
+
getCaptionStatus: () => string;
|
|
122
|
+
/**
|
|
123
|
+
* get announce status
|
|
124
|
+
* @returns {string}
|
|
125
|
+
*/
|
|
126
|
+
getAnnounceStatus: () => string;
|
|
127
|
+
}
|
|
128
|
+
export default VoiceaChannel;
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type for payload
|
|
3
|
+
*/
|
|
4
|
+
interface AnnouncementPayload {
|
|
5
|
+
translation: {
|
|
6
|
+
max_languages: number;
|
|
7
|
+
allowed_languages: string[];
|
|
8
|
+
};
|
|
9
|
+
ASR: {
|
|
10
|
+
spoken_languages: string[];
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
type TRANSCRIPTION_TYPES = 'unknown' | 'eva_wake' | 'eva_thanks' | 'eva_cancel' | 'highlight_created' | 'transcript_interim_results' | 'transcript_final_result';
|
|
14
|
+
/**
|
|
15
|
+
* Class for an Transcription Object
|
|
16
|
+
*/
|
|
17
|
+
interface Transcription {
|
|
18
|
+
start_millis: number;
|
|
19
|
+
end_millis: number;
|
|
20
|
+
text: string;
|
|
21
|
+
transcript_language_code: string;
|
|
22
|
+
translations: {
|
|
23
|
+
[x: string]: string;
|
|
24
|
+
};
|
|
25
|
+
csis: number[];
|
|
26
|
+
last_packet_timestamp_ms: number;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Highlights
|
|
30
|
+
*/
|
|
31
|
+
interface Highlight {
|
|
32
|
+
highlight_id: string;
|
|
33
|
+
transcript: string;
|
|
34
|
+
highlight_label: string;
|
|
35
|
+
highlight_source: string;
|
|
36
|
+
start_millis: number;
|
|
37
|
+
end_millis: number;
|
|
38
|
+
csis: number[];
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Type for Transcription message
|
|
42
|
+
*/
|
|
43
|
+
interface TranscriptionResponse {
|
|
44
|
+
type: TRANSCRIPTION_TYPES;
|
|
45
|
+
id: string;
|
|
46
|
+
transcript_id: string;
|
|
47
|
+
translations?: {
|
|
48
|
+
[x: string]: string;
|
|
49
|
+
};
|
|
50
|
+
transcripts?: Transcription[];
|
|
51
|
+
transcript?: Transcription;
|
|
52
|
+
highlight?: Highlight;
|
|
53
|
+
csis: number[];
|
|
54
|
+
data: string;
|
|
55
|
+
command_response: string;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Type for CaptionLanguageResponse
|
|
59
|
+
*/
|
|
60
|
+
interface CaptionLanguageResponse {
|
|
61
|
+
requestId: string;
|
|
62
|
+
statusCode: number;
|
|
63
|
+
errorCode: number;
|
|
64
|
+
message: string;
|
|
65
|
+
}
|
|
66
|
+
interface IVoiceaChannel {
|
|
67
|
+
setSpokenLanguage: (languageCode: string) => Promise<void>;
|
|
68
|
+
requestLanguage: (languageCode: string) => void;
|
|
69
|
+
turnOnCaptions: () => undefined | Promise<void>;
|
|
70
|
+
toggleTranscribing: (activate: boolean, spokenLanguage: string) => undefined | Promise<void>;
|
|
71
|
+
deregisterEvents: () => void;
|
|
72
|
+
}
|
|
73
|
+
export type { AnnouncementPayload, CaptionLanguageResponse, TranscriptionResponse, Transcription, Highlight, IVoiceaChannel, };
|
package/dist/voicea.js
CHANGED
|
@@ -17,7 +17,6 @@ var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime
|
|
|
17
17
|
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/getPrototypeOf"));
|
|
18
18
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty"));
|
|
19
19
|
var _uuid = _interopRequireDefault(require("uuid"));
|
|
20
|
-
var _pluginMeetings = require("@webex/plugin-meetings");
|
|
21
20
|
var _webexCore = require("@webex/webex-core");
|
|
22
21
|
var _constants = require("./constants");
|
|
23
22
|
var _utils = require("./utils");
|
|
@@ -56,17 +55,40 @@ var VoiceaChannel = exports.VoiceaChannel = /*#__PURE__*/function (_WebexPlugin)
|
|
|
56
55
|
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "eventProcessor", function (e) {
|
|
57
56
|
_this.seqNum = e.sequenceNumber + 1;
|
|
58
57
|
switch (e.data.relayType) {
|
|
59
|
-
case _constants.
|
|
58
|
+
case _constants.AIBRIDGE_RELAY_TYPES.VOICEA.ANNOUNCEMENT:
|
|
60
59
|
_this.vmcDeviceId = e.headers.from;
|
|
61
60
|
_this.announceStatus = _constants.ANNOUNCE_STATUS.JOINED;
|
|
62
61
|
_this.processAnnouncementMessage(e.data.voiceaPayload);
|
|
63
62
|
break;
|
|
64
|
-
case _constants.
|
|
63
|
+
case _constants.AIBRIDGE_RELAY_TYPES.VOICEA.TRANSLATION_RESPONSE:
|
|
65
64
|
_this.processCaptionLanguageResponse(e.data.voiceaPayload);
|
|
66
65
|
break;
|
|
67
|
-
case _constants.
|
|
66
|
+
case _constants.AIBRIDGE_RELAY_TYPES.VOICEA.TRANSCRIPTION:
|
|
68
67
|
_this.processTranscription(e.data.voiceaPayload);
|
|
69
68
|
break;
|
|
69
|
+
case _constants.AIBRIDGE_RELAY_TYPES.MANUAL.TRANSCRIPTION:
|
|
70
|
+
_this.processManualTranscription(e.data.transcriptPayload);
|
|
71
|
+
break;
|
|
72
|
+
default:
|
|
73
|
+
break;
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
/**
|
|
77
|
+
* Process manual Transcript and send alert
|
|
78
|
+
* @param {TranscriptionResponse} transcriptPayload
|
|
79
|
+
* @returns {void}
|
|
80
|
+
*/
|
|
81
|
+
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "processManualTranscription", function (transcriptPayload) {
|
|
82
|
+
switch (transcriptPayload.type) {
|
|
83
|
+
case _constants.TRANSCRIPTION_TYPE.MANUAL_CAPTION_FINAL_RESULT:
|
|
84
|
+
case _constants.TRANSCRIPTION_TYPE.MANUAL_CAPTION_INTERIM_RESULTS:
|
|
85
|
+
// @ts-ignore
|
|
86
|
+
_this.trigger(_constants.EVENT_TRIGGERS.NEW_MANUAL_CAPTION, {
|
|
87
|
+
isFinal: transcriptPayload.type === _constants.TRANSCRIPTION_TYPE.MANUAL_CAPTION_FINAL_RESULT,
|
|
88
|
+
transcriptId: transcriptPayload.id,
|
|
89
|
+
transcripts: transcriptPayload.transcripts
|
|
90
|
+
});
|
|
91
|
+
break;
|
|
70
92
|
default:
|
|
71
93
|
break;
|
|
72
94
|
}
|
|
@@ -79,36 +101,24 @@ var VoiceaChannel = exports.VoiceaChannel = /*#__PURE__*/function (_WebexPlugin)
|
|
|
79
101
|
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "processTranscription", function (voiceaPayload) {
|
|
80
102
|
switch (voiceaPayload.type) {
|
|
81
103
|
case _constants.TRANSCRIPTION_TYPE.TRANSCRIPT_INTERIM_RESULTS:
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
function: 'processTranscription'
|
|
85
|
-
}, _constants.EVENT_TRIGGERS.NEW_CAPTION, {
|
|
104
|
+
// @ts-ignore
|
|
105
|
+
_this.trigger(_constants.EVENT_TRIGGERS.NEW_CAPTION, {
|
|
86
106
|
isFinal: false,
|
|
87
107
|
transcriptId: voiceaPayload.transcript_id,
|
|
88
108
|
transcripts: voiceaPayload.transcripts
|
|
89
109
|
});
|
|
90
110
|
break;
|
|
91
111
|
case _constants.TRANSCRIPTION_TYPE.TRANSCRIPT_FINAL_RESULT:
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
function: 'processTranscription'
|
|
95
|
-
}, _constants.EVENT_TRIGGERS.NEW_CAPTION, {
|
|
112
|
+
// @ts-ignore
|
|
113
|
+
_this.trigger(_constants.EVENT_TRIGGERS.NEW_CAPTION, {
|
|
96
114
|
isFinal: true,
|
|
97
115
|
transcriptId: voiceaPayload.transcript_id,
|
|
98
|
-
|
|
99
|
-
transcript: {
|
|
100
|
-
csis: voiceaPayload.csis,
|
|
101
|
-
text: voiceaPayload.transcript.text,
|
|
102
|
-
transcriptLanguageCode: voiceaPayload.transcript.transcript_language_code
|
|
103
|
-
},
|
|
104
|
-
timestamp: (0, _utils.millisToMinutesAndSeconds)(voiceaPayload.transcript.end_millis)
|
|
116
|
+
transcripts: voiceaPayload.transcripts
|
|
105
117
|
});
|
|
106
118
|
break;
|
|
107
119
|
case _constants.TRANSCRIPTION_TYPE.HIGHLIGHT_CREATED:
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
function: 'processTranscription'
|
|
111
|
-
}, _constants.EVENT_TRIGGERS.HIGHLIGHT_CREATED, {
|
|
120
|
+
// @ts-ignore
|
|
121
|
+
_this.trigger(_constants.EVENT_TRIGGERS.HIGHLIGHT_CREATED, {
|
|
112
122
|
csis: voiceaPayload.highlight.csis,
|
|
113
123
|
highlightId: voiceaPayload.highlight.highlight_id,
|
|
114
124
|
text: voiceaPayload.highlight.transcript,
|
|
@@ -118,20 +128,16 @@ var VoiceaChannel = exports.VoiceaChannel = /*#__PURE__*/function (_WebexPlugin)
|
|
|
118
128
|
});
|
|
119
129
|
break;
|
|
120
130
|
case _constants.TRANSCRIPTION_TYPE.EVA_THANKS:
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
function: 'processTranscription'
|
|
124
|
-
}, _constants.EVENT_TRIGGERS.EVA_COMMAND, {
|
|
131
|
+
// @ts-ignore
|
|
132
|
+
_this.trigger(_constants.EVENT_TRIGGERS.EVA_COMMAND, {
|
|
125
133
|
isListening: false,
|
|
126
134
|
text: voiceaPayload.command_response
|
|
127
135
|
});
|
|
128
136
|
break;
|
|
129
137
|
case _constants.TRANSCRIPTION_TYPE.EVA_WAKE:
|
|
130
138
|
case _constants.TRANSCRIPTION_TYPE.EVA_CANCEL:
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
function: 'processTranscription'
|
|
134
|
-
}, _constants.EVENT_TRIGGERS.EVA_COMMAND, {
|
|
139
|
+
// @ts-ignore
|
|
140
|
+
_this.trigger(_constants.EVENT_TRIGGERS.EVA_COMMAND, {
|
|
135
141
|
isListening: voiceaPayload.type === _constants.TRANSCRIPTION_TYPE.EVA_WAKE
|
|
136
142
|
});
|
|
137
143
|
break;
|
|
@@ -146,17 +152,13 @@ var VoiceaChannel = exports.VoiceaChannel = /*#__PURE__*/function (_WebexPlugin)
|
|
|
146
152
|
*/
|
|
147
153
|
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "processCaptionLanguageResponse", function (voiceaPayload) {
|
|
148
154
|
if (voiceaPayload.statusCode === 200) {
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
function: 'processCaptionLanguageResponse'
|
|
152
|
-
}, _constants.EVENT_TRIGGERS.CAPTION_LANGUAGE_UPDATE, {
|
|
155
|
+
// @ts-ignore
|
|
156
|
+
_this.trigger(_constants.EVENT_TRIGGERS.CAPTION_LANGUAGE_UPDATE, {
|
|
153
157
|
statusCode: 200
|
|
154
158
|
});
|
|
155
159
|
} else {
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
function: 'processCaptionLanguageResponse'
|
|
159
|
-
}, _constants.EVENT_TRIGGERS.CAPTION_LANGUAGE_UPDATE, {
|
|
160
|
+
// @ts-ignore
|
|
161
|
+
_this.trigger(_constants.EVENT_TRIGGERS.CAPTION_LANGUAGE_UPDATE, {
|
|
160
162
|
statusCode: voiceaPayload.errorCode,
|
|
161
163
|
errorMessage: voiceaPayload.message
|
|
162
164
|
});
|
|
@@ -174,10 +176,9 @@ var VoiceaChannel = exports.VoiceaChannel = /*#__PURE__*/function (_WebexPlugin)
|
|
|
174
176
|
maxLanguages: (_voiceaPayload$transl3 = voiceaPayload === null || voiceaPayload === void 0 ? void 0 : (_voiceaPayload$transl4 = voiceaPayload.translation) === null || _voiceaPayload$transl4 === void 0 ? void 0 : _voiceaPayload$transl4.max_languages) !== null && _voiceaPayload$transl3 !== void 0 ? _voiceaPayload$transl3 : 0,
|
|
175
177
|
spokenLanguages: (_voiceaPayload$ASR$sp = voiceaPayload === null || voiceaPayload === void 0 ? void 0 : (_voiceaPayload$ASR = voiceaPayload.ASR) === null || _voiceaPayload$ASR === void 0 ? void 0 : _voiceaPayload$ASR.spoken_languages) !== null && _voiceaPayload$ASR$sp !== void 0 ? _voiceaPayload$ASR$sp : []
|
|
176
178
|
};
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
}, _constants.EVENT_TRIGGERS.VOICEA_ANNOUNCEMENT, voiceaLanguageOptions);
|
|
179
|
+
|
|
180
|
+
// @ts-ignore
|
|
181
|
+
_this.trigger(_constants.EVENT_TRIGGERS.VOICEA_ANNOUNCEMENT, voiceaLanguageOptions);
|
|
181
182
|
});
|
|
182
183
|
/**
|
|
183
184
|
* Sends Announcement to add voicea to the meeting
|
|
@@ -200,7 +201,7 @@ var VoiceaChannel = exports.VoiceaChannel = /*#__PURE__*/function (_WebexPlugin)
|
|
|
200
201
|
version: 'v2'
|
|
201
202
|
},
|
|
202
203
|
eventType: 'relay.event',
|
|
203
|
-
relayType: _constants.
|
|
204
|
+
relayType: _constants.AIBRIDGE_RELAY_TYPES.VOICEA.CLIENT_ANNOUNCEMENT
|
|
204
205
|
},
|
|
205
206
|
trackingId: "".concat(_webexCore.config.trackingIdPrefix, "_").concat(_uuid.default.v4().toString())
|
|
206
207
|
});
|
|
@@ -224,10 +225,8 @@ var VoiceaChannel = exports.VoiceaChannel = /*#__PURE__*/function (_WebexPlugin)
|
|
|
224
225
|
}
|
|
225
226
|
}
|
|
226
227
|
}).then(function () {
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
function: 'setSpokenLanguage'
|
|
230
|
-
}, _constants.EVENT_TRIGGERS.SPOKEN_LANGUAGE_UPDATE, {
|
|
228
|
+
// @ts-ignore
|
|
229
|
+
_this.trigger(_constants.EVENT_TRIGGERS.SPOKEN_LANGUAGE_UPDATE, {
|
|
231
230
|
languageCode: languageCode
|
|
232
231
|
});
|
|
233
232
|
})
|
|
@@ -258,7 +257,7 @@ var VoiceaChannel = exports.VoiceaChannel = /*#__PURE__*/function (_WebexPlugin)
|
|
|
258
257
|
id: _uuid.default.v4()
|
|
259
258
|
},
|
|
260
259
|
eventType: 'relay.event',
|
|
261
|
-
relayType: _constants.
|
|
260
|
+
relayType: _constants.AIBRIDGE_RELAY_TYPES.VOICEA.TRANSLATION_REQUEST
|
|
262
261
|
},
|
|
263
262
|
trackingId: "".concat(_webexCore.config.trackingIdPrefix, "_").concat(_uuid.default.v4().toString())
|
|
264
263
|
});
|
|
@@ -288,10 +287,8 @@ var VoiceaChannel = exports.VoiceaChannel = /*#__PURE__*/function (_WebexPlugin)
|
|
|
288
287
|
url: "".concat(_this.webex.internal.llm.getLocusUrl(), "/controls/"),
|
|
289
288
|
body: body
|
|
290
289
|
}).then(function () {
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
function: 'turnOnCaptions'
|
|
294
|
-
}, _constants.EVENT_TRIGGERS.CAPTIONS_TURNED_ON);
|
|
290
|
+
// @ts-ignore
|
|
291
|
+
_this.trigger(_constants.EVENT_TRIGGERS.CAPTIONS_TURNED_ON);
|
|
295
292
|
_this.areCaptionsEnabled = true;
|
|
296
293
|
_this.captionStatus = _constants.TURN_ON_CAPTION_STATUS.ENABLED;
|
|
297
294
|
_this.announce();
|
|
@@ -384,6 +381,26 @@ var VoiceaChannel = exports.VoiceaChannel = /*#__PURE__*/function (_WebexPlugin)
|
|
|
384
381
|
return undefined;
|
|
385
382
|
});
|
|
386
383
|
});
|
|
384
|
+
/**
|
|
385
|
+
* Toggle turn on manual caption
|
|
386
|
+
* @param {bool} enable if true manual caption is turned on
|
|
387
|
+
* @returns {Promise}
|
|
388
|
+
*/
|
|
389
|
+
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "toggleManualCaption", function (enable) {
|
|
390
|
+
// @ts-ignore
|
|
391
|
+
return _this.request({
|
|
392
|
+
method: 'PUT',
|
|
393
|
+
// @ts-ignore
|
|
394
|
+
url: "".concat(_this.webex.internal.llm.getLocusUrl(), "/controls/"),
|
|
395
|
+
body: {
|
|
396
|
+
manualCaption: {
|
|
397
|
+
enable: enable
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
}).then(function () {
|
|
401
|
+
return undefined;
|
|
402
|
+
});
|
|
403
|
+
});
|
|
387
404
|
/**
|
|
388
405
|
* get caption status
|
|
389
406
|
* @returns {string}
|
package/dist/voicea.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_uuid","_interopRequireDefault","require","_pluginMeetings","_webexCore","_constants","_utils","_createSuper","Derived","hasNativeReflectConstruct","_isNativeReflectConstruct","_createSuperInternal","Super","_getPrototypeOf2","default","result","NewTarget","constructor","_Reflect$construct","arguments","apply","_possibleConstructorReturn2","Reflect","sham","Proxy","Boolean","prototype","valueOf","call","e","VoiceaChannel","exports","_WebexPlugin","_inherits2","_super","_this","_classCallCheck2","_len","length","args","Array","_key","concat","_defineProperty2","_assertThisInitialized2","VOICEA","seqNum","sequenceNumber","data","relayType","VOICEA_RELAY_TYPES","ANNOUNCEMENT","vmcDeviceId","headers","from","announceStatus","ANNOUNCE_STATUS","JOINED","processAnnouncementMessage","voiceaPayload","TRANSLATION_RESPONSE","processCaptionLanguageResponse","TRANSCRIPTION","processTranscription","type","TRANSCRIPTION_TYPE","TRANSCRIPT_INTERIM_RESULTS","Trigger","trigger","file","function","EVENT_TRIGGERS","NEW_CAPTION","isFinal","transcriptId","transcript_id","transcripts","TRANSCRIPT_FINAL_RESULT","translations","transcript","csis","text","transcriptLanguageCode","transcript_language_code","timestamp","millisToMinutesAndSeconds","end_millis","HIGHLIGHT_CREATED","highlight","highlightId","highlight_id","highlightLabel","highlight_label","highlightSource","highlight_source","EVA_THANKS","EVA_COMMAND","isListening","command_response","EVA_WAKE","EVA_CANCEL","statusCode","CAPTION_LANGUAGE_UPDATE","errorCode","errorMessage","message","_voiceaPayload$transl","_voiceaPayload$transl2","_voiceaPayload$transl3","_voiceaPayload$transl4","_voiceaPayload$ASR$sp","_voiceaPayload$ASR","voiceaLanguageOptions","captionLanguages","translation","allowed_languages","maxLanguages","max_languages","spokenLanguages","ASR","spoken_languages","VOICEA_ANNOUNCEMENT","JOINING","listenToEvents","webex","internal","llm","socket","send","id","recipients","route","getBinding","clientPayload","version","eventType","CLIENT_ANNOUNCEMENT","trackingId","config","trackingIdPrefix","uuid","v4","toString","languageCode","request","method","url","getLocusUrl","body","transcribe","spokenLanguage","then","SPOKEN_LANGUAGE_UPDATE","isConnected","to","translationLanguage","TRANSLATION_REQUEST","captionStatus","TURN_ON_CAPTION_STATUS","SENDING","caption","CAPTIONS_TURNED_ON","areCaptionsEnabled","ENABLED","announce","catch","IDLE","Error","includes","isAnnounceProcessing","sendAnnouncement","_ref","_asyncToGenerator2","_regenerator","mark","_callee","wrap","_callee$","_context","prev","next","isCaptionProcessing","abrupt","undefined","requestTurnOnCaptions","stop","_x","activate","transcribing","turnOnCaptions","_createClass2","key","value","hasSubscribedToEvents","on","eventProcessor","deregisterEvents","off","WebexPlugin","_default"],"sources":["voicea.ts"],"sourcesContent":["import uuid from 'uuid';\nimport {TriggerProxy as Trigger} from '@webex/plugin-meetings';\nimport {WebexPlugin, config} from '@webex/webex-core';\n\nimport {\n EVENT_TRIGGERS,\n VOICEA_RELAY_TYPES,\n TRANSCRIPTION_TYPE,\n VOICEA,\n ANNOUNCE_STATUS,\n TURN_ON_CAPTION_STATUS,\n} from './constants';\n// eslint-disable-next-line no-unused-vars\nimport {\n AnnouncementPayload,\n CaptionLanguageResponse,\n TranscriptionResponse,\n IVoiceaChannel,\n} from './voicea.types';\nimport {millisToMinutesAndSeconds} from './utils';\n\n/**\n * @description VoiceaChannel to hold single instance of LLM\n * @export\n * @class VoiceaChannel\n */\nexport class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {\n namespace = VOICEA;\n\n private seqNum: number;\n\n private areCaptionsEnabled: boolean;\n\n private hasSubscribedToEvents = false;\n\n private vmcDeviceId?: string;\n\n private announceStatus: string;\n\n private captionStatus: string;\n\n /**\n * @param {Object} e\n * @returns {undefined}\n */\n\n private eventProcessor = (e) => {\n this.seqNum = e.sequenceNumber + 1;\n switch (e.data.relayType) {\n case VOICEA_RELAY_TYPES.ANNOUNCEMENT:\n this.vmcDeviceId = e.headers.from;\n this.announceStatus = ANNOUNCE_STATUS.JOINED;\n this.processAnnouncementMessage(e.data.voiceaPayload);\n break;\n case VOICEA_RELAY_TYPES.TRANSLATION_RESPONSE:\n this.processCaptionLanguageResponse(e.data.voiceaPayload);\n break;\n case VOICEA_RELAY_TYPES.TRANSCRIPTION:\n this.processTranscription(e.data.voiceaPayload);\n break;\n default:\n break;\n }\n };\n\n /**\n * Listen to websocket messages\n * @returns {undefined}\n */\n private listenToEvents() {\n if (!this.hasSubscribedToEvents) {\n // @ts-ignore\n this.webex.internal.llm.on('event:relay.event', this.eventProcessor);\n this.hasSubscribedToEvents = true;\n }\n }\n\n /**\n * Listen to websocket messages\n * @returns {void}\n */\n public deregisterEvents() {\n this.areCaptionsEnabled = false;\n this.vmcDeviceId = undefined;\n // @ts-ignore\n this.webex.internal.llm.off('event:relay.event', this.eventProcessor);\n this.hasSubscribedToEvents = false;\n this.announceStatus = ANNOUNCE_STATUS.IDLE;\n this.captionStatus = TURN_ON_CAPTION_STATUS.IDLE;\n }\n\n /**\n * Initializes Voicea plugin\n * @param {any} args\n */\n constructor(...args) {\n super(...args);\n this.seqNum = 1;\n this.areCaptionsEnabled = false;\n this.vmcDeviceId = undefined;\n this.announceStatus = ANNOUNCE_STATUS.IDLE;\n this.captionStatus = TURN_ON_CAPTION_STATUS.IDLE;\n }\n\n /**\n * Process Transcript and send alert\n * @param {TranscriptionResponse} voiceaPayload\n * @returns {void}\n */\n private processTranscription = (voiceaPayload: TranscriptionResponse): void => {\n switch (voiceaPayload.type) {\n case TRANSCRIPTION_TYPE.TRANSCRIPT_INTERIM_RESULTS:\n Trigger.trigger(\n this,\n {\n file: 'voicea',\n function: 'processTranscription',\n },\n EVENT_TRIGGERS.NEW_CAPTION,\n {\n isFinal: false,\n transcriptId: voiceaPayload.transcript_id,\n transcripts: voiceaPayload.transcripts,\n }\n );\n break;\n\n case TRANSCRIPTION_TYPE.TRANSCRIPT_FINAL_RESULT:\n Trigger.trigger(\n this,\n {\n file: 'voicea',\n function: 'processTranscription',\n },\n EVENT_TRIGGERS.NEW_CAPTION,\n {\n isFinal: true,\n transcriptId: voiceaPayload.transcript_id,\n translations: voiceaPayload.translations,\n transcript: {\n csis: voiceaPayload.csis,\n text: voiceaPayload.transcript.text,\n transcriptLanguageCode: voiceaPayload.transcript.transcript_language_code,\n },\n timestamp: millisToMinutesAndSeconds(voiceaPayload.transcript.end_millis),\n }\n );\n break;\n\n case TRANSCRIPTION_TYPE.HIGHLIGHT_CREATED:\n Trigger.trigger(\n this,\n {\n file: 'voicea',\n function: 'processTranscription',\n },\n EVENT_TRIGGERS.HIGHLIGHT_CREATED,\n {\n csis: voiceaPayload.highlight.csis,\n highlightId: voiceaPayload.highlight.highlight_id,\n text: voiceaPayload.highlight.transcript,\n highlightLabel: voiceaPayload.highlight.highlight_label,\n highlightSource: voiceaPayload.highlight.highlight_source,\n timestamp: millisToMinutesAndSeconds(voiceaPayload.highlight.end_millis),\n }\n );\n break;\n\n case TRANSCRIPTION_TYPE.EVA_THANKS:\n Trigger.trigger(\n this,\n {\n file: 'voicea',\n function: 'processTranscription',\n },\n EVENT_TRIGGERS.EVA_COMMAND,\n {\n isListening: false,\n text: voiceaPayload.command_response,\n }\n );\n break;\n\n case TRANSCRIPTION_TYPE.EVA_WAKE:\n case TRANSCRIPTION_TYPE.EVA_CANCEL:\n Trigger.trigger(\n this,\n {\n file: 'voicea',\n function: 'processTranscription',\n },\n EVENT_TRIGGERS.EVA_COMMAND,\n {\n isListening: voiceaPayload.type === TRANSCRIPTION_TYPE.EVA_WAKE,\n }\n );\n break;\n\n default:\n break;\n }\n };\n\n /**\n * Processes Caption Language Response\n * @param {CaptionLanguageResponse} voiceaPayload\n * @returns {void}\n */\n private processCaptionLanguageResponse = (voiceaPayload: CaptionLanguageResponse): void => {\n if (voiceaPayload.statusCode === 200) {\n Trigger.trigger(\n this,\n {\n file: 'voicea',\n function: 'processCaptionLanguageResponse',\n },\n EVENT_TRIGGERS.CAPTION_LANGUAGE_UPDATE,\n {statusCode: 200}\n );\n } else {\n Trigger.trigger(\n this,\n {\n file: 'voicea',\n function: 'processCaptionLanguageResponse',\n },\n EVENT_TRIGGERS.CAPTION_LANGUAGE_UPDATE,\n {statusCode: voiceaPayload.errorCode, errorMessage: voiceaPayload.message}\n );\n }\n };\n\n /**\n * processes voicea announcement response and triggers event\n * @param {Object} voiceaPayload\n * @returns {void}\n */\n private processAnnouncementMessage = (voiceaPayload: AnnouncementPayload): void => {\n const voiceaLanguageOptions = {\n captionLanguages: voiceaPayload?.translation?.allowed_languages ?? [],\n maxLanguages: voiceaPayload?.translation?.max_languages ?? 0,\n spokenLanguages: voiceaPayload?.ASR?.spoken_languages ?? [],\n };\n\n Trigger.trigger(\n this,\n {\n file: 'voicea',\n function: 'processAnnouncementMessage',\n },\n EVENT_TRIGGERS.VOICEA_ANNOUNCEMENT,\n voiceaLanguageOptions\n );\n };\n\n /**\n * Sends Announcement to add voicea to the meeting\n * @returns {void}\n */\n private sendAnnouncement = (): void => {\n this.announceStatus = ANNOUNCE_STATUS.JOINING;\n this.listenToEvents();\n // @ts-ignore\n this.webex.internal.llm.socket.send({\n id: `${this.seqNum}`,\n type: 'publishRequest',\n recipients: {\n // @ts-ignore\n route: this.webex.internal.llm.getBinding(),\n },\n headers: {},\n data: {\n clientPayload: {\n version: 'v2',\n },\n eventType: 'relay.event',\n relayType: VOICEA_RELAY_TYPES.CLIENT_ANNOUNCEMENT,\n },\n trackingId: `${config.trackingIdPrefix}_${uuid.v4().toString()}`,\n });\n this.seqNum += 1;\n };\n\n /**\n * Set Spoken Language for the meeting\n * @param {string} languageCode\n * @returns {Promise}\n */\n public setSpokenLanguage = (languageCode: string): Promise<void> =>\n // @ts-ignore\n this.request({\n method: 'PUT',\n // @ts-ignore\n url: `${this.webex.internal.llm.getLocusUrl()}/controls/`,\n body: {\n transcribe: {\n spokenLanguage: languageCode,\n },\n },\n }).then(() => {\n Trigger.trigger(\n this,\n {\n file: 'voicea',\n function: 'setSpokenLanguage',\n },\n EVENT_TRIGGERS.SPOKEN_LANGUAGE_UPDATE,\n {languageCode}\n );\n });\n\n /**\n * Request Language translation\n * @param {string} languageCode\n * @returns {void}\n */\n public requestLanguage = (languageCode: string): void => {\n // @ts-ignore\n if (!this.webex.internal.llm.isConnected()) return;\n // @ts-ignore\n this.webex.internal.llm.socket.send({\n id: `${this.seqNum}`,\n type: 'publishRequest',\n recipients: {\n // @ts-ignore\n route: this.webex.internal.llm.getBinding(),\n },\n headers: {\n to: this.vmcDeviceId,\n },\n data: {\n clientPayload: {\n translationLanguage: languageCode,\n id: uuid.v4(),\n },\n eventType: 'relay.event',\n relayType: VOICEA_RELAY_TYPES.TRANSLATION_REQUEST,\n },\n trackingId: `${config.trackingIdPrefix}_${uuid.v4().toString()}`,\n });\n this.seqNum += 1;\n };\n\n /**\n * request turn on Captions\n * @param {string} [languageCode] - Optional Parameter for spoken language code. Defaults to English\n * @returns {Promise}\n */\n private requestTurnOnCaptions = (languageCode?): undefined | Promise<void> => {\n this.captionStatus = TURN_ON_CAPTION_STATUS.SENDING;\n\n // only set the spoken language if it is provided\n const body = {\n transcribe: {caption: true},\n languageCode,\n };\n\n // @ts-ignore\n // eslint-disable-next-line newline-before-return\n return this.request({\n method: 'PUT',\n // @ts-ignore\n url: `${this.webex.internal.llm.getLocusUrl()}/controls/`,\n body,\n })\n .then(() => {\n Trigger.trigger(\n this,\n {\n file: 'voicea',\n function: 'turnOnCaptions',\n },\n EVENT_TRIGGERS.CAPTIONS_TURNED_ON\n );\n this.areCaptionsEnabled = true;\n this.captionStatus = TURN_ON_CAPTION_STATUS.ENABLED;\n this.announce();\n })\n .catch(() => {\n this.captionStatus = TURN_ON_CAPTION_STATUS.IDLE;\n throw new Error('turn on captions fail');\n });\n };\n\n /**\n * is announce processing\n * @returns {boolean}\n */\n private isAnnounceProcessing = () =>\n [ANNOUNCE_STATUS.JOINING, ANNOUNCE_STATUS.JOINED].includes(this.announceStatus);\n\n /**\n * announce to voicea data chanel\n * @returns {void}\n */\n public announce = () => {\n if (this.isAnnounceProcessing()) return;\n // @ts-ignore\n if (!this.webex.internal.llm.isConnected()) {\n throw new Error('voicea can not announce before llm connected');\n }\n this.sendAnnouncement();\n };\n\n /**\n * is turn on caption processing\n * @returns {boolean}\n */\n private isCaptionProcessing = () =>\n [TURN_ON_CAPTION_STATUS.SENDING, TURN_ON_CAPTION_STATUS.ENABLED].includes(this.captionStatus);\n\n /**\n * Turn on Captions\n * @param {string} [spokenLanguage] - Optional Spoken language code\n * @returns {Promise}\n */\n public turnOnCaptions = async (spokenLanguage?): undefined | Promise<void> => {\n if (this.isCaptionProcessing()) return undefined;\n // @ts-ignore\n if (!this.webex.internal.llm.isConnected()) {\n throw new Error('can not turn on captions before llm connected');\n }\n\n return this.requestTurnOnCaptions(spokenLanguage);\n };\n\n /**\n * Toggle transcribing for highlights\n * @param {bool} activate if true transcribing is turned on\n * @param {string} spokenLanguage language code for spoken language\n * @returns {Promise}\n */\n public toggleTranscribing = (\n activate: boolean,\n spokenLanguage?: string\n ): undefined | Promise<void> => {\n // @ts-ignore\n return this.request({\n method: 'PUT',\n // @ts-ignore\n url: `${this.webex.internal.llm.getLocusUrl()}/controls/`,\n body: {\n transcribe: {\n transcribing: activate,\n },\n spokenLanguage,\n },\n }).then((): undefined | Promise<void> => {\n if (activate && !this.areCaptionsEnabled) {\n return this.turnOnCaptions(spokenLanguage);\n }\n\n return undefined;\n });\n };\n\n /**\n * get caption status\n * @returns {string}\n */\n public getCaptionStatus = () => this.captionStatus;\n\n /**\n * get announce status\n * @returns {string}\n */\n public getAnnounceStatus = () => this.announceStatus;\n}\n\nexport default VoiceaChannel;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["_uuid","_interopRequireDefault","require","_webexCore","_constants","_utils","_createSuper","Derived","hasNativeReflectConstruct","_isNativeReflectConstruct","_createSuperInternal","Super","_getPrototypeOf2","default","result","NewTarget","constructor","_Reflect$construct","arguments","apply","_possibleConstructorReturn2","Reflect","sham","Proxy","Boolean","prototype","valueOf","call","e","VoiceaChannel","exports","_WebexPlugin","_inherits2","_super","_this","_classCallCheck2","_len","length","args","Array","_key","concat","_defineProperty2","_assertThisInitialized2","VOICEA","seqNum","sequenceNumber","data","relayType","AIBRIDGE_RELAY_TYPES","ANNOUNCEMENT","vmcDeviceId","headers","from","announceStatus","ANNOUNCE_STATUS","JOINED","processAnnouncementMessage","voiceaPayload","TRANSLATION_RESPONSE","processCaptionLanguageResponse","TRANSCRIPTION","processTranscription","MANUAL","processManualTranscription","transcriptPayload","type","TRANSCRIPTION_TYPE","MANUAL_CAPTION_FINAL_RESULT","MANUAL_CAPTION_INTERIM_RESULTS","trigger","EVENT_TRIGGERS","NEW_MANUAL_CAPTION","isFinal","transcriptId","id","transcripts","TRANSCRIPT_INTERIM_RESULTS","NEW_CAPTION","transcript_id","TRANSCRIPT_FINAL_RESULT","HIGHLIGHT_CREATED","csis","highlight","highlightId","highlight_id","text","transcript","highlightLabel","highlight_label","highlightSource","highlight_source","timestamp","millisToMinutesAndSeconds","end_millis","EVA_THANKS","EVA_COMMAND","isListening","command_response","EVA_WAKE","EVA_CANCEL","statusCode","CAPTION_LANGUAGE_UPDATE","errorCode","errorMessage","message","_voiceaPayload$transl","_voiceaPayload$transl2","_voiceaPayload$transl3","_voiceaPayload$transl4","_voiceaPayload$ASR$sp","_voiceaPayload$ASR","voiceaLanguageOptions","captionLanguages","translation","allowed_languages","maxLanguages","max_languages","spokenLanguages","ASR","spoken_languages","VOICEA_ANNOUNCEMENT","JOINING","listenToEvents","webex","internal","llm","socket","send","recipients","route","getBinding","clientPayload","version","eventType","CLIENT_ANNOUNCEMENT","trackingId","config","trackingIdPrefix","uuid","v4","toString","languageCode","request","method","url","getLocusUrl","body","transcribe","spokenLanguage","then","SPOKEN_LANGUAGE_UPDATE","isConnected","to","translationLanguage","TRANSLATION_REQUEST","captionStatus","TURN_ON_CAPTION_STATUS","SENDING","caption","CAPTIONS_TURNED_ON","areCaptionsEnabled","ENABLED","announce","catch","IDLE","Error","includes","isAnnounceProcessing","sendAnnouncement","_ref","_asyncToGenerator2","_regenerator","mark","_callee","wrap","_callee$","_context","prev","next","isCaptionProcessing","abrupt","undefined","requestTurnOnCaptions","stop","_x","activate","transcribing","turnOnCaptions","enable","manualCaption","_createClass2","key","value","hasSubscribedToEvents","on","eventProcessor","deregisterEvents","off","WebexPlugin","_default"],"sources":["voicea.ts"],"sourcesContent":["import uuid from 'uuid';\nimport {WebexPlugin, config} from '@webex/webex-core';\n\nimport {\n EVENT_TRIGGERS,\n AIBRIDGE_RELAY_TYPES,\n TRANSCRIPTION_TYPE,\n VOICEA,\n ANNOUNCE_STATUS,\n TURN_ON_CAPTION_STATUS,\n} from './constants';\n// eslint-disable-next-line no-unused-vars\nimport {\n AnnouncementPayload,\n CaptionLanguageResponse,\n TranscriptionResponse,\n IVoiceaChannel,\n} from './voicea.types';\nimport {millisToMinutesAndSeconds} from './utils';\n\n/**\n * @description VoiceaChannel to hold single instance of LLM\n * @export\n * @class VoiceaChannel\n */\nexport class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {\n namespace = VOICEA;\n\n private seqNum: number;\n\n private areCaptionsEnabled: boolean;\n\n private hasSubscribedToEvents = false;\n\n private vmcDeviceId?: string;\n\n private announceStatus: string;\n\n private captionStatus: string;\n\n /**\n * @param {Object} e\n * @returns {undefined}\n */\n\n private eventProcessor = (e) => {\n this.seqNum = e.sequenceNumber + 1;\n switch (e.data.relayType) {\n case AIBRIDGE_RELAY_TYPES.VOICEA.ANNOUNCEMENT:\n this.vmcDeviceId = e.headers.from;\n this.announceStatus = ANNOUNCE_STATUS.JOINED;\n this.processAnnouncementMessage(e.data.voiceaPayload);\n break;\n case AIBRIDGE_RELAY_TYPES.VOICEA.TRANSLATION_RESPONSE:\n this.processCaptionLanguageResponse(e.data.voiceaPayload);\n break;\n case AIBRIDGE_RELAY_TYPES.VOICEA.TRANSCRIPTION:\n this.processTranscription(e.data.voiceaPayload);\n break;\n case AIBRIDGE_RELAY_TYPES.MANUAL.TRANSCRIPTION:\n this.processManualTranscription(e.data.transcriptPayload);\n break;\n default:\n break;\n }\n };\n\n /**\n * Listen to websocket messages\n * @returns {undefined}\n */\n private listenToEvents() {\n if (!this.hasSubscribedToEvents) {\n // @ts-ignore\n this.webex.internal.llm.on('event:relay.event', this.eventProcessor);\n this.hasSubscribedToEvents = true;\n }\n }\n\n /**\n * Listen to websocket messages\n * @returns {void}\n */\n public deregisterEvents() {\n this.areCaptionsEnabled = false;\n this.vmcDeviceId = undefined;\n // @ts-ignore\n this.webex.internal.llm.off('event:relay.event', this.eventProcessor);\n this.hasSubscribedToEvents = false;\n this.announceStatus = ANNOUNCE_STATUS.IDLE;\n this.captionStatus = TURN_ON_CAPTION_STATUS.IDLE;\n }\n\n /**\n * Initializes Voicea plugin\n * @param {any} args\n */\n constructor(...args) {\n super(...args);\n this.seqNum = 1;\n this.areCaptionsEnabled = false;\n this.vmcDeviceId = undefined;\n this.announceStatus = ANNOUNCE_STATUS.IDLE;\n this.captionStatus = TURN_ON_CAPTION_STATUS.IDLE;\n }\n\n /**\n * Process manual Transcript and send alert\n * @param {TranscriptionResponse} transcriptPayload\n * @returns {void}\n */\n private processManualTranscription = (transcriptPayload: TranscriptionResponse): void => {\n switch (transcriptPayload.type) {\n case TRANSCRIPTION_TYPE.MANUAL_CAPTION_FINAL_RESULT:\n case TRANSCRIPTION_TYPE.MANUAL_CAPTION_INTERIM_RESULTS:\n // @ts-ignore\n this.trigger(EVENT_TRIGGERS.NEW_MANUAL_CAPTION, {\n isFinal: transcriptPayload.type === TRANSCRIPTION_TYPE.MANUAL_CAPTION_FINAL_RESULT,\n transcriptId: transcriptPayload.id,\n transcripts: transcriptPayload.transcripts,\n });\n break;\n\n default:\n break;\n }\n };\n\n /**\n * Process Transcript and send alert\n * @param {TranscriptionResponse} voiceaPayload\n * @returns {void}\n */\n private processTranscription = (voiceaPayload: TranscriptionResponse): void => {\n switch (voiceaPayload.type) {\n case TRANSCRIPTION_TYPE.TRANSCRIPT_INTERIM_RESULTS:\n // @ts-ignore\n this.trigger(EVENT_TRIGGERS.NEW_CAPTION, {\n isFinal: false,\n transcriptId: voiceaPayload.transcript_id,\n transcripts: voiceaPayload.transcripts,\n });\n break;\n\n case TRANSCRIPTION_TYPE.TRANSCRIPT_FINAL_RESULT:\n // @ts-ignore\n this.trigger(EVENT_TRIGGERS.NEW_CAPTION, {\n isFinal: true,\n transcriptId: voiceaPayload.transcript_id,\n transcripts: voiceaPayload.transcripts,\n });\n break;\n\n case TRANSCRIPTION_TYPE.HIGHLIGHT_CREATED:\n // @ts-ignore\n this.trigger(EVENT_TRIGGERS.HIGHLIGHT_CREATED, {\n csis: voiceaPayload.highlight.csis,\n highlightId: voiceaPayload.highlight.highlight_id,\n text: voiceaPayload.highlight.transcript,\n highlightLabel: voiceaPayload.highlight.highlight_label,\n highlightSource: voiceaPayload.highlight.highlight_source,\n timestamp: millisToMinutesAndSeconds(voiceaPayload.highlight.end_millis),\n });\n break;\n\n case TRANSCRIPTION_TYPE.EVA_THANKS:\n // @ts-ignore\n this.trigger(EVENT_TRIGGERS.EVA_COMMAND, {\n isListening: false,\n text: voiceaPayload.command_response,\n });\n break;\n\n case TRANSCRIPTION_TYPE.EVA_WAKE:\n case TRANSCRIPTION_TYPE.EVA_CANCEL:\n // @ts-ignore\n this.trigger(EVENT_TRIGGERS.EVA_COMMAND, {\n isListening: voiceaPayload.type === TRANSCRIPTION_TYPE.EVA_WAKE,\n });\n break;\n\n default:\n break;\n }\n };\n\n /**\n * Processes Caption Language Response\n * @param {CaptionLanguageResponse} voiceaPayload\n * @returns {void}\n */\n private processCaptionLanguageResponse = (voiceaPayload: CaptionLanguageResponse): void => {\n if (voiceaPayload.statusCode === 200) {\n // @ts-ignore\n this.trigger(EVENT_TRIGGERS.CAPTION_LANGUAGE_UPDATE, {statusCode: 200});\n } else {\n // @ts-ignore\n this.trigger(EVENT_TRIGGERS.CAPTION_LANGUAGE_UPDATE, {\n statusCode: voiceaPayload.errorCode,\n errorMessage: voiceaPayload.message,\n });\n }\n };\n\n /**\n * processes voicea announcement response and triggers event\n * @param {Object} voiceaPayload\n * @returns {void}\n */\n private processAnnouncementMessage = (voiceaPayload: AnnouncementPayload): void => {\n const voiceaLanguageOptions = {\n captionLanguages: voiceaPayload?.translation?.allowed_languages ?? [],\n maxLanguages: voiceaPayload?.translation?.max_languages ?? 0,\n spokenLanguages: voiceaPayload?.ASR?.spoken_languages ?? [],\n };\n\n // @ts-ignore\n this.trigger(EVENT_TRIGGERS.VOICEA_ANNOUNCEMENT, voiceaLanguageOptions);\n };\n\n /**\n * Sends Announcement to add voicea to the meeting\n * @returns {void}\n */\n private sendAnnouncement = (): void => {\n this.announceStatus = ANNOUNCE_STATUS.JOINING;\n this.listenToEvents();\n // @ts-ignore\n this.webex.internal.llm.socket.send({\n id: `${this.seqNum}`,\n type: 'publishRequest',\n recipients: {\n // @ts-ignore\n route: this.webex.internal.llm.getBinding(),\n },\n headers: {},\n data: {\n clientPayload: {\n version: 'v2',\n },\n eventType: 'relay.event',\n relayType: AIBRIDGE_RELAY_TYPES.VOICEA.CLIENT_ANNOUNCEMENT,\n },\n trackingId: `${config.trackingIdPrefix}_${uuid.v4().toString()}`,\n });\n this.seqNum += 1;\n };\n\n /**\n * Set Spoken Language for the meeting\n * @param {string} languageCode\n * @returns {Promise}\n */\n public setSpokenLanguage = (languageCode: string): Promise<void> =>\n // @ts-ignore\n this.request({\n method: 'PUT',\n // @ts-ignore\n url: `${this.webex.internal.llm.getLocusUrl()}/controls/`,\n body: {\n transcribe: {\n spokenLanguage: languageCode,\n },\n },\n }).then(() => {\n // @ts-ignore\n this.trigger(EVENT_TRIGGERS.SPOKEN_LANGUAGE_UPDATE, {languageCode});\n });\n\n /**\n * Request Language translation\n * @param {string} languageCode\n * @returns {void}\n */\n public requestLanguage = (languageCode: string): void => {\n // @ts-ignore\n if (!this.webex.internal.llm.isConnected()) return;\n // @ts-ignore\n this.webex.internal.llm.socket.send({\n id: `${this.seqNum}`,\n type: 'publishRequest',\n recipients: {\n // @ts-ignore\n route: this.webex.internal.llm.getBinding(),\n },\n headers: {\n to: this.vmcDeviceId,\n },\n data: {\n clientPayload: {\n translationLanguage: languageCode,\n id: uuid.v4(),\n },\n eventType: 'relay.event',\n relayType: AIBRIDGE_RELAY_TYPES.VOICEA.TRANSLATION_REQUEST,\n },\n trackingId: `${config.trackingIdPrefix}_${uuid.v4().toString()}`,\n });\n this.seqNum += 1;\n };\n\n /**\n * request turn on Captions\n * @param {string} [languageCode] - Optional Parameter for spoken language code. Defaults to English\n * @returns {Promise}\n */\n private requestTurnOnCaptions = (languageCode?): undefined | Promise<void> => {\n this.captionStatus = TURN_ON_CAPTION_STATUS.SENDING;\n\n // only set the spoken language if it is provided\n const body = {\n transcribe: {caption: true},\n languageCode,\n };\n\n // @ts-ignore\n // eslint-disable-next-line newline-before-return\n return this.request({\n method: 'PUT',\n // @ts-ignore\n url: `${this.webex.internal.llm.getLocusUrl()}/controls/`,\n body,\n })\n .then(() => {\n // @ts-ignore\n this.trigger(EVENT_TRIGGERS.CAPTIONS_TURNED_ON);\n\n this.areCaptionsEnabled = true;\n this.captionStatus = TURN_ON_CAPTION_STATUS.ENABLED;\n this.announce();\n })\n .catch(() => {\n this.captionStatus = TURN_ON_CAPTION_STATUS.IDLE;\n throw new Error('turn on captions fail');\n });\n };\n\n /**\n * is announce processing\n * @returns {boolean}\n */\n private isAnnounceProcessing = () =>\n [ANNOUNCE_STATUS.JOINING, ANNOUNCE_STATUS.JOINED].includes(this.announceStatus);\n\n /**\n * announce to voicea data chanel\n * @returns {void}\n */\n public announce = () => {\n if (this.isAnnounceProcessing()) return;\n // @ts-ignore\n if (!this.webex.internal.llm.isConnected()) {\n throw new Error('voicea can not announce before llm connected');\n }\n this.sendAnnouncement();\n };\n\n /**\n * is turn on caption processing\n * @returns {boolean}\n */\n private isCaptionProcessing = () =>\n [TURN_ON_CAPTION_STATUS.SENDING, TURN_ON_CAPTION_STATUS.ENABLED].includes(this.captionStatus);\n\n /**\n * Turn on Captions\n * @param {string} [spokenLanguage] - Optional Spoken language code\n * @returns {Promise}\n */\n public turnOnCaptions = async (spokenLanguage?): undefined | Promise<void> => {\n if (this.isCaptionProcessing()) return undefined;\n // @ts-ignore\n if (!this.webex.internal.llm.isConnected()) {\n throw new Error('can not turn on captions before llm connected');\n }\n\n return this.requestTurnOnCaptions(spokenLanguage);\n };\n\n /**\n * Toggle transcribing for highlights\n * @param {bool} activate if true transcribing is turned on\n * @param {string} spokenLanguage language code for spoken language\n * @returns {Promise}\n */\n public toggleTranscribing = (\n activate: boolean,\n spokenLanguage?: string\n ): undefined | Promise<void> => {\n // @ts-ignore\n return this.request({\n method: 'PUT',\n // @ts-ignore\n url: `${this.webex.internal.llm.getLocusUrl()}/controls/`,\n body: {\n transcribe: {\n transcribing: activate,\n },\n spokenLanguage,\n },\n }).then((): undefined | Promise<void> => {\n if (activate && !this.areCaptionsEnabled) {\n return this.turnOnCaptions(spokenLanguage);\n }\n\n return undefined;\n });\n };\n\n /**\n * Toggle turn on manual caption\n * @param {bool} enable if true manual caption is turned on\n * @returns {Promise}\n */\n public toggleManualCaption = (enable: boolean): undefined | Promise<void> => {\n // @ts-ignore\n return this.request({\n method: 'PUT',\n // @ts-ignore\n url: `${this.webex.internal.llm.getLocusUrl()}/controls/`,\n body: {\n manualCaption: {\n enable,\n },\n },\n }).then((): undefined | Promise<void> => {\n return undefined;\n });\n };\n\n /**\n * get caption status\n * @returns {string}\n */\n public getCaptionStatus = () => this.captionStatus;\n\n /**\n * get announce status\n * @returns {string}\n */\n public getAnnounceStatus = () => this.announceStatus;\n}\n\nexport default VoiceaChannel;\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA,IAAAA,KAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,UAAA,GAAAD,OAAA;AAEA,IAAAE,UAAA,GAAAF,OAAA;AAeA,IAAAG,MAAA,GAAAH,OAAA;AAAkD,SAAAI,aAAAC,OAAA,QAAAC,yBAAA,GAAAC,yBAAA,oBAAAC,qBAAA,QAAAC,KAAA,OAAAC,gBAAA,CAAAC,OAAA,EAAAN,OAAA,GAAAO,MAAA,MAAAN,yBAAA,QAAAO,SAAA,OAAAH,gBAAA,CAAAC,OAAA,QAAAG,WAAA,EAAAF,MAAA,GAAAG,kBAAA,CAAAN,KAAA,EAAAO,SAAA,EAAAH,SAAA,YAAAD,MAAA,GAAAH,KAAA,CAAAQ,KAAA,OAAAD,SAAA,gBAAAE,2BAAA,CAAAP,OAAA,QAAAC,MAAA;AAAA,SAAAL,0BAAA,eAAAY,OAAA,qBAAAJ,kBAAA,oBAAAA,kBAAA,CAAAK,IAAA,2BAAAC,KAAA,oCAAAC,OAAA,CAAAC,SAAA,CAAAC,OAAA,CAAAC,IAAA,CAAAV,kBAAA,CAAAO,OAAA,8CAAAI,CAAA,sBAPlD;AASA;AACA;AACA;AACA;AACA;AAJA,IAKaC,aAAa,GAAAC,OAAA,CAAAD,aAAA,0BAAAE,YAAA;EAAA,IAAAC,UAAA,CAAAnB,OAAA,EAAAgB,aAAA,EAAAE,YAAA;EAAA,IAAAE,MAAA,GAAA3B,YAAA,CAAAuB,aAAA;EAoExB;AACF;AACA;AACA;EACE,SAAAA,cAAA,EAAqB;IAAA,IAAAK,KAAA;IAAA,IAAAC,gBAAA,CAAAtB,OAAA,QAAAgB,aAAA;IAAA,SAAAO,IAAA,GAAAlB,SAAA,CAAAmB,MAAA,EAANC,IAAI,OAAAC,KAAA,CAAAH,IAAA,GAAAI,IAAA,MAAAA,IAAA,GAAAJ,IAAA,EAAAI,IAAA;MAAJF,IAAI,CAAAE,IAAA,IAAAtB,SAAA,CAAAsB,IAAA;IAAA;IACjBN,KAAA,GAAAD,MAAA,CAAAN,IAAA,CAAAR,KAAA,CAAAc,MAAA,SAAAQ,MAAA,CAASH,IAAI;IAAE,IAAAI,gBAAA,CAAA7B,OAAA,MAAA8B,uBAAA,CAAA9B,OAAA,EAAAqB,KAAA,gBAxELU,iBAAM;IAAA,IAAAF,gBAAA,CAAA7B,OAAA,MAAA8B,uBAAA,CAAA9B,OAAA,EAAAqB,KAAA;IAAA,IAAAQ,gBAAA,CAAA7B,OAAA,MAAA8B,uBAAA,CAAA9B,OAAA,EAAAqB,KAAA;IAAA,IAAAQ,gBAAA,CAAA7B,OAAA,MAAA8B,uBAAA,CAAA9B,OAAA,EAAAqB,KAAA,4BAMc,KAAK;IAAA,IAAAQ,gBAAA,CAAA7B,OAAA,MAAA8B,uBAAA,CAAA9B,OAAA,EAAAqB,KAAA;IAAA,IAAAQ,gBAAA,CAAA7B,OAAA,MAAA8B,uBAAA,CAAA9B,OAAA,EAAAqB,KAAA;IAAA,IAAAQ,gBAAA,CAAA7B,OAAA,MAAA8B,uBAAA,CAAA9B,OAAA,EAAAqB,KAAA;IAQrC;AACF;AACA;AACA;IAHE,IAAAQ,gBAAA,CAAA7B,OAAA,MAAA8B,uBAAA,CAAA9B,OAAA,EAAAqB,KAAA,qBAKyB,UAACN,CAAC,EAAK;MAC9BM,KAAA,CAAKW,MAAM,GAAGjB,CAAC,CAACkB,cAAc,GAAG,CAAC;MAClC,QAAQlB,CAAC,CAACmB,IAAI,CAACC,SAAS;QACtB,KAAKC,+BAAoB,CAACL,MAAM,CAACM,YAAY;UAC3ChB,KAAA,CAAKiB,WAAW,GAAGvB,CAAC,CAACwB,OAAO,CAACC,IAAI;UACjCnB,KAAA,CAAKoB,cAAc,GAAGC,0BAAe,CAACC,MAAM;UAC5CtB,KAAA,CAAKuB,0BAA0B,CAAC7B,CAAC,CAACmB,IAAI,CAACW,aAAa,CAAC;UACrD;QACF,KAAKT,+BAAoB,CAACL,MAAM,CAACe,oBAAoB;UACnDzB,KAAA,CAAK0B,8BAA8B,CAAChC,CAAC,CAACmB,IAAI,CAACW,aAAa,CAAC;UACzD;QACF,KAAKT,+BAAoB,CAACL,MAAM,CAACiB,aAAa;UAC5C3B,KAAA,CAAK4B,oBAAoB,CAAClC,CAAC,CAACmB,IAAI,CAACW,aAAa,CAAC;UAC/C;QACF,KAAKT,+BAAoB,CAACc,MAAM,CAACF,aAAa;UAC5C3B,KAAA,CAAK8B,0BAA0B,CAACpC,CAAC,CAACmB,IAAI,CAACkB,iBAAiB,CAAC;UACzD;QACF;UACE;MACJ;IACF,CAAC;IAyCD;AACF;AACA;AACA;AACA;IAJE,IAAAvB,gBAAA,CAAA7B,OAAA,MAAA8B,uBAAA,CAAA9B,OAAA,EAAAqB,KAAA,iCAKqC,UAAC+B,iBAAwC,EAAW;MACvF,QAAQA,iBAAiB,CAACC,IAAI;QAC5B,KAAKC,6BAAkB,CAACC,2BAA2B;QACnD,KAAKD,6BAAkB,CAACE,8BAA8B;UACpD;UACAnC,KAAA,CAAKoC,OAAO,CAACC,yBAAc,CAACC,kBAAkB,EAAE;YAC9CC,OAAO,EAAER,iBAAiB,CAACC,IAAI,KAAKC,6BAAkB,CAACC,2BAA2B;YAClFM,YAAY,EAAET,iBAAiB,CAACU,EAAE;YAClCC,WAAW,EAAEX,iBAAiB,CAACW;UACjC,CAAC,CAAC;UACF;QAEF;UACE;MACJ;IACF,CAAC;IAED;AACF;AACA;AACA;AACA;IAJE,IAAAlC,gBAAA,CAAA7B,OAAA,MAAA8B,uBAAA,CAAA9B,OAAA,EAAAqB,KAAA,2BAK+B,UAACwB,aAAoC,EAAW;MAC7E,QAAQA,aAAa,CAACQ,IAAI;QACxB,KAAKC,6BAAkB,CAACU,0BAA0B;UAChD;UACA3C,KAAA,CAAKoC,OAAO,CAACC,yBAAc,CAACO,WAAW,EAAE;YACvCL,OAAO,EAAE,KAAK;YACdC,YAAY,EAAEhB,aAAa,CAACqB,aAAa;YACzCH,WAAW,EAAElB,aAAa,CAACkB;UAC7B,CAAC,CAAC;UACF;QAEF,KAAKT,6BAAkB,CAACa,uBAAuB;UAC7C;UACA9C,KAAA,CAAKoC,OAAO,CAACC,yBAAc,CAACO,WAAW,EAAE;YACvCL,OAAO,EAAE,IAAI;YACbC,YAAY,EAAEhB,aAAa,CAACqB,aAAa;YACzCH,WAAW,EAAElB,aAAa,CAACkB;UAC7B,CAAC,CAAC;UACF;QAEF,KAAKT,6BAAkB,CAACc,iBAAiB;UACvC;UACA/C,KAAA,CAAKoC,OAAO,CAACC,yBAAc,CAACU,iBAAiB,EAAE;YAC7CC,IAAI,EAAExB,aAAa,CAACyB,SAAS,CAACD,IAAI;YAClCE,WAAW,EAAE1B,aAAa,CAACyB,SAAS,CAACE,YAAY;YACjDC,IAAI,EAAE5B,aAAa,CAACyB,SAAS,CAACI,UAAU;YACxCC,cAAc,EAAE9B,aAAa,CAACyB,SAAS,CAACM,eAAe;YACvDC,eAAe,EAAEhC,aAAa,CAACyB,SAAS,CAACQ,gBAAgB;YACzDC,SAAS,EAAE,IAAAC,gCAAyB,EAACnC,aAAa,CAACyB,SAAS,CAACW,UAAU;UACzE,CAAC,CAAC;UACF;QAEF,KAAK3B,6BAAkB,CAAC4B,UAAU;UAChC;UACA7D,KAAA,CAAKoC,OAAO,CAACC,yBAAc,CAACyB,WAAW,EAAE;YACvCC,WAAW,EAAE,KAAK;YAClBX,IAAI,EAAE5B,aAAa,CAACwC;UACtB,CAAC,CAAC;UACF;QAEF,KAAK/B,6BAAkB,CAACgC,QAAQ;QAChC,KAAKhC,6BAAkB,CAACiC,UAAU;UAChC;UACAlE,KAAA,CAAKoC,OAAO,CAACC,yBAAc,CAACyB,WAAW,EAAE;YACvCC,WAAW,EAAEvC,aAAa,CAACQ,IAAI,KAAKC,6BAAkB,CAACgC;UACzD,CAAC,CAAC;UACF;QAEF;UACE;MACJ;IACF,CAAC;IAED;AACF;AACA;AACA;AACA;IAJE,IAAAzD,gBAAA,CAAA7B,OAAA,MAAA8B,uBAAA,CAAA9B,OAAA,EAAAqB,KAAA,qCAKyC,UAACwB,aAAsC,EAAW;MACzF,IAAIA,aAAa,CAAC2C,UAAU,KAAK,GAAG,EAAE;QACpC;QACAnE,KAAA,CAAKoC,OAAO,CAACC,yBAAc,CAAC+B,uBAAuB,EAAE;UAACD,UAAU,EAAE;QAAG,CAAC,CAAC;MACzE,CAAC,MAAM;QACL;QACAnE,KAAA,CAAKoC,OAAO,CAACC,yBAAc,CAAC+B,uBAAuB,EAAE;UACnDD,UAAU,EAAE3C,aAAa,CAAC6C,SAAS;UACnCC,YAAY,EAAE9C,aAAa,CAAC+C;QAC9B,CAAC,CAAC;MACJ;IACF,CAAC;IAED;AACF;AACA;AACA;AACA;IAJE,IAAA/D,gBAAA,CAAA7B,OAAA,MAAA8B,uBAAA,CAAA9B,OAAA,EAAAqB,KAAA,iCAKqC,UAACwB,aAAkC,EAAW;MAAA,IAAAgD,qBAAA,EAAAC,sBAAA,EAAAC,sBAAA,EAAAC,sBAAA,EAAAC,qBAAA,EAAAC,kBAAA;MACjF,IAAMC,qBAAqB,GAAG;QAC5BC,gBAAgB,GAAAP,qBAAA,GAAEhD,aAAa,aAAbA,aAAa,wBAAAiD,sBAAA,GAAbjD,aAAa,CAAEwD,WAAW,cAAAP,sBAAA,uBAA1BA,sBAAA,CAA4BQ,iBAAiB,cAAAT,qBAAA,cAAAA,qBAAA,GAAI,EAAE;QACrEU,YAAY,GAAAR,sBAAA,GAAElD,aAAa,aAAbA,aAAa,wBAAAmD,sBAAA,GAAbnD,aAAa,CAAEwD,WAAW,cAAAL,sBAAA,uBAA1BA,sBAAA,CAA4BQ,aAAa,cAAAT,sBAAA,cAAAA,sBAAA,GAAI,CAAC;QAC5DU,eAAe,GAAAR,qBAAA,GAAEpD,aAAa,aAAbA,aAAa,wBAAAqD,kBAAA,GAAbrD,aAAa,CAAE6D,GAAG,cAAAR,kBAAA,uBAAlBA,kBAAA,CAAoBS,gBAAgB,cAAAV,qBAAA,cAAAA,qBAAA,GAAI;MAC3D,CAAC;;MAED;MACA5E,KAAA,CAAKoC,OAAO,CAACC,yBAAc,CAACkD,mBAAmB,EAAET,qBAAqB,CAAC;IACzE,CAAC;IAED;AACF;AACA;AACA;IAHE,IAAAtE,gBAAA,CAAA7B,OAAA,MAAA8B,uBAAA,CAAA9B,OAAA,EAAAqB,KAAA,uBAI2B,YAAY;MACrCA,KAAA,CAAKoB,cAAc,GAAGC,0BAAe,CAACmE,OAAO;MAC7CxF,KAAA,CAAKyF,cAAc,CAAC,CAAC;MACrB;MACAzF,KAAA,CAAK0F,KAAK,CAACC,QAAQ,CAACC,GAAG,CAACC,MAAM,CAACC,IAAI,CAAC;QAClCrD,EAAE,KAAAlC,MAAA,CAAKP,KAAA,CAAKW,MAAM,CAAE;QACpBqB,IAAI,EAAE,gBAAgB;QACtB+D,UAAU,EAAE;UACV;UACAC,KAAK,EAAEhG,KAAA,CAAK0F,KAAK,CAACC,QAAQ,CAACC,GAAG,CAACK,UAAU,CAAC;QAC5C,CAAC;QACD/E,OAAO,EAAE,CAAC,CAAC;QACXL,IAAI,EAAE;UACJqF,aAAa,EAAE;YACbC,OAAO,EAAE;UACX,CAAC;UACDC,SAAS,EAAE,aAAa;UACxBtF,SAAS,EAAEC,+BAAoB,CAACL,MAAM,CAAC2F;QACzC,CAAC;QACDC,UAAU,KAAA/F,MAAA,CAAKgG,iBAAM,CAACC,gBAAgB,OAAAjG,MAAA,CAAIkG,aAAI,CAACC,EAAE,CAAC,CAAC,CAACC,QAAQ,CAAC,CAAC;MAChE,CAAC,CAAC;MACF3G,KAAA,CAAKW,MAAM,IAAI,CAAC;IAClB,CAAC;IAED;AACF;AACA;AACA;AACA;IAJE,IAAAH,gBAAA,CAAA7B,OAAA,MAAA8B,uBAAA,CAAA9B,OAAA,EAAAqB,KAAA,wBAK2B,UAAC4G,YAAoB;MAAA;QAC9C;QACA5G,KAAA,CAAK6G,OAAO,CAAC;UACXC,MAAM,EAAE,KAAK;UACb;UACAC,GAAG,KAAAxG,MAAA,CAAKP,KAAA,CAAK0F,KAAK,CAACC,QAAQ,CAACC,GAAG,CAACoB,WAAW,CAAC,CAAC,eAAY;UACzDC,IAAI,EAAE;YACJC,UAAU,EAAE;cACVC,cAAc,EAAEP;YAClB;UACF;QACF,CAAC,CAAC,CAACQ,IAAI,CAAC,YAAM;UACZ;UACApH,KAAA,CAAKoC,OAAO,CAACC,yBAAc,CAACgF,sBAAsB,EAAE;YAACT,YAAY,EAAZA;UAAY,CAAC,CAAC;QACrE,CAAC;MAAC;IAAA;IAEJ;AACF;AACA;AACA;AACA;IAJE,IAAApG,gBAAA,CAAA7B,OAAA,MAAA8B,uBAAA,CAAA9B,OAAA,EAAAqB,KAAA,sBAKyB,UAAC4G,YAAoB,EAAW;MACvD;MACA,IAAI,CAAC5G,KAAA,CAAK0F,KAAK,CAACC,QAAQ,CAACC,GAAG,CAAC0B,WAAW,CAAC,CAAC,EAAE;MAC5C;MACAtH,KAAA,CAAK0F,KAAK,CAACC,QAAQ,CAACC,GAAG,CAACC,MAAM,CAACC,IAAI,CAAC;QAClCrD,EAAE,KAAAlC,MAAA,CAAKP,KAAA,CAAKW,MAAM,CAAE;QACpBqB,IAAI,EAAE,gBAAgB;QACtB+D,UAAU,EAAE;UACV;UACAC,KAAK,EAAEhG,KAAA,CAAK0F,KAAK,CAACC,QAAQ,CAACC,GAAG,CAACK,UAAU,CAAC;QAC5C,CAAC;QACD/E,OAAO,EAAE;UACPqG,EAAE,EAAEvH,KAAA,CAAKiB;QACX,CAAC;QACDJ,IAAI,EAAE;UACJqF,aAAa,EAAE;YACbsB,mBAAmB,EAAEZ,YAAY;YACjCnE,EAAE,EAAEgE,aAAI,CAACC,EAAE,CAAC;UACd,CAAC;UACDN,SAAS,EAAE,aAAa;UACxBtF,SAAS,EAAEC,+BAAoB,CAACL,MAAM,CAAC+G;QACzC,CAAC;QACDnB,UAAU,KAAA/F,MAAA,CAAKgG,iBAAM,CAACC,gBAAgB,OAAAjG,MAAA,CAAIkG,aAAI,CAACC,EAAE,CAAC,CAAC,CAACC,QAAQ,CAAC,CAAC;MAChE,CAAC,CAAC;MACF3G,KAAA,CAAKW,MAAM,IAAI,CAAC;IAClB,CAAC;IAED;AACF;AACA;AACA;AACA;IAJE,IAAAH,gBAAA,CAAA7B,OAAA,MAAA8B,uBAAA,CAAA9B,OAAA,EAAAqB,KAAA,4BAKgC,UAAC4G,YAAa,EAAgC;MAC5E5G,KAAA,CAAK0H,aAAa,GAAGC,iCAAsB,CAACC,OAAO;;MAEnD;MACA,IAAMX,IAAI,GAAG;QACXC,UAAU,EAAE;UAACW,OAAO,EAAE;QAAI,CAAC;QAC3BjB,YAAY,EAAZA;MACF,CAAC;;MAED;MACA;MACA,OAAO5G,KAAA,CAAK6G,OAAO,CAAC;QAClBC,MAAM,EAAE,KAAK;QACb;QACAC,GAAG,KAAAxG,MAAA,CAAKP,KAAA,CAAK0F,KAAK,CAACC,QAAQ,CAACC,GAAG,CAACoB,WAAW,CAAC,CAAC,eAAY;QACzDC,IAAI,EAAJA;MACF,CAAC,CAAC,CACCG,IAAI,CAAC,YAAM;QACV;QACApH,KAAA,CAAKoC,OAAO,CAACC,yBAAc,CAACyF,kBAAkB,CAAC;QAE/C9H,KAAA,CAAK+H,kBAAkB,GAAG,IAAI;QAC9B/H,KAAA,CAAK0H,aAAa,GAAGC,iCAAsB,CAACK,OAAO;QACnDhI,KAAA,CAAKiI,QAAQ,CAAC,CAAC;MACjB,CAAC,CAAC,CACDC,KAAK,CAAC,YAAM;QACXlI,KAAA,CAAK0H,aAAa,GAAGC,iCAAsB,CAACQ,IAAI;QAChD,MAAM,IAAIC,KAAK,CAAC,uBAAuB,CAAC;MAC1C,CAAC,CAAC;IACN,CAAC;IAED;AACF;AACA;AACA;IAHE,IAAA5H,gBAAA,CAAA7B,OAAA,MAAA8B,uBAAA,CAAA9B,OAAA,EAAAqB,KAAA,2BAI+B;MAAA,OAC7B,CAACqB,0BAAe,CAACmE,OAAO,EAAEnE,0BAAe,CAACC,MAAM,CAAC,CAAC+G,QAAQ,CAACrI,KAAA,CAAKoB,cAAc,CAAC;IAAA;IAEjF;AACF;AACA;AACA;IAHE,IAAAZ,gBAAA,CAAA7B,OAAA,MAAA8B,uBAAA,CAAA9B,OAAA,EAAAqB,KAAA,eAIkB,YAAM;MACtB,IAAIA,KAAA,CAAKsI,oBAAoB,CAAC,CAAC,EAAE;MACjC;MACA,IAAI,CAACtI,KAAA,CAAK0F,KAAK,CAACC,QAAQ,CAACC,GAAG,CAAC0B,WAAW,CAAC,CAAC,EAAE;QAC1C,MAAM,IAAIc,KAAK,CAAC,8CAA8C,CAAC;MACjE;MACApI,KAAA,CAAKuI,gBAAgB,CAAC,CAAC;IACzB,CAAC;IAED;AACF;AACA;AACA;IAHE,IAAA/H,gBAAA,CAAA7B,OAAA,MAAA8B,uBAAA,CAAA9B,OAAA,EAAAqB,KAAA,0BAI8B;MAAA,OAC5B,CAAC2H,iCAAsB,CAACC,OAAO,EAAED,iCAAsB,CAACK,OAAO,CAAC,CAACK,QAAQ,CAACrI,KAAA,CAAK0H,aAAa,CAAC;IAAA;IAE/F;AACF;AACA;AACA;AACA;IAJE,IAAAlH,gBAAA,CAAA7B,OAAA,MAAA8B,uBAAA,CAAA9B,OAAA,EAAAqB,KAAA;MAAA,IAAAwI,IAAA,OAAAC,kBAAA,CAAA9J,OAAA,gBAAA+J,YAAA,CAAA/J,OAAA,CAAAgK,IAAA,CAKwB,SAAAC,QAAOzB,cAAe;QAAA,OAAAuB,YAAA,CAAA/J,OAAA,CAAAkK,IAAA,UAAAC,SAAAC,QAAA;UAAA,kBAAAA,QAAA,CAAAC,IAAA,GAAAD,QAAA,CAAAE,IAAA;YAAA;cAAA,KACxCjJ,KAAA,CAAKkJ,mBAAmB,CAAC,CAAC;gBAAAH,QAAA,CAAAE,IAAA;gBAAA;cAAA;cAAA,OAAAF,QAAA,CAAAI,MAAA,WAASC,SAAS;YAAA;cAAA,IAE3CpJ,KAAA,CAAK0F,KAAK,CAACC,QAAQ,CAACC,GAAG,CAAC0B,WAAW,CAAC,CAAC;gBAAAyB,QAAA,CAAAE,IAAA;gBAAA;cAAA;cAAA,MAClC,IAAIb,KAAK,CAAC,+CAA+C,CAAC;YAAA;cAAA,OAAAW,QAAA,CAAAI,MAAA,WAG3DnJ,KAAA,CAAKqJ,qBAAqB,CAAClC,cAAc,CAAC;YAAA;YAAA;cAAA,OAAA4B,QAAA,CAAAO,IAAA;UAAA;QAAA,GAAAV,OAAA;MAAA,CAClD;MAAA,iBAAAW,EAAA;QAAA,OAAAf,IAAA,CAAAvJ,KAAA,OAAAD,SAAA;MAAA;IAAA;IAED;AACF;AACA;AACA;AACA;AACA;IALE,IAAAwB,gBAAA,CAAA7B,OAAA,MAAA8B,uBAAA,CAAA9B,OAAA,EAAAqB,KAAA,yBAM4B,UAC1BwJ,QAAiB,EACjBrC,cAAuB,EACO;MAC9B;MACA,OAAOnH,KAAA,CAAK6G,OAAO,CAAC;QAClBC,MAAM,EAAE,KAAK;QACb;QACAC,GAAG,KAAAxG,MAAA,CAAKP,KAAA,CAAK0F,KAAK,CAACC,QAAQ,CAACC,GAAG,CAACoB,WAAW,CAAC,CAAC,eAAY;QACzDC,IAAI,EAAE;UACJC,UAAU,EAAE;YACVuC,YAAY,EAAED;UAChB,CAAC;UACDrC,cAAc,EAAdA;QACF;MACF,CAAC,CAAC,CAACC,IAAI,CAAC,YAAiC;QACvC,IAAIoC,QAAQ,IAAI,CAACxJ,KAAA,CAAK+H,kBAAkB,EAAE;UACxC,OAAO/H,KAAA,CAAK0J,cAAc,CAACvC,cAAc,CAAC;QAC5C;QAEA,OAAOiC,SAAS;MAClB,CAAC,CAAC;IACJ,CAAC;IAED;AACF;AACA;AACA;AACA;IAJE,IAAA5I,gBAAA,CAAA7B,OAAA,MAAA8B,uBAAA,CAAA9B,OAAA,EAAAqB,KAAA,0BAK6B,UAAC2J,MAAe,EAAgC;MAC3E;MACA,OAAO3J,KAAA,CAAK6G,OAAO,CAAC;QAClBC,MAAM,EAAE,KAAK;QACb;QACAC,GAAG,KAAAxG,MAAA,CAAKP,KAAA,CAAK0F,KAAK,CAACC,QAAQ,CAACC,GAAG,CAACoB,WAAW,CAAC,CAAC,eAAY;QACzDC,IAAI,EAAE;UACJ2C,aAAa,EAAE;YACbD,MAAM,EAANA;UACF;QACF;MACF,CAAC,CAAC,CAACvC,IAAI,CAAC,YAAiC;QACvC,OAAOgC,SAAS;MAClB,CAAC,CAAC;IACJ,CAAC;IAED;AACF;AACA;AACA;IAHE,IAAA5I,gBAAA,CAAA7B,OAAA,MAAA8B,uBAAA,CAAA9B,OAAA,EAAAqB,KAAA,uBAI0B;MAAA,OAAMA,KAAA,CAAK0H,aAAa;IAAA;IAElD;AACF;AACA;AACA;IAHE,IAAAlH,gBAAA,CAAA7B,OAAA,MAAA8B,uBAAA,CAAA9B,OAAA,EAAAqB,KAAA,wBAI2B;MAAA,OAAMA,KAAA,CAAKoB,cAAc;IAAA;IArVlDpB,KAAA,CAAKW,MAAM,GAAG,CAAC;IACfX,KAAA,CAAK+H,kBAAkB,GAAG,KAAK;IAC/B/H,KAAA,CAAKiB,WAAW,GAAGmI,SAAS;IAC5BpJ,KAAA,CAAKoB,cAAc,GAAGC,0BAAe,CAAC8G,IAAI;IAC1CnI,KAAA,CAAK0H,aAAa,GAAGC,iCAAsB,CAACQ,IAAI;IAAC,OAAAnI,KAAA;EACnD;EAAC,IAAA6J,aAAA,CAAAlL,OAAA,EAAAgB,aAAA;IAAAmK,GAAA;IAAAC,KAAA;IArCD;AACF;AACA;AACA;IACE,SAAAtE,eAAA,EAAyB;MACvB,IAAI,CAAC,IAAI,CAACuE,qBAAqB,EAAE;QAC/B;QACA,IAAI,CAACtE,KAAK,CAACC,QAAQ,CAACC,GAAG,CAACqE,EAAE,CAAC,mBAAmB,EAAE,IAAI,CAACC,cAAc,CAAC;QACpE,IAAI,CAACF,qBAAqB,GAAG,IAAI;MACnC;IACF;;IAEA;AACF;AACA;AACA;EAHE;IAAAF,GAAA;IAAAC,KAAA,EAIA,SAAAI,iBAAA,EAA0B;MACxB,IAAI,CAACpC,kBAAkB,GAAG,KAAK;MAC/B,IAAI,CAAC9G,WAAW,GAAGmI,SAAS;MAC5B;MACA,IAAI,CAAC1D,KAAK,CAACC,QAAQ,CAACC,GAAG,CAACwE,GAAG,CAAC,mBAAmB,EAAE,IAAI,CAACF,cAAc,CAAC;MACrE,IAAI,CAACF,qBAAqB,GAAG,KAAK;MAClC,IAAI,CAAC5I,cAAc,GAAGC,0BAAe,CAAC8G,IAAI;MAC1C,IAAI,CAACT,aAAa,GAAGC,iCAAsB,CAACQ,IAAI;IAClD;EAAC;EAAA,OAAAxI,aAAA;AAAA,EAlEgC0K,sBAAW;AAAA,IAAAC,QAAA,GAAA1K,OAAA,CAAAjB,OAAA,GAka/BgB,aAAa"}
|
package/dist/voicea.types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["voicea.types.ts"],"sourcesContent":["/* eslint-disable camelcase */\n/* eslint-disable no-undef */\n\n/**\n * Type for payload\n */\ninterface AnnouncementPayload {\n translation: {\n max_languages: number;\n allowed_languages: string[];\n };\n\n ASR: {\n spoken_languages: string[];\n };\n}\n\n// eslint-disable-next-line no-undef\ntype TRANSCRIPTION_TYPES =\n | 'unknown'\n | 'eva_wake'\n | 'eva_thanks'\n | 'eva_cancel'\n | 'highlight_created'\n | 'transcript_interim_results'\n | 'transcript_final_result';\n\n/**\n * Class for an Transcription Object\n */\ninterface Transcription {\n start_millis: number;\n end_millis: number;\n text: string;\n transcript_language_code: string;\n translations: {[x: string]: string};\n csis: number[];\n last_packet_timestamp_ms: number;\n}\n\n/**\n * Highlights\n */\ninterface Highlight {\n highlight_id: string;\n transcript: string;\n highlight_label: string;\n highlight_source: string;\n start_millis: number;\n end_millis: number;\n csis: number[];\n}\n/**\n * Type for Transcription message\n */\ninterface TranscriptionResponse {\n type: TRANSCRIPTION_TYPES;\n transcript_id: string;\n translations?: {[x: string]: string};\n transcripts?: Transcription[];\n transcript?: Transcription;\n highlight?: Highlight;\n csis: number[];\n data: string;\n command_response: string;\n}\n/**\n * Type for CaptionLanguageResponse\n */\ninterface CaptionLanguageResponse {\n requestId: string;\n statusCode: number;\n errorCode: number;\n message: string;\n}\n\ninterface IVoiceaChannel {\n setSpokenLanguage: (languageCode: string) => Promise<void>;\n requestLanguage: (languageCode: string) => void;\n turnOnCaptions: () => undefined | Promise<void>;\n toggleTranscribing: (activate: boolean, spokenLanguage: string) => undefined | Promise<void>;\n deregisterEvents: () => void;\n}\n\nexport type {\n AnnouncementPayload,\n CaptionLanguageResponse,\n TranscriptionResponse,\n Transcription,\n Highlight,\n IVoiceaChannel,\n};\n"],"mappings":""}
|
|
1
|
+
{"version":3,"names":[],"sources":["voicea.types.ts"],"sourcesContent":["/* eslint-disable camelcase */\n/* eslint-disable no-undef */\n\n/**\n * Type for payload\n */\ninterface AnnouncementPayload {\n translation: {\n max_languages: number;\n allowed_languages: string[];\n };\n\n ASR: {\n spoken_languages: string[];\n };\n}\n\n// eslint-disable-next-line no-undef\ntype TRANSCRIPTION_TYPES =\n | 'unknown'\n | 'eva_wake'\n | 'eva_thanks'\n | 'eva_cancel'\n | 'highlight_created'\n | 'transcript_interim_results'\n | 'transcript_final_result';\n\n/**\n * Class for an Transcription Object\n */\ninterface Transcription {\n start_millis: number;\n end_millis: number;\n text: string;\n transcript_language_code: string;\n translations: {[x: string]: string};\n csis: number[];\n last_packet_timestamp_ms: number;\n}\n\n/**\n * Highlights\n */\ninterface Highlight {\n highlight_id: string;\n transcript: string;\n highlight_label: string;\n highlight_source: string;\n start_millis: number;\n end_millis: number;\n csis: number[];\n}\n/**\n * Type for Transcription message\n */\ninterface TranscriptionResponse {\n type: TRANSCRIPTION_TYPES;\n id: string;\n transcript_id: string;\n translations?: {[x: string]: string};\n transcripts?: Transcription[];\n transcript?: Transcription;\n highlight?: Highlight;\n csis: number[];\n data: string;\n command_response: string;\n}\n/**\n * Type for CaptionLanguageResponse\n */\ninterface CaptionLanguageResponse {\n requestId: string;\n statusCode: number;\n errorCode: number;\n message: string;\n}\n\ninterface IVoiceaChannel {\n setSpokenLanguage: (languageCode: string) => Promise<void>;\n requestLanguage: (languageCode: string) => void;\n turnOnCaptions: () => undefined | Promise<void>;\n toggleTranscribing: (activate: boolean, spokenLanguage: string) => undefined | Promise<void>;\n deregisterEvents: () => void;\n}\n\nexport type {\n AnnouncementPayload,\n CaptionLanguageResponse,\n TranscriptionResponse,\n Transcription,\n Highlight,\n IVoiceaChannel,\n};\n"],"mappings":""}
|
package/package.json
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
"description": "",
|
|
4
4
|
"license": "Cisco EULA (https://www.cisco.com/c/en/us/products/end-user-license-agreement.html)",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/types/index.d.ts",
|
|
6
7
|
"devMain": "src/index.js",
|
|
7
8
|
"repository": {
|
|
8
9
|
"type": "git",
|
|
@@ -13,10 +14,10 @@
|
|
|
13
14
|
"node": ">=16"
|
|
14
15
|
},
|
|
15
16
|
"dependencies": {
|
|
16
|
-
"@webex/internal-plugin-llm": "3.0.
|
|
17
|
-
"@webex/internal-plugin-mercury": "3.0.
|
|
18
|
-
"@webex/plugin-meetings": "3.0.
|
|
19
|
-
"@webex/webex-core": "3.0.
|
|
17
|
+
"@webex/internal-plugin-llm": "3.1.0-next.1",
|
|
18
|
+
"@webex/internal-plugin-mercury": "3.1.0-next.1",
|
|
19
|
+
"@webex/plugin-meetings": "3.1.0-next.10",
|
|
20
|
+
"@webex/webex-core": "3.1.0-next.1",
|
|
20
21
|
"uuid": "^3.3.2"
|
|
21
22
|
},
|
|
22
23
|
"browserify": {
|
|
@@ -31,23 +32,23 @@
|
|
|
31
32
|
"@webex/eslint-config-legacy": "0.0.0",
|
|
32
33
|
"@webex/jest-config-legacy": "0.0.0",
|
|
33
34
|
"@webex/legacy-tools": "0.0.0",
|
|
34
|
-
"@webex/test-helper-chai": "3.0.
|
|
35
|
-
"@webex/test-helper-mocha": "3.0.
|
|
36
|
-
"@webex/test-helper-mock-web-socket": "3.0.
|
|
37
|
-
"@webex/test-helper-mock-webex": "3.0.
|
|
38
|
-
"@webex/test-helper-test-users": "3.0.
|
|
35
|
+
"@webex/test-helper-chai": "3.1.0-next.1",
|
|
36
|
+
"@webex/test-helper-mocha": "3.1.0-next.1",
|
|
37
|
+
"@webex/test-helper-mock-web-socket": "3.1.0-next.1",
|
|
38
|
+
"@webex/test-helper-mock-webex": "3.1.0-next.1",
|
|
39
|
+
"@webex/test-helper-test-users": "3.1.0-next.1",
|
|
39
40
|
"eslint": "^8.24.0",
|
|
40
41
|
"prettier": "^2.7.1",
|
|
41
42
|
"sinon": "^9.2.4"
|
|
42
43
|
},
|
|
43
44
|
"scripts": {
|
|
44
|
-
"build": "yarn
|
|
45
|
-
"build:src": "webex-legacy-tools build -dest \"./dist\" -src \"./src\" -js -ts -maps",
|
|
45
|
+
"build": "yarn run -T tsc --declaration true --declarationDir ./dist/types",
|
|
46
|
+
"build:src": "webex-legacy-tools build -dest \"./dist\" -src \"./src\" -js -ts -maps && yarn build",
|
|
46
47
|
"deploy:npm": "yarn npm publish",
|
|
47
48
|
"test": "yarn test:style && yarn test:unit && yarn test:integration && yarn test:browser",
|
|
48
49
|
"test:browser": "webex-legacy-tools test --integration --runner karma",
|
|
49
50
|
"test:style": "eslint ./src/**/*.*",
|
|
50
51
|
"test:unit": "webex-legacy-tools test --unit --runner jest"
|
|
51
52
|
},
|
|
52
|
-
"version": "3.0.
|
|
53
|
+
"version": "3.1.0-next.10"
|
|
53
54
|
}
|
package/src/constants.ts
CHANGED
|
@@ -9,14 +9,20 @@ export const EVENT_TRIGGERS = {
|
|
|
9
9
|
NEW_CAPTION: 'voicea:newCaption',
|
|
10
10
|
EVA_COMMAND: 'voicea:wxa',
|
|
11
11
|
HIGHLIGHT_CREATED: 'voicea:highlightCreated',
|
|
12
|
+
NEW_MANUAL_CAPTION: 'aibridge:newManualCaption',
|
|
12
13
|
};
|
|
13
14
|
|
|
14
|
-
export const
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
15
|
+
export const AIBRIDGE_RELAY_TYPES = {
|
|
16
|
+
VOICEA: {
|
|
17
|
+
ANNOUNCEMENT: 'voicea.annc',
|
|
18
|
+
CLIENT_ANNOUNCEMENT: 'client.annc',
|
|
19
|
+
TRANSLATION_REQUEST: 'voicea.transl.req',
|
|
20
|
+
TRANSLATION_RESPONSE: 'voicea.transl.rsp',
|
|
21
|
+
TRANSCRIPTION: 'voicea.transcription',
|
|
22
|
+
},
|
|
23
|
+
MANUAL: {
|
|
24
|
+
TRANSCRIPTION: 'aibridge.manual_transcription',
|
|
25
|
+
},
|
|
20
26
|
};
|
|
21
27
|
|
|
22
28
|
export const TRANSCRIPTION_TYPE = {
|
|
@@ -27,6 +33,8 @@ export const TRANSCRIPTION_TYPE = {
|
|
|
27
33
|
HIGHLIGHT_CREATED: 'highlight_created',
|
|
28
34
|
TRANSCRIPT_INTERIM_RESULTS: 'transcript_interim_results',
|
|
29
35
|
TRANSCRIPT_FINAL_RESULT: 'transcript_final_result',
|
|
36
|
+
MANUAL_CAPTION_INTERIM_RESULTS: 'manual_caption_interim_results',
|
|
37
|
+
MANUAL_CAPTION_FINAL_RESULT: 'manual_caption_final_result',
|
|
30
38
|
};
|
|
31
39
|
|
|
32
40
|
export const VOICEA = 'voicea';
|
package/src/voicea.ts
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import uuid from 'uuid';
|
|
2
|
-
import {TriggerProxy as Trigger} from '@webex/plugin-meetings';
|
|
3
2
|
import {WebexPlugin, config} from '@webex/webex-core';
|
|
4
3
|
|
|
5
4
|
import {
|
|
6
5
|
EVENT_TRIGGERS,
|
|
7
|
-
|
|
6
|
+
AIBRIDGE_RELAY_TYPES,
|
|
8
7
|
TRANSCRIPTION_TYPE,
|
|
9
8
|
VOICEA,
|
|
10
9
|
ANNOUNCE_STATUS,
|
|
@@ -47,17 +46,20 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
|
|
|
47
46
|
private eventProcessor = (e) => {
|
|
48
47
|
this.seqNum = e.sequenceNumber + 1;
|
|
49
48
|
switch (e.data.relayType) {
|
|
50
|
-
case
|
|
49
|
+
case AIBRIDGE_RELAY_TYPES.VOICEA.ANNOUNCEMENT:
|
|
51
50
|
this.vmcDeviceId = e.headers.from;
|
|
52
51
|
this.announceStatus = ANNOUNCE_STATUS.JOINED;
|
|
53
52
|
this.processAnnouncementMessage(e.data.voiceaPayload);
|
|
54
53
|
break;
|
|
55
|
-
case
|
|
54
|
+
case AIBRIDGE_RELAY_TYPES.VOICEA.TRANSLATION_RESPONSE:
|
|
56
55
|
this.processCaptionLanguageResponse(e.data.voiceaPayload);
|
|
57
56
|
break;
|
|
58
|
-
case
|
|
57
|
+
case AIBRIDGE_RELAY_TYPES.VOICEA.TRANSCRIPTION:
|
|
59
58
|
this.processTranscription(e.data.voiceaPayload);
|
|
60
59
|
break;
|
|
60
|
+
case AIBRIDGE_RELAY_TYPES.MANUAL.TRANSCRIPTION:
|
|
61
|
+
this.processManualTranscription(e.data.transcriptPayload);
|
|
62
|
+
break;
|
|
61
63
|
default:
|
|
62
64
|
break;
|
|
63
65
|
}
|
|
@@ -102,6 +104,28 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
|
|
|
102
104
|
this.captionStatus = TURN_ON_CAPTION_STATUS.IDLE;
|
|
103
105
|
}
|
|
104
106
|
|
|
107
|
+
/**
|
|
108
|
+
* Process manual Transcript and send alert
|
|
109
|
+
* @param {TranscriptionResponse} transcriptPayload
|
|
110
|
+
* @returns {void}
|
|
111
|
+
*/
|
|
112
|
+
private processManualTranscription = (transcriptPayload: TranscriptionResponse): void => {
|
|
113
|
+
switch (transcriptPayload.type) {
|
|
114
|
+
case TRANSCRIPTION_TYPE.MANUAL_CAPTION_FINAL_RESULT:
|
|
115
|
+
case TRANSCRIPTION_TYPE.MANUAL_CAPTION_INTERIM_RESULTS:
|
|
116
|
+
// @ts-ignore
|
|
117
|
+
this.trigger(EVENT_TRIGGERS.NEW_MANUAL_CAPTION, {
|
|
118
|
+
isFinal: transcriptPayload.type === TRANSCRIPTION_TYPE.MANUAL_CAPTION_FINAL_RESULT,
|
|
119
|
+
transcriptId: transcriptPayload.id,
|
|
120
|
+
transcripts: transcriptPayload.transcripts,
|
|
121
|
+
});
|
|
122
|
+
break;
|
|
123
|
+
|
|
124
|
+
default:
|
|
125
|
+
break;
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
|
|
105
129
|
/**
|
|
106
130
|
* Process Transcript and send alert
|
|
107
131
|
* @param {TranscriptionResponse} voiceaPayload
|
|
@@ -110,90 +134,49 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
|
|
|
110
134
|
private processTranscription = (voiceaPayload: TranscriptionResponse): void => {
|
|
111
135
|
switch (voiceaPayload.type) {
|
|
112
136
|
case TRANSCRIPTION_TYPE.TRANSCRIPT_INTERIM_RESULTS:
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
EVENT_TRIGGERS.NEW_CAPTION,
|
|
120
|
-
{
|
|
121
|
-
isFinal: false,
|
|
122
|
-
transcriptId: voiceaPayload.transcript_id,
|
|
123
|
-
transcripts: voiceaPayload.transcripts,
|
|
124
|
-
}
|
|
125
|
-
);
|
|
137
|
+
// @ts-ignore
|
|
138
|
+
this.trigger(EVENT_TRIGGERS.NEW_CAPTION, {
|
|
139
|
+
isFinal: false,
|
|
140
|
+
transcriptId: voiceaPayload.transcript_id,
|
|
141
|
+
transcripts: voiceaPayload.transcripts,
|
|
142
|
+
});
|
|
126
143
|
break;
|
|
127
144
|
|
|
128
145
|
case TRANSCRIPTION_TYPE.TRANSCRIPT_FINAL_RESULT:
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
EVENT_TRIGGERS.NEW_CAPTION,
|
|
136
|
-
{
|
|
137
|
-
isFinal: true,
|
|
138
|
-
transcriptId: voiceaPayload.transcript_id,
|
|
139
|
-
translations: voiceaPayload.translations,
|
|
140
|
-
transcript: {
|
|
141
|
-
csis: voiceaPayload.csis,
|
|
142
|
-
text: voiceaPayload.transcript.text,
|
|
143
|
-
transcriptLanguageCode: voiceaPayload.transcript.transcript_language_code,
|
|
144
|
-
},
|
|
145
|
-
timestamp: millisToMinutesAndSeconds(voiceaPayload.transcript.end_millis),
|
|
146
|
-
}
|
|
147
|
-
);
|
|
146
|
+
// @ts-ignore
|
|
147
|
+
this.trigger(EVENT_TRIGGERS.NEW_CAPTION, {
|
|
148
|
+
isFinal: true,
|
|
149
|
+
transcriptId: voiceaPayload.transcript_id,
|
|
150
|
+
transcripts: voiceaPayload.transcripts,
|
|
151
|
+
});
|
|
148
152
|
break;
|
|
149
153
|
|
|
150
154
|
case TRANSCRIPTION_TYPE.HIGHLIGHT_CREATED:
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
highlightId: voiceaPayload.highlight.highlight_id,
|
|
161
|
-
text: voiceaPayload.highlight.transcript,
|
|
162
|
-
highlightLabel: voiceaPayload.highlight.highlight_label,
|
|
163
|
-
highlightSource: voiceaPayload.highlight.highlight_source,
|
|
164
|
-
timestamp: millisToMinutesAndSeconds(voiceaPayload.highlight.end_millis),
|
|
165
|
-
}
|
|
166
|
-
);
|
|
155
|
+
// @ts-ignore
|
|
156
|
+
this.trigger(EVENT_TRIGGERS.HIGHLIGHT_CREATED, {
|
|
157
|
+
csis: voiceaPayload.highlight.csis,
|
|
158
|
+
highlightId: voiceaPayload.highlight.highlight_id,
|
|
159
|
+
text: voiceaPayload.highlight.transcript,
|
|
160
|
+
highlightLabel: voiceaPayload.highlight.highlight_label,
|
|
161
|
+
highlightSource: voiceaPayload.highlight.highlight_source,
|
|
162
|
+
timestamp: millisToMinutesAndSeconds(voiceaPayload.highlight.end_millis),
|
|
163
|
+
});
|
|
167
164
|
break;
|
|
168
165
|
|
|
169
166
|
case TRANSCRIPTION_TYPE.EVA_THANKS:
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
},
|
|
176
|
-
EVENT_TRIGGERS.EVA_COMMAND,
|
|
177
|
-
{
|
|
178
|
-
isListening: false,
|
|
179
|
-
text: voiceaPayload.command_response,
|
|
180
|
-
}
|
|
181
|
-
);
|
|
167
|
+
// @ts-ignore
|
|
168
|
+
this.trigger(EVENT_TRIGGERS.EVA_COMMAND, {
|
|
169
|
+
isListening: false,
|
|
170
|
+
text: voiceaPayload.command_response,
|
|
171
|
+
});
|
|
182
172
|
break;
|
|
183
173
|
|
|
184
174
|
case TRANSCRIPTION_TYPE.EVA_WAKE:
|
|
185
175
|
case TRANSCRIPTION_TYPE.EVA_CANCEL:
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
function: 'processTranscription',
|
|
191
|
-
},
|
|
192
|
-
EVENT_TRIGGERS.EVA_COMMAND,
|
|
193
|
-
{
|
|
194
|
-
isListening: voiceaPayload.type === TRANSCRIPTION_TYPE.EVA_WAKE,
|
|
195
|
-
}
|
|
196
|
-
);
|
|
176
|
+
// @ts-ignore
|
|
177
|
+
this.trigger(EVENT_TRIGGERS.EVA_COMMAND, {
|
|
178
|
+
isListening: voiceaPayload.type === TRANSCRIPTION_TYPE.EVA_WAKE,
|
|
179
|
+
});
|
|
197
180
|
break;
|
|
198
181
|
|
|
199
182
|
default:
|
|
@@ -208,25 +191,14 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
|
|
|
208
191
|
*/
|
|
209
192
|
private processCaptionLanguageResponse = (voiceaPayload: CaptionLanguageResponse): void => {
|
|
210
193
|
if (voiceaPayload.statusCode === 200) {
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
{
|
|
214
|
-
file: 'voicea',
|
|
215
|
-
function: 'processCaptionLanguageResponse',
|
|
216
|
-
},
|
|
217
|
-
EVENT_TRIGGERS.CAPTION_LANGUAGE_UPDATE,
|
|
218
|
-
{statusCode: 200}
|
|
219
|
-
);
|
|
194
|
+
// @ts-ignore
|
|
195
|
+
this.trigger(EVENT_TRIGGERS.CAPTION_LANGUAGE_UPDATE, {statusCode: 200});
|
|
220
196
|
} else {
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
},
|
|
227
|
-
EVENT_TRIGGERS.CAPTION_LANGUAGE_UPDATE,
|
|
228
|
-
{statusCode: voiceaPayload.errorCode, errorMessage: voiceaPayload.message}
|
|
229
|
-
);
|
|
197
|
+
// @ts-ignore
|
|
198
|
+
this.trigger(EVENT_TRIGGERS.CAPTION_LANGUAGE_UPDATE, {
|
|
199
|
+
statusCode: voiceaPayload.errorCode,
|
|
200
|
+
errorMessage: voiceaPayload.message,
|
|
201
|
+
});
|
|
230
202
|
}
|
|
231
203
|
};
|
|
232
204
|
|
|
@@ -242,15 +214,8 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
|
|
|
242
214
|
spokenLanguages: voiceaPayload?.ASR?.spoken_languages ?? [],
|
|
243
215
|
};
|
|
244
216
|
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
{
|
|
248
|
-
file: 'voicea',
|
|
249
|
-
function: 'processAnnouncementMessage',
|
|
250
|
-
},
|
|
251
|
-
EVENT_TRIGGERS.VOICEA_ANNOUNCEMENT,
|
|
252
|
-
voiceaLanguageOptions
|
|
253
|
-
);
|
|
217
|
+
// @ts-ignore
|
|
218
|
+
this.trigger(EVENT_TRIGGERS.VOICEA_ANNOUNCEMENT, voiceaLanguageOptions);
|
|
254
219
|
};
|
|
255
220
|
|
|
256
221
|
/**
|
|
@@ -274,7 +239,7 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
|
|
|
274
239
|
version: 'v2',
|
|
275
240
|
},
|
|
276
241
|
eventType: 'relay.event',
|
|
277
|
-
relayType:
|
|
242
|
+
relayType: AIBRIDGE_RELAY_TYPES.VOICEA.CLIENT_ANNOUNCEMENT,
|
|
278
243
|
},
|
|
279
244
|
trackingId: `${config.trackingIdPrefix}_${uuid.v4().toString()}`,
|
|
280
245
|
});
|
|
@@ -298,15 +263,8 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
|
|
|
298
263
|
},
|
|
299
264
|
},
|
|
300
265
|
}).then(() => {
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
{
|
|
304
|
-
file: 'voicea',
|
|
305
|
-
function: 'setSpokenLanguage',
|
|
306
|
-
},
|
|
307
|
-
EVENT_TRIGGERS.SPOKEN_LANGUAGE_UPDATE,
|
|
308
|
-
{languageCode}
|
|
309
|
-
);
|
|
266
|
+
// @ts-ignore
|
|
267
|
+
this.trigger(EVENT_TRIGGERS.SPOKEN_LANGUAGE_UPDATE, {languageCode});
|
|
310
268
|
});
|
|
311
269
|
|
|
312
270
|
/**
|
|
@@ -334,7 +292,7 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
|
|
|
334
292
|
id: uuid.v4(),
|
|
335
293
|
},
|
|
336
294
|
eventType: 'relay.event',
|
|
337
|
-
relayType:
|
|
295
|
+
relayType: AIBRIDGE_RELAY_TYPES.VOICEA.TRANSLATION_REQUEST,
|
|
338
296
|
},
|
|
339
297
|
trackingId: `${config.trackingIdPrefix}_${uuid.v4().toString()}`,
|
|
340
298
|
});
|
|
@@ -364,14 +322,9 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
|
|
|
364
322
|
body,
|
|
365
323
|
})
|
|
366
324
|
.then(() => {
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
file: 'voicea',
|
|
371
|
-
function: 'turnOnCaptions',
|
|
372
|
-
},
|
|
373
|
-
EVENT_TRIGGERS.CAPTIONS_TURNED_ON
|
|
374
|
-
);
|
|
325
|
+
// @ts-ignore
|
|
326
|
+
this.trigger(EVENT_TRIGGERS.CAPTIONS_TURNED_ON);
|
|
327
|
+
|
|
375
328
|
this.areCaptionsEnabled = true;
|
|
376
329
|
this.captionStatus = TURN_ON_CAPTION_STATUS.ENABLED;
|
|
377
330
|
this.announce();
|
|
@@ -454,6 +407,27 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
|
|
|
454
407
|
});
|
|
455
408
|
};
|
|
456
409
|
|
|
410
|
+
/**
|
|
411
|
+
* Toggle turn on manual caption
|
|
412
|
+
* @param {bool} enable if true manual caption is turned on
|
|
413
|
+
* @returns {Promise}
|
|
414
|
+
*/
|
|
415
|
+
public toggleManualCaption = (enable: boolean): undefined | Promise<void> => {
|
|
416
|
+
// @ts-ignore
|
|
417
|
+
return this.request({
|
|
418
|
+
method: 'PUT',
|
|
419
|
+
// @ts-ignore
|
|
420
|
+
url: `${this.webex.internal.llm.getLocusUrl()}/controls/`,
|
|
421
|
+
body: {
|
|
422
|
+
manualCaption: {
|
|
423
|
+
enable,
|
|
424
|
+
},
|
|
425
|
+
},
|
|
426
|
+
}).then((): undefined | Promise<void> => {
|
|
427
|
+
return undefined;
|
|
428
|
+
});
|
|
429
|
+
};
|
|
430
|
+
|
|
457
431
|
/**
|
|
458
432
|
* get caption status
|
|
459
433
|
* @returns {string}
|
package/src/voicea.types.ts
CHANGED
package/test/unit/spec/voicea.js
CHANGED
|
@@ -243,7 +243,7 @@ describe('plugin-voicea', () => {
|
|
|
243
243
|
})
|
|
244
244
|
);
|
|
245
245
|
|
|
246
|
-
assert.calledOnceWithExactly(triggerSpy
|
|
246
|
+
assert.calledOnceWithExactly(triggerSpy);
|
|
247
247
|
|
|
248
248
|
assert.calledOnce(announcementSpy);
|
|
249
249
|
});
|
|
@@ -251,7 +251,7 @@ describe('plugin-voicea', () => {
|
|
|
251
251
|
it("should handle request fail", async () => {
|
|
252
252
|
voiceaService.captionStatus = 'sending';
|
|
253
253
|
voiceaService.request = sinon.stub().rejects();
|
|
254
|
-
|
|
254
|
+
|
|
255
255
|
try {
|
|
256
256
|
await voiceaService.requestTurnOnCaptions();
|
|
257
257
|
} catch (error) {
|
|
@@ -436,6 +436,56 @@ describe('plugin-voicea', () => {
|
|
|
436
436
|
});
|
|
437
437
|
});
|
|
438
438
|
|
|
439
|
+
describe('#toggleManualCaption', () => {
|
|
440
|
+
beforeEach(async () => {
|
|
441
|
+
const mockWebSocket = new MockWebSocket();
|
|
442
|
+
|
|
443
|
+
voiceaService.webex.internal.llm.socket = mockWebSocket;
|
|
444
|
+
});
|
|
445
|
+
|
|
446
|
+
it('turns on manual caption', async () => {
|
|
447
|
+
// Turn on captions
|
|
448
|
+
await voiceaService.turnOnCaptions();
|
|
449
|
+
|
|
450
|
+
// eslint-disable-next-line no-underscore-dangle
|
|
451
|
+
voiceaService.webex.internal.llm._emit('event:relay.event', {
|
|
452
|
+
headers: {from: 'ws'},
|
|
453
|
+
data: {relayType: 'voicea.annc', voiceaPayload: {}},
|
|
454
|
+
});
|
|
455
|
+
|
|
456
|
+
voiceaService.listenToEvents();
|
|
457
|
+
|
|
458
|
+
await voiceaService.toggleManualCaption(true);
|
|
459
|
+
sinon.assert.calledWith(
|
|
460
|
+
voiceaService.request,
|
|
461
|
+
sinon.match({
|
|
462
|
+
method: 'PUT',
|
|
463
|
+
url: `${locusUrl}/controls/`,
|
|
464
|
+
body: {manualCaption: {enable: true}},
|
|
465
|
+
})
|
|
466
|
+
);
|
|
467
|
+
|
|
468
|
+
});
|
|
469
|
+
|
|
470
|
+
|
|
471
|
+
it('turns off manual caption', async () => {
|
|
472
|
+
await voiceaService.toggleManualCaption(true);
|
|
473
|
+
|
|
474
|
+
voiceaService.listenToEvents();
|
|
475
|
+
|
|
476
|
+
await voiceaService.toggleManualCaption(false);
|
|
477
|
+
sinon.assert.calledWith(
|
|
478
|
+
voiceaService.request,
|
|
479
|
+
sinon.match({
|
|
480
|
+
method: 'PUT',
|
|
481
|
+
url: `${locusUrl}/controls/`,
|
|
482
|
+
body: {manualCaption: {enable: false}},
|
|
483
|
+
})
|
|
484
|
+
);
|
|
485
|
+
|
|
486
|
+
});
|
|
487
|
+
});
|
|
488
|
+
|
|
439
489
|
describe('#processCaptionLanguageResponse', () => {
|
|
440
490
|
it('responds to process caption language', async () => {
|
|
441
491
|
const triggerSpy = sinon.spy();
|
|
@@ -603,15 +653,7 @@ describe('plugin-voicea', () => {
|
|
|
603
653
|
assert.calledOnceWithExactly(triggerSpy, {
|
|
604
654
|
isFinal: true,
|
|
605
655
|
transcriptId: '3ec73890-bffb-f28b-e77f-99dc13caea7e',
|
|
606
|
-
|
|
607
|
-
en: "Hello?"
|
|
608
|
-
},
|
|
609
|
-
transcript: {
|
|
610
|
-
csis: [3556942592],
|
|
611
|
-
text: 'Hello?',
|
|
612
|
-
transcriptLanguageCode: 'en',
|
|
613
|
-
},
|
|
614
|
-
timestamp: '0:13',
|
|
656
|
+
transcripts: voiceaPayload.transcripts,
|
|
615
657
|
});
|
|
616
658
|
});
|
|
617
659
|
|
|
@@ -741,6 +783,71 @@ describe('plugin-voicea', () => {
|
|
|
741
783
|
});
|
|
742
784
|
});
|
|
743
785
|
|
|
786
|
+
describe('#processManualTranscription', () => {
|
|
787
|
+
let triggerSpy, functionSpy;
|
|
788
|
+
|
|
789
|
+
beforeEach(() => {
|
|
790
|
+
triggerSpy = sinon.spy();
|
|
791
|
+
functionSpy = sinon.spy(voiceaService, 'processManualTranscription');
|
|
792
|
+
voiceaService.listenToEvents();
|
|
793
|
+
});
|
|
794
|
+
|
|
795
|
+
it('processes interim manual transcription', async () => {
|
|
796
|
+
voiceaService.on(EVENT_TRIGGERS.NEW_MANUAL_CAPTION, triggerSpy);
|
|
797
|
+
const transcriptPayload = {
|
|
798
|
+
id: "747d711d-3414-fd69-7081-e842649f2d28",
|
|
799
|
+
transcripts: [
|
|
800
|
+
{
|
|
801
|
+
"text": "Good",
|
|
802
|
+
}
|
|
803
|
+
],
|
|
804
|
+
type: "manual_caption_interim_results",
|
|
805
|
+
};
|
|
806
|
+
|
|
807
|
+
// eslint-disable-next-line no-underscore-dangle
|
|
808
|
+
await voiceaService.webex.internal.llm._emit('event:relay.event', {
|
|
809
|
+
headers: {from: 'ws'},
|
|
810
|
+
data: {relayType: 'aibridge.manual_transcription', transcriptPayload},
|
|
811
|
+
});
|
|
812
|
+
|
|
813
|
+
assert.calledOnceWithExactly(functionSpy, transcriptPayload);
|
|
814
|
+
assert.calledOnceWithExactly(triggerSpy, {
|
|
815
|
+
isFinal: false,
|
|
816
|
+
transcriptId: '747d711d-3414-fd69-7081-e842649f2d28',
|
|
817
|
+
transcripts: transcriptPayload.transcripts,
|
|
818
|
+
});
|
|
819
|
+
});
|
|
820
|
+
|
|
821
|
+
it('processes final manual transcription', async () => {
|
|
822
|
+
voiceaService.on(EVENT_TRIGGERS.NEW_MANUAL_CAPTION, triggerSpy);
|
|
823
|
+
|
|
824
|
+
const transcriptPayload = {
|
|
825
|
+
id: "8d226d31-044a-8d11-cc39-cedbde183154",
|
|
826
|
+
transcripts: [
|
|
827
|
+
{
|
|
828
|
+
text: "Good Morning",
|
|
829
|
+
start_millis: 10420,
|
|
830
|
+
end_millis: 11380,
|
|
831
|
+
}
|
|
832
|
+
],
|
|
833
|
+
type: "manual_caption_final_result",
|
|
834
|
+
};
|
|
835
|
+
|
|
836
|
+
// eslint-disable-next-line no-underscore-dangle
|
|
837
|
+
await voiceaService.webex.internal.llm._emit('event:relay.event', {
|
|
838
|
+
headers: {from: 'ws'},
|
|
839
|
+
data: {relayType: 'aibridge.manual_transcription', transcriptPayload},
|
|
840
|
+
});
|
|
841
|
+
|
|
842
|
+
assert.calledOnceWithExactly(functionSpy, transcriptPayload);
|
|
843
|
+
assert.calledOnceWithExactly(triggerSpy, {
|
|
844
|
+
isFinal: true,
|
|
845
|
+
transcriptId: '8d226d31-044a-8d11-cc39-cedbde183154',
|
|
846
|
+
transcripts: transcriptPayload.transcripts,
|
|
847
|
+
});
|
|
848
|
+
});
|
|
849
|
+
});
|
|
850
|
+
|
|
744
851
|
describe("#getCaptionStatus", () => {
|
|
745
852
|
it('works correctly', () => {
|
|
746
853
|
voiceaService.captionStatus = "enabled"
|