@siteed/audio-studio 3.0.2 → 3.0.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/CHANGELOG.md +9 -1
- package/android/src/main/java/net/siteed/audiostudio/AudioStudioModule.kt +7 -1
- package/build/cjs/AudioAnalysis/AudioAnalysis.types.js.map +1 -1
- package/build/cjs/AudioAnalysis/audioFeaturesWasm.js +10 -7
- package/build/cjs/AudioAnalysis/audioFeaturesWasm.js.map +1 -1
- package/build/cjs/AudioAnalysis/audioFeaturesWasm.web.js +78 -97
- package/build/cjs/AudioAnalysis/audioFeaturesWasm.web.js.map +1 -1
- package/build/cjs/AudioAnalysis/extractAudioAnalysis.js +15 -12
- package/build/cjs/AudioAnalysis/extractAudioAnalysis.js.map +1 -1
- package/build/cjs/AudioAnalysis/extractAudioData.js +144 -2
- package/build/cjs/AudioAnalysis/extractAudioData.js.map +1 -1
- package/build/cjs/AudioAnalysis/melSpectrogramWasm.web.js +9 -56
- package/build/cjs/AudioAnalysis/melSpectrogramWasm.web.js.map +1 -1
- package/build/cjs/AudioAnalysis/wasmConfig.js +4 -4
- package/build/cjs/AudioAnalysis/wasmConfig.js.map +1 -1
- package/build/cjs/AudioAnalysis/wasmLoader.web.js +78 -0
- package/build/cjs/AudioAnalysis/wasmLoader.web.js.map +1 -0
- package/build/cjs/AudioStudioModule.js +4 -599
- package/build/cjs/AudioStudioModule.js.map +1 -1
- package/build/cjs/trimAudio.js +227 -0
- package/build/cjs/trimAudio.js.map +1 -1
- package/build/cjs/utils/encodeCompressedAudio.web.js +65 -0
- package/build/cjs/utils/encodeCompressedAudio.web.js.map +1 -0
- package/build/cjs/utils/resampleAudioBuffer.web.js +25 -0
- package/build/cjs/utils/resampleAudioBuffer.web.js.map +1 -0
- package/build/esm/AudioAnalysis/AudioAnalysis.types.js.map +1 -1
- package/build/esm/AudioAnalysis/audioFeaturesWasm.js +8 -5
- package/build/esm/AudioAnalysis/audioFeaturesWasm.js.map +1 -1
- package/build/esm/AudioAnalysis/audioFeaturesWasm.web.js +76 -62
- package/build/esm/AudioAnalysis/audioFeaturesWasm.web.js.map +1 -1
- package/build/esm/AudioAnalysis/extractAudioAnalysis.js +15 -12
- package/build/esm/AudioAnalysis/extractAudioAnalysis.js.map +1 -1
- package/build/esm/AudioAnalysis/extractAudioData.js +144 -2
- package/build/esm/AudioAnalysis/extractAudioData.js.map +1 -1
- package/build/esm/AudioAnalysis/melSpectrogramWasm.web.js +9 -23
- package/build/esm/AudioAnalysis/melSpectrogramWasm.web.js.map +1 -1
- package/build/esm/AudioAnalysis/wasmConfig.js +4 -4
- package/build/esm/AudioAnalysis/wasmConfig.js.map +1 -1
- package/build/esm/AudioAnalysis/wasmLoader.web.js +42 -0
- package/build/esm/AudioAnalysis/wasmLoader.web.js.map +1 -0
- package/build/esm/AudioStudioModule.js +4 -596
- package/build/esm/AudioStudioModule.js.map +1 -1
- package/build/esm/trimAudio.js +227 -0
- package/build/esm/trimAudio.js.map +1 -1
- package/build/esm/utils/encodeCompressedAudio.web.js +62 -0
- package/build/esm/utils/encodeCompressedAudio.web.js.map +1 -0
- package/build/esm/utils/resampleAudioBuffer.web.js +22 -0
- package/build/esm/utils/resampleAudioBuffer.web.js.map +1 -0
- package/build/types/AudioAnalysis/AudioAnalysis.types.d.ts +11 -0
- package/build/types/AudioAnalysis/AudioAnalysis.types.d.ts.map +1 -1
- package/build/types/AudioAnalysis/audioFeaturesWasm.d.ts +5 -9
- package/build/types/AudioAnalysis/audioFeaturesWasm.d.ts.map +1 -1
- package/build/types/AudioAnalysis/audioFeaturesWasm.web.d.ts +35 -16
- package/build/types/AudioAnalysis/audioFeaturesWasm.web.d.ts.map +1 -1
- package/build/types/AudioAnalysis/extractAudioAnalysis.d.ts.map +1 -1
- package/build/types/AudioAnalysis/extractAudioData.d.ts +2 -2
- package/build/types/AudioAnalysis/extractAudioData.d.ts.map +1 -1
- package/build/types/AudioAnalysis/melSpectrogramWasm.web.d.ts.map +1 -1
- package/build/types/AudioAnalysis/wasmLoader.web.d.ts +3 -0
- package/build/types/AudioAnalysis/wasmLoader.web.d.ts.map +1 -0
- package/build/types/AudioStudioModule.d.ts.map +1 -1
- package/build/types/trimAudio.d.ts.map +1 -1
- package/build/types/utils/encodeCompressedAudio.web.d.ts +10 -0
- package/build/types/utils/encodeCompressedAudio.web.d.ts.map +1 -0
- package/build/types/utils/resampleAudioBuffer.web.d.ts +2 -0
- package/build/types/utils/resampleAudioBuffer.web.d.ts.map +1 -0
- package/package.json +1 -1
- package/src/AudioAnalysis/AudioAnalysis.types.ts +12 -0
- package/src/AudioAnalysis/audioFeaturesWasm.ts +17 -22
- package/src/AudioAnalysis/audioFeaturesWasm.web.ts +102 -94
- package/src/AudioAnalysis/extractAudioAnalysis.ts +23 -20
- package/src/AudioAnalysis/extractAudioData.ts +186 -4
- package/src/AudioAnalysis/melSpectrogramWasm.web.ts +10 -27
- package/src/AudioAnalysis/wasmConfig.ts +4 -4
- package/src/AudioAnalysis/wasmLoader.web.ts +48 -0
- package/src/AudioStudioModule.ts +6 -854
- package/src/trimAudio.ts +337 -0
- package/src/utils/encodeCompressedAudio.web.ts +78 -0
- package/src/utils/resampleAudioBuffer.web.ts +39 -0
- package/build/cjs/AudioAnalysis/extractWaveform.js +0 -18
- package/build/cjs/AudioAnalysis/extractWaveform.js.map +0 -1
- package/build/esm/AudioAnalysis/extractWaveform.js +0 -11
- package/build/esm/AudioAnalysis/extractWaveform.js.map +0 -1
- package/build/types/AudioAnalysis/extractWaveform.d.ts +0 -8
- package/build/types/AudioAnalysis/extractWaveform.d.ts.map +0 -1
- package/src/AudioAnalysis/extractWaveform.ts +0 -22
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AudioAnalysis.types.d.ts","sourceRoot":"","sources":["../../../src/AudioAnalysis/AudioAnalysis.types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AudioAnalysis.types.d.ts","sourceRoot":"","sources":["../../../src/AudioAnalysis/AudioAnalysis.types.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAE5D;;GAEG;AACH,MAAM,WAAW,cAAc;IAC3B,6DAA6D;IAC7D,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,kDAAkD;IAClD,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,yCAAyC;IACzC,cAAc,CAAC,EAAE,QAAQ,CAAA;IACzB,0DAA0D;IAC1D,cAAc,CAAC,EAAE,OAAO,CAAA;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC3B,QAAQ,EAAE,OAAO,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;CAMrB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;IACrB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;IACzB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC3B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;CACjB;AAED;;;;GAIG;AACH,MAAM,WAAW,oBAAoB;IAEjC,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,GAAG,CAAC,EAAE,OAAO,CAAA;IACb,GAAG,CAAC,EAAE,OAAO,CAAA;IAGb,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,GAAG,CAAC,EAAE,OAAO,CAAA;IACb,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,KAAK,CAAC,EAAE,OAAO,CAAA;IAGf,KAAK,CAAC,EAAE,OAAO,CAAA;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACtB,EAAE,EAAE,MAAM,CAAA;IACV,SAAS,EAAE,MAAM,CAAA;IACjB,GAAG,EAAE,MAAM,CAAA;IACX,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,OAAO,CAAA;IACf,QAAQ,CAAC,EAAE,aAAa,CAAA;IACxB,MAAM,CAAC,EAAE,cAAc,CAAA;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,CAAA;IAEhB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,WAAW,CAAC,EAAE,MAAM,CAAA;IAEpB,OAAO,CAAC,EAAE,MAAM,CAAA;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC1B,iBAAiB,EAAE,MAAM,CAAA;IACzB,UAAU,EAAE,MAAM,CAAA;IAClB;;;;;;;;;;;;;OAaG;IACH,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,gBAAgB,EAAE,MAAM,CAAA;IACxB,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,SAAS,EAAE,CAAA;IACvB,cAAc,EAAE;QACZ,GAAG,EAAE,MAAM,CAAA;QACX,GAAG,EAAE,MAAM,CAAA;KACd,CAAA;IACD,QAAQ,EAAE;QACN,GAAG,EAAE,MAAM,CAAA;QACX,GAAG,EAAE,MAAM,CAAA;KACd,CAAA;IACD,gBAAgB,EAAE,MAAM,CAAA;IAExB,cAAc,CAAC,EAAE;QACb,cAAc,EAAE;YACZ,SAAS,EAAE,MAAM,CAAA;YACjB,SAAS,EAAE,MAAM,CAAA;SACpB,EAAE,CAAA;KAKN,CAAA;CACJ;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAC9B,iCAAiC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,+BAA+B;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAA;CACrB;AAED;;;GAGG;AACH,MAAM,WAAW,cAAe,SAAQ,iBAAiB;IACrD,uCAAuC;IACvC,OAAO,EAAE,MAAM,CAAA;IACf;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB;;OAEG;IACH,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB;;;;;;;OAOG;IACH,eAAe,CAAC,EAAE,cAAc,CAAA;CACnC;AAED;;;;;GAKG;AACH,MAAM,WAAW,4BAA4B;IACzC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,WAAW,CAAC,EAAE,WAAW,CAAA;IACzB,YAAY,EAAE,MAAM,CAAA;IACpB,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC/B,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,eAAe,CAAC,EAAE,cAAc,CAAA;IAChC,6FAA6F;IAC7F,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,iGAAiG;IACjG,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,WAAW,CAAA;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACpC,gBAAgB,EAAE,MAAM,CAAA;IACxB,gBAAgB,EAAE,MAAM,CAAA;IACxB,eAAe,EAAE,MAAM,CAAA;IACvB,iBAAiB,EAAE,MAAM,CAAA;IACzB,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,UAAU,EAAE,MAAM,EAAE,CAAA;CACvB;AAED;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC3B,WAAW,EAAE,MAAM,EAAE,EAAE,CAAA;IACvB,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;CACrB"}
|
|
@@ -1,12 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
mfcc: number[];
|
|
7
|
-
chromagram: number[];
|
|
1
|
+
import type { AudioFeaturesWasmResult } from './AudioAnalysis.types';
|
|
2
|
+
export declare class AudioFeaturesStreamingSession {
|
|
3
|
+
static create(_sampleRate: number, _fftLength?: number, _nMfcc?: number, _nMelFilters?: number, _computeMfcc?: boolean, _computeChroma?: boolean): Promise<AudioFeaturesStreamingSession>;
|
|
4
|
+
computeFrame(_samples: Float32Array): AudioFeaturesWasmResult | null;
|
|
5
|
+
dispose(): void;
|
|
8
6
|
}
|
|
9
|
-
export declare function initAudioFeaturesWasm(_sampleRate: number, _fftLength?: number, _nMfcc?: number, _nMelFilters?: number, _computeMfcc?: boolean, _computeChroma?: boolean): Promise<void>;
|
|
10
|
-
export declare function computeAudioFeaturesFrameWasm(_samples: Float32Array): AudioFeaturesWasmResult | null;
|
|
11
7
|
export declare function computeAudioFeaturesWasm(_audioData: Float32Array, _sampleRate: number, _fftLength?: number, _nMfcc?: number, _nMelFilters?: number, _computeMfcc?: boolean, _computeChroma?: boolean): Promise<AudioFeaturesWasmResult>;
|
|
12
8
|
//# sourceMappingURL=audioFeaturesWasm.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audioFeaturesWasm.d.ts","sourceRoot":"","sources":["../../../src/AudioAnalysis/audioFeaturesWasm.ts"],"names":[],"mappings":"AAEA,
|
|
1
|
+
{"version":3,"file":"audioFeaturesWasm.d.ts","sourceRoot":"","sources":["../../../src/AudioAnalysis/audioFeaturesWasm.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAA;AAEpE,qBAAa,6BAA6B;WACzB,MAAM,CACf,WAAW,EAAE,MAAM,EACnB,UAAU,CAAC,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE,MAAM,EACf,YAAY,CAAC,EAAE,MAAM,EACrB,YAAY,CAAC,EAAE,OAAO,EACtB,cAAc,CAAC,EAAE,OAAO,GACzB,OAAO,CAAC,6BAA6B,CAAC;IAIzC,YAAY,CAAC,QAAQ,EAAE,YAAY,GAAG,uBAAuB,GAAG,IAAI;IAIpE,OAAO,IAAI,IAAI;CAClB;AAED,wBAAsB,wBAAwB,CAC1C,UAAU,EAAE,YAAY,EACxB,WAAW,EAAE,MAAM,EACnB,UAAU,CAAC,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE,MAAM,EACf,YAAY,CAAC,EAAE,MAAM,EACrB,YAAY,CAAC,EAAE,OAAO,EACtB,cAAc,CAAC,EAAE,OAAO,GACzB,OAAO,CAAC,uBAAuB,CAAC,CAElC"}
|
|
@@ -1,21 +1,40 @@
|
|
|
1
|
-
|
|
2
|
-
spectralCentroid: number;
|
|
3
|
-
spectralFlatness: number;
|
|
4
|
-
spectralRolloff: number;
|
|
5
|
-
spectralBandwidth: number;
|
|
6
|
-
mfcc: number[];
|
|
7
|
-
chromagram: number[];
|
|
8
|
-
}
|
|
9
|
-
/**
|
|
10
|
-
* Initialise the WASM streaming audio features processor.
|
|
11
|
-
* Call once before computeAudioFeaturesFrameWasm().
|
|
12
|
-
*/
|
|
13
|
-
export declare function initAudioFeaturesWasm(sampleRate: number, fftLength?: number, nMfcc?: number, nMelFilters?: number, computeMfcc?: boolean, computeChroma?: boolean): Promise<void>;
|
|
1
|
+
import type { AudioFeaturesWasmResult } from './AudioAnalysis.types';
|
|
14
2
|
/**
|
|
15
|
-
*
|
|
16
|
-
*
|
|
3
|
+
* Encapsulates a single WASM streaming audio features session.
|
|
4
|
+
* Each instance owns its own WASM heap allocations; multiple sessions
|
|
5
|
+
* can exist concurrently without interfering with each other.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* const session = await AudioFeaturesStreamingSession.create(sampleRate)
|
|
9
|
+
* try {
|
|
10
|
+
* for (const frame of frames) {
|
|
11
|
+
* const result = session.computeFrame(frame)
|
|
12
|
+
* }
|
|
13
|
+
* } finally {
|
|
14
|
+
* session.dispose()
|
|
15
|
+
* }
|
|
17
16
|
*/
|
|
18
|
-
export declare
|
|
17
|
+
export declare class AudioFeaturesStreamingSession {
|
|
18
|
+
private module;
|
|
19
|
+
private framePtr;
|
|
20
|
+
private frameCapacity;
|
|
21
|
+
private resultPtr;
|
|
22
|
+
private constructor();
|
|
23
|
+
/**
|
|
24
|
+
* Initialise a new streaming session. Loads the WASM module if needed.
|
|
25
|
+
*/
|
|
26
|
+
static create(sampleRate: number, fftLength?: number, nMfcc?: number, nMelFilters?: number, computeMfcc?: boolean, computeChroma?: boolean): Promise<AudioFeaturesStreamingSession>;
|
|
27
|
+
/**
|
|
28
|
+
* Compute audio features for a single frame.
|
|
29
|
+
* Returns null on error or if the session has been disposed.
|
|
30
|
+
*/
|
|
31
|
+
computeFrame(samples: Float32Array): AudioFeaturesWasmResult | null;
|
|
32
|
+
/**
|
|
33
|
+
* Free all WASM heap allocations owned by this session.
|
|
34
|
+
* The session must not be used after calling dispose().
|
|
35
|
+
*/
|
|
36
|
+
dispose(): void;
|
|
37
|
+
}
|
|
19
38
|
/**
|
|
20
39
|
* Compute audio features for a buffer of samples via WASM C++.
|
|
21
40
|
* Lazy-loads the WASM module on first call.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audioFeaturesWasm.web.d.ts","sourceRoot":"","sources":["../../../src/AudioAnalysis/audioFeaturesWasm.web.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"audioFeaturesWasm.web.d.ts","sourceRoot":"","sources":["../../../src/AudioAnalysis/audioFeaturesWasm.web.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAA;AAyDpE;;;;;;;;;;;;;;GAcG;AACH,qBAAa,6BAA6B;IACtC,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,QAAQ,CAAI;IACpB,OAAO,CAAC,aAAa,CAAI;IACzB,OAAO,CAAC,SAAS,CAAI;IAErB,OAAO;IAIP;;OAEG;WACU,MAAM,CACf,UAAU,EAAE,MAAM,EAClB,SAAS,SAAO,EAChB,KAAK,SAAK,EACV,WAAW,SAAK,EAChB,WAAW,UAAO,EAClB,aAAa,UAAO,GACrB,OAAO,CAAC,6BAA6B,CAAC;IAyBzC;;;OAGG;IACH,YAAY,CAAC,OAAO,EAAE,YAAY,GAAG,uBAAuB,GAAG,IAAI;IA6BnE;;;OAGG;IACH,OAAO,IAAI,IAAI;CAYlB;AAID;;;GAGG;AACH,wBAAsB,wBAAwB,CAC1C,SAAS,EAAE,YAAY,EACvB,UAAU,EAAE,MAAM,EAClB,SAAS,SAAO,EAChB,KAAK,SAAK,EACV,WAAW,SAAK,EAChB,WAAW,UAAO,EAClB,aAAa,UAAO,GACrB,OAAO,CAAC,uBAAuB,CAAC,CA4BlC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extractAudioAnalysis.d.ts","sourceRoot":"","sources":["../../../src/AudioAnalysis/extractAudioAnalysis.ts"],"names":[],"mappings":"AACA;;;;;GAKG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAGlD,OAAO,EACH,aAAa,EACb,oBAAoB,EAEpB,cAAc,EACjB,MAAM,uBAAuB,CAAA;AAK9B,OAAO,EAAkB,WAAW,EAAE,MAAM,yBAAyB,CAAA;
|
|
1
|
+
{"version":3,"file":"extractAudioAnalysis.d.ts","sourceRoot":"","sources":["../../../src/AudioAnalysis/extractAudioAnalysis.ts"],"names":[],"mappings":"AACA;;;;;GAKG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAGlD,OAAO,EACH,aAAa,EACb,oBAAoB,EAEpB,cAAc,EACjB,MAAM,uBAAuB,CAAA;AAK9B,OAAO,EAAkB,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAwBrE,MAAM,WAAW,4BAA4B;IACzC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,WAAW,CAAC,EAAE,WAAW,CAAA;IACzB,WAAW,CAAC,EAAE,WAAW,CAAA;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,EAAE,oBAAoB,CAAA;IAC/B,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,eAAe,CAAC,EAAE,cAAc,CAAA;CACnC;AAGD,UAAU,kBAAkB;IACxB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,WAAW,CAAC,EAAE,WAAW,CAAA;IACzB;;OAEG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,EAAE,oBAAoB,CAAA;IAC/B,eAAe,CAAC,EAAE,cAAc,CAAA;IAChC,MAAM,CAAC,EAAE,WAAW,CAAA;CACvB;AAGD,UAAU,gBAAiB,SAAQ,kBAAkB;IACjD,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,KAAK,CAAA;IAChB,MAAM,CAAC,EAAE,KAAK,CAAA;CACjB;AAGD,UAAU,gBAAiB,SAAQ,kBAAkB;IACjD,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,WAAW,CAAC,EAAE,KAAK,CAAA;IACnB,SAAS,CAAC,EAAE,KAAK,CAAA;CACpB;AAED;;;;;GAKG;AACH,MAAM,MAAM,yBAAyB,GAAG,gBAAgB,GAAG,gBAAgB,CAAA;AAE3E;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,CACtC,KAAK,EAAE,yBAAyB,GACjC,OAAO,CAAC,aAAa,CAAC,CA2HxB;AAED;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,GAAU,sIAYzC,4BAA4B,KAAG,OAAO,CAAC,aAAa,CAoGtD,CAAA"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { ExtractAudioDataOptions } from '../AudioStudio.types';
|
|
2
|
-
export declare const extractAudioData: (props: ExtractAudioDataOptions) => Promise<
|
|
1
|
+
import { ExtractAudioDataOptions, ExtractedAudioData } from '../AudioStudio.types';
|
|
2
|
+
export declare const extractAudioData: (props: ExtractAudioDataOptions) => Promise<ExtractedAudioData>;
|
|
3
3
|
//# sourceMappingURL=extractAudioData.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extractAudioData.d.ts","sourceRoot":"","sources":["../../../src/AudioAnalysis/extractAudioData.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"extractAudioData.d.ts","sourceRoot":"","sources":["../../../src/AudioAnalysis/extractAudioData.ts"],"names":[],"mappings":"AAAA,OAAO,EAEH,uBAAuB,EACvB,kBAAkB,EACrB,MAAM,sBAAsB,CAAA;AAQ7B,eAAO,MAAM,gBAAgB,GACzB,OAAO,uBAAuB,KAC/B,OAAO,CAAC,kBAAkB,CAwL5B,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"melSpectrogramWasm.web.d.ts","sourceRoot":"","sources":["../../../src/AudioAnalysis/melSpectrogramWasm.web.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"melSpectrogramWasm.web.d.ts","sourceRoot":"","sources":["../../../src/AudioAnalysis/melSpectrogramWasm.web.ts"],"names":[],"mappings":"AAWA;;;GAGG;AACH,wBAAsB,oBAAoB,CACtC,UAAU,EAAE,MAAM,EAClB,KAAK,SAAM,EACX,SAAS,SAAO,EAChB,iBAAiB,SAAM,EACvB,gBAAgB,SAAM,EACtB,IAAI,SAAI,EACR,IAAI,SAAI,GACT,OAAO,CAAC,IAAI,CAAC,CA8Bf;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,EAAE,GAAG,IAAI,CA4B1E;AAED;;;GAGG;AACH,wBAAsB,yBAAyB,CAC3C,SAAS,EAAE,YAAY,EACvB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,iBAAiB,EAAE,MAAM,EACzB,gBAAgB,EAAE,MAAM,EACxB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,SAAS,EAAE,OAAO,EAClB,QAAQ,EAAE,OAAO,GAClB,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAgErB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wasmLoader.web.d.ts","sourceRoot":"","sources":["../../../src/AudioAnalysis/wasmLoader.web.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAA;AAsBpE,wBAAgB,aAAa,IAAI,OAAO,CAAC,uBAAuB,CAAC,CAyBhE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AudioStudioModule.d.ts","sourceRoot":"","sources":["../../src/AudioStudioModule.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AudioStudioModule.d.ts","sourceRoot":"","sources":["../../src/AudioStudioModule.ts"],"names":[],"mappings":"AAMA,QAAA,IAAI,iBAAiB,EAAE,GAAG,CAAA;AAiI1B,eAAe,iBAAiB,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trimAudio.d.ts","sourceRoot":"","sources":["../../src/trimAudio.ts"],"names":[],"mappings":"AAEA,OAAO,
|
|
1
|
+
{"version":3,"file":"trimAudio.d.ts","sourceRoot":"","sources":["../../src/trimAudio.ts"],"names":[],"mappings":"AAEA,OAAO,EAEH,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACpB,MAAM,qBAAqB,CAAA;AAkD5B;;;;;;;;;;GAUG;AACH,wBAAsB,SAAS,CAC3B,OAAO,EAAE,gBAAgB,EACzB,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,GACtD,OAAO,CAAC,eAAe,CAAC,CAsV1B;AAED;;;;;;;;;GASG;AACH,wBAAsB,eAAe,CACjC,OAAO,EAAE,gBAAgB,GAC1B,OAAO,CAAC,MAAM,CAAC,CAGjB"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NOTE: Encodes audio in real-time via AudioContext + MediaRecorder playback.
|
|
3
|
+
* A 60-second clip takes ~60 seconds to encode — this is a known Web Audio API
|
|
4
|
+
* limitation; there is no offline API for Opus/AAC encoding in browsers.
|
|
5
|
+
*/
|
|
6
|
+
export declare function encodeCompressedAudio(buffer: AudioBuffer, format: 'opus' | 'aac', bitrate?: number): Promise<{
|
|
7
|
+
data: ArrayBuffer;
|
|
8
|
+
bitrate: number;
|
|
9
|
+
}>;
|
|
10
|
+
//# sourceMappingURL=encodeCompressedAudio.web.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encodeCompressedAudio.web.d.ts","sourceRoot":"","sources":["../../../src/utils/encodeCompressedAudio.web.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,wBAAgB,qBAAqB,CACjC,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,MAAM,GAAG,KAAK,EACtB,OAAO,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAoEjD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resampleAudioBuffer.web.d.ts","sourceRoot":"","sources":["../../../src/utils/resampleAudioBuffer.web.ts"],"names":[],"mappings":"AAAA,wBAAsB,mBAAmB,CACrC,MAAM,EAAE,WAAW,EACnB,gBAAgB,EAAE,MAAM,EACxB,cAAc,EAAE,MAAM,GACvB,OAAO,CAAC,WAAW,CAAC,CAkCtB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@siteed/audio-studio",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.3",
|
|
4
4
|
"description": "Comprehensive audio processing library for React Native and Expo with recording, analysis, visualization, and streaming capabilities across iOS, Android, and web",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "commonjs",
|
|
@@ -211,6 +211,18 @@ export interface ExtractMelSpectrogramOptions {
|
|
|
211
211
|
logger?: ConsoleLike
|
|
212
212
|
}
|
|
213
213
|
|
|
214
|
+
/**
|
|
215
|
+
* Result type for WASM-based audio feature extraction.
|
|
216
|
+
*/
|
|
217
|
+
export interface AudioFeaturesWasmResult {
|
|
218
|
+
spectralCentroid: number
|
|
219
|
+
spectralFlatness: number
|
|
220
|
+
spectralRolloff: number
|
|
221
|
+
spectralBandwidth: number
|
|
222
|
+
mfcc: number[]
|
|
223
|
+
chromagram: number[]
|
|
224
|
+
}
|
|
225
|
+
|
|
214
226
|
/**
|
|
215
227
|
* Return type for mel spectrogram extraction
|
|
216
228
|
*
|
|
@@ -1,29 +1,24 @@
|
|
|
1
1
|
// Native stub — WASM audio features is web-only.
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
spectralCentroid: number
|
|
5
|
-
spectralFlatness: number
|
|
6
|
-
spectralRolloff: number
|
|
7
|
-
spectralBandwidth: number
|
|
8
|
-
mfcc: number[]
|
|
9
|
-
chromagram: number[]
|
|
10
|
-
}
|
|
3
|
+
import type { AudioFeaturesWasmResult } from './AudioAnalysis.types'
|
|
11
4
|
|
|
12
|
-
export
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
5
|
+
export class AudioFeaturesStreamingSession {
|
|
6
|
+
static async create(
|
|
7
|
+
_sampleRate: number,
|
|
8
|
+
_fftLength?: number,
|
|
9
|
+
_nMfcc?: number,
|
|
10
|
+
_nMelFilters?: number,
|
|
11
|
+
_computeMfcc?: boolean,
|
|
12
|
+
_computeChroma?: boolean
|
|
13
|
+
): Promise<AudioFeaturesStreamingSession> {
|
|
14
|
+
throw new Error('WASM audio features is not available on native')
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
computeFrame(_samples: Float32Array): AudioFeaturesWasmResult | null {
|
|
18
|
+
return null
|
|
19
|
+
}
|
|
22
20
|
|
|
23
|
-
|
|
24
|
-
_samples: Float32Array
|
|
25
|
-
): AudioFeaturesWasmResult | null {
|
|
26
|
-
return null
|
|
21
|
+
dispose(): void {}
|
|
27
22
|
}
|
|
28
23
|
|
|
29
24
|
export async function computeAudioFeaturesWasm(
|
|
@@ -1,34 +1,6 @@
|
|
|
1
|
+
import type { AudioFeaturesWasmResult } from './AudioAnalysis.types'
|
|
1
2
|
import type { AudioFeaturesWasmModule } from './audio-features-wasm'
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
export interface AudioFeaturesWasmResult {
|
|
5
|
-
spectralCentroid: number
|
|
6
|
-
spectralFlatness: number
|
|
7
|
-
spectralRolloff: number
|
|
8
|
-
spectralBandwidth: number
|
|
9
|
-
mfcc: number[]
|
|
10
|
-
chromagram: number[]
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
let modulePromise: Promise<AudioFeaturesWasmModule> | null = null
|
|
14
|
-
|
|
15
|
-
function getModule(): Promise<AudioFeaturesWasmModule> {
|
|
16
|
-
if (!modulePromise) {
|
|
17
|
-
modulePromise = (async () => {
|
|
18
|
-
const url = getMelSpectrogramWasmUrl()
|
|
19
|
-
// webpackIgnore + @vite-ignore prevent bundlers from trying to resolve the URL
|
|
20
|
-
const mod = await import(
|
|
21
|
-
/* webpackIgnore: true */ /* @vite-ignore */ url
|
|
22
|
-
)
|
|
23
|
-
const factory = mod.default ?? mod
|
|
24
|
-
return factory() as Promise<AudioFeaturesWasmModule>
|
|
25
|
-
})().catch((err) => {
|
|
26
|
-
modulePromise = null
|
|
27
|
-
throw err
|
|
28
|
-
})
|
|
29
|
-
}
|
|
30
|
-
return modulePromise
|
|
31
|
-
}
|
|
3
|
+
import { getWasmModule } from './wasmLoader.web'
|
|
32
4
|
|
|
33
5
|
// --- Struct layout for CAudioFeaturesResult (wasm32) ---
|
|
34
6
|
// Offset 0: float spectralCentroid (4 bytes)
|
|
@@ -83,79 +55,115 @@ function readResult(
|
|
|
83
55
|
|
|
84
56
|
// --- Streaming (per-frame) API ---
|
|
85
57
|
|
|
86
|
-
let streamingModule: AudioFeaturesWasmModule | null = null
|
|
87
|
-
let streamingFramePtr = 0
|
|
88
|
-
let streamingFrameCapacity = 0
|
|
89
|
-
let streamingResultPtr = 0
|
|
90
|
-
|
|
91
58
|
/**
|
|
92
|
-
*
|
|
93
|
-
*
|
|
59
|
+
* Encapsulates a single WASM streaming audio features session.
|
|
60
|
+
* Each instance owns its own WASM heap allocations; multiple sessions
|
|
61
|
+
* can exist concurrently without interfering with each other.
|
|
62
|
+
*
|
|
63
|
+
* Usage:
|
|
64
|
+
* const session = await AudioFeaturesStreamingSession.create(sampleRate)
|
|
65
|
+
* try {
|
|
66
|
+
* for (const frame of frames) {
|
|
67
|
+
* const result = session.computeFrame(frame)
|
|
68
|
+
* }
|
|
69
|
+
* } finally {
|
|
70
|
+
* session.dispose()
|
|
71
|
+
* }
|
|
94
72
|
*/
|
|
95
|
-
export
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
streamingModule = Module
|
|
105
|
-
|
|
106
|
-
Module._audio_features_init(
|
|
107
|
-
sampleRate,
|
|
108
|
-
fftLength,
|
|
109
|
-
nMfcc,
|
|
110
|
-
nMelFilters,
|
|
111
|
-
computeMfcc ? 1 : 0,
|
|
112
|
-
computeChroma ? 1 : 0
|
|
113
|
-
)
|
|
73
|
+
export class AudioFeaturesStreamingSession {
|
|
74
|
+
private module: AudioFeaturesWasmModule
|
|
75
|
+
private framePtr = 0
|
|
76
|
+
private frameCapacity = 0
|
|
77
|
+
private resultPtr = 0
|
|
78
|
+
|
|
79
|
+
private constructor(module: AudioFeaturesWasmModule) {
|
|
80
|
+
this.module = module
|
|
81
|
+
}
|
|
114
82
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
83
|
+
/**
|
|
84
|
+
* Initialise a new streaming session. Loads the WASM module if needed.
|
|
85
|
+
*/
|
|
86
|
+
static async create(
|
|
87
|
+
sampleRate: number,
|
|
88
|
+
fftLength = 1024,
|
|
89
|
+
nMfcc = 13,
|
|
90
|
+
nMelFilters = 26,
|
|
91
|
+
computeMfcc = true,
|
|
92
|
+
computeChroma = true
|
|
93
|
+
): Promise<AudioFeaturesStreamingSession> {
|
|
94
|
+
const Module = await getWasmModule()
|
|
95
|
+
const session = new AudioFeaturesStreamingSession(Module)
|
|
96
|
+
|
|
97
|
+
Module._audio_features_init(
|
|
98
|
+
sampleRate,
|
|
99
|
+
fftLength,
|
|
100
|
+
nMfcc,
|
|
101
|
+
nMelFilters,
|
|
102
|
+
computeMfcc ? 1 : 0,
|
|
103
|
+
computeChroma ? 1 : 0
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
// Pre-allocate result struct on WASM heap
|
|
107
|
+
session.resultPtr = Module._malloc(STRUCT_SIZE)
|
|
108
|
+
// Zero-initialize to prevent freeing garbage pointers on first use
|
|
109
|
+
Module.HEAPU8.fill(
|
|
110
|
+
0,
|
|
111
|
+
session.resultPtr,
|
|
112
|
+
session.resultPtr + STRUCT_SIZE
|
|
113
|
+
)
|
|
114
|
+
|
|
115
|
+
return session
|
|
116
|
+
}
|
|
120
117
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
118
|
+
/**
|
|
119
|
+
* Compute audio features for a single frame.
|
|
120
|
+
* Returns null on error or if the session has been disposed.
|
|
121
|
+
*/
|
|
122
|
+
computeFrame(samples: Float32Array): AudioFeaturesWasmResult | null {
|
|
123
|
+
if (!this.resultPtr) return null
|
|
124
|
+
const Module = this.module
|
|
125
|
+
|
|
126
|
+
// (Re-)allocate frame input buffer if needed
|
|
127
|
+
if (samples.length > this.frameCapacity) {
|
|
128
|
+
if (this.framePtr) Module._free(this.framePtr)
|
|
129
|
+
this.framePtr = Module._malloc(samples.length * 4)
|
|
130
|
+
this.frameCapacity = samples.length
|
|
131
|
+
}
|
|
125
132
|
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
* Returns null if not initialised or on error.
|
|
129
|
-
*/
|
|
130
|
-
export function computeAudioFeaturesFrameWasm(
|
|
131
|
-
samples: Float32Array
|
|
132
|
-
): AudioFeaturesWasmResult | null {
|
|
133
|
-
if (!streamingModule || !streamingResultPtr) return null
|
|
134
|
-
const Module = streamingModule
|
|
135
|
-
|
|
136
|
-
// (Re-)allocate frame input buffer if needed
|
|
137
|
-
if (samples.length > streamingFrameCapacity) {
|
|
138
|
-
if (streamingFramePtr) Module._free(streamingFramePtr)
|
|
139
|
-
streamingFramePtr = Module._malloc(samples.length * 4)
|
|
140
|
-
streamingFrameCapacity = samples.length
|
|
141
|
-
}
|
|
133
|
+
// Copy samples to WASM heap
|
|
134
|
+
Module.HEAPF32.set(samples, this.framePtr >> 2)
|
|
142
135
|
|
|
143
|
-
|
|
144
|
-
|
|
136
|
+
const ok = Module._audio_features_compute_frame(
|
|
137
|
+
this.framePtr,
|
|
138
|
+
samples.length,
|
|
139
|
+
this.resultPtr
|
|
140
|
+
)
|
|
141
|
+
if (!ok) return null
|
|
145
142
|
|
|
146
|
-
|
|
147
|
-
streamingFramePtr,
|
|
148
|
-
samples.length,
|
|
149
|
-
streamingResultPtr
|
|
150
|
-
)
|
|
151
|
-
if (!ok) return null
|
|
143
|
+
const result = readResult(Module, this.resultPtr)
|
|
152
144
|
|
|
153
|
-
|
|
145
|
+
// Free internal arrays (mfcc, chromagram) allocated by C
|
|
146
|
+
Module._audio_features_free_arrays(this.resultPtr)
|
|
154
147
|
|
|
155
|
-
|
|
156
|
-
|
|
148
|
+
return result
|
|
149
|
+
}
|
|
157
150
|
|
|
158
|
-
|
|
151
|
+
/**
|
|
152
|
+
* Free all WASM heap allocations owned by this session.
|
|
153
|
+
* The session must not be used after calling dispose().
|
|
154
|
+
*/
|
|
155
|
+
dispose(): void {
|
|
156
|
+
const Module = this.module
|
|
157
|
+
if (this.framePtr) {
|
|
158
|
+
Module._free(this.framePtr)
|
|
159
|
+
this.framePtr = 0
|
|
160
|
+
this.frameCapacity = 0
|
|
161
|
+
}
|
|
162
|
+
if (this.resultPtr) {
|
|
163
|
+
Module._free(this.resultPtr)
|
|
164
|
+
this.resultPtr = 0
|
|
165
|
+
}
|
|
166
|
+
}
|
|
159
167
|
}
|
|
160
168
|
|
|
161
169
|
// --- Batch API ---
|
|
@@ -173,7 +181,7 @@ export async function computeAudioFeaturesWasm(
|
|
|
173
181
|
computeMfcc = true,
|
|
174
182
|
computeChroma = true
|
|
175
183
|
): Promise<AudioFeaturesWasmResult> {
|
|
176
|
-
const Module = await
|
|
184
|
+
const Module = await getWasmModule()
|
|
177
185
|
|
|
178
186
|
const numSamples = audioData.length
|
|
179
187
|
const inputPtr = Module._malloc(numSamples * 4)
|
|
@@ -22,6 +22,14 @@ import { getWavFileInfo, WavFileInfo } from '../utils/getWavFileInfo'
|
|
|
22
22
|
import { InlineFeaturesExtractor } from '../workers/InlineFeaturesExtractor.web'
|
|
23
23
|
import { wasmGlueJs } from '../workers/wasmGlueString.web'
|
|
24
24
|
|
|
25
|
+
function createAnalysisWorker(): { worker: Worker; workerUrl: string } {
|
|
26
|
+
const blob = new Blob([wasmGlueJs, '\n', InlineFeaturesExtractor], {
|
|
27
|
+
type: 'application/javascript',
|
|
28
|
+
})
|
|
29
|
+
const workerUrl = URL.createObjectURL(blob)
|
|
30
|
+
return { worker: new Worker(workerUrl), workerUrl }
|
|
31
|
+
}
|
|
32
|
+
|
|
25
33
|
function calculateCRC32ForDataPoint(data: Float32Array): number {
|
|
26
34
|
// Convert float array to byte array for CRC32
|
|
27
35
|
const byteArray = new Uint8Array(data.length * 4)
|
|
@@ -137,16 +145,13 @@ export async function extractAudioAnalysis(
|
|
|
137
145
|
const channelData = processedBuffer.buffer.getChannelData(0)
|
|
138
146
|
|
|
139
147
|
// Create worker blob: WASM glue (defines createMelSpectrogramModule) + worker code
|
|
140
|
-
const
|
|
141
|
-
[wasmGlueJs, '\n', InlineFeaturesExtractor],
|
|
142
|
-
{ type: 'application/javascript' }
|
|
143
|
-
)
|
|
144
|
-
const workerUrl = URL.createObjectURL(blob)
|
|
145
|
-
const worker = new Worker(workerUrl)
|
|
148
|
+
const { worker, workerUrl } = createAnalysisWorker()
|
|
146
149
|
|
|
147
150
|
return new Promise((resolve, reject) => {
|
|
148
151
|
worker.onmessage = (event) => {
|
|
149
152
|
if (event.data.error) {
|
|
153
|
+
URL.revokeObjectURL(workerUrl)
|
|
154
|
+
worker.terminate()
|
|
150
155
|
reject(new Error(event.data.error))
|
|
151
156
|
return
|
|
152
157
|
}
|
|
@@ -300,20 +305,16 @@ export const extractRawWavAnalysis = async ({
|
|
|
300
305
|
const constrainedChannelData = channelData.slice(startIndex, endIndex)
|
|
301
306
|
|
|
302
307
|
return new Promise((resolve, reject) => {
|
|
303
|
-
const
|
|
304
|
-
type: 'application/javascript',
|
|
305
|
-
})
|
|
306
|
-
const url = URL.createObjectURL(blob)
|
|
307
|
-
const worker = new Worker(url)
|
|
308
|
+
const { worker, workerUrl } = createAnalysisWorker()
|
|
308
309
|
|
|
309
310
|
worker.onmessage = (event) => {
|
|
310
|
-
URL.revokeObjectURL(
|
|
311
|
+
URL.revokeObjectURL(workerUrl)
|
|
311
312
|
worker.terminate()
|
|
312
313
|
resolve(event.data.result)
|
|
313
314
|
}
|
|
314
315
|
|
|
315
316
|
worker.onerror = (error) => {
|
|
316
|
-
URL.revokeObjectURL(
|
|
317
|
+
URL.revokeObjectURL(workerUrl)
|
|
317
318
|
worker.terminate()
|
|
318
319
|
reject(error)
|
|
319
320
|
}
|
|
@@ -337,13 +338,15 @@ export const extractRawWavAnalysis = async ({
|
|
|
337
338
|
fileUri,
|
|
338
339
|
segmentDurationMs,
|
|
339
340
|
})
|
|
340
|
-
const res = await AudioStudioModule.extractAudioAnalysis(
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
341
|
+
const res = await AudioStudioModule.extractAudioAnalysis(
|
|
342
|
+
cleanNativeOptions({
|
|
343
|
+
fileUri,
|
|
344
|
+
segmentDurationMs,
|
|
345
|
+
features,
|
|
346
|
+
position,
|
|
347
|
+
length,
|
|
348
|
+
})
|
|
349
|
+
)
|
|
347
350
|
logger?.log(`extractAudioAnalysis`, res)
|
|
348
351
|
return res
|
|
349
352
|
}
|