簡體   English   中英

Python 音頻幀音高變化

[英]Python Audio Frame Pitch Change

我正在嘗試使用 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()

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)

要更改音高,您必須對多個幀執行FFT ,然后按頻率移動數據(將數據移動到不同的頻率區間)並執行逆 FFT。

如果您不介意聲音片段在降低音高時變長(或在增加音高時變高),您可以重新采樣幀。 例如,您可以將每幀加倍(在流中插入每幀的副本),從而降低播放速度和音調。 然后,您可以通過改進重采樣算法以使用某種插值和/或過濾來提高音頻質量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM