@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.
Files changed (78) hide show
  1. package/.turbo/turbo-build$colon$cjs.log +2 -2
  2. package/.turbo/turbo-build$colon$esm.log +24 -0
  3. package/.turbo/turbo-build$colon$tsc.log +5 -5
  4. package/.turbo/turbo-build$colon$types.log +1 -0
  5. package/CHANGELOG.md +22 -0
  6. package/dist/tsc/distort.d.ts.map +1 -0
  7. package/dist/tsc/distort.js +76 -0
  8. package/dist/tsc/distort.js.map +1 -0
  9. package/dist/tsc/encode.d.ts.map +1 -0
  10. package/dist/tsc/encode.js +33 -0
  11. package/dist/tsc/encode.js.map +1 -0
  12. package/dist/tsc/index.d.ts.map +1 -0
  13. package/dist/tsc/index.js +86 -0
  14. package/dist/tsc/index.js.map +1 -0
  15. package/dist/tsc/levels.d.ts.map +1 -0
  16. package/dist/tsc/levels.js +22 -0
  17. package/dist/tsc/levels.js.map +1 -0
  18. package/dist/tsc/phonemes.d.ts.map +1 -0
  19. package/dist/tsc/phonemes.js +110 -0
  20. package/dist/tsc/phonemes.js.map +1 -0
  21. package/dist/tsc/synth.d.ts.map +1 -0
  22. package/dist/tsc/synth.js +211 -0
  23. package/dist/tsc/synth.js.map +1 -0
  24. package/dist/tsc/tests/audioAssets.unit.test.d.ts.map +1 -0
  25. package/dist/tsc/tests/audioAssets.unit.test.js.map +1 -0
  26. package/dist/tsc/types.d.ts.map +1 -0
  27. package/dist/tsc/types.js.map +1 -0
  28. package/dist/types/distort.d.ts +7 -0
  29. package/dist/types/distort.d.ts.map +1 -0
  30. package/dist/types/encode.d.ts +4 -0
  31. package/dist/types/encode.d.ts.map +1 -0
  32. package/dist/types/index.d.ts +13 -0
  33. package/dist/types/index.d.ts.map +1 -0
  34. package/dist/types/levels.d.ts +3 -0
  35. package/dist/types/levels.d.ts.map +1 -0
  36. package/dist/types/phonemes.d.ts +4 -0
  37. package/dist/types/phonemes.d.ts.map +1 -0
  38. package/dist/types/synth.d.ts +13 -0
  39. package/dist/types/synth.d.ts.map +1 -0
  40. package/dist/types/tests/audioAssets.unit.test.d.ts +2 -0
  41. package/dist/types/tests/audioAssets.unit.test.d.ts.map +1 -0
  42. package/dist/types/types.d.ts +35 -0
  43. package/dist/types/types.d.ts.map +1 -0
  44. package/package.json +14 -15
  45. package/.turbo/turbo-build.log +0 -25
  46. package/dist/distort.d.ts.map +0 -1
  47. package/dist/distort.js.map +0 -1
  48. package/dist/encode.d.ts.map +0 -1
  49. package/dist/encode.js.map +0 -1
  50. package/dist/index.d.ts.map +0 -1
  51. package/dist/index.js.map +0 -1
  52. package/dist/levels.d.ts.map +0 -1
  53. package/dist/levels.js.map +0 -1
  54. package/dist/phonemes.d.ts.map +0 -1
  55. package/dist/phonemes.js.map +0 -1
  56. package/dist/synth.d.ts.map +0 -1
  57. package/dist/synth.js.map +0 -1
  58. package/dist/tests/audioAssets.unit.test.d.ts.map +0 -1
  59. package/dist/tests/audioAssets.unit.test.js.map +0 -1
  60. package/dist/types.d.ts.map +0 -1
  61. package/dist/types.js.map +0 -1
  62. /package/dist/{_virtual → esm/_virtual}/_rolldown/runtime.js +0 -0
  63. /package/dist/{distort.js → esm/distort.js} +0 -0
  64. /package/dist/{encode.js → esm/encode.js} +0 -0
  65. /package/dist/{index.js → esm/index.js} +0 -0
  66. /package/dist/{levels.js → esm/levels.js} +0 -0
  67. /package/dist/{phonemes.js → esm/phonemes.js} +0 -0
  68. /package/dist/{synth.js → esm/synth.js} +0 -0
  69. /package/dist/{distort.d.ts → tsc/distort.d.ts} +0 -0
  70. /package/dist/{encode.d.ts → tsc/encode.d.ts} +0 -0
  71. /package/dist/{index.d.ts → tsc/index.d.ts} +0 -0
  72. /package/dist/{levels.d.ts → tsc/levels.d.ts} +0 -0
  73. /package/dist/{phonemes.d.ts → tsc/phonemes.d.ts} +0 -0
  74. /package/dist/{synth.d.ts → tsc/synth.d.ts} +0 -0
  75. /package/dist/{tests → tsc/tests}/audioAssets.unit.test.d.ts +0 -0
  76. /package/dist/{tests → tsc/tests}/audioAssets.unit.test.js +0 -0
  77. /package/dist/{types.d.ts → tsc/types.d.ts} +0 -0
  78. /package/dist/{types.js → tsc/types.js} +0 -0
@@ -7,7 +7,7 @@ ViteCommonJSConfig: .
7
7
  }
8
8
  { externals: [ '@prosopo/puzzle-assets' ] }
9
9
  The plugin "vite-tsconfig-paths" is detected. Vite now supports tsconfig paths resolution natively via the resolve.tsconfigPaths option. You can remove the plugin and set resolve.tsconfigPaths: true in your Vite config instead.
10
- vite v8.1.5 building ssr environment for production...
10
+ vite v8.1.6 building ssr environment for production...
11
11
  Bundle build started
12
12
  
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
- ✓ built in 74ms
23
+ ✓ built in 55ms
@@ -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
+ The plugin "vite-tsconfig-paths" is detected. Vite now supports tsconfig paths resolution natively via the resolve.tsconfigPaths option. You can remove the plugin and set resolve.tsconfigPaths: true in your Vite config instead.
10
+ vite v8.1.6 building ssr environment for production...
11
+ Bundle build started
12
+ 
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
+ ✓ built in 148ms
@@ -1,14 +1,14 @@
1
1
  $ tsc --build --verbose
2
- 5:29:59 PM - Projects in this build:
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
- 5:29:59 PM - 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/tsconfig.tsbuildinfo'
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
- 5:29:59 PM - Project '../puzzle-assets/tsconfig.json' is up to date because newest input '../puzzle-assets/src/background.ts' is older than output '../puzzle-assets/tsconfig.tsbuildinfo'
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
- 5:29:59 PM - Project 'tsconfig.json' is out of date because output file 'tsconfig.tsbuildinfo' does not exist
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
- 5:29:59 PM - Building project '/home/runner/work/captcha/captcha/packages/audio-assets/tsconfig.json'...
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"}