gpt4 book ai didi

python - 我的程序将音乐速度降低了 50%,但仅限于一个 channel

转载 作者:行者123 更新时间:2023-12-04 19:29:45 27 4
gpt4 key购买 nike

我在 python 中使用 wave 库试图将音频速度降低 50%。我已经成功了,但只是在正确的 channel 中。在左声道中,它是一大堆静电。

import wave,os,math
r=wave.open(r"C:\Users\A\My Documents\LiClipse Workspace\Audio
compression\Audio compression\aha.wav","r")
w=wave.open(r"C:\Users\A\My Documents\LiClipse Workspace\Audio
compression\Audio compression\ahaout.wav","w")
frames=r.readframes(r.getnframes())
newframes=bytearray()
w.setparams(r.getparams())
for i in range(0,len(frames)-1):
newframes.append(frames[i])
newframes.append(frames[i])
w.writeframesraw(newframes)

为什么是这样?因为我只是复制和粘贴原始数据,所以我肯定不能生成静态数据?
编辑:我找了很久,终于找到了一个有用的波形格式资源: http://soundfile.sapp.org/doc/WaveFormat/
如果我想保留立体声,看起来我需要将 4 的实际样本宽度复制两次。这是因为有两个 channel ,它们占用 4 个字节而不是 2 个。
`import wave
r=wave.open(r"C:\Users\A\My Documents\LiClipse Workspace\Audio
compression\Audio compression\aha.wav","r")
w=wave.open(r"C:\Users\A\My Documents\LiClipse Workspace\Audio
compression\Audio compression\ahaout.wav","w")
frames=r.readframes(r.getnframes())
newframes=bytearray()
w.setparams(r.getparams())
w.setframerate(r.getframerate())
print(r.getsampwidth())
for i in range(0,len(frames)-4,4):
newframes.append(frames[i])
newframes.append(frames[i+1])
newframes.append(frames[i+2])
newframes.append(frames[i+3])
newframes.append(frames[i])
newframes.append(frames[i+1])
newframes.append(frames[i+2])
newframes.append(frames[i+3])
w.writeframesraw(newframes)`

编辑2:
好吧,我不知道是什么驱使我这样做,但我已经在享受它给我的自由。我选择将wav文件拷贝到内存中,直接编辑拷贝,写入输出文件。我对结果非常满意。我可以导入 wav,重复一次音频,然后将其写入输出文件,只需 0.2 秒。使用 wav 插件将速度降低一半现在只需要 9 秒,而不是 30+ 秒,我的旧代码使用 wav 插件:) 这是代码,我猜仍然有点未优化,但它比以前好。
import struct
import time as t
t.clock()
r=open(r"C:/Users/apier/Documents/LiClipse Workspace/audio editing
software/main/aha.wav","rb")
w=open(r"C:/Users/apier/Documents/LiClipse Workspace/audio editing
software/main/output.wav","wb")
rbuff=bytearray(r.read())
def replacebytes(array,bites,stop):
length=len(bites)
start=stop-length
for i in range(start,stop):
array[i]=bites[i-start]
def write(audio):
w.write(audio)
def repeat(audio,repeats):
if(repeats==1):
return(audio)
if(repeats==0):
return(audio[:44])
replacebytes(audio, struct.pack('<I', struct.unpack('<I',audio[40:44])
[0]*repeats), 44)
return(audio+(audio[44:len(audio)-58]*(repeats-1)))
def slowhalf(audio):
buff=bytearray()
replacebytes(audio, struct.pack('<I', struct.unpack('<I',audio[40:44])
[0]*2), 44)
for i in range(44,len(audio)-62,4):
buff.append(audio[i])
buff.append(audio[i+1])
buff.append(audio[i+2])
buff.append(audio[i+3])
buff.append(audio[i])
buff.append(audio[i+1])
buff.append(audio[i+2])
buff.append(audio[i+3])
return(audio[:44]+buff)
rbuff=slowhalf(rbuff)
write(rbuff)
print(t.clock())

我对代码如此之小感到惊讶。

最佳答案

readframes 返回的每个元素是单字节,即使类型是 int .一个音频样本通常为 2 个字节。通过将每个字节而不是每个整个样本加倍,你会得到噪音。

我不知道为什么一个 channel 可以工作,问题中显示的代码应该都是噪音。

这是部分修复。它仍然混合左右声道,但它会让你知道什么是有效的。

for i in range(0,len(frames)-1,2):
newframes.append(frames[i])
newframes.append(frames[i+1])
newframes.append(frames[i])
newframes.append(frames[i+1])

编辑:这是应该在立体声中工作的代码。它一次复制 4 个字节,左声道 2 个,右声道 2 个,然后再次复制以将它们加倍。这将防止 channel 数据交错。
for i in range(0, len(frames), 4):
for _ in range(2):
for j in range(4):
newframes.append(frames[i+j])

关于python - 我的程序将音乐速度降低了 50%,但仅限于一个 channel ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45089480/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com