@prosopo/audio-assets 0.2.1 → 0.2.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/.turbo/turbo-build$colon$cjs.log +2 -2
- package/.turbo/turbo-build$colon$esm.log +24 -0
- package/.turbo/turbo-build$colon$tsc.log +5 -5
- package/.turbo/turbo-build$colon$types.log +1 -0
- package/CHANGELOG.md +22 -0
- package/dist/tsc/distort.d.ts.map +1 -0
- package/dist/tsc/distort.js +76 -0
- package/dist/tsc/distort.js.map +1 -0
- package/dist/tsc/encode.d.ts.map +1 -0
- package/dist/tsc/encode.js +33 -0
- package/dist/tsc/encode.js.map +1 -0
- package/dist/tsc/index.d.ts.map +1 -0
- package/dist/tsc/index.js +86 -0
- package/dist/tsc/index.js.map +1 -0
- package/dist/tsc/levels.d.ts.map +1 -0
- package/dist/tsc/levels.js +22 -0
- package/dist/tsc/levels.js.map +1 -0
- package/dist/tsc/phonemes.d.ts.map +1 -0
- package/dist/tsc/phonemes.js +110 -0
- package/dist/tsc/phonemes.js.map +1 -0
- package/dist/tsc/synth.d.ts.map +1 -0
- package/dist/tsc/synth.js +211 -0
- package/dist/tsc/synth.js.map +1 -0
- package/dist/tsc/tests/audioAssets.unit.test.d.ts.map +1 -0
- package/dist/tsc/tests/audioAssets.unit.test.js.map +1 -0
- package/dist/tsc/types.d.ts.map +1 -0
- package/dist/tsc/types.js.map +1 -0
- package/dist/types/distort.d.ts +7 -0
- package/dist/types/distort.d.ts.map +1 -0
- package/dist/types/encode.d.ts +4 -0
- package/dist/types/encode.d.ts.map +1 -0
- package/dist/types/index.d.ts +13 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/levels.d.ts +3 -0
- package/dist/types/levels.d.ts.map +1 -0
- package/dist/types/phonemes.d.ts +4 -0
- package/dist/types/phonemes.d.ts.map +1 -0
- package/dist/types/synth.d.ts +13 -0
- package/dist/types/synth.d.ts.map +1 -0
- package/dist/types/tests/audioAssets.unit.test.d.ts +2 -0
- package/dist/types/tests/audioAssets.unit.test.d.ts.map +1 -0
- package/dist/types/types.d.ts +35 -0
- package/dist/types/types.d.ts.map +1 -0
- package/package.json +14 -15
- package/.turbo/turbo-build.log +0 -25
- package/dist/distort.d.ts.map +0 -1
- package/dist/distort.js.map +0 -1
- package/dist/encode.d.ts.map +0 -1
- package/dist/encode.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/levels.d.ts.map +0 -1
- package/dist/levels.js.map +0 -1
- package/dist/phonemes.d.ts.map +0 -1
- package/dist/phonemes.js.map +0 -1
- package/dist/synth.d.ts.map +0 -1
- package/dist/synth.js.map +0 -1
- package/dist/tests/audioAssets.unit.test.d.ts.map +0 -1
- package/dist/tests/audioAssets.unit.test.js.map +0 -1
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js.map +0 -1
- /package/dist/{_virtual → esm/_virtual}/_rolldown/runtime.js +0 -0
- /package/dist/{distort.js → esm/distort.js} +0 -0
- /package/dist/{encode.js → esm/encode.js} +0 -0
- /package/dist/{index.js → esm/index.js} +0 -0
- /package/dist/{levels.js → esm/levels.js} +0 -0
- /package/dist/{phonemes.js → esm/phonemes.js} +0 -0
- /package/dist/{synth.js → esm/synth.js} +0 -0
- /package/dist/{distort.d.ts → tsc/distort.d.ts} +0 -0
- /package/dist/{encode.d.ts → tsc/encode.d.ts} +0 -0
- /package/dist/{index.d.ts → tsc/index.d.ts} +0 -0
- /package/dist/{levels.d.ts → tsc/levels.d.ts} +0 -0
- /package/dist/{phonemes.d.ts → tsc/phonemes.d.ts} +0 -0
- /package/dist/{synth.d.ts → tsc/synth.d.ts} +0 -0
- /package/dist/{tests → tsc/tests}/audioAssets.unit.test.d.ts +0 -0
- /package/dist/{tests → tsc/tests}/audioAssets.unit.test.js +0 -0
- /package/dist/{types.d.ts → tsc/types.d.ts} +0 -0
- /package/dist/{types.js → tsc/types.js} +0 -0
|
@@ -7,7 +7,7 @@ ViteCommonJSConfig: .
|
|
|
7
7
|
}
|
|
8
8
|
{ externals: [ '@prosopo/puzzle-assets' ] }
|
|
9
9
|
[33mThe plugin "vite-tsconfig-paths" is detected. Vite now supports tsconfig paths resolution natively via the [1mresolve.tsconfigPaths[22m option. You can remove the plugin and set [1mresolve.tsconfigPaths: true[22m in your Vite config instead.[39m
|
|
10
|
-
[36mvite v8.1.
|
|
10
|
+
[36mvite v8.1.6 [32mbuilding ssr environment for production...[36m[39m
|
|
11
11
|
Bundle build started
|
|
12
12
|
[2K
|
|
13
13
|
✓ 7 modules transformed.
|
|
@@ -20,4 +20,4 @@ dist/cjs/phonemes.cjs 3.52 kB │ gzip: 1.12 kB
|
|
|
20
20
|
dist/cjs/index.cjs 4.67 kB │ gzip: 1.70 kB
|
|
21
21
|
dist/cjs/synth.cjs 7.70 kB │ gzip: 2.73 kB
|
|
22
22
|
|
|
23
|
-
[32m✓ built in
|
|
23
|
+
[32m✓ built in 55ms[39m
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
$ vite build --config vite.esm.config.ts --mode ${NODE_ENV:-development}
|
|
2
|
+
ViteEsmConfig: .
|
|
3
|
+
{
|
|
4
|
+
tsConfigPaths: [
|
|
5
|
+
'/home/runner/work/captcha/captcha/packages/puzzle-assets/tsconfig.json'
|
|
6
|
+
]
|
|
7
|
+
}
|
|
8
|
+
{ externals: [ '@prosopo/puzzle-assets' ] }
|
|
9
|
+
[33mThe plugin "vite-tsconfig-paths" is detected. Vite now supports tsconfig paths resolution natively via the [1mresolve.tsconfigPaths[22m option. You can remove the plugin and set [1mresolve.tsconfigPaths: true[22m in your Vite config instead.[39m
|
|
10
|
+
[36mvite v8.1.6 [32mbuilding ssr environment for production...[36m[39m
|
|
11
|
+
Bundle build started
|
|
12
|
+
[2K
|
|
13
|
+
✓ 7 modules transformed.
|
|
14
|
+
rendering chunks...
|
|
15
|
+
computing gzip size...
|
|
16
|
+
dist/esm/_virtual/_rolldown/runtime.js 0.04 kB │ gzip: 0.06 kB
|
|
17
|
+
dist/esm/levels.js 0.57 kB │ gzip: 0.32 kB
|
|
18
|
+
dist/esm/encode.js 1.47 kB │ gzip: 0.67 kB
|
|
19
|
+
dist/esm/distort.js 3.19 kB │ gzip: 1.27 kB
|
|
20
|
+
dist/esm/phonemes.js 3.49 kB │ gzip: 1.11 kB
|
|
21
|
+
dist/esm/index.js 3.81 kB │ gzip: 1.54 kB
|
|
22
|
+
dist/esm/synth.js 7.61 kB │ gzip: 2.72 kB
|
|
23
|
+
|
|
24
|
+
[32m✓ built in 148ms[39m
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
$ tsc --build --verbose
|
|
2
|
-
|
|
2
|
+
11:53:31 AM - Projects in this build:
|
|
3
3
|
* ../../dev/config/tsconfig.json
|
|
4
4
|
* ../puzzle-assets/tsconfig.json
|
|
5
5
|
* tsconfig.json
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
11:53:31 AM - Project '../../dev/config/tsconfig.json' is up to date because newest input '../../dev/config/src/webpack/webpack.config.ts' is older than output '../../dev/config/dist/tsc/tsconfig.tsbuildinfo'
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
11:53:31 AM - Project '../puzzle-assets/tsconfig.json' is up to date because newest input '../puzzle-assets/src/browser.ts' is older than output '../puzzle-assets/dist/tsc/tsconfig.tsbuildinfo'
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
11:53:31 AM - Project 'tsconfig.json' is out of date because output file 'dist/tsc/tsconfig.tsbuildinfo' does not exist
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
11:53:31 AM - Building project '/home/runner/work/captcha/captcha/packages/audio-assets/tsconfig.json'...
|
|
14
14
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
$ tsc --project tsconfig.types.json
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,27 @@
|
|
|
1
1
|
# @prosopo/audio-assets
|
|
2
2
|
|
|
3
|
+
## 0.2.3
|
|
4
|
+
### Patch Changes
|
|
5
|
+
|
|
6
|
+
- 2086040: Each kind of build now writes to its own folder under dist: dist/esm (vite ESM), dist/cjs (vite CommonJS), dist/types (declarations), dist/tsc (plain tsc), dist/bundle and dist/bundle-webpack (bundles) and dist/native (the Rust addons). Turbo caches each folder separately, so building one variant no longer overwrites or invalidates another. Package exports point at the new folders; anything importing a file from dist by path has to add the variant folder.
|
|
7
|
+
|
|
8
|
+
The Rust addons are no longer committed. They are built into dist/native, in debug for development and tests and fully optimised when NODE_ENV=production, so building them now needs a Rust toolchain.
|
|
9
|
+
|
|
10
|
+
Code that found the repo root or its certificates by climbing a fixed number of folders up from its own file now starts from its package's folder instead (new `packageDir` in @prosopo/util/node). The fixed count stopped working once the build output moved one folder deeper.
|
|
11
|
+
- Updated dependencies [2086040]
|
|
12
|
+
- @prosopo/puzzle-assets@0.2.4
|
|
13
|
+
|
|
14
|
+
## 0.2.2
|
|
15
|
+
### Patch Changes
|
|
16
|
+
|
|
17
|
+
- 46b97b7: Roll up the open Dependabot updates: express 5 (with `@types/express` 5), dotenv 18, undici 8, geolib 4, vitest 5, vite 8.1.6 everywhere, 17 minor and patch bumps (Babel, mongoose, i18next, ip-address, turbo and others), `@angular/router` in the Angular demo, and a GitHub Actions bump.
|
|
18
|
+
|
|
19
|
+
The whole vitest family moves to 5.0.4, including `@vitest/coverage-v8`, because `@vitest/browser-playwright` 5 only works with vitest 5. The `@types/express-serve-static-core` override moves to 5.1.3 to match `@types/express` 5.
|
|
20
|
+
|
|
21
|
+
`@prosopo/dotenv` now loads env files with `quiet: true`. Since dotenv 17, every load prints an "injected env" line to stderr unless told not to.
|
|
22
|
+
- Updated dependencies [46b97b7]
|
|
23
|
+
- @prosopo/puzzle-assets@0.2.3
|
|
24
|
+
|
|
3
25
|
## 0.2.1
|
|
4
26
|
### Patch Changes
|
|
5
27
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"distort.d.ts","sourceRoot":"","sources":["../../src/distort.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAEnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAU9C,eAAO,MAAM,OAAO,WACX,YAAY,UACZ,YAAY,UACZ,MAAM,QACR,MAAM,KACV,IAMF,CAAC;AAMF,eAAO,MAAM,WAAW,WACf,WAAW,QACb,IAAI,SACH,MAAM,KACX,IAsBF,CAAC;AAUF,eAAO,MAAM,SAAS,WAAY,WAAW,OAAO,MAAM,KAAG,IAkC5D,CAAC;AAMF,eAAO,MAAM,QAAQ,WAAY,WAAW,KAAG,IAM9C,CAAC"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { normalise, rms } from "./levels.js";
|
|
2
|
+
const REVERB_COMB_DELAYS_MS = [29.7, 37.1, 41.1, 43.7];
|
|
3
|
+
const REVERB_COMB_FEEDBACK = 0.72;
|
|
4
|
+
const REVERB_ALLPASS_DELAYS_MS = [5.0, 1.7];
|
|
5
|
+
const REVERB_ALLPASS_FEEDBACK = 0.5;
|
|
6
|
+
const SOFT_CLIP_DRIVE = 1.2;
|
|
7
|
+
const OUTPUT_PEAK = 0.92;
|
|
8
|
+
export const mixInto = (target, source, offset, gain) => {
|
|
9
|
+
const start = Math.max(0, Math.floor(offset));
|
|
10
|
+
const count = Math.min(source.length, target.length - start);
|
|
11
|
+
for (let n = 0; n < count; n++) {
|
|
12
|
+
target[start + n] = (target[start + n] ?? 0) + (source[n] ?? 0) * gain;
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
export const addNoiseBed = (buffer, prng, snrDb) => {
|
|
16
|
+
const signalRms = rms(buffer.samples);
|
|
17
|
+
if (signalRms === 0)
|
|
18
|
+
return;
|
|
19
|
+
const targetRms = signalRms / 10 ** (snrDb / 20);
|
|
20
|
+
let b0 = 0;
|
|
21
|
+
let b1 = 0;
|
|
22
|
+
let b2 = 0;
|
|
23
|
+
const noise = new Float32Array(buffer.samples.length);
|
|
24
|
+
for (let n = 0; n < noise.length; n++) {
|
|
25
|
+
const white = prng.next() * 2 - 1;
|
|
26
|
+
b0 = 0.99765 * b0 + white * 0.099;
|
|
27
|
+
b1 = 0.963 * b1 + white * 0.2965;
|
|
28
|
+
b2 = 0.57 * b2 + white * 1.0526;
|
|
29
|
+
noise[n] = (b0 + b1 + b2 + white * 0.1848) * 0.2;
|
|
30
|
+
}
|
|
31
|
+
const noiseRms = rms(noise);
|
|
32
|
+
if (noiseRms === 0)
|
|
33
|
+
return;
|
|
34
|
+
mixInto(buffer.samples, noise, 0, targetRms / noiseRms);
|
|
35
|
+
};
|
|
36
|
+
const delaySamples = (delayMs, sampleRate) => Math.max(1, Math.round((delayMs / 1000) * sampleRate));
|
|
37
|
+
export const addReverb = (buffer, mix) => {
|
|
38
|
+
if (mix <= 0)
|
|
39
|
+
return;
|
|
40
|
+
const { samples, sampleRate } = buffer;
|
|
41
|
+
const wet = new Float32Array(samples.length);
|
|
42
|
+
for (const delayMs of REVERB_COMB_DELAYS_MS) {
|
|
43
|
+
const delay = delaySamples(delayMs, sampleRate);
|
|
44
|
+
const line = new Float32Array(delay);
|
|
45
|
+
let index = 0;
|
|
46
|
+
for (let n = 0; n < samples.length; n++) {
|
|
47
|
+
const delayed = line[index] ?? 0;
|
|
48
|
+
wet[n] = (wet[n] ?? 0) + delayed / REVERB_COMB_DELAYS_MS.length;
|
|
49
|
+
line[index] = (samples[n] ?? 0) + delayed * REVERB_COMB_FEEDBACK;
|
|
50
|
+
index = (index + 1) % delay;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
for (const delayMs of REVERB_ALLPASS_DELAYS_MS) {
|
|
54
|
+
const delay = delaySamples(delayMs, sampleRate);
|
|
55
|
+
const line = new Float32Array(delay);
|
|
56
|
+
let index = 0;
|
|
57
|
+
for (let n = 0; n < wet.length; n++) {
|
|
58
|
+
const input = wet[n] ?? 0;
|
|
59
|
+
const delayed = line[index] ?? 0;
|
|
60
|
+
line[index] = input + delayed * REVERB_ALLPASS_FEEDBACK;
|
|
61
|
+
wet[n] = -input * REVERB_ALLPASS_FEEDBACK + delayed;
|
|
62
|
+
index = (index + 1) % delay;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
for (let n = 0; n < samples.length; n++) {
|
|
66
|
+
samples[n] = (samples[n] ?? 0) * (1 - mix) + (wet[n] ?? 0) * mix;
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
export const finalise = (buffer) => {
|
|
70
|
+
const { samples } = buffer;
|
|
71
|
+
for (let n = 0; n < samples.length; n++) {
|
|
72
|
+
samples[n] = Math.tanh((samples[n] ?? 0) * SOFT_CLIP_DRIVE);
|
|
73
|
+
}
|
|
74
|
+
normalise(samples, OUTPUT_PEAK);
|
|
75
|
+
};
|
|
76
|
+
//# sourceMappingURL=distort.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"distort.js","sourceRoot":"","sources":["../../src/distort.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encode.d.ts","sourceRoot":"","sources":["../../src/encode.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAgB9C,eAAO,MAAM,SAAS,WAAY,WAAW,KAAG,MA+B/C,CAAC;AAEF,eAAO,MAAM,SAAS,QAAS,MAAM,KAAG,MACU,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
const RIFF_HEADER_BYTES = 44;
|
|
2
|
+
const RIFF_PREAMBLE_BYTES = 8;
|
|
3
|
+
const FMT_CHUNK_BYTES = 16;
|
|
4
|
+
const BITS_PER_SAMPLE = 16;
|
|
5
|
+
const BYTES_PER_SAMPLE = BITS_PER_SAMPLE / 8;
|
|
6
|
+
const CHANNELS = 1;
|
|
7
|
+
const PCM_FORMAT_TAG = 1;
|
|
8
|
+
const INT16_SCALE = 0x7fff;
|
|
9
|
+
export const encodeWav = (buffer) => {
|
|
10
|
+
const { samples, sampleRate } = buffer;
|
|
11
|
+
const dataBytes = samples.length * BYTES_PER_SAMPLE;
|
|
12
|
+
const out = Buffer.alloc(RIFF_HEADER_BYTES + dataBytes);
|
|
13
|
+
out.write("RIFF", 0, "ascii");
|
|
14
|
+
out.writeUInt32LE(RIFF_HEADER_BYTES - RIFF_PREAMBLE_BYTES + dataBytes, 4);
|
|
15
|
+
out.write("WAVE", 8, "ascii");
|
|
16
|
+
out.write("fmt ", 12, "ascii");
|
|
17
|
+
out.writeUInt32LE(FMT_CHUNK_BYTES, 16);
|
|
18
|
+
out.writeUInt16LE(PCM_FORMAT_TAG, 20);
|
|
19
|
+
out.writeUInt16LE(CHANNELS, 22);
|
|
20
|
+
out.writeUInt32LE(sampleRate, 24);
|
|
21
|
+
out.writeUInt32LE(sampleRate * CHANNELS * BYTES_PER_SAMPLE, 28);
|
|
22
|
+
out.writeUInt16LE(CHANNELS * BYTES_PER_SAMPLE, 32);
|
|
23
|
+
out.writeUInt16LE(BITS_PER_SAMPLE, 34);
|
|
24
|
+
out.write("data", 36, "ascii");
|
|
25
|
+
out.writeUInt32LE(dataBytes, 40);
|
|
26
|
+
for (let n = 0; n < samples.length; n++) {
|
|
27
|
+
const clamped = Math.max(-1, Math.min(1, samples[n] ?? 0));
|
|
28
|
+
out.writeInt16LE(Math.round(clamped * INT16_SCALE), RIFF_HEADER_BYTES + n * BYTES_PER_SAMPLE);
|
|
29
|
+
}
|
|
30
|
+
return out;
|
|
31
|
+
};
|
|
32
|
+
export const toDataUri = (wav) => `data:audio/wav;base64,${wav.toString("base64")}`;
|
|
33
|
+
//# sourceMappingURL=encode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encode.js","sourceRoot":"","sources":["../../src/encode.ts"],"names":[],"mappings":"AAgBA,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAC7B,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAC9B,MAAM,eAAe,GAAG,EAAE,CAAC;AAC3B,MAAM,eAAe,GAAG,EAAE,CAAC;AAC3B,MAAM,gBAAgB,GAAG,eAAe,GAAG,CAAC,CAAC;AAC7C,MAAM,QAAQ,GAAG,CAAC,CAAC;AACnB,MAAM,cAAc,GAAG,CAAC,CAAC;AAEzB,MAAM,WAAW,GAAG,MAAM,CAAC;AAM3B,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,MAAmB,EAAU,EAAE;IACxD,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC;IACvC,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,gBAAgB,CAAC;IACpD,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,iBAAiB,GAAG,SAAS,CAAC,CAAC;IAExD,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;IAC9B,GAAG,CAAC,aAAa,CAAC,iBAAiB,GAAG,mBAAmB,GAAG,SAAS,EAAE,CAAC,CAAC,CAAC;IAC1E,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;IAE9B,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;IAC/B,GAAG,CAAC,aAAa,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;IACvC,GAAG,CAAC,aAAa,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;IACtC,GAAG,CAAC,aAAa,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAChC,GAAG,CAAC,aAAa,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAClC,GAAG,CAAC,aAAa,CAAC,UAAU,GAAG,QAAQ,GAAG,gBAAgB,EAAE,EAAE,CAAC,CAAC;IAChE,GAAG,CAAC,aAAa,CAAC,QAAQ,GAAG,gBAAgB,EAAE,EAAE,CAAC,CAAC;IACnD,GAAG,CAAC,aAAa,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;IAEvC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;IAC/B,GAAG,CAAC,aAAa,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IAEjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAEzC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3D,GAAG,CAAC,YAAY,CACf,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,WAAW,CAAC,EACjC,iBAAiB,GAAG,CAAC,GAAG,gBAAgB,CACxC,CAAC;IACH,CAAC;IAED,OAAO,GAAG,CAAC;AACZ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,GAAW,EAAU,EAAE,CAChD,yBAAyB,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAEX,mBAAmB,EACnB,sBAAsB,EAEtB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAChE,YAAY,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAC3E,YAAY,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAClC,YAAY,EACX,WAAW,EACX,mBAAmB,EACnB,UAAU,EACV,OAAO,EACP,sBAAsB,EACtB,SAAS,GACT,MAAM,YAAY,CAAC;AAGpB,eAAO,MAAM,uBAAuB,EAAE,mBAOrC,CAAC;AAuDF,eAAO,MAAM,oBAAoB,cACtB,mBAAmB,eACjB,MAAM,KAChB,sBA6DF,CAAC"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { createPrng, createSeed } from "@prosopo/puzzle-assets";
|
|
2
|
+
import { addNoiseBed, addReverb, finalise, mixInto } from "./distort.js";
|
|
3
|
+
import { encodeWav } from "./encode.js";
|
|
4
|
+
import { DIGITS } from "./phonemes.js";
|
|
5
|
+
import { SAMPLE_RATE, randomVoice, synthesiseUtterance, } from "./synth.js";
|
|
6
|
+
export { createPrng, createSeed } from "@prosopo/puzzle-assets";
|
|
7
|
+
export { ANSWER_ALPHABET, DIGITS } from "./phonemes.js";
|
|
8
|
+
export { SAMPLE_RATE, randomVoice, synthesiseUtterance } from "./synth.js";
|
|
9
|
+
export { encodeWav, toDataUri } from "./encode.js";
|
|
10
|
+
export { addNoiseBed } from "./distort.js";
|
|
11
|
+
export { rms } from "./levels.js";
|
|
12
|
+
export const DEFAULT_RENDER_SETTINGS = {
|
|
13
|
+
digitCount: 5,
|
|
14
|
+
noiseSnrDb: 14,
|
|
15
|
+
babbleGain: 0.16,
|
|
16
|
+
babbleVoices: 2,
|
|
17
|
+
reverbMix: 0.12,
|
|
18
|
+
gapMs: 220,
|
|
19
|
+
};
|
|
20
|
+
const LEAD_IN_MS = 250;
|
|
21
|
+
const LEAD_OUT_MS = 350;
|
|
22
|
+
const GAP_JITTER_RATIO = 0.4;
|
|
23
|
+
const MAX_GAP_JITTER_MS = 360;
|
|
24
|
+
const BABBLE_MAX_START_MS = 400;
|
|
25
|
+
const BABBLE_MAX_PAUSE_MS = 500;
|
|
26
|
+
const msToSamples = (ms, sampleRate) => Math.round((ms / 1000) * sampleRate);
|
|
27
|
+
const chooseAnswer = (prng, count) => Array.from({ length: count }, () => prng.pick(DIGITS));
|
|
28
|
+
const renderBabble = (prng, lengthSamples, sampleRate, voices) => {
|
|
29
|
+
const track = new Float32Array(lengthSamples);
|
|
30
|
+
const maxStart = msToSamples(BABBLE_MAX_START_MS, sampleRate);
|
|
31
|
+
const maxPause = msToSamples(BABBLE_MAX_PAUSE_MS, sampleRate);
|
|
32
|
+
for (let v = 0; v < voices; v++) {
|
|
33
|
+
const voice = {
|
|
34
|
+
...randomVoice(prng),
|
|
35
|
+
formantScale: prng.range(0.8, 1.3),
|
|
36
|
+
rate: prng.range(0.75, 1.35),
|
|
37
|
+
};
|
|
38
|
+
let cursor = prng.int(0, maxStart);
|
|
39
|
+
while (cursor < lengthSamples) {
|
|
40
|
+
const word = synthesiseUtterance(prng.pick(DIGITS), voice, prng, sampleRate);
|
|
41
|
+
mixInto(track, word.samples, cursor, prng.range(0.6, 1));
|
|
42
|
+
cursor += word.samples.length + prng.int(0, maxPause);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return track;
|
|
46
|
+
};
|
|
47
|
+
export const renderAudioChallenge = (settings = DEFAULT_RENDER_SETTINGS, sampleRate = SAMPLE_RATE) => {
|
|
48
|
+
const prng = createPrng(createSeed());
|
|
49
|
+
const utterances = chooseAnswer(prng, settings.digitCount);
|
|
50
|
+
const answer = utterances.map((u) => u.answer).join("");
|
|
51
|
+
const voice = randomVoice(prng);
|
|
52
|
+
const words = utterances.map((u) => synthesiseUtterance(u, voice, prng, sampleRate));
|
|
53
|
+
const gapSamples = msToSamples(settings.gapMs, sampleRate);
|
|
54
|
+
const leadIn = msToSamples(LEAD_IN_MS, sampleRate);
|
|
55
|
+
const leadOut = msToSamples(LEAD_OUT_MS, sampleRate);
|
|
56
|
+
const maxJitter = msToSamples(Math.min(settings.gapMs * GAP_JITTER_RATIO, MAX_GAP_JITTER_MS), sampleRate);
|
|
57
|
+
const spoken = words.reduce((total, w) => total + w.samples.length, 0);
|
|
58
|
+
const totalSamples = leadIn +
|
|
59
|
+
spoken +
|
|
60
|
+
gapSamples * Math.max(0, words.length - 1) +
|
|
61
|
+
maxJitter * words.length +
|
|
62
|
+
leadOut;
|
|
63
|
+
const samples = new Float32Array(totalSamples);
|
|
64
|
+
let cursor = leadIn;
|
|
65
|
+
for (const word of words) {
|
|
66
|
+
mixInto(samples, word.samples, cursor, 1);
|
|
67
|
+
cursor +=
|
|
68
|
+
word.samples.length +
|
|
69
|
+
gapSamples +
|
|
70
|
+
prng.int(-Math.floor(maxJitter / 2), maxJitter);
|
|
71
|
+
}
|
|
72
|
+
const buffer = { samples, sampleRate };
|
|
73
|
+
if (settings.babbleGain > 0 && settings.babbleVoices > 0) {
|
|
74
|
+
const babble = renderBabble(prng, totalSamples, sampleRate, settings.babbleVoices);
|
|
75
|
+
mixInto(samples, babble, 0, settings.babbleGain);
|
|
76
|
+
}
|
|
77
|
+
addReverb(buffer, settings.reverbMix);
|
|
78
|
+
addNoiseBed(buffer, prng, settings.noiseSnrDb);
|
|
79
|
+
finalise(buffer);
|
|
80
|
+
return {
|
|
81
|
+
wav: encodeWav(buffer),
|
|
82
|
+
answer,
|
|
83
|
+
durationMs: Math.round((totalSamples / sampleRate) * 1000),
|
|
84
|
+
};
|
|
85
|
+
};
|
|
86
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"levels.d.ts","sourceRoot":"","sources":["../../src/levels.ts"],"names":[],"mappings":"AAcA,eAAO,MAAM,GAAG,YAAa,YAAY,KAAG,MAO3C,CAAC;AAGF,eAAO,MAAM,SAAS,YAAa,YAAY,QAAQ,MAAM,KAAG,IAU/D,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export const rms = (samples) => {
|
|
2
|
+
if (samples.length === 0)
|
|
3
|
+
return 0;
|
|
4
|
+
let total = 0;
|
|
5
|
+
for (const value of samples) {
|
|
6
|
+
total += value * value;
|
|
7
|
+
}
|
|
8
|
+
return Math.sqrt(total / samples.length);
|
|
9
|
+
};
|
|
10
|
+
export const normalise = (samples, peak) => {
|
|
11
|
+
let max = 0;
|
|
12
|
+
for (const value of samples) {
|
|
13
|
+
max = Math.max(max, Math.abs(value));
|
|
14
|
+
}
|
|
15
|
+
if (max === 0)
|
|
16
|
+
return;
|
|
17
|
+
const gain = peak / max;
|
|
18
|
+
for (let n = 0; n < samples.length; n++) {
|
|
19
|
+
samples[n] = (samples[n] ?? 0) * gain;
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=levels.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"levels.js","sourceRoot":"","sources":["../../src/levels.ts"],"names":[],"mappings":"AAcA,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,OAAqB,EAAU,EAAE;IACpD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACnC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC7B,KAAK,IAAI,KAAK,GAAG,KAAK,CAAC;IACxB,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;AAC1C,CAAC,CAAC;AAGF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,OAAqB,EAAE,IAAY,EAAQ,EAAE;IACtE,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC7B,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;IACtC,CAAC;IACD,IAAI,GAAG,KAAK,CAAC;QAAE,OAAO;IACtB,MAAM,IAAI,GAAG,IAAI,GAAG,GAAG,CAAC;IACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;IACvC,CAAC;AACF,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"phonemes.d.ts","sourceRoot":"","sources":["../../src/phonemes.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAW,SAAS,EAAE,MAAM,YAAY,CAAC;AAmJrD,eAAO,MAAM,MAAM,EAAE,SAAS,SAAS,EAWtC,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,MAA6C,CAAC"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
const STOP_BURST_MS = 18;
|
|
2
|
+
const VOICED_FRICATIVE_VOICE_GAIN = 0.45;
|
|
3
|
+
const NASAL_VOICE_GAIN = 0.5;
|
|
4
|
+
const APPROXIMANT_VOICE_GAIN = 0.85;
|
|
5
|
+
const segmentDefaults = {
|
|
6
|
+
bandwidths: [80, 110, 160],
|
|
7
|
+
voiceGain: 1,
|
|
8
|
+
noiseGain: 0,
|
|
9
|
+
noiseCentreHz: 0,
|
|
10
|
+
noiseBandwidthHz: 0,
|
|
11
|
+
};
|
|
12
|
+
const vowel = (id, f1, f2, f3, durationMs) => ({
|
|
13
|
+
...segmentDefaults,
|
|
14
|
+
id,
|
|
15
|
+
excitation: "voiced",
|
|
16
|
+
formants: [f1, f2, f3],
|
|
17
|
+
durationMs,
|
|
18
|
+
});
|
|
19
|
+
const fricative = (id, centreHz, bandwidthHz, gain, durationMs) => ({
|
|
20
|
+
...segmentDefaults,
|
|
21
|
+
id,
|
|
22
|
+
excitation: "unvoiced",
|
|
23
|
+
formants: [0, 0, 0],
|
|
24
|
+
durationMs,
|
|
25
|
+
voiceGain: 0,
|
|
26
|
+
noiseGain: gain,
|
|
27
|
+
noiseCentreHz: centreHz,
|
|
28
|
+
noiseBandwidthHz: bandwidthHz,
|
|
29
|
+
});
|
|
30
|
+
const voicedFricative = (id, f1, f2, f3, centreHz, bandwidthHz, gain, durationMs) => ({
|
|
31
|
+
...segmentDefaults,
|
|
32
|
+
id,
|
|
33
|
+
excitation: "mixed",
|
|
34
|
+
formants: [f1, f2, f3],
|
|
35
|
+
durationMs,
|
|
36
|
+
voiceGain: VOICED_FRICATIVE_VOICE_GAIN,
|
|
37
|
+
noiseGain: gain,
|
|
38
|
+
noiseCentreHz: centreHz,
|
|
39
|
+
noiseBandwidthHz: bandwidthHz,
|
|
40
|
+
});
|
|
41
|
+
const nasal = (id, f1, f2, f3, durationMs) => ({
|
|
42
|
+
...segmentDefaults,
|
|
43
|
+
id,
|
|
44
|
+
excitation: "voiced",
|
|
45
|
+
formants: [f1, f2, f3],
|
|
46
|
+
bandwidths: [180, 250, 320],
|
|
47
|
+
durationMs,
|
|
48
|
+
voiceGain: NASAL_VOICE_GAIN,
|
|
49
|
+
});
|
|
50
|
+
const closure = (id, durationMs) => ({
|
|
51
|
+
...segmentDefaults,
|
|
52
|
+
id,
|
|
53
|
+
excitation: "silence",
|
|
54
|
+
formants: [0, 0, 0],
|
|
55
|
+
durationMs,
|
|
56
|
+
voiceGain: 0,
|
|
57
|
+
});
|
|
58
|
+
const burst = (id, centreHz, bandwidthHz, gain) => ({
|
|
59
|
+
...segmentDefaults,
|
|
60
|
+
id,
|
|
61
|
+
excitation: "unvoiced",
|
|
62
|
+
formants: [0, 0, 0],
|
|
63
|
+
durationMs: STOP_BURST_MS,
|
|
64
|
+
voiceGain: 0,
|
|
65
|
+
noiseGain: gain,
|
|
66
|
+
noiseCentreHz: centreHz,
|
|
67
|
+
noiseBandwidthHz: bandwidthHz,
|
|
68
|
+
abrupt: true,
|
|
69
|
+
});
|
|
70
|
+
const IY = vowel("IY", 270, 2290, 3010, 150);
|
|
71
|
+
const IH = vowel("IH", 390, 1990, 2550, 95);
|
|
72
|
+
const EH = vowel("EH", 530, 1840, 2480, 110);
|
|
73
|
+
const AH = vowel("AH", 640, 1190, 2390, 105);
|
|
74
|
+
const AA = vowel("AA", 730, 1090, 2440, 140);
|
|
75
|
+
const AO = vowel("AO", 570, 840, 2410, 150);
|
|
76
|
+
const UW = vowel("UW", 300, 870, 2240, 140);
|
|
77
|
+
const OW_OFF = vowel("OW^", 330, 900, 2300, 90);
|
|
78
|
+
const R = {
|
|
79
|
+
...vowel("R", 490, 1350, 1690, 85),
|
|
80
|
+
voiceGain: APPROXIMANT_VOICE_GAIN,
|
|
81
|
+
};
|
|
82
|
+
const W = {
|
|
83
|
+
...vowel("W", 300, 610, 2200, 70),
|
|
84
|
+
voiceGain: APPROXIMANT_VOICE_GAIN,
|
|
85
|
+
};
|
|
86
|
+
const N = nasal("N", 250, 1750, 2600, 90);
|
|
87
|
+
const S = fricative("S", 5800, 3200, 0.5, 130);
|
|
88
|
+
const F = fricative("F", 4200, 5000, 0.24, 120);
|
|
89
|
+
const TH = fricative("TH", 5200, 5600, 0.2, 110);
|
|
90
|
+
const Z = voicedFricative("Z", 300, 1600, 2500, 5200, 3000, 0.3, 110);
|
|
91
|
+
const V = voicedFricative("V", 320, 1100, 2400, 4000, 4600, 0.16, 95);
|
|
92
|
+
const T = [closure("T-", 45), burst("T+", 3800, 3400, 0.55)];
|
|
93
|
+
const K = [closure("K-", 45), burst("K+", 2100, 2200, 0.5)];
|
|
94
|
+
const AY = [AA, { ...IY, durationMs: 110 }];
|
|
95
|
+
const EY = [EH, { ...IY, durationMs: 105 }];
|
|
96
|
+
const OW = [AO, OW_OFF];
|
|
97
|
+
export const DIGITS = [
|
|
98
|
+
{ answer: "0", phonemes: [Z, IH, R, ...OW] },
|
|
99
|
+
{ answer: "1", phonemes: [W, AH, N] },
|
|
100
|
+
{ answer: "2", phonemes: [...T, UW] },
|
|
101
|
+
{ answer: "3", phonemes: [TH, R, IY] },
|
|
102
|
+
{ answer: "4", phonemes: [F, AO, R] },
|
|
103
|
+
{ answer: "5", phonemes: [F, ...AY, V] },
|
|
104
|
+
{ answer: "6", phonemes: [S, IH, ...K, S] },
|
|
105
|
+
{ answer: "7", phonemes: [S, EH, V, AH, N] },
|
|
106
|
+
{ answer: "8", phonemes: [...EY, ...T] },
|
|
107
|
+
{ answer: "9", phonemes: [N, ...AY, N] },
|
|
108
|
+
];
|
|
109
|
+
export const ANSWER_ALPHABET = DIGITS.map((d) => d.answer).join("");
|
|
110
|
+
//# sourceMappingURL=phonemes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"phonemes.js","sourceRoot":"","sources":["../../src/phonemes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"synth.d.ts","sourceRoot":"","sources":["../../src/synth.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAEnD,OAAO,KAAK,EAAE,WAAW,EAAW,SAAS,EAAE,MAAM,YAAY,CAAC;AAGlE,eAAO,MAAM,WAAW,QAAQ,CAAC;AAgBjC,MAAM,WAAW,KAAK;IACrB,IAAI,EAAE,MAAM,CAAC;IAEb,YAAY,EAAE,MAAM,CAAC;IAErB,YAAY,EAAE,MAAM,CAAC;IAErB,IAAI,EAAE,MAAM,CAAC;IAKb,YAAY,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,WAAW,SAAU,IAAI,KAAG,KAMvC,CAAC;AA2OH,eAAO,MAAM,mBAAmB,cACpB,SAAS,SACb,KAAK,QACN,IAAI,eACE,MAAM,KAChB,WA4DF,CAAC"}
|