@memori.ai/memori-react 7.34.2 → 8.0.0-rc.1

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 (54) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/dist/components/Chat/Chat.d.ts +1 -0
  3. package/dist/components/Chat/Chat.js +2 -2
  4. package/dist/components/Chat/Chat.js.map +1 -1
  5. package/dist/components/ChatInputs/ChatInputs.d.ts +1 -0
  6. package/dist/components/ChatInputs/ChatInputs.js +3 -3
  7. package/dist/components/ChatInputs/ChatInputs.js.map +1 -1
  8. package/dist/components/MemoriWidget/MemoriWidget.d.ts +3 -3
  9. package/dist/components/MemoriWidget/MemoriWidget.js +138 -425
  10. package/dist/components/MemoriWidget/MemoriWidget.js.map +1 -1
  11. package/dist/context/visemeContext.js +39 -30
  12. package/dist/context/visemeContext.js.map +1 -1
  13. package/dist/helpers/sanitizer.d.ts +6 -0
  14. package/dist/helpers/sanitizer.js +41 -0
  15. package/dist/helpers/sanitizer.js.map +1 -0
  16. package/dist/helpers/tts/ttsVoiceUtility.d.ts +158 -0
  17. package/dist/helpers/tts/ttsVoiceUtility.js +192 -0
  18. package/dist/helpers/tts/ttsVoiceUtility.js.map +1 -0
  19. package/dist/helpers/tts/useTTS.d.ts +26 -0
  20. package/dist/helpers/tts/useTTS.js +274 -0
  21. package/dist/helpers/tts/useTTS.js.map +1 -0
  22. package/dist/index.js +12 -7
  23. package/dist/index.js.map +1 -1
  24. package/esm/components/Chat/Chat.d.ts +1 -0
  25. package/esm/components/Chat/Chat.js +2 -2
  26. package/esm/components/Chat/Chat.js.map +1 -1
  27. package/esm/components/ChatInputs/ChatInputs.d.ts +1 -0
  28. package/esm/components/ChatInputs/ChatInputs.js +3 -3
  29. package/esm/components/ChatInputs/ChatInputs.js.map +1 -1
  30. package/esm/components/MemoriWidget/MemoriWidget.d.ts +3 -3
  31. package/esm/components/MemoriWidget/MemoriWidget.js +139 -426
  32. package/esm/components/MemoriWidget/MemoriWidget.js.map +1 -1
  33. package/esm/context/visemeContext.js +39 -30
  34. package/esm/context/visemeContext.js.map +1 -1
  35. package/esm/helpers/sanitizer.d.ts +6 -0
  36. package/esm/helpers/sanitizer.js +32 -0
  37. package/esm/helpers/sanitizer.js.map +1 -0
  38. package/esm/helpers/tts/ttsVoiceUtility.d.ts +158 -0
  39. package/esm/helpers/tts/ttsVoiceUtility.js +182 -0
  40. package/esm/helpers/tts/ttsVoiceUtility.js.map +1 -0
  41. package/esm/helpers/tts/useTTS.d.ts +26 -0
  42. package/esm/helpers/tts/useTTS.js +270 -0
  43. package/esm/helpers/tts/useTTS.js.map +1 -0
  44. package/esm/index.js +12 -7
  45. package/esm/index.js.map +1 -1
  46. package/package.json +2 -2
  47. package/src/components/Chat/Chat.tsx +3 -0
  48. package/src/components/ChatInputs/ChatInputs.tsx +4 -2
  49. package/src/components/MemoriWidget/MemoriWidget.tsx +246 -637
  50. package/src/context/visemeContext.tsx +77 -55
  51. package/src/helpers/sanitizer.ts +71 -0
  52. package/src/helpers/tts/ttsVoiceUtility.ts +275 -0
  53. package/src/helpers/tts/useTTS.ts +431 -0
  54. package/src/index.tsx +14 -10
@@ -0,0 +1,158 @@
1
+ import { TTSConfig } from './useTTS';
2
+ export declare const AZURE_VOICES: {
3
+ IT: {
4
+ MALE: string;
5
+ FEMALE: string;
6
+ };
7
+ DE: {
8
+ MALE: string;
9
+ FEMALE: string;
10
+ };
11
+ EN: {
12
+ MALE: string;
13
+ FEMALE: string;
14
+ };
15
+ ES: {
16
+ MALE: string;
17
+ FEMALE: string;
18
+ };
19
+ FR: {
20
+ MALE: string;
21
+ FEMALE: string;
22
+ };
23
+ PT: {
24
+ MALE: string;
25
+ FEMALE: string;
26
+ };
27
+ UK: {
28
+ MALE: string;
29
+ FEMALE: string;
30
+ };
31
+ RU: {
32
+ MALE: string;
33
+ FEMALE: string;
34
+ };
35
+ PL: {
36
+ MALE: string;
37
+ FEMALE: string;
38
+ };
39
+ FI: {
40
+ MALE: string;
41
+ FEMALE: string;
42
+ };
43
+ EL: {
44
+ MALE: string;
45
+ FEMALE: string;
46
+ };
47
+ AR: {
48
+ MALE: string;
49
+ FEMALE: string;
50
+ };
51
+ ZH: {
52
+ MALE: string;
53
+ FEMALE: string;
54
+ };
55
+ JA: {
56
+ MALE: string;
57
+ FEMALE: string;
58
+ };
59
+ };
60
+ export declare const DEFAULT_AZURE_VOICE: {
61
+ MALE: string;
62
+ FEMALE: string;
63
+ };
64
+ export declare const OPENAI_VOICES: {
65
+ ALL: string[];
66
+ CHARACTERISTICS: {
67
+ alloy: {
68
+ gender: string;
69
+ tone: string;
70
+ };
71
+ echo: {
72
+ gender: string;
73
+ tone: string;
74
+ };
75
+ fable: {
76
+ gender: string;
77
+ tone: string;
78
+ };
79
+ onyx: {
80
+ gender: string;
81
+ tone: string;
82
+ };
83
+ nova: {
84
+ gender: string;
85
+ tone: string;
86
+ };
87
+ shimmer: {
88
+ gender: string;
89
+ tone: string;
90
+ };
91
+ };
92
+ RECOMMENDED: {
93
+ DEFAULT: {
94
+ MALE: string;
95
+ FEMALE: string;
96
+ NEUTRAL: string;
97
+ };
98
+ IT: {
99
+ MALE: string;
100
+ FEMALE: string;
101
+ };
102
+ ES: {
103
+ MALE: string;
104
+ FEMALE: string;
105
+ };
106
+ FR: {
107
+ MALE: string;
108
+ FEMALE: string;
109
+ };
110
+ PT: {
111
+ MALE: string;
112
+ FEMALE: string;
113
+ };
114
+ DE: {
115
+ MALE: string;
116
+ FEMALE: string;
117
+ };
118
+ EN: {
119
+ MALE: string;
120
+ FEMALE: string;
121
+ };
122
+ ZH: {
123
+ MALE: string;
124
+ FEMALE: string;
125
+ };
126
+ JA: {
127
+ MALE: string;
128
+ FEMALE: string;
129
+ };
130
+ RU: {
131
+ MALE: string;
132
+ FEMALE: string;
133
+ };
134
+ };
135
+ };
136
+ export declare const DEFAULT_OPENAI_VOICE = "alloy";
137
+ export declare const PROVIDER_CONFIG: {
138
+ azure: {
139
+ defaultVoice: string;
140
+ defaultRegion: string;
141
+ defaultModel: null;
142
+ endpoint: (region: string) => string;
143
+ outputFormat: string;
144
+ };
145
+ openai: {
146
+ defaultVoice: string;
147
+ defaultModel: string;
148
+ voices: string[];
149
+ endpoint: string;
150
+ };
151
+ };
152
+ export declare function getTTSVoice(lang?: string, provider?: 'azure' | 'openai', voiceType?: 'MALE' | 'FEMALE' | 'NEUTRAL'): string;
153
+ export declare function isValidVoice(voice: string, provider: 'azure' | 'openai'): boolean;
154
+ export declare function getDefaultVoice(provider: 'azure' | 'openai', voiceType?: 'MALE' | 'FEMALE'): string;
155
+ export declare function getDefaultRegion(provider: 'azure' | 'openai'): string | null;
156
+ export declare function getDefaultModel(provider: 'azure' | 'openai'): string | null;
157
+ export declare function ensureValidVoice(voice: string, provider: 'azure' | 'openai', voiceType?: 'MALE' | 'FEMALE'): string;
158
+ export declare function createTTSConfiguration(config: Partial<TTSConfig>): TTSConfig;
@@ -0,0 +1,182 @@
1
+ export const AZURE_VOICES = {
2
+ IT: {
3
+ MALE: 'it-IT-DiegoNeural',
4
+ FEMALE: 'it-IT-ElsaNeural'
5
+ },
6
+ DE: {
7
+ MALE: 'de-DE-ConradNeural',
8
+ FEMALE: 'de-DE-KatjaNeural'
9
+ },
10
+ EN: {
11
+ MALE: 'en-GB-RyanNeural',
12
+ FEMALE: 'en-GB-SoniaNeural'
13
+ },
14
+ ES: {
15
+ MALE: 'es-ES-AlvaroNeural',
16
+ FEMALE: 'es-ES-ElviraNeural'
17
+ },
18
+ FR: {
19
+ MALE: 'fr-FR-HenriNeural',
20
+ FEMALE: 'fr-FR-DeniseNeural'
21
+ },
22
+ PT: {
23
+ MALE: 'pt-PT-DuarteNeural',
24
+ FEMALE: 'pt-PT-RaquelNeural'
25
+ },
26
+ UK: {
27
+ MALE: 'uk-UA-OstapNeural',
28
+ FEMALE: 'uk-UA-PolinaNeural'
29
+ },
30
+ RU: {
31
+ MALE: 'ru-RU-DmitryNeural',
32
+ FEMALE: 'ru-RU-SvetlanaNeural'
33
+ },
34
+ PL: {
35
+ MALE: 'pl-PL-MarekNeural',
36
+ FEMALE: 'pl-PL-AgnieszkaNeural'
37
+ },
38
+ FI: {
39
+ MALE: 'fi-FI-HarriNeural',
40
+ FEMALE: 'fi-FI-SelmaNeural'
41
+ },
42
+ EL: {
43
+ MALE: 'el-GR-NestorasNeural',
44
+ FEMALE: 'el-GR-AthinaNeural'
45
+ },
46
+ AR: {
47
+ MALE: 'ar-SA-HamedNeural',
48
+ FEMALE: 'ar-SA-ZariyahNeural'
49
+ },
50
+ ZH: {
51
+ MALE: 'zh-CN-YunxiNeural',
52
+ FEMALE: 'zh-CN-XiaoxiaoNeural'
53
+ },
54
+ JA: {
55
+ MALE: 'ja-JP-KeitaNeural',
56
+ FEMALE: 'ja-JP-NanamiNeural'
57
+ },
58
+ };
59
+ export const DEFAULT_AZURE_VOICE = {
60
+ MALE: 'en-US-GuyNeural',
61
+ FEMALE: 'en-US-JennyNeural'
62
+ };
63
+ export const OPENAI_VOICES = {
64
+ ALL: ['alloy', 'echo', 'fable', 'onyx', 'nova', 'shimmer'],
65
+ CHARACTERISTICS: {
66
+ 'alloy': { gender: 'NEUTRAL', tone: 'BALANCED' },
67
+ 'echo': { gender: 'MALE', tone: 'DEEP' },
68
+ 'fable': { gender: 'FEMALE', tone: 'EXPRESSIVE' },
69
+ 'onyx': { gender: 'MALE', tone: 'AUTHORITATIVE' },
70
+ 'nova': { gender: 'FEMALE', tone: 'FRIENDLY' },
71
+ 'shimmer': { gender: 'FEMALE', tone: 'BRIGHT' }
72
+ },
73
+ RECOMMENDED: {
74
+ DEFAULT: {
75
+ MALE: 'onyx',
76
+ FEMALE: 'nova',
77
+ NEUTRAL: 'alloy'
78
+ },
79
+ IT: {
80
+ MALE: 'echo',
81
+ FEMALE: 'nova'
82
+ },
83
+ ES: {
84
+ MALE: 'echo',
85
+ FEMALE: 'shimmer'
86
+ },
87
+ FR: {
88
+ MALE: 'echo',
89
+ FEMALE: 'fable'
90
+ },
91
+ PT: {
92
+ MALE: 'onyx',
93
+ FEMALE: 'shimmer'
94
+ },
95
+ DE: {
96
+ MALE: 'onyx',
97
+ FEMALE: 'fable'
98
+ },
99
+ EN: {
100
+ MALE: 'echo',
101
+ FEMALE: 'nova'
102
+ },
103
+ ZH: {
104
+ MALE: 'echo',
105
+ FEMALE: 'shimmer'
106
+ },
107
+ JA: {
108
+ MALE: 'echo',
109
+ FEMALE: 'nova'
110
+ },
111
+ RU: {
112
+ MALE: 'onyx',
113
+ FEMALE: 'fable'
114
+ }
115
+ }
116
+ };
117
+ export const DEFAULT_OPENAI_VOICE = 'alloy';
118
+ export const PROVIDER_CONFIG = {
119
+ azure: {
120
+ defaultVoice: DEFAULT_AZURE_VOICE.FEMALE,
121
+ defaultRegion: 'westeurope',
122
+ defaultModel: null,
123
+ endpoint: (region) => `https://${region}.tts.speech.microsoft.com/cognitiveservices/v1`,
124
+ outputFormat: 'audio-24khz-48kbitrate-mono-mp3'
125
+ },
126
+ openai: {
127
+ defaultVoice: DEFAULT_OPENAI_VOICE,
128
+ defaultModel: 'tts-1',
129
+ voices: OPENAI_VOICES.ALL,
130
+ endpoint: 'https://api.openai.com/v1/audio/speech'
131
+ }
132
+ };
133
+ export function getTTSVoice(lang, provider = 'azure', voiceType = 'FEMALE') {
134
+ const voiceLang = (lang || 'EN').toUpperCase();
135
+ if (provider.toLowerCase() === 'openai') {
136
+ const langMap = OPENAI_VOICES.RECOMMENDED[voiceLang] || OPENAI_VOICES.RECOMMENDED.DEFAULT;
137
+ return langMap[voiceType] || OPENAI_VOICES.RECOMMENDED.DEFAULT[voiceType] || DEFAULT_OPENAI_VOICE;
138
+ }
139
+ else {
140
+ const langVoices = AZURE_VOICES[voiceLang] || DEFAULT_AZURE_VOICE;
141
+ return langVoices[voiceType] || langVoices.FEMALE || DEFAULT_AZURE_VOICE.FEMALE;
142
+ }
143
+ }
144
+ export function isValidVoice(voice, provider) {
145
+ if (provider.toLowerCase() === 'openai') {
146
+ return OPENAI_VOICES.ALL.includes(voice);
147
+ }
148
+ return /^[a-z]{2}-[A-Z]{2}-[A-Za-z]+Neural$/.test(voice);
149
+ }
150
+ export function getDefaultVoice(provider, voiceType = 'FEMALE') {
151
+ if (provider.toLowerCase() === 'openai') {
152
+ return OPENAI_VOICES.RECOMMENDED.DEFAULT[voiceType] || DEFAULT_OPENAI_VOICE;
153
+ }
154
+ else {
155
+ return DEFAULT_AZURE_VOICE[voiceType] || DEFAULT_AZURE_VOICE.FEMALE;
156
+ }
157
+ }
158
+ export function getDefaultRegion(provider) {
159
+ return PROVIDER_CONFIG[provider].defaultRegion || null;
160
+ }
161
+ export function getDefaultModel(provider) {
162
+ return PROVIDER_CONFIG[provider].defaultModel || null;
163
+ }
164
+ export function ensureValidVoice(voice, provider, voiceType = 'FEMALE') {
165
+ if (!voice || !isValidVoice(voice, provider)) {
166
+ return getDefaultVoice(provider, voiceType);
167
+ }
168
+ return voice;
169
+ }
170
+ export function createTTSConfiguration(config) {
171
+ const provider = config.provider || 'azure';
172
+ const voiceType = config.voiceType || 'FEMALE';
173
+ return {
174
+ provider,
175
+ voice: config.voice || getDefaultVoice(provider, voiceType),
176
+ model: config.model || getDefaultModel(provider),
177
+ region: config.region || getDefaultRegion(provider),
178
+ tenant: config.tenant || 'www.aisuru.com',
179
+ voiceType
180
+ };
181
+ }
182
+ //# sourceMappingURL=ttsVoiceUtility.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ttsVoiceUtility.js","sourceRoot":"","sources":["../../../src/helpers/tts/ttsVoiceUtility.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /// <reference types="react" />
2
+ export interface TTSConfig {
3
+ provider: 'azure' | 'openai';
4
+ voice?: string;
5
+ model?: string;
6
+ region?: string;
7
+ tenant?: string;
8
+ }
9
+ export interface UseTTSOptions {
10
+ apiUrl?: string;
11
+ continuousSpeech?: boolean;
12
+ onEndSpeakStartListen?: () => void;
13
+ preview?: boolean;
14
+ disableSpeaker?: boolean;
15
+ }
16
+ export declare function useTTS(config: TTSConfig, options?: UseTTSOptions, autoStart?: boolean, defaultEnableAudio?: boolean, defaultSpeakerActive?: boolean): {
17
+ speak: (text: string) => Promise<void>;
18
+ stop: () => void;
19
+ isPlaying: boolean;
20
+ speakerMuted: boolean;
21
+ toggleMute: (mute?: boolean) => void;
22
+ hasUserActivatedSpeak: boolean;
23
+ setHasUserActivatedSpeak: import("react").Dispatch<import("react").SetStateAction<boolean>>;
24
+ error: Error | null;
25
+ setError: import("react").Dispatch<import("react").SetStateAction<Error | null>>;
26
+ };
@@ -0,0 +1,270 @@
1
+ import { useState, useCallback, useEffect, useRef } from 'react';
2
+ import { sanitizeText } from '../sanitizer';
3
+ import { getLocalConfig } from '../configuration';
4
+ import { useViseme } from '../../context/visemeContext';
5
+ export function useTTS(config, options = {}, autoStart = false, defaultEnableAudio = true, defaultSpeakerActive = true) {
6
+ const [isPlaying, setIsPlaying] = useState(false);
7
+ const [speakerMuted, setSpeakerMuted] = useState(getLocalConfig('muteSpeaker', !defaultEnableAudio || !defaultSpeakerActive || autoStart));
8
+ const { addViseme, resetVisemeQueue, startProcessing, stopProcessing, } = useViseme();
9
+ const [hasUserActivatedSpeak, setHasUserActivatedSpeak] = useState(false);
10
+ const [error, setError] = useState(null);
11
+ const audioRef = useRef(null);
12
+ const audioWrapperRef = useRef(null);
13
+ const globalSpeakRef = useRef(null);
14
+ const visemeLoadedRef = useRef(false);
15
+ const isSpeakingRef = useRef(false);
16
+ const apiUrl = options.apiUrl || '/api/tts';
17
+ const loadVisemeData = useCallback((visemeData) => {
18
+ resetVisemeQueue();
19
+ visemeLoadedRef.current = false;
20
+ if (visemeData && visemeData.length > 0) {
21
+ console.log(`[useTTS] Loading ${visemeData.length} viseme events`);
22
+ visemeData.forEach(viseme => {
23
+ addViseme(viseme.visemeId, viseme.audioOffset);
24
+ });
25
+ visemeLoadedRef.current = true;
26
+ return true;
27
+ }
28
+ else {
29
+ console.warn('[useTTS] No viseme data available');
30
+ return false;
31
+ }
32
+ }, [addViseme, resetVisemeQueue]);
33
+ const createAudioWrapper = useCallback(() => {
34
+ if (!audioRef.current) {
35
+ console.warn('[useTTS] Cannot create audio wrapper: audio element is null');
36
+ return null;
37
+ }
38
+ const wrapper = {
39
+ state: 'running',
40
+ onstatechange: null,
41
+ get currentTime() {
42
+ return audioRef.current ? audioRef.current.currentTime : 0;
43
+ }
44
+ };
45
+ const handlePause = () => {
46
+ wrapper.state = 'suspended';
47
+ if (wrapper.onstatechange) {
48
+ wrapper.onstatechange.call(null, new Event('statechange'));
49
+ }
50
+ };
51
+ const handlePlay = () => {
52
+ wrapper.state = 'running';
53
+ if (wrapper.onstatechange) {
54
+ wrapper.onstatechange.call(null, new Event('statechange'));
55
+ }
56
+ };
57
+ const handleEnded = () => {
58
+ wrapper.state = 'closed';
59
+ if (wrapper.onstatechange) {
60
+ wrapper.onstatechange.call(null, new Event('statechange'));
61
+ }
62
+ };
63
+ audioRef.current.addEventListener('pause', handlePause);
64
+ audioRef.current.addEventListener('play', handlePlay);
65
+ audioRef.current.addEventListener('ended', handleEnded);
66
+ const cleanupEventListeners = () => {
67
+ if (audioRef.current) {
68
+ audioRef.current.removeEventListener('pause', handlePause);
69
+ audioRef.current.removeEventListener('play', handlePlay);
70
+ audioRef.current.removeEventListener('ended', handleEnded);
71
+ }
72
+ };
73
+ wrapper.cleanup = cleanupEventListeners;
74
+ console.log('[useTTS] Created audio wrapper for viseme processing');
75
+ return wrapper;
76
+ }, []);
77
+ const cleanup = useCallback(() => {
78
+ var _a;
79
+ console.log('[useTTS] Cleaning up audio and viseme resources');
80
+ if (audioWrapperRef.current && audioWrapperRef.current.cleanup) {
81
+ audioWrapperRef.current.cleanup();
82
+ console.log('[useTTS] Cleaned up audio wrapper event listeners');
83
+ }
84
+ audioWrapperRef.current = null;
85
+ stopProcessing();
86
+ console.log('[useTTS] Stopped viseme processing');
87
+ if ((_a = audioRef.current) === null || _a === void 0 ? void 0 : _a.src) {
88
+ URL.revokeObjectURL(audioRef.current.src);
89
+ console.log('[useTTS] Revoked audio object URL');
90
+ audioRef.current = null;
91
+ }
92
+ visemeLoadedRef.current = false;
93
+ isSpeakingRef.current = false;
94
+ }, [stopProcessing]);
95
+ const stop = useCallback(() => {
96
+ console.log('[useTTS] Stopping audio playback');
97
+ if (audioRef.current) {
98
+ audioRef.current.pause();
99
+ audioRef.current.currentTime = 0;
100
+ }
101
+ setIsPlaying(false);
102
+ cleanup();
103
+ }, [cleanup]);
104
+ const emitEndSpeakEvent = useCallback(() => {
105
+ console.log('[useTTS] Emitting end speak event');
106
+ const e = new CustomEvent('MemoriEndSpeak');
107
+ document.dispatchEvent(e);
108
+ if (options.continuousSpeech && options.onEndSpeakStartListen) {
109
+ console.log('[useTTS] Starting continuous speech listening');
110
+ options.onEndSpeakStartListen();
111
+ }
112
+ }, [options.continuousSpeech, options.onEndSpeakStartListen]);
113
+ const speak = useCallback(async (text) => {
114
+ if (isSpeakingRef.current) {
115
+ return;
116
+ }
117
+ if (!text || options.preview || speakerMuted) {
118
+ emitEndSpeakEvent();
119
+ return;
120
+ }
121
+ isSpeakingRef.current = true;
122
+ if (!hasUserActivatedSpeak) {
123
+ setHasUserActivatedSpeak(true);
124
+ }
125
+ try {
126
+ stop();
127
+ setIsPlaying(true);
128
+ setError(null);
129
+ const processedText = sanitizeText(text);
130
+ const response = await fetch('http://localhost:3000/api/tts', {
131
+ method: 'POST',
132
+ headers: {
133
+ 'Content-Type': 'application/json',
134
+ },
135
+ body: JSON.stringify({
136
+ text: processedText,
137
+ tenant: config.tenant || 'www.aisuru.com',
138
+ voice: config.voice,
139
+ model: config.model || 'tts-1',
140
+ region: config.region,
141
+ provider: config.provider,
142
+ includeVisemes: true,
143
+ }),
144
+ });
145
+ if (!response.ok) {
146
+ const errorData = await response.json().catch(() => ({}));
147
+ throw new Error(errorData.error || `API error: ${response.status}`);
148
+ }
149
+ const visemeDataHeader = response.headers.get('X-Viseme-Data');
150
+ let hasVisemeData = false;
151
+ if (visemeDataHeader) {
152
+ try {
153
+ const visemeData = JSON.parse(visemeDataHeader);
154
+ hasVisemeData = loadVisemeData(visemeData);
155
+ }
156
+ catch (err) {
157
+ console.error('[useTTS] Error parsing viseme data:', err);
158
+ }
159
+ }
160
+ const audioBlob = await response.blob();
161
+ const audioUrl = URL.createObjectURL(audioBlob);
162
+ audioRef.current = new Audio(audioUrl);
163
+ if (hasVisemeData) {
164
+ audioWrapperRef.current = createAudioWrapper();
165
+ }
166
+ audioRef.current.oncanplaythrough = async () => {
167
+ var _a;
168
+ try {
169
+ if (hasVisemeData && audioWrapperRef.current) {
170
+ startProcessing(audioWrapperRef.current);
171
+ }
172
+ await ((_a = audioRef.current) === null || _a === void 0 ? void 0 : _a.play());
173
+ if (audioRef.current) {
174
+ audioRef.current.oncanplaythrough = null;
175
+ }
176
+ }
177
+ catch (e) {
178
+ cleanup();
179
+ emitEndSpeakEvent();
180
+ }
181
+ };
182
+ audioRef.current.onended = () => {
183
+ setIsPlaying(false);
184
+ isSpeakingRef.current = false;
185
+ cleanup();
186
+ emitEndSpeakEvent();
187
+ };
188
+ audioRef.current.onerror = () => {
189
+ setIsPlaying(false);
190
+ isSpeakingRef.current = false;
191
+ cleanup();
192
+ const errorMsg = new Error(`Audio playback failed. This may be due to a network issue or audio format problem.`);
193
+ setError(errorMsg);
194
+ emitEndSpeakEvent();
195
+ };
196
+ audioRef.current.load();
197
+ }
198
+ catch (err) {
199
+ setIsPlaying(false);
200
+ isSpeakingRef.current = false;
201
+ cleanup();
202
+ const errorMsg = err instanceof Error ? err : new Error(String(err));
203
+ setError(errorMsg);
204
+ try {
205
+ if ('speechSynthesis' in window) {
206
+ const utterance = new SpeechSynthesisUtterance(sanitizeText(text));
207
+ window.speechSynthesis.speak(utterance);
208
+ }
209
+ }
210
+ catch (fallbackErr) {
211
+ console.error('[useTTS] Browser fallback synthesis error:', fallbackErr);
212
+ }
213
+ emitEndSpeakEvent();
214
+ }
215
+ }, [
216
+ config,
217
+ speakerMuted,
218
+ options.preview,
219
+ hasUserActivatedSpeak,
220
+ stop,
221
+ cleanup,
222
+ loadVisemeData,
223
+ createAudioWrapper,
224
+ startProcessing,
225
+ emitEndSpeakEvent,
226
+ ]);
227
+ const toggleMute = useCallback((mute) => {
228
+ const newMuteState = mute !== undefined ? mute : !speakerMuted;
229
+ console.log('[useTTS] Toggling mute state to:', newMuteState);
230
+ setSpeakerMuted(newMuteState);
231
+ if (newMuteState && isPlaying) {
232
+ stop();
233
+ }
234
+ }, [speakerMuted, isPlaying, stop]);
235
+ useEffect(() => {
236
+ console.log('[useTTS] Updating global memoriSpeaking state:', isPlaying);
237
+ if (typeof window !== 'undefined') {
238
+ window.memoriSpeaking = isPlaying;
239
+ }
240
+ }, [isPlaying]);
241
+ useEffect(() => {
242
+ if (typeof window !== 'undefined') {
243
+ console.log('[useTTS] Setting up global speak function');
244
+ globalSpeakRef.current = window.speak;
245
+ window.speak = speak;
246
+ return () => {
247
+ console.log('[useTTS] Cleaning up global speak function');
248
+ window.speak = globalSpeakRef.current;
249
+ };
250
+ }
251
+ }, [speak]);
252
+ useEffect(() => {
253
+ return () => {
254
+ console.log('[useTTS] Component unmounting, cleaning up');
255
+ stop();
256
+ };
257
+ }, [stop]);
258
+ return {
259
+ speak,
260
+ stop,
261
+ isPlaying,
262
+ speakerMuted,
263
+ toggleMute,
264
+ hasUserActivatedSpeak,
265
+ setHasUserActivatedSpeak,
266
+ error,
267
+ setError,
268
+ };
269
+ }
270
+ //# sourceMappingURL=useTTS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTTS.js","sourceRoot":"","sources":["../../../src/helpers/tts/useTTS.ts"],"names":[],"mappings":"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"}