DynamicSound is a modular Python library designed for generating virtual acoustic scenes with customizable microphone configurations, sound sources, and environmental conditions. It is intended for research, algorithm development, and testing in areas such as beamforming, source localization, audio augmentation, and acoustic machine learning.
-
Flexible microphone models
- Single-channel microphones
- Microphone arrays with arbitrary geometry
- User-defined sampling rates
-
Configurable sound sources
- White noise generator
- Sinusoidal signal generator
- Audio file source
-
Environmental modeling
- Source and microphone trajectories, 3D positions and rotations
- Air absorption based on ISO 9613-1
- Temperature, pressure, and humidity parameters
-
Signal path simulation
- Distance-based attenuation
- Multiple sound sources simulation
- Scenarios with dynamic movement
This library follows Semantic Versioning using the format M.m.p
Where:
- M โ Major version: incompatible API changes
- m โ Minor version: added functionality in a backward-compatible manner
- p โ Patch version: backward-compatible bug fixes
pip install dynamic-sound[==<version>]example: pip install dynamic-sound=1.0.0
import dynamic_sound as ds
source_path = ds.Path([
# time / position(x,y,z) / quaternion(w,x,y,z)
[0.0, 343, 3, 1, 1, 0, 0, 0],
[10.0, -343, 3, 1, 1, 0, 0, 0]
])
microphone_path = ds.Path([
[0.0, 0, 0, 1, 1, 0, 0, 0],
[10.0, 0, 0, 1, 1, 0, 0, 0]
])
# simulation environment
sim = ds.Simulation(
temperature=20, # temperature [ยฐC]
pressure=1, # pressure [atm]
relative_humidity=50 # relative humidity [%]
)
# microphone
mic_sample_rate = 48_000 # Hertz [Hz]
microphone = ds.microphones.Microphone("_tmp/sine_dynamic.wav", sample_rate=mic_sample_rate)
sim.add_microphone(path=microphone_path, microphone=microphone)
# source
source = ds.sources.SineWave(frequency=2_000, amplitude=1.0)
sim.add_source(
path=source_path,
source=source
)
sim.run()More examples available inside examples folder.
Contributions are welcome! Please open an issue or submit a merge request following Gitโs standard workflow.
git clone <repository_name>๐dynamic-sound
โโ๐docs\
โโ๐examples\
โ โโ๐resources/
โ | โโ๐paths/
| | | โโ๐*.csv
โ | โโ๐sounds/
| | โโ๐*.wav
| โโ๐*.ipynb
โโ๐src\
โ โโ๐dynamic_sound/
โ โโ๐acoustics/
โ | โโ๐standards/
โ | โโ๐__init__.py
โ | โโ๐ISO_9613_1_1993.py
โ โโ๐environment/
| | โโ๐__init__.py
| | โโ๐_*.py
โ โโ๐microphones/
| | โโ๐__init__.py
| | โโ๐_*.py
โ โโ๐sources/
| | โโ๐__init__.py
| | โโ๐_*.py
โ โโ๐__init__.py
โ โโ๐_simulation.py
โ โโ๐py.typed
โโ๐tests\
| โโ๐test_*.py
โโ๐.gitignore
โโ๐.gitlab-ci.yml
โโ๐LICENSE.txt
โโ๐pyproject.toml
โโ๐README.md
- windows
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"- Linux and MacOS
curl -LsSf https://astral.sh/uv/install.sh | shmore details in the official uv documentation
uv sync- windows
.venv\Scripts\activate.bat
jupyter lab- Linux and MacOS
source .venv/bin/activate
jupyter labOpen one of the *.ipynb inside the examples folder and run it.
uv run pytest --cov=src --cov-report=term-missing --cov-fail-under=80 --capture=nouv version --bump patchthe options are major, minor, patch
uv publish --token UV_PUBLISH_TOKENThis project is licensed under the Apache License 2.0. See the full license text in LICENSE.txt.