ug-js-sdk 3.0.51 → 3.0.57
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/dist/ug-core/__tests__/__mocks__/ErrorRetryHandler.d.ts +7 -0
- package/dist/ug-core/__tests__/__mocks__/ErrorRetryHandler.js +16 -0
- package/dist/ug-core/__tests__/__mocks__/ErrorRetryHandler.js.map +1 -0
- package/dist/ug-core/__tests__/__mocks__/mpg123-decoder.d.ts +10 -0
- package/dist/ug-core/__tests__/__mocks__/mpg123-decoder.js +16 -0
- package/dist/ug-core/__tests__/__mocks__/mpg123-decoder.js.map +1 -0
- package/dist/ug-core/__tests__/__mocks__/uuid.d.ts +2 -0
- package/dist/ug-core/__tests__/__mocks__/uuid.js +11 -0
- package/dist/ug-core/__tests__/__mocks__/uuid.js.map +1 -0
- package/dist/ug-core/__tests__/__mocks__/vad-web.d.ts +11 -0
- package/dist/ug-core/__tests__/__mocks__/vad-web.js +19 -0
- package/dist/ug-core/__tests__/__mocks__/vad-web.js.map +1 -0
- package/dist/ug-core/__tests__/conversation-manager/ConversationCommands.test.d.ts +1 -0
- package/dist/ug-core/__tests__/conversation-manager/ConversationCommands.test.js +67 -0
- package/dist/ug-core/__tests__/conversation-manager/ConversationCommands.test.js.map +1 -0
- package/dist/ug-core/__tests__/conversation-manager/ConversationManager.test.d.ts +1 -0
- package/dist/ug-core/__tests__/conversation-manager/ConversationManager.test.js +185 -0
- package/dist/ug-core/__tests__/conversation-manager/ConversationManager.test.js.map +1 -0
- package/dist/ug-core/__tests__/conversation-manager/ErrorRetryHandler.test.d.ts +1 -0
- package/dist/ug-core/__tests__/conversation-manager/ErrorRetryHandler.test.js +168 -0
- package/dist/ug-core/__tests__/conversation-manager/ErrorRetryHandler.test.js.map +1 -0
- package/dist/ug-core/__tests__/core/EventEmitter.test.d.ts +1 -0
- package/dist/ug-core/__tests__/core/EventEmitter.test.js +211 -0
- package/dist/ug-core/__tests__/core/EventEmitter.test.js.map +1 -0
- package/dist/ug-core/__tests__/core/Logger.test.d.ts +1 -0
- package/dist/ug-core/__tests__/core/Logger.test.js +162 -0
- package/dist/ug-core/__tests__/core/Logger.test.js.map +1 -0
- package/dist/ug-core/__tests__/core/localStorage.test.d.ts +1 -0
- package/dist/ug-core/__tests__/core/localStorage.test.js +172 -0
- package/dist/ug-core/__tests__/core/localStorage.test.js.map +1 -0
- package/dist/ug-core/__tests__/e2e/replicate-test.e2e.d.ts +15 -0
- package/dist/ug-core/__tests__/e2e/replicate-test.e2e.js +224 -0
- package/dist/ug-core/__tests__/e2e/replicate-test.e2e.js.map +1 -0
- package/dist/ug-core/__tests__/network/WebSocketConnection.test.d.ts +1 -0
- package/dist/ug-core/__tests__/network/WebSocketConnection.test.js +193 -0
- package/dist/ug-core/__tests__/network/WebSocketConnection.test.js.map +1 -0
- package/dist/ug-core/__tests__/playback-manager/SubtitleManager.test.d.ts +1 -0
- package/dist/ug-core/__tests__/playback-manager/SubtitleManager.test.js +228 -0
- package/dist/ug-core/__tests__/playback-manager/SubtitleManager.test.js.map +1 -0
- package/dist/ug-core/__tests__/setup.d.ts +4 -0
- package/dist/ug-core/__tests__/setup.js +8 -0
- package/dist/ug-core/__tests__/setup.js.map +1 -0
- package/dist/ug-core/conversation-manager/ConversationManager.js +18 -0
- package/dist/ug-core/conversation-manager/ConversationManager.js.map +1 -1
- package/dist/ug-core/conversation-manager/ErrorRetryHandler.d.ts +1 -0
- package/dist/ug-core/conversation-manager/ErrorRetryHandler.js +3 -0
- package/dist/ug-core/conversation-manager/ErrorRetryHandler.js.map +1 -1
- package/dist/ug-core/conversation-manager/types.d.ts +51 -6
- package/dist/ug-core/network/ConversationNetwork.js +12 -6
- package/dist/ug-core/network/ConversationNetwork.js.map +1 -1
- package/dist/ug-core/playback-manager/PlaybackManager.d.ts +104 -0
- package/dist/ug-core/playback-manager/PlaybackManager.js +121 -4
- package/dist/ug-core/playback-manager/PlaybackManager.js.map +1 -1
- package/dist/ug-core/playback-manager/audio-player/AudioPlayer.d.ts +156 -0
- package/dist/ug-core/playback-manager/audio-player/AudioPlayer.js +156 -0
- package/dist/ug-core/playback-manager/audio-player/AudioPlayer.js.map +1 -1
- package/dist/ug-core/playback-manager/subtitle-manager/SubtitleManager.js +3 -1
- package/dist/ug-core/playback-manager/subtitle-manager/SubtitleManager.js.map +1 -1
- package/dist/ug-core/types/index.d.ts +34 -3
- package/dist/ug-core/user-input-manager/AudioRecorder.d.ts +49 -0
- package/dist/ug-core/user-input-manager/AudioRecorder.js +39 -1
- package/dist/ug-core/user-input-manager/AudioRecorder.js.map +1 -1
- package/dist/ug-core/user-input-manager/UserInputManager.d.ts +82 -6
- package/dist/ug-core/user-input-manager/UserInputManager.js +82 -6
- package/dist/ug-core/user-input-manager/UserInputManager.js.map +1 -1
- package/dist/ug-core/user-input-manager/VADManager.d.ts +62 -0
- package/dist/ug-core/user-input-manager/VADManager.js +99 -8
- package/dist/ug-core/user-input-manager/VADManager.js.map +1 -1
- package/dist/ug-js-sdk.mjs +1 -1
- package/package.json +1 -1
|
@@ -1,17 +1,71 @@
|
|
|
1
1
|
import { EventEmitter } from '../core/EventEmitter';
|
|
2
2
|
import { InteractResponse, PlaybackCapabilities } from '../types';
|
|
3
3
|
import { IConversationManager } from '../conversation-manager/types';
|
|
4
|
+
/**
|
|
5
|
+
* Events emitted by the PlaybackManager.
|
|
6
|
+
*/
|
|
4
7
|
export declare const PlaybackManagerEvents: {
|
|
8
|
+
/** Emitted when audio playback starts */
|
|
5
9
|
readonly Playing: "playing";
|
|
10
|
+
/** Emitted when audio playback is paused */
|
|
6
11
|
readonly Paused: "paused";
|
|
12
|
+
/** Emitted when a playback error occurs */
|
|
7
13
|
readonly PlaybackError: "playbackError";
|
|
14
|
+
/** Emitted when subtitle word highlighting changes (karaoke-style) */
|
|
8
15
|
readonly SubtitleWordChange: "subtitleWordChange";
|
|
16
|
+
/** Emitted when subtitle text changes (new sentence/phrase) */
|
|
9
17
|
readonly SubtitleChange: "subtitleChange";
|
|
18
|
+
/** Emitted when the displayed image changes */
|
|
10
19
|
readonly ImageChange: "imageChange";
|
|
20
|
+
/** Emitted ~500ms before playback completes (for pre-loading next content) */
|
|
11
21
|
readonly AboutToComplete: "aboutToComplete";
|
|
22
|
+
/** Emitted when all audio playback has finished */
|
|
12
23
|
readonly Finished: "finished";
|
|
24
|
+
/** Emitted when avatar animation state changes */
|
|
13
25
|
readonly AvatarAnimationChanged: "avatarAnimationChanged";
|
|
14
26
|
};
|
|
27
|
+
/**
|
|
28
|
+
* Manages playback of assistant responses including audio, subtitles, and avatar animations.
|
|
29
|
+
*
|
|
30
|
+
* The PlaybackManager coordinates multiple sub-components:
|
|
31
|
+
* - **AudioPlayer**: Gap-free MP3 audio playback using Web Audio API
|
|
32
|
+
* - **SubtitleManager**: Real-time captions with word-level highlighting
|
|
33
|
+
* - **VisemeScheduler**: Lip-sync data scheduling (for 3D avatars)
|
|
34
|
+
* - **AvatarManager**: Animation state management (idle, talking, thinking, listening)
|
|
35
|
+
*
|
|
36
|
+
* The manager receives messages from the WebSocket connection and routes them to
|
|
37
|
+
* the appropriate sub-component for synchronized playback.
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* ```typescript
|
|
41
|
+
* const playback = new PlaybackManager({
|
|
42
|
+
* audio: true,
|
|
43
|
+
* subtitles: true,
|
|
44
|
+
* avatar: true,
|
|
45
|
+
* })
|
|
46
|
+
*
|
|
47
|
+
* playback.on(PlaybackManagerEvents.SubtitleChange, (event) => {
|
|
48
|
+
* displaySubtitle(event.subtitle)
|
|
49
|
+
* })
|
|
50
|
+
*
|
|
51
|
+
* playback.on(PlaybackManagerEvents.Finished, () => {
|
|
52
|
+
* console.log('Playback complete')
|
|
53
|
+
* })
|
|
54
|
+
*
|
|
55
|
+
* await playback.initialize()
|
|
56
|
+
*
|
|
57
|
+
* // Messages from server are passed to handleMessage()
|
|
58
|
+
* playback.handleMessage(audioMessage)
|
|
59
|
+
* playback.handleMessage(subtitleMessage)
|
|
60
|
+
* ```
|
|
61
|
+
*
|
|
62
|
+
* @fires PlaybackManagerEvents.Playing - When playback starts
|
|
63
|
+
* @fires PlaybackManagerEvents.Paused - When playback is paused
|
|
64
|
+
* @fires PlaybackManagerEvents.Finished - When all playback completes
|
|
65
|
+
* @fires PlaybackManagerEvents.SubtitleChange - When subtitle text updates
|
|
66
|
+
* @fires PlaybackManagerEvents.SubtitleWordChange - For word-by-word highlighting
|
|
67
|
+
* @fires PlaybackManagerEvents.AvatarAnimationChanged - When avatar state changes
|
|
68
|
+
*/
|
|
15
69
|
export declare class PlaybackManager extends EventEmitter {
|
|
16
70
|
private capabilities;
|
|
17
71
|
private audioPlayer;
|
|
@@ -20,15 +74,65 @@ export declare class PlaybackManager extends EventEmitter {
|
|
|
20
74
|
private isPaused;
|
|
21
75
|
private hasStarted;
|
|
22
76
|
private avatarManager;
|
|
77
|
+
/**
|
|
78
|
+
* Creates a new PlaybackManager instance.
|
|
79
|
+
*
|
|
80
|
+
* @param capabilities - Configuration for which playback features are enabled
|
|
81
|
+
* @param capabilities.audio - Enable audio playback (default: true)
|
|
82
|
+
* @param capabilities.subtitles - Enable real-time captions (default: true)
|
|
83
|
+
* @param capabilities.viseme - Enable lip-sync data (default: false)
|
|
84
|
+
* @param capabilities.avatar - Enable avatar animations (default: true)
|
|
85
|
+
*/
|
|
23
86
|
constructor(capabilities: PlaybackCapabilities);
|
|
24
87
|
private setupChildListeners;
|
|
25
88
|
resetState(): void;
|
|
89
|
+
/**
|
|
90
|
+
* Initializes the playback manager and its sub-components.
|
|
91
|
+
*
|
|
92
|
+
* Must be called before handling any messages. Initializes the
|
|
93
|
+
* AudioPlayer and prepares the AudioContext.
|
|
94
|
+
*/
|
|
26
95
|
initialize(): Promise<void>;
|
|
96
|
+
/**
|
|
97
|
+
* Handles incoming messages from the server and routes them to appropriate handlers.
|
|
98
|
+
*
|
|
99
|
+
* @param message - The interaction response message from the WebSocket
|
|
100
|
+
*
|
|
101
|
+
* Message types handled:
|
|
102
|
+
* - `audio`: Base64 audio chunk → AudioPlayer
|
|
103
|
+
* - `subtitles`: Caption data → SubtitleManager
|
|
104
|
+
* - `viseme`: Lip-sync data → VisemeScheduler
|
|
105
|
+
* - `audio_complete`: Signals all audio has been sent
|
|
106
|
+
* - `image`: Generated image data
|
|
107
|
+
*/
|
|
27
108
|
handleMessage(message: InteractResponse): void;
|
|
28
109
|
enqueue(message: InteractResponse): void;
|
|
110
|
+
/**
|
|
111
|
+
* Convert PUG SubtitleUnit[] format to SDK SubtitleMessage format.
|
|
112
|
+
* PUG sends per-character timing as objects; SDK expects parallel arrays.
|
|
113
|
+
*/
|
|
114
|
+
private convertSubtitleUnitsToMessage;
|
|
29
115
|
markAudioComplete(): void;
|
|
116
|
+
/**
|
|
117
|
+
* Starts playback of queued audio, subtitles, and animations.
|
|
118
|
+
*
|
|
119
|
+
* Typically called automatically when enough audio is buffered.
|
|
120
|
+
* Sets avatar to "talking" animation state.
|
|
121
|
+
*/
|
|
30
122
|
play(): Promise<void>;
|
|
123
|
+
/**
|
|
124
|
+
* Pauses all playback.
|
|
125
|
+
*
|
|
126
|
+
* Pauses audio, subtitles, and visemes. Sets avatar to "idle" state.
|
|
127
|
+
* Can be resumed with `resume()`.
|
|
128
|
+
*/
|
|
31
129
|
pause(): Promise<void>;
|
|
130
|
+
/**
|
|
131
|
+
* Resumes paused playback.
|
|
132
|
+
*
|
|
133
|
+
* Continues audio, subtitles, and visemes from where they were paused.
|
|
134
|
+
* Sets avatar back to "talking" state.
|
|
135
|
+
*/
|
|
32
136
|
resume(): Promise<void>;
|
|
33
137
|
resumeAudioContext(): Promise<void>;
|
|
34
138
|
/**
|
|
@@ -6,17 +6,71 @@ import { SubtitleManager, SubtitleManagerEvents } from './subtitle-manager/Subti
|
|
|
6
6
|
import { AudioPlayerEvents } from './types';
|
|
7
7
|
import { VisemeScheduler } from './viseme-scheduler/VisemeScheduler';
|
|
8
8
|
import { AvatarManager } from './avatar-manager/AvatarManager';
|
|
9
|
+
/**
|
|
10
|
+
* Events emitted by the PlaybackManager.
|
|
11
|
+
*/
|
|
9
12
|
export const PlaybackManagerEvents = {
|
|
13
|
+
/** Emitted when audio playback starts */
|
|
10
14
|
Playing: 'playing',
|
|
15
|
+
/** Emitted when audio playback is paused */
|
|
11
16
|
Paused: 'paused',
|
|
17
|
+
/** Emitted when a playback error occurs */
|
|
12
18
|
PlaybackError: 'playbackError',
|
|
19
|
+
/** Emitted when subtitle word highlighting changes (karaoke-style) */
|
|
13
20
|
SubtitleWordChange: 'subtitleWordChange',
|
|
21
|
+
/** Emitted when subtitle text changes (new sentence/phrase) */
|
|
14
22
|
SubtitleChange: 'subtitleChange',
|
|
23
|
+
/** Emitted when the displayed image changes */
|
|
15
24
|
ImageChange: 'imageChange',
|
|
25
|
+
/** Emitted ~500ms before playback completes (for pre-loading next content) */
|
|
16
26
|
AboutToComplete: 'aboutToComplete',
|
|
27
|
+
/** Emitted when all audio playback has finished */
|
|
17
28
|
Finished: 'finished',
|
|
29
|
+
/** Emitted when avatar animation state changes */
|
|
18
30
|
AvatarAnimationChanged: 'avatarAnimationChanged',
|
|
19
31
|
};
|
|
32
|
+
/**
|
|
33
|
+
* Manages playback of assistant responses including audio, subtitles, and avatar animations.
|
|
34
|
+
*
|
|
35
|
+
* The PlaybackManager coordinates multiple sub-components:
|
|
36
|
+
* - **AudioPlayer**: Gap-free MP3 audio playback using Web Audio API
|
|
37
|
+
* - **SubtitleManager**: Real-time captions with word-level highlighting
|
|
38
|
+
* - **VisemeScheduler**: Lip-sync data scheduling (for 3D avatars)
|
|
39
|
+
* - **AvatarManager**: Animation state management (idle, talking, thinking, listening)
|
|
40
|
+
*
|
|
41
|
+
* The manager receives messages from the WebSocket connection and routes them to
|
|
42
|
+
* the appropriate sub-component for synchronized playback.
|
|
43
|
+
*
|
|
44
|
+
* @example
|
|
45
|
+
* ```typescript
|
|
46
|
+
* const playback = new PlaybackManager({
|
|
47
|
+
* audio: true,
|
|
48
|
+
* subtitles: true,
|
|
49
|
+
* avatar: true,
|
|
50
|
+
* })
|
|
51
|
+
*
|
|
52
|
+
* playback.on(PlaybackManagerEvents.SubtitleChange, (event) => {
|
|
53
|
+
* displaySubtitle(event.subtitle)
|
|
54
|
+
* })
|
|
55
|
+
*
|
|
56
|
+
* playback.on(PlaybackManagerEvents.Finished, () => {
|
|
57
|
+
* console.log('Playback complete')
|
|
58
|
+
* })
|
|
59
|
+
*
|
|
60
|
+
* await playback.initialize()
|
|
61
|
+
*
|
|
62
|
+
* // Messages from server are passed to handleMessage()
|
|
63
|
+
* playback.handleMessage(audioMessage)
|
|
64
|
+
* playback.handleMessage(subtitleMessage)
|
|
65
|
+
* ```
|
|
66
|
+
*
|
|
67
|
+
* @fires PlaybackManagerEvents.Playing - When playback starts
|
|
68
|
+
* @fires PlaybackManagerEvents.Paused - When playback is paused
|
|
69
|
+
* @fires PlaybackManagerEvents.Finished - When all playback completes
|
|
70
|
+
* @fires PlaybackManagerEvents.SubtitleChange - When subtitle text updates
|
|
71
|
+
* @fires PlaybackManagerEvents.SubtitleWordChange - For word-by-word highlighting
|
|
72
|
+
* @fires PlaybackManagerEvents.AvatarAnimationChanged - When avatar state changes
|
|
73
|
+
*/
|
|
20
74
|
export class PlaybackManager extends EventEmitter {
|
|
21
75
|
capabilities;
|
|
22
76
|
audioPlayer;
|
|
@@ -25,6 +79,15 @@ export class PlaybackManager extends EventEmitter {
|
|
|
25
79
|
isPaused = true;
|
|
26
80
|
hasStarted = false;
|
|
27
81
|
avatarManager;
|
|
82
|
+
/**
|
|
83
|
+
* Creates a new PlaybackManager instance.
|
|
84
|
+
*
|
|
85
|
+
* @param capabilities - Configuration for which playback features are enabled
|
|
86
|
+
* @param capabilities.audio - Enable audio playback (default: true)
|
|
87
|
+
* @param capabilities.subtitles - Enable real-time captions (default: true)
|
|
88
|
+
* @param capabilities.viseme - Enable lip-sync data (default: false)
|
|
89
|
+
* @param capabilities.avatar - Enable avatar animations (default: true)
|
|
90
|
+
*/
|
|
28
91
|
constructor(capabilities) {
|
|
29
92
|
const logger = new DefaultLogger({ category: '🎪 PlaybackManager', style: StyleOrange });
|
|
30
93
|
super(logger);
|
|
@@ -72,12 +135,30 @@ export class PlaybackManager extends EventEmitter {
|
|
|
72
135
|
this.isPaused = true;
|
|
73
136
|
this.hasStarted = false;
|
|
74
137
|
}
|
|
138
|
+
/**
|
|
139
|
+
* Initializes the playback manager and its sub-components.
|
|
140
|
+
*
|
|
141
|
+
* Must be called before handling any messages. Initializes the
|
|
142
|
+
* AudioPlayer and prepares the AudioContext.
|
|
143
|
+
*/
|
|
75
144
|
async initialize() {
|
|
76
145
|
this.logger.debug('Initialized', this.capabilities);
|
|
77
146
|
this.isPaused = true;
|
|
78
147
|
this.hasStarted = false;
|
|
79
148
|
await this.audioPlayer.initialize();
|
|
80
149
|
}
|
|
150
|
+
/**
|
|
151
|
+
* Handles incoming messages from the server and routes them to appropriate handlers.
|
|
152
|
+
*
|
|
153
|
+
* @param message - The interaction response message from the WebSocket
|
|
154
|
+
*
|
|
155
|
+
* Message types handled:
|
|
156
|
+
* - `audio`: Base64 audio chunk → AudioPlayer
|
|
157
|
+
* - `subtitles`: Caption data → SubtitleManager
|
|
158
|
+
* - `viseme`: Lip-sync data → VisemeScheduler
|
|
159
|
+
* - `audio_complete`: Signals all audio has been sent
|
|
160
|
+
* - `image`: Generated image data
|
|
161
|
+
*/
|
|
81
162
|
handleMessage(message) {
|
|
82
163
|
if (message.event === 'audio' || message.event === 'subtitles' || message.event === 'viseme') {
|
|
83
164
|
this.enqueue(message);
|
|
@@ -93,11 +174,29 @@ export class PlaybackManager extends EventEmitter {
|
|
|
93
174
|
if (this.capabilities.audio && message.event === 'audio') {
|
|
94
175
|
const audioMessage = message;
|
|
95
176
|
this.audioPlayer.enqueue(audioMessage.audio);
|
|
177
|
+
// Handle embedded subtitles from PUG backend (character-level timing)
|
|
178
|
+
if (this.capabilities.subtitles && audioMessage.subtitles?.length) {
|
|
179
|
+
const subtitleMessage = this.convertSubtitleUnitsToMessage(audioMessage.subtitles);
|
|
180
|
+
this.subtitleManager.enqueue(subtitleMessage);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
// Legacy: handle separate subtitle events (kept for backwards compatibility)
|
|
184
|
+
if (this.capabilities.subtitles && message.event === 'subtitles') {
|
|
185
|
+
const subtitleMessage = message;
|
|
186
|
+
this.subtitleManager.enqueue(subtitleMessage);
|
|
96
187
|
}
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Convert PUG SubtitleUnit[] format to SDK SubtitleMessage format.
|
|
191
|
+
* PUG sends per-character timing as objects; SDK expects parallel arrays.
|
|
192
|
+
*/
|
|
193
|
+
convertSubtitleUnitsToMessage(units) {
|
|
194
|
+
return {
|
|
195
|
+
type: 'subtitles',
|
|
196
|
+
characters: units.map((u) => u.text),
|
|
197
|
+
start_times_ms: units.map((u) => Math.round(u.start_time_sec * 1000)),
|
|
198
|
+
durations_ms: units.map((u) => Math.round(u.duration_sec * 1000)),
|
|
199
|
+
};
|
|
101
200
|
}
|
|
102
201
|
markAudioComplete() {
|
|
103
202
|
this.logger.debug('Marking audio as complete');
|
|
@@ -105,6 +204,12 @@ export class PlaybackManager extends EventEmitter {
|
|
|
105
204
|
this.audioPlayer.markComplete();
|
|
106
205
|
}
|
|
107
206
|
}
|
|
207
|
+
/**
|
|
208
|
+
* Starts playback of queued audio, subtitles, and animations.
|
|
209
|
+
*
|
|
210
|
+
* Typically called automatically when enough audio is buffered.
|
|
211
|
+
* Sets avatar to "talking" animation state.
|
|
212
|
+
*/
|
|
108
213
|
async play() {
|
|
109
214
|
this.isPaused = false;
|
|
110
215
|
this.hasStarted = true;
|
|
@@ -116,6 +221,12 @@ export class PlaybackManager extends EventEmitter {
|
|
|
116
221
|
]);
|
|
117
222
|
await this.emit(PlaybackManagerEvents.Playing);
|
|
118
223
|
}
|
|
224
|
+
/**
|
|
225
|
+
* Pauses all playback.
|
|
226
|
+
*
|
|
227
|
+
* Pauses audio, subtitles, and visemes. Sets avatar to "idle" state.
|
|
228
|
+
* Can be resumed with `resume()`.
|
|
229
|
+
*/
|
|
119
230
|
async pause() {
|
|
120
231
|
this.isPaused = true;
|
|
121
232
|
this.audioPlayer.pause();
|
|
@@ -124,6 +235,12 @@ export class PlaybackManager extends EventEmitter {
|
|
|
124
235
|
this.avatarManager.playIdle();
|
|
125
236
|
await this.emit(PlaybackManagerEvents.Paused);
|
|
126
237
|
}
|
|
238
|
+
/**
|
|
239
|
+
* Resumes paused playback.
|
|
240
|
+
*
|
|
241
|
+
* Continues audio, subtitles, and visemes from where they were paused.
|
|
242
|
+
* Sets avatar back to "talking" state.
|
|
243
|
+
*/
|
|
127
244
|
async resume() {
|
|
128
245
|
if (!this.isPaused)
|
|
129
246
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlaybackManager.js","sourceRoot":"","sources":["../../../src/ug-core/playback-manager/PlaybackManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAEnD,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAC3D,OAAO,EAAE,yBAAyB,EAAE,MAAM,6CAA6C,CAAA;AAEvF,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAA;AACxD,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAA;AAC3F,OAAO,EAAE,iBAAiB,
|
|
1
|
+
{"version":3,"file":"PlaybackManager.js","sourceRoot":"","sources":["../../../src/ug-core/playback-manager/PlaybackManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,59 @@
|
|
|
1
1
|
import { EventEmitter } from '../../core/EventEmitter';
|
|
2
2
|
import { IAudioPlayer } from '../types';
|
|
3
|
+
/**
|
|
4
|
+
* Audio player for streaming MP3 playback in the browser.
|
|
5
|
+
*
|
|
6
|
+
* Handles real-time audio streaming by decoding MP3 frames and scheduling
|
|
7
|
+
* playback through the Web Audio API. Used internally by the SDK for
|
|
8
|
+
* text-to-speech audio playback.
|
|
9
|
+
*
|
|
10
|
+
* **Main Methods for Users:**
|
|
11
|
+
* - {@link initialize} - Initialize the audio context (call first, requires user gesture)
|
|
12
|
+
* - {@link play} - Start audio playback
|
|
13
|
+
* - {@link pause} - Pause playback
|
|
14
|
+
* - {@link resume} - Resume paused playback
|
|
15
|
+
* - {@link stop} - Stop playback and clear queue
|
|
16
|
+
* - {@link dispose} - Clean up resources when done
|
|
17
|
+
*
|
|
18
|
+
* **Events emitted:**
|
|
19
|
+
* - `AudioPlayerEvents.Ready` - Audio is ready to play
|
|
20
|
+
* - `AudioPlayerEvents.Playing` - Playback started
|
|
21
|
+
* - `AudioPlayerEvents.Paused` - Playback paused
|
|
22
|
+
* - `AudioPlayerEvents.Stopped` - Playback stopped
|
|
23
|
+
* - `AudioPlayerEvents.Finished` - All audio finished playing
|
|
24
|
+
* - `AudioPlayerEvents.AboutToComplete` - Audio is about to finish (for pre-loading)
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```typescript
|
|
28
|
+
* const player = new AudioPlayer();
|
|
29
|
+
*
|
|
30
|
+
* // Initialize (requires user gesture like button click)
|
|
31
|
+
* await player.initialize();
|
|
32
|
+
*
|
|
33
|
+
* // Listen for events
|
|
34
|
+
* player.on(AudioPlayerEvents.Ready, () => player.play());
|
|
35
|
+
* player.on(AudioPlayerEvents.Finished, () => console.log('Done'));
|
|
36
|
+
*
|
|
37
|
+
* // Enqueue audio data (base64 MP3 chunks)
|
|
38
|
+
* player.enqueue(base64AudioChunk);
|
|
39
|
+
* player.markComplete(); // Signal no more audio coming
|
|
40
|
+
*
|
|
41
|
+
* // Control playback
|
|
42
|
+
* await player.pause();
|
|
43
|
+
* await player.resume();
|
|
44
|
+
* await player.stop();
|
|
45
|
+
*
|
|
46
|
+
* // Clean up when done
|
|
47
|
+
* player.dispose();
|
|
48
|
+
* ```
|
|
49
|
+
*
|
|
50
|
+
* @fires AudioPlayerEvents.Ready - When audio is queued and ready to play
|
|
51
|
+
* @fires AudioPlayerEvents.Playing - When playback starts or resumes
|
|
52
|
+
* @fires AudioPlayerEvents.Paused - When playback is paused
|
|
53
|
+
* @fires AudioPlayerEvents.Stopped - When playback is stopped
|
|
54
|
+
* @fires AudioPlayerEvents.Finished - When all audio has finished playing
|
|
55
|
+
* @fires AudioPlayerEvents.AboutToComplete - When audio is about to finish
|
|
56
|
+
*/
|
|
3
57
|
export declare class AudioPlayer extends EventEmitter implements IAudioPlayer {
|
|
4
58
|
private readonly MIN_CHUNKS_TO_PROCESS;
|
|
5
59
|
private readonly FLUSH_DELAY_MS;
|
|
@@ -27,10 +81,54 @@ export declare class AudioPlayer extends EventEmitter implements IAudioPlayer {
|
|
|
27
81
|
private allAudioPlayed;
|
|
28
82
|
constructor();
|
|
29
83
|
private setupTimingListeners;
|
|
84
|
+
/**
|
|
85
|
+
* Initialize the audio player and prepare for playback.
|
|
86
|
+
*
|
|
87
|
+
* **Must be called before any other methods.** Should be called in response
|
|
88
|
+
* to a user gesture (click, tap) to ensure the AudioContext can start.
|
|
89
|
+
*
|
|
90
|
+
* @example
|
|
91
|
+
* ```typescript
|
|
92
|
+
* // In a button click handler
|
|
93
|
+
* button.onclick = async () => {
|
|
94
|
+
* await player.initialize();
|
|
95
|
+
* // Now ready to receive and play audio
|
|
96
|
+
* };
|
|
97
|
+
* ```
|
|
98
|
+
*/
|
|
30
99
|
initialize(): Promise<void>;
|
|
31
100
|
private resetState;
|
|
32
101
|
reset(): void;
|
|
102
|
+
/**
|
|
103
|
+
* Enqueue audio data for playback.
|
|
104
|
+
*
|
|
105
|
+
* Add base64-encoded MP3 audio chunks to the playback queue.
|
|
106
|
+
* Call {@link markComplete} when all audio has been enqueued.
|
|
107
|
+
*
|
|
108
|
+
* @param audioData - Base64-encoded MP3 audio chunk
|
|
109
|
+
*
|
|
110
|
+
* @example
|
|
111
|
+
* ```typescript
|
|
112
|
+
* // Enqueue streaming audio chunks
|
|
113
|
+
* player.enqueue(chunk1);
|
|
114
|
+
* player.enqueue(chunk2);
|
|
115
|
+
* player.markComplete(); // Signal end of audio
|
|
116
|
+
* ```
|
|
117
|
+
*/
|
|
33
118
|
enqueue(audioData: string): void;
|
|
119
|
+
/**
|
|
120
|
+
* Signal that all audio has been enqueued.
|
|
121
|
+
*
|
|
122
|
+
* Call this after enqueuing all audio chunks to indicate that no more
|
|
123
|
+
* audio will be added. This triggers the `Finished` event when playback completes.
|
|
124
|
+
*
|
|
125
|
+
* @example
|
|
126
|
+
* ```typescript
|
|
127
|
+
* player.enqueue(chunk1);
|
|
128
|
+
* player.enqueue(chunk2);
|
|
129
|
+
* player.markComplete(); // No more audio coming
|
|
130
|
+
* ```
|
|
131
|
+
*/
|
|
34
132
|
markComplete(): void;
|
|
35
133
|
private processChunkQueue;
|
|
36
134
|
private decodeBase64ToUint8Array;
|
|
@@ -40,10 +138,68 @@ export declare class AudioPlayer extends EventEmitter implements IAudioPlayer {
|
|
|
40
138
|
* Decodes frames individually to catch failures
|
|
41
139
|
*/
|
|
42
140
|
private decodeAudioFrames;
|
|
141
|
+
/**
|
|
142
|
+
* Start audio playback.
|
|
143
|
+
*
|
|
144
|
+
* Begins playing audio from the queue. Emits `Playing` event on success.
|
|
145
|
+
* Does nothing if already playing or queue is empty.
|
|
146
|
+
*
|
|
147
|
+
* @fires AudioPlayerEvents.Playing - When playback starts
|
|
148
|
+
*
|
|
149
|
+
* @example
|
|
150
|
+
* ```typescript
|
|
151
|
+
* player.on(AudioPlayerEvents.Ready, async () => {
|
|
152
|
+
* await player.play();
|
|
153
|
+
* });
|
|
154
|
+
* ```
|
|
155
|
+
*/
|
|
43
156
|
play(): Promise<void>;
|
|
44
157
|
private schedulePlayback;
|
|
158
|
+
/**
|
|
159
|
+
* Pause audio playback.
|
|
160
|
+
*
|
|
161
|
+
* Suspends the audio context, pausing playback at the current position.
|
|
162
|
+
* Use {@link resume} to continue playback.
|
|
163
|
+
*
|
|
164
|
+
* @fires AudioPlayerEvents.Paused - When playback is paused
|
|
165
|
+
*
|
|
166
|
+
* @example
|
|
167
|
+
* ```typescript
|
|
168
|
+
* await player.pause();
|
|
169
|
+
* // Later...
|
|
170
|
+
* await player.resume();
|
|
171
|
+
* ```
|
|
172
|
+
*/
|
|
45
173
|
pause(): Promise<void>;
|
|
174
|
+
/**
|
|
175
|
+
* Resume paused audio playback.
|
|
176
|
+
*
|
|
177
|
+
* Continues playback from where it was paused.
|
|
178
|
+
*
|
|
179
|
+
* @fires AudioPlayerEvents.Playing - When playback resumes
|
|
180
|
+
*
|
|
181
|
+
* @example
|
|
182
|
+
* ```typescript
|
|
183
|
+
* await player.pause();
|
|
184
|
+
* // Later...
|
|
185
|
+
* await player.resume();
|
|
186
|
+
* ```
|
|
187
|
+
*/
|
|
46
188
|
resume(): Promise<void>;
|
|
189
|
+
/**
|
|
190
|
+
* Stop audio playback and clear the queue.
|
|
191
|
+
*
|
|
192
|
+
* Immediately stops all playback and clears any queued audio.
|
|
193
|
+
* To play again, you'll need to enqueue new audio.
|
|
194
|
+
*
|
|
195
|
+
* @fires AudioPlayerEvents.Stopped - When playback is stopped
|
|
196
|
+
*
|
|
197
|
+
* @example
|
|
198
|
+
* ```typescript
|
|
199
|
+
* // Stop playback immediately
|
|
200
|
+
* await player.stop();
|
|
201
|
+
* ```
|
|
202
|
+
*/
|
|
47
203
|
stop(): Promise<void>;
|
|
48
204
|
getCurrentTime(): number;
|
|
49
205
|
getQueueLength(): number;
|