audioop — Манипуляция необработанными аудиоданными


Модуль audioop содержит некоторые полезные операции над фрагментами звука. Он работает с фрагментами звука, состоящий из знакового целого числа сэмплов 8, 16, 24 или 32 бит, хранящихся в байтоподобных объектах. Все скалярные элементы являются целыми числами, если не указано иное.

Изменено в версии 3.4: Была добавлена поддержка 24-битных сэмплов. Все функции теперь принимают любые байтоподобные объекты. Входная строка теперь сразу вызывает ошибку.

Модуль обеспечивает поддержку для a-LAW, u-LAW и Intel/DVI ADPCM кодирование.

Несколько более сложных операций принимают только 16-битные сэмплы, в противном случае размер выборки (в байтах) - это всегда параметр операции.

Модуль определяет следующие переменные и функции:

exception audioop.error

Это исключение повышается, на все ошибки, такие как неизвестное количество байт на сэмпл, и т. д.

audioop.add(fragment1, fragment2, width)

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

audioop.adpcm2lin(adpcmfragment, width, state)

Декодер Intel/DVI ADPCM закодированного фрагмента линейным фрагментом. Смотрите описание lin2adpcm() подробные сведения о кодирования ADPCM. Возвращает кортеж (sample, newstate), где сэмпл имеет ширину, указанных в width.

audioop.alaw2lin(fragment, width)

Преобразования фрагментов звука в a-LAW кодирования линейно закодированного звукового фрагмента. a-LAW кодирования всегда использует 8 битные сэмплы, так width относится только к ширине выхода образца фрагмента.

audioop.avg(fragment, width)

Возвращает среднее за всех сэмплов во фрагменте.

audioop.avgpp(fragment, width)

Возвращает средний пик-пик значение за все сэмплы в фрагменте. Никакая фильтрация будет сделана, так что полезность этой процедуры сомнительна.

audioop.bias(fragment, width, bias)

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

audioop.byteswap(fragment, width)

«Байтсвоп» всех сэмплов в фрагменте и возвращает модифицированный фрагмент. Преобразует тупоконечников сэмплы в Little-Endian и наоборот.

Добавлено в версии 3.4.

audioop.cross(fragment, width)

Возвращает число нулевых пересечений в фрагмент передается в качестве аргумента.

audioop.findfactor(fragment, reference)

Возвращает фактор F такие, что rms(add(fragment, mul(reference, -F))) минимальна, т. е. возвращает коэффициент, на который нужно умножить reference, чтобы он соответствовал как можно fragment. Фрагменты должны содержать 2-байтовое сэмплы.

Время, затраченное на эту процедуру пропорциональна len(fragment).

audioop.findfit(fragment, reference)

Постарайтесь как можно лучше соответствовать reference часть fragment (которая должна быть длиннее фрагмент). Это (концептуально) сделано путем принятия фрагменты из fragment, используя findfactor(), чтобы вычислить лучший матч, и свести к минимуму результат. Фрагменты должны содержать 2-байтовое сэмплы. Возвращает кортеж (offset, factor) где offset это (целое число) смещение в fragment где оптимальная матч начался и factor это (с плавающей точкой) фактор, так как в соответствии findfactor().

audioop.findmax(fragment, length)

Поиск fragment за кусок длина сэмплов length (не байт!) с максимальной энергией, т. е. возвращает i для которых rms(fragment[i*2:(i+length)*2]) максимальна. Фрагменты должны содержать 2-байтовое сэмплы.

Процедура занимает время, пропорциональное len(fragment).

audioop.getsample(fragment, width, index)

Возвращает значение сэмпл index от фрагмента.

audioop.lin2adpcm(fragment, width, state)

Преобразовать сэмплы 4-х разрядный Intel/DVI ADPCM кодирования. Кодирование ADPCM-адаптивная схема кодирования, при этом каждый 4-битное число- это разница между одним образцом и затем разделен (переменным) шагом. Алгоритм Intel/DVI ADPCM была выбрана для использования в IMA, поэтому он вполне может стать стандартом.

state-кортеж, содержащий состояние кодера. Кодер возвращает кортеж (adpcmfrag, newstate), newstate должны быть переданы в следующем вызове lin2adpcm(). В первоначальном вызове None может быть принят в качестве состояния. adpcmfrag является ADPCM закодированным фрагментом упакованные 2 4-разрядных значений в байте.

audioop.lin2alaw(fragment, width)

Преобразовать сэмплы в аудио фрагмент a-LAW кодирования и возвращает в качестве объекта байт. a-LAW - это формат кодирования аудио, в котором вы получаете динамический диапазон около 13 бит, используя только 8-битные сэмплы. Это используется звуковым Sun оборудованием, среди других.

audioop.lin2lin(fragment, width, newwidth)

Преобразовать сэмплы между 1-, 2-, 3 - и 4-байтовые форматы.

Примечание

В некоторых аудио форматов, таких как знаковые файлы в формате WAV, 16, 24 и 32-битных сэмплов, но 8-битные сэмплы являются беззнаковыми. Поэтому при преобразовании в 8 бит широких сэмплов для этих форматов, вы должны также добавить 128 к результату:

new_frames = audioop.lin2lin(frames, old_width, 1)
new_frames = audioop.bias(new_frames, 1, 128)

То же, в обратном порядке, должен применяться при конвертации с 8 до 16, 24 или 32 бита сэмплы шириной.

audioop.lin2ulaw(fragment, width)

Преобразовать сэмплы в аудио фрагмент к u-LAW кодирования и возвращает в качестве объекта байт. u-LAW - это формат кодирования аудио, в котором вы получаете динамический диапазон около 14 бит, используя только 8-битные сэмплы. Это используется звуковым Sun оборудованием, среди других.

audioop.max(fragment, width)

Возвращает максимум absolute value всех сэмплов во фрагменте.

audioop.maxpp(fragment, width)

Возвращает максимальное пиковое значение звукового фрагмента.

audioop.minmax(fragment, width)

Возвращает кортеж, состоящий из минимального и максимального значений всех выборок звукового фрагмента.

audioop.mul(fragment, width, factor)

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

audioop.ratecv(fragment, width, nchannels, inrate, outrate, state[, weightA[, weightB]])

Преобразовать частоту кадров фрагмента входного сигнала.

state является кортежем, содержащим состояние преобразователя. Преобразователь возвращаетs кортеж (newfragment, newstate), и newstate должны быть переданы в следующем вызове ratecv(). Первоначальный вызов должен пройти None как состояние.

В weightA и weightB аргументы являются параметрами для простой цифровой фильтр и по умолчанию 1 и 0 соответственно.

audioop.reverse(fragment, width)

Обращение сэмплов во фрагменте и возвращение модифицированного фрагмента.

audioop.rms(fragment, width)

Возвращает в среднеквадратичной фрагмента, т.е. sqrt(sum(S_i^2)/n).

Это измерение мощности в звуковой сигнал.

audioop.tomono(fragment, width, lfactor, rfactor)

Преобразовать стерео фрагмента к фрагменту моно. Левый канал умножается на lfactor и правый канал по rfactor перед добавлением двух каналов дает моносигнал.

audioop.tostereo(fragment, width, lfactor, rfactor)

Создать стерео фрагмент из фрагмент моно. Каждая пара сэмплов в стерео фрагмента вычисляются из образца моно, причем слева сэмплов канала умножаются на lfactor и право сэмплы канале rfactor.

audioop.ulaw2lin(fragment, width)

Преобразования фрагментов звука в u-LAW кодирования в линейно enкодd фрагменты звука. u-LAW кодирование всегда использует 8 битов сэмплы, так width относится только к ширине образца выходного фрагмента.

Обратите внимание, что такие операции, как mul() или max() не делают никакого различия между моно и стерео фрагменты, т. е. все сэмплы равны. Если это проблема стерео фрагмент должен быть разделен на два фрагмента моно первый и рекомбинированного позже. Вот пример, как это сделать:

def mul_stereo(sample, width, lfactor, rfactor):
    lsample = audioop.tomono(sample, width, 1, 0)
    rsample = audioop.tomono(sample, width, 0, 1)
    lsample = audioop.mul(lsample, width, lfactor)
    rsample = audioop.mul(rsample, width, rfactor)
    lsample = audioop.tostereo(lsample, width, 1, 0)
    rsample = audioop.tostereo(rsample, width, 0, 1)
    return audioop.add(lsample, rsample, width)

При использовании ADPCM кодера для построения сетевых пакетов и вы хотите, чтобы ваш протокол состояниеless (т. е. уметь терпеть потери пакетов) вы должны не только передавать данные, но и состояние. Обратите внимание, что вы должны отправить initial состояние (тот, который вы прошли в lin2adpcm()) вместе с декодера, не окончательный состояние (как возвращенный по кодера). Если вы хотите использовать struct.Struct для хранения состояние в двоичном можно код первый элемент (прогнозируемое значение) в 16 бит, а второй (индекс «Дельта») в 8.

В кодерах ADPCM никогда не пробовал против других кодеров ADPCM, только против себя. Вполне может быть, что я неверно истолковал нормы в этом случае они не будут совместимы с соответствующими стандартами.

Рутины find*() могут выглядеть немного смешно на первый взгляд. Они в первую очередь призваны сделать эха. Достаточно быстрый способ сделать это, чтобы выбрать наиболее энергичная часть образца выход, найти, что во входной выборке и вычитать весь сэмпл выходных данных сэмплом входных:

def echocancel(outputdata, inputdata):
    pos = audioop.findmax(outputdata, 800)    # одна десятая секунда
    out_test = outputdata[pos*2:]
    in_test = inputdata[pos*2:]
    ipos, factor = audioop.findfit(in_test, out_test)
    # Опционален (для лучшей отмены):
    # factor = audioop.findfactor(in_test[ipos*2:ipos*2+len(out_test)],
    #              out_test)
    prefill = '\0'*(pos+ipos)*2
    postfill = '\0'*(len(inputdata)-len(prefill)-len(outputdata))
    outputdata = prefill + audioop.mul(outputdata, 2, -factor) + postfill
    return audioop.add(inputdata, outputdata, 2)