Files
brightstone/Tools/compress_snd_test.py
T
2026-10-29 22:12:47 +03:00

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))