4

私は 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()
4

2 に答える 2

5

行の後と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)
于 2011-06-13T21:00:08.957 に答える
3

ピッチを変更するには、多数のフレームでFFTを実行し、データを周波数でシフト (データを別の周波数ビンに移動) し、逆 FFT を実行する必要があります。

ピッチを下げる (またはピッチを上げると高くなる) ときにサウンド フラグメントが長くなっても構わない場合は、フレームをリサンプリングできます。たとえば、各フレームを 2 倍にする (ストリームに各フレームのコピーを挿入する) ことで、再生速度とピッチを下げることができます。次に、リサンプリング アルゴリズムを改良して、ある種の補間やフィルタリングを使用することで、オーディオ品質を向上させることができます。

于 2011-06-13T07:49:43.653 に答える