@kuralle-syrinx/core 4.4.0 → 4.5.0
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/dist/audio/alaw.d.ts +3 -0
- package/dist/audio/alaw.d.ts.map +1 -0
- package/dist/audio/alaw.js +53 -0
- package/dist/audio/alaw.js.map +1 -0
- package/dist/audio/g722.d.ts +39 -0
- package/dist/audio/g722.d.ts.map +1 -0
- package/dist/audio/g722.js +286 -0
- package/dist/audio/g722.js.map +1 -0
- package/dist/audio/index.d.ts +7 -0
- package/dist/audio/index.d.ts.map +1 -0
- package/dist/audio/index.js +8 -0
- package/dist/audio/index.js.map +1 -0
- package/dist/audio/loudness.d.ts +13 -0
- package/dist/audio/loudness.d.ts.map +1 -0
- package/dist/audio/loudness.js +65 -0
- package/dist/audio/loudness.js.map +1 -0
- package/dist/audio/mulaw.d.ts +3 -0
- package/dist/audio/mulaw.d.ts.map +1 -0
- package/dist/audio/mulaw.js +39 -0
- package/dist/audio/mulaw.js.map +1 -0
- package/dist/audio/pcm.d.ts +5 -0
- package/dist/audio/pcm.d.ts.map +1 -0
- package/dist/audio/pcm.js +40 -0
- package/dist/audio/pcm.js.map +1 -0
- package/dist/audio/resample.d.ts +12 -0
- package/dist/audio/resample.d.ts.map +1 -0
- package/dist/audio/resample.js +157 -0
- package/dist/audio/resample.js.map +1 -0
- package/dist/audio-envelope.d.ts +23 -0
- package/dist/audio-envelope.d.ts.map +1 -0
- package/dist/audio-envelope.js +114 -0
- package/dist/audio-envelope.js.map +1 -0
- package/dist/confidence-to-wait.d.ts +12 -0
- package/dist/confidence-to-wait.d.ts.map +1 -0
- package/dist/confidence-to-wait.js +18 -0
- package/dist/confidence-to-wait.js.map +1 -0
- package/dist/conversation-event.d.ts +19 -0
- package/dist/conversation-event.d.ts.map +1 -0
- package/dist/conversation-event.js +44 -0
- package/dist/conversation-event.js.map +1 -0
- package/dist/error-handler.d.ts +35 -0
- package/dist/error-handler.d.ts.map +1 -0
- package/dist/error-handler.js +136 -0
- package/dist/error-handler.js.map +1 -0
- package/dist/idle-timeout.d.ts +69 -0
- package/dist/idle-timeout.d.ts.map +1 -0
- package/dist/idle-timeout.js +149 -0
- package/dist/idle-timeout.js.map +1 -0
- package/dist/incremental-unit.d.ts +17 -0
- package/dist/incremental-unit.d.ts.map +1 -0
- package/dist/incremental-unit.js +5 -0
- package/dist/incremental-unit.js.map +1 -0
- package/dist/index.d.ts +47 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +61 -0
- package/dist/index.js.map +1 -0
- package/dist/init-chain.d.ts +35 -0
- package/dist/init-chain.d.ts.map +1 -0
- package/dist/init-chain.js +102 -0
- package/dist/init-chain.js.map +1 -0
- package/dist/init-stage-order.d.ts +5 -0
- package/dist/init-stage-order.d.ts.map +1 -0
- package/dist/init-stage-order.js +74 -0
- package/dist/init-stage-order.js.map +1 -0
- package/dist/interaction-coordinator.d.ts +45 -0
- package/dist/interaction-coordinator.d.ts.map +1 -0
- package/dist/interaction-coordinator.js +197 -0
- package/dist/interaction-coordinator.js.map +1 -0
- package/dist/interaction-policy.d.ts +103 -0
- package/dist/interaction-policy.d.ts.map +1 -0
- package/dist/interaction-policy.js +6 -0
- package/dist/interaction-policy.js.map +1 -0
- package/dist/iu-ledger.d.ts +39 -0
- package/dist/iu-ledger.d.ts.map +1 -0
- package/dist/iu-ledger.js +90 -0
- package/dist/iu-ledger.js.map +1 -0
- package/dist/latency-filler-fixtures.d.ts +7 -0
- package/dist/latency-filler-fixtures.d.ts.map +1 -0
- package/dist/latency-filler-fixtures.js +10 -0
- package/dist/latency-filler-fixtures.js.map +1 -0
- package/dist/latency-filler.d.ts +29 -0
- package/dist/latency-filler.d.ts.map +1 -0
- package/dist/latency-filler.js +102 -0
- package/dist/latency-filler.js.map +1 -0
- package/dist/mode-switcher.d.ts +24 -0
- package/dist/mode-switcher.d.ts.map +1 -0
- package/dist/mode-switcher.js +83 -0
- package/dist/mode-switcher.js.map +1 -0
- package/dist/observability-observer.d.ts +36 -0
- package/dist/observability-observer.d.ts.map +1 -0
- package/dist/observability-observer.js +141 -0
- package/dist/observability-observer.js.map +1 -0
- package/dist/observability.d.ts +68 -0
- package/dist/observability.d.ts.map +1 -0
- package/dist/observability.js +70 -0
- package/dist/observability.js.map +1 -0
- package/dist/packet-factories.d.ts +58 -0
- package/dist/packet-factories.d.ts.map +1 -0
- package/dist/packet-factories.js +181 -0
- package/dist/packet-factories.js.map +1 -0
- package/dist/packets.d.ts +532 -0
- package/dist/packets.d.ts.map +1 -0
- package/dist/packets.js +51 -0
- package/dist/packets.js.map +1 -0
- package/dist/pipeline-bus.d.ts +92 -0
- package/dist/pipeline-bus.d.ts.map +1 -0
- package/dist/pipeline-bus.js +294 -0
- package/dist/pipeline-bus.js.map +1 -0
- package/dist/plugin-contract.d.ts +73 -0
- package/dist/plugin-contract.d.ts.map +1 -0
- package/dist/plugin-contract.js +30 -0
- package/dist/plugin-contract.js.map +1 -0
- package/dist/policies/defer.d.ts +11 -0
- package/dist/policies/defer.d.ts.map +1 -0
- package/dist/policies/defer.js +13 -0
- package/dist/policies/defer.js.map +1 -0
- package/dist/policies/rule-based.d.ts +35 -0
- package/dist/policies/rule-based.d.ts.map +1 -0
- package/dist/policies/rule-based.js +130 -0
- package/dist/policies/rule-based.js.map +1 -0
- package/dist/pricing.d.ts +34 -0
- package/dist/pricing.d.ts.map +1 -0
- package/dist/pricing.js +108 -0
- package/dist/pricing.js.map +1 -0
- package/dist/primary-speaker-fixtures.d.ts +12 -0
- package/dist/primary-speaker-fixtures.d.ts.map +1 -0
- package/dist/primary-speaker-fixtures.js +37 -0
- package/dist/primary-speaker-fixtures.js.map +1 -0
- package/dist/primary-speaker-gate.d.ts +42 -0
- package/dist/primary-speaker-gate.d.ts.map +1 -0
- package/dist/primary-speaker-gate.js +178 -0
- package/dist/primary-speaker-gate.js.map +1 -0
- package/dist/provider-fallback.d.ts +28 -0
- package/dist/provider-fallback.d.ts.map +1 -0
- package/dist/provider-fallback.js +72 -0
- package/dist/provider-fallback.js.map +1 -0
- package/dist/reasoner-hedge.d.ts +21 -0
- package/dist/reasoner-hedge.d.ts.map +1 -0
- package/dist/reasoner-hedge.js +170 -0
- package/dist/reasoner-hedge.js.map +1 -0
- package/dist/reasoner-route.d.ts +24 -0
- package/dist/reasoner-route.d.ts.map +1 -0
- package/dist/reasoner-route.js +87 -0
- package/dist/reasoner-route.js.map +1 -0
- package/dist/reasoner-session-store.d.ts +18 -0
- package/dist/reasoner-session-store.d.ts.map +1 -0
- package/dist/reasoner-session-store.js +21 -0
- package/dist/reasoner-session-store.js.map +1 -0
- package/dist/reasoner.d.ts +97 -0
- package/dist/reasoner.d.ts.map +1 -0
- package/dist/reasoner.js +9 -0
- package/dist/reasoner.js.map +1 -0
- package/dist/retry.d.ts +31 -0
- package/dist/retry.d.ts.map +1 -0
- package/dist/retry.js +83 -0
- package/dist/retry.js.map +1 -0
- package/dist/scheduler.d.ts +11 -0
- package/dist/scheduler.d.ts.map +1 -0
- package/dist/scheduler.js +20 -0
- package/dist/scheduler.js.map +1 -0
- package/dist/spend-cap.d.ts +27 -0
- package/dist/spend-cap.d.ts.map +1 -0
- package/dist/spend-cap.js +38 -0
- package/dist/spend-cap.js.map +1 -0
- package/dist/tts-playout-clock.d.ts +43 -0
- package/dist/tts-playout-clock.d.ts.map +1 -0
- package/dist/tts-playout-clock.js +125 -0
- package/dist/tts-playout-clock.js.map +1 -0
- package/dist/turn-arbiter.d.ts +41 -0
- package/dist/turn-arbiter.d.ts.map +1 -0
- package/dist/turn-arbiter.js +259 -0
- package/dist/turn-arbiter.js.map +1 -0
- package/dist/voice-agent-session-util.d.ts +60 -0
- package/dist/voice-agent-session-util.d.ts.map +1 -0
- package/dist/voice-agent-session-util.js +204 -0
- package/dist/voice-agent-session-util.js.map +1 -0
- package/dist/voice-agent-session.d.ts +435 -0
- package/dist/voice-agent-session.d.ts.map +1 -0
- package/dist/voice-agent-session.js +1597 -0
- package/dist/voice-agent-session.js.map +1 -0
- package/dist/voice-text.d.ts +46 -0
- package/dist/voice-text.d.ts.map +1 -0
- package/dist/voice-text.js +209 -0
- package/dist/voice-text.js.map +1 -0
- package/package.json +19 -6
- package/src/audio/alaw.test.ts +87 -0
- package/src/audio/audio.test.ts +285 -0
- package/src/audio/g722.test.ts +149 -0
- package/src/audio/loudness.test.ts +58 -0
- package/src/audio-envelope.test.ts +167 -0
- package/src/confidence-to-wait.test.ts +21 -0
- package/src/error-handler.test.ts +56 -0
- package/src/hedge-throwing-backend.test.ts +46 -0
- package/src/interaction-coordinator.test.ts +529 -0
- package/src/iu-ledger.test.ts +276 -0
- package/src/latency-filler.test.ts +62 -0
- package/src/observability-observer.test.ts +248 -0
- package/src/observability.test.ts +94 -0
- package/src/packet-factories.test.ts +126 -0
- package/src/pipeline-bus.g10.test.ts +145 -0
- package/src/pipeline-bus.test.ts +211 -0
- package/src/policies/defer.test.ts +86 -0
- package/src/policies/rule-based.test.ts +334 -0
- package/src/pricing.test.ts +226 -0
- package/src/primary-speaker-gate.test.ts +150 -0
- package/src/provider-fallback.test.ts +87 -0
- package/src/reasoner-hedge.test.ts +361 -0
- package/src/reasoner-route.test.ts +248 -0
- package/src/reasoner.test.ts +69 -0
- package/src/retry.test.ts +83 -0
- package/src/route-throwing-spec.test.ts +44 -0
- package/src/spend-cap.test.ts +114 -0
- package/src/tts-playout-clock.test.ts +125 -0
- package/src/turn-arbiter.characterization.test.ts +477 -0
- package/src/turn-arbiter.test.ts +762 -0
- package/src/voice-agent-session.test.ts +4165 -0
- package/src/voice-text.test.ts +156 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alaw.d.ts","sourceRoot":"","sources":["../../src/audio/alaw.ts"],"names":[],"mappings":"AASA,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,CAiB/D;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,CAM/D"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
//
|
|
3
|
+
// ITU-T G.711 A-law (PCMA). Pure TypedArray — Workers-safe (no Buffer/node:).
|
|
4
|
+
// Unit-verified against known A-law encode/decode values + round-trip fidelity.
|
|
5
|
+
// Unverified against a live carrier trunk negotiation.
|
|
6
|
+
const ALAW_CLIP = 32635;
|
|
7
|
+
const ALAW_BIAS = 0x55;
|
|
8
|
+
export function decodeALawToPcm16(input) {
|
|
9
|
+
const output = new Int16Array(input.byteLength);
|
|
10
|
+
for (let i = 0; i < input.byteLength; i += 1) {
|
|
11
|
+
const alaw = input[i] ^ ALAW_BIAS;
|
|
12
|
+
// A-law sign bit is inverted vs μ-law: 0x80 means positive.
|
|
13
|
+
const positive = (alaw & 0x80) !== 0;
|
|
14
|
+
const exponent = (alaw >> 4) & 0x07;
|
|
15
|
+
const mantissa = alaw & 0x0f;
|
|
16
|
+
let sample;
|
|
17
|
+
if (exponent === 0) {
|
|
18
|
+
sample = (mantissa << 4) + 8;
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
sample = ((mantissa << 4) + 0x108) << (exponent - 1);
|
|
22
|
+
}
|
|
23
|
+
output[i] = positive ? sample : -sample;
|
|
24
|
+
}
|
|
25
|
+
return output;
|
|
26
|
+
}
|
|
27
|
+
export function encodePcm16ToALaw(input) {
|
|
28
|
+
const output = new Uint8Array(input.length);
|
|
29
|
+
for (let i = 0; i < input.length; i += 1) {
|
|
30
|
+
output[i] = encodeSample(input[i]);
|
|
31
|
+
}
|
|
32
|
+
return output;
|
|
33
|
+
}
|
|
34
|
+
function encodeSample(sample) {
|
|
35
|
+
// A-law: sign bit 0x80 = positive (opposite of μ-law).
|
|
36
|
+
let sign = 0x80;
|
|
37
|
+
let magnitude = sample;
|
|
38
|
+
if (magnitude < 0) {
|
|
39
|
+
sign = 0;
|
|
40
|
+
magnitude = -magnitude;
|
|
41
|
+
}
|
|
42
|
+
if (magnitude > ALAW_CLIP)
|
|
43
|
+
magnitude = ALAW_CLIP;
|
|
44
|
+
let exponent = 7;
|
|
45
|
+
for (let mask = 0x4000; (magnitude & mask) === 0 && exponent > 0; mask >>= 1) {
|
|
46
|
+
exponent -= 1;
|
|
47
|
+
}
|
|
48
|
+
const mantissa = exponent === 0
|
|
49
|
+
? (magnitude >> 4) & 0x0f
|
|
50
|
+
: (magnitude >> (exponent + 3)) & 0x0f;
|
|
51
|
+
return (sign | (exponent << 4) | mantissa) ^ ALAW_BIAS;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=alaw.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alaw.js","sourceRoot":"","sources":["../../src/audio/alaw.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,EAAE;AACF,8EAA8E;AAC9E,gFAAgF;AAChF,uDAAuD;AAEvD,MAAM,SAAS,GAAG,KAAK,CAAC;AACxB,MAAM,SAAS,GAAG,IAAI,CAAC;AAEvB,MAAM,UAAU,iBAAiB,CAAC,KAAiB;IACjD,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAChD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAE,GAAG,SAAS,CAAC;QACnC,4DAA4D;QAC5D,MAAM,QAAQ,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QACrC,MAAM,QAAQ,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;QACpC,MAAM,QAAQ,GAAG,IAAI,GAAG,IAAI,CAAC;QAC7B,IAAI,MAAc,CAAC;QACnB,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;YACnB,MAAM,GAAG,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QAC/B,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;QACvD,CAAC;QACD,MAAM,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAC1C,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAiB;IACjD,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACzC,MAAM,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,YAAY,CAAC,MAAc;IAClC,uDAAuD;IACvD,IAAI,IAAI,GAAG,IAAI,CAAC;IAChB,IAAI,SAAS,GAAG,MAAM,CAAC;IACvB,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;QAClB,IAAI,GAAG,CAAC,CAAC;QACT,SAAS,GAAG,CAAC,SAAS,CAAC;IACzB,CAAC;IACD,IAAI,SAAS,GAAG,SAAS;QAAE,SAAS,GAAG,SAAS,CAAC;IAEjD,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,KAAK,IAAI,IAAI,GAAG,MAAM,EAAE,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,QAAQ,GAAG,CAAC,EAAE,IAAI,KAAK,CAAC,EAAE,CAAC;QAC7E,QAAQ,IAAI,CAAC,CAAC;IAChB,CAAC;IACD,MAAM,QAAQ,GACZ,QAAQ,KAAK,CAAC;QACZ,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,GAAG,IAAI;QACzB,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAC3C,OAAO,CAAC,IAAI,GAAG,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,QAAQ,CAAC,GAAG,SAAS,CAAC;AACzD,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/** 16 kHz wideband PCM sample rate for G.722. */
|
|
2
|
+
export declare const G722_SAMPLE_RATE_HZ = 16000;
|
|
3
|
+
/** 64 kbit/s = 1 byte per pair of 16 kHz samples. */
|
|
4
|
+
export declare const G722_BITRATE = 64000;
|
|
5
|
+
interface BandState {
|
|
6
|
+
nb: number;
|
|
7
|
+
det: number;
|
|
8
|
+
s: number;
|
|
9
|
+
sz: number;
|
|
10
|
+
r: number;
|
|
11
|
+
p: [number, number];
|
|
12
|
+
a: [number, number];
|
|
13
|
+
b: [number, number, number, number, number, number];
|
|
14
|
+
d: [number, number, number, number, number, number, number];
|
|
15
|
+
}
|
|
16
|
+
export interface G722EncoderState {
|
|
17
|
+
readonly _kind: "g722-encoder";
|
|
18
|
+
ptr: number;
|
|
19
|
+
x: Int16Array;
|
|
20
|
+
y: Int16Array;
|
|
21
|
+
band: [BandState, BandState];
|
|
22
|
+
/** leftover sample when input length is odd */
|
|
23
|
+
pending: number | null;
|
|
24
|
+
}
|
|
25
|
+
export interface G722DecoderState {
|
|
26
|
+
readonly _kind: "g722-decoder";
|
|
27
|
+
ptr: number;
|
|
28
|
+
x: Int16Array;
|
|
29
|
+
y: Int16Array;
|
|
30
|
+
band: [BandState, BandState];
|
|
31
|
+
}
|
|
32
|
+
export declare function createG722EncoderState(): G722EncoderState;
|
|
33
|
+
export declare function createG722DecoderState(): G722DecoderState;
|
|
34
|
+
/** Encode 16 kHz PCM16 → G.722 64 kbit/s bytes. Mutates `state`. Odd trailing sample is held for next call. */
|
|
35
|
+
export declare function encodeG722(state: G722EncoderState, pcm16: Int16Array): Uint8Array;
|
|
36
|
+
/** Decode G.722 64 kbit/s bytes → 16 kHz PCM16. Mutates `state`. */
|
|
37
|
+
export declare function decodeG722(state: G722DecoderState, g722: Uint8Array): Int16Array;
|
|
38
|
+
export {};
|
|
39
|
+
//# sourceMappingURL=g722.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"g722.d.ts","sourceRoot":"","sources":["../../src/audio/g722.ts"],"names":[],"mappings":"AAUA,iDAAiD;AACjD,eAAO,MAAM,mBAAmB,QAAS,CAAC;AAE1C,qDAAqD;AACrD,eAAO,MAAM,YAAY,QAAS,CAAC;AAmEnC,UAAU,SAAS;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,CAAC,EAAE,MAAM,CAAC;IACV,EAAE,EAAE,MAAM,CAAC;IACX,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACpD,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;CAC7D;AAqED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,CAAC,EAAE,UAAU,CAAC;IACd,CAAC,EAAE,UAAU,CAAC;IACd,IAAI,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAC7B,+CAA+C;IAC/C,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,CAAC,EAAE,UAAU,CAAC;IACd,CAAC,EAAE,UAAU,CAAC;IACd,IAAI,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;CAC9B;AAED,wBAAgB,sBAAsB,IAAI,gBAAgB,CASzD;AAED,wBAAgB,sBAAsB,IAAI,gBAAgB,CAQzD;AAED,+GAA+G;AAC/G,wBAAgB,UAAU,CAAC,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,UAAU,GAAG,UAAU,CAuEjF;AAED,oEAAoE;AACpE,wBAAgB,UAAU,CAAC,KAAK,EAAE,gBAAgB,EAAE,IAAI,EAAE,UAAU,GAAG,UAAU,CAsDhF"}
|
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
//
|
|
3
|
+
// ITU-T G.722 64 kbit/s sub-band ADPCM (16 kHz PCM16 ↔ G.722).
|
|
4
|
+
// Pure TypedArray — Workers-safe (no Buffer / node: / process).
|
|
5
|
+
//
|
|
6
|
+
// HONESTY: spec-implemented (ITU-T G.722 algorithm tables + QMF + dual-band
|
|
7
|
+
// ADPCM), round-trip-tested on speech-like signals. NOT ITU-vector-certified
|
|
8
|
+
// (authoritative ITU G.722 test vectors were not embedded). Unverified against
|
|
9
|
+
// a live carrier trunk negotiation.
|
|
10
|
+
/** 16 kHz wideband PCM sample rate for G.722. */
|
|
11
|
+
export const G722_SAMPLE_RATE_HZ = 16_000;
|
|
12
|
+
/** 64 kbit/s = 1 byte per pair of 16 kHz samples. */
|
|
13
|
+
export const G722_BITRATE = 64_000;
|
|
14
|
+
// ── ITU-T G.722 tables ──────────────────────────────────────────────────────
|
|
15
|
+
const QMF_FWD = Object.freeze([
|
|
16
|
+
3, -11, 12, 32, -210, 951, 3876, -805, 362, -156, 53, -11,
|
|
17
|
+
]);
|
|
18
|
+
const QMF_REV = Object.freeze([
|
|
19
|
+
-11, 53, -156, 362, -805, 3876, 951, -210, 32, 12, -11, 3,
|
|
20
|
+
]);
|
|
21
|
+
const QM2 = Object.freeze([-7408, -1616, 7408, 1616]);
|
|
22
|
+
const QM4 = Object.freeze([
|
|
23
|
+
0, -20456, -12896, -8968, -6288, -4240, -2584, -1200, 20456, 12896, 8968, 6288, 4240, 2584, 1200, 0,
|
|
24
|
+
]);
|
|
25
|
+
const QM6 = Object.freeze([
|
|
26
|
+
-136, -136, -136, -136, -24808, -21904, -19008, -16704, -14984, -13512, -12280, -11192, -10232, -9360, -8576, -7856,
|
|
27
|
+
-7192, -6576, -6000, -5456, -4944, -4464, -4008, -3576, -3168, -2776, -2400, -2032, -1688, -1360, -1040, -728,
|
|
28
|
+
24808, 21904, 19008, 16704, 14984, 13512, 12280, 11192, 10232, 9360, 8576, 7856, 7192, 6576, 6000, 5456,
|
|
29
|
+
4944, 4464, 4008, 3576, 3168, 2776, 2400, 2032, 1688, 1360, 1040, 728, 432, 136, -432, -136,
|
|
30
|
+
]);
|
|
31
|
+
const Q6 = Object.freeze([
|
|
32
|
+
0, 35, 72, 110, 150, 190, 233, 276, 323, 370, 422, 473, 530, 587, 650, 714, 786, 858, 940, 1023, 1121, 1219, 1339, 1458,
|
|
33
|
+
1612, 1765, 1980, 2195, 2557, 2919, 0, 0,
|
|
34
|
+
]);
|
|
35
|
+
const ILB = Object.freeze([
|
|
36
|
+
2048, 2093, 2139, 2186, 2233, 2282, 2332, 2383, 2435, 2489, 2543, 2599, 2656, 2714, 2774, 2834, 2896, 2960, 3025, 3091,
|
|
37
|
+
3158, 3228, 3298, 3371, 3444, 3520, 3597, 3676, 3756, 3838, 3922, 4008,
|
|
38
|
+
]);
|
|
39
|
+
const ILN = Object.freeze([0, 63, 62, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 0]);
|
|
40
|
+
const ILP = Object.freeze([0, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 0]);
|
|
41
|
+
const IHN = Object.freeze([0, 1, 0]);
|
|
42
|
+
const IHP = Object.freeze([0, 3, 2]);
|
|
43
|
+
const WL = Object.freeze([-60, -30, 58, 172, 334, 538, 1198, 3042]);
|
|
44
|
+
const RL42 = Object.freeze([0, 7, 6, 5, 4, 3, 2, 1, 7, 6, 5, 4, 3, 2, 1, 0]);
|
|
45
|
+
const WH = Object.freeze([0, -214, 798]);
|
|
46
|
+
const RH2 = Object.freeze([2, 1, 2, 1]);
|
|
47
|
+
// ── helpers ─────────────────────────────────────────────────────────────────
|
|
48
|
+
function saturate16(amp) {
|
|
49
|
+
if (amp > 32767)
|
|
50
|
+
return 32767;
|
|
51
|
+
if (amp < -32768)
|
|
52
|
+
return -32768;
|
|
53
|
+
return amp | 0;
|
|
54
|
+
}
|
|
55
|
+
function saturate15(amp) {
|
|
56
|
+
if (amp > 16383)
|
|
57
|
+
return 16383;
|
|
58
|
+
if (amp < -16384)
|
|
59
|
+
return -16384;
|
|
60
|
+
return amp | 0;
|
|
61
|
+
}
|
|
62
|
+
function satAdd16(a, b) {
|
|
63
|
+
return saturate16(a + b);
|
|
64
|
+
}
|
|
65
|
+
function satSub16(a, b) {
|
|
66
|
+
return saturate16(a - b);
|
|
67
|
+
}
|
|
68
|
+
function circularDot(hist, coeffs, n, pos) {
|
|
69
|
+
let z = 0;
|
|
70
|
+
for (let i = 0; i < n - pos; i += 1)
|
|
71
|
+
z += hist[pos + i] * coeffs[i];
|
|
72
|
+
for (let i = 0; i < pos; i += 1)
|
|
73
|
+
z += hist[i] * coeffs[n - pos + i];
|
|
74
|
+
return z;
|
|
75
|
+
}
|
|
76
|
+
function createBand(det) {
|
|
77
|
+
return {
|
|
78
|
+
nb: 0,
|
|
79
|
+
det,
|
|
80
|
+
s: 0,
|
|
81
|
+
sz: 0,
|
|
82
|
+
r: 0,
|
|
83
|
+
p: [0, 0],
|
|
84
|
+
a: [0, 0],
|
|
85
|
+
b: [0, 0, 0, 0, 0, 0],
|
|
86
|
+
d: [0, 0, 0, 0, 0, 0, 0],
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
function block4(band, dx) {
|
|
90
|
+
const r = satAdd16(band.s, dx);
|
|
91
|
+
const p = satAdd16(band.sz, dx);
|
|
92
|
+
// UPPOL2
|
|
93
|
+
let wd1 = saturate16(band.a[0] << 2);
|
|
94
|
+
let wd32 = (p ^ band.p[0]) & 0x8000 ? wd1 : -wd1;
|
|
95
|
+
if (wd32 > 32767)
|
|
96
|
+
wd32 = 32767;
|
|
97
|
+
let wd3 = (((p ^ band.p[1]) & 0x8000 ? -128 : 128) +
|
|
98
|
+
(wd32 >> 7) +
|
|
99
|
+
((band.a[1] * 32512) >> 15)) |
|
|
100
|
+
0;
|
|
101
|
+
if (Math.abs(wd3) > 12288)
|
|
102
|
+
wd3 = wd3 < 0 ? -12288 : 12288;
|
|
103
|
+
const ap1 = wd3;
|
|
104
|
+
// UPPOL1
|
|
105
|
+
wd1 = (p ^ band.p[0]) & 0x8000 ? -192 : 192;
|
|
106
|
+
let wd2 = ((band.a[0] * 32640) >> 15) | 0;
|
|
107
|
+
let ap0 = satAdd16(wd1, wd2);
|
|
108
|
+
wd3 = satSub16(15360, ap1);
|
|
109
|
+
if (Math.abs(ap0) > wd3)
|
|
110
|
+
ap0 = ap0 < 0 ? -wd3 : wd3;
|
|
111
|
+
// FILTEP
|
|
112
|
+
wd1 = satAdd16(r, r);
|
|
113
|
+
wd1 = ((ap0 * wd1) >> 15) | 0;
|
|
114
|
+
wd2 = satAdd16(band.r, band.r);
|
|
115
|
+
wd2 = ((ap1 * wd2) >> 15) | 0;
|
|
116
|
+
const sp = satAdd16(wd1, wd2);
|
|
117
|
+
band.r = r;
|
|
118
|
+
band.a[1] = ap1;
|
|
119
|
+
band.a[0] = ap0;
|
|
120
|
+
band.p[1] = band.p[0];
|
|
121
|
+
band.p[0] = p;
|
|
122
|
+
// UPZERO / DELAYA / FILTEZ
|
|
123
|
+
wd1 = dx === 0 ? 0 : 128;
|
|
124
|
+
band.d[0] = dx;
|
|
125
|
+
let sz = 0;
|
|
126
|
+
for (let i = 5; i >= 0; i -= 1) {
|
|
127
|
+
wd2 = (band.d[i + 1] ^ dx) & 0x8000 ? -wd1 : wd1;
|
|
128
|
+
wd3 = ((band.b[i] * 32640) >> 15) | 0;
|
|
129
|
+
band.b[i] = satAdd16(wd2, wd3);
|
|
130
|
+
wd3 = satAdd16(band.d[i], band.d[i]);
|
|
131
|
+
sz += (band.b[i] * wd3) >> 15;
|
|
132
|
+
band.d[i + 1] = band.d[i];
|
|
133
|
+
}
|
|
134
|
+
band.sz = saturate16(sz);
|
|
135
|
+
band.s = satAdd16(sp, band.sz);
|
|
136
|
+
}
|
|
137
|
+
export function createG722EncoderState() {
|
|
138
|
+
return {
|
|
139
|
+
_kind: "g722-encoder",
|
|
140
|
+
ptr: 0,
|
|
141
|
+
x: new Int16Array(12),
|
|
142
|
+
y: new Int16Array(12),
|
|
143
|
+
band: [createBand(32), createBand(8)],
|
|
144
|
+
pending: null,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
export function createG722DecoderState() {
|
|
148
|
+
return {
|
|
149
|
+
_kind: "g722-decoder",
|
|
150
|
+
ptr: 0,
|
|
151
|
+
x: new Int16Array(12),
|
|
152
|
+
y: new Int16Array(12),
|
|
153
|
+
band: [createBand(32), createBand(8)],
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
/** Encode 16 kHz PCM16 → G.722 64 kbit/s bytes. Mutates `state`. Odd trailing sample is held for next call. */
|
|
157
|
+
export function encodeG722(state, pcm16) {
|
|
158
|
+
let offset = 0;
|
|
159
|
+
let samples = pcm16;
|
|
160
|
+
if (state.pending !== null) {
|
|
161
|
+
const merged = new Int16Array(pcm16.length + 1);
|
|
162
|
+
merged[0] = state.pending;
|
|
163
|
+
merged.set(pcm16, 1);
|
|
164
|
+
samples = merged;
|
|
165
|
+
state.pending = null;
|
|
166
|
+
}
|
|
167
|
+
if (samples.length % 2 !== 0) {
|
|
168
|
+
state.pending = samples[samples.length - 1];
|
|
169
|
+
samples = samples.subarray(0, samples.length - 1);
|
|
170
|
+
}
|
|
171
|
+
const out = new Uint8Array(samples.length >> 1);
|
|
172
|
+
let outIdx = 0;
|
|
173
|
+
while (offset < samples.length) {
|
|
174
|
+
state.x[state.ptr] = samples[offset++];
|
|
175
|
+
state.y[state.ptr] = samples[offset++];
|
|
176
|
+
state.ptr += 1;
|
|
177
|
+
if (state.ptr >= 12)
|
|
178
|
+
state.ptr = 0;
|
|
179
|
+
const sumodd = circularDot(state.x, QMF_FWD, 12, state.ptr);
|
|
180
|
+
const sumeven = circularDot(state.y, QMF_REV, 12, state.ptr);
|
|
181
|
+
const xlow = ((sumeven + sumodd) >> 14) | 0;
|
|
182
|
+
const xhigh = ((sumeven - sumodd) >> 14) | 0;
|
|
183
|
+
// Low band
|
|
184
|
+
const el = satSub16(xlow, state.band[0].s);
|
|
185
|
+
let wd = el >= 0 ? el : ~el;
|
|
186
|
+
let i = 1;
|
|
187
|
+
for (; i < 30; i += 1) {
|
|
188
|
+
const wd1 = (Q6[i] * state.band[0].det) >> 12;
|
|
189
|
+
if (wd < wd1)
|
|
190
|
+
break;
|
|
191
|
+
}
|
|
192
|
+
const ilow = el < 0 ? ILN[i] : ILP[i];
|
|
193
|
+
const ril = ilow >> 2;
|
|
194
|
+
let dlow = ((state.band[0].det * QM4[ril]) >> 15) | 0;
|
|
195
|
+
const il4 = RL42[ril];
|
|
196
|
+
wd = ((state.band[0].nb * 127) >> 7) + WL[il4];
|
|
197
|
+
if (wd < 0)
|
|
198
|
+
wd = 0;
|
|
199
|
+
else if (wd > 18432)
|
|
200
|
+
wd = 18432;
|
|
201
|
+
state.band[0].nb = wd;
|
|
202
|
+
let wd1 = (state.band[0].nb >> 6) & 31;
|
|
203
|
+
let wd2 = 8 - (state.band[0].nb >> 11);
|
|
204
|
+
let wd3 = wd2 < 0 ? ILB[wd1] << -wd2 : ILB[wd1] >> wd2;
|
|
205
|
+
state.band[0].det = (wd3 << 2) | 0;
|
|
206
|
+
block4(state.band[0], dlow);
|
|
207
|
+
// High band
|
|
208
|
+
const eh = satSub16(xhigh, state.band[1].s);
|
|
209
|
+
wd = eh >= 0 ? eh : ~eh;
|
|
210
|
+
wd1 = (564 * state.band[1].det) >> 12;
|
|
211
|
+
const mih = wd >= wd1 ? 2 : 1;
|
|
212
|
+
const ihigh = eh < 0 ? IHN[mih] : IHP[mih];
|
|
213
|
+
const dhigh = ((state.band[1].det * QM2[ihigh]) >> 15) | 0;
|
|
214
|
+
const ih2 = RH2[ihigh];
|
|
215
|
+
wd = ((state.band[1].nb * 127) >> 7) + WH[ih2];
|
|
216
|
+
if (wd < 0)
|
|
217
|
+
wd = 0;
|
|
218
|
+
else if (wd > 22528)
|
|
219
|
+
wd = 22528;
|
|
220
|
+
state.band[1].nb = wd;
|
|
221
|
+
wd1 = (state.band[1].nb >> 6) & 31;
|
|
222
|
+
wd2 = 10 - (state.band[1].nb >> 11);
|
|
223
|
+
wd3 = wd2 < 0 ? ILB[wd1] << -wd2 : ILB[wd1] >> wd2;
|
|
224
|
+
state.band[1].det = (wd3 << 2) | 0;
|
|
225
|
+
block4(state.band[1], dhigh);
|
|
226
|
+
out[outIdx++] = ((ihigh << 6) | ilow) & 0xff;
|
|
227
|
+
}
|
|
228
|
+
return outIdx === out.length ? out : out.subarray(0, outIdx);
|
|
229
|
+
}
|
|
230
|
+
/** Decode G.722 64 kbit/s bytes → 16 kHz PCM16. Mutates `state`. */
|
|
231
|
+
export function decodeG722(state, g722) {
|
|
232
|
+
const out = new Int16Array(g722.byteLength * 2);
|
|
233
|
+
let outIdx = 0;
|
|
234
|
+
for (let j = 0; j < g722.byteLength; j += 1) {
|
|
235
|
+
const code = g722[j];
|
|
236
|
+
let wd1 = code & 0x3f;
|
|
237
|
+
const ihigh = (code >> 6) & 0x03;
|
|
238
|
+
let wd2 = QM6[wd1];
|
|
239
|
+
wd1 >>= 2;
|
|
240
|
+
// Low band INVQBL / RECONS / LIMIT
|
|
241
|
+
wd2 = ((state.band[0].det * wd2) >> 15) | 0;
|
|
242
|
+
const rlow = saturate15(state.band[0].s + wd2);
|
|
243
|
+
// Low band INVQAL + LOGSCL + SCALEL
|
|
244
|
+
wd2 = QM4[wd1];
|
|
245
|
+
const dlow = ((state.band[0].det * wd2) >> 15) | 0;
|
|
246
|
+
wd2 = RL42[wd1];
|
|
247
|
+
let nb = ((state.band[0].nb * 127) >> 7) + WL[wd2];
|
|
248
|
+
if (nb < 0)
|
|
249
|
+
nb = 0;
|
|
250
|
+
else if (nb > 18432)
|
|
251
|
+
nb = 18432;
|
|
252
|
+
state.band[0].nb = nb;
|
|
253
|
+
let s1 = (state.band[0].nb >> 6) & 31;
|
|
254
|
+
let s2 = 8 - (state.band[0].nb >> 11);
|
|
255
|
+
let s3 = s2 < 0 ? ILB[s1] << -s2 : ILB[s1] >> s2;
|
|
256
|
+
state.band[0].det = (s3 << 2) | 0;
|
|
257
|
+
block4(state.band[0], dlow);
|
|
258
|
+
// High band
|
|
259
|
+
wd2 = QM2[ihigh];
|
|
260
|
+
const dhigh = ((state.band[1].det * wd2) >> 15) | 0;
|
|
261
|
+
const rhigh = saturate15(dhigh + state.band[1].s);
|
|
262
|
+
wd2 = RH2[ihigh];
|
|
263
|
+
nb = ((state.band[1].nb * 127) >> 7) + WH[wd2];
|
|
264
|
+
if (nb < 0)
|
|
265
|
+
nb = 0;
|
|
266
|
+
else if (nb > 22528)
|
|
267
|
+
nb = 22528;
|
|
268
|
+
state.band[1].nb = nb;
|
|
269
|
+
s1 = (state.band[1].nb >> 6) & 31;
|
|
270
|
+
s2 = 10 - (state.band[1].nb >> 11);
|
|
271
|
+
s3 = s2 < 0 ? ILB[s1] << -s2 : ILB[s1] >> s2;
|
|
272
|
+
state.band[1].det = (s3 << 2) | 0;
|
|
273
|
+
block4(state.band[1], dhigh);
|
|
274
|
+
// QMF synthesis
|
|
275
|
+
state.x[state.ptr] = (rlow + rhigh) | 0;
|
|
276
|
+
state.y[state.ptr] = (rlow - rhigh) | 0;
|
|
277
|
+
state.ptr += 1;
|
|
278
|
+
if (state.ptr >= 12)
|
|
279
|
+
state.ptr = 0;
|
|
280
|
+
// QMF introduces ~22-sample group delay; polarity follows the ITU analysis/synthesis pair.
|
|
281
|
+
out[outIdx++] = (circularDot(state.y, QMF_REV, 12, state.ptr) >> 11) | 0;
|
|
282
|
+
out[outIdx++] = (circularDot(state.x, QMF_FWD, 12, state.ptr) >> 11) | 0;
|
|
283
|
+
}
|
|
284
|
+
return outIdx === out.length ? out : out.subarray(0, outIdx);
|
|
285
|
+
}
|
|
286
|
+
//# sourceMappingURL=g722.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"g722.js","sourceRoot":"","sources":["../../src/audio/g722.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { pcm16BytesToSamples, pcm16SamplesToBytes, bigEndianPcm16BytesToSamples, pcm16SamplesToBigEndianBytes } from "./pcm.js";
|
|
2
|
+
export { decodeMuLawToPcm16, encodePcm16ToMuLaw } from "./mulaw.js";
|
|
3
|
+
export { decodeALawToPcm16, encodePcm16ToALaw } from "./alaw.js";
|
|
4
|
+
export { createG722EncoderState, createG722DecoderState, encodeG722, decodeG722, G722_SAMPLE_RATE_HZ, G722_BITRATE, type G722EncoderState, type G722DecoderState, } from "./g722.js";
|
|
5
|
+
export { resamplePcm16, resamplePcm16Streaming, StreamingPcm16Resampler } from "./resample.js";
|
|
6
|
+
export { createLoudnessState, normalizeLoudness, type LoudnessConfig, type LoudnessState } from "./loudness.js";
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/audio/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,4BAA4B,EAAE,4BAA4B,EAAE,MAAM,UAAU,CAAC;AAChI,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,UAAU,EACV,UAAU,EACV,mBAAmB,EACnB,YAAY,EACZ,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,GACtB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAC/F,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,KAAK,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
export { pcm16BytesToSamples, pcm16SamplesToBytes, bigEndianPcm16BytesToSamples, pcm16SamplesToBigEndianBytes } from "./pcm.js";
|
|
3
|
+
export { decodeMuLawToPcm16, encodePcm16ToMuLaw } from "./mulaw.js";
|
|
4
|
+
export { decodeALawToPcm16, encodePcm16ToALaw } from "./alaw.js";
|
|
5
|
+
export { createG722EncoderState, createG722DecoderState, encodeG722, decodeG722, G722_SAMPLE_RATE_HZ, G722_BITRATE, } from "./g722.js";
|
|
6
|
+
export { resamplePcm16, resamplePcm16Streaming, StreamingPcm16Resampler } from "./resample.js";
|
|
7
|
+
export { createLoudnessState, normalizeLoudness } from "./loudness.js";
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/audio/index.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAE/B,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,4BAA4B,EAAE,4BAA4B,EAAE,MAAM,UAAU,CAAC;AAChI,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,UAAU,EACV,UAAU,EACV,mBAAmB,EACnB,YAAY,GAGb,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAC/F,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAA2C,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface LoudnessConfig {
|
|
2
|
+
readonly targetRms: number;
|
|
3
|
+
readonly maxGainStep?: number;
|
|
4
|
+
readonly rmsSmoothing?: number;
|
|
5
|
+
readonly ceiling?: number;
|
|
6
|
+
}
|
|
7
|
+
export interface LoudnessState {
|
|
8
|
+
gain: number;
|
|
9
|
+
runningRms: number;
|
|
10
|
+
}
|
|
11
|
+
export declare function createLoudnessState(): LoudnessState;
|
|
12
|
+
export declare function normalizeLoudness(pcm: Int16Array, state: LoudnessState, cfg: LoudnessConfig): Int16Array;
|
|
13
|
+
//# sourceMappingURL=loudness.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loudness.d.ts","sourceRoot":"","sources":["../../src/audio/loudness.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,mBAAmB,IAAI,aAAa,CAEnD;AAED,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,UAAU,EACf,KAAK,EAAE,aAAa,EACpB,GAAG,EAAE,cAAc,GAClB,UAAU,CAwBZ"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
const INT16_MAX = 32767;
|
|
3
|
+
const DEFAULT_MAX_GAIN_STEP = 0.5;
|
|
4
|
+
const DEFAULT_RMS_SMOOTHING = 0.25;
|
|
5
|
+
const DEFAULT_CEILING = 30000;
|
|
6
|
+
export function createLoudnessState() {
|
|
7
|
+
return { gain: 1, runningRms: 0 };
|
|
8
|
+
}
|
|
9
|
+
export function normalizeLoudness(pcm, state, cfg) {
|
|
10
|
+
const targetRms = positiveBounded(cfg.targetRms, "targetRms", INT16_MAX);
|
|
11
|
+
const maxGainStep = positiveFinite(cfg.maxGainStep ?? DEFAULT_MAX_GAIN_STEP, "maxGainStep");
|
|
12
|
+
const rmsSmoothing = bounded(cfg.rmsSmoothing ?? DEFAULT_RMS_SMOOTHING, "rmsSmoothing", 0, 1);
|
|
13
|
+
const ceiling = positiveBounded(cfg.ceiling ?? DEFAULT_CEILING, "ceiling", INT16_MAX);
|
|
14
|
+
if (pcm.length === 0)
|
|
15
|
+
return pcm;
|
|
16
|
+
const frameRms = rms(pcm);
|
|
17
|
+
if (frameRms > 0) {
|
|
18
|
+
state.runningRms =
|
|
19
|
+
state.runningRms > 0
|
|
20
|
+
? state.runningRms + (frameRms - state.runningRms) * rmsSmoothing
|
|
21
|
+
: frameRms;
|
|
22
|
+
const desiredGain = targetRms / state.runningRms;
|
|
23
|
+
const gainDelta = desiredGain - state.gain;
|
|
24
|
+
state.gain += Math.max(-maxGainStep, Math.min(maxGainStep, gainDelta));
|
|
25
|
+
}
|
|
26
|
+
const output = new Int16Array(pcm.length);
|
|
27
|
+
for (let i = 0; i < pcm.length; i += 1) {
|
|
28
|
+
output[i] = Math.round(softLimit(pcm[i] * state.gain, ceiling));
|
|
29
|
+
}
|
|
30
|
+
return output;
|
|
31
|
+
}
|
|
32
|
+
function rms(pcm) {
|
|
33
|
+
let sumSquares = 0;
|
|
34
|
+
for (const sample of pcm)
|
|
35
|
+
sumSquares += sample * sample;
|
|
36
|
+
return Math.sqrt(sumSquares / pcm.length);
|
|
37
|
+
}
|
|
38
|
+
function softLimit(value, ceiling) {
|
|
39
|
+
const magnitude = Math.abs(value);
|
|
40
|
+
const knee = ceiling * 0.75;
|
|
41
|
+
if (magnitude <= knee)
|
|
42
|
+
return value;
|
|
43
|
+
const range = ceiling - knee;
|
|
44
|
+
const limited = knee + range * (1 - Math.exp(-(magnitude - knee) / range));
|
|
45
|
+
return Math.sign(value) * limited;
|
|
46
|
+
}
|
|
47
|
+
function positiveFinite(value, name) {
|
|
48
|
+
if (!Number.isFinite(value) || value <= 0) {
|
|
49
|
+
throw new RangeError(`LoudnessConfig.${name} must be a positive finite number`);
|
|
50
|
+
}
|
|
51
|
+
return value;
|
|
52
|
+
}
|
|
53
|
+
function positiveBounded(value, name, max) {
|
|
54
|
+
const parsed = positiveFinite(value, name);
|
|
55
|
+
if (parsed > max)
|
|
56
|
+
throw new RangeError(`LoudnessConfig.${name} must be at most ${String(max)}`);
|
|
57
|
+
return parsed;
|
|
58
|
+
}
|
|
59
|
+
function bounded(value, name, min, max) {
|
|
60
|
+
if (!Number.isFinite(value) || value <= min || value > max) {
|
|
61
|
+
throw new RangeError(`LoudnessConfig.${name} must be greater than ${String(min)} and at most ${String(max)}`);
|
|
62
|
+
}
|
|
63
|
+
return value;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=loudness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loudness.js","sourceRoot":"","sources":["../../src/audio/loudness.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mulaw.d.ts","sourceRoot":"","sources":["../../src/audio/mulaw.ts"],"names":[],"mappings":"AAKA,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,CAYhE;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,CAMhE"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
const MULAW_BIAS = 0x84;
|
|
3
|
+
const MULAW_CLIP = 32635;
|
|
4
|
+
export function decodeMuLawToPcm16(input) {
|
|
5
|
+
const output = new Int16Array(input.byteLength);
|
|
6
|
+
for (let i = 0; i < input.byteLength; i += 1) {
|
|
7
|
+
const ulaw = (~input[i]) & 0xff;
|
|
8
|
+
const sign = ulaw & 0x80;
|
|
9
|
+
const exponent = (ulaw >> 4) & 0x07;
|
|
10
|
+
const mantissa = ulaw & 0x0f;
|
|
11
|
+
let sample = ((mantissa << 3) + MULAW_BIAS) << exponent;
|
|
12
|
+
sample -= MULAW_BIAS;
|
|
13
|
+
output[i] = sign ? -sample : sample;
|
|
14
|
+
}
|
|
15
|
+
return output;
|
|
16
|
+
}
|
|
17
|
+
export function encodePcm16ToMuLaw(input) {
|
|
18
|
+
const output = new Uint8Array(input.length);
|
|
19
|
+
for (let i = 0; i < input.length; i += 1) {
|
|
20
|
+
output[i] = encodeSample(input[i]);
|
|
21
|
+
}
|
|
22
|
+
return output;
|
|
23
|
+
}
|
|
24
|
+
function encodeSample(sample) {
|
|
25
|
+
let sign = 0;
|
|
26
|
+
let magnitude = sample;
|
|
27
|
+
if (magnitude < 0) {
|
|
28
|
+
sign = 0x80;
|
|
29
|
+
magnitude = -magnitude;
|
|
30
|
+
}
|
|
31
|
+
magnitude = Math.min(magnitude, MULAW_CLIP) + MULAW_BIAS;
|
|
32
|
+
let exponent = 7;
|
|
33
|
+
for (let mask = 0x4000; (magnitude & mask) === 0 && exponent > 0; mask >>= 1) {
|
|
34
|
+
exponent -= 1;
|
|
35
|
+
}
|
|
36
|
+
const mantissa = (magnitude >> (exponent + 3)) & 0x0f;
|
|
37
|
+
return (~(sign | (exponent << 4) | mantissa)) & 0xff;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=mulaw.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mulaw.js","sourceRoot":"","sources":["../../src/audio/mulaw.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAE/B,MAAM,UAAU,GAAG,IAAI,CAAC;AACxB,MAAM,UAAU,GAAG,KAAK,CAAC;AAEzB,MAAM,UAAU,kBAAkB,CAAC,KAAiB;IAClD,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAChD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,GAAG,IAAI,CAAC;QACjC,MAAM,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;QACzB,MAAM,QAAQ,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;QACpC,MAAM,QAAQ,GAAG,IAAI,GAAG,IAAI,CAAC;QAC7B,IAAI,MAAM,GAAG,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,UAAU,CAAC,IAAI,QAAQ,CAAC;QACxD,MAAM,IAAI,UAAU,CAAC;QACrB,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;IACtC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAiB;IAClD,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACzC,MAAM,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,YAAY,CAAC,MAAc;IAClC,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,SAAS,GAAG,MAAM,CAAC;IACvB,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;QAClB,IAAI,GAAG,IAAI,CAAC;QACZ,SAAS,GAAG,CAAC,SAAS,CAAC;IACzB,CAAC;IACD,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,UAAU,CAAC,GAAG,UAAU,CAAC;IACzD,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,KAAK,IAAI,IAAI,GAAG,MAAM,EAAE,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,QAAQ,GAAG,CAAC,EAAE,IAAI,KAAK,CAAC,EAAE,CAAC;QAC7E,QAAQ,IAAI,CAAC,CAAC;IAChB,CAAC;IACD,MAAM,QAAQ,GAAG,CAAC,SAAS,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IACtD,OAAO,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC;AACvD,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare function pcm16BytesToSamples(audio: Uint8Array): Int16Array;
|
|
2
|
+
export declare function pcm16SamplesToBytes(samples: Int16Array): Uint8Array;
|
|
3
|
+
export declare function bigEndianPcm16BytesToSamples(audio: Uint8Array): Int16Array;
|
|
4
|
+
export declare function pcm16SamplesToBigEndianBytes(samples: Int16Array): Uint8Array;
|
|
5
|
+
//# sourceMappingURL=pcm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pcm.d.ts","sourceRoot":"","sources":["../../src/audio/pcm.ts"],"names":[],"mappings":"AAEA,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,CAUjE;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,UAAU,GAAG,UAAU,CAOnE;AAED,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,CAU1E;AAED,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,UAAU,GAAG,UAAU,CAO5E"}
|