@spatialwalk/avatarkit 1.0.0-beta.2 → 1.0.0-beta.3
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 +147 -146
- package/dist/{StreamingAudioPlayer-CMEiGwxE.js → StreamingAudioPlayer-BeLlDiwE.js} +2 -2
- package/dist/{StreamingAudioPlayer-CMEiGwxE.js.map → StreamingAudioPlayer-BeLlDiwE.js.map} +1 -1
- package/dist/{index-CNhquYUE.js → index-NmYXWJnL.js} +6 -6
- package/dist/{index-CNhquYUE.js.map → index-NmYXWJnL.js.map} +1 -1
- package/dist/index.js +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,25 +1,25 @@
|
|
|
1
1
|
# SPAvatarKit SDK
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Real-time virtual avatar rendering SDK based on 3D Gaussian Splatting, supporting audio-driven animation rendering and high-quality 3D rendering.
|
|
4
4
|
|
|
5
|
-
## 🚀
|
|
5
|
+
## 🚀 Features
|
|
6
6
|
|
|
7
|
-
- **3D Gaussian Splatting
|
|
8
|
-
-
|
|
9
|
-
- **WebGPU/WebGL
|
|
10
|
-
- **WASM
|
|
11
|
-
- **TypeScript
|
|
12
|
-
-
|
|
7
|
+
- **3D Gaussian Splatting Rendering** - Based on the latest point cloud rendering technology, providing high-quality 3D virtual avatars
|
|
8
|
+
- **Audio-Driven Real-Time Animation Rendering** - Users provide audio data, SDK handles receiving animation data and rendering
|
|
9
|
+
- **WebGPU/WebGL Dual Rendering Backend** - Automatically selects the best rendering backend for compatibility
|
|
10
|
+
- **WASM High-Performance Computing** - Uses C++ compiled WebAssembly modules for geometric calculations
|
|
11
|
+
- **TypeScript Support** - Complete type definitions and IntelliSense
|
|
12
|
+
- **Modular Architecture** - Clear component separation, easy to integrate and extend
|
|
13
13
|
|
|
14
|
-
## 📦
|
|
14
|
+
## 📦 Installation
|
|
15
15
|
|
|
16
16
|
```bash
|
|
17
17
|
npm install @spatialwalk/avatarkit
|
|
18
18
|
```
|
|
19
19
|
|
|
20
|
-
## 🎯
|
|
20
|
+
## 🎯 Quick Start
|
|
21
21
|
|
|
22
|
-
###
|
|
22
|
+
### Basic Usage
|
|
23
23
|
|
|
24
24
|
```typescript
|
|
25
25
|
import {
|
|
@@ -30,173 +30,173 @@ import {
|
|
|
30
30
|
Environment
|
|
31
31
|
} from '@spatialwalk/avatarkit'
|
|
32
32
|
|
|
33
|
-
// 1.
|
|
33
|
+
// 1. Initialize SDK
|
|
34
34
|
const configuration: Configuration = {
|
|
35
35
|
environment: Environment.test,
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
await AvatarKit.initialize('your-app-id', configuration)
|
|
39
39
|
|
|
40
|
-
//
|
|
40
|
+
// Set sessionToken (if needed, call separately)
|
|
41
41
|
// AvatarKit.setSessionToken('your-session-token')
|
|
42
42
|
|
|
43
|
-
// 2.
|
|
43
|
+
// 2. Load character
|
|
44
44
|
const avatarManager = new AvatarManager()
|
|
45
45
|
const avatar = await avatarManager.load('character-id', (progress) => {
|
|
46
46
|
console.log(`Loading progress: ${progress.progress}%`)
|
|
47
47
|
})
|
|
48
48
|
|
|
49
|
-
// 3.
|
|
49
|
+
// 3. Create view (automatically creates Canvas and AvatarController)
|
|
50
50
|
const container = document.getElementById('avatar-container')
|
|
51
51
|
const avatarView = new AvatarView(avatar, container)
|
|
52
52
|
|
|
53
|
-
// 4.
|
|
53
|
+
// 4. Start real-time communication
|
|
54
54
|
await avatarView.avatarController.start()
|
|
55
55
|
|
|
56
|
-
// 5.
|
|
57
|
-
//
|
|
58
|
-
const audioUint8 = new Uint8Array(1024) //
|
|
59
|
-
const audioData = audioUint8.slice().buffer //
|
|
60
|
-
avatarView.avatarController.send(audioData, false) //
|
|
61
|
-
avatarView.avatarController.send(audioData, true) // end=true
|
|
56
|
+
// 5. Send audio data
|
|
57
|
+
// If audio is Uint8Array, you can use slice().buffer to convert to ArrayBuffer
|
|
58
|
+
const audioUint8 = new Uint8Array(1024) // Example: audio data
|
|
59
|
+
const audioData = audioUint8.slice().buffer // Simplified conversion, works for ArrayBuffer and SharedArrayBuffer
|
|
60
|
+
avatarView.avatarController.send(audioData, false) // Send audio data, will automatically start playing after accumulating enough data
|
|
61
|
+
avatarView.avatarController.send(audioData, true) // end=true means immediately return animation data, no longer accumulating
|
|
62
62
|
```
|
|
63
63
|
|
|
64
|
-
###
|
|
64
|
+
### Complete Example
|
|
65
65
|
|
|
66
|
-
|
|
66
|
+
Check the example code in the GitHub repository for the complete usage flow.
|
|
67
67
|
|
|
68
|
-
|
|
68
|
+
**Example Project:** [Avatarkit-web-demo](https://github.com/spatialwalk/Avatarkit-web-demo)
|
|
69
69
|
|
|
70
|
-
|
|
70
|
+
This repository contains complete examples for Vanilla JS, Vue 3, and React, demonstrating how to integrate and use SPAvatarKit SDK in different frameworks.
|
|
71
71
|
|
|
72
|
-
## 🏗️
|
|
72
|
+
## 🏗️ Architecture Overview
|
|
73
73
|
|
|
74
|
-
###
|
|
74
|
+
### Core Components
|
|
75
75
|
|
|
76
|
-
- **AvatarKit** - SDK
|
|
77
|
-
- **AvatarManager** -
|
|
78
|
-
- **AvatarView** - 3D
|
|
79
|
-
- **AvatarController** -
|
|
80
|
-
- **AvatarCoreAdapter** - WASM
|
|
76
|
+
- **AvatarKit** - SDK initialization and management
|
|
77
|
+
- **AvatarManager** - Character resource loading and management
|
|
78
|
+
- **AvatarView** - 3D rendering view (internally contains AvatarController)
|
|
79
|
+
- **AvatarController** - Real-time communication and data processing
|
|
80
|
+
- **AvatarCoreAdapter** - WASM module adapter
|
|
81
81
|
|
|
82
|
-
###
|
|
82
|
+
### Data Flow
|
|
83
83
|
|
|
84
84
|
```
|
|
85
|
-
|
|
85
|
+
User audio input (16kHz mono PCM) → AvatarController → WebSocket → Backend processing
|
|
86
86
|
↓
|
|
87
|
-
|
|
87
|
+
Backend returns animation data (FLAME keyframes) → AvatarController → AnimationPlayer
|
|
88
88
|
↓
|
|
89
|
-
FLAME
|
|
89
|
+
FLAME parameters → AvatarCore.computeFrameFlatFromParams() → Splat data
|
|
90
90
|
↓
|
|
91
|
-
Splat
|
|
91
|
+
Splat data → RenderSystem → WebGPU/WebGL → Canvas rendering
|
|
92
92
|
```
|
|
93
93
|
|
|
94
|
-
|
|
94
|
+
**Note:** Users need to provide audio data themselves (16kHz mono PCM), SDK handles receiving animation data and rendering.
|
|
95
95
|
|
|
96
|
-
## 📚 API
|
|
96
|
+
## 📚 API Reference
|
|
97
97
|
|
|
98
98
|
### AvatarKit
|
|
99
99
|
|
|
100
|
-
SDK
|
|
100
|
+
The core management class of the SDK, responsible for initialization and global configuration.
|
|
101
101
|
|
|
102
102
|
```typescript
|
|
103
|
-
//
|
|
103
|
+
// Initialize SDK
|
|
104
104
|
await AvatarKit.initialize(appId: string, configuration: Configuration)
|
|
105
105
|
|
|
106
|
-
//
|
|
106
|
+
// Check initialization status
|
|
107
107
|
const isInitialized = AvatarKit.isInitialized
|
|
108
108
|
|
|
109
|
-
//
|
|
109
|
+
// Cleanup resources (must be called when no longer in use)
|
|
110
110
|
AvatarKit.cleanup()
|
|
111
111
|
```
|
|
112
112
|
|
|
113
113
|
### AvatarManager
|
|
114
114
|
|
|
115
|
-
|
|
115
|
+
Character resource manager, responsible for downloading, caching, and loading character data.
|
|
116
116
|
|
|
117
117
|
```typescript
|
|
118
118
|
const manager = new AvatarManager()
|
|
119
119
|
|
|
120
|
-
//
|
|
120
|
+
// Load character
|
|
121
121
|
const avatar = await manager.load(
|
|
122
122
|
characterId: string,
|
|
123
123
|
onProgress?: (progress: LoadProgressInfo) => void
|
|
124
124
|
)
|
|
125
125
|
|
|
126
|
-
//
|
|
126
|
+
// Clear cache
|
|
127
127
|
manager.clearCache()
|
|
128
128
|
```
|
|
129
129
|
|
|
130
130
|
### AvatarView
|
|
131
131
|
|
|
132
|
-
3D
|
|
132
|
+
3D rendering view, internally automatically creates and manages AvatarController.
|
|
133
133
|
|
|
134
|
-
**⚠️
|
|
134
|
+
**⚠️ Important Limitation:** Currently, the SDK only supports one AvatarView instance at a time. If you need to switch characters, you must first call the `dispose()` method to clean up the current AvatarView, then create a new instance.
|
|
135
135
|
|
|
136
136
|
```typescript
|
|
137
|
-
//
|
|
137
|
+
// Create view (Canvas is automatically added to container)
|
|
138
138
|
const avatarView = new AvatarView(avatar: Avatar, container?: HTMLElement)
|
|
139
139
|
|
|
140
|
-
//
|
|
140
|
+
// Get Canvas element
|
|
141
141
|
const canvas = avatarView.getCanvas()
|
|
142
142
|
|
|
143
|
-
//
|
|
143
|
+
// Set background
|
|
144
144
|
avatarView.setBackgroundImage('path/to/image.jpg')
|
|
145
145
|
avatarView.setBackgroundOpaque(true)
|
|
146
146
|
|
|
147
|
-
//
|
|
147
|
+
// Update camera configuration
|
|
148
148
|
avatarView.updateCameraConfig(cameraConfig: CameraConfig)
|
|
149
149
|
|
|
150
|
-
//
|
|
150
|
+
// Cleanup resources (must be called before switching characters)
|
|
151
151
|
avatarView.dispose()
|
|
152
152
|
```
|
|
153
153
|
|
|
154
|
-
|
|
154
|
+
**Character Switching Example:**
|
|
155
155
|
|
|
156
156
|
```typescript
|
|
157
|
-
//
|
|
157
|
+
// Before switching characters, must clean up old AvatarView first
|
|
158
158
|
if (currentAvatarView) {
|
|
159
159
|
currentAvatarView.dispose()
|
|
160
160
|
currentAvatarView = null
|
|
161
161
|
}
|
|
162
162
|
|
|
163
|
-
//
|
|
163
|
+
// Load new character
|
|
164
164
|
const newAvatar = await avatarManager.load('new-character-id')
|
|
165
165
|
|
|
166
|
-
//
|
|
166
|
+
// Create new AvatarView
|
|
167
167
|
currentAvatarView = new AvatarView(newAvatar, container)
|
|
168
168
|
await currentAvatarView.avatarController.start()
|
|
169
169
|
```
|
|
170
170
|
|
|
171
171
|
### AvatarController
|
|
172
172
|
|
|
173
|
-
|
|
173
|
+
Real-time communication controller, handles WebSocket connections and animation data.
|
|
174
174
|
|
|
175
175
|
```typescript
|
|
176
|
-
//
|
|
176
|
+
// Start connection
|
|
177
177
|
await avatarView.avatarController.start()
|
|
178
178
|
|
|
179
|
-
//
|
|
179
|
+
// Send audio data
|
|
180
180
|
avatarView.avatarController.send(audioData: ArrayBuffer, end: boolean)
|
|
181
|
-
// audioData:
|
|
182
|
-
// end: false
|
|
183
|
-
// end: true -
|
|
181
|
+
// audioData: Audio data (ArrayBuffer format)
|
|
182
|
+
// end: false (default) - Normal audio data sending, server will accumulate audio data, automatically returns animation data and starts synchronized playback of animation and audio after accumulating enough data
|
|
183
|
+
// end: true - Immediately return animation data, no longer accumulating, used for ending current conversation or scenarios requiring immediate response
|
|
184
184
|
|
|
185
|
-
//
|
|
185
|
+
// Interrupt conversation
|
|
186
186
|
avatarView.avatarController.interrupt()
|
|
187
187
|
|
|
188
|
-
//
|
|
188
|
+
// Close connection
|
|
189
189
|
avatarView.avatarController.close()
|
|
190
190
|
|
|
191
|
-
//
|
|
191
|
+
// Set event callbacks
|
|
192
192
|
avatarView.avatarController.onConnectionState = (state: ConnectionState) => {}
|
|
193
193
|
avatarView.avatarController.onAvatarState = (state: AvatarState) => {}
|
|
194
194
|
avatarView.avatarController.onError = (error: Error) => {}
|
|
195
195
|
|
|
196
|
-
//
|
|
196
|
+
// Note: sendText() method is not supported, calling it will throw an error
|
|
197
197
|
```
|
|
198
198
|
|
|
199
|
-
## 🔧
|
|
199
|
+
## 🔧 Configuration
|
|
200
200
|
|
|
201
201
|
### Configuration
|
|
202
202
|
|
|
@@ -206,14 +206,15 @@ interface Configuration {
|
|
|
206
206
|
}
|
|
207
207
|
```
|
|
208
208
|
|
|
209
|
-
|
|
210
|
-
- `environment`:
|
|
211
|
-
- `sessionToken`:
|
|
209
|
+
**Description:**
|
|
210
|
+
- `environment`: Specifies the environment (cn/us/test), SDK will automatically use the corresponding API address and WebSocket address based on the environment
|
|
211
|
+
- `sessionToken`: Set separately via `AvatarKit.setSessionToken()`, not in Configuration
|
|
212
212
|
|
|
213
|
+
```typescript
|
|
213
214
|
enum Environment {
|
|
214
|
-
cn = 'cn', //
|
|
215
|
-
us = 'us', //
|
|
216
|
-
test = 'test' //
|
|
215
|
+
cn = 'cn', // China region
|
|
216
|
+
us = 'us', // US region
|
|
217
|
+
test = 'test' // Test environment
|
|
217
218
|
}
|
|
218
219
|
```
|
|
219
220
|
|
|
@@ -221,17 +222,17 @@ enum Environment {
|
|
|
221
222
|
|
|
222
223
|
```typescript
|
|
223
224
|
interface CameraConfig {
|
|
224
|
-
position: [number, number, number] //
|
|
225
|
-
target: [number, number, number] //
|
|
226
|
-
fov: number //
|
|
227
|
-
near: number //
|
|
228
|
-
far: number //
|
|
229
|
-
up?: [number, number, number] //
|
|
230
|
-
aspect?: number //
|
|
225
|
+
position: [number, number, number] // Camera position
|
|
226
|
+
target: [number, number, number] // Camera target
|
|
227
|
+
fov: number // Field of view angle
|
|
228
|
+
near: number // Near clipping plane
|
|
229
|
+
far: number // Far clipping plane
|
|
230
|
+
up?: [number, number, number] // Up direction
|
|
231
|
+
aspect?: number // Aspect ratio
|
|
231
232
|
}
|
|
232
233
|
```
|
|
233
234
|
|
|
234
|
-
## 📊
|
|
235
|
+
## 📊 State Management
|
|
235
236
|
|
|
236
237
|
### ConnectionState
|
|
237
238
|
|
|
@@ -248,77 +249,77 @@ enum ConnectionState {
|
|
|
248
249
|
|
|
249
250
|
```typescript
|
|
250
251
|
enum AvatarState {
|
|
251
|
-
idle = 'idle', //
|
|
252
|
-
active = 'active', //
|
|
253
|
-
playing = 'playing' //
|
|
252
|
+
idle = 'idle', // Idle state, showing breathing animation
|
|
253
|
+
active = 'active', // Active, waiting for playable content
|
|
254
|
+
playing = 'playing' // Playing
|
|
254
255
|
}
|
|
255
256
|
```
|
|
256
257
|
|
|
257
|
-
## 🎨
|
|
258
|
+
## 🎨 Rendering System
|
|
258
259
|
|
|
259
|
-
SDK
|
|
260
|
+
The SDK supports two rendering backends:
|
|
260
261
|
|
|
261
|
-
- **WebGPU** -
|
|
262
|
-
- **WebGL** -
|
|
262
|
+
- **WebGPU** - High-performance rendering for modern browsers
|
|
263
|
+
- **WebGL** - Better compatibility traditional rendering
|
|
263
264
|
|
|
264
|
-
|
|
265
|
+
The rendering system automatically selects the best backend, no manual configuration needed.
|
|
265
266
|
|
|
266
|
-
## 🔍
|
|
267
|
+
## 🔍 Debugging and Monitoring
|
|
267
268
|
|
|
268
|
-
###
|
|
269
|
+
### Logging System
|
|
269
270
|
|
|
270
|
-
SDK
|
|
271
|
+
The SDK has a built-in complete logging system, supporting different levels of log output:
|
|
271
272
|
|
|
272
273
|
```typescript
|
|
273
274
|
import { logger } from '@spatialwalk/avatarkit'
|
|
274
275
|
|
|
275
|
-
//
|
|
276
|
+
// Set log level
|
|
276
277
|
logger.setLevel('verbose') // 'basic' | 'verbose'
|
|
277
278
|
|
|
278
|
-
//
|
|
279
|
+
// Manual log output
|
|
279
280
|
logger.log('Info message')
|
|
280
281
|
logger.warn('Warning message')
|
|
281
282
|
logger.error('Error message')
|
|
282
283
|
```
|
|
283
284
|
|
|
284
|
-
###
|
|
285
|
+
### Performance Monitoring
|
|
285
286
|
|
|
286
|
-
SDK
|
|
287
|
+
The SDK provides performance monitoring interfaces to monitor rendering performance:
|
|
287
288
|
|
|
288
289
|
```typescript
|
|
289
|
-
//
|
|
290
|
+
// Get rendering performance statistics
|
|
290
291
|
const stats = avatarView.getPerformanceStats()
|
|
291
292
|
|
|
292
293
|
if (stats) {
|
|
293
|
-
console.log(
|
|
294
|
-
console.log(
|
|
295
|
-
console.log(
|
|
294
|
+
console.log(`Render time: ${stats.renderTime.toFixed(2)}ms`)
|
|
295
|
+
console.log(`Sort time: ${stats.sortTime.toFixed(2)}ms`)
|
|
296
|
+
console.log(`Rendering backend: ${stats.backend}`)
|
|
296
297
|
|
|
297
|
-
//
|
|
298
|
+
// Calculate frame rate
|
|
298
299
|
const fps = 1000 / stats.renderTime
|
|
299
|
-
console.log(
|
|
300
|
+
console.log(`Frame rate: ${fps.toFixed(2)} FPS`)
|
|
300
301
|
}
|
|
301
302
|
|
|
302
|
-
//
|
|
303
|
+
// Regular performance monitoring
|
|
303
304
|
setInterval(() => {
|
|
304
305
|
const stats = avatarView.getPerformanceStats()
|
|
305
306
|
if (stats) {
|
|
306
|
-
//
|
|
307
|
+
// Send to monitoring service or display on UI
|
|
307
308
|
console.log('Performance:', stats)
|
|
308
309
|
}
|
|
309
310
|
}, 1000)
|
|
310
311
|
```
|
|
311
312
|
|
|
312
|
-
|
|
313
|
-
- `renderTime`:
|
|
314
|
-
- `sortTime`:
|
|
315
|
-
- `backend`:
|
|
313
|
+
**Performance Statistics Description:**
|
|
314
|
+
- `renderTime`: Total rendering time (milliseconds), includes sorting and GPU rendering
|
|
315
|
+
- `sortTime`: Sorting time (milliseconds), uses Radix Sort algorithm to depth-sort point cloud
|
|
316
|
+
- `backend`: Currently used rendering backend (`'webgpu'` | `'webgl'` | `null`)
|
|
316
317
|
|
|
317
|
-
## 🚨
|
|
318
|
+
## 🚨 Error Handling
|
|
318
319
|
|
|
319
320
|
### SPAvatarError
|
|
320
321
|
|
|
321
|
-
SDK
|
|
322
|
+
The SDK uses custom error types, providing more detailed error information:
|
|
322
323
|
|
|
323
324
|
```typescript
|
|
324
325
|
import { SPAvatarError } from '@spatialwalk/avatarkit'
|
|
@@ -334,70 +335,70 @@ try {
|
|
|
334
335
|
}
|
|
335
336
|
```
|
|
336
337
|
|
|
337
|
-
###
|
|
338
|
+
### Error Callbacks
|
|
338
339
|
|
|
339
340
|
```typescript
|
|
340
341
|
avatarView.avatarController.onError = (error: Error) => {
|
|
341
342
|
console.error('AvatarController error:', error)
|
|
342
|
-
//
|
|
343
|
+
// Handle error, such as reconnection, user notification, etc.
|
|
343
344
|
}
|
|
344
345
|
```
|
|
345
346
|
|
|
346
|
-
## 🔄
|
|
347
|
+
## 🔄 Resource Management
|
|
347
348
|
|
|
348
|
-
###
|
|
349
|
+
### Lifecycle Management
|
|
349
350
|
|
|
350
351
|
```typescript
|
|
351
|
-
//
|
|
352
|
+
// Initialize
|
|
352
353
|
const avatarView = new AvatarView(avatar, container)
|
|
353
354
|
await avatarView.avatarController.start()
|
|
354
355
|
|
|
355
|
-
//
|
|
356
|
+
// Use
|
|
356
357
|
avatarView.avatarController.send(audioData, false)
|
|
357
358
|
|
|
358
|
-
//
|
|
359
|
-
avatarView.dispose() //
|
|
359
|
+
// Cleanup (must be called before switching characters)
|
|
360
|
+
avatarView.dispose() // Automatically cleans up all resources
|
|
360
361
|
```
|
|
361
362
|
|
|
362
|
-
**⚠️
|
|
363
|
-
- SDK
|
|
364
|
-
-
|
|
365
|
-
-
|
|
363
|
+
**⚠️ Important Notes:**
|
|
364
|
+
- SDK currently only supports one AvatarView instance at a time
|
|
365
|
+
- When switching characters, must first call `dispose()` to clean up old AvatarView, then create new instance
|
|
366
|
+
- Not properly cleaning up may cause resource leaks and rendering errors
|
|
366
367
|
|
|
367
|
-
###
|
|
368
|
+
### Memory Optimization
|
|
368
369
|
|
|
369
|
-
- SDK
|
|
370
|
-
-
|
|
371
|
-
-
|
|
370
|
+
- SDK automatically manages WASM memory allocation
|
|
371
|
+
- Supports dynamic loading/unloading of character and animation resources
|
|
372
|
+
- Provides memory usage monitoring interface
|
|
372
373
|
|
|
373
|
-
###
|
|
374
|
+
### Audio Data Sending
|
|
374
375
|
|
|
375
|
-
`send()`
|
|
376
|
+
The `send()` method receives audio data in `ArrayBuffer` format:
|
|
376
377
|
|
|
377
|
-
|
|
378
|
-
- `audioData`:
|
|
379
|
-
- `end=false
|
|
380
|
-
- `end=true` -
|
|
381
|
-
-
|
|
378
|
+
**Usage:**
|
|
379
|
+
- `audioData`: Audio data (ArrayBuffer format)
|
|
380
|
+
- `end=false` (default) - Normal audio data sending, server will accumulate audio data, automatically returns animation data and starts synchronized playback of animation and audio after accumulating enough data
|
|
381
|
+
- `end=true` - Immediately return animation data, no longer accumulating, used for ending current conversation or scenarios requiring immediate response
|
|
382
|
+
- **Important**: No need to wait for `end=true` to start playing, it will automatically start playing after accumulating enough audio data
|
|
382
383
|
|
|
383
|
-
## 🌐
|
|
384
|
+
## 🌐 Browser Compatibility
|
|
384
385
|
|
|
385
|
-
- **Chrome/Edge** 90+ (
|
|
386
|
+
- **Chrome/Edge** 90+ (WebGPU recommended)
|
|
386
387
|
- **Firefox** 90+ (WebGL)
|
|
387
388
|
- **Safari** 14+ (WebGL)
|
|
388
|
-
-
|
|
389
|
+
- **Mobile** iOS 14+, Android 8+
|
|
389
390
|
|
|
390
|
-
## 📝
|
|
391
|
+
## 📝 License
|
|
391
392
|
|
|
392
393
|
MIT License
|
|
393
394
|
|
|
394
|
-
## 🤝
|
|
395
|
+
## 🤝 Contributing
|
|
395
396
|
|
|
396
|
-
|
|
397
|
+
Issues and Pull Requests are welcome!
|
|
397
398
|
|
|
398
|
-
## 📞
|
|
399
|
+
## 📞 Support
|
|
399
400
|
|
|
400
|
-
|
|
401
|
-
-
|
|
402
|
-
-
|
|
403
|
-
- GitHub
|
|
401
|
+
For questions, please contact:
|
|
402
|
+
- Email: support@spavatar.com
|
|
403
|
+
- Documentation: https://docs.spavatar.com
|
|
404
|
+
- GitHub: https://github.com/spavatar/sdk
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
var c = Object.defineProperty;
|
|
2
2
|
var g = (h, t, e) => t in h ? c(h, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : h[t] = e;
|
|
3
3
|
var s = (h, t, e) => g(h, typeof t != "symbol" ? t + "" : t, e);
|
|
4
|
-
import { l } from "./index-
|
|
4
|
+
import { l } from "./index-NmYXWJnL.js";
|
|
5
5
|
class k {
|
|
6
6
|
constructor(t) {
|
|
7
7
|
// AudioContext is managed internally
|
|
@@ -285,4 +285,4 @@ class k {
|
|
|
285
285
|
export {
|
|
286
286
|
k as StreamingAudioPlayer
|
|
287
287
|
};
|
|
288
|
-
//# sourceMappingURL=StreamingAudioPlayer-
|
|
288
|
+
//# sourceMappingURL=StreamingAudioPlayer-BeLlDiwE.js.map
|