Mix

class auglib.transform.Mix(aux, *, gain_base_db=0.0, gain_aux_db=0.0, snr_db=None, write_pos_base=0.0, read_pos_aux=0.0, read_dur_aux=None, clip_mix=False, loop_aux=False, extend_base=False, num_repeat=1, unit='seconds', transform=None, preserve_level=False, bypass_prob=None)[source]

Mix two audio signals.

Mix a base signal and auxiliary signal which may differ in length, but must have the same sampling rate. Individual gains can be set for both signals (gain_base_db and gain_aux_db). If snr_db is specified, gain_aux_db is automatically calculated to match the requested signal-to-noise ratio. The signal-to-noise ratio refers only to the overlapping parts of the base and auxiliary signal.

write_pos_base specifies the starting point of adding the auxiliary signal to the the base signal. Selecting a sub-segment of the auxiliary signal is possible with selecting a starting point (read_pos_aux) and/or specifying its duration (read_dur_aux).

In order to allow the looping of the auxiliary signal or its selected sub-segment, the loop_aux argument can be used. In case the auxiliary signal ends beyond the original ending point, the extra portion will be discarded, unless extend_base is set, in which case the base signal is extended accordingly.

By default, the auxiliary signal is mixed into the base signal exactly once. However, the number of repetitions can be controlled with num_repeat. Usually, this only makes sense when reading from random positions or random files.

Parameters:

Examples

Select randomly one of 10 noise files and add it with a SNR of 10 dB to a speech signal. If the noise signal shorter than the speech signal, it will be looped.

>>> import audb
>>> import audiofile
>>> import audplot
>>> import auglib
>>> auglib.seed(0)
>>> db = audb.load(
...     "musan", media=r".*noise-free-sound-000\d", version="1.0.0"
... )
>>> transform = auglib.transform.Mix(
...     auglib.observe.List(db.files, draw=True),
...     loop_aux=True,
...     snr_db=10,
... )
>>> files = audb.load_media("emodb", "wav/03a01Fa.wav", version="1.4.1")
>>> signal, sampling_rate = audiofile.read(files[0])
>>> augmented_signal = transform(signal, sampling_rate)
>>> audplot.waveform(augmented_signal)
../_images/auglib-transform-Mix-1.png

Add a cough to a speech signal, starting at a random position between 0% and 90% of the length of the speech signal.

>>> auglib.seed(0)
>>> files = audb.load_media(
...     "cough-speech-sneeze",
...     "coughing/kopzxumj430_40.94-41.8.wav",
...     version="2.0.1",
...     sampling_rate=16000,
... )
>>> transform = auglib.transform.Mix(
...     files[0],
...     write_pos_base=auglib.observe.FloatUni(0, 0.9),
...     unit="relative",
... )
>>> augmented_signal = transform(signal, sampling_rate)
>>> audplot.waveform(augmented_signal)
../_images/auglib-transform-Mix-3.png

__call__()

Mix.__call__(signal, sampling_rate=None)

Apply transform to signal.

Parameters:
  • signal (numpy.ndarray) – signal to be transformed

  • sampling_rate (int) – sampling rate in Hz

Return type:

numpy.ndarray

Returns:

augmented signal

Raises:
  • ValueError – if the signal shape is not support by chosen transform parameters

  • ValueError – if sampling_rate is None, but the transform requires a sampling rate

  • RuntimeError – if the given sampling rate is incompatible with the transform

arguments

Mix.arguments

Returns arguments that are serialized.

Returns:

Dictionary of arguments and their values.

Raises:

RuntimeError – if arguments are found that are not assigned to attributes of the same name

Examples

>>> import audobject.testing
>>> o = audobject.testing.TestObject("test", point=(1, 1))
>>> o.arguments
{'name': 'test', 'point': (1, 1)}

borrowed_arguments

Mix.borrowed_arguments

Returns borrowed arguments.

Returns:

Dictionary with borrowed arguments.

from_dict()

static Mix.from_dict(d, root=None, **kwargs)
Return type:

audobject.core.object.Object

from_yaml()

static Mix.from_yaml(path_or_stream, **kwargs)
Return type:

audobject.core.object.Object

from_yaml_s()

static Mix.from_yaml_s(yaml_string, **kwargs)
Return type:

audobject.core.object.Object

hidden_arguments

Mix.hidden_arguments

Returns hidden arguments.

Returns:

List with names of hidden arguments.

id

Mix.id

Object identifier.

The ID of an object ID is created from its non-hidden arguments.

Returns:

object identifier

Examples

>>> class Foo(Object):
...     def __init__(self, bar: str):
...         self.bar = bar
>>> foo1 = Foo("I am unique!")
>>> foo1.id
'893df240-babe-d796-cdf1-c436171b7a96'
>>> foo2 = Foo("I am different!")
>>> foo2.id
'9303f2a5-bfc9-e5ff-0ffa-a9846e2d2190'
>>> foo3 = Foo("I am unique!")
>>> foo1.id == foo3.id
True

is_loaded_from_dict

Mix.is_loaded_from_dict

Check if object was loaded from a dictionary.

Returns True if object was initialized from a dictionary, e.g. after loading it from a YAML file.

Returns:

True if object was loaded from a dictionary,

otherwise False

resolvers

Mix.resolvers

Return resolvers.

Returns:

Dictionary with resolvers.

short_id

Mix.short_id

Short object identifier.

The short ID consists of eight characters and is created from its non-hidden arguments.

Returns:

short object identifier

Examples

>>> class Foo(Object):
...     def __init__(self, bar: str):
...         self.bar = bar
>>> foo1 = Foo("I am unique!")
>>> foo1.id
'893df240-babe-d796-cdf1-c436171b7a96'
>>> foo1.short_id
'171b7a96'
>>> foo2 = Foo("I am different!")
>>> foo2.short_id
'6e2d2190'
>>> foo3 = Foo("I am unique!")
>>> foo1.short_id == foo3.short_id
True

to_dict()

Mix.to_dict(*, include_version=True, flatten=False, root=None)

Converts object to a dictionary.

Includes items from audobject.Object.arguments. If an argument has a resolver, its value is encoded. Usually, the object can be re-instantiated using audobject.Object.from_dict(). However, if flatten=True, this is not possible.

Parameters:
  • include_version (bool) – add version to class name

  • flatten (bool) – flatten the dictionary

  • root (str) – if file is written to disk, set to target directory

Return type:

collections.abc.Mapping[str, typing.Union[bool, datetime.datetime, dict, float, int, list, None, str]]

Returns:

dictionary that represent the object

Examples

>>> import audobject.testing
>>> o = audobject.testing.TestObject("test", point=(1, 1))
>>> o.to_dict(include_version=False)
{'$audobject.core.testing.TestObject': {'name': 'test', 'point': [1, 1]}}
>>> o.to_dict(flatten=True)
{'name': 'test', 'point.0': 1, 'point.1': 1}

to_samples()

Mix.to_samples(value, sampling_rate=None, *, length=None, allow_negative=True)

Convert duration value to samples.

Return type:

int

to_yaml()

Mix.to_yaml(path_or_stream, *, include_version=True)

Save object to YAML file.

Parameters:
  • path_or_stream (str | io.IOBase) – file path or stream

  • include_version (bool) – add version to class name

to_yaml_s()

Mix.to_yaml_s(*, include_version=True)

Convert object to YAML string.

Parameters:

include_version (bool) – add version to class name

Return type:

str

Returns:

YAML string

Examples

>>> import audobject.testing
>>> o = audobject.testing.TestObject("test", point=(1, 1))
>>> print(o.to_yaml_s(include_version=False))
$audobject.core.testing.TestObject:
  name: test
  point:
  - 1
  - 1