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) -
«Переставляет байты» всех сэмплов во фрагменте и возвращает измененный фрагмент. Преобразует сэмплы большого порядка байтов в сэмплы малого порядка байтов и наоборот.
Новое в версии 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) -
Возвращает максимальное значение из абсолютного значения всех сэмплов во фрагменте.
-
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 — кортеж, содержащий состояние преобразователя. Преобразователь возвращает кортеж
(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 в линейно закодированные фрагменты звука. Кодировка 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 для построения пакетов сети и хотите, чтобы ваш протокол был бессостоятельным (то есть чтобы он мог игнорировать потерю пакетов), вы должны не только передавать данные, но и состояние. Обратите внимание, что вы должны отправить начальное состояние (которое вы передали в lin2adpcm()) декодеру, а не конечное состояние (возвращаемое кодером). Если вы хотите использовать struct.Struct для хранения состояния в двоичном формате, вы можете закодировать первый элемент (предсказанное значение) в 16 бит, а второй (индекс дельты) — в 8.
Кодеры ADPCM никогда не проверялись против других кодеров ADPCM, только против самих себя. Вполне возможно, что я неправильно истолковал стандарты, в этом случае они не будут совместимы с соответствующими стандартами.
Процедуры find*() на первый взгляд могут показаться немного странными. Они в первую очередь предназначены для подавления эха. Достаточно быстрый способ сделать это — выбрать наиболее энергичный фрагмент выходного образца, найти его во входном образце и вычесть весь выходной образец из входного образца:
def echocancel(outputdata, inputdata):
pos = audioop.findmax(outputdata, 800) # one tenth second
out_test = outputdata[pos*2:]
in_test = inputdata[pos*2:]
ipos, factor = audioop.findfit(in_test, out_test)
# Optional (for better cancellation):
# 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)
© 2001–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.5/library/audioop.html