【发布时间】:2021-08-04 08:39:39
【问题描述】:
我正在尝试将声音文件转换为图像,然后在 Python 中转换回相同的声音文件。首先,我使用 python 的wave 库读取 .wav,提取帧,然后将字节排列为方形图像中的 RGB 元组。
输出很酷,看起来像this
但是当我尝试将图像转换回声音文件时,结果很糟糕。不知道我在这里做错了什么
import wave
from PIL import Image
import numpy as np
from math import sqrt
w = wave.open("sample.wav", mode = "rb")
frames = w.readframes(w.getnframes())
pixels = []
#####FRAMES CONVERTED TO PIXEL TUPLES######
for i in range(0,w.getnframes(),3):
pixels.append((frames[i],frames[i+1],frames[i+2]))
#####FIT TO SQUARE IMAGE#####
dimensions = int(sqrt(w.getnframes()/3))
img = []
for x in range(0,dimensions):
row = []
for y in range(0,dimensions):
row.append(pixels[x*dimensions+y])
img.append(row)
array = np.array(img, dtype=np.uint8)
new_image = Image.fromarray(array)
new_image.save('new.png')
p = Image.open("new.png",mode="r")
flatten = [x for sets in list(p.getdata()) for x in sets]
###### WAV RE-CREATION ######
sampleRate = w.getframerate() # hertz
obj = wave.open('sound.wav','w')
obj.setnchannels(w.getnchannels())
obj.setsampwidth(2)
obj.setframerate(sampleRate)
for i in range(0,len(flatten)):
obj.writeframesraw(( flatten[i]).to_bytes(8,"big") )
obj.close()
【问题讨论】:
-
我没有什么要补充的,因为我什么都不知道;但这绝对是个好主意。
-
感谢@ewong,如果你喜欢,请点赞! :)
-
png 是一种有损格式,因此您的重建听起来与原始格式完全不同
-
@FrenzyKiwi 我不确定这是否正确,快速谷歌搜索会显示 PNG 是无损的
-
我看到的第一个问题是您将
w.getnframes()视为解码音频流中的字节数,但这仅适用于 8 位单声道。 |由于上述原因,接下来的事情已经是错误的,但如果w.getnframes()/3不是 2 的幂,您可能会由于舍入而丢失更多字节。
标签: python image audio encoding compression