我怎样才能增加来自 python 中的 pyaudio 的字节数组的体积
How can i increase the volume of a byte array which is from pyaudio in python
我正在将音频从麦克风传输到我的扬声器。但我想提高现场声音的音量,但我找不到办法,我搜索了一段时间google。
她是我的密码
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)
数据变量的一个例子是
(这被缩短了很多,原来是巨大的)
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.'
您可以使用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)
概念是音频数据在概念上是一组样本,每个样本的值取决于位 "depth"。标准数字音频(如 CD 音频)为 44100kHz、16 位、立体声,这意味着每秒有 88200 个样本(因为它是立体声),每个样本占用 2 个字节(8 位 + 8 位)。如果你同样地改变每个样本的值,你实际上会改变它的音量。
现在,问题是感知音量不是线性的,而是对数的。所以,如果你想获得两倍的体积,你不能只是将样本值加倍。
我正在使用几年前发现的转换(如果我没记错的话,来自 Ardor 滑块),它应该足够准确。
不过要小心,您很容易获得非常高的电平,这会导致声音失真。
我正在将音频从麦克风传输到我的扬声器。但我想提高现场声音的音量,但我找不到办法,我搜索了一段时间google。
她是我的密码
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)
数据变量的一个例子是 (这被缩短了很多,原来是巨大的) 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.'
您可以使用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)
概念是音频数据在概念上是一组样本,每个样本的值取决于位 "depth"。标准数字音频(如 CD 音频)为 44100kHz、16 位、立体声,这意味着每秒有 88200 个样本(因为它是立体声),每个样本占用 2 个字节(8 位 + 8 位)。如果你同样地改变每个样本的值,你实际上会改变它的音量。
现在,问题是感知音量不是线性的,而是对数的。所以,如果你想获得两倍的体积,你不能只是将样本值加倍。
我正在使用几年前发现的转换(如果我没记错的话,来自 Ardor 滑块),它应该足够准确。
不过要小心,您很容易获得非常高的电平,这会导致声音失真。