@gentbajko/slopify 3.11.5 → 3.11.6
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/extension/slopify-studio-chrome.zip +0 -0
- package/dist/extension/slopify-studio-firefox.zip +0 -0
- package/dist/patch-notes/3.11.6.md +5 -0
- package/dist/patch-notes/index.json +6 -0
- package/dist/slices/loudness/level-pieces.js +15 -7
- package/dist/slices/loudness/phrase-level.js +3 -0
- package/package.json +1 -1
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
# Slopify 3.11.6
|
|
2
|
+
|
|
3
|
+
Released 6 October 2026.
|
|
4
|
+
|
|
5
|
+
- **Loud bursts come down further, quiet passages stay quiet.** Level the volume takes the narration phrase by phrase twice now. After the first pass lowers the phrases that burst out, the narration's loud words are quieter too, so a chunk's opening still stood above them; the second pass holds it to them. Whispers and low passages are never raised, and the export is still mastered to your target, so normal speech plays as loud as before. Videos rendered from now on get it.
|
|
@@ -2,7 +2,7 @@ import { mkdirSync, rmSync } from "node:fs";
|
|
|
2
2
|
import { join } from "node:path";
|
|
3
3
|
import { levelFile, measurable } from "./loudnorm.js";
|
|
4
4
|
import { pieceLufs, pieceTruePeak, spreadOf } from "./model.js";
|
|
5
|
-
import { lowerLoudPhrases } from "./phrase-level.js";
|
|
5
|
+
import { lowerLoudPhrases, phrasePasses } from "./phrase-level.js";
|
|
6
6
|
// Every narration piece brought to the one common loudness before the join (`levelFile`), its
|
|
7
7
|
// loud phrases lowered first (`phrase-level.ts`), each
|
|
8
8
|
// written again as a WAV in `directory` for the join to read in their place. They come out in one format (44.1 kHz mono, which is what the
|
|
@@ -21,12 +21,20 @@ export async function levelPieces(run, files, directory) {
|
|
|
21
21
|
run.signal.throwIfAborted();
|
|
22
22
|
const output = join(directory, `piece-${String(index + 1).padStart(4, "0")}.wav`);
|
|
23
23
|
// A phrase that bursts out above the narration around it (most of all a request's first
|
|
24
|
-
// words) comes down first
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
const
|
|
28
|
-
|
|
29
|
-
|
|
24
|
+
// words) comes down first, twice: once loud phrases are lowered, the narration's loud words
|
|
25
|
+
// are quieter too, and an opening still stands above them. Quiet passages are never raised.
|
|
26
|
+
let source = file;
|
|
27
|
+
const made = [];
|
|
28
|
+
for (let pass = 1; pass <= phrasePasses; pass++) {
|
|
29
|
+
const phrased = `${output}.phrases-${String(pass)}.wav`;
|
|
30
|
+
if (!(await lowerLoudPhrases(run, source, phrased)))
|
|
31
|
+
break;
|
|
32
|
+
made.push(phrased);
|
|
33
|
+
source = phrased;
|
|
34
|
+
}
|
|
35
|
+
const measured = await levelFile(run, source, output, goal, format);
|
|
36
|
+
for (const one of made)
|
|
37
|
+
rmSync(one, { force: true });
|
|
30
38
|
levelled.push(output);
|
|
31
39
|
if (!measurable(measured.before)) {
|
|
32
40
|
skipped += 1;
|
|
@@ -11,6 +11,9 @@ import { parseFrames } from "./line-level.js";
|
|
|
11
11
|
// like a compressor letting go: snapping back after a lowered phrase made the next one jump
|
|
12
12
|
// out. Phrases at the usual level are left as they are, nothing moves in time, and the export's
|
|
13
13
|
// own levelling then brings the narration to its target, so it is not made quieter.
|
|
14
|
+
// How often the narration is taken phrase by phrase (`level-pieces.ts`): a second pass holds
|
|
15
|
+
// what is still loud against the narration the first left.
|
|
16
|
+
export const phrasePasses = 2;
|
|
14
17
|
// ceiling: the most a phrase is lowered.
|
|
15
18
|
const capDb = 8;
|
|
16
19
|
// A momentary reading under this is a pause, not speech.
|