Вы можете использовать numpy для преобразования необработанных данных в numpy массивы, затем умножить массив на коэффициент громкости и записать его в выходной поток.
from math import sqrt
import numpy as np
# ...
# convert the linear volume to a logarithmic scale (see explanation below)
volumeFactor = 2
multiplier = pow(2, (sqrt(sqrt(sqrt(volumeFactor))) * 192 - 192)/6)
while True:
try:
data = sourceDevice.read(Chunk)
except OSError:
data = '\x00' * Chunk
except IOError as ex:
if ex[1] != pyaudio.paInputOverflowed:
raise
data = '\x00' * Chunk
# Doing Something To Data Here To Incrase Volume Of It
numpy_data = np.fromstring(data, dtype=np.int16)
# double the volume using the factor computed above
np.multiply(numpyData, volumeMultiplier,
out=numpyData, casting="unsafe")
destinationDevice.write(numpy_data.tostring(), Chunk, exception_on_underflow=True)
Концепция заключается в том, что аудио концептуально data - это массив выборок, каждая из которых имеет значение, зависящее от битовой «глубины» Стандартное цифровое аудио (как аудио CD) имеет частоту 44100 кГц, 16 бит, стерео, что означает, что каждые секунды имеют 88200 семплов (поскольку это стерео), причем каждый семпл занимает 2 байта (8 бит + 8 бит). Если вы в равной степени измените значение каждого из этих образцов, вы фактически измените его громкость.
Теперь проблема в том, что воспринимаемый объем не является линейным, а логарифмическим c. Итак, если вы хотите получить вдвое больше объема, вы не можете просто удвоить значения выборки.
Я использую преобразование, которое я обнаружил через несколько лет go (из ползунков Ardor, если я правильно помню ), что должно быть достаточно точным.
Будьте осторожны, однако, вы можете легко получить очень высокие уровни, что приведет к искажению звука.