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