@just-every/ensemble 0.2.83 → 0.2.85

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.
@@ -0,0 +1,35 @@
1
+ export interface AudioStreamPlayerOptions {
2
+ onFirstAudioPlay?: () => void;
3
+ }
4
+ export declare class AudioStreamPlayer {
5
+ private audioContext;
6
+ private sourceNodes;
7
+ private nextStartTime;
8
+ private expectedChunkIndex;
9
+ private receivedFinalChunk;
10
+ private pcmParameters;
11
+ private pcmDataQueue;
12
+ private bufferDurationTarget;
13
+ private bytesPerSample;
14
+ private isFirstBuffer;
15
+ private currentFormat;
16
+ private fallbackAudio;
17
+ private fallbackChunks;
18
+ private onFirstAudioPlay?;
19
+ constructor(options?: AudioStreamPlayerOptions);
20
+ initAudioContext(): Promise<void>;
21
+ startStream(params: {
22
+ sampleRate: number;
23
+ channels: number;
24
+ bitDepth: number;
25
+ } | undefined, format: string): void;
26
+ addChunk(base64Chunk: string, chunkIndex: number, isFinalChunk: boolean): void;
27
+ private _addPcmChunk;
28
+ private _processPcmQueue;
29
+ private _addFallbackChunk;
30
+ stopStream(): void;
31
+ private _resetState;
32
+ get isPlaying(): boolean;
33
+ get isStreaming(): boolean;
34
+ }
35
+ //# sourceMappingURL=audio_stream_player.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audio_stream_player.d.ts","sourceRoot":"","sources":["../../utils/audio_stream_player.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,wBAAwB;IACrC,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;CACjC;AAED,qBAAa,iBAAiB;IAC1B,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,WAAW,CAA+B;IAClD,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,kBAAkB,CAAK;IAC/B,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,aAAa,CAA2E;IAChG,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,oBAAoB,CAAO;IACnC,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,aAAa,CAAQ;IAC7B,OAAO,CAAC,aAAa,CAAuB;IAG5C,OAAO,CAAC,aAAa,CAAiC;IACtD,OAAO,CAAC,cAAc,CAAoB;IAG1C,OAAO,CAAC,gBAAgB,CAAC,CAAa;gBAE1B,OAAO,GAAE,wBAA6B;IAI5C,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IAiBvC,WAAW,CAAC,MAAM,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAwBjH,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,GAAG,IAAI;IAc9E,OAAO,CAAC,YAAY;IAgCpB,OAAO,CAAC,gBAAgB;IA8HxB,OAAO,CAAC,iBAAiB;IA0CzB,UAAU,IAAI,IAAI;IAoBlB,OAAO,CAAC,WAAW;IAUnB,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,IAAI,WAAW,IAAI,OAAO,CAEzB;CACJ"}
@@ -0,0 +1,256 @@
1
+ export class AudioStreamPlayer {
2
+ audioContext = null;
3
+ sourceNodes = [];
4
+ nextStartTime = 0;
5
+ expectedChunkIndex = 0;
6
+ receivedFinalChunk = false;
7
+ pcmParameters = null;
8
+ pcmDataQueue = [];
9
+ bufferDurationTarget = 0.1;
10
+ bytesPerSample = 2;
11
+ isFirstBuffer = true;
12
+ currentFormat = null;
13
+ fallbackAudio = null;
14
+ fallbackChunks = [];
15
+ onFirstAudioPlay;
16
+ constructor(options = {}) {
17
+ this.onFirstAudioPlay = options.onFirstAudioPlay;
18
+ }
19
+ async initAudioContext() {
20
+ if (this.audioContext && this.audioContext.state === 'running') {
21
+ return;
22
+ }
23
+ try {
24
+ if (!this.audioContext) {
25
+ this.audioContext = new (window.AudioContext || window.webkitAudioContext)();
26
+ }
27
+ if (this.audioContext.state === 'suspended') {
28
+ await this.audioContext.resume();
29
+ }
30
+ }
31
+ catch (error) {
32
+ console.error('Failed to initialize AudioContext:', error);
33
+ this.audioContext = null;
34
+ }
35
+ }
36
+ startStream(params, format) {
37
+ this.stopStream();
38
+ this.currentFormat = format;
39
+ if ((format === 'wav' || format.includes('pcm')) && params) {
40
+ if (!this.audioContext || this.audioContext.state !== 'running') {
41
+ console.error('AudioContext not ready');
42
+ return;
43
+ }
44
+ this.pcmParameters = params;
45
+ this.bytesPerSample = params.bitDepth / 8;
46
+ this.expectedChunkIndex = 0;
47
+ this.receivedFinalChunk = false;
48
+ this.pcmDataQueue = [];
49
+ this.isFirstBuffer = true;
50
+ this.nextStartTime = 0;
51
+ }
52
+ else {
53
+ this.fallbackChunks = [];
54
+ console.log(`Starting ${format} stream - will play when complete`);
55
+ }
56
+ }
57
+ addChunk(base64Chunk, chunkIndex, isFinalChunk) {
58
+ const format = this.currentFormat;
59
+ if (!format) {
60
+ console.error('No format set');
61
+ return;
62
+ }
63
+ if (format === 'wav' || format.includes('pcm')) {
64
+ this._addPcmChunk(base64Chunk, chunkIndex, isFinalChunk);
65
+ }
66
+ else {
67
+ this._addFallbackChunk(base64Chunk, chunkIndex, isFinalChunk, format);
68
+ }
69
+ }
70
+ _addPcmChunk(base64Chunk, chunkIndex, isFinalChunk) {
71
+ if (!this.audioContext || !this.pcmParameters) {
72
+ console.error('Not initialized for PCM');
73
+ return;
74
+ }
75
+ if (chunkIndex !== this.expectedChunkIndex) {
76
+ console.warn(`Out of order chunk: expected ${this.expectedChunkIndex}, got ${chunkIndex}`);
77
+ return;
78
+ }
79
+ this.expectedChunkIndex++;
80
+ this.receivedFinalChunk = isFinalChunk;
81
+ try {
82
+ const binaryString = atob(base64Chunk);
83
+ const bytes = new Uint8Array(binaryString.length);
84
+ for (let i = 0; i < binaryString.length; i++) {
85
+ bytes[i] = binaryString.charCodeAt(i);
86
+ }
87
+ if (bytes.length > 0) {
88
+ this.pcmDataQueue.push(bytes.buffer);
89
+ }
90
+ this._processPcmQueue();
91
+ }
92
+ catch (error) {
93
+ console.error('Error processing PCM chunk:', error);
94
+ }
95
+ }
96
+ _processPcmQueue() {
97
+ if (!this.audioContext || !this.pcmParameters) {
98
+ return;
99
+ }
100
+ if (this.receivedFinalChunk && this.pcmDataQueue.length === 0 && this.sourceNodes.length === 0) {
101
+ console.log('PCM stream finished');
102
+ this._resetState();
103
+ return;
104
+ }
105
+ if (this.nextStartTime > this.audioContext.currentTime + 1.0) {
106
+ setTimeout(() => this._processPcmQueue(), 100);
107
+ return;
108
+ }
109
+ const totalBytes = this.pcmDataQueue.reduce((sum, buffer) => sum + buffer.byteLength, 0);
110
+ const requiredBytes = this.pcmParameters.sampleRate *
111
+ this.pcmParameters.channels *
112
+ this.bytesPerSample *
113
+ this.bufferDurationTarget;
114
+ if (totalBytes < requiredBytes && !(this.receivedFinalChunk && totalBytes > 0)) {
115
+ return;
116
+ }
117
+ const bytesToProcess = this.receivedFinalChunk ? totalBytes : requiredBytes;
118
+ let processedBytes = 0;
119
+ const buffersToProcess = [];
120
+ while (processedBytes < bytesToProcess && this.pcmDataQueue.length > 0) {
121
+ const buffer = this.pcmDataQueue.shift();
122
+ buffersToProcess.push(buffer);
123
+ processedBytes += buffer.byteLength;
124
+ }
125
+ if (buffersToProcess.length === 0 || processedBytes === 0)
126
+ return;
127
+ let skipBytes = 0;
128
+ if (this.nextStartTime === 0 && buffersToProcess.length > 0) {
129
+ const firstBuffer = new Uint8Array(buffersToProcess[0]);
130
+ if (firstBuffer.length >= 4) {
131
+ const header = String.fromCharCode(...firstBuffer.slice(0, 4));
132
+ if (header === 'RIFF') {
133
+ skipBytes = 44;
134
+ }
135
+ }
136
+ }
137
+ const totalSamples = (processedBytes - skipBytes) / this.bytesPerSample;
138
+ const concatenatedPcm = new Int16Array(totalSamples);
139
+ let offset = 0;
140
+ let bytesSkipped = 0;
141
+ for (const buffer of buffersToProcess) {
142
+ const view = new DataView(buffer);
143
+ for (let i = 0; i < buffer.byteLength; i += 2) {
144
+ if (bytesSkipped < skipBytes) {
145
+ bytesSkipped += 2;
146
+ continue;
147
+ }
148
+ if (offset < concatenatedPcm.length && i + 1 < buffer.byteLength) {
149
+ concatenatedPcm[offset] = view.getInt16(i, true);
150
+ offset++;
151
+ }
152
+ }
153
+ }
154
+ const float32Array = new Float32Array(concatenatedPcm.length);
155
+ for (let i = 0; i < concatenatedPcm.length; i++) {
156
+ float32Array[i] = concatenatedPcm[i] / 32768;
157
+ }
158
+ const numberOfSamples = float32Array.length / this.pcmParameters.channels;
159
+ const audioBuffer = this.audioContext.createBuffer(this.pcmParameters.channels, numberOfSamples, this.pcmParameters.sampleRate);
160
+ audioBuffer.getChannelData(0).set(float32Array);
161
+ const sourceNode = this.audioContext.createBufferSource();
162
+ sourceNode.buffer = audioBuffer;
163
+ sourceNode.connect(this.audioContext.destination);
164
+ const currentTime = this.audioContext.currentTime;
165
+ const startTime = this.nextStartTime <= currentTime ? currentTime : this.nextStartTime;
166
+ sourceNode.start(startTime);
167
+ this.nextStartTime = startTime + audioBuffer.duration;
168
+ this.sourceNodes.push(sourceNode);
169
+ if (this.isFirstBuffer && this.onFirstAudioPlay) {
170
+ this.isFirstBuffer = false;
171
+ if (startTime === currentTime) {
172
+ this.onFirstAudioPlay();
173
+ }
174
+ else {
175
+ const delay = (startTime - currentTime) * 1000;
176
+ setTimeout(() => this.onFirstAudioPlay?.(), delay);
177
+ }
178
+ }
179
+ sourceNode.onended = () => {
180
+ const index = this.sourceNodes.indexOf(sourceNode);
181
+ if (index > -1) {
182
+ this.sourceNodes.splice(index, 1);
183
+ }
184
+ this._processPcmQueue();
185
+ };
186
+ if (this.pcmDataQueue.length > 0 || !this.receivedFinalChunk) {
187
+ setTimeout(() => this._processPcmQueue(), 10);
188
+ }
189
+ }
190
+ _addFallbackChunk(base64Chunk, chunkIndex, isFinalChunk, format) {
191
+ const binaryString = atob(base64Chunk);
192
+ const bytes = new Uint8Array(binaryString.length);
193
+ for (let i = 0; i < binaryString.length; i++) {
194
+ bytes[i] = binaryString.charCodeAt(i);
195
+ }
196
+ this.fallbackChunks.push(bytes);
197
+ if (isFinalChunk) {
198
+ this.receivedFinalChunk = true;
199
+ if (!this.fallbackAudio) {
200
+ const mimeType = format === 'mp3'
201
+ ? 'audio/mpeg'
202
+ : format === 'opus'
203
+ ? 'audio/opus'
204
+ : format === 'aac'
205
+ ? 'audio/aac'
206
+ : format === 'flac'
207
+ ? 'audio/flac'
208
+ : 'audio/mpeg';
209
+ const blob = new Blob(this.fallbackChunks, { type: mimeType });
210
+ const url = URL.createObjectURL(blob);
211
+ this.fallbackAudio = new Audio();
212
+ this.fallbackAudio.src = url;
213
+ this.fallbackAudio
214
+ .play()
215
+ .then(() => {
216
+ if (this.onFirstAudioPlay) {
217
+ this.onFirstAudioPlay();
218
+ }
219
+ })
220
+ .catch(err => console.error('Playback failed:', err));
221
+ }
222
+ }
223
+ }
224
+ stopStream() {
225
+ this.sourceNodes.forEach(node => {
226
+ try {
227
+ node.onended = null;
228
+ node.stop();
229
+ }
230
+ catch {
231
+ }
232
+ });
233
+ this.sourceNodes = [];
234
+ if (this.fallbackAudio) {
235
+ this.fallbackAudio.pause();
236
+ this.fallbackAudio = null;
237
+ }
238
+ this._resetState();
239
+ }
240
+ _resetState() {
241
+ this.expectedChunkIndex = 0;
242
+ this.receivedFinalChunk = false;
243
+ this.pcmDataQueue = [];
244
+ this.fallbackChunks = [];
245
+ this.nextStartTime = 0;
246
+ this.isFirstBuffer = true;
247
+ this.currentFormat = null;
248
+ }
249
+ get isPlaying() {
250
+ return this.sourceNodes.length > 0 || (this.fallbackAudio !== null && !this.fallbackAudio.paused);
251
+ }
252
+ get isStreaming() {
253
+ return !this.receivedFinalChunk || this.pcmDataQueue.length > 0 || this.sourceNodes.length > 0;
254
+ }
255
+ }
256
+ //# sourceMappingURL=audio_stream_player.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audio_stream_player.js","sourceRoot":"","sources":["../../utils/audio_stream_player.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@just-every/ensemble",
3
- "version": "0.2.83",
3
+ "version": "0.2.85",
4
4
  "description": "LLM provider abstraction layer with unified streaming interface",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -41,8 +41,9 @@
41
41
  "lint": "eslint '**/*.{ts,tsx}'",
42
42
  "lint:fix": "eslint '**/*.{ts,tsx}' --fix",
43
43
  "docs": "typedoc",
44
- "demo:live": "npx tsx demo/live-server.ts",
45
- "demo:transcription": "npx tsx demo/transcription-server.ts"
44
+ "demo:live": "npm run build && npx tsx demo/live-server.ts",
45
+ "demo:listen": "npm run build && npx tsx demo/transcription-server.ts",
46
+ "demo:voice": "npm run build && npx tsx demo/voice-server.ts"
46
47
  },
47
48
  "exports": {
48
49
  ".": {