Awesome
Zimtohrli: A New Psychoacoustic Perceptual Metric for Audio Compression
Zimtohrli is a psychoacoustic perceptual metric that quantifies the human observable difference in two audio signals in the proximity of just-noticeable-differences.
In this project we study the psychological and physiological responses associated with sound, to create a new more accurate model for measuring human-subjective similarity between sounds. The main focus will be on just-noticeable-difference to get most significant benefits in high quality audio compression. The main goals of the project is to further both existing and new practical audio (and video containing audio) compression, and also be able to plug in the resulting psychoacoustic similarity measure into audio related machine learning models.
For more details about how Zimtohrli works, see zimtohrli.ipynb.
Performance
Zimtohrli is able to compare sounds at ~10x real time for 48kHz sample rate using a single modern CPU core, but exact times may vary based on the settings used.
For correlation performance with a few datasets see COMPARISON.md.
Most of those datasets can be acquired using the tools coresvnet, perceptual_audio, sebass_db, and tcd_voip. A couple of them are unpublished and can't be downloaded.
Compatibility
Zimtohrli is a project under development, and is built and tested in a Debian-like environment.
Build
Some dependencies for Zimtohrli are downloaded and managed by the build script, but others need to be installed before building.
- cmake
- ninja-build
To build the compare tool, a few more dependencies are necessary:
- libogg-dev
- libvorbis-dev
- libflac-dev
- libopus-dev
- libasound2-dev
- libglfw3-dev
Finally, to build and test the Python and Go wrappers, the following dependencies are necessary:
- golang-go
- python3
- xxd
- zlib1g-dev
- ffmpeg
To install these in a Debian-like system:
sudo apt install -y cmake ninja-build clang clang-tidy libogg-dev libvorbis-dev libflac-dev libopus-dev libasound2-dev libglfw3-dev golang-go python3 xxd zlib1g-dev ffmpeg
Once they are installed, configure the project:
./configure.sh
Build the project:
(cd build && ninja)
Address sanitizer build
To build with address sanitizer, configure a new build directory with asan configured:
./configure.sh asan
Build the project:
(cd asan_build && ninja)
Debug build
To build with debug symbols, configure a new build directory with debugging configured:
./configure.sh debug
Build the project:
(cd debug_build && ninja)
Testing
(cd build && ninja && ninja test)
Quirks
- When building with ninja, the Go wrapper glue file go/goohrli/goohrli.a is built.
Currently there's a known bug: ninja sometimes doesn't detect that this file needs to be rebuilt when the C++ files it depends on are changed.
Therefore, sometimes
rm go/goohrli/goorhli.a
before running ninja is needed. E.g.( rm go/goohrli/goohrli.a ; cd build && ninja )
.