Python音频帧音高变化

时间:2011-06-13 05:00:35

标签: python audio pitch

我正在尝试使用pyaudio制作语音掩码。按照我现在设置的方式,我唯一需要做的就是输入声音,动态改变音高,然后将其重新排出。第一部分和最后一部分正在发挥作用,我认为我已经接近改变音调......强调“思考”。

不幸的是,我不太熟悉我正在使用的数据类型以及如何以我想要的方式操作它。我已经阅读了audioop文档并且没有找到我需要的东西(想到有些东西我可以肯定地在那里使用)。我想我要问的是......

如何在这些音频帧中格式化数据。

如何改变画面的音高(如果可以),或者它是否接近这样的工作?

import pyaudio
import sys
import numpy as np
import wave
import audioop
import struct

chunk = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 41000
RECORD_SECONDS = 5

p = pyaudio.PyAudio()

stream = p.open(format = FORMAT,
                channels = CHANNELS,
                rate = RATE,
                input = True,
                output = True,
                frames_per_buffer = chunk)

swidth = 2

print "* recording"



while(True):

    data = stream.read(chunk)
    data = np.array(wave.struct.unpack("%dh"%(len(data)/swidth), data))*2

    data = np.fft.rfft(data)
    #MANipulation
    data = np.fft.irfft(data)



    stream.write(data3, chunk)




print "* done"

stream.stop_stream()
stream.close()
p.terminate()

2 个答案:

答案 0 :(得分:5)

irfft行之后,在stream.write行之前,您需要通过struct.pack调用将数据转换回16位整数。

data = np.fft.irfft(data)
dataout = np.array(data*0.5, dtype='int16') #undo the *2 that was done at reading
chunkout = struct.pack("%dh"%(len(dataout)), *list(dataout)) #convert back to 16-bit data
stream.write(chunkout)

答案 1 :(得分:3)

要更改音高,您必须在多个帧上执行FFT,然后按频率移动数据(将数据移至不同的频率区)并执行逆FFT。

如果您不介意在降低音高时声音片段变长(或者在增加音高时声音更高),您可以resample帧。例如,您可以将每个帧加倍(在流中插入每个帧的副本),从而降低播放速度和音高。然后,您可以通过改进重采样算法来使用某种插值和/或滤波来提高音频质量。