Рубрики
Без рубрики

Улучшить звук путем удаления стационарного фонового шума

Стационарный фоновый шум, такой как рев двигателя самолета, можно удалить путем настройки функций снижения шума и диалога усиления API от Python. Tagged with Audio, Python, Video.

Что такое шум и как от него избавиться? Учитывая, что не все средства массовой информации могут быть созданы в идеально контролируемой профессиональной студийной среде, это обычно собирать звуки, которые не были частью того, что создатель намеревался создать.

Шум определяется как нежелательный звук, но то, что нежелательно может варьироваться в зависимости от контекста. Чтобы помочь вам предоставить лучший опыт медиа, который вы можете для аудитории вашего приложения или платформы, API -интерфейсы Dolby по обработке медиа -обработки анализируют контент и решают, какой из нескольких различных алгоритмов снижения шума применить и какую сумму для получения наилучшего звука. Мы называем их снижением шума и изоляцией речи. Мы собираемся посмотреть на различные типы шума и изучить, как использовать API -интерфейсы обработки среды для автоматизации обнаружения и удаления шума, делая HTTP -запросы с различными параметрами из Python Анкет

Стационарный или Статический Шум типичен, когда в звуковом сигнале присутствует звук с низким объемом фона громкости. Этот шум, как правило, согласуется на всю часть носителя, потому что источник звука не меняется.

Есть ряд вещей, которые могут вызвать стационарный звук:

  • Само аудио оборудование, такое как шипение микрофона или электрический гул частоты линии силовой линии
  • вентилятор компьютера, работающий на заднем плане
  • нагревание или кондиционирование воздуха циркулирующего воздуха

Обнаружение этого типа шумоподавление может быть сделано с помощью анализа звуковых характеристик, таких как изменения частоты с течением времени для любых гулов, гудений и другого белого шума, который отвлекает от высокого содержания. Существуют различные методы для этого типа цифровой обработки сигналов, чтобы удалить или вычитать этот тип шума.

Нестационарная или Нестатический Шум исходит от менее распространенных звуков, которые появляются нечасто или в циклическое время.

Примеры нестационарных звуков значительно более разнообразны:

  • собака лай
  • Птицы щебетают
  • Клавиатура нажатие
  • скорая помощь проезжает мимо
  • Книга падает с стола

Эти звуки нежелательны, но нелегко обнаружить из самого профиля звука. Еще один способ подумать об этом – это обратное, как смотреть на стационарные звуки. Вместо того, чтобы обнаружить шум, мы используем алгоритмы машинного обучения, которые знают, как поднять желаемые звуки через Речевая изоляция произнесенных слов в определенных типах СМИ.

В зависимости от того, какой тип шума имеет ваш носитель, может изменить то, как вы хотите настроить некоторые параметры на API -интерфейсы обработки носителя. Если вы видели Страница продукта Media Processing Возможно, вы слушали демонстрационное видео с двумя женщинами во время полета в Амстердам. Это хороший пример стационарного шума, который исходит от гула двигателей самолетов во время полета.

Давайте начнем с построения рабочего процесса по обработке медиа с Python, чтобы улучшить такую сеть.

API API -интерфейсы Dolby.io Media Processing поддерживают многие способы чтения и записи в облачное хранилище, поэтому ознакомьтесь с Ввод и вывод медиа Руководство для запуска некоторых из этих вариантов. Для этого проекта мы собираемся использовать AWS Simple Service (S3) для чтения и записи носителя.

Я сохранил оригинальную неотредактированную копию в частном ведре S3. Если вы хотите следовать вместе с этим примером, вы можете получить доступ к исходному файлу здесь: https://dolbyio.s3-us-west-1.amazonaws.com/public/planeoriginal.mp4

Чтобы обработать его, мне нужно сделать его доступным для API -интерфейсов обработки медиа, чтобы прочитать его. Я могу предоставить временный доступ с так называемым как Представили URL Он кодирует мои права и привилегии для доступа к файлу во временную подпись, которая может быть предоставлена другому лицу или службе, чтобы действовать от моего имени. Это удобный способ сохранить ваши полномочия в частном порядке, но поделитесь ими с API Dolby.io API для временного чтения и записи.

Пакет Boto3 Python имеет функциональность для создания заданного URL. Вы можете узнать больше о том, как установить и настроить эту библиотеку из BOTO3 Документация Если вы не использовали его раньше.

import boto3
from botocore.exceptions import ClientError

def create_presigned_url(bucket_name, object_name, expiration=3600, method='get_object'):
    client = boto3.client('s3')
    try:
        return client.generate_presigned_url(method,
            Params={ 'Bucket': bucket_name, 'Key': object_name },
            ExpiresIn=expiration
            )
    except ClientError as e:
        print(e)

Мы вернемся к тому, как использовать это через мгновение.

Если вы еще этого не сделали, зарегистрируйтесь в учетной записи разработчика, чтобы получить доступ к вашим ключам API. Нам понадобится это, чтобы использовать API -интерфейсы обработки медиа. Я обычно рекомендую хранить их в качестве переменных среды, которые вы можете прочитать, чтобы не хранить его с исходным кодом.

Вам нужно будет просмотреть документацию для вашей среды оболочки для того, как правильно установить переменные среды.

import os

# Read API Key from runtime environment
api_key = os.environ['DOLBYIO_API_KEY']

Для этого проекта мы также будем использовать популярную библиотеку запросов Python. Проверьте руководство автостопщика по Python, если вам нужна помощь в создании местной среды. Так как мы также будем называть несколько API -интерфейсов обработки медиа, это может быть полезно для настройки нескольких многоразовых методов, таких как это:

import requests

# Construct URL from path
def get_url(url_path):
    return "https://api.dolby.com/" + url_path


# Return headers needed when calling Media Processing
# APIs with the api key embedded
def get_headers(api_key):
    return {
        "x-api-key": api_key,
        "Content-Type": "application/json",
        "Accept": "application/json",
    }

Сколько шума в этом медиа -файле? Давайте используем API -анализ средств массовой информации, чтобы узнать. Как описано в документации, это асинхронный API. Это означает, что нам нужно сделать http Пост запрос начать обработка и отдельная Получить запрос на получение результата.

Этот метод начнет запускать работу, когда будет предоставлен ваш ключ API и заданный URL -адрес, как мы сгенерировали ранее.

def post_media_analyze(api_key, input_url):
    url = get_url("/media/analyze")
    headers = get_headers(api_key)

    # Input required, otherwise use defaults
    body = {
        "input": input_url
    }

    response = requests.post(url, json=body, headers=headers)    response.raise_for_status()
    return response.json()["job_id"]

Когда вы называете, это возвращает нам уникальный job_id Анкет Нам нужно это значение, чтобы проверить статус обработки носителя. Для этого мы делаем отдельный Получить запросить ту же конечную точку. В зависимости от размера носителя, который может занять некоторое время, мы просто используем Time.sleep () подождать несколько секунд, прежде чем сделать рекурсивный звонок, чтобы попробовать еще раз.

import time

def get_media_analyze(api_key, job_id, wait=5):
    url = get_url("/media/analyze")
    headers = get_headers(api_key)

    params = {
        "job_id": job_id
    }

    response = requests.get(url, params=params, headers=headers)    response.raise_for_status()
    data = response.json()    if data["status"] not in ["Pending", "Running"]:        return data    # Keep trying until job is complete    time.sleep(wait)    return get_media_analyze(api_key, job_id, wait=wait)

Собрав все это вместе, мы можем распечатать результаты JSON для проверки.

    import json

    presigned_url = create_presigned_url('dolbyio', 'public/PlaneOriginal.mp4')
    job_id = post_media_analyze(api_key, presigned_url)
    results = get_media_analyze(api_key, job_id)
    print(json.dumps(results, indent=4, sort_keys=True))

Обнаруженный средний уровень шума и отношение сигнала к шуму исходного файла сообщается как -42,38 и 30,83 соответственно.

    "noise": {
        "level_average": -42.38,
        "snr_average": 30.83
    }

СМИ улучшит API, использует интеллектуальный подход к управлению шумом. В алгоритме есть два элемента: снижение шума и изоляция речи. Благодаря шумоподавляющему восстановлению звуки подавляются. При изоляции речи присутствие диалога выдвигается, чтобы сделать его более выраженным. Используя только параметры по умолчанию, результат пытается сбалансировать между этими двумя подходами, а также выявляет другие заметные примеси, такие как сибилианс, при этом улучшая тональный баланс, выравнивание и улучшение динамики.

Опираясь на наш рабочий процесс, мы можем добавить метод для инициирования процесса улучшения. Это работает в основном одинаково, но требует оба Вход и вывод параметры. Это означает, что нам нужно сгенерировать второй предписанный URL для написания вывода.

def post_media_enhance(api_key, input_url, output_url):
    url = get_url('/media/enhance')
    headers = get_headers(api_key)
    # input/output required, otherwise use defaults
    body = {
        "input": input_url,
        "output": output_url
    }

    response = requests.post(url, json=body, headers=headers)    
    response.raise_for_status()    
    return response.json()["job_id"]

Как и прежде, мы получаем job_id, который мы будем использовать в качестве ввода, чтобы проверить статус. Работа будет проходить через несколько этапов, поэтому мы можем прекратить обработку, если мы получим ошибку или успешный результат.

def get_media_enhance(api_key, job_id, wait=5):
    url = get_url("/media/enhance")
    headers = get_headers(api_key)

    params = {
        "job_id": job_id
    }

    response = requests.get(url, params=params, headers=headers)    
    response.raise_for_status()    

    data = response.json()    
    if data["status"] not in ["Pending", "Running"]:        
        return data    # Keep trying until complete    
        time.sleep(wait)    
        return get_media_enhance(api_key, job_id, wait=wait)

Сделать все это вместе выглядеть как:

  input_url = create_presigned_url('dolbyio', 'public/PlaneOriginal.mp4')
    # We need a presigned url that grants permission to write
    output_url = create_presigned_url('dolbyio', 'output/PlaneEnhanced.mp4', method='put_object')
    job_id = post_media_enhance(api_key, presigned_url, output_url)
    results = get_media_enhance(api_key, job_id)

Когда вы посмотрите на результаты, вы получаете указание, что работа была успешной, но вам нужно взять свой файл с S3, чтобы осмотреть результаты.

Например, вы можете сделать это с помощью командной строки или написать другой метод для загрузки результата. Более подробную информацию об использовании AWS CLI можно найти из документации Amazon. Вот быстрый пример того, как загрузить носитель со своего ведра в локальную файловую систему.

aws s3 cp s3://dolbyio/output/PlaneEnhanced.mp4 ./

После загрузки вы можете начать слушать результаты. Настройки по умолчанию должны звучать великолепно, но в зависимости от характеристик обработанного носителя может быть некоторая дополнительная тонкая настройка, которую вы, возможно, захотите попробовать.

По умолчанию снижение шума не достигнет максимальной суммы, если вы не указате, что хотите это поведение. Это может быть полезно для особенно шумного содержания.

Этот следующий пример иллюстрирует, как использовать максимальное количество шумоподавления, отключая изоляцию речи, чтобы услышать влияние только снижения шума.

def max_noise_reduction(api_key, input_url, output_url):
    url = get_url("/media/enhance")
    headers = get_headers(api_key)

    body = {
        "input": input_url,
        "output": output_url,
        "audio": {
            "noise": {
                "reduction":  {
                    "amount": "max"
                }
            }, 
            "speech": {
                "isolation": {
                    "enable": False
                }
            }
        }
    }

    response = requests.post(url, json=body, headers=headers)    
    response.raise_for_status()

    return response.json()["job_id"]

Количество снижения шума может быть установлено на значения низкого, среднего, высокого или максимума. Если вы обнаружите, что автоматические урегулирования по умолчанию производят артефакты, призраки или ограниченные вокальные тона, вы можете набрать количество шумоподавления, чтобы быть более или менее агрессивным, чтобы соответствовать вашим потребностям и предпочтительного звука. Вы можете найти немного больше об этом из Справочная документация API Анкет

Подобно настройке для снижения шума, вы можете увеличить количество изоляции речи. Это полностью делает акцент на диалоговом окне, чтобы другой звук, такой как то, что идентифицируется как музыка, может быть удален.

Вот как это выглядит:

def max_speech_isolation(api_key, input_url, output_url):
    url = get_url('/media/enhance')
    headers = get_headers(api_key)

    body = {
        'input': input_url,
        'output': output_url,
        'audio': {
            'noise': {
                'reduction':  {
                    'enable': False
                }
            }, 
            'speech': {
                'isolation': {
                    'amount': 100
                }
            }
        }
    }

    response = requests.post(url, json=body, headers=headers)    
    response.raise_for_status()

    return response.json()["job_id"]

Выделение речи колеблется от 0 до 100 и по умолчанию будет автоматически настроена в диапазоне 20-80%. Если у вас есть контент, в котором имеет значение только речь, и вы хотите сохранение голоса, увеличение количества изоляции может улучшить результаты, которые вы получаете от обработки медиа.

И наоборот, если вы запускаете обработку носителя и уведомление шума в результате стробирования, вы можете настроить это значение до более низкого значения.

API -интерфейсы обработки медиа прилагают все усилия, чтобы разумно управлять шумом и речью в ваших средствах массовой информации, чтобы вам не приходилось думать об этом. Есть ограничения, хотя алгоритмы шумового стробирования не думают о звуке творчески для того, что вдохновило процесс создания контента. Это одна из областей, в которой API улучшает средства массовой информации от других инструментов обработки аудио, но для получения абсолютного лучшего звука для ваших средств массовой информации, как вы предполагаете, вы можете настроить количество шумоподавления и изоляции речи для достижения звуковой ясности.

Чтобы узнать больше об API Enhance, ознакомьтесь с Справочная документация API Анкет Мы также предоставили примеры кода, такие как те, которые были найдены в этом посте в репозитории GitHub. Проверьте СМИ-АПИ-САМЕЛЫ Если вам нужна помощь, чтобы начать создавать свой собственный рабочий процесс в СМИ с Python, JavaScript, Curl и т. Д.

Оригинал: “https://dev.to/dolbyio/enhance-audio-by-removing-stationary-background-noise-14gc”