从pyaudio中提取numpy数组会导致噪声和失真

7qhs6swi  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(127)

我的目标是从我的电脑记录音频输出,在真实的时间处理它,然后在真实的时间对它作出React。我使用PyAudio的补丁,允许安装设备。我可以记录音频到一个文件没有问题,它听起来很完美,但当我试图把它变成一个numpy数组来处理它时,它主要是噪音,你可以听到信号极度失真。
这是产生噪声输出的最小例子。在这种情况下,输入是麦克风来切割输入选择代码,但结果是一样的:我的输入的一个非常嘈杂的表示。

import numpy as np
import pyaudiowpatch as pyaudio
import wave
import sounddevice as sd
from matplotlib import pyplot as plt

FORMAT = pyaudio.paInt16
CHANNELS = 2
RATE = 44100
CHUNK = 1048
RECORD_SECONDS = 5
WAVE_OUTPUT_FILENAME = "file.wav"

p = pyaudio.PyAudio()

stream = p.open(format=FORMAT, channels=CHANNELS,
                    rate=RATE, input=True,
                    frames_per_buffer=CHUNK)
print("recording...")
frames = []
fulldata = np.empty(RATE*RECORD_SECONDS*CHANNELS)

for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
    print(i)
    data = stream.read(CHUNK)
    numpydata = np.frombuffer(data, dtype='int16')
    fulldata[i*CHUNK*CHANNELS:(i+1)*CHUNK*CHANNELS] = numpydata
    frames.append(data)
print("finished recording")
channel0 = fulldata[0::CHANNELS]

print('playing')
sd.play(channel0, samplerate=RATE, blocking=True)

# stop Recording
stream.stop_stream()
stream.close()
p.terminate()

waveFile = wave.open(WAVE_OUTPUT_FILENAME, 'wb')
waveFile.setnchannels(CHANNELS)
waveFile.setsampwidth(p.get_sample_size(FORMAT))
waveFile.setframerate(RATE)
waveFile.writeframes(b''.join(frames))
waveFile.close()

字符串
为了达到这一点,我遵循了其他问题,以便从pyaudio中获取numpy数据,并且录制的文件听起来很完美,所以一切,直到转换似乎工作。输入有两个通道,我不知道如何数据的结构,所以我假设,数据是交替的通道,这也是在一个不同的问题,其中提供的channel0代码建议。我假设之间的某个地方得到的数据用sd播放它有一个问题。我甚至试图先将它保存到一个文件中,然后用librosa再次加载,这在用sd播放它时听起来很完美。我确实注意到,在录制时采样率是48000,但在加载wav文件时sr是22050。我还试图查看writeframes函数以寻找有关此问题的任何线索,但没有运气。p.get_sample_size(FORMAT)是2,由于waveFile期望它被提供,但np不知道它,我认为这可能会导致一些问题,但我不知道如何调查这一点。
我刚刚在堆栈上搜索了一些,有几个关于转换到np的问题,他们都说通道是交替的,这个解决方案应该可以工作。这可能与延迟有关吗?但我真的不知道如何设置它。
是否有其他方法可以将其转换为np数组,或者我在这里遗漏了其他东西?非常感谢对此的任何帮助。

odopli94

odopli941#

问题在于,

fulldata = np.empty(RATE*RECORD_SECONDS*CHANNELS)

字符串
在这里我没有指定数据类型,因此numpy创建了一个float64数组,可能做了一些奇怪的转换,导致了失真。我把它改为int16,现在它可以工作了。

相关问题