Как я могу увеличить громкость байтового массива из pyaudio в python - PullRequest
0 голосов
/ 01 апреля 2020

Я передаю аудио с mi c на динамик. Но я хочу увеличить громкость живого звука, но я не могу найти способ, и я некоторое время искал в Google.

Her Это мой код

import pyaudio

Chunk = 1024
AudioFormat = pyaudio.paInt16
Channels = 2
Rate = 44100

PortAudio = pyaudio.PyAudio()
sourceDevice = PortAudio.open(format=AudioFormat,
                              channels=Channels,
                              rate=Rate,
                              input=True,
                              input_device_index=2,
                              frames_per_buffer=Chunk
                              )

destinationDevice = PortAudio.open(format=AudioFormat,
                                   channels=Channels,
                                   rate=Rate,
                                   output=True,
                                   output_device_index=4,
                                   frames_per_buffer=Chunk
                                   )

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
    data = data # Function Here??

    destinationDevice.write(data, Chunk, exception_on_underflow=True)

an пример того, что переменная данных (это сокращено довольно много, оригинал является массивным) b '\ xec \ x00G \ x01 \ xa7 \ x01 \ xbe \ x01 \ x95 \ x00 \ xf7 \ x00 + \ x00 \ x91 \ x00 \ xa1 \ x01W \ x01 \ XEC \ x01 \ x94 \ x01n \ x00 \ XAC \ x00I \ x00 \ xa4 \ x00 \ XFB \ x00" \ x01g \ x00 \ x8d \ x00 * \ x00m \ x00 \ XDE \ x00 \ x04 \ x01 \ XB2 \ x00 \ xc7 \ X005 \ x00- \ x00 (\ x01 \ XB0 \ x00 \ XEC \ x01Q \ x01 ".

1 Ответ

0 голосов
/ 01 апреля 2020

Вы можете использовать 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, если я правильно помню ), что должно быть достаточно точным.
Будьте осторожны, однако, вы можете легко получить очень высокие уровни, что приведет к искажению звука.

...