Python Audio Frame Изменение высоты тона - PullRequest
4 голосов
/ 13 июня 2011

Я пытаюсь использовать pyaudio для создания голосовой маскировки. При том, как я сейчас это настроил, единственное, что мне нужно сделать, - это ввести звук, изменить высоту тона на лету и распределить его обратно. Первая и последняя часть работают, и я думаю, что я близок к изменению высоты тона ... акцент на "думать".

К сожалению, я не слишком знаком с типом данных, с которыми я работаю, и как именно манипулировать ими так, как я хочу. Я просмотрел документацию по аудиозаписи и не нашел того, что мне было нужно (подумал, что есть некоторые вещи, которые я мог бы там определенно использовать). Я думаю, что я спрашиваю ...

Как данные форматируются в этих аудио кадрах.

Как мне изменить высоту кадра (если я могу), или это даже близко к такой работе?

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 ]

5 голосов
/ 14 июня 2011

После строки irfft и перед строкой stream.write необходимо преобразовать данные обратно в 16-разрядные целые числа с помощью вызова struct.pack.

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)
3 голосов
/ 13 июня 2011

Чтобы изменить высоту тона, вам нужно выполнить БПФ для нескольких кадров, а затем сместить данные по частоте (переместить данные в различные частотные бины) и выполнить обратное БПФ.

Если вы не возражаете против увеличения длины звукового фрагмента при уменьшении высоты звука (или выше при увеличении высоты звука), вы можете изменить частоту кадров.Например, вы можете удвоить каждый кадр (вставить копию каждого кадра в поток), тем самым снизив скорость воспроизведения и высоту звука.Затем вы можете улучшить качество звука, улучшив алгоритм передискретизации, чтобы использовать некоторую интерполяцию и / или фильтрацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...