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)
