我正在尝试使用 88200 个样本转换 numpy.array 的音频采样率(从 44100 到 22050),其中我已经完成了一些过程(例如添加静音并转换为单声道)。我试图用它转换这个数组audioop.ratecv
并且它可以工作,但是它返回一个 str 而不是一个 numpy 数组,当我写这些数据时scipy.io.wavfile.write
,结果是一半的数据丢失了,音频速度是原来的两倍(而不是更慢,至少那会有点道理)。
audio.ratecv
与 str 数组(例如wave.open
返回)一起工作正常,但我不知道如何处理它们,所以我尝试从 str 转换为 numpy withnumpy.array2string(data)
以将其传递给 ratecv 并获得正确的结果,然后再次转换为 numpy withnumpy.fromstring(data, dtype)
现在 len 的数据是 8 个样本。我认为这是由于格式的复杂性,但我不知道如何控制它。我还没有弄清楚 str 会wave.open
返回什么样的格式,所以我可以在这个格式上强制格式。
这是我的代码的这一部分
def conv_sr(data, srold, fixSR, dType, chan = 1):
state = None
width = 2 # numpy.int16
print "data shape", data.shape, type(data[0]) # returns shape 88200, type int16
fragments = numpy.array2string(data)
print "new fragments len", len(fragments), "type", type(fragments) # return len 30 type str
fragments_new, state = audioop.ratecv(fragments, width, chan, srold, fixSR, state)
print "fragments", len(fragments_new), type(fragments_new[0]) # returns 16, type str
data_to_return = numpy.fromstring(fragments_new, dtype=dType)
return data_to_return
我这样称呼它
data1 = numpy.array(data1, dtype=dType)
data_to_copy = numpy.append(data1, data2)
data_to_copy = _to_copy.sum(axis = 1) / chan
data_to_copy = data_to_copy.flatten() # because its mono
data_to_copy = conv_sr(data_to_copy, sr, fixSR, dType) #sr = 44100, fixSR = 22050
scipy.io.wavfile.write(filename, fixSR, data_to_copy)