whisper.rn 0.5.0-rc.0 → 0.5.0-rc.2
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 +119 -50
- package/android/build.gradle +1 -0
- package/lib/commonjs/AudioSessionIos.js +2 -1
- package/lib/commonjs/AudioSessionIos.js.map +1 -1
- package/lib/commonjs/index.js +1 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/jest-mock.js +126 -0
- package/lib/commonjs/jest-mock.js.map +1 -0
- package/lib/commonjs/realtime-transcription/RealtimeTranscriber.js +831 -0
- package/lib/commonjs/realtime-transcription/RealtimeTranscriber.js.map +1 -0
- package/lib/commonjs/realtime-transcription/SliceManager.js +233 -0
- package/lib/commonjs/realtime-transcription/SliceManager.js.map +1 -0
- package/lib/commonjs/realtime-transcription/adapters/AudioPcmStreamAdapter.js +133 -0
- package/lib/commonjs/realtime-transcription/adapters/AudioPcmStreamAdapter.js.map +1 -0
- package/lib/commonjs/realtime-transcription/adapters/JestAudioStreamAdapter.js +201 -0
- package/lib/commonjs/realtime-transcription/adapters/JestAudioStreamAdapter.js.map +1 -0
- package/lib/commonjs/realtime-transcription/adapters/SimulateFileAudioStreamAdapter.js +309 -0
- package/lib/commonjs/realtime-transcription/adapters/SimulateFileAudioStreamAdapter.js.map +1 -0
- package/lib/commonjs/realtime-transcription/index.js +27 -0
- package/lib/commonjs/realtime-transcription/index.js.map +1 -0
- package/lib/commonjs/realtime-transcription/types.js +114 -0
- package/lib/commonjs/realtime-transcription/types.js.map +1 -0
- package/lib/commonjs/utils/WavFileReader.js +158 -0
- package/lib/commonjs/utils/WavFileReader.js.map +1 -0
- package/lib/commonjs/utils/WavFileWriter.js +181 -0
- package/lib/commonjs/utils/WavFileWriter.js.map +1 -0
- package/lib/commonjs/utils/common.js +25 -0
- package/lib/commonjs/utils/common.js.map +1 -0
- package/lib/module/AudioSessionIos.js +2 -1
- package/lib/module/AudioSessionIos.js.map +1 -1
- package/lib/module/index.js +1 -0
- package/lib/module/index.js.map +1 -1
- package/lib/module/jest-mock.js +124 -0
- package/lib/module/jest-mock.js.map +1 -0
- package/lib/module/realtime-transcription/RealtimeTranscriber.js +825 -0
- package/lib/module/realtime-transcription/RealtimeTranscriber.js.map +1 -0
- package/lib/module/realtime-transcription/SliceManager.js +226 -0
- package/lib/module/realtime-transcription/SliceManager.js.map +1 -0
- package/lib/module/realtime-transcription/adapters/AudioPcmStreamAdapter.js +124 -0
- package/lib/module/realtime-transcription/adapters/AudioPcmStreamAdapter.js.map +1 -0
- package/lib/module/realtime-transcription/adapters/JestAudioStreamAdapter.js +194 -0
- package/lib/module/realtime-transcription/adapters/JestAudioStreamAdapter.js.map +1 -0
- package/lib/module/realtime-transcription/adapters/SimulateFileAudioStreamAdapter.js +302 -0
- package/lib/module/realtime-transcription/adapters/SimulateFileAudioStreamAdapter.js.map +1 -0
- package/lib/module/realtime-transcription/index.js +8 -0
- package/lib/module/realtime-transcription/index.js.map +1 -0
- package/lib/module/realtime-transcription/types.js +107 -0
- package/lib/module/realtime-transcription/types.js.map +1 -0
- package/lib/module/utils/WavFileReader.js +151 -0
- package/lib/module/utils/WavFileReader.js.map +1 -0
- package/lib/module/utils/WavFileWriter.js +174 -0
- package/lib/module/utils/WavFileWriter.js.map +1 -0
- package/lib/module/utils/common.js +18 -0
- package/lib/module/utils/common.js.map +1 -0
- package/lib/typescript/AudioSessionIos.d.ts +1 -1
- package/lib/typescript/AudioSessionIos.d.ts.map +1 -1
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/jest-mock.d.ts +2 -0
- package/lib/typescript/jest-mock.d.ts.map +1 -0
- package/lib/typescript/realtime-transcription/RealtimeTranscriber.d.ts +165 -0
- package/lib/typescript/realtime-transcription/RealtimeTranscriber.d.ts.map +1 -0
- package/lib/typescript/realtime-transcription/SliceManager.d.ts +72 -0
- package/lib/typescript/realtime-transcription/SliceManager.d.ts.map +1 -0
- package/lib/typescript/realtime-transcription/adapters/AudioPcmStreamAdapter.d.ts +22 -0
- package/lib/typescript/realtime-transcription/adapters/AudioPcmStreamAdapter.d.ts.map +1 -0
- package/lib/typescript/realtime-transcription/adapters/JestAudioStreamAdapter.d.ts +44 -0
- package/lib/typescript/realtime-transcription/adapters/JestAudioStreamAdapter.d.ts.map +1 -0
- package/lib/typescript/realtime-transcription/adapters/SimulateFileAudioStreamAdapter.d.ts +75 -0
- package/lib/typescript/realtime-transcription/adapters/SimulateFileAudioStreamAdapter.d.ts.map +1 -0
- package/lib/typescript/realtime-transcription/index.d.ts +6 -0
- package/lib/typescript/realtime-transcription/index.d.ts.map +1 -0
- package/lib/typescript/realtime-transcription/types.d.ts +216 -0
- package/lib/typescript/realtime-transcription/types.d.ts.map +1 -0
- package/lib/typescript/utils/WavFileReader.d.ts +61 -0
- package/lib/typescript/utils/WavFileReader.d.ts.map +1 -0
- package/lib/typescript/utils/WavFileWriter.d.ts +57 -0
- package/lib/typescript/utils/WavFileWriter.d.ts.map +1 -0
- package/lib/typescript/utils/common.d.ts +9 -0
- package/lib/typescript/utils/common.d.ts.map +1 -0
- package/package.json +23 -11
- package/src/AudioSessionIos.ts +3 -2
- package/src/index.ts +4 -0
- package/{jest/mock.js → src/jest-mock.ts} +2 -2
- package/src/realtime-transcription/RealtimeTranscriber.ts +983 -0
- package/src/realtime-transcription/SliceManager.ts +252 -0
- package/src/realtime-transcription/adapters/AudioPcmStreamAdapter.ts +143 -0
- package/src/realtime-transcription/adapters/JestAudioStreamAdapter.ts +251 -0
- package/src/realtime-transcription/adapters/SimulateFileAudioStreamAdapter.ts +378 -0
- package/src/realtime-transcription/index.ts +34 -0
- package/src/realtime-transcription/types.ts +277 -0
- package/src/utils/WavFileReader.ts +202 -0
- package/src/utils/WavFileWriter.ts +206 -0
- package/src/utils/common.ts +17 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["JestAudioStreamAdapter","config","isInitialized","recording","chunksSent","startTime","constructor","options","arguments","length","undefined","sampleRate","channels","bitsPerSample","simulateLatency","simulateErrors","chunkSize","chunkInterval","maxChunks","generateSilence","initialize","release","delay","simulateStartErrorOnly","Error","start","_this$statusCallback","Date","now","statusCallback","call","startStreaming","stop","_this$statusCallback2","streamInterval","clearTimeout","isRecording","onData","callback","dataCallback","onError","errorCallback","onStatusChange","simulateError","error","_this$errorCallback","simulateDataChunk","data","streamData","timestamp","getChunksSent","getTotalBytesStreamed","getStreamDuration","streamChunk","audioData","generateAudioChunk","setTimeout","startByte","endByte","Math","min","subarray","Uint8Array","fill","frequency","samplesPerChunk","timeOffset","i","time","amplitude","sin","PI","sample","round","floor","ms","Promise","resolve","exports"],"sourceRoot":"../../../../src","sources":["realtime-transcription/adapters/JestAudioStreamAdapter.ts"],"mappings":"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"}
|
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.SimulateFileAudioStreamAdapter = void 0;
|
|
7
|
+
var _WavFileReader = require("../../utils/WavFileReader");
|
|
8
|
+
class SimulateFileAudioStreamAdapter {
|
|
9
|
+
config = null;
|
|
10
|
+
isInitialized = false;
|
|
11
|
+
recording = false;
|
|
12
|
+
currentBytePosition = 0;
|
|
13
|
+
startTime = 0;
|
|
14
|
+
pausedTime = 0;
|
|
15
|
+
hasReachedEnd = false;
|
|
16
|
+
constructor(options) {
|
|
17
|
+
this.options = {
|
|
18
|
+
playbackSpeed: 1.0,
|
|
19
|
+
chunkDurationMs: 100,
|
|
20
|
+
loop: false,
|
|
21
|
+
logger: () => {},
|
|
22
|
+
...options
|
|
23
|
+
};
|
|
24
|
+
this.fileReader = new _WavFileReader.WavFileReader(this.options.fs, this.options.filePath);
|
|
25
|
+
}
|
|
26
|
+
async initialize(config) {
|
|
27
|
+
if (this.isInitialized) {
|
|
28
|
+
await this.release();
|
|
29
|
+
}
|
|
30
|
+
try {
|
|
31
|
+
this.config = config;
|
|
32
|
+
|
|
33
|
+
// Initialize the WAV file reader
|
|
34
|
+
await this.fileReader.initialize();
|
|
35
|
+
|
|
36
|
+
// Validate file format matches config
|
|
37
|
+
const header = this.fileReader.getHeader();
|
|
38
|
+
if (!header) {
|
|
39
|
+
throw new Error('Failed to read WAV file header');
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Warn about mismatched formats but allow processing
|
|
43
|
+
if (header.sampleRate !== config.sampleRate) {
|
|
44
|
+
this.log(`WAV file sample rate (${header.sampleRate}Hz) differs from config (${config.sampleRate}Hz)`);
|
|
45
|
+
}
|
|
46
|
+
if (header.channels !== config.channels) {
|
|
47
|
+
this.log(`WAV file channels (${header.channels}) differs from config (${config.channels})`);
|
|
48
|
+
}
|
|
49
|
+
if (header.bitsPerSample !== config.bitsPerSample) {
|
|
50
|
+
this.log(`WAV file bits per sample (${header.bitsPerSample}) differs from config (${config.bitsPerSample})`);
|
|
51
|
+
}
|
|
52
|
+
this.isInitialized = true;
|
|
53
|
+
this.log(`Simulate audio stream initialized: ${header.duration.toFixed(2)}s at ${this.options.playbackSpeed}x speed`);
|
|
54
|
+
} catch (error) {
|
|
55
|
+
var _this$errorCallback;
|
|
56
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown initialization error';
|
|
57
|
+
(_this$errorCallback = this.errorCallback) === null || _this$errorCallback === void 0 ? void 0 : _this$errorCallback.call(this, errorMessage);
|
|
58
|
+
throw new Error(`Failed to initialize SimulateFileAudioStreamAdapter: ${errorMessage}`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
async start() {
|
|
62
|
+
if (!this.isInitialized || !this.config) {
|
|
63
|
+
throw new Error('Adapter not initialized');
|
|
64
|
+
}
|
|
65
|
+
if (this.recording) {
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
try {
|
|
69
|
+
var _this$statusCallback;
|
|
70
|
+
this.recording = true;
|
|
71
|
+
this.hasReachedEnd = false;
|
|
72
|
+
this.startTime = Date.now() - this.pausedTime;
|
|
73
|
+
(_this$statusCallback = this.statusCallback) === null || _this$statusCallback === void 0 ? void 0 : _this$statusCallback.call(this, true);
|
|
74
|
+
|
|
75
|
+
// Start streaming chunks
|
|
76
|
+
this.startStreaming();
|
|
77
|
+
this.log('File audio simulation started');
|
|
78
|
+
} catch (error) {
|
|
79
|
+
var _this$statusCallback2, _this$errorCallback2;
|
|
80
|
+
this.recording = false;
|
|
81
|
+
(_this$statusCallback2 = this.statusCallback) === null || _this$statusCallback2 === void 0 ? void 0 : _this$statusCallback2.call(this, false);
|
|
82
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown start error';
|
|
83
|
+
(_this$errorCallback2 = this.errorCallback) === null || _this$errorCallback2 === void 0 ? void 0 : _this$errorCallback2.call(this, errorMessage);
|
|
84
|
+
throw error;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
async stop() {
|
|
88
|
+
if (!this.recording) {
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
try {
|
|
92
|
+
var _this$statusCallback3;
|
|
93
|
+
this.recording = false;
|
|
94
|
+
this.pausedTime = Date.now() - this.startTime;
|
|
95
|
+
|
|
96
|
+
// Stop the streaming interval
|
|
97
|
+
if (this.streamInterval) {
|
|
98
|
+
clearInterval(this.streamInterval);
|
|
99
|
+
this.streamInterval = undefined;
|
|
100
|
+
}
|
|
101
|
+
(_this$statusCallback3 = this.statusCallback) === null || _this$statusCallback3 === void 0 ? void 0 : _this$statusCallback3.call(this, false);
|
|
102
|
+
this.log('File audio simulation stopped');
|
|
103
|
+
} catch (error) {
|
|
104
|
+
var _this$errorCallback3;
|
|
105
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown stop error';
|
|
106
|
+
(_this$errorCallback3 = this.errorCallback) === null || _this$errorCallback3 === void 0 ? void 0 : _this$errorCallback3.call(this, errorMessage);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
isRecording() {
|
|
110
|
+
return this.recording;
|
|
111
|
+
}
|
|
112
|
+
onData(callback) {
|
|
113
|
+
this.dataCallback = callback;
|
|
114
|
+
}
|
|
115
|
+
onError(callback) {
|
|
116
|
+
this.errorCallback = callback;
|
|
117
|
+
}
|
|
118
|
+
onStatusChange(callback) {
|
|
119
|
+
this.statusCallback = callback;
|
|
120
|
+
}
|
|
121
|
+
async release() {
|
|
122
|
+
await this.stop();
|
|
123
|
+
this.isInitialized = false;
|
|
124
|
+
this.currentBytePosition = 0;
|
|
125
|
+
this.pausedTime = 0;
|
|
126
|
+
this.log('SimulateFileAudioStreamAdapter released');
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Start the streaming process
|
|
131
|
+
*/
|
|
132
|
+
startStreaming() {
|
|
133
|
+
if (!this.config || !this.isInitialized) {
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
const header = this.fileReader.getHeader();
|
|
137
|
+
if (!header) {
|
|
138
|
+
var _this$errorCallback4;
|
|
139
|
+
(_this$errorCallback4 = this.errorCallback) === null || _this$errorCallback4 === void 0 ? void 0 : _this$errorCallback4.call(this, 'WAV file header not available');
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// Calculate chunk size based on desired duration
|
|
144
|
+
const chunkDurationSec = (this.options.chunkDurationMs || 100) / 1000;
|
|
145
|
+
const bytesPerSecond = header.sampleRate * header.channels * (header.bitsPerSample / 8);
|
|
146
|
+
const chunkSizeBytes = Math.floor(chunkDurationSec * bytesPerSecond);
|
|
147
|
+
|
|
148
|
+
// Adjust interval timing based on playback speed
|
|
149
|
+
const intervalMs = (this.options.chunkDurationMs || 100) / (this.options.playbackSpeed || 1.0);
|
|
150
|
+
this.streamInterval = setInterval(() => {
|
|
151
|
+
if (!this.recording) {
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
try {
|
|
155
|
+
this.streamNextChunk(chunkSizeBytes);
|
|
156
|
+
} catch (error) {
|
|
157
|
+
var _this$errorCallback5;
|
|
158
|
+
const errorMessage = error instanceof Error ? error.message : 'Streaming error';
|
|
159
|
+
(_this$errorCallback5 = this.errorCallback) === null || _this$errorCallback5 === void 0 ? void 0 : _this$errorCallback5.call(this, errorMessage);
|
|
160
|
+
this.stop();
|
|
161
|
+
}
|
|
162
|
+
}, intervalMs);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Stream the next audio chunk
|
|
167
|
+
*/
|
|
168
|
+
streamNextChunk(chunkSizeBytes) {
|
|
169
|
+
if (!this.dataCallback || !this.config) {
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
const header = this.fileReader.getHeader();
|
|
173
|
+
if (!header) {
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// Get the next chunk of audio data
|
|
178
|
+
const audioChunk = this.fileReader.getAudioSlice(this.currentBytePosition, chunkSizeBytes);
|
|
179
|
+
if (!audioChunk || audioChunk.length === 0) {
|
|
180
|
+
// End of file reached
|
|
181
|
+
if (this.options.loop) {
|
|
182
|
+
// Reset to beginning for looping
|
|
183
|
+
this.currentBytePosition = 0;
|
|
184
|
+
this.startTime = Date.now();
|
|
185
|
+
this.pausedTime = 0;
|
|
186
|
+
this.hasReachedEnd = false;
|
|
187
|
+
this.log('Looping audio file simulation');
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
// Stop streaming due to no new buffer
|
|
192
|
+
this.log('Audio file simulation completed - no new buffer available');
|
|
193
|
+
this.hasReachedEnd = true;
|
|
194
|
+
|
|
195
|
+
// Call the end-of-file callback if provided
|
|
196
|
+
if (this.options.onEndOfFile) {
|
|
197
|
+
this.log('Calling onEndOfFile callback');
|
|
198
|
+
this.options.onEndOfFile();
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
// Stop the stream
|
|
202
|
+
this.stop();
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
// Update position
|
|
207
|
+
this.currentBytePosition += audioChunk.length;
|
|
208
|
+
|
|
209
|
+
// Create stream data using the original file's format
|
|
210
|
+
const streamData = {
|
|
211
|
+
data: audioChunk,
|
|
212
|
+
sampleRate: header.sampleRate,
|
|
213
|
+
channels: header.channels,
|
|
214
|
+
timestamp: Date.now()
|
|
215
|
+
};
|
|
216
|
+
|
|
217
|
+
// Send the chunk
|
|
218
|
+
this.dataCallback(streamData);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* Get current playback statistics
|
|
223
|
+
*/
|
|
224
|
+
getStatistics() {
|
|
225
|
+
const header = this.fileReader.getHeader();
|
|
226
|
+
const currentTime = this.fileReader.byteToTime(this.currentBytePosition);
|
|
227
|
+
return {
|
|
228
|
+
filePath: this.options.filePath,
|
|
229
|
+
isRecording: this.recording,
|
|
230
|
+
currentTime,
|
|
231
|
+
totalDuration: (header === null || header === void 0 ? void 0 : header.duration) || 0,
|
|
232
|
+
progress: header ? currentTime / header.duration : 0,
|
|
233
|
+
playbackSpeed: this.options.playbackSpeed,
|
|
234
|
+
currentBytePosition: this.currentBytePosition,
|
|
235
|
+
totalBytes: this.fileReader.getTotalDataSize(),
|
|
236
|
+
hasReachedEnd: this.hasReachedEnd,
|
|
237
|
+
header
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
/**
|
|
242
|
+
* Seek to a specific time position
|
|
243
|
+
*/
|
|
244
|
+
seekToTime(timeSeconds) {
|
|
245
|
+
const header = this.fileReader.getHeader();
|
|
246
|
+
if (!header) {
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
const clampedTime = Math.max(0, Math.min(timeSeconds, header.duration));
|
|
250
|
+
this.currentBytePosition = this.fileReader.timeToByte(clampedTime);
|
|
251
|
+
|
|
252
|
+
// Reset timing if we're currently playing
|
|
253
|
+
if (this.recording) {
|
|
254
|
+
this.startTime = Date.now() - clampedTime * 1000 / (this.options.playbackSpeed || 1.0);
|
|
255
|
+
this.pausedTime = 0;
|
|
256
|
+
}
|
|
257
|
+
this.log(`Seeked to ${clampedTime.toFixed(2)}s`);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* Set playback speed
|
|
262
|
+
*/
|
|
263
|
+
setPlaybackSpeed(speed) {
|
|
264
|
+
if (speed <= 0) {
|
|
265
|
+
throw new Error('Playback speed must be greater than 0');
|
|
266
|
+
}
|
|
267
|
+
this.options.playbackSpeed = speed;
|
|
268
|
+
|
|
269
|
+
// If currently playing, restart streaming with new speed
|
|
270
|
+
if (this.recording) {
|
|
271
|
+
this.stop().then(() => {
|
|
272
|
+
this.start();
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
this.log(`Playback speed set to ${speed}x`);
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
/**
|
|
279
|
+
* Reset file buffer to beginning
|
|
280
|
+
*/
|
|
281
|
+
resetBuffer() {
|
|
282
|
+
this.log('Resetting file buffer to beginning');
|
|
283
|
+
|
|
284
|
+
// Reset position and timing
|
|
285
|
+
this.currentBytePosition = 0;
|
|
286
|
+
this.startTime = Date.now();
|
|
287
|
+
this.pausedTime = 0;
|
|
288
|
+
this.hasReachedEnd = false;
|
|
289
|
+
|
|
290
|
+
// If currently playing, restart streaming from beginning
|
|
291
|
+
if (this.recording) {
|
|
292
|
+
this.log('Restarting streaming from beginning');
|
|
293
|
+
// Stop and restart to apply the reset
|
|
294
|
+
this.stop().then(() => {
|
|
295
|
+
this.start();
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
/**
|
|
301
|
+
* Logger function
|
|
302
|
+
*/
|
|
303
|
+
log(message) {
|
|
304
|
+
var _this$options$logger, _this$options;
|
|
305
|
+
(_this$options$logger = (_this$options = this.options).logger) === null || _this$options$logger === void 0 ? void 0 : _this$options$logger.call(_this$options, `[SimulateFileAudioStreamAdapter] ${message}`);
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
exports.SimulateFileAudioStreamAdapter = SimulateFileAudioStreamAdapter;
|
|
309
|
+
//# sourceMappingURL=SimulateFileAudioStreamAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_WavFileReader","require","SimulateFileAudioStreamAdapter","config","isInitialized","recording","currentBytePosition","startTime","pausedTime","hasReachedEnd","constructor","options","playbackSpeed","chunkDurationMs","loop","logger","fileReader","WavFileReader","fs","filePath","initialize","release","header","getHeader","Error","sampleRate","log","channels","bitsPerSample","duration","toFixed","error","_this$errorCallback","errorMessage","message","errorCallback","call","start","_this$statusCallback","Date","now","statusCallback","startStreaming","_this$statusCallback2","_this$errorCallback2","stop","_this$statusCallback3","streamInterval","clearInterval","undefined","_this$errorCallback3","isRecording","onData","callback","dataCallback","onError","onStatusChange","_this$errorCallback4","chunkDurationSec","bytesPerSecond","chunkSizeBytes","Math","floor","intervalMs","setInterval","streamNextChunk","_this$errorCallback5","audioChunk","getAudioSlice","length","onEndOfFile","streamData","data","timestamp","getStatistics","currentTime","byteToTime","totalDuration","progress","totalBytes","getTotalDataSize","seekToTime","timeSeconds","clampedTime","max","min","timeToByte","setPlaybackSpeed","speed","then","resetBuffer","_this$options$logger","_this$options","exports"],"sourceRoot":"../../../../src","sources":["realtime-transcription/adapters/SimulateFileAudioStreamAdapter.ts"],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
Object.defineProperty(exports, "RealtimeTranscriber", {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: function () {
|
|
9
|
+
return _RealtimeTranscriber.RealtimeTranscriber;
|
|
10
|
+
}
|
|
11
|
+
});
|
|
12
|
+
Object.defineProperty(exports, "SliceManager", {
|
|
13
|
+
enumerable: true,
|
|
14
|
+
get: function () {
|
|
15
|
+
return _SliceManager.SliceManager;
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
Object.defineProperty(exports, "VAD_PRESETS", {
|
|
19
|
+
enumerable: true,
|
|
20
|
+
get: function () {
|
|
21
|
+
return _types.VAD_PRESETS;
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
var _RealtimeTranscriber = require("./RealtimeTranscriber");
|
|
25
|
+
var _SliceManager = require("./SliceManager");
|
|
26
|
+
var _types = require("./types");
|
|
27
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_RealtimeTranscriber","require","_SliceManager","_types"],"sourceRoot":"../../../src","sources":["realtime-transcription/index.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AACA,IAAAA,oBAAA,GAAAC,OAAA;AAGA,IAAAC,aAAA,GAAAD,OAAA;AA6BA,IAAAE,MAAA,GAAAF,OAAA"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.VAD_PRESETS = void 0;
|
|
7
|
+
// === Audio Stream Interfaces ===
|
|
8
|
+
|
|
9
|
+
// === Enhanced VAD Options ===
|
|
10
|
+
|
|
11
|
+
// Pre-defined VAD configurations for different use cases
|
|
12
|
+
/**
|
|
13
|
+
* VAD Presets Overview:
|
|
14
|
+
*
|
|
15
|
+
* VAD Presets
|
|
16
|
+
* / | \
|
|
17
|
+
* Conservative Default Sensitive
|
|
18
|
+
* / | | \
|
|
19
|
+
* conservative very-conservative sensitive very-sensitive
|
|
20
|
+
* (0.7 thresh) (0.8 thresh) (0.3 thresh) (0.2 thresh)
|
|
21
|
+
* 500ms min 750ms min 100ms min 100ms min
|
|
22
|
+
* Clear speech Very clear Quiet env Catches whispers
|
|
23
|
+
*
|
|
24
|
+
* Specialized Presets
|
|
25
|
+
* / | \
|
|
26
|
+
* continuous meeting noisy
|
|
27
|
+
* (60s max) (45s max) (0.75 thresh)
|
|
28
|
+
* Lectures Multi-spk Strict for noise
|
|
29
|
+
*
|
|
30
|
+
* Key Parameters:
|
|
31
|
+
* - threshold: 0.0-1.0 (lower = more sensitive)
|
|
32
|
+
* - minSpeechDurationMs: Min duration to consider speech
|
|
33
|
+
* - minSilenceDurationMs: Min silence before ending speech
|
|
34
|
+
* - maxSpeechDurationS: Max continuous speech duration
|
|
35
|
+
* - speechPadMs: Padding around detected speech
|
|
36
|
+
* - samplesOverlap: Analysis window overlap (0.0-1.0)
|
|
37
|
+
*/
|
|
38
|
+
const VAD_PRESETS = {
|
|
39
|
+
// Default - balanced performance
|
|
40
|
+
default: {
|
|
41
|
+
threshold: 0.5,
|
|
42
|
+
minSpeechDurationMs: 250,
|
|
43
|
+
minSilenceDurationMs: 100,
|
|
44
|
+
maxSpeechDurationS: 30,
|
|
45
|
+
speechPadMs: 30,
|
|
46
|
+
samplesOverlap: 0.1
|
|
47
|
+
},
|
|
48
|
+
// Sensitive - good for quiet environments
|
|
49
|
+
sensitive: {
|
|
50
|
+
threshold: 0.3,
|
|
51
|
+
minSpeechDurationMs: 100,
|
|
52
|
+
minSilenceDurationMs: 50,
|
|
53
|
+
maxSpeechDurationS: 15,
|
|
54
|
+
speechPadMs: 50,
|
|
55
|
+
samplesOverlap: 0.2
|
|
56
|
+
},
|
|
57
|
+
// Very sensitive - catches even quiet speech
|
|
58
|
+
'very-sensitive': {
|
|
59
|
+
threshold: 0.2,
|
|
60
|
+
minSpeechDurationMs: 100,
|
|
61
|
+
minSilenceDurationMs: 50,
|
|
62
|
+
maxSpeechDurationS: 15,
|
|
63
|
+
speechPadMs: 100,
|
|
64
|
+
samplesOverlap: 0.3
|
|
65
|
+
},
|
|
66
|
+
// Conservative - avoids false positives
|
|
67
|
+
conservative: {
|
|
68
|
+
threshold: 0.7,
|
|
69
|
+
minSpeechDurationMs: 500,
|
|
70
|
+
minSilenceDurationMs: 200,
|
|
71
|
+
maxSpeechDurationS: 25,
|
|
72
|
+
speechPadMs: 20,
|
|
73
|
+
samplesOverlap: 0.05
|
|
74
|
+
},
|
|
75
|
+
// Very conservative - only clear speech
|
|
76
|
+
'very-conservative': {
|
|
77
|
+
threshold: 0.8,
|
|
78
|
+
minSpeechDurationMs: 750,
|
|
79
|
+
minSilenceDurationMs: 300,
|
|
80
|
+
maxSpeechDurationS: 20,
|
|
81
|
+
speechPadMs: 10,
|
|
82
|
+
samplesOverlap: 0.05
|
|
83
|
+
},
|
|
84
|
+
// Continuous speech - for presentations/lectures
|
|
85
|
+
continuous: {
|
|
86
|
+
threshold: 0.4,
|
|
87
|
+
minSpeechDurationMs: 200,
|
|
88
|
+
minSilenceDurationMs: 300,
|
|
89
|
+
maxSpeechDurationS: 60,
|
|
90
|
+
// Longer segments
|
|
91
|
+
speechPadMs: 50,
|
|
92
|
+
samplesOverlap: 0.15
|
|
93
|
+
},
|
|
94
|
+
// Meeting mode - handles multiple speakers
|
|
95
|
+
meeting: {
|
|
96
|
+
threshold: 0.45,
|
|
97
|
+
minSpeechDurationMs: 300,
|
|
98
|
+
minSilenceDurationMs: 150,
|
|
99
|
+
maxSpeechDurationS: 45,
|
|
100
|
+
speechPadMs: 75,
|
|
101
|
+
samplesOverlap: 0.2
|
|
102
|
+
},
|
|
103
|
+
// Noisy environment - more strict thresholds
|
|
104
|
+
noisy: {
|
|
105
|
+
threshold: 0.75,
|
|
106
|
+
minSpeechDurationMs: 400,
|
|
107
|
+
minSilenceDurationMs: 100,
|
|
108
|
+
maxSpeechDurationS: 25,
|
|
109
|
+
speechPadMs: 40,
|
|
110
|
+
samplesOverlap: 0.1
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
exports.VAD_PRESETS = VAD_PRESETS;
|
|
114
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["VAD_PRESETS","default","threshold","minSpeechDurationMs","minSilenceDurationMs","maxSpeechDurationS","speechPadMs","samplesOverlap","sensitive","conservative","continuous","meeting","noisy","exports"],"sourceRoot":"../../../src","sources":["realtime-transcription/types.ts"],"mappings":";;;;;;AAGA;;AA4BA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMA,WAAW,GAAG;EACzB;EACAC,OAAO,EAAE;IACPC,SAAS,EAAE,GAAG;IACdC,mBAAmB,EAAE,GAAG;IACxBC,oBAAoB,EAAE,GAAG;IACzBC,kBAAkB,EAAE,EAAE;IACtBC,WAAW,EAAE,EAAE;IACfC,cAAc,EAAE;EAClB,CAAC;EAED;EACAC,SAAS,EAAE;IACTN,SAAS,EAAE,GAAG;IACdC,mBAAmB,EAAE,GAAG;IACxBC,oBAAoB,EAAE,EAAE;IACxBC,kBAAkB,EAAE,EAAE;IACtBC,WAAW,EAAE,EAAE;IACfC,cAAc,EAAE;EAClB,CAAC;EAED;EACA,gBAAgB,EAAE;IAChBL,SAAS,EAAE,GAAG;IACdC,mBAAmB,EAAE,GAAG;IACxBC,oBAAoB,EAAE,EAAE;IACxBC,kBAAkB,EAAE,EAAE;IACtBC,WAAW,EAAE,GAAG;IAChBC,cAAc,EAAE;EAClB,CAAC;EAED;EACAE,YAAY,EAAE;IACZP,SAAS,EAAE,GAAG;IACdC,mBAAmB,EAAE,GAAG;IACxBC,oBAAoB,EAAE,GAAG;IACzBC,kBAAkB,EAAE,EAAE;IACtBC,WAAW,EAAE,EAAE;IACfC,cAAc,EAAE;EAClB,CAAC;EAED;EACA,mBAAmB,EAAE;IACnBL,SAAS,EAAE,GAAG;IACdC,mBAAmB,EAAE,GAAG;IACxBC,oBAAoB,EAAE,GAAG;IACzBC,kBAAkB,EAAE,EAAE;IACtBC,WAAW,EAAE,EAAE;IACfC,cAAc,EAAE;EAClB,CAAC;EAED;EACAG,UAAU,EAAE;IACVR,SAAS,EAAE,GAAG;IACdC,mBAAmB,EAAE,GAAG;IACxBC,oBAAoB,EAAE,GAAG;IACzBC,kBAAkB,EAAE,EAAE;IAAE;IACxBC,WAAW,EAAE,EAAE;IACfC,cAAc,EAAE;EAClB,CAAC;EAED;EACAI,OAAO,EAAE;IACPT,SAAS,EAAE,IAAI;IACfC,mBAAmB,EAAE,GAAG;IACxBC,oBAAoB,EAAE,GAAG;IACzBC,kBAAkB,EAAE,EAAE;IACtBC,WAAW,EAAE,EAAE;IACfC,cAAc,EAAE;EAClB,CAAC;EAED;EACAK,KAAK,EAAE;IACLV,SAAS,EAAE,IAAI;IACfC,mBAAmB,EAAE,GAAG;IACxBC,oBAAoB,EAAE,GAAG;IACzBC,kBAAkB,EAAE,EAAE;IACtBC,WAAW,EAAE,EAAE;IACfC,cAAc,EAAE;EAClB;AACF,CAAC;AAAAM,OAAA,CAAAb,WAAA,GAAAA,WAAA"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.WavFileReader = void 0;
|
|
7
|
+
var _common = require("./common");
|
|
8
|
+
class WavFileReader {
|
|
9
|
+
header = null;
|
|
10
|
+
audioData = null;
|
|
11
|
+
constructor(fs, filePath) {
|
|
12
|
+
this.fs = fs;
|
|
13
|
+
this.filePath = filePath;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Read and parse the WAV file
|
|
18
|
+
*/
|
|
19
|
+
async initialize() {
|
|
20
|
+
try {
|
|
21
|
+
// Check if file exists
|
|
22
|
+
const exists = await this.fs.exists(this.filePath);
|
|
23
|
+
if (!exists) {
|
|
24
|
+
throw new Error(`WAV file not found: ${this.filePath}`);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// Read the entire file
|
|
28
|
+
const fileContent = await this.fs.readFile(this.filePath, 'base64');
|
|
29
|
+
const fileData = (0, _common.base64ToUint8Array)(fileContent);
|
|
30
|
+
|
|
31
|
+
// Parse WAV header
|
|
32
|
+
this.header = WavFileReader.parseWavHeader(fileData);
|
|
33
|
+
|
|
34
|
+
// Extract audio data (skip the 44-byte header)
|
|
35
|
+
this.audioData = fileData.slice(44, 44 + this.header.dataSize);
|
|
36
|
+
console.log(`WAV file loaded: ${this.header.duration.toFixed(2)}s, ${this.header.sampleRate}Hz, ${this.header.channels}ch`);
|
|
37
|
+
} catch (error) {
|
|
38
|
+
throw new Error(`Failed to initialize WAV file reader: ${error}`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Parse WAV file header
|
|
44
|
+
*/
|
|
45
|
+
static parseWavHeader(data) {
|
|
46
|
+
const view = new DataView(data.buffer, data.byteOffset, data.byteLength);
|
|
47
|
+
|
|
48
|
+
// Verify RIFF header
|
|
49
|
+
const riffHeader = String.fromCharCode(...data.slice(0, 4));
|
|
50
|
+
if (riffHeader !== 'RIFF') {
|
|
51
|
+
throw new Error('Invalid WAV file: Missing RIFF header');
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Verify WAVE format
|
|
55
|
+
const waveHeader = String.fromCharCode(...data.slice(8, 12));
|
|
56
|
+
if (waveHeader !== 'WAVE') {
|
|
57
|
+
throw new Error('Invalid WAV file: Missing WAVE header');
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Read format chunk
|
|
61
|
+
const fmtHeader = String.fromCharCode(...data.slice(12, 16));
|
|
62
|
+
if (fmtHeader !== 'fmt ') {
|
|
63
|
+
throw new Error('Invalid WAV file: Missing fmt chunk');
|
|
64
|
+
}
|
|
65
|
+
const audioFormat = view.getUint16(20, true);
|
|
66
|
+
if (audioFormat !== 1) {
|
|
67
|
+
throw new Error('Unsupported WAV format: Only PCM is supported');
|
|
68
|
+
}
|
|
69
|
+
const channels = view.getUint16(22, true);
|
|
70
|
+
const sampleRate = view.getUint32(24, true);
|
|
71
|
+
const bitsPerSample = view.getUint16(34, true);
|
|
72
|
+
|
|
73
|
+
// Find data chunk
|
|
74
|
+
let dataOffset = 36;
|
|
75
|
+
while (dataOffset < data.length - 8) {
|
|
76
|
+
const chunkId = String.fromCharCode(...data.slice(dataOffset, dataOffset + 4));
|
|
77
|
+
const chunkSize = view.getUint32(dataOffset + 4, true);
|
|
78
|
+
if (chunkId === 'data') {
|
|
79
|
+
const dataSize = chunkSize;
|
|
80
|
+
const duration = dataSize / (sampleRate * channels * (bitsPerSample / 8));
|
|
81
|
+
return {
|
|
82
|
+
sampleRate,
|
|
83
|
+
channels,
|
|
84
|
+
bitsPerSample,
|
|
85
|
+
dataSize,
|
|
86
|
+
duration
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
dataOffset += 8 + chunkSize;
|
|
90
|
+
}
|
|
91
|
+
throw new Error('Invalid WAV file: Missing data chunk');
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Get audio data slice
|
|
96
|
+
*/
|
|
97
|
+
getAudioSlice(startByte, lengthBytes) {
|
|
98
|
+
if (!this.audioData) {
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
const start = Math.max(0, startByte);
|
|
102
|
+
const end = Math.min(this.audioData.length, startByte + lengthBytes);
|
|
103
|
+
if (start >= end) {
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
return this.audioData.slice(start, end);
|
|
107
|
+
}
|
|
108
|
+
getAudioData() {
|
|
109
|
+
return this.audioData;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Get WAV file header information
|
|
114
|
+
*/
|
|
115
|
+
getHeader() {
|
|
116
|
+
return this.header;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Get total audio data size
|
|
121
|
+
*/
|
|
122
|
+
getTotalDataSize() {
|
|
123
|
+
var _this$header;
|
|
124
|
+
return ((_this$header = this.header) === null || _this$header === void 0 ? void 0 : _this$header.dataSize) || 0;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Convert byte position to time in seconds
|
|
129
|
+
*/
|
|
130
|
+
byteToTime(bytePosition) {
|
|
131
|
+
if (!this.header) return 0;
|
|
132
|
+
const bytesPerSecond = this.header.sampleRate * this.header.channels * (this.header.bitsPerSample / 8);
|
|
133
|
+
return bytePosition / bytesPerSecond;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Convert time in seconds to byte position
|
|
138
|
+
*/
|
|
139
|
+
timeToByte(timeSeconds) {
|
|
140
|
+
if (!this.header) return 0;
|
|
141
|
+
const bytesPerSecond = this.header.sampleRate * this.header.channels * (this.header.bitsPerSample / 8);
|
|
142
|
+
return Math.floor(timeSeconds * bytesPerSecond);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Get file statistics
|
|
147
|
+
*/
|
|
148
|
+
getStatistics() {
|
|
149
|
+
return {
|
|
150
|
+
filePath: this.filePath,
|
|
151
|
+
header: this.header,
|
|
152
|
+
totalDataSize: this.getTotalDataSize(),
|
|
153
|
+
isInitialized: !!this.header
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
exports.WavFileReader = WavFileReader;
|
|
158
|
+
//# sourceMappingURL=WavFileReader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_common","require","WavFileReader","header","audioData","constructor","fs","filePath","initialize","exists","Error","fileContent","readFile","fileData","base64ToUint8Array","parseWavHeader","slice","dataSize","console","log","duration","toFixed","sampleRate","channels","error","data","view","DataView","buffer","byteOffset","byteLength","riffHeader","String","fromCharCode","waveHeader","fmtHeader","audioFormat","getUint16","getUint32","bitsPerSample","dataOffset","length","chunkId","chunkSize","getAudioSlice","startByte","lengthBytes","start","Math","max","end","min","getAudioData","getHeader","getTotalDataSize","_this$header","byteToTime","bytePosition","bytesPerSecond","timeToByte","timeSeconds","floor","getStatistics","totalDataSize","isInitialized","exports"],"sourceRoot":"../../../src","sources":["utils/WavFileReader.ts"],"mappings":";;;;;;AAAA,IAAAA,OAAA,GAAAC,OAAA;AAgBO,MAAMC,aAAa,CAAC;EAGjBC,MAAM,GAAyB,IAAI;EAEnCC,SAAS,GAAsB,IAAI;EAO3CC,WAAWA,CAACC,EAGX,EAAEC,QAAgB,EAAE;IACnB,IAAI,CAACD,EAAE,GAAGA,EAAE;IACZ,IAAI,CAACC,QAAQ,GAAGA,QAAQ;EAC1B;;EAEA;AACF;AACA;EACE,MAAMC,UAAUA,CAAA,EAAkB;IAChC,IAAI;MACF;MACA,MAAMC,MAAM,GAAG,MAAM,IAAI,CAACH,EAAE,CAACG,MAAM,CAAC,IAAI,CAACF,QAAQ,CAAC;MAClD,IAAI,CAACE,MAAM,EAAE;QACX,MAAM,IAAIC,KAAK,CAAE,uBAAsB,IAAI,CAACH,QAAS,EAAC,CAAC;MACzD;;MAEA;MACA,MAAMI,WAAW,GAAG,MAAM,IAAI,CAACL,EAAE,CAACM,QAAQ,CAAC,IAAI,CAACL,QAAQ,EAAE,QAAQ,CAAC;MACnE,MAAMM,QAAQ,GAAG,IAAAC,0BAAkB,EAACH,WAAW,CAAC;;MAEhD;MACA,IAAI,CAACR,MAAM,GAAGD,aAAa,CAACa,cAAc,CAACF,QAAQ,CAAC;;MAEpD;MACA,IAAI,CAACT,SAAS,GAAGS,QAAQ,CAACG,KAAK,CAAC,EAAE,EAAE,EAAE,GAAG,IAAI,CAACb,MAAM,CAACc,QAAQ,CAAC;MAE9DC,OAAO,CAACC,GAAG,CACR,oBAAmB,IAAI,CAAChB,MAAM,CAACiB,QAAQ,CAACC,OAAO,CAAC,CAAC,CAAE,MAClD,IAAI,CAAClB,MAAM,CAACmB,UACb,OAAM,IAAI,CAACnB,MAAM,CAACoB,QAAS,IAAG,CAChC;IACH,CAAC,CAAC,OAAOC,KAAK,EAAE;MACd,MAAM,IAAId,KAAK,CAAE,yCAAwCc,KAAM,EAAC,CAAC;IACnE;EACF;;EAEA;AACF;AACA;EACE,OAAeT,cAAcA,CAACU,IAAgB,EAAiB;IAC7D,MAAMC,IAAI,GAAG,IAAIC,QAAQ,CAACF,IAAI,CAACG,MAAM,EAAEH,IAAI,CAACI,UAAU,EAAEJ,IAAI,CAACK,UAAU,CAAC;;IAExE;IACA,MAAMC,UAAU,GAAGC,MAAM,CAACC,YAAY,CAAC,GAAGR,IAAI,CAACT,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3D,IAAIe,UAAU,KAAK,MAAM,EAAE;MACzB,MAAM,IAAIrB,KAAK,CAAC,uCAAuC,CAAC;IAC1D;;IAEA;IACA,MAAMwB,UAAU,GAAGF,MAAM,CAACC,YAAY,CAAC,GAAGR,IAAI,CAACT,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC5D,IAAIkB,UAAU,KAAK,MAAM,EAAE;MACzB,MAAM,IAAIxB,KAAK,CAAC,uCAAuC,CAAC;IAC1D;;IAEA;IACA,MAAMyB,SAAS,GAAGH,MAAM,CAACC,YAAY,CAAC,GAAGR,IAAI,CAACT,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAC5D,IAAImB,SAAS,KAAK,MAAM,EAAE;MACxB,MAAM,IAAIzB,KAAK,CAAC,qCAAqC,CAAC;IACxD;IAEA,MAAM0B,WAAW,GAAGV,IAAI,CAACW,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC;IAC5C,IAAID,WAAW,KAAK,CAAC,EAAE;MACrB,MAAM,IAAI1B,KAAK,CAAC,+CAA+C,CAAC;IAClE;IAEA,MAAMa,QAAQ,GAAGG,IAAI,CAACW,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC;IACzC,MAAMf,UAAU,GAAGI,IAAI,CAACY,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC;IAC3C,MAAMC,aAAa,GAAGb,IAAI,CAACW,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC;;IAE9C;IACA,IAAIG,UAAU,GAAG,EAAE;IACnB,OAAOA,UAAU,GAAGf,IAAI,CAACgB,MAAM,GAAG,CAAC,EAAE;MACnC,MAAMC,OAAO,GAAGV,MAAM,CAACC,YAAY,CACjC,GAAGR,IAAI,CAACT,KAAK,CAACwB,UAAU,EAAEA,UAAU,GAAG,CAAC,CAAC,CAC1C;MACD,MAAMG,SAAS,GAAGjB,IAAI,CAACY,SAAS,CAACE,UAAU,GAAG,CAAC,EAAE,IAAI,CAAC;MAEtD,IAAIE,OAAO,KAAK,MAAM,EAAE;QACtB,MAAMzB,QAAQ,GAAG0B,SAAS;QAC1B,MAAMvB,QAAQ,GACZH,QAAQ,IAAIK,UAAU,GAAGC,QAAQ,IAAIgB,aAAa,GAAG,CAAC,CAAC,CAAC;QAE1D,OAAO;UACLjB,UAAU;UACVC,QAAQ;UACRgB,aAAa;UACbtB,QAAQ;UACRG;QACF,CAAC;MACH;MAEAoB,UAAU,IAAI,CAAC,GAAGG,SAAS;IAC7B;IAEA,MAAM,IAAIjC,KAAK,CAAC,sCAAsC,CAAC;EACzD;;EAEA;AACF;AACA;EACEkC,aAAaA,CAACC,SAAiB,EAAEC,WAAmB,EAAqB;IACvE,IAAI,CAAC,IAAI,CAAC1C,SAAS,EAAE;MACnB,OAAO,IAAI;IACb;IAEA,MAAM2C,KAAK,GAAGC,IAAI,CAACC,GAAG,CAAC,CAAC,EAAEJ,SAAS,CAAC;IACpC,MAAMK,GAAG,GAAGF,IAAI,CAACG,GAAG,CAAC,IAAI,CAAC/C,SAAS,CAACqC,MAAM,EAAEI,SAAS,GAAGC,WAAW,CAAC;IAEpE,IAAIC,KAAK,IAAIG,GAAG,EAAE;MAChB,OAAO,IAAI;IACb;IAEA,OAAO,IAAI,CAAC9C,SAAS,CAACY,KAAK,CAAC+B,KAAK,EAAEG,GAAG,CAAC;EACzC;EAEAE,YAAYA,CAAA,EAAsB;IAChC,OAAO,IAAI,CAAChD,SAAS;EACvB;;EAEA;AACF;AACA;EACEiD,SAASA,CAAA,EAAyB;IAChC,OAAO,IAAI,CAAClD,MAAM;EACpB;;EAEA;AACF;AACA;EACEmD,gBAAgBA,CAAA,EAAW;IAAA,IAAAC,YAAA;IACzB,OAAO,EAAAA,YAAA,OAAI,CAACpD,MAAM,cAAAoD,YAAA,uBAAXA,YAAA,CAAatC,QAAQ,KAAI,CAAC;EACnC;;EAEA;AACF;AACA;EACEuC,UAAUA,CAACC,YAAoB,EAAU;IACvC,IAAI,CAAC,IAAI,CAACtD,MAAM,EAAE,OAAO,CAAC;IAE1B,MAAMuD,cAAc,GAClB,IAAI,CAACvD,MAAM,CAACmB,UAAU,GACtB,IAAI,CAACnB,MAAM,CAACoB,QAAQ,IACnB,IAAI,CAACpB,MAAM,CAACoC,aAAa,GAAG,CAAC,CAAC;IACjC,OAAOkB,YAAY,GAAGC,cAAc;EACtC;;EAEA;AACF;AACA;EACEC,UAAUA,CAACC,WAAmB,EAAU;IACtC,IAAI,CAAC,IAAI,CAACzD,MAAM,EAAE,OAAO,CAAC;IAE1B,MAAMuD,cAAc,GAClB,IAAI,CAACvD,MAAM,CAACmB,UAAU,GACtB,IAAI,CAACnB,MAAM,CAACoB,QAAQ,IACnB,IAAI,CAACpB,MAAM,CAACoC,aAAa,GAAG,CAAC,CAAC;IACjC,OAAOS,IAAI,CAACa,KAAK,CAACD,WAAW,GAAGF,cAAc,CAAC;EACjD;;EAEA;AACF;AACA;EACEI,aAAaA,CAAA,EAAG;IACd,OAAO;MACLvD,QAAQ,EAAE,IAAI,CAACA,QAAQ;MACvBJ,MAAM,EAAE,IAAI,CAACA,MAAM;MACnB4D,aAAa,EAAE,IAAI,CAACT,gBAAgB,EAAE;MACtCU,aAAa,EAAE,CAAC,CAAC,IAAI,CAAC7D;IACxB,CAAC;EACH;AACF;AAAC8D,OAAA,CAAA/D,aAAA,GAAAA,aAAA"}
|