Repository files navigation

Automatic annotation of syllables in bioacoustics recordings

This repository contains code for the fully unsupervised method for syllable annotation in bioacoustics recordings described in Identifying Birdsong Syllables without Labelled Data.

Getting started

This project uses python 3.12.

Code structure:

The note_sequencing folder contains all source code for running the automatic labelling method. We explain in the following section how to adapt the code to your own data.

note_sequencing/
├── README.md
├── cluster/: functions for clustering used in the split and merge steps
├── data_loader/ : contains dataset specific preparation (including conversion of raw audio to spectrograms) and dataloader creation code. ├── detect/: deconvolution (template matching)
├── preprocessing/: generic preprocessing helpers
├── templates/: functions to create templates from clusters
├── util/: functions to save results
├── viz/: visualization functions

configcontains an example YAML configuration file.

scripts contains an example main_pied_flycatcher.py script for running the method.

The code used for the paper was slightly different than the one we share here because of extra outputs to different functions for the case when we had labels with which to evaluate our method. We provide code specific to the Bengalese finches and Great tits datasets in the paper is in paper (in particular, preprocessing of the Bengalese finch song dataset) -- (note: this is in progress, and the repo will be updated). However, we chose to release a more minimalistic version of the code which is easily adaptable to new datasets.

We improved on the initial detection (with connected components) presented in the paper by using spectral gating which we recommend as the default method to use. The relevant code can be found in detect/spectral_detect.py An addition to the paper is the possibility to apply noisereduce on input audio as an additional denoising preprocessing step, which can be controlled by the parameter preprocessing.bandpass_filter in the YAML configuration file.

Data structure requirements and adapting the code to your dataset

  • adapt the note_sequencing/data_loader/pied_flycatchers_dataset.pyfile to your dataset. This dataset file includes the preprocessing of raw audio to spectrograms. You should first chop the recordings into the length of windows that you wish to process. The method can take any length of recording as input (as long as it fits in the memory) but you might want shorter chunks for ease of visualization. Typically for birds, we would chunk into windows of 4-10s. All the recordings (or chunked recordings) should then be put in a single folder. The important thing is that you save processed raw audios into numpy spectrograms in individual files, and that you have a dataframe with a summary of the paths to those numpy files in the audio_pathcolumn of the dataframe (see dict_all in the process_data function). You should also output a combined_spectrograms.npy output file which is a numpy array containing all the spectrograms. This is useful for sped up processing. In order to run the spectral detection (as the initial detection step in detect/spectral_detect.py) you also need to have access to the .wav recordings (unprocessed) and have their paths in the raw_audio_path column of the dataframe. Make sure that the parameters to savespecfunction in the remove_spectral_components function in the spectral detection are the same as those used in the the dataset definition.

  • Then you can write a main file like the one in scripts/main_pied_flycatchers.py - the only change here is that you need to import the correct dataset in the imports

  • All the parameters can be defined in a config file following this one configs/pied_flycatchers.yaml

🐍 Python Version

This project uses Python 3.12.

📦 Package & Environment Management

This project uses poetry for package and environment management.

Clone the repository,install poetry and run poetry install

Running the method

Then run poetry run python scripts/main_pied_flycatchers.py --config "configs/pied_flycatchers.yaml"

About

This repo contains code for automatically annotating syllables in bioacoustics recordings.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Automatic annotation of syllables in bioacoustics recordings

This repository contains code for the fully unsupervised method for syllable annotation in bioacoustics recordings described in Identifying Birdsong Syllables without Labelled Data.

Getting started

This project uses python 3.12.

Code structure:

The note_sequencing folder contains all source code for running the automatic labelling method. We explain in the following section how to adapt the code to your own data.

note_sequencing/
├── README.md
├── cluster/: functions for clustering used in the split and merge steps
├── data_loader/ : contains dataset specific preparation (including conversion of raw audio to spectrograms) and dataloader creation code. ├── detect/: deconvolution (template matching)
├── preprocessing/: generic preprocessing helpers
├── templates/: functions to create templates from clusters
├── util/: functions to save results
├── viz/: visualization functions

configcontains an example YAML configuration file.

scripts contains an example main_pied_flycatcher.py script for running the method.

The code used for the paper was slightly different than the one we share here because of extra outputs to different functions for the case when we had labels with which to evaluate our method. We provide code specific to the Bengalese finches and Great tits datasets in the paper is in paper (in particular, preprocessing of the Bengalese finch song dataset) -- (note: this is in progress, and the repo will be updated). However, we chose to release a more minimalistic version of the code which is easily adaptable to new datasets.

We improved on the initial detection (with connected components) presented in the paper by using spectral gating which we recommend as the default method to use. The relevant code can be found in detect/spectral_detect.py An addition to the paper is the possibility to apply noisereduce on input audio as an additional denoising preprocessing step, which can be controlled by the parameter preprocessing.bandpass_filter in the YAML configuration file.

Data structure requirements and adapting the code to your dataset

  • adapt the note_sequencing/data_loader/pied_flycatchers_dataset.pyfile to your dataset. This dataset file includes the preprocessing of raw audio to spectrograms. You should first chop the recordings into the length of windows that you wish to process. The method can take any length of recording as input (as long as it fits in the memory) but you might want shorter chunks for ease of visualization. Typically for birds, we would chunk into windows of 4-10s. All the recordings (or chunked recordings) should then be put in a single folder. The important thing is that you save processed raw audios into numpy spectrograms in individual files, and that you have a dataframe with a summary of the paths to those numpy files in the audio_pathcolumn of the dataframe (see dict_all in the process_data function). You should also output a combined_spectrograms.npy output file which is a numpy array containing all the spectrograms. This is useful for sped up processing. In order to run the spectral detection (as the initial detection step in detect/spectral_detect.py) you also need to have access to the .wav recordings (unprocessed) and have their paths in the raw_audio_path column of the dataframe. Make sure that the parameters to savespecfunction in the remove_spectral_components function in the spectral detection are the same as those used in the the dataset definition.

  • Then you can write a main file like the one in scripts/main_pied_flycatchers.py - the only change here is that you need to import the correct dataset in the imports

  • All the parameters can be defined in a config file following this one configs/pied_flycatchers.yaml

🐍 Python Version

This project uses Python 3.12.

📦 Package & Environment Management

This project uses poetry for package and environment management.

Clone the repository,install poetry and run poetry install

Running the method

Then run poetry run python scripts/main_pied_flycatchers.py --config "configs/pied_flycatchers.yaml"

About

This repo contains code for automatically annotating syllables in bioacoustics recordings.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Automatic annotation of syllables in bioacoustics recordings

This repository contains code for the fully unsupervised method for syllable annotation in bioacoustics recordings described in Identifying Birdsong Syllables without Labelled Data.

Getting started

This project uses python 3.12.

Code structure:

The note_sequencing folder contains all source code for running the automatic labelling method. We explain in the following section how to adapt the code to your own data.

note_sequencing/
├── README.md
├── cluster/: functions for clustering used in the split and merge steps
├── data_loader/ : contains dataset specific preparation (including conversion of raw audio to spectrograms) and dataloader creation code. ├── detect/: deconvolution (template matching)
├── preprocessing/: generic preprocessing helpers
├── templates/: functions to create templates from clusters
├── util/: functions to save results
├── viz/: visualization functions

configcontains an example YAML configuration file.

scripts contains an example main_pied_flycatcher.py script for running the method.

The code used for the paper was slightly different than the one we share here because of extra outputs to different functions for the case when we had labels with which to evaluate our method. We provide code specific to the Bengalese finches and Great tits datasets in the paper is in paper (in particular, preprocessing of the Bengalese finch song dataset) -- (note: this is in progress, and the repo will be updated). However, we chose to release a more minimalistic version of the code which is easily adaptable to new datasets.

We improved on the initial detection (with connected components) presented in the paper by using spectral gating which we recommend as the default method to use. The relevant code can be found in detect/spectral_detect.py An addition to the paper is the possibility to apply noisereduce on input audio as an additional denoising preprocessing step, which can be controlled by the parameter preprocessing.bandpass_filter in the YAML configuration file.

Data structure requirements and adapting the code to your dataset

  • adapt the note_sequencing/data_loader/pied_flycatchers_dataset.pyfile to your dataset. This dataset file includes the preprocessing of raw audio to spectrograms. You should first chop the recordings into the length of windows that you wish to process. The method can take any length of recording as input (as long as it fits in the memory) but you might want shorter chunks for ease of visualization. Typically for birds, we would chunk into windows of 4-10s. All the recordings (or chunked recordings) should then be put in a single folder. The important thing is that you save processed raw audios into numpy spectrograms in individual files, and that you have a dataframe with a summary of the paths to those numpy files in the audio_pathcolumn of the dataframe (see dict_all in the process_data function). You should also output a combined_spectrograms.npy output file which is a numpy array containing all the spectrograms. This is useful for sped up processing. In order to run the spectral detection (as the initial detection step in detect/spectral_detect.py) you also need to have access to the .wav recordings (unprocessed) and have their paths in the raw_audio_path column of the dataframe. Make sure that the parameters to savespecfunction in the remove_spectral_components function in the spectral detection are the same as those used in the the dataset definition.

  • Then you can write a main file like the one in scripts/main_pied_flycatchers.py - the only change here is that you need to import the correct dataset in the imports

  • All the parameters can be defined in a config file following this one configs/pied_flycatchers.yaml

🐍 Python Version

This project uses Python 3.12.

📦 Package & Environment Management

This project uses poetry for package and environment management.

Clone the repository,install poetry and run poetry install

Running the method

Then run poetry run python scripts/main_pied_flycatchers.py --config "configs/pied_flycatchers.yaml"

About

This repo contains code for automatically annotating syllables in bioacoustics recordings.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Automatic annotation of syllables in bioacoustics recordings

This repository contains code for the fully unsupervised method for syllable annotation in bioacoustics recordings described in Identifying Birdsong Syllables without Labelled Data.

Getting started

This project uses python 3.12.

Code structure:

The note_sequencing folder contains all source code for running the automatic labelling method. We explain in the following section how to adapt the code to your own data.

note_sequencing/
├── README.md
├── cluster/: functions for clustering used in the split and merge steps
├── data_loader/ : contains dataset specific preparation (including conversion of raw audio to spectrograms) and dataloader creation code. ├── detect/: deconvolution (template matching)
├── preprocessing/: generic preprocessing helpers
├── templates/: functions to create templates from clusters
├── util/: functions to save results
├── viz/: visualization functions

configcontains an example YAML configuration file.

scripts contains an example main_pied_flycatcher.py script for running the method.

The code used for the paper was slightly different than the one we share here because of extra outputs to different functions for the case when we had labels with which to evaluate our method. We provide code specific to the Bengalese finches and Great tits datasets in the paper is in paper (in particular, preprocessing of the Bengalese finch song dataset) -- (note: this is in progress, and the repo will be updated). However, we chose to release a more minimalistic version of the code which is easily adaptable to new datasets.

We improved on the initial detection (with connected components) presented in the paper by using spectral gating which we recommend as the default method to use. The relevant code can be found in detect/spectral_detect.py An addition to the paper is the possibility to apply noisereduce on input audio as an additional denoising preprocessing step, which can be controlled by the parameter preprocessing.bandpass_filter in the YAML configuration file.

Data structure requirements and adapting the code to your dataset

  • adapt the note_sequencing/data_loader/pied_flycatchers_dataset.pyfile to your dataset. This dataset file includes the preprocessing of raw audio to spectrograms. You should first chop the recordings into the length of windows that you wish to process. The method can take any length of recording as input (as long as it fits in the memory) but you might want shorter chunks for ease of visualization. Typically for birds, we would chunk into windows of 4-10s. All the recordings (or chunked recordings) should then be put in a single folder. The important thing is that you save processed raw audios into numpy spectrograms in individual files, and that you have a dataframe with a summary of the paths to those numpy files in the audio_pathcolumn of the dataframe (see dict_all in the process_data function). You should also output a combined_spectrograms.npy output file which is a numpy array containing all the spectrograms. This is useful for sped up processing. In order to run the spectral detection (as the initial detection step in detect/spectral_detect.py) you also need to have access to the .wav recordings (unprocessed) and have their paths in the raw_audio_path column of the dataframe. Make sure that the parameters to savespecfunction in the remove_spectral_components function in the spectral detection are the same as those used in the the dataset definition.

  • Then you can write a main file like the one in scripts/main_pied_flycatchers.py - the only change here is that you need to import the correct dataset in the imports

  • All the parameters can be defined in a config file following this one configs/pied_flycatchers.yaml

🐍 Python Version

This project uses Python 3.12.

📦 Package & Environment Management

This project uses poetry for package and environment management.

Clone the repository,install poetry and run poetry install

Running the method

Then run poetry run python scripts/main_pied_flycatchers.py --config "configs/pied_flycatchers.yaml"

About

This repo contains code for automatically annotating syllables in bioacoustics recordings.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Automatic annotation of syllables in bioacoustics recordings

This repository contains code for the fully unsupervised method for syllable annotation in bioacoustics recordings described in Identifying Birdsong Syllables without Labelled Data.

Getting started

This project uses python 3.12.

Code structure:

The note_sequencing folder contains all source code for running the automatic labelling method. We explain in the following section how to adapt the code to your own data.

note_sequencing/
├── README.md
├── cluster/: functions for clustering used in the split and merge steps
├── data_loader/ : contains dataset specific preparation (including conversion of raw audio to spectrograms) and dataloader creation code. ├── detect/: deconvolution (template matching)
├── preprocessing/: generic preprocessing helpers
├── templates/: functions to create templates from clusters
├── util/: functions to save results
├── viz/: visualization functions

configcontains an example YAML configuration file.

scripts contains an example main_pied_flycatcher.py script for running the method.

The code used for the paper was slightly different than the one we share here because of extra outputs to different functions for the case when we had labels with which to evaluate our method. We provide code specific to the Bengalese finches and Great tits datasets in the paper is in paper (in particular, preprocessing of the Bengalese finch song dataset) -- (note: this is in progress, and the repo will be updated). However, we chose to release a more minimalistic version of the code which is easily adaptable to new datasets.

We improved on the initial detection (with connected components) presented in the paper by using spectral gating which we recommend as the default method to use. The relevant code can be found in detect/spectral_detect.py An addition to the paper is the possibility to apply noisereduce on input audio as an additional denoising preprocessing step, which can be controlled by the parameter preprocessing.bandpass_filter in the YAML configuration file.

Data structure requirements and adapting the code to your dataset

  • adapt the note_sequencing/data_loader/pied_flycatchers_dataset.pyfile to your dataset. This dataset file includes the preprocessing of raw audio to spectrograms. You should first chop the recordings into the length of windows that you wish to process. The method can take any length of recording as input (as long as it fits in the memory) but you might want shorter chunks for ease of visualization. Typically for birds, we would chunk into windows of 4-10s. All the recordings (or chunked recordings) should then be put in a single folder. The important thing is that you save processed raw audios into numpy spectrograms in individual files, and that you have a dataframe with a summary of the paths to those numpy files in the audio_pathcolumn of the dataframe (see dict_all in the process_data function). You should also output a combined_spectrograms.npy output file which is a numpy array containing all the spectrograms. This is useful for sped up processing. In order to run the spectral detection (as the initial detection step in detect/spectral_detect.py) you also need to have access to the .wav recordings (unprocessed) and have their paths in the raw_audio_path column of the dataframe. Make sure that the parameters to savespecfunction in the remove_spectral_components function in the spectral detection are the same as those used in the the dataset definition.

  • Then you can write a main file like the one in scripts/main_pied_flycatchers.py - the only change here is that you need to import the correct dataset in the imports

  • All the parameters can be defined in a config file following this one configs/pied_flycatchers.yaml

🐍 Python Version

This project uses Python 3.12.

📦 Package & Environment Management

This project uses poetry for package and environment management.

Clone the repository,install poetry and run poetry install

Running the method

Then run poetry run python scripts/main_pied_flycatchers.py --config "configs/pied_flycatchers.yaml"

About

This repo contains code for automatically annotating syllables in bioacoustics recordings.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Automatic annotation of syllables in bioacoustics recordings

This repository contains code for the fully unsupervised method for syllable annotation in bioacoustics recordings described in Identifying Birdsong Syllables without Labelled Data.

Getting started

This project uses python 3.12.

Code structure:

The note_sequencing folder contains all source code for running the automatic labelling method. We explain in the following section how to adapt the code to your own data.

note_sequencing/
├── README.md
├── cluster/: functions for clustering used in the split and merge steps
├── data_loader/ : contains dataset specific preparation (including conversion of raw audio to spectrograms) and dataloader creation code. ├── detect/: deconvolution (template matching)
├── preprocessing/: generic preprocessing helpers
├── templates/: functions to create templates from clusters
├── util/: functions to save results
├── viz/: visualization functions

configcontains an example YAML configuration file.

scripts contains an example main_pied_flycatcher.py script for running the method.

The code used for the paper was slightly different than the one we share here because of extra outputs to different functions for the case when we had labels with which to evaluate our method. We provide code specific to the Bengalese finches and Great tits datasets in the paper is in paper (in particular, preprocessing of the Bengalese finch song dataset) -- (note: this is in progress, and the repo will be updated). However, we chose to release a more minimalistic version of the code which is easily adaptable to new datasets.

We improved on the initial detection (with connected components) presented in the paper by using spectral gating which we recommend as the default method to use. The relevant code can be found in detect/spectral_detect.py An addition to the paper is the possibility to apply noisereduce on input audio as an additional denoising preprocessing step, which can be controlled by the parameter preprocessing.bandpass_filter in the YAML configuration file.

Data structure requirements and adapting the code to your dataset

  • adapt the note_sequencing/data_loader/pied_flycatchers_dataset.pyfile to your dataset. This dataset file includes the preprocessing of raw audio to spectrograms. You should first chop the recordings into the length of windows that you wish to process. The method can take any length of recording as input (as long as it fits in the memory) but you might want shorter chunks for ease of visualization. Typically for birds, we would chunk into windows of 4-10s. All the recordings (or chunked recordings) should then be put in a single folder. The important thing is that you save processed raw audios into numpy spectrograms in individual files, and that you have a dataframe with a summary of the paths to those numpy files in the audio_pathcolumn of the dataframe (see dict_all in the process_data function). You should also output a combined_spectrograms.npy output file which is a numpy array containing all the spectrograms. This is useful for sped up processing. In order to run the spectral detection (as the initial detection step in detect/spectral_detect.py) you also need to have access to the .wav recordings (unprocessed) and have their paths in the raw_audio_path column of the dataframe. Make sure that the parameters to savespecfunction in the remove_spectral_components function in the spectral detection are the same as those used in the the dataset definition.

  • Then you can write a main file like the one in scripts/main_pied_flycatchers.py - the only change here is that you need to import the correct dataset in the imports

  • All the parameters can be defined in a config file following this one configs/pied_flycatchers.yaml

🐍 Python Version

This project uses Python 3.12.

📦 Package & Environment Management

This project uses poetry for package and environment management.

Clone the repository,install poetry and run poetry install

Running the method

Then run poetry run python scripts/main_pied_flycatchers.py --config "configs/pied_flycatchers.yaml"

About

This repo contains code for automatically annotating syllables in bioacoustics recordings.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Automatic annotation of syllables in bioacoustics recordings

This repository contains code for the fully unsupervised method for syllable annotation in bioacoustics recordings described in Identifying Birdsong Syllables without Labelled Data.

Getting started

This project uses python 3.12.

Code structure:

The note_sequencing folder contains all source code for running the automatic labelling method. We explain in the following section how to adapt the code to your own data.

note_sequencing/
├── README.md
├── cluster/: functions for clustering used in the split and merge steps
├── data_loader/ : contains dataset specific preparation (including conversion of raw audio to spectrograms) and dataloader creation code. ├── detect/: deconvolution (template matching)
├── preprocessing/: generic preprocessing helpers
├── templates/: functions to create templates from clusters
├── util/: functions to save results
├── viz/: visualization functions

configcontains an example YAML configuration file.

scripts contains an example main_pied_flycatcher.py script for running the method.

The code used for the paper was slightly different than the one we share here because of extra outputs to different functions for the case when we had labels with which to evaluate our method. We provide code specific to the Bengalese finches and Great tits datasets in the paper is in paper (in particular, preprocessing of the Bengalese finch song dataset) -- (note: this is in progress, and the repo will be updated). However, we chose to release a more minimalistic version of the code which is easily adaptable to new datasets.

We improved on the initial detection (with connected components) presented in the paper by using spectral gating which we recommend as the default method to use. The relevant code can be found in detect/spectral_detect.py An addition to the paper is the possibility to apply noisereduce on input audio as an additional denoising preprocessing step, which can be controlled by the parameter preprocessing.bandpass_filter in the YAML configuration file.

Data structure requirements and adapting the code to your dataset

  • adapt the note_sequencing/data_loader/pied_flycatchers_dataset.pyfile to your dataset. This dataset file includes the preprocessing of raw audio to spectrograms. You should first chop the recordings into the length of windows that you wish to process. The method can take any length of recording as input (as long as it fits in the memory) but you might want shorter chunks for ease of visualization. Typically for birds, we would chunk into windows of 4-10s. All the recordings (or chunked recordings) should then be put in a single folder. The important thing is that you save processed raw audios into numpy spectrograms in individual files, and that you have a dataframe with a summary of the paths to those numpy files in the audio_pathcolumn of the dataframe (see dict_all in the process_data function). You should also output a combined_spectrograms.npy output file which is a numpy array containing all the spectrograms. This is useful for sped up processing. In order to run the spectral detection (as the initial detection step in detect/spectral_detect.py) you also need to have access to the .wav recordings (unprocessed) and have their paths in the raw_audio_path column of the dataframe. Make sure that the parameters to savespecfunction in the remove_spectral_components function in the spectral detection are the same as those used in the the dataset definition.

  • Then you can write a main file like the one in scripts/main_pied_flycatchers.py - the only change here is that you need to import the correct dataset in the imports

  • All the parameters can be defined in a config file following this one configs/pied_flycatchers.yaml

🐍 Python Version

This project uses Python 3.12.

📦 Package & Environment Management

This project uses poetry for package and environment management.

Clone the repository,install poetry and run poetry install

Running the method

Then run poetry run python scripts/main_pied_flycatchers.py --config "configs/pied_flycatchers.yaml"

About

This repo contains code for automatically annotating syllables in bioacoustics recordings.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Automatic annotation of syllables in bioacoustics recordings

This repository contains code for the fully unsupervised method for syllable annotation in bioacoustics recordings described in Identifying Birdsong Syllables without Labelled Data.

Getting started

This project uses python 3.12.

Code structure:

The note_sequencing folder contains all source code for running the automatic labelling method. We explain in the following section how to adapt the code to your own data.

note_sequencing/
├── README.md
├── cluster/: functions for clustering used in the split and merge steps
├── data_loader/ : contains dataset specific preparation (including conversion of raw audio to spectrograms) and dataloader creation code. ├── detect/: deconvolution (template matching)
├── preprocessing/: generic preprocessing helpers
├── templates/: functions to create templates from clusters
├── util/: functions to save results
├── viz/: visualization functions

configcontains an example YAML configuration file.

scripts contains an example main_pied_flycatcher.py script for running the method.

The code used for the paper was slightly different than the one we share here because of extra outputs to different functions for the case when we had labels with which to evaluate our method. We provide code specific to the Bengalese finches and Great tits datasets in the paper is in paper (in particular, preprocessing of the Bengalese finch song dataset) -- (note: this is in progress, and the repo will be updated). However, we chose to release a more minimalistic version of the code which is easily adaptable to new datasets.

We improved on the initial detection (with connected components) presented in the paper by using spectral gating which we recommend as the default method to use. The relevant code can be found in detect/spectral_detect.py An addition to the paper is the possibility to apply noisereduce on input audio as an additional denoising preprocessing step, which can be controlled by the parameter preprocessing.bandpass_filter in the YAML configuration file.

Data structure requirements and adapting the code to your dataset

  • adapt the note_sequencing/data_loader/pied_flycatchers_dataset.pyfile to your dataset. This dataset file includes the preprocessing of raw audio to spectrograms. You should first chop the recordings into the length of windows that you wish to process. The method can take any length of recording as input (as long as it fits in the memory) but you might want shorter chunks for ease of visualization. Typically for birds, we would chunk into windows of 4-10s. All the recordings (or chunked recordings) should then be put in a single folder. The important thing is that you save processed raw audios into numpy spectrograms in individual files, and that you have a dataframe with a summary of the paths to those numpy files in the audio_pathcolumn of the dataframe (see dict_all in the process_data function). You should also output a combined_spectrograms.npy output file which is a numpy array containing all the spectrograms. This is useful for sped up processing. In order to run the spectral detection (as the initial detection step in detect/spectral_detect.py) you also need to have access to the .wav recordings (unprocessed) and have their paths in the raw_audio_path column of the dataframe. Make sure that the parameters to savespecfunction in the remove_spectral_components function in the spectral detection are the same as those used in the the dataset definition.

  • Then you can write a main file like the one in scripts/main_pied_flycatchers.py - the only change here is that you need to import the correct dataset in the imports

  • All the parameters can be defined in a config file following this one configs/pied_flycatchers.yaml

🐍 Python Version

This project uses Python 3.12.

📦 Package & Environment Management

This project uses poetry for package and environment management.

Clone the repository,install poetry and run poetry install

Running the method

Then run poetry run python scripts/main_pied_flycatchers.py --config "configs/pied_flycatchers.yaml"

About

This repo contains code for automatically annotating syllables in bioacoustics recordings.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages