45 lines
1.5 KiB
Python
Executable File
45 lines
1.5 KiB
Python
Executable File
#!/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))
|