Dolby
  • Up and Running
  • Amazon Web Services
  • Sources
  • Hybrik JSON
  • Video Filters
  • Audio Filters
  • Audio Normalization
  • Working with Audio
  • Task Modifiers
  • Package Task
  • Analysis & Quality Control
  • Dolby Technologies
  • Additional Tasks
  • Hybrik Versions
  • QC Player
  • Machine Performance Analysis

    Audio Loudness Normalization Filters

    If you need your production outputs to comply with a specification for audio loudness, you can apply a loudness normalization filter in a Hybrik job. This process will ensure that the loudness of the resulting outputs is set to the levels that you provide in the filter setup. Hybrik offers five methods of applying audio loudness normalization:

    • Dolby Professional Loudness Correction
    • Peak Normalization
    • RMS Normalization
    • Dynamic Normalization

    General Overview

    For best results, you should use a dual-pass normalization process. With the exception “Dynamic Normalization”, the normalization filters perform dual-pass loudness correction to ensure balanced audio loudness levels without any of the artifacts introduced by real-time correction processes. The first pass measures the audio level in an analyze Task, and the second pass in the transcode Task corrects it, thus fully retaining the content creator’s intent and the original dynamics of the content. A typical job that uses 2-pass loudness normalization would include at least these three tasks:

    1. source
    2. analyze (to measure audio levels)
    3. transcode (to produce corrected audio content)

    Dynamic Normalization is a faster single-pass normalization option that can be used, however the overall quality and consistency of the result is not as good as a dual-pass process.

    Dolby Professional Loudness Correction

    also known as DPLC for short

    Correction Mode

    There are two correction modes in the DPLC filter:

    • pcm_normalization
      • measuring the loudness, then scaling the PCM, and re-encoding with the proper dialnorm value. Your source does not need to be PCM audio.
    • metadata_update
      • measuring the loudness, then insertion of a new dialnorm-parameter value into a Dolby Digital or Dolby Digital Plus bitstream. See the “DPLC measure only and set dialnorm” Example at the bottom of this page.
      • Note: Available only by using the preset regulation_type “atsc_a85_agile”.

    DPLC Regulation Types

    regulation_type provides a series of presets you an choose from:

    • atsc_a85_fixed default
    • atsc_a85_agile
    • ebu_r128
    • freetv_op59
    • arib_tr_b32
    • manual

    Preset DPLC Regulation Type

    Choosing one of the presets will apply settings as shown in the table below.

    DPLC Table

    Manual DPLC Regulation Type Parameters

    Choosing manual for the regulation_type allows you to enter custom values for the following settings:

    • correction_mode
      • must be pcm_normalization
    • metering_mode
      • 1770-1, 1770-2, 1770-3, or LeqA
      • See Metering Mode
    • use_dialogue_intelligence
      • true or false
    • loudness_target
      • Loudness target in LKFS between -1 and -31 dB
    • speech_detection_threshold
      • A number between 0 and 100
    • limit_mode
      • true_peak or sample_peak
    • peak_limit_db
      • The peak value in dB to use for loudness correction, -8 to -0.1 dBTP (in increments of 0.1 dBTP)

    Metering Mode

    The Dolby Professional Loudness Correction filter combines the use of standards-based loudness estimation algorithms with Dolby Dialogue Intelligence technology. Supported algorithms are those most prominently in use worldwide: Leq(a), ITU-R BS. 1770-1, ITU-R BS. 1770-2, and ITU-R BS. 1770-3. These algorithms create a value that can be assigned as the loudness level of a program, using a combination of tools that include frequency-weighting curves to account for the human ear’s particular sensitivity to audio in the middle of the hearing spectrum.

    Our API document contains additional information about the available settings for the dplc filter:

    • API Documentation for DPLC parameters

    DPLC Loudness Normalization - Manual Settings Example

    The following example JSON snippet is for a source with one stereo audio track to be analyzed using manual settings, and then transcoded to an mp4 output with corrected stereo audio:

    { 
      "uid": "analyze_task",
      "kind": "analyze",
      "payload": {
        "general_properties": {
          "enabled": true
        },
        "deep_properties": {
          "audio": [
            {
              "dplc": {
                "enabled": true,
                "loudness_target": -16,
                "regulation_type": "manual",
                "limit_mode": "true_peak",
                "correction_mode": "pcm_normalization",
                "metering_mode": "1770-3",
                "peak_limit_db": -3
              }
            }
          ]
        }
      }
    },
    {
      "uid": "transcode_task",
      "kind": "transcode",
      "task": {
        "retry_method": "fail"
      },
      "payload": {
        "location": {
          "storage_provider": "s3",
          "path": "{{destination_path}}"
        },
        "targets": [
          {
            "file_pattern": "audio_corrected.mp4",
            "existing_files": "rename_new",
            "container": {
              "kind": "mp4"
            },
            "video": {
              "codec": "h264",
              "width": 640,
              "height": 360
            },
            "audio": [
              {
                "codec": "aac",
                "channels": 2,
                "sample_rate": 48000,
                "sample_size": 16,
                "filters": [
                  {
                    "kind": "normalize",
                    "payload": {
                      "kind": "dplc"
                    }
                  }
                ]
              }
            ]
          }
        ]
      }
    }  
    

    DPLC Loudness Normalization - Simple Preset Regulation Type Example

    The following job snippet is just the analyze_task using the dplc ebu_r128 preset (you would also apply the DPLC Normalize filter in your transcode task as above):

    {
      "uid": "analyze_task",
      "kind": "analyze",
      "payload": {
        "general_properties": {
          "enabled": true
        },
        "deep_properties": {
          "audio": [
            {
              "dplc": {
                "enabled": true,
                "regulation_type": "ebu_r128"
              }
            }
          ]
        }
      }
    }
    

    DPLC Loudness Normalization - A Complex Example

    The following example job is set up to normalize two source audio tracks (a 6-channel track & a 2-channel track), resulting in an output with two corrected audio tracks. You’ll notice that the analyze task contains two separate objects for dplc analysis; one for each source track, directed by the track_selector object. The results from these analyses are carried to the downstream transcode task for the transcoding engine to apply during audio processing.

      { 
        "uid": "analyze_task",
        "kind": "analyze",
        "payload": {
          "general_properties": {
            "enabled": true
          },
          "deep_properties": {
            "audio": [
              {
                "track_selector": {
                  "index": 0
                },
                "dplc": {
                  "enabled": true,
                  "loudness_target": -16,
                  "regulation_type": "manual",
                  "limit_mode": "true_peak",
                  "correction_mode": "pcm_normalization",
                  "metering_mode": "1770-3",
                  "peak_limit_db": -3
                }
              },
              {
                "track_selector": {
                  "index": 1
                },
                "dplc": {
                  "enabled": true,
                  "loudness_target": -16,
                  "regulation_type": "manual",
                  "limit_mode": "true_peak",
                  "correction_mode": "pcm_normalization",
                  "metering_mode": "1770-3",
                  "peak_limit_db": -3
                }
              }
            ]
          }
        }
      },
      {
        "uid": "transcode_task",
        "kind": "transcode",
        "task": {
          "retry_method": "fail"
        },
        "payload": {
          "location": {
            "storage_provider": "s3",
            "path": "{{destination_path}}"
          },
          "targets": [
            {
              "file_pattern": "audio_corrected_6ch2ch.mp4",
              "existing_files": "rename_new",
              "container": {
                "kind": "mp4"
              },
              "video": {
                "codec": "h264",
                "width": 640,
                "height": 360
              },
              "audio": [
                {
                  "codec": "aac",
                  "channels": 6,
                  "sample_rate": 48000,
                  "sample_size": 16,
                  "filters": [
                    {
                      "kind": "normalize",
                      "payload": {
                        "kind": "dplc",
                        "payload": {
                          "analyzer_track_index": 0
                        }
                      }
                    }
                  ]
                },
                {
                  "codec": "aac",
                  "channels": 2,
                  "sample_rate": 48000,
                  "sample_size": 16,
                  "filters": [
                    {
                      "kind": "normalize",
                      "payload": {
                        "kind": "dplc",
                        "payload": {
                          "analyzer_track_index": 1
                        }
                      }
                    }
                  ]
                }
              ]
            }
          ]
        }
      }   
    

    In the example above, notice how each audio filter payload in the transcode task contains the analyzer_track_index setting. This is used to direct the appropriate data from the analysis results to each output track.

    Peak Normalization

    If you want to use Peak normalization, the source audio levels need to first be measured in an analyze task, and then defined in the transcode target audio filter:

    Analyze Task Peak sample:

    {
      "deep_properties": {
        "audio": {
          "levels": {
            "enabled": true
          }
        }
      }
    }
    

    Transcode Task Peak sample:

    "filters": [
      {
        "kind": "normalize",
        "payload": {
          "kind": "peak",
          "payload": {
            "peak_level_db": -3
          }
        }
      }
    ]
    

    RMS Normalization

    If you want to use RMS normalization, the source audio levels need to first be measured in an analyze task, and then defined in the transcode target audio filter:

    Analyze Task RMS sample:

    {
      "deep_properties": {
        "audio": {
          "levels": {
            "enabled": true
          }
        }
      }
    }
    

    Transcode Task RMS sample:

    "filters": [
      {
        "kind": "normalize",
        "payload": {
          "kind": "rms",
          "payload": {
            "rms_level_db": -10
          }
        }
      }
    ]
    

    Dynamic Normalization

    Dynamic Normalization is a single-pass normalization option that can be used, however the overall quality and consistency of the result is not as good as a dual-pass process.

    Transcode Task Dynamic sample:

    {
      "filters": [
        {
          "kind": "normalize",
          "payload": {
            "kind": "dynamic",
            "payload": {
              "peak_level_db": -3
            }
          }
        }
      ]
    }
    

    Example Jobs

    Complete sample jobs for the examples above can be found below:

    • DPLC normalization preset EBU R128
    • DPLC normalization manual 2ch
    • DPLC normalization manual 6ch/2ch
    • DPLC measure only and set dialnorm Note: no correction is applied
    • PEAK normalization
    • RMS normalization
    • DYNAMIC normalization