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)