lteração de pitch de quadro de áudio Python

Estou tentando usar o pyaudio para criar um mascarador de voz. Do jeito que eu o configurei agora, a única coisa que tenho a fazer é inserir o som, mudar o tom em tempo real e reproduzi-lo imediatamente. A primeira e a última parte estão funcionando e acho que estou chegando perto de mudar de tom ... ênfase no "pensar".

Infelizmente, não estou muito familiarizado com o tipo de dados com os quais estou trabalhando e como exatamente manipulá-los da maneira que eu quero. Examinei a documentação do audioop e não encontrei o que precisava (pensei que existem algumas coisas que eu definitivamente poderia usar lá). Eu acho que o que estou perguntando é ...

Como os dados são formatados nesses quadros de áudi

Como posso alterar o tom de um quadro (se eu puder), ou está quase trabalhando assi

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()

questionAnswers(2)

yourAnswerToTheQuestion