@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
@@ -216,11 +216,7 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
216
216
  const [isPlayingAudio, setIsPlayingAudio] = useState(false);
217
217
  const [controlsPosition, setControlsPosition] = useState('center');
218
218
  const [hideEmissions, setHideEmissions] = useState(false);
219
- const { startProcessing, stopProcessing, addViseme, resetVisemeQueue, isProcessing, } = useViseme();
220
- const audioContextRef = useRef(null);
221
- const speechSynthesizerRef = useRef(null);
222
- const audioDestinationRef = useRef(null);
223
- const currentSpeechRef = useRef(null);
219
+ const { updateCurrentViseme, startProcessing, resetAndStartProcessing, isProcessing, addViseme, stopProcessing, resetVisemeQueue, } = useViseme();
224
220
  useEffect(() => {
225
221
  setIsPlayingAudio(!!speechSynthesizer);
226
222
  memoriSpeaking = !!speechSynthesizer;
@@ -1247,43 +1243,16 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1247
1243
  const e = new CustomEvent('MemoriEndSpeak');
1248
1244
  document.dispatchEvent(e);
1249
1245
  };
1250
- const initializeAudioContext = useCallback(() => {
1251
- if (!audioContextRef.current || audioContextRef.current.state === 'closed') {
1252
- audioContextRef.current = new (window.AudioContext || window.webkitAudioContext)();
1253
- }
1254
- return audioContextRef.current;
1255
- }, []);
1256
- const initializeSpeechSynthesizer = useCallback((audioConfig) => {
1257
- if (!speechSynthesizerRef.current && AZURE_COGNITIVE_SERVICES_TTS_KEY) {
1258
- const speechConfig = speechSdk.SpeechConfig.fromSubscription(AZURE_COGNITIVE_SERVICES_TTS_KEY, 'eastus');
1259
- speechSynthesizerRef.current = new speechSdk.SpeechSynthesizer(speechConfig, audioConfig);
1260
- }
1261
- return speechSynthesizerRef.current;
1262
- }, []);
1263
- const stopCurrentSpeech = useCallback(() => {
1264
- if (currentSpeechRef.current) {
1265
- currentSpeechRef.current.cancel();
1266
- currentSpeechRef.current = null;
1267
- }
1268
- if (audioContextRef.current) {
1269
- audioContextRef.current.suspend();
1270
- }
1271
- if (audioDestinationRef.current) {
1272
- audioDestinationRef.current.pause();
1273
- }
1274
- setIsPlayingAudio(false);
1275
- stopProcessing();
1276
- resetVisemeQueue();
1277
- }, []);
1278
- const speak = useCallback(async (text) => {
1246
+ const speak = (text) => {
1279
1247
  if (!AZURE_COGNITIVE_SERVICES_TTS_KEY || preview) {
1280
1248
  emitEndSpeakEvent();
1281
1249
  return;
1282
1250
  }
1283
1251
  stopListening();
1284
- stopCurrentSpeech();
1285
- if (preview || muteSpeaker || speakerMuted) {
1286
- setIsPlayingAudio(false);
1252
+ if (preview)
1253
+ return;
1254
+ if (muteSpeaker || speakerMuted) {
1255
+ memoriSpeaking = false;
1287
1256
  setMemoriTyping(false);
1288
1257
  emitEndSpeakEvent();
1289
1258
  if (continuousSpeech) {
@@ -1291,98 +1260,147 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1291
1260
  }
1292
1261
  return;
1293
1262
  }
1294
- try {
1295
- const audioContext = initializeAudioContext();
1296
- await audioContext.resume();
1297
- if (!audioDestinationRef.current) {
1298
- audioDestinationRef.current = new speechSdk.SpeakerAudioDestination();
1299
- }
1300
- const audioConfig = speechSdk.AudioConfig.fromSpeakerOutput(audioDestinationRef.current);
1301
- const speechSynthesizer = initializeSpeechSynthesizer(audioConfig);
1302
- if (speechSynthesizer) {
1303
- speechSynthesizer.visemeReceived = (_, e) => {
1304
- addViseme(e.visemeId, e.audioOffset);
1305
- console.log('viseme added');
1306
- };
1263
+ if (audioDestination)
1264
+ audioDestination.pause();
1265
+ let isSafari = window.navigator.userAgent.includes('Safari') &&
1266
+ !window.navigator.userAgent.includes('Chrome');
1267
+ let isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent);
1268
+ if (audioContext.state === 'interrupted') {
1269
+ audioContext.resume().then(() => speak(text));
1270
+ return;
1271
+ }
1272
+ if (audioContext.state === 'closed') {
1273
+ audioContext = new AudioContext();
1274
+ let buffer = audioContext.createBuffer(1, 10000, 22050);
1275
+ let source = audioContext.createBufferSource();
1276
+ source.buffer = buffer;
1277
+ source.connect(audioContext.destination);
1278
+ }
1279
+ else if (audioContext.state === 'suspended') {
1280
+ stopAudio();
1281
+ audioContext = new AudioContext();
1282
+ let buffer = audioContext.createBuffer(1, 10000, 22050);
1283
+ let source = audioContext.createBufferSource();
1284
+ source.buffer = buffer;
1285
+ source.connect(audioContext.destination);
1286
+ }
1287
+ if (!speechSynthesizer) {
1288
+ if (!isIOS) {
1289
+ audioDestination = new speechSdk.SpeakerAudioDestination();
1307
1290
  }
1308
- startProcessing();
1309
- const textToSpeak = escapeHTML(stripMarkdown(stripEmojis(stripHTML(stripOutputTags(text)))));
1310
- const ssml = `
1311
- <speak version="1.0"
1312
- xmlns="http://www.w3.org/2001/10/synthesis"
1313
- xmlns:mstts="https://www.w3.org/2001/mstts"
1314
- xml:lang="${getCultureCodeByLanguage(userLang)}">
1315
- <voice name="${getTTSVoice(userLang)}">
1316
- <s>${replaceTextWithPhonemes(textToSpeak, userLang.toLowerCase())}</s>
1317
- </voice>
1318
- </speak>
1319
- `;
1320
- const speakPromise = new Promise((resolve, reject) => {
1321
- speechSynthesizer === null || speechSynthesizer === void 0 ? void 0 : speechSynthesizer.speakSsmlAsync(ssml, result => resolve(result), error => reject(error));
1322
- });
1323
- currentSpeechRef.current = {
1324
- cancel: () => {
1325
- var _a;
1326
- speechSynthesizer === null || speechSynthesizer === void 0 ? void 0 : speechSynthesizer.close();
1327
- (_a = audioDestinationRef.current) === null || _a === void 0 ? void 0 : _a.pause();
1291
+ let audioConfig = speechSdk.AudioConfig.fromSpeakerOutput(audioDestination);
1292
+ speechSynthesizer = new speechSdk.SpeechSynthesizer(speechConfig, audioConfig);
1293
+ }
1294
+ const source = audioContext.createBufferSource();
1295
+ source.addEventListener('ended', () => {
1296
+ setIsPlayingAudio(false);
1297
+ memoriSpeaking = false;
1298
+ });
1299
+ audioDestination.onAudioEnd = () => {
1300
+ setIsPlayingAudio(false);
1301
+ memoriSpeaking = false;
1302
+ source.disconnect();
1303
+ emitEndSpeakEvent();
1304
+ onEndSpeakStartListen();
1305
+ };
1306
+ resetVisemeQueue();
1307
+ speechSynthesizer.visemeReceived = function (_, e) {
1308
+ addViseme(e.visemeId, e.audioOffset);
1309
+ };
1310
+ const textToSpeak = escapeHTML(stripMarkdown(stripEmojis(stripHTML(stripOutputTags(text)))));
1311
+ 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 => {
1312
+ if (result) {
1313
+ setIsPlayingAudio(true);
1314
+ memoriSpeaking = true;
1315
+ try {
1316
+ audioContext.decodeAudioData(result.audioData, function (buffer) {
1317
+ console.log('decoded');
1318
+ const currentSource = audioContext.createBufferSource();
1319
+ currentSource.buffer = buffer;
1320
+ currentSource.connect(audioContext.destination);
1321
+ startProcessing();
1322
+ currentSource.start();
1323
+ currentSource.onended = () => {
1324
+ console.log('ended');
1325
+ setIsPlayingAudio(false);
1326
+ memoriSpeaking = false;
1327
+ stopProcessing();
1328
+ resetVisemeQueue();
1329
+ emitEndSpeakEvent();
1330
+ };
1331
+ });
1332
+ audioContext.onstatechange = () => {
1333
+ if (audioContext.state === 'suspended' ||
1334
+ audioContext.state === 'closed') {
1335
+ console.log('suspended');
1336
+ source.disconnect();
1337
+ setIsPlayingAudio(false);
1338
+ stopProcessing();
1339
+ resetVisemeQueue();
1340
+ memoriSpeaking = false;
1341
+ emitEndSpeakEvent();
1342
+ }
1343
+ else if (audioContext.state === 'interrupted') {
1344
+ console.log('interrupted');
1345
+ stopProcessing();
1346
+ resetVisemeQueue();
1347
+ audioContext.resume();
1348
+ }
1349
+ };
1328
1350
  }
1329
- };
1330
- const result = await speakPromise;
1331
- setIsPlayingAudio(true);
1332
- if (audioContext && result) {
1333
- const audioBuffer = await audioContext.decodeAudioData(result.audioData);
1334
- const source = audioContext.createBufferSource();
1335
- source.buffer = audioBuffer;
1336
- source.connect(audioContext.destination);
1337
- source.onended = () => {
1351
+ catch (e) {
1352
+ console.warn('speak error: ', e);
1353
+ window.speechSynthesis.speak(new SpeechSynthesisUtterance(text));
1338
1354
  setIsPlayingAudio(false);
1355
+ memoriSpeaking = false;
1339
1356
  stopProcessing();
1340
1357
  resetVisemeQueue();
1341
- currentSpeechRef.current = null;
1358
+ if (speechSynthesizer) {
1359
+ speechSynthesizer.close();
1360
+ speechSynthesizer = null;
1361
+ }
1342
1362
  emitEndSpeakEvent();
1343
- onEndSpeakStartListen();
1344
- };
1345
- await audioContext.resume();
1346
- source.start(0);
1363
+ }
1347
1364
  }
1348
1365
  else {
1366
+ audioContext.resume();
1349
1367
  stopProcessing();
1350
1368
  resetVisemeQueue();
1351
- throw new Error('No result from speech synthesis');
1369
+ setIsPlayingAudio(false);
1370
+ memoriSpeaking = false;
1371
+ emitEndSpeakEvent();
1352
1372
  }
1353
- }
1354
- catch (error) {
1355
- console.error('Speech synthesis error:', error);
1373
+ }, error => {
1374
+ console.error('speak:', error);
1375
+ window.speechSynthesis.speak(new SpeechSynthesisUtterance(text));
1376
+ setIsPlayingAudio(false);
1377
+ memoriSpeaking = false;
1356
1378
  stopProcessing();
1357
1379
  resetVisemeQueue();
1358
- const utterance = new SpeechSynthesisUtterance(text);
1359
- window.speechSynthesis.speak(utterance);
1360
- }
1361
- finally {
1362
- setMemoriTyping(false);
1363
- }
1364
- }, [initializeAudioContext, initializeSpeechSynthesizer, stopCurrentSpeech]);
1365
- const stopAudio = useCallback(() => {
1380
+ emitEndSpeakEvent();
1381
+ });
1382
+ setMemoriTyping(false);
1383
+ };
1384
+ const stopAudio = () => {
1366
1385
  setIsPlayingAudio(false);
1367
1386
  memoriSpeaking = false;
1368
1387
  try {
1369
- if (speechSynthesizerRef.current) {
1370
- speechSynthesizerRef.current.close();
1371
- speechSynthesizerRef.current = null;
1388
+ if (speechSynthesizer) {
1389
+ speechSynthesizer.close();
1390
+ speechSynthesizer = null;
1372
1391
  }
1373
- if (audioContextRef.current && audioContextRef.current.state !== 'closed') {
1374
- audioContextRef.current.close();
1392
+ if (audioContext.state !== 'closed') {
1393
+ audioContext.close();
1375
1394
  }
1376
- if (audioDestinationRef.current) {
1377
- audioDestinationRef.current.pause();
1378
- audioDestinationRef.current.close();
1395
+ if (audioDestination) {
1396
+ audioDestination.pause();
1397
+ audioDestination.close();
1379
1398
  }
1380
- stopCurrentSpeech();
1381
1399
  }
1382
1400
  catch (e) {
1383
1401
  console.debug('stopAudio error: ', e);
1384
1402
  }
1385
- }, [stopCurrentSpeech]);
1403
+ };
1386
1404
  useEffect(() => {
1387
1405
  let textarea = document.querySelector('#chat-fieldset textarea');
1388
1406
  if (textarea)
@@ -1515,12 +1533,6 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
1515
1533
  useEffect(() => {
1516
1534
  return () => {
1517
1535
  resetUIEffects();
1518
- if (speechSynthesizerRef.current) {
1519
- speechSynthesizerRef.current.close();
1520
- }
1521
- if (audioContextRef.current) {
1522
- audioContextRef.current.close();
1523
- }
1524
1536
  };
1525
1537
  }, []);
1526
1538
  useEffect(() => {
@@ -2082,7 +2094,9 @@ const MemoriWidget = ({ memori, memoriConfigs, ownerUserID, ownerUserName, tenan
2082
2094
  }
2083
2095
  }, [tenant === null || tenant === void 0 ? void 0 : tenant.billingDelegation, deepThoughtEnabled]);
2084
2096
  const showFullHistory = showOnlyLastMessages === undefined
2085
- ? layout !== 'TOTEM' && layout !== 'WEBSITE_ASSISTANT'
2097
+ ? layout !== 'TOTEM' &&
2098
+ layout !== 'WEBSITE_ASSISTANT' &&
2099
+ layout !== 'HIDDEN_CHAT'
2086
2100
  : !showOnlyLastMessages;
2087
2101
  const headerProps = {
2088
2102
  memori,