import matplotlib.pyplot as plt
import numpy as np
import wave
import librosa
# w:要改变的声音 N:分割长度 S:分割步长 Ss:合成步长
def OLA_Curse(w:np.ndarray[np.float64],N:int,S:int,Ss:int):
# 分割
print()
Cut_Buffer = [] # 分割缓冲区
i = 0
while i < w.size:
print('\r',i,w.size,end='')
if i+N > w.size:
Cut_Buffer.append(w[i:]) # 末尾
else:
Cut_Buffer.append(w[i:i+N]) # 步长为S,帧长度为N
i+=S # 步长
#print(Cut_Buffer)
# 合成(速度很慢)
# 返回的音轨
track = np.zeros(len(Cut_Buffer)*Ss)
i = 0
print('')
n = 0
for frame in Cut_Buffer:
print('\r',n,len(Cut_Buffer),end='')
# 确保音轨足够长
'''
if i+frame.size > track.size:
track = np.append(track,np.zeros(i+frame.size-track.size))
'''
# 重叠相加
for j in frame:
track[i] += j
i+=1
i -= N-Ss # 回滚到下一帧起始位置
n+=1
#print(track)
print('')
return track
if __name__ == '__main__':
print('READY')
track = librosa.load('test1.wav',sr=64000)[0]
track1 = track.astype(np.float64)
print('Converting')
track_tmp = OLA_Curse(track,6400,3200,6400)
print(track.size,track_tmp.size)
bdat = (track_tmp*(32000.0/track_tmp.max())).astype(np.int16).tobytes()
f =wave.open('test.wav','wb')
f.setnchannels(1)
f.setsampwidth(2)
f.setframerate(64000)
f.writeframes(\
bdat\
)
f.close()
实践证明,噪声有点大,在cos函数构成的乐曲中有明显的噗噗声。