【问题标题】:Need help converting a .wav audio file to a .PNG , then back to the same .wav file需要帮助将 .wav 音频文件转换为 .PNG ,然后再转换回相同的 .wav 文件
【发布时间】: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


【解决方案1】:

您在转换为像素时引入了损失。

首先,当帧数不是三的倍数时,您将在末尾丢失一帧或两帧for i in range(0,w.getnframes(),3):

其次,你的dimensions = int(sqrt(w.getnframes()/3))再写dimensions平方像素,当帧数除以三不是平方时,会丢失很多帧。

第三,也是最重要的一点,您忽略了样本宽度以及通道数。您只保存图像中每个样本的低八位。如果样本宽度为 16 位,则基本上可以节省图像中的噪声。

【讨论】:

  • 嗨,马克,抱歉,如果这有点晚了,谢谢您的回复。我很荣幸能与一位有影响力的计算机科学家在场!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-23
  • 2019-12-31
  • 2013-11-12
  • 2019-01-07
  • 1970-01-01
  • 2023-03-23
  • 2013-06-17
相关资源
最近更新 更多