https://uplex.de/audiowmark/

Stefan Westerfeld 2eea07ef9d Support --test-no-sync to disable sync search for tests. 5 years ago
src 2eea07ef9d Support --test-no-sync to disable sync search for tests. 5 years ago
.dockerignore 9fe2cf5d79 Add libgcrypt to Dockerfile 6 years ago
.gitignore e4f4888452 gitignore 6 years ago
Dockerfile 62b3a0e972 Add libmpg123 to Dockerfile. 5 years ago
Makefile.am f46ad16973 Add Dockerfile 6 years ago
README.adoc 2f0d10662a Small doc fixes. 5 years ago
autogen.sh f46ad16973 Add Dockerfile 6 years ago
configure.ac 67a4ca2d3b Started to implement mp3 file reading based on libmpg123. 5 years ago

README.adoc

= audiowmark - Audio Watermarking

== Description

`audiowmark` is an Open Source solution for audio watermarking. A sound file
(typically wav) is read by the software, and a 128-bit message is stored in a
watermark in the output sound file. For human listeners, the files typically
sound the same.

However, the 128-bit message can be retrieved from the output sound file. Our
tests show, that even if the file is converted to mp3 or ogg (with bitrate 128
kbit/s or higher), the watermark usually can be retrieved without problems. The
process of retrieving the message does not need the original audio file (blind
decoding).

Internally, audiowmark is using the patchwork algorithm to hide the data in the
spectrum of the audio file. The signal is split into 1024 sample frames. For
each frame, some pseoudo-randomly selected amplitudes of the frequency bands of
a 1024-value FFTs are increased or decreased slightly, which can be detected
later. The algorithm used here is inspired by

Martin Steinebach: Digitale Wasserzeichen für Audiodaten.
Darmstadt University of Technology 2004, ISBN 3-8322-2507-2

== Adding/Retrieving a Watermark

To add a watermark to the soundfile in.wav with a 128-bit message (which is
specified as hex-string):

audiowmark add in.wav out.wav 0123456789abcdef0011223344556677

To get the 128-bit message from the watermarked file, use:

audiowmark get out.wav

== Watermark Key

Since the software is Open Source, a watermarking key should be used to ensure
that the message bits cannot be retrieved by somebody else (which would also
allow removing the watermark without loss of quality). The watermark key
controls all pseudo-random parameters of the algorithm. This means that
it determines which frequency bands are increased or decreased to store a
0 bit or a 1 bit. Without the key, it is impossible to decode the message
bits from the audio file alone.

Our watermarking key is a 128-bit AES key. A key can be generated using

audiowmark gen-key test.key

and can be used for the add/get commands as follows:

audiowmark add --key test.key in.wav out.wav 0123456789abcdef0011223344556677
audiowmark get --key test.key out.wav

== Watermark Strength

The watermark strength parameter affects how much the watermarking algorithm
modifies the input signal. A stronger watermark is more audible, but also more
robust against modifications. The default strength is 10. A watermark with that
strength is recoverable after mp3/ogg encoding with 128kbit/s or higher. In our
informal listening tests, this setting also has a very good subjective quality.

A higher strength (for instance 15) would be helpful for instance if robustness
against multiple conversions or conversions to low bit rates (i.e. 64kbit/s) is
desired.

A lower strength (for instance 6) makes the watermark less audible, but also
less robust. Strengths below 5 are not recommended. To set the strength, the
same value has to be passed during both, generation and retrieving the
watermark. Fractional strengths (like 7.5) are possible.

audiowmark add --strength 15 in.wav out.wav 0123456789abcdef0011223344556677
audiowmark get --strength 15 out.wav

== Dependencies

If you compile from source, audiowmark needs the follwing libraries:

* libfftw3
* libsndfile
* libgcrypt
* libzita-resampler
* libmpg123

== Building fftw

audiowmark needs the single prevision variant of fftw3.

If you are building fftw3 from source, use the `--enable-float`
configure parameter to build it, e.g.::

cd ${FFTW3_SOURCE}
./configure --enable-float --enable-sse && \
make && \
sudo make install

or, when building from git

cd ${FFTW3_GIT}
./bootstrap.sh --enable-shared --enable-sse --enable-float && \
make && \
sudo make install

== Docker Build

You should be able to execute audiowmark via Docker.
Example that outputs the usage message:

docker build -t audiowmark .
docker run -v :/data -it audiowmark -h