@webex/internal-plugin-voicea 3.12.0-next.6 → 3.12.0-next.60
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 +12 -3
- package/dist/constants.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/types/constants.d.ts +3 -1
- package/dist/types/index.d.ts +2 -2
- package/dist/types/voicea.d.ts +13 -6
- package/dist/types/voicea.types.d.ts +18 -1
- package/dist/voicea.js +29 -18
- package/dist/voicea.js.map +1 -1
- package/dist/voicea.types.js.map +1 -1
- package/package.json +9 -9
- package/src/constants.ts +4 -1
- package/src/index.ts +2 -2
- package/src/voicea.ts +39 -20
- package/src/voicea.types.ts +21 -0
- package/test/unit/spec/voicea.js +54 -25
package/dist/constants.js
CHANGED
|
@@ -4,7 +4,15 @@ 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.LANGUAGE_ASSIGNMENT = exports.EVENT_TRIGGERS = exports.DEFAULT_SPOKEN_LANGUAGE = exports.ANNOUNCE_STATUS = exports.AIBRIDGE_RELAY_TYPES = void 0;
|
|
8
|
+
_Object$defineProperty(exports, "LLM_PRACTICE_SESSION", {
|
|
9
|
+
enumerable: true,
|
|
10
|
+
get: function get() {
|
|
11
|
+
return _internalPluginLlm.LLM_PRACTICE_SESSION;
|
|
12
|
+
}
|
|
13
|
+
});
|
|
14
|
+
exports.VOICEA = exports.TURN_ON_CAPTION_STATUS = exports.TRANSCRIPTION_TYPE = exports.TOGGLE_MANUAL_CAPTION_STATUS = void 0;
|
|
15
|
+
var _internalPluginLlm = require("@webex/internal-plugin-llm");
|
|
8
16
|
var EVENT_TRIGGERS = exports.EVENT_TRIGGERS = {
|
|
9
17
|
VOICEA_ANNOUNCEMENT: 'voicea:announcement',
|
|
10
18
|
CAPTION_LANGUAGE_UPDATE: 'voicea:captionLanguageUpdate',
|
|
@@ -13,6 +21,7 @@ var EVENT_TRIGGERS = exports.EVENT_TRIGGERS = {
|
|
|
13
21
|
TRANSCRIBING_ON: 'voicea:transcribingOn',
|
|
14
22
|
TRANSCRIBING_OFF: 'voicea:transcribingOff',
|
|
15
23
|
NEW_CAPTION: 'voicea:newCaption',
|
|
24
|
+
SPEAKER_NAME_UPDATED: 'voicea:speakerNameUpdated',
|
|
16
25
|
EVA_COMMAND: 'voicea:wxa',
|
|
17
26
|
HIGHLIGHT_CREATED: 'voicea:highlightCreated',
|
|
18
27
|
NEW_MANUAL_CAPTION: 'aibridge:newManualCaption',
|
|
@@ -24,7 +33,8 @@ var AIBRIDGE_RELAY_TYPES = exports.AIBRIDGE_RELAY_TYPES = {
|
|
|
24
33
|
CLIENT_ANNOUNCEMENT: 'client.annc',
|
|
25
34
|
TRANSLATION_REQUEST: 'voicea.transl.req',
|
|
26
35
|
TRANSLATION_RESPONSE: 'voicea.transl.rsp',
|
|
27
|
-
TRANSCRIPTION: 'voicea.transcription'
|
|
36
|
+
TRANSCRIPTION: 'voicea.transcription',
|
|
37
|
+
SPEAKER_NAME_UPDATE: 'voicea.update_speakername'
|
|
28
38
|
},
|
|
29
39
|
MANUAL: {
|
|
30
40
|
TRANSCRIPTION: 'aibridge.manual_transcription',
|
|
@@ -46,7 +56,6 @@ var TRANSCRIPTION_TYPE = exports.TRANSCRIPTION_TYPE = {
|
|
|
46
56
|
};
|
|
47
57
|
var VOICEA = exports.VOICEA = 'voicea';
|
|
48
58
|
var DEFAULT_SPOKEN_LANGUAGE = exports.DEFAULT_SPOKEN_LANGUAGE = 'en';
|
|
49
|
-
var LLM_PRACTICE_SESSION = exports.LLM_PRACTICE_SESSION = 'llm-practice-session';
|
|
50
59
|
var ANNOUNCE_STATUS = exports.ANNOUNCE_STATUS = {
|
|
51
60
|
IDLE: 'idle',
|
|
52
61
|
JOINED: 'joined',
|
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","NEW_MANUAL_CAPTION","LANGUAGE_DETECTED","AIBRIDGE_RELAY_TYPES","VOICEA","ANNOUNCEMENT","CLIENT_ANNOUNCEMENT","TRANSLATION_REQUEST","TRANSLATION_RESPONSE","TRANSCRIPTION","MANUAL","CAPTIONER","TRANSCRIPTION_TYPE","UNKNOWN","EVA_WAKE","EVA_THANKS","EVA_CANCEL","TRANSCRIPT_INTERIM_RESULTS","TRANSCRIPT_FINAL_RESULT","MANUAL_CAPTION_INTERIM_RESULTS","MANUAL_CAPTION_INTERIM_RESULT","MANUAL_CAPTION_FINAL_RESULT","DEFAULT_SPOKEN_LANGUAGE","
|
|
1
|
+
{"version":3,"names":["_internalPluginLlm","require","EVENT_TRIGGERS","exports","VOICEA_ANNOUNCEMENT","CAPTION_LANGUAGE_UPDATE","SPOKEN_LANGUAGE_UPDATE","CAPTIONS_TURNED_ON","TRANSCRIBING_ON","TRANSCRIBING_OFF","NEW_CAPTION","SPEAKER_NAME_UPDATED","EVA_COMMAND","HIGHLIGHT_CREATED","NEW_MANUAL_CAPTION","LANGUAGE_DETECTED","AIBRIDGE_RELAY_TYPES","VOICEA","ANNOUNCEMENT","CLIENT_ANNOUNCEMENT","TRANSLATION_REQUEST","TRANSLATION_RESPONSE","TRANSCRIPTION","SPEAKER_NAME_UPDATE","MANUAL","CAPTIONER","TRANSCRIPTION_TYPE","UNKNOWN","EVA_WAKE","EVA_THANKS","EVA_CANCEL","TRANSCRIPT_INTERIM_RESULTS","TRANSCRIPT_FINAL_RESULT","MANUAL_CAPTION_INTERIM_RESULTS","MANUAL_CAPTION_INTERIM_RESULT","MANUAL_CAPTION_FINAL_RESULT","DEFAULT_SPOKEN_LANGUAGE","ANNOUNCE_STATUS","IDLE","JOINED","JOINING","TURN_ON_CAPTION_STATUS","ENABLED","SENDING","TOGGLE_MANUAL_CAPTION_STATUS","LANGUAGE_ASSIGNMENT","AUTO","DEFAULT"],"sources":["constants.ts"],"sourcesContent":["export {LLM_PRACTICE_SESSION} from '@webex/internal-plugin-llm';\n\nexport 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 SPEAKER_NAME_UPDATED: 'voicea:speakerNameUpdated',\n EVA_COMMAND: 'voicea:wxa',\n HIGHLIGHT_CREATED: 'voicea:highlightCreated',\n NEW_MANUAL_CAPTION: 'aibridge:newManualCaption',\n\n LANGUAGE_DETECTED: 'voicea:languageDetected',\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 SPEAKER_NAME_UPDATE: 'voicea.update_speakername',\n },\n MANUAL: {\n TRANSCRIPTION: 'aibridge.manual_transcription',\n CAPTIONER: 'client.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_INTERIM_RESULT: 'manual_caption_interim_result',\n MANUAL_CAPTION_FINAL_RESULT: 'manual_caption_final_result',\n LANGUAGE_DETECTED: 'language_detected',\n};\n\nexport const VOICEA = 'voicea';\nexport const DEFAULT_SPOKEN_LANGUAGE = 'en';\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\nexport const TOGGLE_MANUAL_CAPTION_STATUS = {\n IDLE: 'idle',\n SENDING: 'sending',\n};\n\nexport const LANGUAGE_ASSIGNMENT = {\n AUTO: 'AUTO',\n MANUAL: 'MANUAL',\n DEFAULT: 'DEFAULT',\n};\n"],"mappings":";;;;;;;;;;;;;;AAAA,IAAAA,kBAAA,GAAAC,OAAA;AAEO,IAAMC,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,oBAAoB,EAAE,2BAA2B;EACjDC,WAAW,EAAE,YAAY;EACzBC,iBAAiB,EAAE,yBAAyB;EAC5CC,kBAAkB,EAAE,2BAA2B;EAE/CC,iBAAiB,EAAE;AACrB,CAAC;AAEM,IAAMC,oBAAoB,GAAAb,OAAA,CAAAa,oBAAA,GAAG;EAClCC,MAAM,EAAE;IACNC,YAAY,EAAE,aAAa;IAC3BC,mBAAmB,EAAE,aAAa;IAClCC,mBAAmB,EAAE,mBAAmB;IACxCC,oBAAoB,EAAE,mBAAmB;IACzCC,aAAa,EAAE,sBAAsB;IACrCC,mBAAmB,EAAE;EACvB,CAAC;EACDC,MAAM,EAAE;IACNF,aAAa,EAAE,+BAA+B;IAC9CG,SAAS,EAAE;EACb;AACF,CAAC;AAEM,IAAMC,kBAAkB,GAAAvB,OAAA,CAAAuB,kBAAA,GAAG;EAChCC,OAAO,EAAE,SAAS;EAClBC,QAAQ,EAAE,UAAU;EACpBC,UAAU,EAAE,YAAY;EACxBC,UAAU,EAAE,YAAY;EACxBjB,iBAAiB,EAAE,mBAAmB;EACtCkB,0BAA0B,EAAE,4BAA4B;EACxDC,uBAAuB,EAAE,yBAAyB;EAClDC,8BAA8B,EAAE,gCAAgC;EAChEC,6BAA6B,EAAE,+BAA+B;EAC9DC,2BAA2B,EAAE,6BAA6B;EAC1DpB,iBAAiB,EAAE;AACrB,CAAC;AAEM,IAAME,MAAM,GAAAd,OAAA,CAAAc,MAAA,GAAG,QAAQ;AACvB,IAAMmB,uBAAuB,GAAAjC,OAAA,CAAAiC,uBAAA,GAAG,IAAI;AAEpC,IAAMC,eAAe,GAAAlC,OAAA,CAAAkC,eAAA,GAAG;EAC7BC,IAAI,EAAE,MAAM;EACZC,MAAM,EAAE,QAAQ;EAChBC,OAAO,EAAE;AACX,CAAC;AAEM,IAAMC,sBAAsB,GAAAtC,OAAA,CAAAsC,sBAAA,GAAG;EACpCH,IAAI,EAAE,MAAM;EACZI,OAAO,EAAE,SAAS;EAClBC,OAAO,EAAE;AACX,CAAC;AAEM,IAAMC,4BAA4B,GAAAzC,OAAA,CAAAyC,4BAAA,GAAG;EAC1CN,IAAI,EAAE,MAAM;EACZK,OAAO,EAAE;AACX,CAAC;AAEM,IAAME,mBAAmB,GAAA1C,OAAA,CAAA0C,mBAAA,GAAG;EACjCC,IAAI,EAAE,MAAM;EACZtB,MAAM,EAAE,QAAQ;EAChBuB,OAAO,EAAE;AACX,CAAC","ignoreList":[]}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["WebexCore","_interopRequireWildcard","require","_voicea","_interopRequireDefault","_constants","e","t","_WeakMap","r","n","__esModule","o","i","f","__proto__","default","_typeof","has","get","set","_t","hasOwnProperty","call","_Object$defineProperty","_Object$getOwnPropertyDescriptor","registerInternalPlugin","VoiceaChannel"],"sources":["index.ts"],"sourcesContent":["import * as WebexCore from '@webex/webex-core';\n\nimport VoiceaChannel from './voicea';\nimport type {MeetingTranscriptPayload} from './voicea.types';\n\nWebexCore.registerInternalPlugin('voicea', VoiceaChannel, {});\n\nexport {default} from './voicea';\nexport {type MeetingTranscriptPayload};\nexport {EVENT_TRIGGERS, TURN_ON_CAPTION_STATUS} from './constants';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,SAAA,GAAAC,uBAAA,CAAAC,OAAA;AAEA,IAAAC,OAAA,GAAAC,sBAAA,CAAAF,OAAA;AAOA,IAAAG,UAAA,GAAAH,OAAA;AAAmE,SAAAD,wBAAAK,CAAA,EAAAC,CAAA,6BAAAC,QAAA,MAAAC,CAAA,OAAAD,QAAA,IAAAE,CAAA,OAAAF,QAAA,YAAAP,uBAAA,YAAAA,wBAAAK,CAAA,EAAAC,CAAA,SAAAA,CAAA,IAAAD,CAAA,IAAAA,CAAA,CAAAK,UAAA,SAAAL,CAAA,MAAAM,CAAA,EAAAC,CAAA,EAAAC,CAAA,KAAAC,SAAA,QAAAC,OAAA,EAAAV,CAAA,iBAAAA,CAAA,gBAAAW,OAAA,CAAAX,CAAA,0BAAAA,CAAA,SAAAQ,CAAA,MAAAF,CAAA,GAAAL,CAAA,GAAAG,CAAA,GAAAD,CAAA,QAAAG,CAAA,CAAAM,GAAA,CAAAZ,CAAA,UAAAM,CAAA,CAAAO,GAAA,CAAAb,CAAA,GAAAM,CAAA,CAAAQ,GAAA,CAAAd,CAAA,EAAAQ,CAAA,cAAAO,EAAA,IAAAf,CAAA,gBAAAe,EAAA,OAAAC,cAAA,CAAAC,IAAA,CAAAjB,CAAA,EAAAe,EAAA,OAAAR,CAAA,IAAAD,CAAA,GAAAY,sBAAA,KAAAC,gCAAA,CAAAnB,CAAA,EAAAe,EAAA,OAAAR,CAAA,CAAAM,GAAA,IAAAN,CAAA,CAAAO,GAAA,IAAAR,CAAA,CAAAE,CAAA,EAAAO,EAAA,EAAAR,CAAA,IAAAC,CAAA,CAAAO,EAAA,IAAAf,CAAA,CAAAe,EAAA,WAAAP,CAAA,KAAAR,CAAA,EAAAC,CAAA;AAJnEP,SAAS,CAAC0B,sBAAsB,CAAC,QAAQ,EAAEC,eAAa,EAAE,CAAC,CAAC,CAAC","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["WebexCore","_interopRequireWildcard","require","_voicea","_interopRequireDefault","_constants","e","t","_WeakMap","r","n","__esModule","o","i","f","__proto__","default","_typeof","has","get","set","_t","hasOwnProperty","call","_Object$defineProperty","_Object$getOwnPropertyDescriptor","registerInternalPlugin","VoiceaChannel"],"sources":["index.ts"],"sourcesContent":["import * as WebexCore from '@webex/webex-core';\n\nimport VoiceaChannel from './voicea';\nimport type {MeetingTranscriptPayload, SpeakerNameUpdatePayload} from './voicea.types';\n\nWebexCore.registerInternalPlugin('voicea', VoiceaChannel, {});\n\nexport {default} from './voicea';\nexport {type MeetingTranscriptPayload, SpeakerNameUpdatePayload};\nexport {EVENT_TRIGGERS, TURN_ON_CAPTION_STATUS} from './constants';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,SAAA,GAAAC,uBAAA,CAAAC,OAAA;AAEA,IAAAC,OAAA,GAAAC,sBAAA,CAAAF,OAAA;AAOA,IAAAG,UAAA,GAAAH,OAAA;AAAmE,SAAAD,wBAAAK,CAAA,EAAAC,CAAA,6BAAAC,QAAA,MAAAC,CAAA,OAAAD,QAAA,IAAAE,CAAA,OAAAF,QAAA,YAAAP,uBAAA,YAAAA,wBAAAK,CAAA,EAAAC,CAAA,SAAAA,CAAA,IAAAD,CAAA,IAAAA,CAAA,CAAAK,UAAA,SAAAL,CAAA,MAAAM,CAAA,EAAAC,CAAA,EAAAC,CAAA,KAAAC,SAAA,QAAAC,OAAA,EAAAV,CAAA,iBAAAA,CAAA,gBAAAW,OAAA,CAAAX,CAAA,0BAAAA,CAAA,SAAAQ,CAAA,MAAAF,CAAA,GAAAL,CAAA,GAAAG,CAAA,GAAAD,CAAA,QAAAG,CAAA,CAAAM,GAAA,CAAAZ,CAAA,UAAAM,CAAA,CAAAO,GAAA,CAAAb,CAAA,GAAAM,CAAA,CAAAQ,GAAA,CAAAd,CAAA,EAAAQ,CAAA,cAAAO,EAAA,IAAAf,CAAA,gBAAAe,EAAA,OAAAC,cAAA,CAAAC,IAAA,CAAAjB,CAAA,EAAAe,EAAA,OAAAR,CAAA,IAAAD,CAAA,GAAAY,sBAAA,KAAAC,gCAAA,CAAAnB,CAAA,EAAAe,EAAA,OAAAR,CAAA,CAAAM,GAAA,IAAAN,CAAA,CAAAO,GAAA,IAAAR,CAAA,CAAAE,CAAA,EAAAO,EAAA,EAAAR,CAAA,IAAAC,CAAA,CAAAO,EAAA,IAAAf,CAAA,CAAAe,EAAA,WAAAP,CAAA,KAAAR,CAAA,EAAAC,CAAA;AAJnEP,SAAS,CAAC0B,sBAAsB,CAAC,QAAQ,EAAEC,eAAa,EAAE,CAAC,CAAC,CAAC","ignoreList":[]}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
export { LLM_PRACTICE_SESSION } from '@webex/internal-plugin-llm';
|
|
1
2
|
export declare const EVENT_TRIGGERS: {
|
|
2
3
|
VOICEA_ANNOUNCEMENT: string;
|
|
3
4
|
CAPTION_LANGUAGE_UPDATE: string;
|
|
@@ -6,6 +7,7 @@ export declare const EVENT_TRIGGERS: {
|
|
|
6
7
|
TRANSCRIBING_ON: string;
|
|
7
8
|
TRANSCRIBING_OFF: string;
|
|
8
9
|
NEW_CAPTION: string;
|
|
10
|
+
SPEAKER_NAME_UPDATED: string;
|
|
9
11
|
EVA_COMMAND: string;
|
|
10
12
|
HIGHLIGHT_CREATED: string;
|
|
11
13
|
NEW_MANUAL_CAPTION: string;
|
|
@@ -18,6 +20,7 @@ export declare const AIBRIDGE_RELAY_TYPES: {
|
|
|
18
20
|
TRANSLATION_REQUEST: string;
|
|
19
21
|
TRANSLATION_RESPONSE: string;
|
|
20
22
|
TRANSCRIPTION: string;
|
|
23
|
+
SPEAKER_NAME_UPDATE: string;
|
|
21
24
|
};
|
|
22
25
|
MANUAL: {
|
|
23
26
|
TRANSCRIPTION: string;
|
|
@@ -39,7 +42,6 @@ export declare const TRANSCRIPTION_TYPE: {
|
|
|
39
42
|
};
|
|
40
43
|
export declare const VOICEA = "voicea";
|
|
41
44
|
export declare const DEFAULT_SPOKEN_LANGUAGE = "en";
|
|
42
|
-
export declare const LLM_PRACTICE_SESSION = "llm-practice-session";
|
|
43
45
|
export declare const ANNOUNCE_STATUS: {
|
|
44
46
|
IDLE: string;
|
|
45
47
|
JOINED: string;
|
package/dist/types/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { MeetingTranscriptPayload } from './voicea.types';
|
|
1
|
+
import type { MeetingTranscriptPayload, SpeakerNameUpdatePayload } from './voicea.types';
|
|
2
2
|
export { default } from './voicea';
|
|
3
|
-
export { type MeetingTranscriptPayload };
|
|
3
|
+
export { type MeetingTranscriptPayload, SpeakerNameUpdatePayload };
|
|
4
4
|
export { EVENT_TRIGGERS, TURN_ON_CAPTION_STATUS } from './constants';
|
package/dist/types/voicea.d.ts
CHANGED
|
@@ -13,7 +13,7 @@ export declare class VoiceaChannel extends WebexPlugin implements IVoiceaChannel
|
|
|
13
13
|
private captionServiceId?;
|
|
14
14
|
private announceStatus;
|
|
15
15
|
private captionStatus;
|
|
16
|
-
private
|
|
16
|
+
private keepTranscriptionSubscribed;
|
|
17
17
|
private toggleManualCaptionStatus;
|
|
18
18
|
private currentSpokenLanguage?;
|
|
19
19
|
private spokenLanguages;
|
|
@@ -44,6 +44,12 @@ export declare class VoiceaChannel extends WebexPlugin implements IVoiceaChannel
|
|
|
44
44
|
* @returns {void}
|
|
45
45
|
*/
|
|
46
46
|
private processManualTranscription;
|
|
47
|
+
/**
|
|
48
|
+
* Process speaker name update and send alert
|
|
49
|
+
* @param {SpeakerNameUpdatePayload} voiceaPayload
|
|
50
|
+
* @returns {void}
|
|
51
|
+
*/
|
|
52
|
+
private processSpeakerNameUpdate;
|
|
47
53
|
/**
|
|
48
54
|
* Process Transcript and send alert
|
|
49
55
|
* @param {TranscriptionResponse} voiceaPayload
|
|
@@ -67,7 +73,7 @@ export declare class VoiceaChannel extends WebexPlugin implements IVoiceaChannel
|
|
|
67
73
|
* @returns {boolean}
|
|
68
74
|
*/
|
|
69
75
|
private isLLMConnected;
|
|
70
|
-
|
|
76
|
+
getKeepTranscriptionSubscribed: () => boolean;
|
|
71
77
|
/**
|
|
72
78
|
* Resolves the active LLM publish transport, preferring the practice-session
|
|
73
79
|
* connection only when that session is fully connected.
|
|
@@ -184,19 +190,20 @@ export declare class VoiceaChannel extends WebexPlugin implements IVoiceaChannel
|
|
|
184
190
|
unsubscribe?: string[];
|
|
185
191
|
}) => Promise<void>;
|
|
186
192
|
/**
|
|
187
|
-
*
|
|
188
|
-
*
|
|
193
|
+
* Updates transcription subchannel subscriptions and records whether the
|
|
194
|
+
* transcription subscription should be kept (and restored on reconnect).
|
|
189
195
|
*
|
|
190
196
|
* @param {Object} [options] - Subscription options.
|
|
191
197
|
* @param {string[]} [options.subscribe] - Subchannels to subscribe to.
|
|
192
198
|
* @param {string[]} [options.unsubscribe] - Subchannels to unsubscribe from.
|
|
193
|
-
* @param {boolean} [
|
|
199
|
+
* @param {boolean} [keepSubscribed=false] - Whether the transcription
|
|
200
|
+
* subscription should be kept and restored on reconnect.
|
|
194
201
|
*
|
|
195
202
|
* @returns {Promise<void>}
|
|
196
203
|
*/
|
|
197
204
|
updateSubchannelSubscriptionsAndSyncCaptionState: (options?: {
|
|
198
205
|
subscribe?: string[];
|
|
199
206
|
unsubscribe?: string[];
|
|
200
|
-
},
|
|
207
|
+
}, keepSubscribed?: boolean) => Promise<void>;
|
|
201
208
|
}
|
|
202
209
|
export default VoiceaChannel;
|
|
@@ -25,6 +25,19 @@ interface Transcription {
|
|
|
25
25
|
csis: number[];
|
|
26
26
|
last_packet_timestamp_ms: number;
|
|
27
27
|
timestamp: string;
|
|
28
|
+
taggedSpeaker?: {
|
|
29
|
+
speakerId?: string[];
|
|
30
|
+
newName?: string;
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
interface TaggedSpeaker {
|
|
34
|
+
csiId: number;
|
|
35
|
+
speakerId: string;
|
|
36
|
+
newName: string;
|
|
37
|
+
}
|
|
38
|
+
interface SpeakerNameUpdatePayload {
|
|
39
|
+
id?: string;
|
|
40
|
+
taggedSpeakers: TaggedSpeaker[];
|
|
28
41
|
}
|
|
29
42
|
/**
|
|
30
43
|
* Highlights
|
|
@@ -88,10 +101,14 @@ type MeetingTranscripts = {
|
|
|
88
101
|
[key: string]: string;
|
|
89
102
|
};
|
|
90
103
|
timestamp?: string;
|
|
104
|
+
taggedSpeaker?: {
|
|
105
|
+
speakerId?: string[];
|
|
106
|
+
newName?: string;
|
|
107
|
+
};
|
|
91
108
|
};
|
|
92
109
|
type MeetingTranscriptPayload = {
|
|
93
110
|
isFinal: boolean;
|
|
94
111
|
transcriptId: string;
|
|
95
112
|
transcripts: Array<MeetingTranscripts>;
|
|
96
113
|
};
|
|
97
|
-
export type { AnnouncementPayload, CaptionLanguageResponse, TranscriptionResponse, Transcription, Highlight, IVoiceaChannel, MeetingTranscriptPayload, };
|
|
114
|
+
export type { AnnouncementPayload, CaptionLanguageResponse, TranscriptionResponse, Transcription, Highlight, TaggedSpeaker, SpeakerNameUpdatePayload, IVoiceaChannel, MeetingTranscriptPayload, };
|
package/dist/voicea.js
CHANGED
|
@@ -52,7 +52,7 @@ var VoiceaChannel = exports.VoiceaChannel = /*#__PURE__*/function (_WebexPlugin)
|
|
|
52
52
|
(0, _defineProperty2.default)(_this, "captionServiceId", void 0);
|
|
53
53
|
(0, _defineProperty2.default)(_this, "announceStatus", void 0);
|
|
54
54
|
(0, _defineProperty2.default)(_this, "captionStatus", void 0);
|
|
55
|
-
(0, _defineProperty2.default)(_this, "
|
|
55
|
+
(0, _defineProperty2.default)(_this, "keepTranscriptionSubscribed", void 0);
|
|
56
56
|
(0, _defineProperty2.default)(_this, "toggleManualCaptionStatus", void 0);
|
|
57
57
|
(0, _defineProperty2.default)(_this, "currentSpokenLanguage", void 0);
|
|
58
58
|
(0, _defineProperty2.default)(_this, "spokenLanguages", []);
|
|
@@ -76,6 +76,9 @@ var VoiceaChannel = exports.VoiceaChannel = /*#__PURE__*/function (_WebexPlugin)
|
|
|
76
76
|
case _constants.AIBRIDGE_RELAY_TYPES.VOICEA.TRANSCRIPTION:
|
|
77
77
|
_this.processTranscription(e.data.voiceaPayload);
|
|
78
78
|
break;
|
|
79
|
+
case _constants.AIBRIDGE_RELAY_TYPES.VOICEA.SPEAKER_NAME_UPDATE:
|
|
80
|
+
_this.processSpeakerNameUpdate(e.data.voiceaPayload);
|
|
81
|
+
break;
|
|
79
82
|
case _constants.AIBRIDGE_RELAY_TYPES.MANUAL.TRANSCRIPTION:
|
|
80
83
|
case _constants.AIBRIDGE_RELAY_TYPES.MANUAL.CAPTIONER:
|
|
81
84
|
_this.processManualTranscription(_objectSpread(_objectSpread({}, e.data.transcriptPayload), {}, {
|
|
@@ -104,6 +107,15 @@ var VoiceaChannel = exports.VoiceaChannel = /*#__PURE__*/function (_WebexPlugin)
|
|
|
104
107
|
});
|
|
105
108
|
}
|
|
106
109
|
});
|
|
110
|
+
/**
|
|
111
|
+
* Process speaker name update and send alert
|
|
112
|
+
* @param {SpeakerNameUpdatePayload} voiceaPayload
|
|
113
|
+
* @returns {void}
|
|
114
|
+
*/
|
|
115
|
+
(0, _defineProperty2.default)(_this, "processSpeakerNameUpdate", function (voiceaPayload) {
|
|
116
|
+
// @ts-ignore
|
|
117
|
+
_this.trigger(_constants.EVENT_TRIGGERS.SPEAKER_NAME_UPDATED, voiceaPayload);
|
|
118
|
+
});
|
|
107
119
|
/**
|
|
108
120
|
* Process Transcript and send alert
|
|
109
121
|
* @param {TranscriptionResponse} voiceaPayload
|
|
@@ -218,8 +230,8 @@ var VoiceaChannel = exports.VoiceaChannel = /*#__PURE__*/function (_WebexPlugin)
|
|
|
218
230
|
_this.webex.internal.llm.isConnected(_constants.LLM_PRACTICE_SESSION)
|
|
219
231
|
);
|
|
220
232
|
});
|
|
221
|
-
(0, _defineProperty2.default)(_this, "
|
|
222
|
-
return _this.
|
|
233
|
+
(0, _defineProperty2.default)(_this, "getKeepTranscriptionSubscribed", function () {
|
|
234
|
+
return _this.keepTranscriptionSubscribed;
|
|
223
235
|
});
|
|
224
236
|
/**
|
|
225
237
|
* Resolves the active LLM publish transport, preferring the practice-session
|
|
@@ -249,10 +261,9 @@ var VoiceaChannel = exports.VoiceaChannel = /*#__PURE__*/function (_WebexPlugin)
|
|
|
249
261
|
socket.send({
|
|
250
262
|
id: "".concat(_this.seqNum),
|
|
251
263
|
type: 'publishRequest',
|
|
252
|
-
recipients: {
|
|
253
|
-
// @ts-ignore
|
|
264
|
+
recipients: [{
|
|
254
265
|
route: binding
|
|
255
|
-
},
|
|
266
|
+
}],
|
|
256
267
|
// If captionServiceId exists, send it as the 'to' header; otherwise keep headers empty.
|
|
257
268
|
headers: _this.captionServiceId ? {
|
|
258
269
|
to: _this.captionServiceId
|
|
@@ -311,10 +322,9 @@ var VoiceaChannel = exports.VoiceaChannel = /*#__PURE__*/function (_WebexPlugin)
|
|
|
311
322
|
socket.send({
|
|
312
323
|
id: "".concat(_this.seqNum),
|
|
313
324
|
type: 'publishRequest',
|
|
314
|
-
recipients: {
|
|
315
|
-
// @ts-ignore
|
|
325
|
+
recipients: [{
|
|
316
326
|
route: binding
|
|
317
|
-
},
|
|
327
|
+
}],
|
|
318
328
|
headers: {
|
|
319
329
|
to: _this.captionServiceId
|
|
320
330
|
},
|
|
@@ -349,10 +359,9 @@ var VoiceaChannel = exports.VoiceaChannel = /*#__PURE__*/function (_WebexPlugin)
|
|
|
349
359
|
socket === null || socket === void 0 ? void 0 : socket.send({
|
|
350
360
|
id: "".concat(_this.seqNum),
|
|
351
361
|
type: 'publishRequest',
|
|
352
|
-
recipients: {
|
|
353
|
-
// @ts-ignore
|
|
362
|
+
recipients: [{
|
|
354
363
|
route: binding
|
|
355
|
-
},
|
|
364
|
+
}],
|
|
356
365
|
headers: {},
|
|
357
366
|
data: {
|
|
358
367
|
eventType: 'relay.event',
|
|
@@ -629,24 +638,26 @@ var VoiceaChannel = exports.VoiceaChannel = /*#__PURE__*/function (_WebexPlugin)
|
|
|
629
638
|
}, _callee2);
|
|
630
639
|
})));
|
|
631
640
|
/**
|
|
632
|
-
*
|
|
633
|
-
*
|
|
641
|
+
* Updates transcription subchannel subscriptions and records whether the
|
|
642
|
+
* transcription subscription should be kept (and restored on reconnect).
|
|
634
643
|
*
|
|
635
644
|
* @param {Object} [options] - Subscription options.
|
|
636
645
|
* @param {string[]} [options.subscribe] - Subchannels to subscribe to.
|
|
637
646
|
* @param {string[]} [options.unsubscribe] - Subchannels to unsubscribe from.
|
|
638
|
-
* @param {boolean} [
|
|
647
|
+
* @param {boolean} [keepSubscribed=false] - Whether the transcription
|
|
648
|
+
* subscription should be kept and restored on reconnect.
|
|
639
649
|
*
|
|
640
650
|
* @returns {Promise<void>}
|
|
641
651
|
*/
|
|
642
652
|
(0, _defineProperty2.default)(_this, "updateSubchannelSubscriptionsAndSyncCaptionState", function () {
|
|
643
653
|
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
644
|
-
var
|
|
645
|
-
_this.
|
|
654
|
+
var keepSubscribed = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
|
655
|
+
_this.keepTranscriptionSubscribed = keepSubscribed;
|
|
646
656
|
return _this.updateSubchannelSubscriptions(options);
|
|
647
657
|
});
|
|
648
658
|
_this.seqNum = 1;
|
|
649
659
|
_this.areCaptionsEnabled = false;
|
|
660
|
+
_this.keepTranscriptionSubscribed = false;
|
|
650
661
|
_this.captionServiceId = undefined;
|
|
651
662
|
_this.announceStatus = _constants.ANNOUNCE_STATUS.IDLE;
|
|
652
663
|
_this.captionStatus = _constants.TURN_ON_CAPTION_STATUS.IDLE;
|
|
@@ -681,7 +692,7 @@ var VoiceaChannel = exports.VoiceaChannel = /*#__PURE__*/function (_WebexPlugin)
|
|
|
681
692
|
key: "deregisterEvents",
|
|
682
693
|
value: function deregisterEvents() {
|
|
683
694
|
this.areCaptionsEnabled = false;
|
|
684
|
-
this.
|
|
695
|
+
this.keepTranscriptionSubscribed = false;
|
|
685
696
|
this.captionServiceId = undefined;
|
|
686
697
|
// @ts-ignore
|
|
687
698
|
this.webex.internal.llm.off('event:relay.event', this.eventProcessor);
|
package/dist/voicea.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_uuid","_interopRequireDefault","require","_webexCore","_constants","_utils","ownKeys","e","r","t","_Object$keys","_Object$getOwnPropertySymbols","o","filter","_Object$getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","Object","forEach","_defineProperty2","default","_Object$getOwnPropertyDescriptors","_Object$defineProperties","_Object$defineProperty","_callSuper","_getPrototypeOf2","_possibleConstructorReturn2","_isNativeReflectConstruct","_Reflect$construct","constructor","Boolean","prototype","valueOf","call","VoiceaChannel","exports","_WebexPlugin","_this","_classCallCheck2","_len","args","Array","_key","concat","VOICEA","_e$headers","seqNum","sequenceNumber","data","relayType","AIBRIDGE_RELAY_TYPES","ANNOUNCEMENT","onCaptionServiceIdUpdate","headers","from","announceStatus","ANNOUNCE_STATUS","JOINED","processAnnouncementMessage","voiceaPayload","TRANSLATION_RESPONSE","processCaptionLanguageResponse","TRANSCRIPTION","processTranscription","MANUAL","CAPTIONER","processManualTranscription","transcriptPayload","sender","data_source","type","TRANSCRIPTION_TYPE","MANUAL_CAPTION_FINAL_RESULT","MANUAL_CAPTION_INTERIM_RESULT","trigger","EVENT_TRIGGERS","NEW_MANUAL_CAPTION","isFinal","transcriptId","id","transcripts","source","TRANSCRIPT_INTERIM_RESULTS","NEW_CAPTION","transcript_id","TRANSCRIPT_FINAL_RESULT","map","transcript","timestamp","millisToMinutesAndSeconds","end_millis","HIGHLIGHT_CREATED","csis","highlight","highlightId","highlight_id","text","highlightLabel","highlight_label","highlightSource","highlight_source","EVA_THANKS","EVA_COMMAND","isListening","command_response","EVA_WAKE","EVA_CANCEL","LANGUAGE_DETECTED","isInSpokenLanguages","spokenLanguages","includes","language","languageCode","statusCode","CAPTION_LANGUAGE_UPDATE","errorCode","errorMessage","message","_voiceaPayload$transl","_voiceaPayload$transl2","_voiceaPayload$transl3","_voiceaPayload$transl4","_voiceaPayload$ASR$sp","_voiceaPayload$ASR","_voiceaPayload$ASR$sp2","_voiceaPayload$ASR2","voiceaLanguageOptions","captionLanguages","translation","allowed_languages","maxLanguages","max_languages","ASR","spoken_languages","currentSpokenLanguage","VOICEA_ANNOUNCEMENT","webex","internal","llm","isConnected","LLM_PRACTICE_SESSION","isCaptionBoxOn","isPracticeSessionConnected","socket","getSocket","binding","getBinding","datachannelUrl","getDatachannelUrl","JOINING","listenToEvents","_this$getPublishTrans","getPublishTransport","send","recipients","route","captionServiceId","to","clientPayload","version","eventType","CLIENT_ANNOUNCEMENT","trackingId","config","trackingIdPrefix","uuid","v4","toString","languageAssignment","request","method","url","getLocusUrl","body","transcribe","spokenLanguage","then","SPOKEN_LANGUAGE_UPDATE","isLLMConnected","_this$getPublishTrans2","translationLanguage","TRANSLATION_REQUEST","currentCaptionLanguage","timeStamp","_this$getPublishTrans3","start_millis","captionStatus","TURN_ON_CAPTION_STATUS","SENDING","caption","CAPTIONS_TURNED_ON","areCaptionsEnabled","ENABLED","announce","updateSubchannelSubscriptionsAndSyncCaptionState","subscribe","catch","IDLE","Error","isAnnounceProcessed","sendAnnouncement","_ref","_asyncToGenerator2","_regenerator","mark","_callee","wrap","_context","prev","next","abrupt","undefined","requestTurnOnCaptions","stop","_x","activate","transcribing","turnOnCaptions","enable","toggleManualCaptionStatus","TOGGLE_MANUAL_CAPTION_STATUS","manualCaption","meetingId","serviceId","requestLanguage","_callee2","_ref3","_ref3$subscribe","_ref3$unsubscribe","unsubscribe","isDataChannelTokenEnabled","_this$getPublishTrans4","_args2","_context2","sent","datachannelUri","options","updateSubchannelSubscriptions","DEFAULT_SPOKEN_LANGUAGE","_inherits2","_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 LLM_PRACTICE_SESSION,\n ANNOUNCE_STATUS,\n TURN_ON_CAPTION_STATUS,\n TOGGLE_MANUAL_CAPTION_STATUS,\n DEFAULT_SPOKEN_LANGUAGE,\n LANGUAGE_ASSIGNMENT,\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 captionServiceId?: string;\n\n private announceStatus: string;\n\n private captionStatus: string;\n\n private isCaptionBoxOn: boolean;\n\n private toggleManualCaptionStatus: string;\n\n private currentSpokenLanguage?: string;\n\n private spokenLanguages: string[] = [];\n\n private currentCaptionLanguage?: 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.onCaptionServiceIdUpdate(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 case AIBRIDGE_RELAY_TYPES.MANUAL.CAPTIONER:\n this.processManualTranscription({\n ...e.data.transcriptPayload,\n sender: e.headers?.from,\n data_source: e.data.relayType,\n });\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 // @ts-ignore\n this.webex.internal.llm.on(`event:relay.event:${LLM_PRACTICE_SESSION}`, 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.isCaptionBoxOn = false;\n this.captionServiceId = undefined;\n // @ts-ignore\n this.webex.internal.llm.off('event:relay.event', this.eventProcessor);\n // @ts-ignore\n this.webex.internal.llm.off(`event:relay.event:${LLM_PRACTICE_SESSION}`, this.eventProcessor);\n this.hasSubscribedToEvents = false;\n this.announceStatus = ANNOUNCE_STATUS.IDLE;\n this.captionStatus = TURN_ON_CAPTION_STATUS.IDLE;\n this.toggleManualCaptionStatus = TOGGLE_MANUAL_CAPTION_STATUS.IDLE;\n this.currentSpokenLanguage = undefined;\n this.currentCaptionLanguage = undefined;\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.captionServiceId = undefined;\n this.announceStatus = ANNOUNCE_STATUS.IDLE;\n this.captionStatus = TURN_ON_CAPTION_STATUS.IDLE;\n this.toggleManualCaptionStatus = TOGGLE_MANUAL_CAPTION_STATUS.IDLE;\n this.currentSpokenLanguage = DEFAULT_SPOKEN_LANGUAGE;\n this.currentCaptionLanguage = undefined;\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 if (\n transcriptPayload.type === TRANSCRIPTION_TYPE.MANUAL_CAPTION_FINAL_RESULT ||\n transcriptPayload.type === TRANSCRIPTION_TYPE.MANUAL_CAPTION_INTERIM_RESULT\n ) {\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 sender: transcriptPayload.sender,\n source: transcriptPayload.data_source,\n });\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.map((transcript) => {\n transcript.timestamp = millisToMinutesAndSeconds(transcript.end_millis);\n\n return transcript;\n }),\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 case TRANSCRIPTION_TYPE.LANGUAGE_DETECTED: {\n const isInSpokenLanguages = this.spokenLanguages.includes(voiceaPayload.language);\n\n if (isInSpokenLanguages) {\n // @ts-ignore\n this.trigger(EVENT_TRIGGERS.LANGUAGE_DETECTED, {\n languageCode: voiceaPayload.language,\n });\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 // @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 currentSpokenLanguage: this.currentSpokenLanguage,\n };\n\n this.spokenLanguages = voiceaPayload?.ASR?.spoken_languages ?? [];\n // @ts-ignore\n this.trigger(EVENT_TRIGGERS.VOICEA_ANNOUNCEMENT, voiceaLanguageOptions);\n };\n\n /**\n * Indicates whether the default or practice-session LLM connection is active.\n * @returns {boolean}\n */\n private isLLMConnected = (): boolean =>\n // @ts-ignore\n this.webex.internal.llm.isConnected() ||\n // @ts-ignore\n this.webex.internal.llm.isConnected(LLM_PRACTICE_SESSION);\n\n public getIsCaptionBoxOn = (): boolean => this.isCaptionBoxOn;\n\n /**\n * Resolves the active LLM publish transport, preferring the practice-session\n * connection only when that session is fully connected.\n * @returns {Object}\n */\n private getPublishTransport = () => {\n // @ts-ignore\n const {llm} = this.webex.internal;\n const isPracticeSessionConnected = llm.isConnected(LLM_PRACTICE_SESSION);\n\n return {\n socket: (isPracticeSessionConnected && llm.getSocket(LLM_PRACTICE_SESSION)) || llm.socket,\n binding:\n (isPracticeSessionConnected && llm.getBinding(LLM_PRACTICE_SESSION)) || llm.getBinding(),\n datachannelUrl:\n (isPracticeSessionConnected && llm.getDatachannelUrl(LLM_PRACTICE_SESSION)) ||\n llm.getDatachannelUrl(),\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 const {socket, binding} = this.getPublishTransport();\n socket.send({\n id: `${this.seqNum}`,\n type: 'publishRequest',\n recipients: {\n // @ts-ignore\n route: binding,\n },\n // If captionServiceId exists, send it as the 'to' header; otherwise keep headers empty.\n headers: this.captionServiceId ? {to: this.captionServiceId} : {},\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 * @param {\"DEFAULT\" | \"AUTO\" | \"MANUAL\"} languageAssignment\n * @returns {Promise}\n */\n public setSpokenLanguage = (\n languageCode: string,\n languageAssignment?: 'DEFAULT' | 'AUTO' | 'MANUAL'\n ): 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 ...(languageAssignment && {languageAssignment}),\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 if (!this.isLLMConnected()) {\n return;\n }\n\n const {socket, binding} = this.getPublishTransport();\n socket.send({\n id: `${this.seqNum}`,\n type: 'publishRequest',\n recipients: {\n // @ts-ignore\n route: binding,\n },\n headers: {\n to: this.captionServiceId,\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.currentCaptionLanguage = languageCode;\n\n this.seqNum += 1;\n };\n\n /**\n * Send manual closed captions to voicea service\n * @param {string} text\n * @param {number} timeStamp\n * @param {number[]} csis\n * @param {boolean} isFinal\n * @returns {void}\n */\n public sendManualClosedCaption = (\n text: string,\n timeStamp: number,\n csis: number[],\n isFinal: boolean\n ): void => {\n if (!this.isLLMConnected()) {\n return;\n }\n\n const {socket, binding} = this.getPublishTransport();\n\n socket?.send({\n id: `${this.seqNum}`,\n type: 'publishRequest',\n recipients: {\n // @ts-ignore\n route: binding,\n },\n headers: {},\n data: {\n eventType: 'relay.event',\n relayType: AIBRIDGE_RELAY_TYPES.MANUAL.CAPTIONER,\n transcriptPayload: {\n type: isFinal\n ? TRANSCRIPTION_TYPE.MANUAL_CAPTION_FINAL_RESULT\n : TRANSCRIPTION_TYPE.MANUAL_CAPTION_INTERIM_RESULT,\n id: uuid.v4(),\n transcripts: [\n {\n text,\n start_millis: timeStamp,\n end_millis: timeStamp,\n csis,\n },\n ],\n transcript_id: uuid.v4(),\n },\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 this.updateSubchannelSubscriptionsAndSyncCaptionState({subscribe: ['transcription']}, true);\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 * is announce processed\n * @returns {boolean}\n */\n private isAnnounceProcessed = () => this.announceStatus === ANNOUNCE_STATUS.JOINED;\n\n /**\n * announce to voicea data chanel\n * @returns {void}\n */\n public announce = () => {\n if (this.isAnnounceProcessed()) {\n return;\n }\n if (!this.isLLMConnected()) {\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.captionStatus === TURN_ON_CAPTION_STATUS.SENDING) return undefined;\n\n if (!this.isLLMConnected()) {\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 {boolean} activate true means to turn on transcribing and false means to turn off\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 {boolean} enable true means to turn on manual caption, false means to turn off\n * @returns {Promise}\n */\n public toggleManualCaption = (enable: boolean): undefined | Promise<void> => {\n if (this.toggleManualCaptionStatus === TOGGLE_MANUAL_CAPTION_STATUS.SENDING) return undefined;\n\n this.toggleManualCaptionStatus = TOGGLE_MANUAL_CAPTION_STATUS.SENDING;\n\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 })\n .then((): undefined | Promise<void> => {\n this.toggleManualCaptionStatus = TOGGLE_MANUAL_CAPTION_STATUS.IDLE;\n\n return undefined;\n })\n .catch(() => {\n this.toggleManualCaptionStatus = TOGGLE_MANUAL_CAPTION_STATUS.IDLE;\n throw new Error('toggle manual captions fail');\n });\n };\n\n /**\n * In meeting Spoken Language changed event\n * @param {string} languageCode\n * @param {string} meetingId\n * @returns {void}\n */\n public onSpokenLanguageUpdate = (languageCode: string, meetingId): void => {\n // @ts-ignore\n this.trigger(EVENT_TRIGGERS.SPOKEN_LANGUAGE_UPDATE, {languageCode, meetingId});\n this.currentSpokenLanguage = languageCode;\n };\n\n /**\n * In meeting Spoken Language changed event\n * @param {string} serviceId\n * @returns {void}\n */\n public onCaptionServiceIdUpdate = (serviceId: string): void => {\n if (!serviceId) {\n return;\n }\n if (this.captionServiceId !== serviceId) {\n this.captionServiceId = serviceId;\n // if service id value has changed and the translation language has been set, client needs to resend the translator language message to the LLM.\n if (this.currentCaptionLanguage) {\n this.requestLanguage(this.currentCaptionLanguage);\n }\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 * update LLM sub‑channel subscriptions.\n *\n * sends a single `subchannelSubscriptionRequest` to LLM,\n * allowing subscribe and unsubscribe subchannel.\n *\n * @param {string[]} options.subscribe Sub‑channels to subscribe to.\n * @param {string[]} options.unsubscribe Sub‑channels to unsubscribe from.\n * @returns {Promise}\n */\n public updateSubchannelSubscriptions = async ({\n subscribe = [],\n unsubscribe = [],\n }: {\n subscribe?: string[];\n unsubscribe?: string[];\n } = {}): Promise<void> => {\n // @ts-ignore\n const isDataChannelTokenEnabled = await this.webex.internal.llm.isDataChannelTokenEnabled();\n // @ts-ignore\n if (!this.isLLMConnected() || !isDataChannelTokenEnabled) return;\n\n const {socket, datachannelUrl} = this.getPublishTransport();\n\n // @ts-ignore\n socket.send({\n id: `${this.seqNum}`,\n type: 'subchannelSubscriptionRequest',\n data: {\n // @ts-ignore\n datachannelUri: datachannelUrl,\n subscribe,\n unsubscribe,\n },\n trackingId: `${config.trackingIdPrefix}_${uuid.v4().toString()}`,\n });\n\n this.seqNum += 1;\n };\n\n /**\n * Syncs the UI caption intent and updates transcription subchannel\n * subscriptions accordingly.\n *\n * @param {Object} [options] - Subscription options.\n * @param {string[]} [options.subscribe] - Subchannels to subscribe to.\n * @param {string[]} [options.unsubscribe] - Subchannels to unsubscribe from.\n * @param {boolean} [isCaptionBoxOn=false] - Whether captions are intended to be enabled.\n *\n * @returns {Promise<void>}\n */\n public updateSubchannelSubscriptionsAndSyncCaptionState = (\n options: {\n subscribe?: string[];\n unsubscribe?: string[];\n } = {},\n isCaptionBoxOn = false\n ): Promise<void> => {\n this.isCaptionBoxOn = isCaptionBoxOn;\n\n return this.updateSubchannelSubscriptions(options);\n };\n}\n\nexport default VoiceaChannel;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["_uuid","_interopRequireDefault","require","_webexCore","_constants","_utils","ownKeys","e","r","t","_Object$keys","_Object$getOwnPropertySymbols","o","filter","_Object$getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","Object","forEach","_defineProperty2","default","_Object$getOwnPropertyDescriptors","_Object$defineProperties","_Object$defineProperty","_callSuper","_getPrototypeOf2","_possibleConstructorReturn2","_isNativeReflectConstruct","_Reflect$construct","constructor","Boolean","prototype","valueOf","call","VoiceaChannel","exports","_WebexPlugin","_this","_classCallCheck2","_len","args","Array","_key","concat","VOICEA","_e$headers","seqNum","sequenceNumber","data","relayType","AIBRIDGE_RELAY_TYPES","ANNOUNCEMENT","onCaptionServiceIdUpdate","headers","from","announceStatus","ANNOUNCE_STATUS","JOINED","processAnnouncementMessage","voiceaPayload","TRANSLATION_RESPONSE","processCaptionLanguageResponse","TRANSCRIPTION","processTranscription","SPEAKER_NAME_UPDATE","processSpeakerNameUpdate","MANUAL","CAPTIONER","processManualTranscription","transcriptPayload","sender","data_source","type","TRANSCRIPTION_TYPE","MANUAL_CAPTION_FINAL_RESULT","MANUAL_CAPTION_INTERIM_RESULT","trigger","EVENT_TRIGGERS","NEW_MANUAL_CAPTION","isFinal","transcriptId","id","transcripts","source","SPEAKER_NAME_UPDATED","TRANSCRIPT_INTERIM_RESULTS","NEW_CAPTION","transcript_id","TRANSCRIPT_FINAL_RESULT","map","transcript","timestamp","millisToMinutesAndSeconds","end_millis","HIGHLIGHT_CREATED","csis","highlight","highlightId","highlight_id","text","highlightLabel","highlight_label","highlightSource","highlight_source","EVA_THANKS","EVA_COMMAND","isListening","command_response","EVA_WAKE","EVA_CANCEL","LANGUAGE_DETECTED","isInSpokenLanguages","spokenLanguages","includes","language","languageCode","statusCode","CAPTION_LANGUAGE_UPDATE","errorCode","errorMessage","message","_voiceaPayload$transl","_voiceaPayload$transl2","_voiceaPayload$transl3","_voiceaPayload$transl4","_voiceaPayload$ASR$sp","_voiceaPayload$ASR","_voiceaPayload$ASR$sp2","_voiceaPayload$ASR2","voiceaLanguageOptions","captionLanguages","translation","allowed_languages","maxLanguages","max_languages","ASR","spoken_languages","currentSpokenLanguage","VOICEA_ANNOUNCEMENT","webex","internal","llm","isConnected","LLM_PRACTICE_SESSION","keepTranscriptionSubscribed","isPracticeSessionConnected","socket","getSocket","binding","getBinding","datachannelUrl","getDatachannelUrl","JOINING","listenToEvents","_this$getPublishTrans","getPublishTransport","send","recipients","route","captionServiceId","to","clientPayload","version","eventType","CLIENT_ANNOUNCEMENT","trackingId","config","trackingIdPrefix","uuid","v4","toString","languageAssignment","request","method","url","getLocusUrl","body","transcribe","spokenLanguage","then","SPOKEN_LANGUAGE_UPDATE","isLLMConnected","_this$getPublishTrans2","translationLanguage","TRANSLATION_REQUEST","currentCaptionLanguage","timeStamp","_this$getPublishTrans3","start_millis","captionStatus","TURN_ON_CAPTION_STATUS","SENDING","caption","CAPTIONS_TURNED_ON","areCaptionsEnabled","ENABLED","announce","updateSubchannelSubscriptionsAndSyncCaptionState","subscribe","catch","IDLE","Error","isAnnounceProcessed","sendAnnouncement","_ref","_asyncToGenerator2","_regenerator","mark","_callee","wrap","_context","prev","next","abrupt","undefined","requestTurnOnCaptions","stop","_x","activate","transcribing","turnOnCaptions","enable","toggleManualCaptionStatus","TOGGLE_MANUAL_CAPTION_STATUS","manualCaption","meetingId","serviceId","requestLanguage","_callee2","_ref3","_ref3$subscribe","_ref3$unsubscribe","unsubscribe","isDataChannelTokenEnabled","_this$getPublishTrans4","_args2","_context2","sent","datachannelUri","options","keepSubscribed","updateSubchannelSubscriptions","DEFAULT_SPOKEN_LANGUAGE","_inherits2","_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 LLM_PRACTICE_SESSION,\n ANNOUNCE_STATUS,\n TURN_ON_CAPTION_STATUS,\n TOGGLE_MANUAL_CAPTION_STATUS,\n DEFAULT_SPOKEN_LANGUAGE,\n LANGUAGE_ASSIGNMENT,\n} from './constants';\n// eslint-disable-next-line no-unused-vars\nimport {\n AnnouncementPayload,\n CaptionLanguageResponse,\n SpeakerNameUpdatePayload,\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 captionServiceId?: string;\n\n private announceStatus: string;\n\n private captionStatus: string;\n\n private keepTranscriptionSubscribed: boolean;\n\n private toggleManualCaptionStatus: string;\n\n private currentSpokenLanguage?: string;\n\n private spokenLanguages: string[] = [];\n\n private currentCaptionLanguage?: 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.onCaptionServiceIdUpdate(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.VOICEA.SPEAKER_NAME_UPDATE:\n this.processSpeakerNameUpdate(e.data.voiceaPayload);\n break;\n case AIBRIDGE_RELAY_TYPES.MANUAL.TRANSCRIPTION:\n case AIBRIDGE_RELAY_TYPES.MANUAL.CAPTIONER:\n this.processManualTranscription({\n ...e.data.transcriptPayload,\n sender: e.headers?.from,\n data_source: e.data.relayType,\n });\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 // @ts-ignore\n this.webex.internal.llm.on(`event:relay.event:${LLM_PRACTICE_SESSION}`, 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.keepTranscriptionSubscribed = false;\n this.captionServiceId = undefined;\n // @ts-ignore\n this.webex.internal.llm.off('event:relay.event', this.eventProcessor);\n // @ts-ignore\n this.webex.internal.llm.off(`event:relay.event:${LLM_PRACTICE_SESSION}`, this.eventProcessor);\n this.hasSubscribedToEvents = false;\n this.announceStatus = ANNOUNCE_STATUS.IDLE;\n this.captionStatus = TURN_ON_CAPTION_STATUS.IDLE;\n this.toggleManualCaptionStatus = TOGGLE_MANUAL_CAPTION_STATUS.IDLE;\n this.currentSpokenLanguage = undefined;\n this.currentCaptionLanguage = undefined;\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.keepTranscriptionSubscribed = false;\n this.captionServiceId = undefined;\n this.announceStatus = ANNOUNCE_STATUS.IDLE;\n this.captionStatus = TURN_ON_CAPTION_STATUS.IDLE;\n this.toggleManualCaptionStatus = TOGGLE_MANUAL_CAPTION_STATUS.IDLE;\n this.currentSpokenLanguage = DEFAULT_SPOKEN_LANGUAGE;\n this.currentCaptionLanguage = undefined;\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 if (\n transcriptPayload.type === TRANSCRIPTION_TYPE.MANUAL_CAPTION_FINAL_RESULT ||\n transcriptPayload.type === TRANSCRIPTION_TYPE.MANUAL_CAPTION_INTERIM_RESULT\n ) {\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 sender: transcriptPayload.sender,\n source: transcriptPayload.data_source,\n });\n }\n };\n\n /**\n * Process speaker name update and send alert\n * @param {SpeakerNameUpdatePayload} voiceaPayload\n * @returns {void}\n */\n private processSpeakerNameUpdate = (voiceaPayload: SpeakerNameUpdatePayload): void => {\n // @ts-ignore\n this.trigger(EVENT_TRIGGERS.SPEAKER_NAME_UPDATED, voiceaPayload);\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.map((transcript) => {\n transcript.timestamp = millisToMinutesAndSeconds(transcript.end_millis);\n\n return transcript;\n }),\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 case TRANSCRIPTION_TYPE.LANGUAGE_DETECTED: {\n const isInSpokenLanguages = this.spokenLanguages.includes(voiceaPayload.language);\n\n if (isInSpokenLanguages) {\n // @ts-ignore\n this.trigger(EVENT_TRIGGERS.LANGUAGE_DETECTED, {\n languageCode: voiceaPayload.language,\n });\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 // @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 currentSpokenLanguage: this.currentSpokenLanguage,\n };\n\n this.spokenLanguages = voiceaPayload?.ASR?.spoken_languages ?? [];\n // @ts-ignore\n this.trigger(EVENT_TRIGGERS.VOICEA_ANNOUNCEMENT, voiceaLanguageOptions);\n };\n\n /**\n * Indicates whether the default or practice-session LLM connection is active.\n * @returns {boolean}\n */\n private isLLMConnected = (): boolean =>\n // @ts-ignore\n this.webex.internal.llm.isConnected() ||\n // @ts-ignore\n this.webex.internal.llm.isConnected(LLM_PRACTICE_SESSION);\n\n public getKeepTranscriptionSubscribed = (): boolean => this.keepTranscriptionSubscribed;\n\n /**\n * Resolves the active LLM publish transport, preferring the practice-session\n * connection only when that session is fully connected.\n * @returns {Object}\n */\n private getPublishTransport = () => {\n // @ts-ignore\n const {llm} = this.webex.internal;\n const isPracticeSessionConnected = llm.isConnected(LLM_PRACTICE_SESSION);\n\n return {\n socket: (isPracticeSessionConnected && llm.getSocket(LLM_PRACTICE_SESSION)) || llm.socket,\n binding:\n (isPracticeSessionConnected && llm.getBinding(LLM_PRACTICE_SESSION)) || llm.getBinding(),\n datachannelUrl:\n (isPracticeSessionConnected && llm.getDatachannelUrl(LLM_PRACTICE_SESSION)) ||\n llm.getDatachannelUrl(),\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 const {socket, binding} = this.getPublishTransport();\n socket.send({\n id: `${this.seqNum}`,\n type: 'publishRequest',\n recipients: [\n {\n route: binding,\n },\n ],\n // If captionServiceId exists, send it as the 'to' header; otherwise keep headers empty.\n headers: this.captionServiceId ? {to: this.captionServiceId} : {},\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 * @param {\"DEFAULT\" | \"AUTO\" | \"MANUAL\"} languageAssignment\n * @returns {Promise}\n */\n public setSpokenLanguage = (\n languageCode: string,\n languageAssignment?: 'DEFAULT' | 'AUTO' | 'MANUAL'\n ): 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 ...(languageAssignment && {languageAssignment}),\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 if (!this.isLLMConnected()) {\n return;\n }\n\n const {socket, binding} = this.getPublishTransport();\n socket.send({\n id: `${this.seqNum}`,\n type: 'publishRequest',\n recipients: [\n {\n route: binding,\n },\n ],\n headers: {\n to: this.captionServiceId,\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.currentCaptionLanguage = languageCode;\n\n this.seqNum += 1;\n };\n\n /**\n * Send manual closed captions to voicea service\n * @param {string} text\n * @param {number} timeStamp\n * @param {number[]} csis\n * @param {boolean} isFinal\n * @returns {void}\n */\n public sendManualClosedCaption = (\n text: string,\n timeStamp: number,\n csis: number[],\n isFinal: boolean\n ): void => {\n if (!this.isLLMConnected()) {\n return;\n }\n\n const {socket, binding} = this.getPublishTransport();\n\n socket?.send({\n id: `${this.seqNum}`,\n type: 'publishRequest',\n recipients: [\n {\n route: binding,\n },\n ],\n headers: {},\n data: {\n eventType: 'relay.event',\n relayType: AIBRIDGE_RELAY_TYPES.MANUAL.CAPTIONER,\n transcriptPayload: {\n type: isFinal\n ? TRANSCRIPTION_TYPE.MANUAL_CAPTION_FINAL_RESULT\n : TRANSCRIPTION_TYPE.MANUAL_CAPTION_INTERIM_RESULT,\n id: uuid.v4(),\n transcripts: [\n {\n text,\n start_millis: timeStamp,\n end_millis: timeStamp,\n csis,\n },\n ],\n transcript_id: uuid.v4(),\n },\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 this.updateSubchannelSubscriptionsAndSyncCaptionState({subscribe: ['transcription']}, true);\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 * is announce processed\n * @returns {boolean}\n */\n private isAnnounceProcessed = () => this.announceStatus === ANNOUNCE_STATUS.JOINED;\n\n /**\n * announce to voicea data chanel\n * @returns {void}\n */\n public announce = () => {\n if (this.isAnnounceProcessed()) {\n return;\n }\n if (!this.isLLMConnected()) {\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.captionStatus === TURN_ON_CAPTION_STATUS.SENDING) return undefined;\n\n if (!this.isLLMConnected()) {\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 {boolean} activate true means to turn on transcribing and false means to turn off\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 {boolean} enable true means to turn on manual caption, false means to turn off\n * @returns {Promise}\n */\n public toggleManualCaption = (enable: boolean): undefined | Promise<void> => {\n if (this.toggleManualCaptionStatus === TOGGLE_MANUAL_CAPTION_STATUS.SENDING) return undefined;\n\n this.toggleManualCaptionStatus = TOGGLE_MANUAL_CAPTION_STATUS.SENDING;\n\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 })\n .then((): undefined | Promise<void> => {\n this.toggleManualCaptionStatus = TOGGLE_MANUAL_CAPTION_STATUS.IDLE;\n\n return undefined;\n })\n .catch(() => {\n this.toggleManualCaptionStatus = TOGGLE_MANUAL_CAPTION_STATUS.IDLE;\n throw new Error('toggle manual captions fail');\n });\n };\n\n /**\n * In meeting Spoken Language changed event\n * @param {string} languageCode\n * @param {string} meetingId\n * @returns {void}\n */\n public onSpokenLanguageUpdate = (languageCode: string, meetingId): void => {\n // @ts-ignore\n this.trigger(EVENT_TRIGGERS.SPOKEN_LANGUAGE_UPDATE, {languageCode, meetingId});\n this.currentSpokenLanguage = languageCode;\n };\n\n /**\n * In meeting Spoken Language changed event\n * @param {string} serviceId\n * @returns {void}\n */\n public onCaptionServiceIdUpdate = (serviceId: string): void => {\n if (!serviceId) {\n return;\n }\n if (this.captionServiceId !== serviceId) {\n this.captionServiceId = serviceId;\n // if service id value has changed and the translation language has been set, client needs to resend the translator language message to the LLM.\n if (this.currentCaptionLanguage) {\n this.requestLanguage(this.currentCaptionLanguage);\n }\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 * update LLM sub‑channel subscriptions.\n *\n * sends a single `subchannelSubscriptionRequest` to LLM,\n * allowing subscribe and unsubscribe subchannel.\n *\n * @param {string[]} options.subscribe Sub‑channels to subscribe to.\n * @param {string[]} options.unsubscribe Sub‑channels to unsubscribe from.\n * @returns {Promise}\n */\n public updateSubchannelSubscriptions = async ({\n subscribe = [],\n unsubscribe = [],\n }: {\n subscribe?: string[];\n unsubscribe?: string[];\n } = {}): Promise<void> => {\n // @ts-ignore\n const isDataChannelTokenEnabled = await this.webex.internal.llm.isDataChannelTokenEnabled();\n // @ts-ignore\n if (!this.isLLMConnected() || !isDataChannelTokenEnabled) return;\n\n const {socket, datachannelUrl} = this.getPublishTransport();\n\n // @ts-ignore\n socket.send({\n id: `${this.seqNum}`,\n type: 'subchannelSubscriptionRequest',\n data: {\n // @ts-ignore\n datachannelUri: datachannelUrl,\n subscribe,\n unsubscribe,\n },\n trackingId: `${config.trackingIdPrefix}_${uuid.v4().toString()}`,\n });\n\n this.seqNum += 1;\n };\n\n /**\n * Updates transcription subchannel subscriptions and records whether the\n * transcription subscription should be kept (and restored on reconnect).\n *\n * @param {Object} [options] - Subscription options.\n * @param {string[]} [options.subscribe] - Subchannels to subscribe to.\n * @param {string[]} [options.unsubscribe] - Subchannels to unsubscribe from.\n * @param {boolean} [keepSubscribed=false] - Whether the transcription\n * subscription should be kept and restored on reconnect.\n *\n * @returns {Promise<void>}\n */\n public updateSubchannelSubscriptionsAndSyncCaptionState = (\n options: {\n subscribe?: string[];\n unsubscribe?: string[];\n } = {},\n keepSubscribed = false\n ): Promise<void> => {\n this.keepTranscriptionSubscribed = keepSubscribed;\n\n return this.updateSubchannelSubscriptions(options);\n };\n}\n\nexport default VoiceaChannel;\n"],"mappings":"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","ignoreList":[]}
|
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 | 'manual_caption_interim_results'\n | 'manual_caption_interim_result'\n | 'manual_caption_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 timestamp: string;\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 sender: string;\n data_source: 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 language: 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 onSpokenLanguageUpdate: (languageCode: string, meetingId: string) => void;\n requestLanguage: (languageCode: string) => void;\n turnOnCaptions: () => undefined | Promise<void>;\n toggleTranscribing: (activate: boolean, spokenLanguage: string) => undefined | Promise<void>;\n deregisterEvents: () => void;\n toggleManualCaption: (enable: boolean) => undefined | Promise<void>;\n sendManualClosedCaption: (\n text: string,\n timeStamp: number,\n csis: number[],\n isFinal: boolean\n ) => void;\n}\n\ntype MeetingTranscripts = {\n start_mills?: number;\n end_mills?: number;\n text: string;\n last_packet_timestamp_ms?: number;\n csis: Array<number>;\n transcript_language_code: string;\n translations?: {\n [key: string]: string;\n };\n timestamp?: string;\n};\n\ntype MeetingTranscriptPayload = {\n isFinal: boolean;\n transcriptId: string;\n transcripts: Array<MeetingTranscripts>;\n};\n\nexport type {\n AnnouncementPayload,\n CaptionLanguageResponse,\n TranscriptionResponse,\n Transcription,\n Highlight,\n IVoiceaChannel,\n MeetingTranscriptPayload,\n};\n"],"mappings":"","ignoreList":[]}
|
|
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 | 'manual_caption_interim_results'\n | 'manual_caption_interim_result'\n | 'manual_caption_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 timestamp: string;\n taggedSpeaker?: {\n speakerId?: string[];\n newName?: string;\n };\n}\n\ninterface TaggedSpeaker {\n csiId: number;\n speakerId: string;\n newName: string;\n}\n\ninterface SpeakerNameUpdatePayload {\n id?: string;\n taggedSpeakers: TaggedSpeaker[];\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 sender: string;\n data_source: 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 language: 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 onSpokenLanguageUpdate: (languageCode: string, meetingId: string) => void;\n requestLanguage: (languageCode: string) => void;\n turnOnCaptions: () => undefined | Promise<void>;\n toggleTranscribing: (activate: boolean, spokenLanguage: string) => undefined | Promise<void>;\n deregisterEvents: () => void;\n toggleManualCaption: (enable: boolean) => undefined | Promise<void>;\n sendManualClosedCaption: (\n text: string,\n timeStamp: number,\n csis: number[],\n isFinal: boolean\n ) => void;\n}\n\ntype MeetingTranscripts = {\n start_mills?: number;\n end_mills?: number;\n text: string;\n last_packet_timestamp_ms?: number;\n csis: Array<number>;\n transcript_language_code: string;\n translations?: {\n [key: string]: string;\n };\n timestamp?: string;\n taggedSpeaker?: {\n speakerId?: string[];\n newName?: string;\n };\n};\n\ntype MeetingTranscriptPayload = {\n isFinal: boolean;\n transcriptId: string;\n transcripts: Array<MeetingTranscripts>;\n};\n\nexport type {\n AnnouncementPayload,\n CaptionLanguageResponse,\n TranscriptionResponse,\n Transcription,\n Highlight,\n TaggedSpeaker,\n SpeakerNameUpdatePayload,\n IVoiceaChannel,\n MeetingTranscriptPayload,\n};\n"],"mappings":"","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -14,9 +14,9 @@
|
|
|
14
14
|
"node": ">=18"
|
|
15
15
|
},
|
|
16
16
|
"dependencies": {
|
|
17
|
-
"@webex/internal-plugin-llm": "3.12.0-next.
|
|
18
|
-
"@webex/internal-plugin-mercury": "3.12.0-next.
|
|
19
|
-
"@webex/webex-core": "3.12.0-next.
|
|
17
|
+
"@webex/internal-plugin-llm": "3.12.0-next.57",
|
|
18
|
+
"@webex/internal-plugin-mercury": "3.12.0-next.54",
|
|
19
|
+
"@webex/webex-core": "3.12.0-next.50",
|
|
20
20
|
"uuid": "^3.3.2"
|
|
21
21
|
},
|
|
22
22
|
"browserify": {
|
|
@@ -31,11 +31,11 @@
|
|
|
31
31
|
"@webex/eslint-config-legacy": "0.0.0",
|
|
32
32
|
"@webex/jest-config-legacy": "0.0.0",
|
|
33
33
|
"@webex/legacy-tools": "0.0.0",
|
|
34
|
-
"@webex/test-helper-chai": "3.
|
|
35
|
-
"@webex/test-helper-mocha": "3.
|
|
36
|
-
"@webex/test-helper-mock-web-socket": "3.
|
|
37
|
-
"@webex/test-helper-mock-webex": "3.
|
|
38
|
-
"@webex/test-helper-test-users": "3.
|
|
34
|
+
"@webex/test-helper-chai": "3.12.0-next.8",
|
|
35
|
+
"@webex/test-helper-mocha": "3.12.0-next.8",
|
|
36
|
+
"@webex/test-helper-mock-web-socket": "3.12.0-next.8",
|
|
37
|
+
"@webex/test-helper-mock-webex": "3.12.0-next.8",
|
|
38
|
+
"@webex/test-helper-test-users": "3.12.0-next.8",
|
|
39
39
|
"eslint": "^8.24.0",
|
|
40
40
|
"prettier": "^2.7.1",
|
|
41
41
|
"sinon": "^9.2.4"
|
|
@@ -49,5 +49,5 @@
|
|
|
49
49
|
"test:style": "eslint ./src/**/*.*",
|
|
50
50
|
"test:unit": "webex-legacy-tools test --unit --runner jest"
|
|
51
51
|
},
|
|
52
|
-
"version": "3.12.0-next.
|
|
52
|
+
"version": "3.12.0-next.60"
|
|
53
53
|
}
|
package/src/constants.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
export {LLM_PRACTICE_SESSION} from '@webex/internal-plugin-llm';
|
|
2
|
+
|
|
1
3
|
export const EVENT_TRIGGERS = {
|
|
2
4
|
VOICEA_ANNOUNCEMENT: 'voicea:announcement',
|
|
3
5
|
CAPTION_LANGUAGE_UPDATE: 'voicea:captionLanguageUpdate',
|
|
@@ -7,6 +9,7 @@ export const EVENT_TRIGGERS = {
|
|
|
7
9
|
TRANSCRIBING_OFF: 'voicea:transcribingOff',
|
|
8
10
|
|
|
9
11
|
NEW_CAPTION: 'voicea:newCaption',
|
|
12
|
+
SPEAKER_NAME_UPDATED: 'voicea:speakerNameUpdated',
|
|
10
13
|
EVA_COMMAND: 'voicea:wxa',
|
|
11
14
|
HIGHLIGHT_CREATED: 'voicea:highlightCreated',
|
|
12
15
|
NEW_MANUAL_CAPTION: 'aibridge:newManualCaption',
|
|
@@ -21,6 +24,7 @@ export const AIBRIDGE_RELAY_TYPES = {
|
|
|
21
24
|
TRANSLATION_REQUEST: 'voicea.transl.req',
|
|
22
25
|
TRANSLATION_RESPONSE: 'voicea.transl.rsp',
|
|
23
26
|
TRANSCRIPTION: 'voicea.transcription',
|
|
27
|
+
SPEAKER_NAME_UPDATE: 'voicea.update_speakername',
|
|
24
28
|
},
|
|
25
29
|
MANUAL: {
|
|
26
30
|
TRANSCRIPTION: 'aibridge.manual_transcription',
|
|
@@ -44,7 +48,6 @@ export const TRANSCRIPTION_TYPE = {
|
|
|
44
48
|
|
|
45
49
|
export const VOICEA = 'voicea';
|
|
46
50
|
export const DEFAULT_SPOKEN_LANGUAGE = 'en';
|
|
47
|
-
export const LLM_PRACTICE_SESSION = 'llm-practice-session';
|
|
48
51
|
|
|
49
52
|
export const ANNOUNCE_STATUS = {
|
|
50
53
|
IDLE: 'idle',
|
package/src/index.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import * as WebexCore from '@webex/webex-core';
|
|
2
2
|
|
|
3
3
|
import VoiceaChannel from './voicea';
|
|
4
|
-
import type {MeetingTranscriptPayload} from './voicea.types';
|
|
4
|
+
import type {MeetingTranscriptPayload, SpeakerNameUpdatePayload} from './voicea.types';
|
|
5
5
|
|
|
6
6
|
WebexCore.registerInternalPlugin('voicea', VoiceaChannel, {});
|
|
7
7
|
|
|
8
8
|
export {default} from './voicea';
|
|
9
|
-
export {type MeetingTranscriptPayload};
|
|
9
|
+
export {type MeetingTranscriptPayload, SpeakerNameUpdatePayload};
|
|
10
10
|
export {EVENT_TRIGGERS, TURN_ON_CAPTION_STATUS} from './constants';
|
package/src/voicea.ts
CHANGED
|
@@ -17,6 +17,7 @@ import {
|
|
|
17
17
|
import {
|
|
18
18
|
AnnouncementPayload,
|
|
19
19
|
CaptionLanguageResponse,
|
|
20
|
+
SpeakerNameUpdatePayload,
|
|
20
21
|
TranscriptionResponse,
|
|
21
22
|
IVoiceaChannel,
|
|
22
23
|
} from './voicea.types';
|
|
@@ -42,7 +43,7 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
|
|
|
42
43
|
|
|
43
44
|
private captionStatus: string;
|
|
44
45
|
|
|
45
|
-
private
|
|
46
|
+
private keepTranscriptionSubscribed: boolean;
|
|
46
47
|
|
|
47
48
|
private toggleManualCaptionStatus: string;
|
|
48
49
|
|
|
@@ -71,6 +72,9 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
|
|
|
71
72
|
case AIBRIDGE_RELAY_TYPES.VOICEA.TRANSCRIPTION:
|
|
72
73
|
this.processTranscription(e.data.voiceaPayload);
|
|
73
74
|
break;
|
|
75
|
+
case AIBRIDGE_RELAY_TYPES.VOICEA.SPEAKER_NAME_UPDATE:
|
|
76
|
+
this.processSpeakerNameUpdate(e.data.voiceaPayload);
|
|
77
|
+
break;
|
|
74
78
|
case AIBRIDGE_RELAY_TYPES.MANUAL.TRANSCRIPTION:
|
|
75
79
|
case AIBRIDGE_RELAY_TYPES.MANUAL.CAPTIONER:
|
|
76
80
|
this.processManualTranscription({
|
|
@@ -104,7 +108,7 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
|
|
|
104
108
|
*/
|
|
105
109
|
public deregisterEvents() {
|
|
106
110
|
this.areCaptionsEnabled = false;
|
|
107
|
-
this.
|
|
111
|
+
this.keepTranscriptionSubscribed = false;
|
|
108
112
|
this.captionServiceId = undefined;
|
|
109
113
|
// @ts-ignore
|
|
110
114
|
this.webex.internal.llm.off('event:relay.event', this.eventProcessor);
|
|
@@ -126,6 +130,7 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
|
|
|
126
130
|
super(...args);
|
|
127
131
|
this.seqNum = 1;
|
|
128
132
|
this.areCaptionsEnabled = false;
|
|
133
|
+
this.keepTranscriptionSubscribed = false;
|
|
129
134
|
this.captionServiceId = undefined;
|
|
130
135
|
this.announceStatus = ANNOUNCE_STATUS.IDLE;
|
|
131
136
|
this.captionStatus = TURN_ON_CAPTION_STATUS.IDLE;
|
|
@@ -155,6 +160,16 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
|
|
|
155
160
|
}
|
|
156
161
|
};
|
|
157
162
|
|
|
163
|
+
/**
|
|
164
|
+
* Process speaker name update and send alert
|
|
165
|
+
* @param {SpeakerNameUpdatePayload} voiceaPayload
|
|
166
|
+
* @returns {void}
|
|
167
|
+
*/
|
|
168
|
+
private processSpeakerNameUpdate = (voiceaPayload: SpeakerNameUpdatePayload): void => {
|
|
169
|
+
// @ts-ignore
|
|
170
|
+
this.trigger(EVENT_TRIGGERS.SPEAKER_NAME_UPDATED, voiceaPayload);
|
|
171
|
+
};
|
|
172
|
+
|
|
158
173
|
/**
|
|
159
174
|
* Process Transcript and send alert
|
|
160
175
|
* @param {TranscriptionResponse} voiceaPayload
|
|
@@ -275,7 +290,7 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
|
|
|
275
290
|
// @ts-ignore
|
|
276
291
|
this.webex.internal.llm.isConnected(LLM_PRACTICE_SESSION);
|
|
277
292
|
|
|
278
|
-
public
|
|
293
|
+
public getKeepTranscriptionSubscribed = (): boolean => this.keepTranscriptionSubscribed;
|
|
279
294
|
|
|
280
295
|
/**
|
|
281
296
|
* Resolves the active LLM publish transport, preferring the practice-session
|
|
@@ -308,10 +323,11 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
|
|
|
308
323
|
socket.send({
|
|
309
324
|
id: `${this.seqNum}`,
|
|
310
325
|
type: 'publishRequest',
|
|
311
|
-
recipients:
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
326
|
+
recipients: [
|
|
327
|
+
{
|
|
328
|
+
route: binding,
|
|
329
|
+
},
|
|
330
|
+
],
|
|
315
331
|
// If captionServiceId exists, send it as the 'to' header; otherwise keep headers empty.
|
|
316
332
|
headers: this.captionServiceId ? {to: this.captionServiceId} : {},
|
|
317
333
|
data: {
|
|
@@ -366,10 +382,11 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
|
|
|
366
382
|
socket.send({
|
|
367
383
|
id: `${this.seqNum}`,
|
|
368
384
|
type: 'publishRequest',
|
|
369
|
-
recipients:
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
385
|
+
recipients: [
|
|
386
|
+
{
|
|
387
|
+
route: binding,
|
|
388
|
+
},
|
|
389
|
+
],
|
|
373
390
|
headers: {
|
|
374
391
|
to: this.captionServiceId,
|
|
375
392
|
},
|
|
@@ -411,10 +428,11 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
|
|
|
411
428
|
socket?.send({
|
|
412
429
|
id: `${this.seqNum}`,
|
|
413
430
|
type: 'publishRequest',
|
|
414
|
-
recipients:
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
431
|
+
recipients: [
|
|
432
|
+
{
|
|
433
|
+
route: binding,
|
|
434
|
+
},
|
|
435
|
+
],
|
|
418
436
|
headers: {},
|
|
419
437
|
data: {
|
|
420
438
|
eventType: 'relay.event',
|
|
@@ -670,13 +688,14 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
|
|
|
670
688
|
};
|
|
671
689
|
|
|
672
690
|
/**
|
|
673
|
-
*
|
|
674
|
-
*
|
|
691
|
+
* Updates transcription subchannel subscriptions and records whether the
|
|
692
|
+
* transcription subscription should be kept (and restored on reconnect).
|
|
675
693
|
*
|
|
676
694
|
* @param {Object} [options] - Subscription options.
|
|
677
695
|
* @param {string[]} [options.subscribe] - Subchannels to subscribe to.
|
|
678
696
|
* @param {string[]} [options.unsubscribe] - Subchannels to unsubscribe from.
|
|
679
|
-
* @param {boolean} [
|
|
697
|
+
* @param {boolean} [keepSubscribed=false] - Whether the transcription
|
|
698
|
+
* subscription should be kept and restored on reconnect.
|
|
680
699
|
*
|
|
681
700
|
* @returns {Promise<void>}
|
|
682
701
|
*/
|
|
@@ -685,9 +704,9 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
|
|
|
685
704
|
subscribe?: string[];
|
|
686
705
|
unsubscribe?: string[];
|
|
687
706
|
} = {},
|
|
688
|
-
|
|
707
|
+
keepSubscribed = false
|
|
689
708
|
): Promise<void> => {
|
|
690
|
-
this.
|
|
709
|
+
this.keepTranscriptionSubscribed = keepSubscribed;
|
|
691
710
|
|
|
692
711
|
return this.updateSubchannelSubscriptions(options);
|
|
693
712
|
};
|
package/src/voicea.types.ts
CHANGED
|
@@ -40,6 +40,21 @@ interface Transcription {
|
|
|
40
40
|
csis: number[];
|
|
41
41
|
last_packet_timestamp_ms: number;
|
|
42
42
|
timestamp: string;
|
|
43
|
+
taggedSpeaker?: {
|
|
44
|
+
speakerId?: string[];
|
|
45
|
+
newName?: string;
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
interface TaggedSpeaker {
|
|
50
|
+
csiId: number;
|
|
51
|
+
speakerId: string;
|
|
52
|
+
newName: string;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
interface SpeakerNameUpdatePayload {
|
|
56
|
+
id?: string;
|
|
57
|
+
taggedSpeakers: TaggedSpeaker[];
|
|
43
58
|
}
|
|
44
59
|
|
|
45
60
|
/**
|
|
@@ -109,6 +124,10 @@ type MeetingTranscripts = {
|
|
|
109
124
|
[key: string]: string;
|
|
110
125
|
};
|
|
111
126
|
timestamp?: string;
|
|
127
|
+
taggedSpeaker?: {
|
|
128
|
+
speakerId?: string[];
|
|
129
|
+
newName?: string;
|
|
130
|
+
};
|
|
112
131
|
};
|
|
113
132
|
|
|
114
133
|
type MeetingTranscriptPayload = {
|
|
@@ -123,6 +142,8 @@ export type {
|
|
|
123
142
|
TranscriptionResponse,
|
|
124
143
|
Transcription,
|
|
125
144
|
Highlight,
|
|
145
|
+
TaggedSpeaker,
|
|
146
|
+
SpeakerNameUpdatePayload,
|
|
126
147
|
IVoiceaChannel,
|
|
127
148
|
MeetingTranscriptPayload,
|
|
128
149
|
};
|
package/test/unit/spec/voicea.js
CHANGED
|
@@ -72,7 +72,7 @@ describe('plugin-voicea', () => {
|
|
|
72
72
|
assert.calledOnceWithExactly(voiceaService.webex.internal.llm.socket.send, {
|
|
73
73
|
id: '1',
|
|
74
74
|
type: 'publishRequest',
|
|
75
|
-
recipients: {route: undefined},
|
|
75
|
+
recipients: [{route: undefined}],
|
|
76
76
|
headers: {},
|
|
77
77
|
data: {
|
|
78
78
|
clientPayload: {
|
|
@@ -109,7 +109,7 @@ describe('plugin-voicea', () => {
|
|
|
109
109
|
assert.calledOnceWithExactly(voiceaService.webex.internal.llm.socket.send, {
|
|
110
110
|
id: '1',
|
|
111
111
|
type: 'publishRequest',
|
|
112
|
-
recipients: {route: undefined},
|
|
112
|
+
recipients: [{route: undefined}],
|
|
113
113
|
headers: {to: 'svc-123'},
|
|
114
114
|
data: {
|
|
115
115
|
clientPayload: {
|
|
@@ -143,7 +143,7 @@ describe('plugin-voicea', () => {
|
|
|
143
143
|
{
|
|
144
144
|
id: '1',
|
|
145
145
|
type: 'publishRequest',
|
|
146
|
-
recipients: {route: undefined},
|
|
146
|
+
recipients: [{route: undefined}],
|
|
147
147
|
headers: {},
|
|
148
148
|
data: {
|
|
149
149
|
eventType: 'relay.event',
|
|
@@ -182,7 +182,7 @@ describe('plugin-voicea', () => {
|
|
|
182
182
|
{
|
|
183
183
|
id: '1',
|
|
184
184
|
type: 'publishRequest',
|
|
185
|
-
recipients: {route: undefined},
|
|
185
|
+
recipients: [{route: undefined}],
|
|
186
186
|
headers: {},
|
|
187
187
|
data: {
|
|
188
188
|
eventType: 'relay.event',
|
|
@@ -225,7 +225,7 @@ describe('plugin-voicea', () => {
|
|
|
225
225
|
beforeEach(async () => {
|
|
226
226
|
const mockWebSocket = new MockWebSocket();
|
|
227
227
|
voiceaService.webex.internal.llm.socket = mockWebSocket;
|
|
228
|
-
voiceaService.
|
|
228
|
+
voiceaService.keepTranscriptionSubscribed = true;
|
|
229
229
|
});
|
|
230
230
|
|
|
231
231
|
it('deregisters voicea service and resets caption state', async () => {
|
|
@@ -239,14 +239,14 @@ describe('plugin-voicea', () => {
|
|
|
239
239
|
|
|
240
240
|
assert.equal(voiceaService.areCaptionsEnabled, true);
|
|
241
241
|
assert.equal(voiceaService.captionServiceId, 'ws');
|
|
242
|
-
assert.equal(voiceaService.
|
|
242
|
+
assert.equal(voiceaService.keepTranscriptionSubscribed, true);
|
|
243
243
|
|
|
244
244
|
voiceaService.deregisterEvents();
|
|
245
245
|
assert.equal(voiceaService.areCaptionsEnabled, false);
|
|
246
246
|
assert.equal(voiceaService.captionServiceId, undefined);
|
|
247
247
|
assert.equal(voiceaService.announceStatus, 'idle');
|
|
248
248
|
assert.equal(voiceaService.captionStatus, 'idle');
|
|
249
|
-
assert.equal(voiceaService.
|
|
249
|
+
assert.equal(voiceaService.keepTranscriptionSubscribed, false);
|
|
250
250
|
});
|
|
251
251
|
});
|
|
252
252
|
describe('#processAnnouncementMessage', () => {
|
|
@@ -305,7 +305,7 @@ describe('plugin-voicea', () => {
|
|
|
305
305
|
assert.calledOnceWithExactly(voiceaService.webex.internal.llm.socket.send, {
|
|
306
306
|
id: '1',
|
|
307
307
|
type: 'publishRequest',
|
|
308
|
-
recipients: {route: undefined},
|
|
308
|
+
recipients: [{route: undefined}],
|
|
309
309
|
headers: {to: undefined},
|
|
310
310
|
data: {
|
|
311
311
|
clientPayload: {
|
|
@@ -327,7 +327,7 @@ describe('plugin-voicea', () => {
|
|
|
327
327
|
assert.calledOnceWithExactly(voiceaService.webex.internal.llm.socket.send, {
|
|
328
328
|
id: '1',
|
|
329
329
|
type: 'publishRequest',
|
|
330
|
-
recipients: {route: undefined},
|
|
330
|
+
recipients: [{route: undefined}],
|
|
331
331
|
headers: {to: 'svc-456'},
|
|
332
332
|
data: {
|
|
333
333
|
clientPayload: {
|
|
@@ -492,23 +492,23 @@ describe('plugin-voicea', () => {
|
|
|
492
492
|
});
|
|
493
493
|
});
|
|
494
494
|
|
|
495
|
-
describe('#
|
|
495
|
+
describe('#getKeepTranscriptionSubscribed', () => {
|
|
496
496
|
beforeEach(() => {
|
|
497
|
-
voiceaService.
|
|
497
|
+
voiceaService.keepTranscriptionSubscribed = false;
|
|
498
498
|
});
|
|
499
499
|
|
|
500
500
|
it('returns false when captions are disabled', () => {
|
|
501
|
-
voiceaService.
|
|
501
|
+
voiceaService.keepTranscriptionSubscribed = false;
|
|
502
502
|
|
|
503
|
-
const result = voiceaService.
|
|
503
|
+
const result = voiceaService.getKeepTranscriptionSubscribed();
|
|
504
504
|
|
|
505
505
|
assert.equal(result, false);
|
|
506
506
|
});
|
|
507
507
|
|
|
508
508
|
it('returns true when captions are enabled', () => {
|
|
509
|
-
voiceaService.
|
|
509
|
+
voiceaService.keepTranscriptionSubscribed = true;
|
|
510
510
|
|
|
511
|
-
const result = voiceaService.
|
|
511
|
+
const result = voiceaService.getKeepTranscriptionSubscribed();
|
|
512
512
|
|
|
513
513
|
assert.equal(result, true);
|
|
514
514
|
});
|
|
@@ -908,6 +908,35 @@ describe('plugin-voicea', () => {
|
|
|
908
908
|
});
|
|
909
909
|
});
|
|
910
910
|
|
|
911
|
+
it('processes speaker name update', async () => {
|
|
912
|
+
const triggerSpy = sinon.spy();
|
|
913
|
+
const voiceaPayload = {
|
|
914
|
+
id: 'speaker-name-update-1',
|
|
915
|
+
taggedSpeakers: [
|
|
916
|
+
{
|
|
917
|
+
csiId: 3556942592,
|
|
918
|
+
speakerId: '1',
|
|
919
|
+
newName: 'Alice',
|
|
920
|
+
},
|
|
921
|
+
],
|
|
922
|
+
};
|
|
923
|
+
|
|
924
|
+
voiceaService.on(EVENT_TRIGGERS.SPEAKER_NAME_UPDATED, triggerSpy);
|
|
925
|
+
|
|
926
|
+
// eslint-disable-next-line no-underscore-dangle
|
|
927
|
+
await voiceaService.webex.internal.llm._emit('event:relay.event', {
|
|
928
|
+
headers: {from: 'ws'},
|
|
929
|
+
data: {
|
|
930
|
+
relayType: 'voicea.update_speakername',
|
|
931
|
+
voiceaPayload,
|
|
932
|
+
},
|
|
933
|
+
sequenceNumber: 23,
|
|
934
|
+
});
|
|
935
|
+
|
|
936
|
+
assert.calledOnceWithExactly(triggerSpy, voiceaPayload);
|
|
937
|
+
assert.equal(voiceaService.seqNum, 24);
|
|
938
|
+
});
|
|
939
|
+
|
|
911
940
|
it('processes a eva wake up', async () => {
|
|
912
941
|
voiceaService.on(EVENT_TRIGGERS.EVA_COMMAND, triggerSpy);
|
|
913
942
|
|
|
@@ -1402,7 +1431,7 @@ describe('plugin-voicea', () => {
|
|
|
1402
1431
|
true
|
|
1403
1432
|
);
|
|
1404
1433
|
|
|
1405
|
-
assert.equal(voiceaService.
|
|
1434
|
+
assert.equal(voiceaService.keepTranscriptionSubscribed, true);
|
|
1406
1435
|
|
|
1407
1436
|
assert.calledOnceWithExactly(
|
|
1408
1437
|
voiceaService.updateSubchannelSubscriptions,
|
|
@@ -1419,7 +1448,7 @@ describe('plugin-voicea', () => {
|
|
|
1419
1448
|
false
|
|
1420
1449
|
);
|
|
1421
1450
|
|
|
1422
|
-
assert.equal(voiceaService.
|
|
1451
|
+
assert.equal(voiceaService.keepTranscriptionSubscribed, false);
|
|
1423
1452
|
|
|
1424
1453
|
assert.calledOnceWithExactly(
|
|
1425
1454
|
voiceaService.updateSubchannelSubscriptions,
|
|
@@ -1430,7 +1459,7 @@ describe('plugin-voicea', () => {
|
|
|
1430
1459
|
it('defaults subscribe/unsubscribe to empty arrays when options is empty', async () => {
|
|
1431
1460
|
await voiceaService.updateSubchannelSubscriptionsAndSyncCaptionState({}, true);
|
|
1432
1461
|
|
|
1433
|
-
assert.equal(voiceaService.
|
|
1462
|
+
assert.equal(voiceaService.keepTranscriptionSubscribed, true);
|
|
1434
1463
|
|
|
1435
1464
|
assert.calledOnceWithExactly(
|
|
1436
1465
|
voiceaService.updateSubchannelSubscriptions,
|
|
@@ -1446,7 +1475,7 @@ describe('plugin-voicea', () => {
|
|
|
1446
1475
|
true
|
|
1447
1476
|
);
|
|
1448
1477
|
|
|
1449
|
-
assert.equal(voiceaService.
|
|
1478
|
+
assert.equal(voiceaService.keepTranscriptionSubscribed, true);
|
|
1450
1479
|
|
|
1451
1480
|
assert.calledOnceWithExactly(
|
|
1452
1481
|
voiceaService.updateSubchannelSubscriptions,
|
|
@@ -1487,7 +1516,7 @@ describe('plugin-voicea', () => {
|
|
|
1487
1516
|
assert.notCalled(defaultSocket.send);
|
|
1488
1517
|
|
|
1489
1518
|
const sent = practiceSocket.send.getCall(0).args[0];
|
|
1490
|
-
expect(sent).to.have.nested.property('recipients.route', 'practice-binding');
|
|
1519
|
+
expect(sent).to.have.nested.property('recipients[0].route', 'practice-binding');
|
|
1491
1520
|
});
|
|
1492
1521
|
|
|
1493
1522
|
it('sendAnnouncement falls back to the default socket and binding when the practice session is not connected', () => {
|
|
@@ -1500,7 +1529,7 @@ describe('plugin-voicea', () => {
|
|
|
1500
1529
|
assert.notCalled(practiceSocket.send);
|
|
1501
1530
|
|
|
1502
1531
|
const sent = defaultSocket.send.getCall(0).args[0];
|
|
1503
|
-
expect(sent).to.have.nested.property('recipients.route', 'default-binding');
|
|
1532
|
+
expect(sent).to.have.nested.property('recipients[0].route', 'default-binding');
|
|
1504
1533
|
});
|
|
1505
1534
|
|
|
1506
1535
|
it('requestLanguage uses the practice session socket and binding when available', () => {
|
|
@@ -1510,7 +1539,7 @@ describe('plugin-voicea', () => {
|
|
|
1510
1539
|
assert.notCalled(defaultSocket.send);
|
|
1511
1540
|
|
|
1512
1541
|
const sent = practiceSocket.send.getCall(0).args[0];
|
|
1513
|
-
expect(sent).to.have.nested.property('recipients.route', 'practice-binding');
|
|
1542
|
+
expect(sent).to.have.nested.property('recipients[0].route', 'practice-binding');
|
|
1514
1543
|
expect(sent).to.have.nested.property('data.clientPayload.translationLanguage', 'fr');
|
|
1515
1544
|
});
|
|
1516
1545
|
|
|
@@ -1523,7 +1552,7 @@ describe('plugin-voicea', () => {
|
|
|
1523
1552
|
assert.notCalled(practiceSocket.send);
|
|
1524
1553
|
|
|
1525
1554
|
const sent = defaultSocket.send.getCall(0).args[0];
|
|
1526
|
-
expect(sent).to.have.nested.property('recipients.route', 'default-binding');
|
|
1555
|
+
expect(sent).to.have.nested.property('recipients[0].route', 'default-binding');
|
|
1527
1556
|
expect(sent).to.have.nested.property('data.clientPayload.translationLanguage', 'fr');
|
|
1528
1557
|
});
|
|
1529
1558
|
|
|
@@ -1534,7 +1563,7 @@ describe('plugin-voicea', () => {
|
|
|
1534
1563
|
assert.notCalled(defaultSocket.send);
|
|
1535
1564
|
|
|
1536
1565
|
const sent = practiceSocket.send.getCall(0).args[0];
|
|
1537
|
-
expect(sent).to.have.nested.property('recipients.route', 'practice-binding');
|
|
1566
|
+
expect(sent).to.have.nested.property('recipients[0].route', 'practice-binding');
|
|
1538
1567
|
expect(sent).to.have.nested.property(
|
|
1539
1568
|
'data.transcriptPayload.type',
|
|
1540
1569
|
'manual_caption_final_result'
|
|
@@ -1550,7 +1579,7 @@ describe('plugin-voicea', () => {
|
|
|
1550
1579
|
assert.notCalled(practiceSocket.send);
|
|
1551
1580
|
|
|
1552
1581
|
const sent = defaultSocket.send.getCall(0).args[0];
|
|
1553
|
-
expect(sent).to.have.nested.property('recipients.route', 'default-binding');
|
|
1582
|
+
expect(sent).to.have.nested.property('recipients[0].route', 'default-binding');
|
|
1554
1583
|
expect(sent).to.have.nested.property(
|
|
1555
1584
|
'data.transcriptPayload.type',
|
|
1556
1585
|
'manual_caption_interim_result'
|