@memori.ai/memori-react 7.7.0 → 7.8.0-rc.0

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.
Files changed (178) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/dist/components/Avatar/Avatar.js +2 -2
  3. package/dist/components/Avatar/Avatar.js.map +1 -1
  4. package/dist/components/Avatar/AvatarView/AvatarComponent/avatarComponent.d.ts +2 -0
  5. package/dist/components/Avatar/AvatarView/AvatarComponent/avatarComponent.js +2 -2
  6. package/dist/components/Avatar/AvatarView/AvatarComponent/avatarComponent.js.map +1 -1
  7. package/dist/components/Avatar/AvatarView/AvatarComponent/components/fullbodyAvatar.d.ts +2 -0
  8. package/dist/components/Avatar/AvatarView/AvatarComponent/components/fullbodyAvatar.js +1 -1
  9. package/dist/components/Avatar/AvatarView/AvatarComponent/components/fullbodyAvatar.js.map +1 -1
  10. package/dist/components/Avatar/AvatarView/AvatarComponent/components/halfbodyAvatar.d.ts +3 -1
  11. package/dist/components/Avatar/AvatarView/AvatarComponent/components/halfbodyAvatar.js +77 -50
  12. package/dist/components/Avatar/AvatarView/AvatarComponent/components/halfbodyAvatar.js.map +1 -1
  13. package/dist/components/Avatar/AvatarView/index.d.ts +3 -1
  14. package/dist/components/Avatar/AvatarView/index.js +2 -2
  15. package/dist/components/Avatar/AvatarView/index.js.map +1 -1
  16. package/dist/components/MemoriWidget/MemoriWidget.js +127 -113
  17. package/dist/components/MemoriWidget/MemoriWidget.js.map +1 -1
  18. package/dist/components/layouts/ZoomedFullBody.js +1 -8
  19. package/dist/components/layouts/ZoomedFullBody.js.map +1 -1
  20. package/dist/components/layouts/zoomed-full-body.css +6 -2
  21. package/dist/context/visemeContext.d.ts +1 -0
  22. package/dist/context/visemeContext.js +19 -9
  23. package/dist/context/visemeContext.js.map +1 -1
  24. package/dist/styles.css +0 -1
  25. package/esm/components/Avatar/Avatar.js +2 -2
  26. package/esm/components/Avatar/Avatar.js.map +1 -1
  27. package/esm/components/Avatar/AvatarView/AvatarComponent/avatarComponent.d.ts +2 -0
  28. package/esm/components/Avatar/AvatarView/AvatarComponent/avatarComponent.js +2 -2
  29. package/esm/components/Avatar/AvatarView/AvatarComponent/avatarComponent.js.map +1 -1
  30. package/esm/components/Avatar/AvatarView/AvatarComponent/components/fullbodyAvatar.d.ts +2 -0
  31. package/esm/components/Avatar/AvatarView/AvatarComponent/components/fullbodyAvatar.js +1 -1
  32. package/esm/components/Avatar/AvatarView/AvatarComponent/components/fullbodyAvatar.js.map +1 -1
  33. package/esm/components/Avatar/AvatarView/AvatarComponent/components/halfbodyAvatar.d.ts +3 -1
  34. package/esm/components/Avatar/AvatarView/AvatarComponent/components/halfbodyAvatar.js +81 -53
  35. package/esm/components/Avatar/AvatarView/AvatarComponent/components/halfbodyAvatar.js.map +1 -1
  36. package/esm/components/Avatar/AvatarView/index.d.ts +3 -1
  37. package/esm/components/Avatar/AvatarView/index.js +2 -2
  38. package/esm/components/Avatar/AvatarView/index.js.map +1 -1
  39. package/esm/components/MemoriWidget/MemoriWidget.js +127 -113
  40. package/esm/components/MemoriWidget/MemoriWidget.js.map +1 -1
  41. package/esm/components/layouts/ZoomedFullBody.js +1 -8
  42. package/esm/components/layouts/ZoomedFullBody.js.map +1 -1
  43. package/esm/components/layouts/zoomed-full-body.css +6 -2
  44. package/esm/context/visemeContext.d.ts +1 -0
  45. package/esm/context/visemeContext.js +20 -10
  46. package/esm/context/visemeContext.js.map +1 -1
  47. package/esm/styles.css +0 -1
  48. package/package.json +1 -1
  49. package/src/components/Avatar/Avatar.stories.tsx +5 -7
  50. package/src/components/Avatar/Avatar.tsx +3 -1
  51. package/src/components/Avatar/AvatarView/AvatarComponent/avatarComponent.tsx +13 -0
  52. package/src/components/Avatar/AvatarView/AvatarComponent/components/fullbodyAvatar.tsx +3 -1
  53. package/src/components/Avatar/AvatarView/AvatarComponent/components/halfbodyAvatar.tsx +116 -65
  54. package/src/components/Avatar/AvatarView/AvatarView.stories.tsx +12 -36
  55. package/src/components/Avatar/AvatarView/index.tsx +6 -0
  56. package/src/components/MemoriWidget/MemoriWidget.tsx +164 -136
  57. package/src/components/layouts/ZoomedFullBody.test.tsx +1 -1
  58. package/src/components/layouts/ZoomedFullBody.tsx +4 -9
  59. package/src/components/layouts/zoomed-full-body.css +6 -2
  60. package/src/context/visemeContext.tsx +104 -70
  61. package/src/index.stories.tsx +23 -21
  62. package/src/styles.css +0 -1
  63. package/dist/components/AttachmentMediaModal/AttachmentMediaModal.d.ts +0 -14
  64. package/dist/components/AttachmentMediaModal/AttachmentMediaModal.js +0 -66
  65. package/dist/components/AttachmentMediaModal/AttachmentMediaModal.js.map +0 -1
  66. package/dist/components/Avatar/AvatarView/components/controls.d.ts +0 -23
  67. package/dist/components/Avatar/AvatarView/components/controls.js +0 -55
  68. package/dist/components/Avatar/AvatarView/components/controls.js.map +0 -1
  69. package/dist/components/Avatar/AvatarView/components/fullbodyAvatar.d.ts +0 -19
  70. package/dist/components/Avatar/AvatarView/components/fullbodyAvatar.js +0 -61
  71. package/dist/components/Avatar/AvatarView/components/fullbodyAvatar.js.map +0 -1
  72. package/dist/components/Avatar/AvatarView/components/halfbodyAvatar.d.ts +0 -9
  73. package/dist/components/Avatar/AvatarView/components/halfbodyAvatar.js +0 -39
  74. package/dist/components/Avatar/AvatarView/components/halfbodyAvatar.js.map +0 -1
  75. package/dist/components/Avatar/AvatarView/components/loader.d.ts +0 -5
  76. package/dist/components/Avatar/AvatarView/components/loader.js +0 -12
  77. package/dist/components/Avatar/AvatarView/components/loader.js.map +0 -1
  78. package/dist/components/Avatar/AvatarView/utils/useMouthSpeaking.d.ts +0 -2
  79. package/dist/components/Avatar/AvatarView/utils/useMouthSpeaking.js +0 -68
  80. package/dist/components/Avatar/AvatarView/utils/useMouthSpeaking.js.map +0 -1
  81. package/dist/components/AvatarView/components/avatar.d.ts +0 -9
  82. package/dist/components/AvatarView/components/avatar.js +0 -35
  83. package/dist/components/AvatarView/components/avatar.js.map +0 -1
  84. package/dist/components/AvatarView/components/fullbodyAvatar.d.ts +0 -10
  85. package/dist/components/AvatarView/components/fullbodyAvatar.js +0 -62
  86. package/dist/components/AvatarView/components/fullbodyAvatar.js.map +0 -1
  87. package/dist/components/AvatarView/components/loader.d.ts +0 -5
  88. package/dist/components/AvatarView/components/loader.js +0 -12
  89. package/dist/components/AvatarView/components/loader.js.map +0 -1
  90. package/dist/components/AvatarView/index.d.ts +0 -17
  91. package/dist/components/AvatarView/index.js +0 -35
  92. package/dist/components/AvatarView/index.js.map +0 -1
  93. package/dist/components/AvatarView/utils/useEyeBlink.d.ts +0 -2
  94. package/dist/components/AvatarView/utils/useEyeBlink.js +0 -40
  95. package/dist/components/AvatarView/utils/useEyeBlink.js.map +0 -1
  96. package/dist/components/AvatarView/utils/useHeadMovement.d.ts +0 -2
  97. package/dist/components/AvatarView/utils/useHeadMovement.js +0 -53
  98. package/dist/components/AvatarView/utils/useHeadMovement.js.map +0 -1
  99. package/dist/components/AvatarView/utils/useLoadingMorphAnim.d.ts +0 -2
  100. package/dist/components/AvatarView/utils/useLoadingMorphAnim.js +0 -34
  101. package/dist/components/AvatarView/utils/useLoadingMorphAnim.js.map +0 -1
  102. package/dist/components/AvatarView/utils/useMouthSpeaking.d.ts +0 -2
  103. package/dist/components/AvatarView/utils/useMouthSpeaking.js +0 -60
  104. package/dist/components/AvatarView/utils/useMouthSpeaking.js.map +0 -1
  105. package/dist/components/AvatarView/utils/useSmile.d.ts +0 -2
  106. package/dist/components/AvatarView/utils/useSmile.js +0 -30
  107. package/dist/components/AvatarView/utils/useSmile.js.map +0 -1
  108. package/dist/components/AvatarView/utils/utils.d.ts +0 -13
  109. package/dist/components/AvatarView/utils/utils.js +0 -42
  110. package/dist/components/AvatarView/utils/utils.js.map +0 -1
  111. package/dist/components/ImageUpload/ImageUpload.css +0 -168
  112. package/dist/components/ImageUpload/ImageUpload.d.ts +0 -28
  113. package/dist/components/ImageUpload/ImageUpload.js +0 -163
  114. package/dist/components/ImageUpload/ImageUpload.js.map +0 -1
  115. package/dist/components/layouts/Default.d.ts +0 -17
  116. package/dist/components/layouts/Default.js +0 -8
  117. package/dist/components/layouts/Default.js.map +0 -1
  118. package/dist/components/ui/Message.d.ts +0 -17
  119. package/dist/components/ui/Message.js +0 -13
  120. package/dist/components/ui/Message.js.map +0 -1
  121. package/esm/components/AttachmentMediaModal/AttachmentMediaModal.d.ts +0 -14
  122. package/esm/components/AttachmentMediaModal/AttachmentMediaModal.js +0 -63
  123. package/esm/components/AttachmentMediaModal/AttachmentMediaModal.js.map +0 -1
  124. package/esm/components/Avatar/AvatarView/components/controls.d.ts +0 -23
  125. package/esm/components/Avatar/AvatarView/components/controls.js +0 -52
  126. package/esm/components/Avatar/AvatarView/components/controls.js.map +0 -1
  127. package/esm/components/Avatar/AvatarView/components/fullbodyAvatar.d.ts +0 -19
  128. package/esm/components/Avatar/AvatarView/components/fullbodyAvatar.js +0 -57
  129. package/esm/components/Avatar/AvatarView/components/fullbodyAvatar.js.map +0 -1
  130. package/esm/components/Avatar/AvatarView/components/halfbodyAvatar.d.ts +0 -9
  131. package/esm/components/Avatar/AvatarView/components/halfbodyAvatar.js +0 -35
  132. package/esm/components/Avatar/AvatarView/components/halfbodyAvatar.js.map +0 -1
  133. package/esm/components/Avatar/AvatarView/components/loader.d.ts +0 -5
  134. package/esm/components/Avatar/AvatarView/components/loader.js +0 -9
  135. package/esm/components/Avatar/AvatarView/components/loader.js.map +0 -1
  136. package/esm/components/Avatar/AvatarView/utils/useMouthSpeaking.d.ts +0 -2
  137. package/esm/components/Avatar/AvatarView/utils/useMouthSpeaking.js +0 -65
  138. package/esm/components/Avatar/AvatarView/utils/useMouthSpeaking.js.map +0 -1
  139. package/esm/components/AvatarView/components/avatar.d.ts +0 -9
  140. package/esm/components/AvatarView/components/avatar.js +0 -31
  141. package/esm/components/AvatarView/components/avatar.js.map +0 -1
  142. package/esm/components/AvatarView/components/fullbodyAvatar.d.ts +0 -10
  143. package/esm/components/AvatarView/components/fullbodyAvatar.js +0 -58
  144. package/esm/components/AvatarView/components/fullbodyAvatar.js.map +0 -1
  145. package/esm/components/AvatarView/components/loader.d.ts +0 -5
  146. package/esm/components/AvatarView/components/loader.js +0 -9
  147. package/esm/components/AvatarView/components/loader.js.map +0 -1
  148. package/esm/components/AvatarView/index.d.ts +0 -17
  149. package/esm/components/AvatarView/index.js +0 -31
  150. package/esm/components/AvatarView/index.js.map +0 -1
  151. package/esm/components/AvatarView/utils/useEyeBlink.d.ts +0 -2
  152. package/esm/components/AvatarView/utils/useEyeBlink.js +0 -37
  153. package/esm/components/AvatarView/utils/useEyeBlink.js.map +0 -1
  154. package/esm/components/AvatarView/utils/useHeadMovement.d.ts +0 -2
  155. package/esm/components/AvatarView/utils/useHeadMovement.js +0 -50
  156. package/esm/components/AvatarView/utils/useHeadMovement.js.map +0 -1
  157. package/esm/components/AvatarView/utils/useLoadingMorphAnim.d.ts +0 -2
  158. package/esm/components/AvatarView/utils/useLoadingMorphAnim.js +0 -31
  159. package/esm/components/AvatarView/utils/useLoadingMorphAnim.js.map +0 -1
  160. package/esm/components/AvatarView/utils/useMouthSpeaking.d.ts +0 -2
  161. package/esm/components/AvatarView/utils/useMouthSpeaking.js +0 -57
  162. package/esm/components/AvatarView/utils/useMouthSpeaking.js.map +0 -1
  163. package/esm/components/AvatarView/utils/useSmile.d.ts +0 -2
  164. package/esm/components/AvatarView/utils/useSmile.js +0 -27
  165. package/esm/components/AvatarView/utils/useSmile.js.map +0 -1
  166. package/esm/components/AvatarView/utils/utils.d.ts +0 -13
  167. package/esm/components/AvatarView/utils/utils.js +0 -33
  168. package/esm/components/AvatarView/utils/utils.js.map +0 -1
  169. package/esm/components/ImageUpload/ImageUpload.css +0 -168
  170. package/esm/components/ImageUpload/ImageUpload.d.ts +0 -28
  171. package/esm/components/ImageUpload/ImageUpload.js +0 -160
  172. package/esm/components/ImageUpload/ImageUpload.js.map +0 -1
  173. package/esm/components/layouts/Default.d.ts +0 -17
  174. package/esm/components/layouts/Default.js +0 -5
  175. package/esm/components/layouts/Default.js.map +0 -1
  176. package/esm/components/ui/Message.d.ts +0 -17
  177. package/esm/components/ui/Message.js +0 -10
  178. package/esm/components/ui/Message.js.map +0 -1
@@ -219,11 +219,7 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
219
219
  const [isPlayingAudio, setIsPlayingAudio] = (0, react_1.useState)(false);
220
220
  const [controlsPosition, setControlsPosition] = (0, react_1.useState)('center');
221
221
  const [hideEmissions, setHideEmissions] = (0, react_1.useState)(false);
222
- const { startProcessing, stopProcessing, addViseme, resetVisemeQueue, isProcessing, } = (0, visemeContext_1.useViseme)();
223
- const audioContextRef = (0, react_1.useRef)(null);
224
- const speechSynthesizerRef = (0, react_1.useRef)(null);
225
- const audioDestinationRef = (0, react_1.useRef)(null);
226
- const currentSpeechRef = (0, react_1.useRef)(null);
222
+ const { updateCurrentViseme, startProcessing, resetAndStartProcessing, isProcessing, addViseme, stopProcessing, resetVisemeQueue, } = (0, visemeContext_1.useViseme)();
227
223
  (0, react_1.useEffect)(() => {
228
224
  setIsPlayingAudio(!!speechSynthesizer);
229
225
  memoriSpeaking = !!speechSynthesizer;
@@ -1250,43 +1246,16 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1250
1246
  const e = new CustomEvent('MemoriEndSpeak');
1251
1247
  document.dispatchEvent(e);
1252
1248
  };
1253
- const initializeAudioContext = (0, react_1.useCallback)(() => {
1254
- if (!audioContextRef.current || audioContextRef.current.state === 'closed') {
1255
- audioContextRef.current = new (window.AudioContext || window.webkitAudioContext)();
1256
- }
1257
- return audioContextRef.current;
1258
- }, []);
1259
- const initializeSpeechSynthesizer = (0, react_1.useCallback)((audioConfig) => {
1260
- if (!speechSynthesizerRef.current && AZURE_COGNITIVE_SERVICES_TTS_KEY) {
1261
- const speechConfig = speechSdk.SpeechConfig.fromSubscription(AZURE_COGNITIVE_SERVICES_TTS_KEY, 'eastus');
1262
- speechSynthesizerRef.current = new speechSdk.SpeechSynthesizer(speechConfig, audioConfig);
1263
- }
1264
- return speechSynthesizerRef.current;
1265
- }, []);
1266
- const stopCurrentSpeech = (0, react_1.useCallback)(() => {
1267
- if (currentSpeechRef.current) {
1268
- currentSpeechRef.current.cancel();
1269
- currentSpeechRef.current = null;
1270
- }
1271
- if (audioContextRef.current) {
1272
- audioContextRef.current.suspend();
1273
- }
1274
- if (audioDestinationRef.current) {
1275
- audioDestinationRef.current.pause();
1276
- }
1277
- setIsPlayingAudio(false);
1278
- stopProcessing();
1279
- resetVisemeQueue();
1280
- }, []);
1281
- const speak = (0, react_1.useCallback)(async (text) => {
1249
+ const speak = (text) => {
1282
1250
  if (!AZURE_COGNITIVE_SERVICES_TTS_KEY || preview) {
1283
1251
  emitEndSpeakEvent();
1284
1252
  return;
1285
1253
  }
1286
1254
  stopListening();
1287
- stopCurrentSpeech();
1288
- if (preview || muteSpeaker || speakerMuted) {
1289
- setIsPlayingAudio(false);
1255
+ if (preview)
1256
+ return;
1257
+ if (muteSpeaker || speakerMuted) {
1258
+ memoriSpeaking = false;
1290
1259
  setMemoriTyping(false);
1291
1260
  emitEndSpeakEvent();
1292
1261
  if (continuousSpeech) {
@@ -1294,98 +1263,147 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1294
1263
  }
1295
1264
  return;
1296
1265
  }
1297
- try {
1298
- const audioContext = initializeAudioContext();
1299
- await audioContext.resume();
1300
- if (!audioDestinationRef.current) {
1301
- audioDestinationRef.current = new speechSdk.SpeakerAudioDestination();
1302
- }
1303
- const audioConfig = speechSdk.AudioConfig.fromSpeakerOutput(audioDestinationRef.current);
1304
- const speechSynthesizer = initializeSpeechSynthesizer(audioConfig);
1305
- if (speechSynthesizer) {
1306
- speechSynthesizer.visemeReceived = (_, e) => {
1307
- addViseme(e.visemeId, e.audioOffset);
1308
- console.log('viseme added');
1309
- };
1266
+ if (audioDestination)
1267
+ audioDestination.pause();
1268
+ let isSafari = window.navigator.userAgent.includes('Safari') &&
1269
+ !window.navigator.userAgent.includes('Chrome');
1270
+ let isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent);
1271
+ if (audioContext.state === 'interrupted') {
1272
+ audioContext.resume().then(() => speak(text));
1273
+ return;
1274
+ }
1275
+ if (audioContext.state === 'closed') {
1276
+ audioContext = new standardized_audio_context_1.AudioContext();
1277
+ let buffer = audioContext.createBuffer(1, 10000, 22050);
1278
+ let source = audioContext.createBufferSource();
1279
+ source.buffer = buffer;
1280
+ source.connect(audioContext.destination);
1281
+ }
1282
+ else if (audioContext.state === 'suspended') {
1283
+ stopAudio();
1284
+ audioContext = new standardized_audio_context_1.AudioContext();
1285
+ let buffer = audioContext.createBuffer(1, 10000, 22050);
1286
+ let source = audioContext.createBufferSource();
1287
+ source.buffer = buffer;
1288
+ source.connect(audioContext.destination);
1289
+ }
1290
+ if (!speechSynthesizer) {
1291
+ if (!isIOS) {
1292
+ audioDestination = new speechSdk.SpeakerAudioDestination();
1310
1293
  }
1311
- startProcessing();
1312
- const textToSpeak = (0, utils_1.escapeHTML)((0, utils_1.stripMarkdown)((0, utils_1.stripEmojis)((0, utils_1.stripHTML)((0, utils_1.stripOutputTags)(text)))));
1313
- const ssml = `
1314
- <speak version="1.0"
1315
- xmlns="http://www.w3.org/2001/10/synthesis"
1316
- xmlns:mstts="https://www.w3.org/2001/mstts"
1317
- xml:lang="${getCultureCodeByLanguage(userLang)}">
1318
- <voice name="${getTTSVoice(userLang)}">
1319
- <s>${replaceTextWithPhonemes(textToSpeak, userLang.toLowerCase())}</s>
1320
- </voice>
1321
- </speak>
1322
- `;
1323
- const speakPromise = new Promise((resolve, reject) => {
1324
- speechSynthesizer === null || speechSynthesizer === void 0 ? void 0 : speechSynthesizer.speakSsmlAsync(ssml, result => resolve(result), error => reject(error));
1325
- });
1326
- currentSpeechRef.current = {
1327
- cancel: () => {
1328
- var _a;
1329
- speechSynthesizer === null || speechSynthesizer === void 0 ? void 0 : speechSynthesizer.close();
1330
- (_a = audioDestinationRef.current) === null || _a === void 0 ? void 0 : _a.pause();
1294
+ let audioConfig = speechSdk.AudioConfig.fromSpeakerOutput(audioDestination);
1295
+ speechSynthesizer = new speechSdk.SpeechSynthesizer(speechConfig, audioConfig);
1296
+ }
1297
+ const source = audioContext.createBufferSource();
1298
+ source.addEventListener('ended', () => {
1299
+ setIsPlayingAudio(false);
1300
+ memoriSpeaking = false;
1301
+ });
1302
+ audioDestination.onAudioEnd = () => {
1303
+ setIsPlayingAudio(false);
1304
+ memoriSpeaking = false;
1305
+ source.disconnect();
1306
+ emitEndSpeakEvent();
1307
+ onEndSpeakStartListen();
1308
+ };
1309
+ resetVisemeQueue();
1310
+ speechSynthesizer.visemeReceived = function (_, e) {
1311
+ addViseme(e.visemeId, e.audioOffset);
1312
+ };
1313
+ const textToSpeak = (0, utils_1.escapeHTML)((0, utils_1.stripMarkdown)((0, utils_1.stripEmojis)((0, utils_1.stripHTML)((0, utils_1.stripOutputTags)(text)))));
1314
+ speechSynthesizer.speakSsmlAsync(`<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xmlns:mstts="https://www.w3.org/2001/mstts" xmlns:emo="http://www.w3.org/2009/10/emotionml" xml:lang="${getCultureCodeByLanguage(userLang)}"><voice name="${getTTSVoice(userLang)}"><s>${replaceTextWithPhonemes(textToSpeak, userLang.toLowerCase())}</s></voice></speak>`, result => {
1315
+ if (result) {
1316
+ setIsPlayingAudio(true);
1317
+ memoriSpeaking = true;
1318
+ try {
1319
+ audioContext.decodeAudioData(result.audioData, function (buffer) {
1320
+ console.log('decoded');
1321
+ const currentSource = audioContext.createBufferSource();
1322
+ currentSource.buffer = buffer;
1323
+ currentSource.connect(audioContext.destination);
1324
+ startProcessing();
1325
+ currentSource.start();
1326
+ currentSource.onended = () => {
1327
+ console.log('ended');
1328
+ setIsPlayingAudio(false);
1329
+ memoriSpeaking = false;
1330
+ stopProcessing();
1331
+ resetVisemeQueue();
1332
+ emitEndSpeakEvent();
1333
+ };
1334
+ });
1335
+ audioContext.onstatechange = () => {
1336
+ if (audioContext.state === 'suspended' ||
1337
+ audioContext.state === 'closed') {
1338
+ console.log('suspended');
1339
+ source.disconnect();
1340
+ setIsPlayingAudio(false);
1341
+ stopProcessing();
1342
+ resetVisemeQueue();
1343
+ memoriSpeaking = false;
1344
+ emitEndSpeakEvent();
1345
+ }
1346
+ else if (audioContext.state === 'interrupted') {
1347
+ console.log('interrupted');
1348
+ stopProcessing();
1349
+ resetVisemeQueue();
1350
+ audioContext.resume();
1351
+ }
1352
+ };
1331
1353
  }
1332
- };
1333
- const result = await speakPromise;
1334
- setIsPlayingAudio(true);
1335
- if (audioContext && result) {
1336
- const audioBuffer = await audioContext.decodeAudioData(result.audioData);
1337
- const source = audioContext.createBufferSource();
1338
- source.buffer = audioBuffer;
1339
- source.connect(audioContext.destination);
1340
- source.onended = () => {
1354
+ catch (e) {
1355
+ console.warn('speak error: ', e);
1356
+ window.speechSynthesis.speak(new SpeechSynthesisUtterance(text));
1341
1357
  setIsPlayingAudio(false);
1358
+ memoriSpeaking = false;
1342
1359
  stopProcessing();
1343
1360
  resetVisemeQueue();
1344
- currentSpeechRef.current = null;
1361
+ if (speechSynthesizer) {
1362
+ speechSynthesizer.close();
1363
+ speechSynthesizer = null;
1364
+ }
1345
1365
  emitEndSpeakEvent();
1346
- onEndSpeakStartListen();
1347
- };
1348
- await audioContext.resume();
1349
- source.start(0);
1366
+ }
1350
1367
  }
1351
1368
  else {
1369
+ audioContext.resume();
1352
1370
  stopProcessing();
1353
1371
  resetVisemeQueue();
1354
- throw new Error('No result from speech synthesis');
1372
+ setIsPlayingAudio(false);
1373
+ memoriSpeaking = false;
1374
+ emitEndSpeakEvent();
1355
1375
  }
1356
- }
1357
- catch (error) {
1358
- console.error('Speech synthesis error:', error);
1376
+ }, error => {
1377
+ console.error('speak:', error);
1378
+ window.speechSynthesis.speak(new SpeechSynthesisUtterance(text));
1379
+ setIsPlayingAudio(false);
1380
+ memoriSpeaking = false;
1359
1381
  stopProcessing();
1360
1382
  resetVisemeQueue();
1361
- const utterance = new SpeechSynthesisUtterance(text);
1362
- window.speechSynthesis.speak(utterance);
1363
- }
1364
- finally {
1365
- setMemoriTyping(false);
1366
- }
1367
- }, [initializeAudioContext, initializeSpeechSynthesizer, stopCurrentSpeech]);
1368
- const stopAudio = (0, react_1.useCallback)(() => {
1383
+ emitEndSpeakEvent();
1384
+ });
1385
+ setMemoriTyping(false);
1386
+ };
1387
+ const stopAudio = () => {
1369
1388
  setIsPlayingAudio(false);
1370
1389
  memoriSpeaking = false;
1371
1390
  try {
1372
- if (speechSynthesizerRef.current) {
1373
- speechSynthesizerRef.current.close();
1374
- speechSynthesizerRef.current = null;
1391
+ if (speechSynthesizer) {
1392
+ speechSynthesizer.close();
1393
+ speechSynthesizer = null;
1375
1394
  }
1376
- if (audioContextRef.current && audioContextRef.current.state !== 'closed') {
1377
- audioContextRef.current.close();
1395
+ if (audioContext.state !== 'closed') {
1396
+ audioContext.close();
1378
1397
  }
1379
- if (audioDestinationRef.current) {
1380
- audioDestinationRef.current.pause();
1381
- audioDestinationRef.current.close();
1398
+ if (audioDestination) {
1399
+ audioDestination.pause();
1400
+ audioDestination.close();
1382
1401
  }
1383
- stopCurrentSpeech();
1384
1402
  }
1385
1403
  catch (e) {
1386
1404
  console.debug('stopAudio error: ', e);
1387
1405
  }
1388
- }, [stopCurrentSpeech]);
1406
+ };
1389
1407
  (0, react_1.useEffect)(() => {
1390
1408
  let textarea = document.querySelector('#chat-fieldset textarea');
1391
1409
  if (textarea)
@@ -1518,12 +1536,6 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1518
1536
  (0, react_1.useEffect)(() => {
1519
1537
  return () => {
1520
1538
  resetUIEffects();
1521
- if (speechSynthesizerRef.current) {
1522
- speechSynthesizerRef.current.close();
1523
- }
1524
- if (audioContextRef.current) {
1525
- audioContextRef.current.close();
1526
- }
1527
1539
  };
1528
1540
  }, []);
1529
1541
  (0, react_1.useEffect)(() => {
@@ -2085,7 +2097,9 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
2085
2097
  }
2086
2098
  }, [tenant === null || tenant === void 0 ? void 0 : tenant.billingDelegation, deepThoughtEnabled]);
2087
2099
  const showFullHistory = showOnlyLastMessages === undefined
2088
- ? layout !== 'TOTEM' && layout !== 'WEBSITE_ASSISTANT'
2100
+ ? layout !== 'TOTEM' &&
2101
+ layout !== 'WEBSITE_ASSISTANT' &&
2102
+ layout !== 'HIDDEN_CHAT'
2089
2103
  : !showOnlyLastMessages;
2090
2104
  const headerProps = {
2091
2105
  memori,