Improved "leveling" for speech

New version of “Level Speech” compressor.
LevelSpeech.ny (2.35 KB)
Default Leveling amount 30%:

My assessment:
Good amount of dynamic range reduction. The quieter versions are still noticeably quieter than the louder version, but much less difference. Louder versions sound a little “heavier” and a very slight increase in background noise. Enormously better than any of the results with the Leveler.

Leveling amount 70%:

My assessment:
Very strong leveling, probably more than would be wanted in most situations but could be useful for “maximizing loudness”. It would be interesting to test this on some uncompressed “hard house” or hip-hop recordings. Noticeable “compressed” sound to the louder phrases. Some noticeable increase in background noise, particularly after “I stood a little to the right…sss”

Slight tweak to the effect. The default setting is unchanged but the noise level is a bit lower, particularly at higher settings.
LevelSpeech.ny (2.35 KB)

Another minor tweak. Slight speed improvement when using as a 0 dB limiter (Leveling amout = 0%)
LevelSpeech.ny (2.37 KB)
This is a rather nice “advanced feature” for such a simple effect.

  1. Ensure the track is 32 bit float format.
  2. Amplify above 0 dB.
  3. Apply the effect with “Leveling amount” set to 0.
    The over 0 dB peaks are limited to 0 dB and the track amplified to a peak level of -1 dB.

Tweaked the amount scale to give finer control with subtle settings.
Default threshold (internal setting) raised from -18 to -12 dB.

Not sure is scaling down output to leave headroom is a good idea or not so removed from this version.
LevelSpeech.ny (2.4 KB)

It certainly improves matters …
Demo of Steve's LevelSpeech,ny (2.4 KiB).gif
but how can it “know” when it is the quiet person talking , ( and to increase the gain accordingly ),
rather than a quiet section within the loud person talking, which should be left alone ?

1 Like

Is this plug-in still needed or can it be done with the normal leveler?

If you want a “mild distortion effect”, then “Leveler” may be the effect that you want.
If you want to “even out” the volume of voices in a recording without distortion, then, in my opinion, the “Leveler” effect is not the effect that you want.

I would suggest that you try both the Leveller effect and this “LevelSpeech” plug-in and use whichever you prefer. Please leave comments in this topic with your opinions regarding these two effects.

I tried the level speech plug-in with this audio. I used the -36 threshold and heaviest degree of leveling. I don’t like how it turns out. The louder voice gets very sharp. Some tips to make it smoother?

I think that you may be describing the wrong effect. The latest version of the “LevelSpeech.ny” plug-in from this post does not have a “threshold” setting. If you are referring to the “Leveler” effect (, then I agree that the results sound terrible.

That worked like a charm, thanks. I have a doubt because I put the threshold pretty random. There is a green bar with a lighter and a darker part for the output level. Let’s say the lighter green bar for the quiet voice goes from -36 to -24 then I should select a little below the minimum which would be -38 or so right?

I don’t know what you mean. The “latest version” of the “Level Speech” effect does not have a “threshold” setting.

Which rev is this?


;nyquist plug-in
;version 3
;type process
;name "Level Speech..."
;action "Leveling speech dynamics..."

;; LevelSpeech.ny by Steve Daulton ( March 2014
;; Released under terms of the GNU General Public License version 2:

;control ratio "Leveling amount (%)" real "" 50 0 100
;control threshold "Threshold (dB)" real "" -25 -50 0

(setq ratio (min 1 (max 0 (/ ratio 100))))
(setq ratio (power ratio (/ 12.0)))
(setq threshold (db-to-linear (min 0 threshold)))

(defun get-env (sig)
  (let* ((sr (snd-srate sig))
         (risetime 0.5)   ; seconds
         (falltime 1.0)  ; seconds
         (lookahead (truncate (* risetime sr)))
         (env (snd-follow sig threshold risetime falltime lookahead))
         ; prevent boost at end of selection
         (env (sim env (snd-const 1 dur sr 1)))
         (env (extract-abs (+ risetime (/ 20 sr)) (+ risetime (/ 20 sr) dur) env))
         (env (sum (- 1 ratio)(mult ratio env)))
         (env (snd-exp (diff 0 (snd-log env)))))

;; absolute maximum signal
(defun max-sig (sig)
  (if (arrayp sig)
      (s-max (snd-abs (aref sig 0))(snd-abs (aref sig 1)))
      (snd-abs sig)))

;;; brick wall limiter
(defun limit (s-in)   
  (let* ((la-time (/ 300.0))                      ; lookahead time (seconds)
         (la-s (round (* la-time *sound-srate*))) ; lookahead samples
         (pad-time (* 3 la-time))                 ; padding required at start (s)
         (pad-s (* 3 la-s))                       ; padding smaples
         (padding (snd-const (peak s-in pad-s) 0 *sound-srate* (* 3.0 la-time)))
         (peak-env (snd-avg s-in (* 4 la-s) la-s OP-PEAK))
         (peak-env (sim padding (at-abs pad-time (cue peak-env))))
         (peak-env (extract 0 1 (s-max 1 peak-env))))
    (mult s-in
        (mult -1 (snd-log peak-env))))))

(setq dur (get-duration 1))

  ((< dur 2) "Error.\nSelection must be at least 2 seconds.")
  (t (let ((s (multichan-expand #'limit s)))
       (mult 0.99 s (get-env (max-sig s))))))

Without downloading and comparing every download in the topic, I’ve no idea, but this is the “latest version”:

This plug-in is now available on the wiki:

The current version of LevelSpeech has …

         (risetime 0.5)   ; seconds
         (falltime 1.0)  ; seconds

If you change these to …

         (risetime 0.02)   ; seconds
         (falltime 0.10)  ; seconds

It responds quicker : the changes in gain are less obvious, less pumping/breathing,
e.g. attached
LevelSpeech2.NY (2.55 KB)

1 Like

I found Levelspeech.ny OK. But clicking on “download” only gets me a notepad text. no .exe file. I’m obviously missing something, but what? Otherwise, this plug-in seems to be what I’m looking for.


Nyquist Plug-ins are plain text files, but unlike a normal plain text file, they should NOT have the file name extension “.txt”, they should have the file name extension “.ny”. That “notepad text” file is the plug-in.

If your web browser adds “.txt” to the file name (Safari web browser on Mac is known to do this), then you should change the name back to it’s correct name. For example, if the download says “Levelspeech.ny”, then the name of the download should be “Levelspeech.ny”. If however your web browser changes the name to “Levelspeech.ny.txt”, then you should change it back to “Levelspeech.ny”.

Thanks very much. The installation wasn’t straight-forward; there was a learning curve and some intuition required. But I got it installed and working. This is a fantastic tool. Just what the doctor ordered!

Best regards and thanks again,

Can it normalize stereo channels independently?

Split the track, apply the effect, then join the channels back into a stereo track (See: