#!/usr/bin/env python3 # Compression testing for sound sample data for expected cases of ours. # TODO: Implement our own CLI tool that uses our LZW implementation, as it differs. import ncompress import sys import wave import audioop import numpy as np import array with wave.open(sys.argv[1], 'rb') as wf: channels = wf.getnchannels() samplerate = wf.getframerate() frames = wf.getnframes() uncompressed = wf.readframes(frames) depth = wf.getsampwidth() compressed = ncompress.compress(uncompressed) print("Uncompressed:", len(uncompressed)) print("Compressed:", len(compressed), len(compressed) / len(uncompressed)) delta = bytearray(uncompressed[0].to_bytes(2, signed=False)) for i in range(len(uncompressed)-1): delta += (uncompressed[i+1] - uncompressed[i]).to_bytes(2, signed=True) dtcompressed = ncompress.compress(bytes(delta)) print("Delta:", len(dtcompressed), len(dtcompressed) / len(uncompressed)) assert(len(delta) == len(uncompressed)*2) ulaw = audioop.lin2ulaw(uncompressed, depth) ulawcompressed = ncompress.compress(ulaw) print("Ulaw:", len(ulawcompressed), len(ulawcompressed) / len(uncompressed)) absfold = bytearray() for i in range(len(uncompressed)): absfold.append(uncompressed[i] - 128 if uncompressed[i] >= 128 else uncompressed[i]) absfoldulaw = audioop.lin2ulaw(absfold, depth) absfoldulawcompressed = ncompress.compress(absfoldulaw) print("Ulawabs:", len(absfoldulawcompressed), len(absfoldulawcompressed) / len(absfold)) with open(sys.argv[1] + ".ulaw", "wb") as file: file.write(audioop.ulaw2lin(ulaw, depth))