{"_id":"@audio/loudness-contrast","_rev":"5-8cf9585f111436d37e1912d46c8a8264","name":"@audio/loudness-contrast","dist-tags":{"latest":"1.0.4"},"versions":{"1.0.0":{"name":"@audio/loudness-contrast","version":"1.0.0","keywords":["audio","dsp","loudness","contrast","wcag"],"author":{"name":"Dmitry Iv.","email":"dfcreative@gmail.com"},"license":"MIT","_id":"@audio/loudness-contrast@1.0.0","maintainers":[{"name":"jamen","email":"jamenmarz@gmail.com"},{"name":"dfcreative","email":"df.creative@gmail.com"},{"name":"dy","email":"df.creative@gmail.com"}],"homepage":"https://github.com/audiojs/loudness/tree/main/packages/loudness-contrast","bugs":{"url":"https://github.com/audiojs/loudness/issues"},"dist":{"shasum":"2894b0e84088cb33c5fc926ce053fcadaa1f0c5e","tarball":"https://registry.npmjs.org/@audio/loudness-contrast/-/loudness-contrast-1.0.0.tgz","fileCount":3,"integrity":"sha512-NfKkpfEId/6WZ4AyL3BKNIroqgdgj0DAFKq7DUeP03XFnImf9VCrb1a+7AycNaWg/EkektK0V7Ea7sXXt1Fq+Q==","signatures":[{"sig":"MEUCIQDqZs9hZyAyR+Epm760RHTAyYzDn5Qd9couFKaG66F0jgIgTVR3Bg0ElqFVYmOhz8dmyFkYIGnvaOL559EDJjpmjtc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4457},"main":"contrast.js","type":"module","audio":"./audio.js","engines":{"node":">=18"},"exports":{".":"./contrast.js","./audio":"./audio.js","./package.json":"./package.json"},"gitHead":"158a5506cc97179e6c26624e123eb3477ef0c4fc","_npmUser":{"name":"dy","email":"df.creative@gmail.com"},"repository":{"url":"git+https://github.com/audiojs/loudness.git","type":"git","directory":"packages/loudness-contrast"},"_npmVersion":"11.12.1","description":"Speech contrast — foreground/background RMS difference, WCAG 2.0 SC 1.4.7 (Audacity Contrast)","directories":{},"sideEffects":false,"_nodeVersion":"25.9.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/loudness-contrast_1.0.0_1783694025089_0.7137171093971195","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@audio/loudness-contrast","version":"1.0.1","keywords":["audio","dsp","loudness","contrast","wcag"],"author":{"name":"Dmitry Iv.","email":"dfcreative@gmail.com"},"license":"MIT","_id":"@audio/loudness-contrast@1.0.1","maintainers":[{"name":"jamen","email":"jamenmarz@gmail.com"},{"name":"dfcreative","email":"df.creative@gmail.com"},{"name":"dy","email":"df.creative@gmail.com"}],"homepage":"https://github.com/audiojs/loudness/tree/main/packages/loudness-contrast","bugs":{"url":"https://github.com/audiojs/loudness/issues"},"dist":{"shasum":"4ea0b925a9ba9debd8875e37292405eda557d05e","tarball":"https://registry.npmjs.org/@audio/loudness-contrast/-/loudness-contrast-1.0.1.tgz","fileCount":3,"integrity":"sha512-hHrLkzxTE2H/hrtjh4OVp6g8/jJY1qlnNdiq+uxVvFPRzH0MuIcbHHOnbDpwq9+V0muuPreZA56pQZbU9dKpxw==","signatures":[{"sig":"MEUCIQDYlyzGWBE2jruvwz93TyxdtjY9QqRMh/Qg5eWbI3Y2pQIgU8M6e4GeFhkzclMSCdjTH5KrRhs++cGGtZJ1i3hk9x8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4575},"main":"contrast.js","type":"module","audio":"./audio.js","engines":{"node":">=18"},"exports":{".":"./contrast.js","./audio":"./audio.js","./package.json":"./package.json"},"gitHead":"fa4f110e9f5639f51b246e5527656be6b1007425","_npmUser":{"name":"dy","email":"df.creative@gmail.com"},"repository":{"url":"git+https://github.com/audiojs/loudness.git","type":"git","directory":"packages/loudness-contrast"},"_npmVersion":"11.12.1","description":"Speech contrast — foreground/background RMS difference, WCAG 2.0 SC 1.4.7 (Audacity Contrast)","directories":{},"sideEffects":false,"_nodeVersion":"25.9.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/loudness-contrast_1.0.1_1783694430724_0.9362167081022081","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@audio/loudness-contrast","version":"1.0.2","keywords":["audio","dsp","loudness","contrast","wcag"],"author":{"name":"Dmitry Iv.","email":"dfcreative@gmail.com"},"license":"MIT","_id":"@audio/loudness-contrast@1.0.2","maintainers":[{"name":"jamen","email":"jamenmarz@gmail.com"},{"name":"dfcreative","email":"df.creative@gmail.com"},{"name":"dy","email":"df.creative@gmail.com"}],"homepage":"https://github.com/audiojs/loudness/tree/main/packages/loudness-contrast","bugs":{"url":"https://github.com/audiojs/loudness/issues"},"dist":{"shasum":"162296baf6d26951b14140b428dd67e012bfafb5","tarball":"https://registry.npmjs.org/@audio/loudness-contrast/-/loudness-contrast-1.0.2.tgz","fileCount":4,"integrity":"sha512-6Fx+gIQO0Ro+R7sgY7kvFu5mHtOvqx0eh906ChtzQK/ykuqMRHuggSdjZ9SVdo3NZwxqD0p+Gm36EJ2ZDf1CLg==","signatures":[{"sig":"MEYCIQDqPtaeBTP/0vfaSg8uiTukHm/3QSU3Sd5KdrMz8hM9uwIhAJLa6Lif4ZDIVyaUbKvX3qWigWL3VeXzMw53JHUG/2dl","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5687},"main":"contrast.js","type":"module","audio":"./audio.js","engines":{"node":">=18"},"exports":{".":"./contrast.js","./audio":{"types":"./audio.d.ts","default":"./audio.js"},"./package.json":"./package.json"},"gitHead":"5e020a9f267b93903da1a1f8bf3060637e35ad95","_npmUser":{"name":"dy","email":"df.creative@gmail.com"},"repository":{"url":"git+https://github.com/audiojs/loudness.git","type":"git","directory":"packages/loudness-contrast"},"_npmVersion":"11.12.1","description":"Speech contrast — foreground/background RMS difference, WCAG 2.0 SC 1.4.7 (Audacity Contrast)","directories":{},"sideEffects":false,"_nodeVersion":"25.9.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/loudness-contrast_1.0.2_1783701738625_0.2226951777366024","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@audio/loudness-contrast","version":"1.0.3","keywords":["audio","dsp","loudness","contrast","wcag"],"author":{"name":"Dmitry Iv.","email":"dfcreative@gmail.com"},"license":"MIT","_id":"@audio/loudness-contrast@1.0.3","maintainers":[{"name":"jamen","email":"jamenmarz@gmail.com"},{"name":"dfcreative","email":"df.creative@gmail.com"},{"name":"dy","email":"df.creative@gmail.com"}],"homepage":"https://github.com/audiojs/loudness/tree/main/packages/loudness-contrast","bugs":{"url":"https://github.com/audiojs/loudness/issues"},"dist":{"shasum":"e8583c52f28073da608e932374e805fec3777e7e","tarball":"https://registry.npmjs.org/@audio/loudness-contrast/-/loudness-contrast-1.0.3.tgz","fileCount":6,"integrity":"sha512-CLl6Yuadf8ZKwjODsVa3K701+nHv8vGjIWjSSZwTcv/xJ6otoXPwrN/bRQgRn3pH4GIziozZ3str+r1LRmTDzg==","signatures":[{"sig":"MEUCIFISCTGbkOkMNR2DUYKa0epoQEYHxzqXX1VPDdCgbk/sAiEAmeCYT1UTVQBkz4tEG5M2/AKnr0KtCPUltp0cv1ff5lE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9331},"main":"contrast.js","type":"module","audio":"./audio.js","types":"index.d.ts","engines":{"node":">=18"},"exports":{".":"./contrast.js","./audio":{"types":"./audio.d.ts","default":"./audio.js"},"./package.json":"./package.json"},"funding":"https://github.com/sponsors/audiojs","gitHead":"54e53fc3ef0ffbcb2c428053a323bef99715a825","_npmUser":{"name":"dy","email":"df.creative@gmail.com"},"repository":{"url":"git+https://github.com/audiojs/loudness.git","type":"git","directory":"packages/loudness-contrast"},"_npmVersion":"11.12.1","description":"Speech contrast — foreground/background RMS difference, WCAG 2.0 SC 1.4.7 (Audacity Contrast)","directories":{},"sideEffects":false,"_nodeVersion":"25.9.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/loudness-contrast_1.0.3_1783731619817_0.901875279700471","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"@audio/loudness-contrast","version":"1.0.4","description":"Speech contrast — foreground/background RMS difference, WCAG 2.0 SC 1.4.7 (Audacity Contrast)","type":"module","sideEffects":false,"main":"contrast.js","exports":{".":{"types":"./index.d.ts","default":"./contrast.js"},"./audio":{"types":"./audio.d.ts","default":"./audio.js"},"./package.json":"./package.json"},"types":"index.d.ts","keywords":["audio","dsp","loudness","contrast","wcag"],"license":"MIT","author":{"name":"Dmitry Iv.","email":"dfcreative@gmail.com"},"repository":{"type":"git","url":"git+https://github.com/audiojs/loudness.git","directory":"packages/loudness-contrast"},"homepage":"https://github.com/audiojs/loudness/tree/main/packages/loudness-contrast","bugs":{"url":"https://github.com/audiojs/loudness/issues"},"engines":{"node":">=18"},"publishConfig":{"access":"public"},"audio":"./audio.js","funding":"https://github.com/sponsors/audiojs","gitHead":"095c2c3d8c55523252e4ac64a90aa98ee3616bfe","_id":"@audio/loudness-contrast@1.0.4","_nodeVersion":"25.9.0","_npmVersion":"11.12.1","dist":{"integrity":"sha512-EBXlOFxE+ztt26yNZHz0m8tQJzpoy+PykT1/JtlqUjj7Hp4SuFnYtH769wY/+hrDvQ0gNPNs3sF891E2Qt1jJQ==","shasum":"f547d6c2fe49771800385673c4c384ec6c593ace","tarball":"https://registry.npmjs.org/@audio/loudness-contrast/-/loudness-contrast-1.0.4.tgz","fileCount":6,"unpackedSize":9387,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIFt3Zih5GwroRdUcZ8u/utfWIv4gBs2lLfJYrBe9vBpmAiEAstJq4AuLoW/sS9QEXpOerpTXM9P7E9kd9WdelgX+YJw="}]},"_npmUser":{"name":"dy","email":"df.creative@gmail.com"},"directories":{},"maintainers":[{"name":"jamen","email":"jamenmarz@gmail.com"},{"name":"dfcreative","email":"df.creative@gmail.com"},{"name":"dy","email":"df.creative@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/loudness-contrast_1.0.4_1787019257459_0.3930637842010556"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-10T14:33:44.923Z","modified":"2026-08-18T02:14:17.938Z","1.0.0":"2026-07-10T14:33:45.220Z","1.0.1":"2026-07-10T14:40:30.866Z","1.0.2":"2026-07-10T16:42:18.764Z","1.0.3":"2026-07-11T01:00:19.964Z","1.0.4":"2026-08-18T02:14:17.750Z"},"bugs":{"url":"https://github.com/audiojs/loudness/issues"},"author":{"name":"Dmitry Iv.","email":"dfcreative@gmail.com"},"license":"MIT","homepage":"https://github.com/audiojs/loudness/tree/main/packages/loudness-contrast","keywords":["audio","dsp","loudness","contrast","wcag"],"repository":{"type":"git","url":"git+https://github.com/audiojs/loudness.git","directory":"packages/loudness-contrast"},"description":"Speech contrast — foreground/background RMS difference, WCAG 2.0 SC 1.4.7 (Audacity Contrast)","maintainers":[{"name":"jamen","email":"jamenmarz@gmail.com"},{"name":"dfcreative","email":"df.creative@gmail.com"},{"name":"dy","email":"df.creative@gmail.com"}],"readme":"# @audio/loudness-contrast [![npm](https://img.shields.io/npm/v/@audio/loudness-contrast)](https://www.npmjs.com/package/@audio/loudness-contrast) [![MIT](https://img.shields.io/badge/MIT-%E0%A5%90-white)](https://github.com/krishnized/license)\n\nSpeech contrast — foreground/background RMS difference, WCAG 2.0 SC 1.4.7 (Audacity Contrast)\n\n```\nnpm install @audio/loudness-contrast\n```\n\n```js\nimport speechContrast from '@audio/loudness-contrast'\n```\n\nPower-averaged foreground/background RMS in dB, per the [Audacity Contrast analyzer](https://manual.audacityteam.org/man/contrast.html) — the reference tool for [WCAG 2.0 Success Criterion 1.4.7](https://www.w3.org/WAI/WCAG21/Understanding/low-or-no-background-audio.html) (Low or No Background Audio). Two modes:\n\n- **Explicit** — pass `fg`/`bg` as `[at, duration]` second slices, mirroring Audacity's two-selection workflow.\n- **Auto** — omit either slice and 10 ms frames are pooled into foreground/background by a dB `threshold` (an extension beyond Audacity, which always takes two manual selections). A slice given explicitly is excluded from the auto scan on the other side, so a selection never contaminates the opposite pool.\n\n```js\nspeechContrast(channels, { fg: [0, 1], bg: [4, 1] })   // explicit: two 1 s slices\nspeechContrast(channels)                                // auto: threshold-pooled\n```\n\n| Param | Default | |\n|---|---|---|\n| `fs` | `48000` | Sample rate, Hz |\n| `fg` | — | `[at, duration]` seconds — explicit foreground slice; omit for auto mode |\n| `bg` | — | `[at, duration]` seconds — explicit background slice; omit for auto mode |\n| `threshold` | `-30` | dB level splitting auto-mode frames into foreground/background |\n| `frame` | `0.01` | Auto-mode classification frame, seconds (Audacity: 10 ms chunks) |\n\nAccepts `Float32Array` (mono) or `Float32Array[]` (multichannel — RMS is power-averaged across channels before the dB conversion).\n\nReturns `{ foreground, background, contrast, pass }` — `foreground`/`background` in dB, `contrast` = `foreground - background`, `pass` = `contrast >= 20` (the WCAG 2.0 SC 1.4.7 threshold).\n\n**Use when:** validating that dialogue/narration is intelligible over background music or noise — captioning/accessibility pipelines, video QC.\n\nPer WCAG 2.0 SC 1.4.7 / Audacity Contrast; ratio dB, not LUFS.\n\n---\n\nPart of [@audio/loudness](https://github.com/audiojs/loudness) — the loudness family umbrella. Documented from the reference implementation.\n\nMIT © [audiojs](https://github.com/audiojs)\n","readmeFilename":"README.md"}