diff --git a/.faq/FAQ.md b/.faq/FAQ.md
new file mode 100644
index 000000000..24516eace
--- /dev/null
+++ b/.faq/FAQ.md
@@ -0,0 +1,20 @@
+
+# Frequently Asked Questions
+
+{%- for question in questions %}
+- [{{ question.title }}](#{{ question.slug }})
+{%- endfor %}
+
+
+{%- for question in questions %}
+
+
+## {{ question.title }}
+
+{{ question.body }}
+
+{%- endfor %}
+
+
+
+Generated by [FAQtory](https://github.com/willmcgugan/faqtory)
diff --git a/.faq/suggest.md b/.faq/suggest.md
new file mode 100644
index 000000000..19e7b6d69
--- /dev/null
+++ b/.faq/suggest.md
@@ -0,0 +1,34 @@
+Thank you for your issue.
+
+{%- if questions -%}
+{% if questions|length == 1 %}
+We found the following entry in the [FAQ]({{ faq_url }}) which you may find helpful:
+{%- else %}
+We found the following entries in the [FAQ]({{ faq_url }}) which you may find helpful:
+{%- endif %}
+
+{% for question in questions %}
+- [{{ question.title }}]({{ faq_url }}#{{ question.slug }})
+{%- endfor %}
+
+{%- else -%}
+You might want to check the [FAQ]({{ faq_url }}) if you haven't done so already.
+{%- endif %}
+
+Feel free to close this issue if you found an answer in the FAQ.
+
+If your issue is a feature request, please read [this](https://xyproblem.info/) first and update your request accordingly, if needed.
+
+If your issue is a bug report, please provide a [minimum reproducible example](https://stackoverflow.com/help/minimal-reproducible-example) as a link to a self-contained [Google Colab](https://colab.research.google.com/) notebook containing everthing needed to reproduce the bug:
+ - installation
+ - data preparation
+ - model download
+ - etc.
+
+Providing an MRE will increase your chance of getting an answer from the community (either maintainers or other power users).
+
+Companies relying on `pyannote.audio` in production may contact [me](https://herve.niderb.fr) via email regarding:
+* paid scientific consulting around speaker diarization and speech processing in general;
+* custom models and tailored features (via the local tech transfer office).
+
+> This is an automated reply, generated by [FAQtory](https://github.com/willmcgugan/faqtory)
diff --git a/.github/stale.yml b/.github/stale.yml
index dc90e5a1c..3cb76e884 100644
--- a/.github/stale.yml
+++ b/.github/stale.yml
@@ -1,7 +1,7 @@
# Number of days of inactivity before an issue becomes stale
-daysUntilStale: 60
+daysUntilStale: 180
# Number of days of inactivity before a stale issue is closed
-daysUntilClose: 7
+daysUntilClose: 30
# Issues with these labels will never be considered stale
exemptLabels:
- pinned
diff --git a/.github/workflows/new_issue.yml b/.github/workflows/new_issue.yml
new file mode 100644
index 000000000..b8477dc16
--- /dev/null
+++ b/.github/workflows/new_issue.yml
@@ -0,0 +1,29 @@
+name: issues
+on:
+ issues:
+ types: [opened]
+jobs:
+ add-comment:
+ runs-on: ubuntu-latest
+ permissions:
+ issues: write
+ steps:
+ - uses: actions/checkout@v3
+ with:
+ ref: develop
+ - name: Install FAQtory
+ run: pip install FAQtory
+ - name: Run Suggest
+ env:
+ TITLE: ${{ github.event.issue.title }}
+ run: faqtory suggest "$TITLE" > suggest.md
+ - name: Read suggest.md
+ id: suggest
+ uses: juliangruber/read-file-action@v1
+ with:
+ path: ./suggest.md
+ - name: Suggest FAQ
+ uses: peter-evans/create-or-update-comment@a35cf36e5301d70b76f316e867e7788a55a31dae
+ with:
+ issue-number: ${{ github.event.issue.number }}
+ body: ${{ steps.suggest.outputs.content }}
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index 52aad4944..90a4302c6 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -2,9 +2,9 @@ name: Tests
on:
push:
- branches: [ develop ]
+ branches: [develop]
pull_request:
- branches: [ develop ]
+ branches: [develop]
jobs:
build:
@@ -13,28 +13,21 @@ jobs:
strategy:
matrix:
os: [ubuntu-latest]
- python-version: [3.7, 3.8, 3.9]
+ python-version: [3.8, 3.9, "3.10"]
steps:
- - uses: actions/checkout@v2
- - name: Set up Python ${{ matrix.python-version }}
- uses: actions/setup-python@v2
- with:
- python-version: ${{ matrix.python-version }}
- - name: Install libsndfile
- if: matrix.os == 'ubuntu-latest'
- run: |
- sudo apt-get install libsndfile1
- - name: Install pyannote.audio
- run: |
+ - uses: actions/checkout@v2
+ - name: Set up Python ${{ matrix.python-version }}
+ uses: actions/setup-python@v2
+ with:
+ python-version: ${{ matrix.python-version }}
+ - name: Install libsndfile
+ if: matrix.os == 'ubuntu-latest'
+ run: |
+ sudo apt-get update
+ sudo apt-get install libsndfile1
+ - name: Install pyannote.audio
+ run: |
pip install -e .[dev,testing]
- - name: Test with pytest
- run: |
- export PYANNOTE_DATABASE_CONFIG=$GITHUB_WORKSPACE/tests/data/database.yml
- pytest --cov-report=xml
- - name: Upload coverage to Codecov
- uses: codecov/codecov-action@v1
- with:
- file: ./coverage.xml
- env_vars: PYTHON
- name: codecov-pyannote-audio
- fail_ci_if_error: false
+ - name: Test with pytest
+ run: |
+ pytest
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index d1a6a64cd..549e46ad0 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -20,7 +20,7 @@ repos:
args: ["--profile", "black"]
# Formatting, Whitespace, etc
- - repo: git://github.com/pre-commit/pre-commit-hooks
+ - repo: https://github.com/pre-commit/pre-commit-hooks
rev: v2.2.3
hooks:
- id: trailing-whitespace
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 000000000..c444380d7
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,128 @@
+# Changelog
+
+## Version 3.0.0 (2023-09-26)
+
+### Features and improvements
+
+ - feat(pipeline): send pipeline to device with `pipeline.to(device)`
+ - feat(pipeline): add `return_embeddings` option to `SpeakerDiarization` pipeline
+ - feat(pipeline): make `segmentation_batch_size` and `embedding_batch_size` mutable in `SpeakerDiarization` pipeline (they now default to `1`)
+ - feat(pipeline): add progress hook to pipelines
+ - feat(task): add [powerset](https://www.isca-speech.org/archive/interspeech_2023/plaquet23_interspeech.html) support to `SpeakerDiarization` task
+ - feat(task): add support for multi-task models
+ - feat(task): add support for label scope in speaker diarization task
+ - feat(task): add support for missing classes in multi-label segmentation task
+ - feat(model): add segmentation model based on torchaudio self-supervised representation
+ - feat(pipeline): check version compatibility at load time
+ - improve(task): load metadata as tensors rather than pyannote.core instances
+ - improve(task): improve error message on missing specifications
+
+### Breaking changes
+
+ - BREAKING(task): rename `Segmentation` task to `SpeakerDiarization`
+ - BREAKING(pipeline): pipeline defaults to CPU (use `pipeline.to(device)`)
+ - BREAKING(pipeline): remove `SpeakerSegmentation` pipeline (use `SpeakerDiarization` pipeline)
+ - BREAKING(pipeline): remove `segmentation_duration` parameter from `SpeakerDiarization` pipeline (defaults to `duration` of segmentation model)
+ - BREAKING(task): remove support for variable chunk duration for segmentation tasks
+ - BREAKING(pipeline): remove support for `FINCHClustering` and `HiddenMarkovModelClustering`
+ - BREAKING(setup): drop support for Python 3.7
+ - BREAKING(io): channels are now 0-indexed (used to be 1-indexed)
+ - BREAKING(io): multi-channel audio is no longer downmixed to mono by default.
+ You should update how `pyannote.audio.core.io.Audio` is instantiated:
+ * replace `Audio()` by `Audio(mono="downmix")`;
+ * replace `Audio(mono=True)` by `Audio(mono="downmix")`;
+ * replace `Audio(mono=False)` by `Audio()`.
+ - BREAKING(model): get rid of (flaky) `Model.introspection`
+ If, for some weird reason, you wrote some custom code based on that,
+ you should instead rely on `Model.example_output`.
+ - BREAKING(interactive): remove support for Prodigy recipes
+
+
+### Fixes and improvements
+
+ - fix(pipeline): fix reproducibility issue with Ampere CUDA devices
+ - fix(pipeline): fix support for IOBase audio
+ - fix(pipeline): fix corner case with no speaker
+ - fix(train): prevent metadata preparation to happen twice
+ - fix(task): fix support for "balance" option
+ - improve(task): shorten and improve structure of Tensorboard tags
+
+### Dependencies update
+
+ - setup: switch to torch 2.0+, torchaudio 2.0+, soundfile 0.12+, lightning 2.0+, torchmetrics 0.11+
+ - setup: switch to pyannote.core 5.0+, pyannote.database 5.0+, and pyannote.pipeline 3.0+
+ - setup: switch to speechbrain 0.5.14+
+
+## Version 2.1.1 (2022-10-27)
+
+ - BREAKING(pipeline): rewrite speaker diarization pipeline
+ - feat(pipeline): add option to optimize for DER variant
+ - feat(clustering): add support for NeMo speaker embedding
+ - feat(clustering): add FINCH clustering
+ - feat(clustering): add min_cluster_size hparams to AgglomerativeClustering
+ - feat(hub): add support for private/gated models
+ - setup(hub): switch to latest hugginface_hub API
+ - fix(pipeline): fix support for missing reference in Resegmentation pipeline
+ - fix(clustering) fix corner case where HMM.fit finds too little states
+
+## Version 2.0.1 (2022-07-20)
+
+ - BREAKING: complete rewrite
+ - feat: much better performance
+ - feat: Python-first API
+ - feat: pretrained pipelines (and models) on Huggingface model hub
+ - feat: multi-GPU training with pytorch-lightning
+ - feat: data augmentation with torch-audiomentations
+ - feat: Prodigy recipe for model-assisted audio annotation
+
+## Version 1.1.2 (2021-01-28)
+
+ - fix: make sure master branch is used to load pretrained models (#599)
+
+## Version 1.1 (2020-11-08)
+
+ - last release before complete rewriting
+
+## Version 1.0.1 (2018-07-19)
+
+ - fix: fix regression in Precomputed.__call__ (#110, #105)
+
+## Version 1.0 (2018-07-03)
+
+ - chore: switch from keras to pytorch (with tensorboard support)
+ - improve: faster & better traning (`AutoLR`, advanced learning rate schedulers, improved batch generators)
+ - feat: add tunable speaker diarization pipeline (with its own tutorial)
+ - chore: drop support for Python 2 (use Python 3.6 or later)
+
+## Version 0.3.1 (2017-07-06)
+
+ - feat: add python 3 support
+ - chore: rewrite neural speaker embedding using autograd
+ - feat: add new embedding architectures
+ - feat: add new embedding losses
+ - chore: switch to Keras 2
+ - doc: add tutorial for (MFCC) feature extraction
+ - doc: add tutorial for (LSTM-based) speech activity detection
+ - doc: add tutorial for (LSTM-based) speaker change detection
+ - doc: add tutorial for (TristouNet) neural speaker embedding
+
+## Version 0.2.1 (2017-03-28)
+
+ - feat: add LSTM-based speech activity detection
+ - feat: add LSTM-based speaker change detection
+ - improve: refactor LSTM-based speaker embedding
+ - feat: add librosa basic support
+ - feat: add SMORMS3 optimizer
+
+## Version 0.1.4 (2016-09-26)
+
+ - feat: add 'covariance_type' option to BIC segmentation
+
+## Version 0.1.3 (2016-09-23)
+
+ - chore: rename sequence generator in preparation of the release of
+ TristouNet reproducible research package.
+
+## Version 0.1.2 (2016-09-22)
+
+ - first public version
diff --git a/FAQ.md b/FAQ.md
new file mode 100644
index 000000000..f192b2939
--- /dev/null
+++ b/FAQ.md
@@ -0,0 +1,54 @@
+
+# Frequently Asked Questions
+- [Can I apply pretrained pipelines on audio already loaded in memory?](#can-i-apply-pretrained-pipelines-on-audio-already-loaded-in-memory)
+- [Can I use gated models (and pipelines) offline?](#can-i-use-gated-models-(and-pipelines)-offline)
+- [Does pyannote support streaming speaker diarization?](#does-pyannote-support-streaming-speaker-diarization)
+- [How can I improve performance?](#how-can-i-improve-performance)
+- [How does one spell and pronounce pyannote.audio?](#how-does-one-spell-and-pronounce-pyannoteaudio)
+
+
+## Can I apply pretrained pipelines on audio already loaded in memory?
+
+Yes: read [this tutorial](tutorials/applying_a_pipeline.ipynb) until the end.
+
+
+## Can I use gated models (and pipelines) offline?
+
+**Short answer**: yes, see [this tutorial](tutorials/applying_a_model.ipynb) for models and [that one](tutorials/applying_a_pipeline.ipynb) for pipelines.
+
+**Long answer**: gating models and pipelines allows [me](https://herve.niderb.fr) to know a bit more about `pyannote.audio` user base and eventually help me write grant proposals to make `pyannote.audio` even better. So, please fill gating forms as precisely as possible.
+
+For instance, before gating `pyannote/speaker-diarization`, I had no idea that so many people were relying on it in production. Hint: sponsors are more than welcome! Maintaining open source libraries is time consuming.
+
+That being said, this whole authentication process does not prevent you from using official `pyannote.audio` models offline (i.e. without going through the authentication process in every `docker run ...` or whatever you are using in production): see [this tutorial](tutorials/applying_a_model.ipynb) for models and [that one](tutorials/applying_a_pipeline.ipynb) for pipelines.
+
+
+## Does pyannote support streaming speaker diarization?
+
+**Short answer:** not out of the box, no.
+
+**Long answer:** [I](https://herve.niderb.fr) am looking for sponsors to add this feature. In the meantime, [`diart`](https://github.com/juanmc2005/StreamingSpeakerDiarization) is the closest you can get from a streaming `pyannote.audio`. You might also be interested in [this blog post](https://herve.niderb.fr/fastpages/2021/08/05/Streaming-voice-activity-detection-with-pyannote.html) about streaming voice activity detection based on `pyannote.audio`.
+
+
+## How can I improve performance?
+
+**Long answer:**
+
+1. Manually annotate dozens of conversations as precisely as possible.
+2. Separate them into train (80%), development (10%) and test (10%) subsets.
+3. Setup the data for use with [`pyannote.database`](https://github.com/pyannote/pyannote-database#speaker-diarization).
+4. Follow [this recipe](https://github.com/pyannote/pyannote-audio/blob/develop/tutorials/adapting_pretrained_pipeline.ipynb).
+5. Enjoy.
+
+**Also:** [I am available](https://herve.niderb.fr) for contracting to help you with that.
+
+
+## How does one spell and pronounce pyannote.audio?
+
+📝 Written in lower case: `pyannote.audio` (or `pyannote` if you are lazy). Not `PyAnnote` nor `PyAnnotate` (sic).
+📢 Pronounced like the french verb `pianoter`. `pi` like in `pi`ano, not `py` like in `py`thon.
+🎹 `pianoter` means to play the piano (hence the logo 🤯).
+
+
+
+Generated by [FAQtory](https://github.com/willmcgugan/faqtory)
diff --git a/README.md b/README.md
index fc779a2c9..13418df8d 100644
--- a/README.md
+++ b/README.md
@@ -1,19 +1,32 @@
-# Neural speaker diarization with `pyannote.audio`
+Using `pyannote.audio` open-source toolkit in production?
+Make the most of it thanks to our [consulting services](https://herve.niderb.fr/consulting.html).
-`pyannote.audio` is an open-source toolkit written in Python for speaker diarization. Based on [PyTorch](pytorch.org) machine learning framework, it provides a set of trainable end-to-end neural building blocks that can be combined and jointly optimized to build speaker diarization pipelines.
+# `pyannote.audio` speaker diarization toolkit
+
+`pyannote.audio` is an open-source toolkit written in Python for speaker diarization. Based on [PyTorch](pytorch.org) machine learning framework, it comes with state-of-the-art [pretrained models and pipelines](https://hf.co/pyannote), that can be further finetuned to your own data for even better performance.
-## TL;DR [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/pyannote/pyannote-audio/blob/develop/tutorials/intro.ipynb)
+## TL;DR
+
+1. Install [`pyannote.audio`](https://github.com/pyannote/pyannote-audio) `3.0` with `pip install pyannote.audio`
+2. Accept [`pyannote/segmentation-3.0`](https://hf.co/pyannote/segmentation-3.0) user conditions
+3. Accept [`pyannote/speaker-diarization-3.0`](https://hf.co/pyannote-speaker-diarization-3.0) user conditions
+4. Create access token at [`hf.co/settings/tokens`](https://hf.co/settings/tokens).
```python
-# instantiate pretrained speaker diarization pipeline
from pyannote.audio import Pipeline
-pipeline = Pipeline.from_pretrained("pyannote/speaker-diarization")
+pipeline = Pipeline.from_pretrained(
+ "pyannote/speaker-diarization-3.0",
+ use_auth_token="HUGGINGFACE_ACCESS_TOKEN_GOES_HERE")
+
+# send pipeline to GPU (when available)
+import torch
+pipeline.to(torch.device("cuda"))
# apply pretrained pipeline
diarization = pipeline("audio.wav")
@@ -21,41 +34,24 @@ diarization = pipeline("audio.wav")
# print the result
for turn, _, speaker in diarization.itertracks(yield_label=True):
print(f"start={turn.start:.1f}s stop={turn.end:.1f}s speaker_{speaker}")
-# start=0.2s stop=1.5s speaker_A
-# start=1.8s stop=3.9s speaker_B
-# start=4.2s stop=5.7s speaker_A
+# start=0.2s stop=1.5s speaker_0
+# start=1.8s stop=3.9s speaker_1
+# start=4.2s stop=5.7s speaker_0
# ...
```
-## What's new in `pyannote.audio` 2.0
+## Highlights
-For version 2.x of `pyannote.audio`, [I](https://herve.niderb.fr) decided to rewrite almost everything from scratch.
-Highlights of this release are:
-
-- :exploding_head: much better performance (see [Benchmark](#benchmark))
-- :snake: Python-first API
- :hugs: pretrained [pipelines](https://hf.co/models?other=pyannote-audio-pipeline) (and [models](https://hf.co/models?other=pyannote-audio-model)) on [:hugs: model hub](https://huggingface.co/pyannote)
+- :exploding_head: state-of-the-art performance (see [Benchmark](#benchmark))
+- :snake: Python-first API
- :zap: multi-GPU training with [pytorch-lightning](https://pytorchlightning.ai/)
-- :control_knobs: data augmentation with [torch-audiomentations](https://github.com/asteroid-team/torch-audiomentations)
-- :boom: [Prodigy](https://prodi.gy/) recipes for model-assisted audio annotation
-
-## Installation
-
-Only Python 3.8+ is officially supported (though it might work with Python 3.7)
-
-```bash
-conda create -n pyannote python=3.8
-conda activate pyannote
-
-# pytorch 1.11 is required for speechbrain compatibility
-# (see https://pytorch.org/get-started/previous-versions/#v1110)
-conda install pytorch==1.11.0 torchvision==0.12.0 torchaudio==0.11.0 -c pytorch
-pip install pyannote.audio
-```
## Documentation
+- [Changelog](CHANGELOG.md)
+- [Frequently asked questions](FAQ.md)
- Models
- Available tasks explained
- [Applying a pretrained model](tutorials/applying_a_model.ipynb)
@@ -63,73 +59,61 @@ pip install pyannote.audio
- Pipelines
- Available pipelines explained
- [Applying a pretrained pipeline](tutorials/applying_a_pipeline.ipynb)
+ - [Adapting a pretrained pipeline to your own data](tutorials/adapting_pretrained_pipeline.ipynb)
- [Training a pipeline](tutorials/voice_activity_detection.ipynb)
- Contributing
- [Adding a new model](tutorials/add_your_own_model.ipynb)
- [Adding a new task](tutorials/add_your_own_task.ipynb)
- Adding a new pipeline
- Sharing pretrained models and pipelines
-- Miscellaneous
- - [Training with `pyannote-audio-train` command line tool](tutorials/training_with_cli.md)
- - [Annotating your own data with Prodigy](tutorials/prodigy.md)
- - [Speaker verification](tutorials/speaker_verification.ipynb)
- - Visualization and debugging
-
-## Frequently asked questions
-
-#### How does one capitalize and pronounce the name of this awesome library?
-
-📝 Written in lower case: `pyannote.audio` (or `pyannote` if you are lazy). Not `PyAnnote` nor `PyAnnotate` (*sic*).
-📢 [Pronounced](https://www.howtopronounce.com/french/pianote) like the french verb *pianoter*. *pi* like in **pi**ano, not *py* like in **py**thon.
-🎹 *pianoter* means *to play the piano* (hence the logo 🤯).
-
-#### **[Pretrained pipelines](https://huggingface.co/models?other=pyannote-audio-pipeline) do not produce good results on my data. What can I do?**
-
-1. [Annotate](https://github.com/pyannote/pyannote-audio/blob/develop/tutorials/prodigy.md) dozens of conversations manually and separate them into development and test subsets in [`pyannote.database`](https://github.com/pyannote/pyannote-database#speaker-diarization).
-2. [Optimize the hyper-parameters](https://github.com/pyannote/pyannote-audio/blob/develop/tutorials/voice_activity_detection.ipynb) of the pretained pipeline using the development set. If performance is still not good enough, go to step 3.
-3. Annotate hundreds of conversations manually and set them up as training subset in `pyannote.database`.
-4. [Fine-tune](https://github.com/pyannote/pyannote-audio/blob/develop/tutorials/training_a_model.ipynb) the models (on which the pipeline relies) using the training set.
-5. [Optimize the hyper-parameters](https://github.com/pyannote/pyannote-audio/blob/develop/tutorials/voice_activity_detection.ipynb) of the pipeline using the fine-tuned models using the development set. If performance is still not good enough, go back to step 3.
-
+- Blog
+ - 2022-12-02 > ["How I reached 1st place at Ego4D 2022, 1st place at Albayzin 2022, and 6th place at VoxSRC 2022 speaker diarization challenges"](tutorials/adapting_pretrained_pipeline.ipynb)
+ - 2022-10-23 > ["One speaker segmentation model to rule them all"](https://herve.niderb.fr/fastpages/2022/10/23/One-speaker-segmentation-model-to-rule-them-all)
+ - 2021-08-05 > ["Streaming voice activity detection with pyannote.audio"](https://herve.niderb.fr/fastpages/2021/08/05/Streaming-voice-activity-detection-with-pyannote.html)
+- Videos
+ - [Introduction to speaker diarization](https://umotion.univ-lemans.fr/video/9513-speech-segmentation-and-speaker-diarization/) / JSALT 2023 summer school / 90 min
+ - [Speaker segmentation model](https://www.youtube.com/watch?v=wDH2rvkjymY) / Interspeech 2021 / 3 min
+ - [First releaase of pyannote.audio](https://www.youtube.com/watch?v=37R_R82lfwA) / ICASSP 2020 / 8 min
## Benchmark
-Out of the box, `pyannote.audio` default speaker diarization pipeline is expected to be much better (and faster) in v2.0 than in v1.1.:
-
-| Dataset | DER% with v1.1 | DER% with v2.0 | Relative improvement |
-| ----------- | -------------- | -------------- | -------------------- |
-| AMI | 29.7% | 18.2% | 38% |
-| DIHARD | 29.2% | 21.0% | 28% |
-| VoxConverse | 21.5% | 12.6% | 41% |
-
-A more detailed benchmark is available [here](https://hf.co/pyannote/speaker-diarization).
+Out of the box, `pyannote.audio` speaker diarization [pipeline](https://hf.co/pyannote/speaker-diarization-3.0) v3.0 is expected to be much better (and faster) than v2.x.
+Those numbers are diarization error rates (in %):
+
+| Dataset \ Version | v1.1 | v2.0 | [v2.1](https://hf.co/pyannote/speaker-diarization-2.1) | [v3.0](https://hf.co/pyannote/speaker-diarization-3.0) | Premium |
+| ---------------------- | ---- | ---- | ------ | ------ | --------- |
+| AISHELL-4 | - | 14.6 | 14.1 | 12.3 | 12.3 |
+| AliMeeting (channel 1) | - | - | 27.4 | 24.3 | 19.4 |
+| AMI (IHM) | 29.7 | 18.2 | 18.9 | 19.0 | 16.7 |
+| AMI (SDM) | - | 29.0 | 27.1 | 22.2 | 20.1 |
+| AVA-AVD | - | - | - | 49.1 | 42.7 |
+| DIHARD 3 (full) | 29.2 | 21.0 | 26.9 | 21.7 | 17.0 |
+| MSDWild | - | - | - | 24.6 | 20.4 |
+| REPERE (phase2) | - | 12.6 | 8.2 | 7.8 | 7.8 |
+| VoxConverse (v0.3) | 21.5 | 12.6 | 11.2 | 11.3 | 9.5 |
## Citations
If you use `pyannote.audio` please use the following citations:
```bibtex
-@inproceedings{Bredin2020,
- Title = {{pyannote.audio: neural building blocks for speaker diarization}},
- Author = {{Bredin}, Herv{\'e} and {Yin}, Ruiqing and {Coria}, Juan Manuel and {Gelly}, Gregory and {Korshunov}, Pavel and {Lavechin}, Marvin and {Fustes}, Diego and {Titeux}, Hadrien and {Bouaziz}, Wassim and {Gill}, Marie-Philippe},
- Booktitle = {ICASSP 2020, IEEE International Conference on Acoustics, Speech, and Signal Processing},
- Year = {2020},
+@inproceedings{Plaquet23,
+ author={Alexis Plaquet and Hervé Bredin},
+ title={{Powerset multi-class cross entropy loss for neural speaker diarization}},
+ year=2023,
+ booktitle={Proc. INTERSPEECH 2023},
}
```
```bibtex
-@inproceedings{Bredin2021,
- Title = {{End-to-end speaker segmentation for overlap-aware resegmentation}},
- Author = {{Bredin}, Herv{\'e} and {Laurent}, Antoine},
- Booktitle = {Proc. Interspeech 2021},
- Year = {2021},
+@inproceedings{Bredin23,
+ author={Hervé Bredin},
+ title={{pyannote.audio 2.1 speaker diarization pipeline: principle, benchmark, and recipe}},
+ year=2023,
+ booktitle={Proc. INTERSPEECH 2023},
}
```
-## Support
-
-For commercial enquiries and scientific consulting, please contact [me](mailto:herve@niderb.fr).
-
## Development
The commands below will setup pre-commit hooks and packages needed for developing the `pyannote.audio` library.
@@ -139,9 +123,8 @@ pip install -e .[dev,testing]
pre-commit install
```
-Tests rely on a set of debugging files available in [`test/data`](test/data) directory.
-Set `PYANNOTE_DATABASE_CONFIG` environment variable to `test/data/database.yml` before running tests:
+## Test
```bash
-PYANNOTE_DATABASE_CONFIG=tests/data/database.yml pytest
+pytest
```
diff --git a/doc/source/changelog.rst b/doc/source/changelog.rst
deleted file mode 100644
index be69c3f54..000000000
--- a/doc/source/changelog.rst
+++ /dev/null
@@ -1,75 +0,0 @@
-#########
-Changelog
-#########
-
-Version 2.0.1 (2022-07-20)
-~~~~~~~~~~~~~~~~~~~~~~~~
-
- - BREAKING: complete rewrite
- - feat: much better performance
- - feat: Python-first API
- - feat: pretrained pipelines (and models) on Huggingface model hub
- - feat: multi-GPU training with pytorch-lightning
- - feat: data augmentation with torch-audiomentations
- - feat: Prodigy recipe for model-assisted audio annotation
-
-Version 1.1.2 (2021-01-28)
-~~~~~~~~~~~~~~~~~~~~~~~~~~
-
- - fix: make sure master branch is used to load pretrained models (#599)
-
-Version 1.1 (2020-11-08)
-~~~~~~~~~~~~~~~~~~~~~~~~
-
- - last release before complete rewriting
-
-Version 1.0.1 (2018--07-19)
-~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
- - fix: fix regression in Precomputed.__call__ (#110, #105)
-
-Version 1.0 (2018-07-03)
-~~~~~~~~~~~~~~~~~~~~~~~~
-
- - chore: switch from keras to pytorch (with tensorboard support)
- - improve: faster & better traning (`AutoLR`, advanced learning rate schedulers, improved batch generators)
- - feat: add tunable speaker diarization pipeline (with its own tutorial)
- - chore: drop support for Python 2 (use Python 3.6 or later)
-
-Version 0.3.1 (2017-07-06)
-~~~~~~~~~~~~~~~~~~~~~~~~~~
-
- - feat: add python 3 support
- - chore: rewrite neural speaker embedding using autograd
- - feat: add new embedding architectures
- - feat: add new embedding losses
- - chore: switch to Keras 2
- - doc: add tutorial for (MFCC) feature extraction
- - doc: add tutorial for (LSTM-based) speech activity detection
- - doc: add tutorial for (LSTM-based) speaker change detection
- - doc: add tutorial for (TristouNet) neural speaker embedding
-
-Version 0.2.1 (2017-03-28)
-~~~~~~~~~~~~~~~~~~~~~~~~~~
-
- - feat: add LSTM-based speech activity detection
- - feat: add LSTM-based speaker change detection
- - improve: refactor LSTM-based speaker embedding
- - feat: add librosa basic support
- - feat: add SMORMS3 optimizer
-
-Version 0.1.4 (2016-09-26)
-~~~~~~~~~~~~~~~~~~~~~~~~~~
-
- - feat: add 'covariance_type' option to BIC segmentation
-
-Version 0.1.3 (2016-09-23)
-~~~~~~~~~~~~~~~~~~~~~~~~~~
-
- - chore: rename sequence generator in preparation of the release of
- TristouNet reproducible research package.
-
-Version 0.1.2 (2016-09-22)
-~~~~~~~~~~~~~~~~~~~~~~~~~~
-
- - first public version
diff --git a/doc/source/index.rst b/doc/source/index.rst
index 69fabbf08..925a460ce 100644
--- a/doc/source/index.rst
+++ b/doc/source/index.rst
@@ -9,6 +9,8 @@ Installation
::
+ $ conda create -n pyannote python=3.10
+ $ conda activate pyannote
$ pip install pyannote.audio
@@ -17,5 +19,3 @@ API documentation
.. toctree::
:maxdepth: 2
-
- changelog
diff --git a/faq.yml b/faq.yml
new file mode 100644
index 000000000..f473198d5
--- /dev/null
+++ b/faq.yml
@@ -0,0 +1,7 @@
+# FAQtory settings
+
+faq_url: "https://github.com/pyannote/pyannote-audio/blob/develop/FAQ.md" # Replace this with the URL to your FAQ.md!
+
+questions_path: "./questions" # Where questions should be stored
+output_path: "./FAQ.md" # Where FAQ.md should be generated
+templates_path: ".faq" # Path to templates
diff --git a/notebook/augmentation.ipynb b/notebook/augmentation.ipynb
index 7af1250e4..656eae4a7 100644
--- a/notebook/augmentation.ipynb
+++ b/notebook/augmentation.ipynb
@@ -12,7 +12,7 @@
" preprocessors={\"audio\": FileFinder()})\n",
"\n",
"from pyannote.audio.core.io import Audio\n",
- "audio = Audio(sample_rate=16000, mono=True)\n",
+ "audio = Audio(sample_rate=16000, mono=\"downmix\")\n",
"file = next(protocol.test())\n",
"\n",
"from pyannote.core import Segment\n",
diff --git a/notebook/example.ipynb b/notebook/example.ipynb
index 468f30b96..549656d19 100644
--- a/notebook/example.ipynb
+++ b/notebook/example.ipynb
@@ -2,18 +2,28 @@
"cells": [
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 1,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "'Debug.SpeakerDiarization.Debug' found in /Users/hbredin/Development/pyannote/pyannote-audio/tests/data/database.yml does not define the 'scope' of speaker labels (file, database, or global). Setting it to 'file'.\n",
+ "'Debug.SpeakerDiarization.Bug1237' found in /Users/hbredin/Development/pyannote/pyannote-audio/tests/data/database.yml does not define the 'scope' of speaker labels (file, database, or global). Setting it to 'file'.\n"
+ ]
+ }
+ ],
"source": [
- "from pyannote.database import get_protocol, FileFinder\n",
- "protocol = get_protocol('Debug.SpeakerDiarization.Debug', \n",
- " preprocessors={\"audio\": FileFinder()})"
+ "from pyannote.database import registry, FileFinder\n",
+ "registry.load_database('../tests/data/database.yml')\n",
+ "protocol = registry.get_protocol('Debug.SpeakerDiarization.Debug', \n",
+ " preprocessors={\"audio\": FileFinder()})"
]
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
@@ -24,26 +34,133 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 3,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " Your browser does not support the audio element.\n",
+ " \n",
+ " "
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 3,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
"source": [
"from pyannote.audio.utils.preview import listen\n",
"listen(next(protocol.train()))"
]
},
{
+ "attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
- "## Voice activity detection"
+ "## Voice activity detection"
]
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 4,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "GPU available: True (mps), used: False\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Protocol Debug.SpeakerDiarization.Debug does not precompute the output of torchaudio.info(): adding a 'torchaudio.info' preprocessor for you to speed up dataloaders. See pyannote.database documentation on how to do that yourself.\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "TPU available: False, using: 0 TPU cores\n",
+ "IPU available: False, using: 0 IPUs\n",
+ "HPU available: False, using: 0 HPUs\n",
+ "Missing logger folder: /Users/hbredin/Development/pyannote/pyannote-audio/notebook/lightning_logs\n",
+ "\n",
+ " | Name | Type | Params | In sizes | Out sizes \n",
+ "----------------------------------------------------------------------------------------------------------------------\n",
+ "0 | mfcc | MFCC | 0 | [32, 1, 32000] | [32, 1, 40, 161] \n",
+ "1 | lstm | LSTM | 18.9 K | [32, 161, 40] | [[32, 161, 64], [[2, 32, 32], [2, 32, 32]]]\n",
+ "2 | classifier | Linear | 65 | [32, 161, 64] | [32, 161, 1] \n",
+ "3 | activation | Sigmoid | 0 | [32, 161, 1] | [32, 161, 1] \n",
+ "4 | validation_metric | MetricCollection | 0 | ? | ? \n",
+ "----------------------------------------------------------------------------------------------------------------------\n",
+ "19.0 K Trainable params\n",
+ "0 Non-trainable params\n",
+ "19.0 K Total params\n",
+ "0.076 Total estimated model params size (MB)\n"
+ ]
+ },
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "37e122a182e544648e65bed1f71ae722",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "Sanity Checking: 0it [00:00, ?it/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "4e8a349a91e447a49ea0d93cccfd266c",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "Training: 0it [00:00, ?it/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "90c5c47fd1ce4ee98f9729258fab9692",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "Validation: 0it [00:00, ?it/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "`Trainer.fit` stopped: `max_epochs=1` reached.\n"
+ ]
+ }
+ ],
"source": [
"from pyannote.audio.tasks import VoiceActivityDetection\n",
"vad = VoiceActivityDetection(protocol, duration=2., batch_size=32, num_workers=4)\n",
@@ -52,26 +169,6 @@
"_ = trainer.fit(model)"
]
},
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Speaker change detection"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "from pyannote.audio.tasks import SpeakerChangeDetection\n",
- "scd = SpeakerChangeDetection(protocol, duration=2., batch_size=32, num_workers=4)\n",
- "model = SimpleSegmentationModel(task=scd)\n",
- "trainer = pl.Trainer(max_epochs=1)\n",
- "_ = trainer.fit(model)"
- ]
- },
{
"cell_type": "markdown",
"metadata": {},
@@ -81,9 +178,82 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 5,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "GPU available: True (mps), used: False\n",
+ "TPU available: False, using: 0 TPU cores\n",
+ "IPU available: False, using: 0 IPUs\n",
+ "HPU available: False, using: 0 HPUs\n",
+ "\n",
+ " | Name | Type | Params | In sizes | Out sizes \n",
+ "----------------------------------------------------------------------------------------------------------------------\n",
+ "0 | mfcc | MFCC | 0 | [32, 1, 32000] | [32, 1, 40, 161] \n",
+ "1 | lstm | LSTM | 18.9 K | [32, 161, 40] | [[32, 161, 64], [[2, 32, 32], [2, 32, 32]]]\n",
+ "2 | classifier | Linear | 65 | [32, 161, 64] | [32, 161, 1] \n",
+ "3 | activation | Sigmoid | 0 | [32, 161, 1] | [32, 161, 1] \n",
+ "4 | validation_metric | MetricCollection | 0 | ? | ? \n",
+ "----------------------------------------------------------------------------------------------------------------------\n",
+ "19.0 K Trainable params\n",
+ "0 Non-trainable params\n",
+ "19.0 K Total params\n",
+ "0.076 Total estimated model params size (MB)\n"
+ ]
+ },
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "9a8333c0ebdf41a79482d81e94bf0e76",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "Sanity Checking: 0it [00:00, ?it/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "96c422e9449e40fa82a7f274cc6e5e16",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "Training: 0it [00:00, ?it/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "1f343adebc5a407ab7b33b5b88094edf",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "Validation: 0it [00:00, ?it/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "`Trainer.fit` stopped: `max_epochs=1` reached.\n"
+ ]
+ }
+ ],
"source": [
"from pyannote.audio.tasks import OverlappedSpeechDetection\n",
"ovl = OverlappedSpeechDetection(protocol, duration=2., batch_size=32, num_workers=4)\n",
@@ -93,45 +263,154 @@
]
},
{
+ "attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
- "## Segmentation"
+ "## (Local) speaker diarization"
]
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 6,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "GPU available: True (mps), used: False\n",
+ "TPU available: False, using: 0 TPU cores\n",
+ "IPU available: False, using: 0 IPUs\n",
+ "HPU available: False, using: 0 HPUs\n"
+ ]
+ },
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "574568dce865407e912423c55dfb002d",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "Output()"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ " \n"
+ ],
+ "text/plain": []
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n"
+ ],
+ "text/plain": [
+ "\n"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ " | Name | Type | Params | In sizes | Out sizes \n",
+ "----------------------------------------------------------------------------------------------------------------------\n",
+ "0 | mfcc | MFCC | 0 | [32, 1, 32000] | [32, 1, 40, 161] \n",
+ "1 | lstm | LSTM | 18.9 K | [32, 161, 40] | [[32, 161, 64], [[2, 32, 32], [2, 32, 32]]]\n",
+ "2 | classifier | Linear | 195 | [32, 161, 64] | [32, 161, 3] \n",
+ "3 | activation | Sigmoid | 0 | [32, 161, 3] | [32, 161, 3] \n",
+ "4 | validation_metric | MetricCollection | 0 | ? | ? \n",
+ "----------------------------------------------------------------------------------------------------------------------\n",
+ "19.1 K Trainable params\n",
+ "0 Non-trainable params\n",
+ "19.1 K Total params\n",
+ "0.077 Total estimated model params size (MB)\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " - 27.32% of all chunks contain no speech at all.\n",
+ " - 66.79% contain 1 speaker or less\n",
+ " - 91.25% contain 2 speakers or less\n",
+ " - 98.04% contain 3 speakers or less\n",
+ " - 100.00% contain 4 speakers or less\n",
+ "Setting `max_speakers_per_chunk` to 3. You can override this value (or avoid this estimation step) by passing `max_speakers_per_chunk=3` to the task constructor.\n"
+ ]
+ },
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "423b6758f1c84f3b8ece70744862fb66",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "Sanity Checking: 0it [00:00, ?it/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "e85cb23d204c4876a82a8202edc273c5",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "Training: 0it [00:00, ?it/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "b8f5929201654acf83fbca919a5ac63b",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "Validation: 0it [00:00, ?it/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "`Trainer.fit` stopped: `max_epochs=1` reached.\n"
+ ]
+ }
+ ],
"source": [
- "from pyannote.audio.tasks import Segmentation\n",
- "seg = Segmentation(protocol, duration=2., batch_size=32, num_workers=4)\n",
+ "from pyannote.audio.tasks import SpeakerDiarization\n",
+ "seg = SpeakerDiarization(protocol, duration=2., batch_size=32, num_workers=4)\n",
"model = SimpleSegmentationModel(task=seg)\n",
"trainer = pl.Trainer(max_epochs=1)\n",
"_ = trainer.fit(model)"
]
},
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Speaker tracking"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "from pyannote.audio.tasks import SpeakerTracking\n",
- "spk = SpeakerTracking(protocol, duration=2., batch_size=32, num_workers=4)\n",
- "model = SimpleSegmentationModel(task=spk)\n",
- "trainer = pl.Trainer(max_epochs=1)\n",
- "_ = trainer.fit(model)"
- ]
- },
{
"cell_type": "markdown",
"metadata": {},
@@ -141,9 +420,68 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 7,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "GPU available: True (mps), used: False\n",
+ "TPU available: False, using: 0 TPU cores\n",
+ "IPU available: False, using: 0 IPUs\n",
+ "HPU available: False, using: 0 HPUs\n",
+ "Loading Debug.SpeakerDiarization.Debug training labels: 10file [00:00, 363.55file/s]\n",
+ "\n",
+ " | Name | Type | Params | In sizes | Out sizes \n",
+ "----------------------------------------------------------------------------------------------------------------------\n",
+ "0 | mfcc | MFCC | 0 | [32, 1, 32000] | [32, 1, 40, 161] \n",
+ "1 | lstm | LSTM | 18.9 K | [32, 161, 40] | [[32, 161, 64], [[2, 32, 32], [2, 32, 32]]]\n",
+ "2 | loss_func | ArcFaceLoss | 832 | ? | ? \n",
+ "3 | validation_metric | MetricCollection | 0 | ? | ? \n",
+ "----------------------------------------------------------------------------------------------------------------------\n",
+ "19.8 K Trainable params\n",
+ "0 Non-trainable params\n",
+ "19.8 K Total params\n",
+ "0.079 Total estimated model params size (MB)\n"
+ ]
+ },
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "b34c5cbe6c9c409fb5572b0be9598076",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "Sanity Checking: 0it [00:00, ?it/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "71077814aa154ba3b4892e8be13a98fe",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "Training: 0it [00:00, ?it/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "`Trainer.fit` stopped: `max_epochs=1` reached.\n"
+ ]
+ }
+ ],
"source": [
"from pyannote.audio.tasks import SpeakerEmbedding\n",
"emb = SpeakerEmbedding(protocol, duration=2., num_workers=4)\n",
@@ -169,7 +507,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.8.5"
+ "version": "3.9.13"
}
},
"nbformat": 4,
diff --git a/notebook/inference.ipynb b/notebook/inference.ipynb
index 77e02a27c..b33e64282 100644
--- a/notebook/inference.ipynb
+++ b/notebook/inference.ipynb
@@ -104,19 +104,6 @@
"scores = inference.crop(dev_file, Segment(10, 15))"
]
},
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "# inference with progress bar\n",
- "inference = Inference(model, step=0.1, batch_size=32, progress_hook='Processing...')\n",
- "scores = inference(dev_file)\n",
- "inference = Inference(model, step=0.1, batch_size=1, progress_hook=True)\n",
- "scores = inference.crop(dev_file, Segment(10, 15))"
- ]
- },
{
"cell_type": "markdown",
"metadata": {},
diff --git a/pyannote/audio/cli/evaluate.py b/pyannote/audio/cli/evaluate.py
index 57f5c0149..a5ab682c5 100644
--- a/pyannote/audio/cli/evaluate.py
+++ b/pyannote/audio/cli/evaluate.py
@@ -53,14 +53,17 @@ def evaluate(cfg: DictConfig) -> Optional[float]:
main_task = progress.add_task(protocol.name, total=len(files))
file_task = progress.add_task("Processing", total=1.0)
- def progress_hook(completed: int, total: int):
+ def progress_hook(completed: int = None, total: int = None):
progress.update(file_task, completed=completed / total)
- inference = Inference(model, device=device, progress_hook=progress_hook)
+ inference = Inference(model, device=device)
warm_up = cfg.warm_up / inference.duration
def hypothesis(file: ProtocolFile):
- return Inference.trim(binarize(inference(file)), warm_up=(warm_up, warm_up))
+ return Inference.trim(
+ binarize(inference(file, hook=progress_hook)),
+ warm_up=(warm_up, warm_up),
+ )
metric = DiscreteDiarizationErrorRate()
diff --git a/pyannote/audio/cli/pretrained.py b/pyannote/audio/cli/pretrained.py
index 95a439b3f..8b8aae587 100644
--- a/pyannote/audio/cli/pretrained.py
+++ b/pyannote/audio/cli/pretrained.py
@@ -26,6 +26,4 @@
def pretrained(checkpoint: Text):
- return Model.from_pretrained(
- checkpoint, map_location=lambda storage, loc: storage
- )
+ return Model.from_pretrained(checkpoint, map_location=lambda storage, loc: storage)
diff --git a/pyannote/audio/cli/train.py b/pyannote/audio/cli/train.py
index 6e04fcde5..9ab8b1658 100644
--- a/pyannote/audio/cli/train.py
+++ b/pyannote/audio/cli/train.py
@@ -26,10 +26,11 @@
import hydra
from hydra.utils import instantiate
+from lightning.pytorch import seed_everything
from omegaconf import DictConfig, OmegaConf
# from pyannote.audio.core.callback import GraduallyUnfreeze
-from pyannote.database import FileFinder, get_protocol
+from pyannote.database import FileFinder, registry
from pytorch_lightning.callbacks import (
EarlyStopping,
LearningRateMonitor,
@@ -37,7 +38,6 @@
RichProgressBar,
)
from pytorch_lightning.loggers import TensorBoardLogger
-from pytorch_lightning.utilities.seed import seed_everything
from torch_audiomentations.utils.config import from_dict as get_augmentation
from pyannote.audio.core.io import get_torchaudio_info
@@ -45,18 +45,21 @@
@hydra.main(config_path="train_config", config_name="config")
def train(cfg: DictConfig) -> Optional[float]:
-
# make sure to set the random seed before the instantiation of Trainer
# so that each model initializes with the same weights when using DDP.
seed = int(os.environ.get("PL_GLOBAL_SEED", "0"))
seed_everything(seed=seed)
+ # load databases into registry
+ for database_yml in cfg.registry.split(","):
+ registry.load_database(database_yml)
+
# instantiate training protocol with optional preprocessors
preprocessors = {"audio": FileFinder(), "torchaudio.info": get_torchaudio_info}
if "preprocessor" in cfg:
preprocessor = instantiate(cfg.preprocessor)
preprocessors[preprocessor.preprocessed_key] = preprocessor
- protocol = get_protocol(cfg.protocol, preprocessors=preprocessors)
+ protocol = registry.get_protocol(cfg.protocol, preprocessors=preprocessors)
# instantiate data augmentation
augmentation = (
@@ -96,7 +99,11 @@ def configure_optimizers(self):
model.configure_optimizers = MethodType(configure_optimizers, model)
- callbacks = [RichProgressBar(), LearningRateMonitor(logging_interval="step")]
+ # avoid creating big log files
+ callbacks = [
+ RichProgressBar(refresh_rate=20, leave=True),
+ LearningRateMonitor(),
+ ]
if fine_tuning:
# TODO: configure layer freezing
@@ -108,7 +115,7 @@ def configure_optimizers(self):
checkpoint = ModelCheckpoint(
monitor=monitor,
mode=direction,
- save_top_k=None if monitor is None else 5,
+ save_top_k=None if monitor is None else 1,
every_n_epochs=1,
save_last=True,
save_weights_only=False,
@@ -126,6 +133,7 @@ def configure_optimizers(self):
patience=100,
strict=True,
verbose=False,
+ check_finite=True,
)
callbacks.append(early_stopping)
diff --git a/pyannote/audio/cli/train_config/config.yaml b/pyannote/audio/cli/train_config/config.yaml
index f939f39e1..d5b761cc9 100644
--- a/pyannote/audio/cli/train_config/config.yaml
+++ b/pyannote/audio/cli/train_config/config.yaml
@@ -1,7 +1,8 @@
+registry: ???
protocol: ???
defaults:
- - task: SpeakerSegmentation
+ - task: SpeakerDiarization
- model: PyanNet
- optimizer: Adam
- scheduler: CosineAnnealingWarmRestarts
diff --git a/pyannote/audio/cli/train_config/model/SSeRiouSS.yaml b/pyannote/audio/cli/train_config/model/SSeRiouSS.yaml
new file mode 100644
index 000000000..73f7f963a
--- /dev/null
+++ b/pyannote/audio/cli/train_config/model/SSeRiouSS.yaml
@@ -0,0 +1,13 @@
+# @package _group_
+_target_: pyannote.audio.models.segmentation.SSeRiouSS
+wav2vec: WAVLM_BASE
+wav2vec_layer: -1
+lstm:
+ hidden_size: 128
+ num_layers: 4
+ bidirectional: true
+ monolithic: true
+ dropout: 0.5
+linear:
+ hidden_size: 128
+ num_layers: 2
diff --git a/pyannote/audio/cli/train_config/optimizer/AdamW.yaml b/pyannote/audio/cli/train_config/optimizer/AdamW.yaml
new file mode 100644
index 000000000..f917fb4ed
--- /dev/null
+++ b/pyannote/audio/cli/train_config/optimizer/AdamW.yaml
@@ -0,0 +1,7 @@
+# @package _group_
+_target_: torch.optim.AdamW
+lr: 1e-3
+betas: [0.9, 0.999]
+eps: 1e-08
+weight_decay: 0.01
+amsgrad: False
diff --git a/pyannote/audio/cli/train_config/task/SpeakerSegmentation.yaml b/pyannote/audio/cli/train_config/task/MultiLabelSegmentation.yaml
similarity index 56%
rename from pyannote/audio/cli/train_config/task/SpeakerSegmentation.yaml
rename to pyannote/audio/cli/train_config/task/MultiLabelSegmentation.yaml
index b7b6bdc02..aceb8cb22 100644
--- a/pyannote/audio/cli/train_config/task/SpeakerSegmentation.yaml
+++ b/pyannote/audio/cli/train_config/task/MultiLabelSegmentation.yaml
@@ -1,11 +1,9 @@
# @package _group_
-_target_: pyannote.audio.tasks.Segmentation
-duration: 5.0
+_target_: pyannote.audio.tasks.MultiLabelSegmentation
+duration: 3.0
warm_up: 0.0
balance: null
weight: null
batch_size: 32
num_workers: null
pin_memory: False
-loss: "bce"
-vad_loss: "bce"
diff --git a/pyannote/audio/cli/train_config/task/SpeakerDiarization.yaml b/pyannote/audio/cli/train_config/task/SpeakerDiarization.yaml
new file mode 100644
index 000000000..d9ec04a57
--- /dev/null
+++ b/pyannote/audio/cli/train_config/task/SpeakerDiarization.yaml
@@ -0,0 +1,8 @@
+# @package _group_
+_target_: pyannote.audio.tasks.SpeakerDiarization
+duration: 5.0
+max_speakers_per_chunk: 3
+max_speakers_per_frame: 2
+batch_size: 32
+num_workers: 10
+pin_memory: False
diff --git a/pyannote/audio/cli/train_config/trainer/default.yaml b/pyannote/audio/cli/train_config/trainer/default.yaml
index eeb5b85b9..ac3a60ff4 100644
--- a/pyannote/audio/cli/train_config/trainer/default.yaml
+++ b/pyannote/audio/cli/train_config/trainer/default.yaml
@@ -2,46 +2,34 @@
_target_: pytorch_lightning.Trainer
accelerator: auto
accumulate_grad_batches: 1
-amp_backend: native
-auto_lr_find: False
-auto_scale_batch_size: False
-auto_select_gpus: True
-benchmark: False
-check_val_every_n_epoch: 1
-detect_anomaly: False
+benchmark: null # TODO: automatically set to True when using fixed duration chunks
deterministic: False
+check_val_every_n_epoch: 1
devices: auto
+detect_anomaly: False
enable_checkpointing: True
enable_model_summary: True
enable_progress_bar: True
fast_dev_run: False
-gpus: null
-gradient_clip_val: 0
+gradient_clip_val: null
gradient_clip_algorithm: norm
-ipus: null
limit_predict_batches: 1.0
limit_test_batches: 1.0
limit_train_batches: 1.0
limit_val_batches: 1.0
log_every_n_steps: 50
max_epochs: 1000
-max_steps: null
+max_steps: -1
max_time: null
min_epochs: 1
min_steps: null
-move_metrics_to_cpu: False
-multiple_trainloader_mode: max_size_cycle
num_nodes: 1
-num_processes: 1
num_sanity_val_steps: 2
overfit_batches: 0.0
precision: 32
profiler: null
reload_dataloaders_every_n_epochs: 0
-replace_sampler_ddp: True
+use_distributed_sampler: True # TODO: check what this does exactly
strategy: null
sync_batchnorm: False
-tpu_cores: null
-track_grad_norm: -1
val_check_interval: 1.0
-weights_save_path: null
diff --git a/pyannote/audio/core/inference.py b/pyannote/audio/core/inference.py
index b664174b5..dcf21868d 100644
--- a/pyannote/audio/core/inference.py
+++ b/pyannote/audio/core/inference.py
@@ -1,6 +1,6 @@
# MIT License
#
-# Copyright (c) 2020-2021 CNRS
+# Copyright (c) 2020- CNRS
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
@@ -23,24 +23,30 @@
import math
import warnings
from pathlib import Path
-from typing import Any, Callable, List, Optional, Text, Tuple, Union
+from typing import Callable, List, Optional, Text, Tuple, Union
import numpy as np
import torch
+import torch.nn as nn
+import torch.nn.functional as F
from einops import rearrange
from pyannote.core import Segment, SlidingWindow, SlidingWindowFeature
from pytorch_lightning.utilities.memory import is_oom_error
from pyannote.audio.core.io import AudioFile
-from pyannote.audio.core.model import Model
+from pyannote.audio.core.model import Model, Specifications
from pyannote.audio.core.task import Resolution
+from pyannote.audio.utils.multi_task import map_with_specifications
from pyannote.audio.utils.permutation import mae_cost_func, permutate
-from pyannote.audio.utils.progress import InferenceProgressHook
+from pyannote.audio.utils.powerset import Powerset
+from pyannote.audio.utils.reproducibility import fix_reproducibility
-TaskName = Union[Text, None]
+class BaseInference:
+ pass
-class Inference:
+
+class Inference(BaseInference):
"""Inference
Parameters
@@ -50,29 +56,26 @@ class Inference:
window : {"sliding", "whole"}, optional
Use a "sliding" window and aggregate the corresponding outputs (default)
or just one (potentially long) window covering the "whole" file or chunk.
- skip_aggregation : bool, optional
- Do not aggregate outputs when using "sliding" window. Defaults to False.
duration : float, optional
Chunk duration, in seconds. Defaults to duration used for training the model.
Has no effect when `window` is "whole".
step : float, optional
Step between consecutive chunks, in seconds. Defaults to warm-up duration when
greater than 0s, otherwise 10% of duration. Has no effect when `window` is "whole".
- batch_size : int, optional
- Batch size. Larger values make inference faster. Defaults to 32.
- device : torch.device, optional
- Device used for inference. Defaults to `model.device`.
- In case `device` and `model.device` are different, model is sent to device.
pre_aggregation_hook : callable, optional
When a callable is provided, it is applied to the model output, just before aggregation.
Takes a (num_chunks, num_frames, dimension) numpy array as input and returns a modified
(num_chunks, num_frames, other_dimension) numpy array passed to overlap-add aggregation.
- progress_hook : {callable, True, str}, optional
- When a callable is provided, it is called everytime a batch is processed
- with two integer arguments:
- - the number of chunks that have been processed so far
- - the total number of chunks
- Set to True (or a descriptive string) to display a tqdm progress bar.
+ skip_aggregation : bool, optional
+ Do not aggregate outputs when using "sliding" window. Defaults to False.
+ skip_conversion: bool, optional
+ In case a task has been trained with `powerset` mode, output is automatically
+ converted to `multi-label`, unless `skip_conversion` is set to True.
+ batch_size : int, optional
+ Batch size. Larger values (should) make inference faster. Defaults to 32.
+ device : torch.device, optional
+ Device used for inference. Defaults to `model.device`.
+ In case `device` and `model.device` are different, model is sent to device.
use_auth_token : str, optional
When loading a private huggingface.co model, set `use_auth_token`
to True or to a string containing your hugginface.co authentication
@@ -83,71 +86,92 @@ def __init__(
self,
model: Union[Model, Text, Path],
window: Text = "sliding",
- skip_aggregation: bool = False,
- device: torch.device = None,
duration: float = None,
step: float = None,
- batch_size: int = 32,
pre_aggregation_hook: Callable[[np.ndarray], np.ndarray] = None,
- progress_hook: Union[bool, Text, Callable[[int, int], Any]] = False,
+ skip_aggregation: bool = False,
+ skip_conversion: bool = False,
+ device: torch.device = None,
+ batch_size: int = 32,
use_auth_token: Union[Text, None] = None,
):
+ # ~~~~ model ~~~~~
self.model = (
model
if isinstance(model, Model)
else Model.from_pretrained(
- Path(model),
+ model,
map_location=device,
strict=False,
use_auth_token=use_auth_token,
)
)
- if window not in ["sliding", "whole"]:
- raise ValueError('`window` must be "sliding" or "whole".')
-
- specifications = self.model.specifications
- if specifications.resolution == Resolution.FRAME and window == "whole":
- warnings.warn(
- 'Using "whole" `window` inference with a frame-based model might lead to bad results '
- 'and huge memory consumption: it is recommended to set `window` to "sliding".'
- )
-
- self.window = window
- self.skip_aggregation = skip_aggregation
-
if device is None:
device = self.model.device
self.device = device
- self.pre_aggregation_hook = pre_aggregation_hook
-
self.model.eval()
self.model.to(self.device)
- # chunk duration used during training
specifications = self.model.specifications
- training_duration = specifications.duration
- if duration is None:
- duration = training_duration
- elif training_duration != duration:
+ # ~~~~ sliding window ~~~~~
+
+ if window not in ["sliding", "whole"]:
+ raise ValueError('`window` must be "sliding" or "whole".')
+
+ if window == "whole" and any(
+ s.resolution == Resolution.FRAME for s in specifications
+ ):
+ warnings.warn(
+ 'Using "whole" `window` inference with a frame-based model might lead to bad results '
+ 'and huge memory consumption: it is recommended to set `window` to "sliding".'
+ )
+ self.window = window
+
+ training_duration = next(iter(specifications)).duration
+ duration = duration or training_duration
+ if training_duration != duration:
warnings.warn(
f"Model was trained with {training_duration:g}s chunks, and you requested "
f"{duration:g}s chunks for inference: this might lead to suboptimal results."
)
self.duration = duration
- self.warm_up = specifications.warm_up
+ # ~~~~ powerset to multilabel conversion ~~~~
+
+ self.skip_conversion = skip_conversion
+
+ conversion = list()
+ for s in specifications:
+ if s.powerset and not skip_conversion:
+ c = Powerset(len(s.classes), s.powerset_max_classes)
+ else:
+ c = nn.Identity()
+ conversion.append(c.to(self.device))
+
+ if isinstance(specifications, Specifications):
+ self.conversion = conversion[0]
+ else:
+ self.conversion = nn.ModuleList(conversion)
+
+ # ~~~~ overlap-add aggregation ~~~~~
+
+ self.skip_aggregation = skip_aggregation
+ self.pre_aggregation_hook = pre_aggregation_hook
+
+ self.warm_up = next(iter(specifications)).warm_up
# Use that many seconds on the left- and rightmost parts of each chunk
# to warm up the model. While the model does process those left- and right-most
# parts, only the remaining central part of each chunk is used for aggregating
# scores during inference.
# step between consecutive chunks
- if step is None:
- step = 0.1 * self.duration if self.warm_up[0] == 0.0 else self.warm_up[0]
+ step = step or (
+ 0.1 * self.duration if self.warm_up[0] == 0.0 else self.warm_up[0]
+ )
if step > self.duration:
raise ValueError(
@@ -159,17 +183,20 @@ def __init__(
self.batch_size = batch_size
- if callable(progress_hook):
- pass
- elif isinstance(progress_hook, Text):
- progress_hook = InferenceProgressHook(desc=progress_hook)
- elif progress_hook:
- progress_hook = InferenceProgressHook()
- else:
- progress_hook = None
- self.progress_hook = progress_hook
+ def to(self, device: torch.device) -> "Inference":
+ """Send internal model to `device`"""
+
+ if not isinstance(device, torch.device):
+ raise TypeError(
+ f"`device` must be an instance of `torch.device`, got `{type(device).__name__}`"
+ )
- def infer(self, chunks: torch.Tensor) -> np.ndarray:
+ self.model.to(device)
+ self.conversion.to(device)
+ self.device = device
+ return self
+
+ def infer(self, chunks: torch.Tensor) -> Union[np.ndarray, Tuple[np.ndarray]]:
"""Forward pass
Takes care of sending chunks to right device and outputs back to CPU
@@ -181,11 +208,11 @@ def infer(self, chunks: torch.Tensor) -> np.ndarray:
Returns
-------
- outputs : (batch_size, ...) np.ndarray
+ outputs : (tuple of) (batch_size, ...) np.ndarray
Model output.
"""
- with torch.no_grad():
+ with torch.inference_mode():
try:
outputs = self.model(chunks.to(self.device))
except RuntimeError as exception:
@@ -197,9 +224,19 @@ def infer(self, chunks: torch.Tensor) -> np.ndarray:
else:
raise exception
- return outputs.cpu().numpy()
+ def __convert(output: torch.Tensor, conversion: nn.Module, **kwargs):
+ return conversion(output).cpu().numpy()
+
+ return map_with_specifications(
+ self.model.specifications, __convert, outputs, self.conversion
+ )
- def slide(self, waveform: torch.Tensor, sample_rate: int) -> SlidingWindowFeature:
+ def slide(
+ self,
+ waveform: torch.Tensor,
+ sample_rate: int,
+ hook: Optional[Callable],
+ ) -> Union[SlidingWindowFeature, Tuple[SlidingWindowFeature]]:
"""Slide model on a waveform
Parameters
@@ -208,26 +245,35 @@ def slide(self, waveform: torch.Tensor, sample_rate: int) -> SlidingWindowFeatur
Waveform.
sample_rate : int
Sample rate.
+ hook: Optional[Callable]
+ When a callable is provided, it is called everytime a batch is
+ processed with two keyword arguments:
+ - `completed`: the number of chunks that have been processed so far
+ - `total`: the total number of chunks
Returns
-------
- output : SlidingWindowFeature
+ output : (tuple of) SlidingWindowFeature
Model output. Shape is (num_chunks, dimension) for chunk-level tasks,
and (num_frames, dimension) for frame-level tasks.
"""
- window_size: int = round(self.duration * sample_rate)
+ window_size: int = self.model.audio.get_num_samples(self.duration)
step_size: int = round(self.step * sample_rate)
- num_channels, num_samples = waveform.shape
-
- specifications = self.model.specifications
- resolution = specifications.resolution
- introspection = self.model.introspection
- if resolution == Resolution.CHUNK:
- frames = SlidingWindow(start=0.0, duration=self.duration, step=self.step)
- elif resolution == Resolution.FRAME:
- frames = introspection.frames
- num_frames_per_chunk, dimension = introspection(window_size)
+ _, num_samples = waveform.shape
+
+ def __frames(
+ example_output, specifications: Optional[Specifications] = None
+ ) -> SlidingWindow:
+ if specifications.resolution == Resolution.CHUNK:
+ return SlidingWindow(start=0.0, duration=self.duration, step=self.step)
+ return example_output.frames
+
+ frames: Union[SlidingWindow, Tuple[SlidingWindow]] = map_with_specifications(
+ self.model.specifications,
+ __frames,
+ self.model.example_output,
+ )
# prepare complete chunks
if num_samples >= window_size:
@@ -244,100 +290,159 @@ def slide(self, waveform: torch.Tensor, sample_rate: int) -> SlidingWindowFeatur
num_samples - window_size
) % step_size > 0
if has_last_chunk:
+ # pad last chunk with zeros
last_chunk: torch.Tensor = waveform[:, num_chunks * step_size :]
+ _, last_window_size = last_chunk.shape
+ last_pad = window_size - last_window_size
+ last_chunk = F.pad(last_chunk, (0, last_pad))
- outputs: Union[List[np.ndarray], np.ndarray] = list()
+ def __empty_list(**kwargs):
+ return list()
- if self.progress_hook is not None:
- self.progress_hook(0, num_chunks + has_last_chunk)
+ outputs: Union[
+ List[np.ndarray], Tuple[List[np.ndarray]]
+ ] = map_with_specifications(self.model.specifications, __empty_list)
+
+ if hook is not None:
+ hook(completed=0, total=num_chunks + has_last_chunk)
+
+ def __append_batch(output, batch_output, **kwargs) -> None:
+ output.append(batch_output)
+ return
# slide over audio chunks in batch
for c in np.arange(0, num_chunks, self.batch_size):
batch: torch.Tensor = chunks[c : c + self.batch_size]
- outputs.append(self.infer(batch))
- if self.progress_hook is not None:
- self.progress_hook(c + self.batch_size, num_chunks + has_last_chunk)
+
+ batch_outputs: Union[np.ndarray, Tuple[np.ndarray]] = self.infer(batch)
+
+ _ = map_with_specifications(
+ self.model.specifications, __append_batch, outputs, batch_outputs
+ )
+
+ if hook is not None:
+ hook(completed=c + self.batch_size, total=num_chunks + has_last_chunk)
# process orphan last chunk
if has_last_chunk:
+ last_outputs = self.infer(last_chunk[None])
+
+ _ = map_with_specifications(
+ self.model.specifications, __append_batch, outputs, last_outputs
+ )
+
+ if hook is not None:
+ hook(
+ completed=num_chunks + has_last_chunk,
+ total=num_chunks + has_last_chunk,
+ )
- last_output = self.infer(last_chunk[None])
+ def __vstack(output: List[np.ndarray], **kwargs) -> np.ndarray:
+ return np.vstack(output)
- if specifications.resolution == Resolution.FRAME:
- pad = num_frames_per_chunk - last_output.shape[1]
- last_output = np.pad(last_output, ((0, 0), (0, pad), (0, 0)))
+ outputs: Union[np.ndarray, Tuple[np.ndarray]] = map_with_specifications(
+ self.model.specifications, __vstack, outputs
+ )
- outputs.append(last_output)
- if self.progress_hook is not None:
- self.progress_hook(
- num_chunks + has_last_chunk, num_chunks + has_last_chunk
+ def __aggregate(
+ outputs: np.ndarray,
+ frames: SlidingWindow,
+ specifications: Optional[Specifications] = None,
+ ) -> SlidingWindowFeature:
+ # skip aggregation when requested,
+ # or when model outputs just one vector per chunk
+ # or when model is permutation-invariant (and not post-processed)
+ if (
+ self.skip_aggregation
+ or specifications.resolution == Resolution.CHUNK
+ or (
+ specifications.permutation_invariant
+ and self.pre_aggregation_hook is None
+ )
+ ):
+ frames = SlidingWindow(
+ start=0.0, duration=self.duration, step=self.step
)
+ return SlidingWindowFeature(outputs, frames)
+
+ if self.pre_aggregation_hook is not None:
+ outputs = self.pre_aggregation_hook(outputs)
- outputs = np.vstack(outputs)
-
- # skip aggregation when requested,
- # or when model outputs just one vector per chunk
- # or when model is permutation-invariant (and not post-processed)
- if (
- self.skip_aggregation
- or specifications.resolution == Resolution.CHUNK
- or (
- specifications.permutation_invariant
- and self.pre_aggregation_hook is None
+ aggregated = self.aggregate(
+ SlidingWindowFeature(
+ outputs,
+ SlidingWindow(start=0.0, duration=self.duration, step=self.step),
+ ),
+ frames=frames,
+ warm_up=self.warm_up,
+ hamming=True,
+ missing=0.0,
)
- ):
- frames = SlidingWindow(start=0.0, duration=self.duration, step=self.step)
- return SlidingWindowFeature(outputs, frames)
-
- if self.pre_aggregation_hook is not None:
- outputs = self.pre_aggregation_hook(outputs)
-
- aggregated = self.aggregate(
- SlidingWindowFeature(
- outputs,
- SlidingWindow(start=0.0, duration=self.duration, step=self.step),
- ),
- frames=frames,
- warm_up=self.warm_up,
- hamming=True,
- missing=0.0,
- )
- if has_last_chunk:
- num_frames = aggregated.data.shape[0]
- aggregated.data = aggregated.data[: num_frames - pad, :]
+ # remove padding that was added to last chunk
+ if has_last_chunk:
+ aggregated.data = aggregated.crop(
+ Segment(0.0, num_samples / sample_rate), mode="loose"
+ )
- return aggregated
+ return aggregated
- def __call__(self, file: AudioFile) -> Union[SlidingWindowFeature, np.ndarray]:
+ return map_with_specifications(
+ self.model.specifications, __aggregate, outputs, frames
+ )
+
+ def __call__(
+ self, file: AudioFile, hook: Optional[Callable] = None
+ ) -> Union[
+ Tuple[Union[SlidingWindowFeature, np.ndarray]],
+ Union[SlidingWindowFeature, np.ndarray],
+ ]:
"""Run inference on a whole file
Parameters
----------
file : AudioFile
Audio file.
+ hook : callable, optional
+ When a callable is provided, it is called everytime a batch is processed
+ with two keyword arguments:
+ - `completed`: the number of chunks that have been processed so far
+ - `total`: the total number of chunks
Returns
-------
- output : SlidingWindowFeature or np.ndarray
+ output : (tuple of) SlidingWindowFeature or np.ndarray
Model output, as `SlidingWindowFeature` if `window` is set to "sliding"
and `np.ndarray` if is set to "whole".
"""
+ fix_reproducibility(self.device)
+
waveform, sample_rate = self.model.audio(file)
if self.window == "sliding":
- return self.slide(waveform, sample_rate)
+ return self.slide(waveform, sample_rate, hook=hook)
+
+ outputs: Union[np.ndarray, Tuple[np.ndarray]] = self.infer(waveform[None])
- return self.infer(waveform[None])[0]
+ def __first_sample(outputs: np.ndarray, **kwargs) -> np.ndarray:
+ return outputs[0]
+
+ return map_with_specifications(
+ self.model.specifications, __first_sample, outputs
+ )
def crop(
self,
file: AudioFile,
chunk: Union[Segment, List[Segment]],
duration: Optional[float] = None,
- ) -> Union[SlidingWindowFeature, np.ndarray]:
+ hook: Optional[Callable] = None,
+ ) -> Union[
+ Tuple[Union[SlidingWindowFeature, np.ndarray]],
+ Union[SlidingWindowFeature, np.ndarray],
+ ]:
"""Run inference on a chunk or a list of chunks
Parameters
@@ -354,10 +459,15 @@ def crop(
Enforce chunk duration (in seconds). This is a hack to avoid rounding
errors that may result in a different number of audio samples for two
chunks of the same duration.
+ hook : callable, optional
+ When a callable is provided, it is called everytime a batch is processed
+ with two keyword arguments:
+ - `completed`: the number of chunks that have been processed so far
+ - `total`: the total number of chunks
Returns
-------
- output : SlidingWindowFeature or np.ndarray
+ output : (tuple of) SlidingWindowFeature or np.ndarray
Model output, as `SlidingWindowFeature` if `window` is set to "sliding"
and `np.ndarray` if is set to "whole".
@@ -371,8 +481,9 @@ def crop(
>>> inference.crop(file, extended_chunk).crop(chunk_of_interest, returns_data=False)
"""
- if self.window == "sliding":
+ fix_reproducibility(self.device)
+ if self.window == "sliding":
if not isinstance(chunk, Segment):
start = min(c.start for c in chunk)
end = max(c.end for c in chunk)
@@ -381,32 +492,37 @@ def crop(
waveform, sample_rate = self.model.audio.crop(
file, chunk, duration=duration
)
- output = self.slide(waveform, sample_rate)
-
- frames = output.sliding_window
- shifted_frames = SlidingWindow(
- start=chunk.start, duration=frames.duration, step=frames.step
- )
- return SlidingWindowFeature(output.data, shifted_frames)
-
- elif self.window == "whole":
-
- if isinstance(chunk, Segment):
- waveform, sample_rate = self.model.audio.crop(
- file, chunk, duration=duration
- )
- else:
- waveform = torch.cat(
- [self.model.audio.crop(file, c)[0] for c in chunk], dim=1
+ outputs: Union[
+ SlidingWindowFeature, Tuple[SlidingWindowFeature]
+ ] = self.slide(waveform, sample_rate, hook=hook)
+
+ def __shift(output: SlidingWindowFeature, **kwargs) -> SlidingWindowFeature:
+ frames = output.sliding_window
+ shifted_frames = SlidingWindow(
+ start=chunk.start, duration=frames.duration, step=frames.step
)
+ return SlidingWindowFeature(output.data, shifted_frames)
- return self.infer(waveform[None])[0]
+ return map_with_specifications(self.model.specifications, __shift, outputs)
+ if isinstance(chunk, Segment):
+ waveform, sample_rate = self.model.audio.crop(
+ file, chunk, duration=duration
+ )
else:
- raise NotImplementedError(
- f"Unsupported window type '{self.window}': should be 'sliding' or 'whole'."
+ waveform = torch.cat(
+ [self.model.audio.crop(file, c)[0] for c in chunk], dim=1
)
+ outputs: Union[np.ndarray, Tuple[np.ndarray]] = self.infer(waveform[None])
+
+ def __first_sample(outputs: np.ndarray, **kwargs) -> np.ndarray:
+ return outputs[0]
+
+ return map_with_specifications(
+ self.model.specifications, __first_sample, outputs
+ )
+
@staticmethod
def aggregate(
scores: SlidingWindowFeature,
@@ -648,7 +764,6 @@ def always_match(this: np.ndarray, that: np.ndarray, cost: float):
stitches = []
for C, (chunk, activation) in enumerate(activations):
-
local_stitch = np.NAN * np.zeros(
(sum(lookahead) + 1, num_frames, num_classes)
)
@@ -656,7 +771,6 @@ def always_match(this: np.ndarray, that: np.ndarray, cost: float):
for c in range(
max(0, C - lookahead[0]), min(num_chunks, C + lookahead[1] + 1)
):
-
# extract common temporal support
shift = round((C - c) * num_frames * chunks.step / chunks.duration)
@@ -677,7 +791,6 @@ def always_match(this: np.ndarray, that: np.ndarray, cost: float):
)
for this, that in enumerate(permutation):
-
# only stitch under certain condiditions
matching = (c == C) or (
match_func(
diff --git a/pyannote/audio/core/io.py b/pyannote/audio/core/io.py
index 49175f531..0a44e75ea 100644
--- a/pyannote/audio/core/io.py
+++ b/pyannote/audio/core/io.py
@@ -28,6 +28,7 @@
"""
import math
+import random
import warnings
from io import IOBase
from pathlib import Path
@@ -79,12 +80,14 @@ class Audio:
----------
sample_rate: int, optional
Target sampling rate. Defaults to using native sampling rate.
- mono : int, optional
- Convert multi-channel to mono. Defaults to True.
+ mono : {'random', 'downmix'}, optional
+ In case of multi-channel audio, convert to single-channel audio
+ using one of the following strategies: select one channel at
+ 'random' or 'downmix' by averaging all channels.
Usage
-----
- >>> audio = Audio(sample_rate=16000, mono=True)
+ >>> audio = Audio(sample_rate=16000, mono='downmix')
>>> waveform, sample_rate = audio({"audio": "/path/to/audio.wav"})
>>> assert sample_rate == 16000
>>> sample_rate = 44100
@@ -147,7 +150,6 @@ def validate_file(file: AudioFile) -> Mapping:
raise ValueError(AudioFileDocString)
if "waveform" in file:
-
waveform: Union[np.ndarray, Tensor] = file["waveform"]
if len(waveform.shape) != 2 or waveform.shape[0] > waveform.shape[1]:
raise ValueError(
@@ -163,7 +165,6 @@ def validate_file(file: AudioFile) -> Mapping:
file.setdefault("uri", "waveform")
elif "audio" in file:
-
if isinstance(file["audio"], IOBase):
return file
@@ -174,15 +175,13 @@ def validate_file(file: AudioFile) -> Mapping:
file.setdefault("uri", path.stem)
else:
-
raise ValueError(
"Neither 'waveform' nor 'audio' is available for this file."
)
return file
- def __init__(self, sample_rate=None, mono=True):
-
+ def __init__(self, sample_rate=None, mono=None):
super().__init__()
self.sample_rate = sample_rate
self.mono = mono
@@ -206,8 +205,13 @@ def downmix_and_resample(self, waveform: Tensor, sample_rate: int) -> Tensor:
"""
# downmix to mono
- if self.mono and waveform.shape[0] > 1:
- waveform = waveform.mean(dim=0, keepdim=True)
+ num_channels = waveform.shape[0]
+ if num_channels > 1:
+ if self.mono == "random":
+ channel = random.randint(0, num_channels - 1)
+ waveform = waveform[channel : channel + 1]
+ elif self.mono == "downmix":
+ waveform = waveform.mean(dim=0, keepdim=True)
# resample
if (self.sample_rate is not None) and (self.sample_rate != sample_rate):
@@ -249,6 +253,18 @@ def get_duration(self, file: AudioFile) -> float:
return frames / sample_rate
+ def get_num_samples(self, duration: float, sample_rate: int = None) -> int:
+ """Deterministic number of samples from duration and sample rate"""
+
+ sample_rate = sample_rate or self.sample_rate
+
+ if sample_rate is None:
+ raise ValueError(
+ "`sample_rate` must be provided to compute number of samples."
+ )
+
+ return math.floor(duration * sample_rate)
+
def __call__(self, file: AudioFile) -> Tuple[Tensor, int]:
"""Obtain waveform
@@ -277,10 +293,14 @@ def __call__(self, file: AudioFile) -> Tuple[Tensor, int]:
elif "audio" in file:
waveform, sample_rate = torchaudio.load(file["audio"])
+ # rewind if needed
+ if isinstance(file["audio"], IOBase):
+ file["audio"].seek(0)
+
channel = file.get("channel", None)
if channel is not None:
- waveform = waveform[channel - 1 : channel]
+ waveform = waveform[channel : channel + 1]
return self.downmix_and_resample(waveform, sample_rate)
@@ -347,7 +367,6 @@ def crop(
num_frames = end_frame - start_frame
if mode == "raise":
-
if num_frames > frames:
raise ValueError(
f"requested fixed duration ({duration:6f}s, or {num_frames:d} frames) is longer "
@@ -384,10 +403,10 @@ def crop(
data, _ = torchaudio.load(
file["audio"], frame_offset=start_frame, num_frames=num_frames
)
+ # rewind if needed
if isinstance(file["audio"], IOBase):
file["audio"].seek(0)
except RuntimeError:
-
if isinstance(file["audio"], IOBase):
msg = "torchaudio failed to seek-and-read in file-like object."
raise RuntimeError(msg)
@@ -408,7 +427,7 @@ def crop(
file["sample_rate"] = sample_rate
if channel is not None:
- data = data[channel - 1 : channel, :]
+ data = data[channel : channel + 1, :]
# pad with zeros
if mode == "pad":
diff --git a/pyannote/audio/core/model.py b/pyannote/audio/core/model.py
index ddf4b2795..bedb7f6c4 100644
--- a/pyannote/audio/core/model.py
+++ b/pyannote/audio/core/model.py
@@ -1,6 +1,6 @@
# MIT License
#
-# Copyright (c) 2020-2021 CNRS
+# Copyright (c) 2020- CNRS
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
@@ -24,6 +24,8 @@
import os
import warnings
+from dataclasses import dataclass
+from functools import cached_property
from importlib import import_module
from pathlib import Path
from typing import Any, Dict, List, Optional, Text, Tuple, Union
@@ -33,16 +35,24 @@
import torch
import torch.nn as nn
import torch.optim
-from huggingface_hub import cached_download, hf_hub_url
+from huggingface_hub import hf_hub_download
+from huggingface_hub.utils import RepositoryNotFoundError
+from lightning_fabric.utilities.cloud_io import _load as pl_load
from pyannote.core import SlidingWindow
-from pytorch_lightning.utilities.cloud_io import load as pl_load
from pytorch_lightning.utilities.model_summary import ModelSummary
-from semver import VersionInfo
from torch.utils.data import DataLoader
from pyannote.audio import __version__
from pyannote.audio.core.io import Audio
-from pyannote.audio.core.task import Problem, Resolution, Specifications, Task
+from pyannote.audio.core.task import (
+ Problem,
+ Resolution,
+ Specifications,
+ Task,
+ UnknownSpecificationsError,
+)
+from pyannote.audio.utils.multi_task import map_with_specifications
+from pyannote.audio.utils.version import check_version
CACHE_DIR = os.getenv(
"PYANNOTE_CACHE",
@@ -52,195 +62,16 @@
HF_LIGHTNING_CONFIG_NAME = "config.yaml"
+# NOTE: needed to backward compatibility to load models trained before pyannote.audio 3.x
class Introspection:
- """Model introspection
-
- Parameters
- ----------
- min_num_samples: int
- Minimum number of input samples
- min_num_frames: int
- Corresponding minimum number of output frames
- inc_num_samples: int
- Number of input samples leading to an increase of number of output frames
- inc_num_frames: int
- Corresponding increase in number of output frames
- dimension: int
- Output dimension
- sample_rate: int
- Expected input sample rate
-
- Usage
- -----
- >>> introspection = Introspection.from_model(model)
- >>> isinstance(introspection.frames, SlidingWindow)
- >>> num_samples = 16000 # 1s at 16kHz
- >>> num_frames, dimension = introspection(num_samples)
- """
-
- def __init__(
- self,
- min_num_samples: int,
- min_num_frames: int,
- inc_num_samples: int,
- inc_num_frames: int,
- dimension: int,
- sample_rate: int,
- ):
- super().__init__()
- self.min_num_samples = min_num_samples
- self.min_num_frames = min_num_frames
- self.inc_num_samples = inc_num_samples
- self.inc_num_frames = inc_num_frames
- self.dimension = dimension
- self.sample_rate = sample_rate
+ pass
- @classmethod
- def from_model(cls, model: "Model", task: str = None) -> Introspection:
-
- specifications = model.specifications
- if task is not None:
- specifications = specifications[task]
-
- example_input_array = model.example_input_array
- batch_size, num_channels, num_samples = example_input_array.shape
- example_input_array = torch.randn(
- (batch_size, num_channels, num_samples),
- dtype=example_input_array.dtype,
- layout=example_input_array.layout,
- device=example_input_array.device,
- requires_grad=False,
- )
- # dichotomic search of "min_num_samples"
- lower, upper, min_num_samples = 1, num_samples, None
- while True:
- num_samples = (lower + upper) // 2
- try:
- with torch.no_grad():
- frames = model(example_input_array[:, :, :num_samples])
- if task is not None:
- frames = frames[task]
- except Exception:
- lower = num_samples
- else:
- min_num_samples = num_samples
- if specifications.resolution == Resolution.FRAME:
- _, min_num_frames, dimension = frames.shape
- elif specifications.resolution == Resolution.CHUNK:
- _, dimension = frames.shape
- else:
- # should never happen
- pass
- upper = num_samples
-
- if lower + 1 == upper:
- break
-
- # if "min_num_samples" is still None at this point, it means that
- # the forward pass always failed and raised an exception. most likely,
- # it means that there is a problem with the model definition.
- # we try again without catching the exception to help the end user debug
- # their model
- if min_num_samples is None:
- frames = model(example_input_array)
-
- # corner case for chunk-level tasks
- if specifications.resolution == Resolution.CHUNK:
- return cls(
- min_num_samples=min_num_samples,
- min_num_frames=1,
- inc_num_samples=0,
- inc_num_frames=0,
- dimension=dimension,
- sample_rate=model.hparams.sample_rate,
- )
-
- # search reasonable upper bound for "inc_num_samples"
- while True:
- num_samples = 2 * min_num_samples
- example_input_array = torch.randn(
- (batch_size, num_channels, num_samples),
- dtype=example_input_array.dtype,
- layout=example_input_array.layout,
- device=example_input_array.device,
- requires_grad=False,
- )
- with torch.no_grad():
- frames = model(example_input_array)
- if task is not None:
- frames = frames[task]
- num_frames = frames.shape[1]
- if num_frames > min_num_frames:
- break
-
- # dichotomic search of "inc_num_samples"
- lower, upper = min_num_samples, num_samples
- while True:
- num_samples = (lower + upper) // 2
- example_input_array = torch.randn(
- (batch_size, num_channels, num_samples),
- dtype=example_input_array.dtype,
- layout=example_input_array.layout,
- device=example_input_array.device,
- requires_grad=False,
- )
- with torch.no_grad():
- frames = model(example_input_array)
- if task is not None:
- frames = frames[task]
- num_frames = frames.shape[1]
- if num_frames > min_num_frames:
- inc_num_frames = num_frames - min_num_frames
- inc_num_samples = num_samples - min_num_samples
- upper = num_samples
- else:
- lower = num_samples
-
- if lower + 1 == upper:
- break
-
- return cls(
- min_num_samples=min_num_samples,
- min_num_frames=min_num_frames,
- inc_num_samples=inc_num_samples,
- inc_num_frames=inc_num_frames,
- dimension=dimension,
- sample_rate=model.hparams.sample_rate,
- )
-
- def __call__(self, num_samples: int) -> Tuple[int, int]:
- """Predict output shape, given number of input samples
-
- Parameters
- ----------
- num_samples : int
- Number of input samples.
-
- Returns
- -------
- num_frames : int
- Number of output frames
- dimension : int
- Dimension of output frames
- """
-
- if num_samples < self.min_num_samples:
- return 0, self.dimension
-
- return (
- self.min_num_frames
- + self.inc_num_frames
- * ((num_samples - self.min_num_samples + 1) // self.inc_num_samples),
- self.dimension,
- )
-
- @property
- def frames(self) -> SlidingWindow:
- # HACK to support model trained before 'sample_rate' was an Introspection attribute
- sample_rate = getattr(self, "sample_rate", 16000)
- step = (self.inc_num_samples / self.inc_num_frames) / sample_rate
- return SlidingWindow(start=0.0, step=step, duration=step)
+@dataclass
+class Output:
+ num_frames: int
+ dimension: int
+ frames: SlidingWindow
class Model(pl.LightningModule):
@@ -271,42 +102,69 @@ def __init__(
self.save_hyperparameters("sample_rate", "num_channels")
self.task = task
- self.audio = Audio(
- sample_rate=self.hparams.sample_rate, mono=self.hparams.num_channels == 1
- )
-
- @property
- def example_input_array(self) -> torch.Tensor:
- batch_size = 3 if self.task is None else self.task.batch_size
- duration = 2.0 if self.task is None else self.task.duration
-
- return torch.randn(
- (
- batch_size,
- self.hparams.num_channels,
- int(self.hparams.sample_rate * duration),
- ),
- device=self.device,
- )
+ self.audio = Audio(sample_rate=self.hparams.sample_rate, mono="downmix")
@property
- def task(self):
+ def task(self) -> Task:
return self._task
@task.setter
- def task(self, task):
- self._task = task
- del self.introspection
+ def task(self, task: Task):
+ # reset (cached) properties when task changes
del self.specifications
+ try:
+ del self.example_output
+ except AttributeError:
+ pass
+ self._task = task
+
+ def build(self):
+ # use this method to add task-dependent layers to the model
+ # (e.g. the final classification and activation layers)
+ pass
@property
- def specifications(self):
- if self.task is not None:
- return self.task.specifications
- return self._specifications
+ def specifications(self) -> Union[Specifications, Tuple[Specifications]]:
+ if self.task is None:
+ try:
+ specifications = self._specifications
+
+ except AttributeError as e:
+ raise UnknownSpecificationsError(
+ "Model specifications are not available because it has not been assigned a task yet. "
+ "Use `model.task = ...` to assign a task to the model."
+ ) from e
+
+ else:
+ try:
+ specifications = self.task.specifications
+
+ except AttributeError as e:
+ raise UnknownSpecificationsError(
+ "Task specifications are not available. This is most likely because they depend on "
+ "the content of the training subset. Use `model.task.setup()` to go over the training "
+ "subset and fix this, or let lightning trainer do that for you in `trainer.fit(model)`."
+ ) from e
+
+ return specifications
@specifications.setter
- def specifications(self, specifications):
+ def specifications(
+ self, specifications: Union[Specifications, Tuple[Specifications]]
+ ):
+ if not isinstance(specifications, (Specifications, tuple)):
+ raise ValueError(
+ "Only regular specifications or tuple of specifications are supported."
+ )
+
+ durations = set(s.duration for s in specifications)
+ if len(durations) > 1:
+ raise ValueError("All tasks must share the same (maximum) duration.")
+
+ min_durations = set(s.min_duration for s in specifications)
+ if len(min_durations) > 1:
+ raise ValueError("All tasks must share the same minimum duration.")
+
self._specifications = specifications
@specifications.deleter
@@ -314,39 +172,54 @@ def specifications(self):
if hasattr(self, "_specifications"):
del self._specifications
- def build(self):
- # use this method to add task-dependent layers to the model
- # (e.g. the final classification and activation layers)
- pass
+ def __example_input_array(self, duration: Optional[float] = None) -> torch.Tensor:
+ duration = duration or next(iter(self.specifications)).duration
+ return torch.randn(
+ (
+ 1,
+ self.hparams.num_channels,
+ self.audio.get_num_samples(duration),
+ ),
+ device=self.device,
+ )
@property
- def introspection(self) -> Introspection:
- """Introspection
-
- Returns
- -------
- introspection: Introspection
- Model introspection
- """
-
- if not hasattr(self, "_introspection"):
- self._introspection = Introspection.from_model(self)
-
- return self._introspection
+ def example_input_array(self) -> torch.Tensor:
+ return self.__example_input_array()
+
+ @cached_property
+ def example_output(self) -> Union[Output, Tuple[Output]]:
+ """Example output"""
+ example_input_array = self.__example_input_array()
+ with torch.inference_mode():
+ example_output = self(example_input_array)
+
+ def __example_output(
+ example_output: torch.Tensor,
+ specifications: Specifications = None,
+ ) -> Output:
+ if specifications.resolution == Resolution.FRAME:
+ _, num_frames, dimension = example_output.shape
+ frame_duration = specifications.duration / num_frames
+ frames = SlidingWindow(step=frame_duration, duration=frame_duration)
+ else:
+ _, dimension = example_output.shape
+ num_frames = None
+ frames = None
- @introspection.setter
- def introspection(self, introspection):
- self._introspection = introspection
+ return Output(
+ num_frames=num_frames,
+ dimension=dimension,
+ frames=frames,
+ )
- @introspection.deleter
- def introspection(self):
- if hasattr(self, "_introspection"):
- del self._introspection
+ return map_with_specifications(
+ self.specifications, __example_output, example_output
+ )
def setup(self, stage=None):
-
if stage == "fit":
- self.task.setup()
+ self.task.setup_metadata()
# list of layers before adding task-dependent layers
before = set((name, id(module)) for name, module in self.named_modules())
@@ -387,8 +260,8 @@ def setup(self, stage=None):
# setup custom validation metrics
self.task.setup_validation_metric()
- # this is to make sure introspection is performed here, once and for all
- _ = self.introspection
+ # cache for later (and to avoid later CUDA error with multiprocessing)
+ _ = self.example_output
# list of layers after adding task-dependent layers
after = set((name, id(module)) for name, module in self.named_modules())
@@ -397,7 +270,6 @@ def setup(self, stage=None):
self.task_dependent = list(name for name, _ in after - before)
def on_save_checkpoint(self, checkpoint):
-
# put everything pyannote.audio-specific under pyannote.audio
# to avoid any future conflicts with pytorch-lightning updates
checkpoint["pyannote.audio"] = {
@@ -409,82 +281,44 @@ def on_save_checkpoint(self, checkpoint):
"module": self.__class__.__module__,
"class": self.__class__.__name__,
},
- "introspection": self.introspection,
"specifications": self.specifications,
}
- @staticmethod
- def check_version(library: Text, theirs: Text, mine: Text):
- theirs = VersionInfo.parse(theirs)
- mine = VersionInfo.parse(mine)
- if theirs.major != mine.major:
- warnings.warn(
- f"Model was trained with {library} {theirs}, yours is {mine}. "
- f"Bad things will probably happen unless you update {library} to {theirs.major}.x."
- )
- if theirs.minor > mine.minor:
- warnings.warn(
- f"Model was trained with {library} {theirs}, yours is {mine}. "
- f"This should be OK but you might want to update {library}."
- )
-
def on_load_checkpoint(self, checkpoint: Dict[str, Any]):
-
- self.check_version(
+ check_version(
"pyannote.audio",
checkpoint["pyannote.audio"]["versions"]["pyannote.audio"],
__version__,
+ what="Model",
)
- self.check_version(
+ check_version(
"torch",
checkpoint["pyannote.audio"]["versions"]["torch"],
torch.__version__,
+ what="Model",
)
- self.check_version(
- "pytorch-lightning", checkpoint["pytorch-lightning_version"], pl.__version__
+ check_version(
+ "pytorch-lightning",
+ checkpoint["pytorch-lightning_version"],
+ pl.__version__,
+ what="Model",
)
self.specifications = checkpoint["pyannote.audio"]["specifications"]
+ # add task-dependent (e.g. final classifier) layers
self.setup()
- self.introspection = checkpoint["pyannote.audio"]["introspection"]
-
- def forward(self, waveforms: torch.Tensor) -> torch.Tensor:
+ def forward(
+ self, waveforms: torch.Tensor, **kwargs
+ ) -> Union[torch.Tensor, Tuple[torch.Tensor]]:
msg = "Class {self.__class__.__name__} should define a `forward` method."
raise NotImplementedError(msg)
- def helper_default_activation(self, specifications: Specifications) -> nn.Module:
- """Helper function for default_activation
-
- Parameters
- ----------
- specifications: Specifications
- Task specification.
-
- Returns
- -------
- activation : nn.Module
- Default activation function.
- """
-
- if specifications.problem == Problem.BINARY_CLASSIFICATION:
- return nn.Sigmoid()
-
- elif specifications.problem == Problem.MONO_LABEL_CLASSIFICATION:
- return nn.LogSoftmax(dim=-1)
-
- elif specifications.problem == Problem.MULTI_LABEL_CLASSIFICATION:
- return nn.Sigmoid()
-
- else:
- msg = "TODO: implement default activation for other types of problems"
- raise NotImplementedError(msg)
-
# convenience function to automate the choice of the final activation function
- def default_activation(self) -> nn.Module:
+ def default_activation(self) -> Union[nn.Module, Tuple[nn.Module]]:
"""Guess default activation function according to task specification
* sigmoid for binary classification
@@ -493,10 +327,25 @@ def default_activation(self) -> nn.Module:
Returns
-------
- activation : nn.Module
+ activation : (tuple of) nn.Module
Activation.
"""
- return self.helper_default_activation(self.specifications)
+
+ def __default_activation(specifications: Specifications = None) -> nn.Module:
+ if specifications.problem == Problem.BINARY_CLASSIFICATION:
+ return nn.Sigmoid()
+
+ elif specifications.problem == Problem.MONO_LABEL_CLASSIFICATION:
+ return nn.LogSoftmax(dim=-1)
+
+ elif specifications.problem == Problem.MULTI_LABEL_CLASSIFICATION:
+ return nn.Sigmoid()
+
+ else:
+ msg = "TODO: implement default activation for other types of problems"
+ raise NotImplementedError(msg)
+
+ return map_with_specifications(self.specifications, __default_activation)
# training data logic is delegated to the task because the
# model does not really need to know how it is being used.
@@ -518,15 +367,10 @@ def val_dataloader(self) -> DataLoader:
def validation_step(self, batch, batch_idx):
return self.task.validation_step(batch, batch_idx)
- def validation_epoch_end(self, outputs):
- return self.task.validation_epoch_end(outputs)
-
def configure_optimizers(self):
return torch.optim.Adam(self.parameters(), lr=1e-3)
- def _helper_up_to(
- self, module_name: Text, requires_grad: bool = False
- ) -> List[Text]:
+ def __up_to(self, module_name: Text, requires_grad: bool = False) -> List[Text]:
"""Helper function for freeze_up_to and unfreeze_up_to"""
tokens = module_name.split(".")
@@ -583,7 +427,7 @@ def freeze_up_to(self, module_name: Text) -> List[Text]:
If your model does not follow a sequential structure, you might
want to use freeze_by_name for more control.
"""
- return self._helper_up_to(module_name, requires_grad=False)
+ return self.__up_to(module_name, requires_grad=False)
def unfreeze_up_to(self, module_name: Text) -> List[Text]:
"""Unfreeze model up to specific module
@@ -608,9 +452,9 @@ def unfreeze_up_to(self, module_name: Text) -> List[Text]:
If your model does not follow a sequential structure, you might
want to use freeze_by_name for more control.
"""
- return self._helper_up_to(module_name, requires_grad=True)
+ return self.__up_to(module_name, requires_grad=True)
- def _helper_by_name(
+ def __by_name(
self,
modules: Union[List[Text], Text],
recurse: bool = True,
@@ -625,7 +469,6 @@ def _helper_by_name(
modules = [modules]
for name, module in ModelSummary(self, max_depth=-1).named_modules:
-
if name not in modules:
continue
@@ -667,7 +510,7 @@ def freeze_by_name(
ValueError if at least one of `modules` does not exist.
"""
- return self._helper_by_name(
+ return self.__by_name(
modules,
recurse=recurse,
requires_grad=False,
@@ -698,7 +541,7 @@ def unfreeze_by_name(
ValueError if at least one of `modules` does not exist.
"""
- return self._helper_by_name(modules, recurse=recurse, requires_grad=True)
+ return self.__by_name(modules, recurse=recurse, requires_grad=True)
@classmethod
def from_pretrained(
@@ -777,32 +620,61 @@ def from_pretrained(
model_id = checkpoint
revision = None
- url = hf_hub_url(
- model_id, filename=HF_PYTORCH_WEIGHTS_NAME, revision=revision
- )
- path_for_pl = cached_download(
- url=url,
- library_name="pyannote",
- library_version=__version__,
- cache_dir=cache_dir,
- use_auth_token=use_auth_token,
- )
+ try:
+ path_for_pl = hf_hub_download(
+ model_id,
+ HF_PYTORCH_WEIGHTS_NAME,
+ repo_type="model",
+ revision=revision,
+ library_name="pyannote",
+ library_version=__version__,
+ cache_dir=cache_dir,
+ # force_download=False,
+ # proxies=None,
+ # etag_timeout=10,
+ # resume_download=False,
+ use_auth_token=use_auth_token,
+ # local_files_only=False,
+ # legacy_cache_layout=False,
+ )
+ except RepositoryNotFoundError:
+ print(
+ f"""
+Could not download '{model_id}' model.
+It might be because the model is private or gated so make
+sure to authenticate. Visit https://hf.co/settings/tokens to
+create your access token and retry with:
+
+ >>> Model.from_pretrained('{model_id}',
+ ... use_auth_token=YOUR_AUTH_TOKEN)
+
+If this still does not work, it might be because the model is gated:
+visit https://hf.co/{model_id} to accept the user conditions."""
+ )
+ return None
# HACK Huggingface download counters rely on config.yaml
# HACK Therefore we download config.yaml even though we
# HACK do not use it. Fails silently in case model does not
# HACK have a config.yaml file.
try:
- config_url = hf_hub_url(
- model_id, filename=HF_LIGHTNING_CONFIG_NAME, revision=revision
- )
- _ = cached_download(
- url=config_url,
+ _ = hf_hub_download(
+ model_id,
+ HF_LIGHTNING_CONFIG_NAME,
+ repo_type="model",
+ revision=revision,
library_name="pyannote",
library_version=__version__,
cache_dir=cache_dir,
+ # force_download=False,
+ # proxies=None,
+ # etag_timeout=10,
+ # resume_download=False,
use_auth_token=use_auth_token,
+ # local_files_only=False,
+ # legacy_cache_layout=False,
)
+
except Exception:
pass
diff --git a/pyannote/audio/core/pipeline.py b/pyannote/audio/core/pipeline.py
index 90daf297c..f844d584f 100644
--- a/pyannote/audio/core/pipeline.py
+++ b/pyannote/audio/core/pipeline.py
@@ -22,21 +22,27 @@
import os
import warnings
+from collections import OrderedDict
from collections.abc import Iterator
from functools import partial
from pathlib import Path
-from typing import Callable, List, Optional, Text, Union
+from typing import Callable, Dict, List, Optional, Text, Union
+import torch
import yaml
-from huggingface_hub import cached_download, hf_hub_url
-
-from pyannote.audio import Audio, __version__
-from pyannote.audio.core.io import AudioFile
-from pyannote.audio.core.model import CACHE_DIR
+from huggingface_hub import hf_hub_download
+from huggingface_hub.utils import RepositoryNotFoundError
from pyannote.core.utils.helper import get_class_by_name
from pyannote.database import FileFinder, ProtocolFile
from pyannote.pipeline import Pipeline as _Pipeline
+from pyannote.audio import Audio, __version__
+from pyannote.audio.core.inference import BaseInference
+from pyannote.audio.core.io import AudioFile
+from pyannote.audio.core.model import CACHE_DIR, Model
+from pyannote.audio.utils.reproducibility import fix_reproducibility
+from pyannote.audio.utils.version import check_version
+
PIPELINE_PARAMS_NAME = "config.yaml"
@@ -77,25 +83,57 @@ def from_pretrained(
else:
model_id = checkpoint_path
revision = None
- url = hf_hub_url(model_id, filename=PIPELINE_PARAMS_NAME, revision=revision)
-
- config_yml = cached_download(
- url=url,
- library_name="pyannote",
- library_version=__version__,
- cache_dir=cache_dir,
- use_auth_token=use_auth_token,
- )
+
+ try:
+ config_yml = hf_hub_download(
+ model_id,
+ PIPELINE_PARAMS_NAME,
+ repo_type="model",
+ revision=revision,
+ library_name="pyannote",
+ library_version=__version__,
+ cache_dir=cache_dir,
+ # force_download=False,
+ # proxies=None,
+ # etag_timeout=10,
+ # resume_download=False,
+ use_auth_token=use_auth_token,
+ # local_files_only=False,
+ # legacy_cache_layout=False,
+ )
+
+ except RepositoryNotFoundError:
+ print(
+ f"""
+Could not download '{model_id}' pipeline.
+It might be because the pipeline is private or gated so make
+sure to authenticate. Visit https://hf.co/settings/tokens to
+create your access token and retry with:
+
+ >>> Pipeline.from_pretrained('{model_id}',
+ ... use_auth_token=YOUR_AUTH_TOKEN)
+
+If this still does not work, it might be because the pipeline is gated:
+visit https://hf.co/{model_id} to accept the user conditions."""
+ )
+ return None
with open(config_yml, "r") as fp:
config = yaml.load(fp, Loader=yaml.SafeLoader)
+ if "version" in config:
+ check_version(
+ "pyannote.audio", config["version"], __version__, what="Pipeline"
+ )
+
# initialize pipeline
pipeline_name = config["pipeline"]["name"]
Klass = get_class_by_name(
pipeline_name, default_module_name="pyannote.pipeline.blocks"
)
- pipeline = Klass(**config["pipeline"].get("params", {}))
+ params = config["pipeline"].get("params", {})
+ params.setdefault("use_auth_token", use_auth_token)
+ pipeline = Klass(**params)
# freeze parameters
if "freeze" in config:
@@ -111,7 +149,6 @@ def from_pretrained(
if "preprocessors" in config:
preprocessors = {}
for key, preprocessor in config.get("preprocessors", {}).items():
-
# preprocessors:
# key:
# name: package.module.ClassName
@@ -139,22 +176,98 @@ def from_pretrained(
pipeline.preprocessors = preprocessors
+ # send pipeline to specified device
+ if "device" in config:
+ device = torch.device(config["device"])
+ try:
+ pipeline.to(device)
+ except RuntimeError as e:
+ print(e)
+
return pipeline
- @staticmethod
- def setup_hook(file: AudioFile, hook: Optional[Callable] = None) -> Callable:
+ def __init__(self):
+ super().__init__()
+ self._models: Dict[str, Model] = OrderedDict()
+ self._inferences: Dict[str, BaseInference] = OrderedDict()
+
+ def __getattr__(self, name):
+ """(Advanced) attribute getter
+
+ Adds support for Model and Inference attributes,
+ which are iterated over by Pipeline.to() method.
+
+ See pyannote.pipeline.Pipeline.__getattr__.
+ """
+
+ if "_models" in self.__dict__:
+ _models = self.__dict__["_models"]
+ if name in _models:
+ return _models[name]
+
+ if "_inferences" in self.__dict__:
+ _inferences = self.__dict__["_inferences"]
+ if name in _inferences:
+ return _inferences[name]
+
+ return super().__getattr__(name)
+
+ def __setattr__(self, name, value):
+ """(Advanced) attribute setter
+
+ Adds support for Model and Inference attributes,
+ which are iterated over by Pipeline.to() method.
+
+ See pyannote.pipeline.Pipeline.__setattr__.
+ """
+
+ def remove_from(*dicts):
+ for d in dicts:
+ if name in d:
+ del d[name]
+
+ _parameters = self.__dict__.get("_parameters")
+ _instantiated = self.__dict__.get("_instantiated")
+ _pipelines = self.__dict__.get("_pipelines")
+ _models = self.__dict__.get("_models")
+ _inferences = self.__dict__.get("_inferences")
+
+ if isinstance(value, Model):
+ if _models is None:
+ msg = "cannot assign models before Pipeline.__init__() call"
+ raise AttributeError(msg)
+ remove_from(
+ self.__dict__, _inferences, _parameters, _instantiated, _pipelines
+ )
+ _models[name] = value
+ return
+
+ if isinstance(value, BaseInference):
+ if _inferences is None:
+ msg = "cannot assign inferences before Pipeline.__init__() call"
+ raise AttributeError(msg)
+ remove_from(self.__dict__, _models, _parameters, _instantiated, _pipelines)
+ _inferences[name] = value
+ return
+
+ super().__setattr__(name, value)
- if hook is None:
+ def __delattr__(self, name):
+ if name in self._models:
+ del self._models[name]
- def hook(*args, **kwargs):
- return
+ elif name in self._inferences:
+ del self._inferences[name]
- hook.missing = True
else:
- hook = partial(hook, file=file)
- hook.missing = False
+ super().__delattr__(name)
- return hook
+ @staticmethod
+ def setup_hook(file: AudioFile, hook: Optional[Callable] = None) -> Callable:
+ def noop(*args, **kwargs):
+ return
+
+ return partial(hook or noop, file=file)
def default_parameters(self):
raise NotImplementedError()
@@ -181,6 +294,8 @@ def classes(self) -> Union[List, Iterator]:
raise NotImplementedError()
def __call__(self, file: AudioFile, **kwargs):
+ fix_reproducibility(getattr(self, "device", torch.device("cpu")))
+
if not self.instantiated:
# instantiate with default parameters when available
try:
@@ -208,3 +323,25 @@ def __call__(self, file: AudioFile, **kwargs):
file = ProtocolFile(file, lazy=self.preprocessors)
return self.apply(file, **kwargs)
+
+ def to(self, device: torch.device):
+ """Send pipeline to `device`"""
+
+ if not isinstance(device, torch.device):
+ raise TypeError(
+ f"`device` must be an instance of `torch.device`, got `{type(device).__name__}`"
+ )
+
+ for _, pipeline in self._pipelines.items():
+ if hasattr(pipeline, "to"):
+ _ = pipeline.to(device)
+
+ for _, model in self._models.items():
+ _ = model.to(device)
+
+ for _, inference in self._inferences.items():
+ _ = inference.to(device)
+
+ self.device = device
+
+ return self
diff --git a/pyannote/audio/core/task.py b/pyannote/audio/core/task.py
index fb42fb7cc..1edfbc35c 100644
--- a/pyannote/audio/core/task.py
+++ b/pyannote/audio/core/task.py
@@ -23,29 +23,23 @@
from __future__ import annotations
-from functools import partial
-
-try:
- from functools import cached_property
-except ImportError:
- from backports.cached_property import cached_property
-
import multiprocessing
import sys
import warnings
from dataclasses import dataclass
from enum import Enum
+from functools import cached_property, partial
from numbers import Number
-from typing import Dict, List, Optional, Sequence, Text, Tuple, Union
+from typing import Dict, List, Literal, Optional, Sequence, Text, Tuple, Union
import pytorch_lightning as pl
+import scipy.special
import torch
from pyannote.database import Protocol
from torch.utils.data import DataLoader, Dataset, IterableDataset
from torch_audiomentations import Identity
from torch_audiomentations.core.transforms_interface import BaseWaveformTransform
from torchmetrics import Metric, MetricCollection
-from typing_extensions import Literal
from pyannote.audio.utils.loss import binary_cross_entropy, nll_loss
from pyannote.audio.utils.protocol import check_protocol
@@ -69,14 +63,20 @@ class Resolution(Enum):
CHUNK = 2 # model outputs just one vector for the whole chunk
+class UnknownSpecificationsError(Exception):
+ pass
+
+
@dataclass
class Specifications:
problem: Problem
resolution: Resolution
- # chunk duration in seconds.
- # use None for variable-length chunks
- duration: Optional[float] = None
+ # (maximum) chunk duration in seconds
+ duration: float
+
+ # (for variable-duration tasks only) minimum chunk duration in seconds
+ min_duration: Optional[float] = None
# use that many seconds on the left- and rightmost parts of each chunk
# to warm up the model. This is mostly useful for segmentation tasks.
@@ -89,9 +89,43 @@ class Specifications:
# (for classification tasks only) list of classes
classes: Optional[List[Text]] = None
+ # (for powerset only) max number of simultaneous classes
+ # (n choose k with k <= powerset_max_classes)
+ powerset_max_classes: Optional[int] = None
+
# whether classes are permutation-invariant (e.g. diarization)
permutation_invariant: bool = False
+ @cached_property
+ def powerset(self) -> bool:
+ if self.powerset_max_classes is None:
+ return False
+
+ if self.problem != Problem.MONO_LABEL_CLASSIFICATION:
+ raise ValueError(
+ "`powerset_max_classes` only makes sense with multi-class classification problems."
+ )
+
+ return True
+
+ @cached_property
+ def num_powerset_classes(self) -> int:
+ # compute number of subsets of size at most "powerset_max_classes"
+ # e.g. with len(classes) = 3 and powerset_max_classes = 2:
+ # {}, {0}, {1}, {2}, {0, 1}, {0, 2}, {1, 2}
+ return int(
+ sum(
+ scipy.special.binom(len(self.classes), i)
+ for i in range(0, self.powerset_max_classes + 1)
+ )
+ )
+
+ def __len__(self):
+ return 1
+
+ def __iter__(self):
+ yield self
+
class TrainDataset(IterableDataset):
def __init__(self, task: Task):
@@ -165,7 +199,7 @@ class Task(pl.LightningDataModule):
Attributes
----------
- specifications : Specifications or dict of Specifications
+ specifications : Specifications or tuple of Specifications
Task specifications (available after `Task.setup` has been called.)
"""
@@ -184,7 +218,10 @@ def __init__(
super().__init__()
# dataset
- self.protocol, self.has_validation = check_protocol(protocol)
+ self.protocol, checks = check_protocol(protocol)
+ self.has_validation = checks["has_validation"]
+ self.has_scope = checks["has_scope"]
+ self.has_classes = checks["has_classes"]
# batching
self.duration = duration
@@ -231,7 +268,28 @@ def prepare_data(self):
"""
pass
- def setup(self, stage: Optional[str] = None):
+ @property
+ def specifications(self) -> Union[Specifications, Tuple[Specifications]]:
+ # setup metadata on-demand the first time specifications are requested and missing
+ if not hasattr(self, "_specifications"):
+ self.setup_metadata()
+ return self._specifications
+
+ @specifications.setter
+ def specifications(
+ self, specifications: Union[Specifications, Tuple[Specifications]]
+ ):
+ self._specifications = specifications
+
+ @property
+ def has_setup_metadata(self):
+ return getattr(self, "_has_setup_metadata", False)
+
+ @has_setup_metadata.setter
+ def has_setup_metadata(self, value: bool):
+ self._has_setup_metadata = value
+
+ def setup_metadata(self):
"""Called at the beginning of training at the very beginning of Model.setup(stage="fit")
Notes
@@ -241,7 +299,10 @@ def setup(self, stage: Optional[str] = None):
If `specifications` attribute has not been set in `__init__`,
`setup` is your last chance to set it.
"""
- pass
+
+ if not self.has_setup_metadata:
+ self.setup()
+ self.has_setup_metadata = True
def setup_loss_func(self):
pass
@@ -270,18 +331,6 @@ def train_dataloader(self) -> DataLoader:
collate_fn=partial(self.collate_fn, stage="train"),
)
- @cached_property
- def logging_prefix(self):
-
- prefix = f"{self.__class__.__name__}-"
- if hasattr(self.protocol, "name"):
- # "." has a special meaning for pytorch-lightning checkpointing
- # so we remove dots from protocol names
- name_without_dots = "".join(self.protocol.name.split("."))
- prefix += f"{name_without_dots}-"
-
- return prefix
-
def default_loss(
self, specifications: Specifications, target, prediction, weight=None
) -> torch.Tensor:
@@ -314,7 +363,7 @@ def default_loss(
]:
return binary_cross_entropy(prediction, target, weight=weight)
- elif specifications.problem == Problem.MONO_LABEL_CLASSIFICATION:
+ elif specifications.problem in [Problem.MONO_LABEL_CLASSIFICATION]:
return nll_loss(prediction, target, weight=weight)
else:
@@ -345,6 +394,11 @@ def common_step(self, batch, batch_idx: int, stage: Literal["train", "val"]):
{"loss": loss}
"""
+ if isinstance(self.specifications, tuple):
+ raise NotImplementedError(
+ "Default training/validation step is not implemented for multi-task."
+ )
+
# forward pass
y_pred = self.model(batch["X"])
@@ -370,12 +424,17 @@ def common_step(self, batch, batch_idx: int, stage: Literal["train", "val"]):
# compute loss
loss = self.default_loss(self.specifications, y, y_pred, weight=weight)
+
+ # skip batch if something went wrong for some reason
+ if torch.isnan(loss):
+ return None
+
self.model.log(
- f"{self.logging_prefix}{stage.capitalize()}Loss",
+ f"loss/{stage}",
loss,
on_step=False,
on_epoch=True,
- prog_bar=True,
+ prog_bar=False,
logger=True,
)
return {"loss": loss}
@@ -413,9 +472,6 @@ def val_dataloader(self) -> Optional[DataLoader]:
def validation_step(self, batch, batch_idx: int):
return self.common_step(batch, batch_idx, "val")
- def validation_epoch_end(self, outputs):
- pass
-
def default_metric(self) -> Union[Metric, Sequence[Metric], Dict[str, Metric]]:
"""Default validation metric"""
msg = f"Missing '{self.__class__.__name__}.default_metric' method."
@@ -426,7 +482,7 @@ def metric(self) -> MetricCollection:
if self._metric is None:
self._metric = self.default_metric()
- return MetricCollection(self._metric, prefix=self.logging_prefix)
+ return MetricCollection(self._metric)
def setup_validation_metric(self):
metric = self.metric
diff --git a/pyannote/audio/interactive/common/commands.png b/pyannote/audio/interactive/common/commands.png
deleted file mode 100755
index 29517df5a..000000000
Binary files a/pyannote/audio/interactive/common/commands.png and /dev/null differ
diff --git a/pyannote/audio/interactive/common/controller.js b/pyannote/audio/interactive/common/controller.js
deleted file mode 100644
index cbffc2899..000000000
--- a/pyannote/audio/interactive/common/controller.js
+++ /dev/null
@@ -1,367 +0,0 @@
-// The MIT License (MIT)
-//
-// Copyright (c) 2021 CNRS
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-// Can't create constant because prodigy reload this file every batch
-var currentRegion = 0;
-var regions = null;
-var ids = null;
-var refresh = true;
-
-var left = 'ArrowLeft';
-var right = 'ArrowRight';
-var startR = 'Shift';
-var endR = 'Control';
-
-var PRECISION = (prodigy.config.precision / 1000);
-var BEEP = prodigy.config.beep;
-var EXCERPT = 1;
-
-var keysMap = {};
-
-/**
-* Handle web audio for beep
-* @see beep()
-*/
-var audioCtx = new(window.AudioContext || window.webkitAudioContext)();
-
-/**
-* Makes sure that the document is loaded before executing waitForElement()
-* Add a small timeout if wavesurfer is already defined (useful when a new batch is coming),
-* the time for prodigy to update wavesurfer.
-* @see waitForElement()
-*/
-if(document.readyState !== 'loading') {
- if(typeof window.wavesurfer !== "undefined"){
- setTimeout(waitForElement,25);
- }else{
- waitForElement();
- }
-} else {
- document.addEventListener('DOMContentLoaded', function () {
- waitForElement();
- });
-}
-
-/**
-* Compare if a region is before or after another one
-* Useful to sort global variable 'ids'
-* @see reloadWave()
-* @param {region1} Region object
-* @param {region2} Region Object
-* @return {number} -1 if region1 start before, 1 otherwise, 0 if the identical
-*/
-function compare(region1, region2){
- if(region1.start < region2.start){
- return -1;
- }else if (region1.start > region2.start){
- return 1;
- }else{
- return 0;
- }
-}
-
-/**
-* Simulate a click on prodigy's label radio button
-* Only useful for "review recipe"
-* Note: might break with future versions of Prodigy
-* @param {label} Label to click on
-*/
-function clickOnLabel(label){
- document.querySelector("input[type=radio][value=\'"+label+"\']").click()
-}
-
-/**
-* Update prodigy.content with all regions from window.wavesurfer.regions.list (thus, all regions that can be seen in the interface)
-* Discuss in this issue :
-* https://support.prodi.gy/t/weird-interaction-between-window-prodigy-update-and-wavesurfer/5450
-*/
-function updateContent(){
- var regions = window.wavesurfer.regions.list;
- var content = [];
- for (var id in regions){
- var region = regions[id];
- content.push({start : region.start, end : region.end, label : region.label, id : region.id, color : region.color});
- }
- window.prodigy.update({audio_spans : content});
-}
-
-/**
-* Create a beep sound from scratch
-* You can adjust the gain, frequency (here its A 440) and duration
-*/
-function beep() {
- if(BEEP){
- var oscillator = audioCtx.createOscillator();
- var gainNode = audioCtx.createGain();
-
- oscillator.connect(gainNode);
- gainNode.connect(audioCtx.destination);
-
- gainNode.gain.value = 0.1;
- oscillator.frequency.value = 440;
- oscillator.type = "square";
-
- oscillator.start();
-
- setTimeout(
- function() {
- oscillator.stop();
- },
- 150 // FIXME: should depend on the value of "precision"
- );
- }
-}
-
-/**
-* Change CSS style for the selected region
-* @param {e} Region object
-*/
-function activeRegion(e){
- e.element.style.borderTop = "3px solid";
- e.element.style.borderBottom = "3px solid";
-}
-
-/**
-* @see activeRegion()
-* Undo CSS change
-* @param {e} Region object
-*/
-function deactiveRegion(e){
- e.element.style.borderTop = "";
- e.element.style.borderBottom = "";
-}
-
-/**
-* Update global variables 'regions' and 'ids' with regions in window.wavesurfer.regions.list
-* Put the first one as "active" and update the variable currentRegion
-*/
-function reloadWave(){
- regions = window.wavesurfer.regions.list;
- ids = Object.values(regions);
- ids.sort(compare);
- if(ids.length > 0){
- currentRegion = 0;
- activeRegion(ids[0]);
- }
-}
-
-/**
-* Switch selected region
-* Update var currentRegion
-* Place wavesurfer cursor at the beginning of the new region or the beginning of the file if it's a new prodigy task
-* @see activeRegion() / deactiveRegion()
-* @param {ids} Ids of the region to be selected
-*/
-function switchCurrent(newId){
- if(ids.length > 0){
- deactiveRegion(ids[currentRegion]);
- currentRegion = newId;
- activeRegion(ids[newId])
- if(refresh){
- window.wavesurfer.seekTo(0);
- }else{
- var time = (ids[currentRegion].start) / (window.wavesurfer.getDuration());
- window.wavesurfer.seekTo(time);
- }
- }
-}
-
-/**
-* Handle wavesurfer regions
-* Add event listener to some wavesurfer event
-*/
-function waitForElement(){
- if(typeof window.wavesurfer !== "undefined"){
- reloadWave();
- // Select created region or the first one if it's a new task
- window.wavesurfer.on('region-created', function(e){
- setTimeout(function(){
- if(ids.length > 0) deactiveRegion(ids[currentRegion]);
- reloadWave();
- if(refresh){
- switchCurrent(0);
- }else{
- switchCurrent(ids.indexOf(e));
- }
- }, 5);
- });
- // Change region label (by remove the old one and create a new one with proper label)
- window.wavesurfer.on('region-dblclick',function(e){
- re = window.wavesurfer.addRegion({'start' : e.start,'end' : e.end});
- e.remove();
- window.wavesurfer.fireEvent('region-update-end',re);
- });
- // Select region on click
- window.wavesurfer.on('region-click',function(e){
- switchCurrent(ids.indexOf(e));
- });
- // Beep when region end
- window.wavesurfer.on('region-out',function(e){
- beep();
- });
- // @see updateContent()
- window.wavesurfer.on('region-update-end', function(e){
- updateContent();
- });
- // @see updateContent()
- // Switch selected region when deleted
- window.wavesurfer.on('region-removed',function(e){
- updateContent();
- if(currentRegion == (ids.length - 1)){
- var newId = 0;
- }else{
- var newId = currentRegion;
- }
- reloadWave();
- if(ids.length > 0) switchCurrent(newId);
- });
- }else{
- setTimeout(waitForElement, 250);
- }
-}
-
-// Check if it's a new prodigy task
-document.addEventListener('prodigyanswer', e => {
- refresh = true;
-})
-
-/**
-* Keyboard controller
-* | Key 1 | Key 2 | Command |
-* | ------------- | ------------- | ------------ |
-* | Arrows left/right | [W] | Move Cursor [speed up] |
-* | Shift | Arrows left/right | Change start of current segment |
-* | Control | Arrows left/right | Change end of current segment |
-* | Arrows up/down | | Change current segment to the next/precedent one |
-* | Shift | Arrows up/[down] | Create [or remove] segment |
-* | Backspace | | Remove current segment |
-*/
-document.querySelector('#root').onkeydown = document.querySelector('#root').onkeyup = function(e){
- e = e || event;
- keysMap[e.key] = e.type == 'keydown';
- var pos = window.wavesurfer.getCurrentTime();
- var audioEnd = window.wavesurfer.getDuration();
- var region = ids[currentRegion];
- refresh = false;
-
- // If Left is pressed
- if(keysMap[left] && !keysMap[right]){
- // If Shift is pressed
- if(keysMap[startR] && !keysMap[endR]){
- // Shortens start if possible
- if((region.start - PRECISION) <= 0){
- region.update({'start' : 0});
- window.wavesurfer.fireEvent('region-update-end',region);
- window.wavesurfer.play(0, region.end);
- }else{
- region.update({'start' : region.start - PRECISION });
- window.wavesurfer.fireEvent('region-update-end',region);
- window.wavesurfer.play(region.start, region.end);
- }
- // If Ctrl is pressed
- }else if(keysMap[endR] && !keysMap[startR]){
- var startTime = region.end - EXCERPT;
- if(startTime < region.start) startTime = region.start;
- // Shortens end if possible
- if((region.end - PRECISION) > region.start){
- region.update({'end' : region.end - PRECISION });
- window.wavesurfer.fireEvent('region-update-end',region);
- window.wavesurfer.play(startTime, region.end);
- }
- }else{
- // Else change cursor position
- // Speed up naviguation if W is pressed
- if(keysMap['w']){
- var time = (pos - PRECISION*2) / audioEnd;
- }else{
- var time = (pos - PRECISION) / audioEnd;
- }
- if(time < 0) time = 0;
- window.wavesurfer.pause();
- window.wavesurfer.seekTo(time);
- }
- // If Right is pressed
- }else if(keysMap[right] && !keysMap[left]){
- // If Shift is pressed
- if(keysMap[startR] && !keysMap[endR]){
- // Extend start if possible
- if(region.start + PRECISION < region.end){
- region.update({'start' : region.start + PRECISION });
- window.wavesurfer.fireEvent('region-update-end',region);
- window.wavesurfer.play(region.start, region.end);
- }
- // If Ctrl is pressed
- }else if(keysMap[endR] && !keysMap[startR]){
- // Extend end if possible (while keep playing the audio)
- if(!window.wavesurfer.isPlaying()){
- var startTime = region.end - EXCERPT;
- if(startTime < region.start) startTime = region.start;
- }else{
- var startTime = pos;
- }
- if((region.end + PRECISION) >= audioEnd){
- region.update({'end' : audioEnd });
- window.wavesurfer.fireEvent('region-update-end',region);
- }else{
- region.update({'end' : region.end + PRECISION });
- window.wavesurfer.fireEvent('region-update-end',region);
- }
- window.wavesurfer.play(startTime, region.end);
- }else{
- // Else change cursor position
- // Speed up naviguation if W is pressed
- if(keysMap['w']){
- var time = (pos + PRECISION*2) / audioEnd;
- }else{
- var time = (pos + PRECISION) / audioEnd;
- }
- if(time > 1) time = 1;
- window.wavesurfer.pause();
- window.wavesurfer.seekTo(time);
- }
- // If Up and shift is pressed : new region
- }else if (keysMap['ArrowUp'] && keysMap['Shift']){
- var fin = pos + 1;
- if(fin > audioEnd) fin = audioEnd;
- re = window.wavesurfer.addRegion({'start' : pos,'end' : fin});
- window.wavesurfer.fireEvent('region-update-end',re);
- // If Down and Shift or Backspace: delete region
- // Check backspace for diarization text field
- }else if(keysMap['Backspace'] || (keysMap['ArrowDown'] && keysMap['Shift'])){
- ids[currentRegion].remove();
- // If Up/Down @see switchCurrent
- }else if(keysMap['ArrowUp']){
- if(currentRegion == (ids.length - 1)){
- switchCurrent(0);
- }else{
- switchCurrent(currentRegion + 1);
- }
- }else if(keysMap['ArrowDown']){
- if(currentRegion == 0){
- switchCurrent(ids.length - 1);
- }else{
- switchCurrent(currentRegion - 1);
- }
- }else if(keysMap['u']){
- reloadWave();
- }
-}
diff --git a/pyannote/audio/interactive/common/instructions.html b/pyannote/audio/interactive/common/instructions.html
deleted file mode 100644
index 0b75a98c1..000000000
--- a/pyannote/audio/interactive/common/instructions.html
+++ /dev/null
@@ -1,69 +0,0 @@
-
-
-
- Commands
-
-
- You have to mark the speech moments with bounding boxes.
-
-
-
-
-
- Key 1
- Key 2
- Command
-
-
- Arrows left/right
- [W]
- Move Cursor [speed up]
-
-
- Shift
- Arrow left/right
- Change start of current segment
-
-
- Control
- Arrow left/right
- Change end of current segment
-
-
- Arrows up/down
-
- Change current segment to the next/precedent one
-
-
- Shift
- Arrow up/[down]
- Create or [remove] segment
-
-
- Backspace
-
- Remove current segment
-
-
- Spacebar
-
- Play/pause audio
-
-
- U
-
- Undo all actions
-
-
- Escape
-
- Ignore this sample
-
-
- Enter
-
- Validate annotation
-
-
-
-
diff --git a/pyannote/audio/interactive/common/regions.js b/pyannote/audio/interactive/common/regions.js
deleted file mode 100644
index c40b15cd1..000000000
--- a/pyannote/audio/interactive/common/regions.js
+++ /dev/null
@@ -1,1362 +0,0 @@
-/*!
- * wavesurfer.js regions plugin 5.2.0 (2021-08-16)
- * https://wavesurfer-js.org
- * @license BSD-3-Clause
- */
-(function webpackUniversalModuleDefinition(root, factory) {
- if(typeof exports === 'object' && typeof module === 'object')
- module.exports = factory();
- else if(typeof define === 'function' && define.amd)
- define("WaveSurfer", [], factory);
- else if(typeof exports === 'object')
- exports["WaveSurfer"] = factory();
- else
- root["WaveSurfer"] = root["WaveSurfer"] || {}, root["WaveSurfer"]["regions"] = factory();
-})(self, function() {
-return /******/ (() => { // webpackBootstrap
-/******/ "use strict";
-/******/ var __webpack_modules__ = ({
-
-/***/ "./src/plugin/regions/index.js":
-/*!*************************************!*\
- !*** ./src/plugin/regions/index.js ***!
- \*************************************/
-/***/ ((module, exports, __webpack_require__) => {
-
-
-
-Object.defineProperty(exports, "__esModule", ({
- value: true
-}));
-exports.default = void 0;
-
-var _region = __webpack_require__(/*! ./region.js */ "./src/plugin/regions/region.js");
-
-function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
-
-function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
-
-function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
-function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
-
-function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
-
-/**
- * Regions are visual overlays on waveform that can be used to play and loop
- * portions of audio. Regions can be dragged and resized.
- *
- * Visual customization is possible via CSS (using the selectors
- * `.wavesurfer-region` and `.wavesurfer-handle`).
- *
- * @implements {PluginClass}
- * @extends {Observer}
- *
- * @example
- * // es6
- * import RegionsPlugin from 'wavesurfer.regions.js';
- *
- * // commonjs
- * var RegionsPlugin = require('wavesurfer.regions.js');
- *
- * // if you are using "
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
},
- "b950f7fe8ea34776bde01ed2f4244f5f": {
- "model_module": "@jupyter-widgets/base",
- "model_name": "LayoutModel",
- "model_module_version": "1.2.0",
- "state": {
- "_model_module": "@jupyter-widgets/base",
- "_model_module_version": "1.2.0",
- "_model_name": "LayoutModel",
- "_view_count": null,
- "_view_module": "@jupyter-widgets/base",
- "_view_module_version": "1.2.0",
- "_view_name": "LayoutView",
- "align_content": null,
- "align_items": null,
- "align_self": null,
- "border": null,
- "bottom": null,
- "display": null,
- "flex": null,
- "flex_flow": null,
- "grid_area": null,
- "grid_auto_columns": null,
- "grid_auto_flow": null,
- "grid_auto_rows": null,
- "grid_column": null,
- "grid_gap": null,
- "grid_row": null,
- "grid_template_areas": null,
- "grid_template_columns": null,
- "grid_template_rows": null,
- "height": null,
- "justify_content": null,
- "justify_items": null,
- "left": null,
- "margin": null,
- "max_height": null,
- "max_width": null,
- "min_height": null,
- "min_width": null,
- "object_fit": null,
- "object_position": null,
- "order": null,
- "overflow": null,
- "overflow_x": null,
- "overflow_y": null,
- "padding": null,
- "right": null,
- "top": null,
- "visibility": null,
- "width": null
- }
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Saving sample.wav to sample.wav\n"
+ ]
},
- "f7b175bb312c4f43809c97f98e6e84a3": {
- "model_module": "@jupyter-widgets/controls",
- "model_name": "DescriptionStyleModel",
- "model_module_version": "1.5.0",
- "state": {
- "_model_module": "@jupyter-widgets/controls",
- "_model_module_version": "1.5.0",
- "_model_name": "DescriptionStyleModel",
- "_view_count": null,
- "_view_module": "@jupyter-widgets/base",
- "_view_module_version": "1.2.0",
- "_view_name": "StyleView",
- "description_width": ""
- }
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " Your browser does not support the audio element.\n",
+ " \n",
+ " "
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": null,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "import google.colab\n",
+ "own_file, _ = google.colab.files.upload().popitem()\n",
+ "OWN_FILE = {'audio': own_file}\n",
+ "notebook.reset()\n",
+ "\n",
+ "# load audio waveform and play it\n",
+ "waveform, sample_rate = Audio(mono=\"downmix\")(OWN_FILE)\n",
+ "IPythonAudio(data=waveform.squeeze(), rate=sample_rate, autoplay=True)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "ctw4nLaPYnp_"
+ },
+ "source": [
+ "Simply replace `DEMO_FILE` by `OWN_FILE` in the rest of the notebook.\n",
+ "\n",
+ "Note, however, that unless you provide a groundtruth annotation in the next cell, you will (obviously) not be able to visualize groundtruth annotation nor evaluate the performance of the diarization pipeline quantitatively"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "x9AQgDzFYnp_"
+ },
+ "source": [
+ "## Upload groundtruth (optional)\n",
+ "\n",
+ "The groundtruth file is expected to use the RTTM format, with one line per speech turn with the following convention:\n",
+ "\n",
+ "```\n",
+ "SPEAKER {file_name} 1 {start_time} {duration} {speaker_name} \n",
+ "```"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "iZaFudpDYnp_",
+ "outputId": "981274fa-e654-4091-c838-91c81f921e5d",
+ "vscode": {
+ "languageId": "python"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " Upload widget is only available when the cell has been executed in the\n",
+ " current browser session. Please rerun this cell to enable.\n",
+ " \n",
+ " "
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
},
- "e0c6b8aff2ad4849b3dac392ee388112": {
- "model_module": "@jupyter-widgets/base",
- "model_name": "LayoutModel",
- "model_module_version": "1.2.0",
- "state": {
- "_model_module": "@jupyter-widgets/base",
- "_model_module_version": "1.2.0",
- "_model_name": "LayoutModel",
- "_view_count": null,
- "_view_module": "@jupyter-widgets/base",
- "_view_module_version": "1.2.0",
- "_view_name": "LayoutView",
- "align_content": null,
- "align_items": null,
- "align_self": null,
- "border": null,
- "bottom": null,
- "display": null,
- "flex": null,
- "flex_flow": null,
- "grid_area": null,
- "grid_auto_columns": null,
- "grid_auto_flow": null,
- "grid_auto_rows": null,
- "grid_column": null,
- "grid_gap": null,
- "grid_row": null,
- "grid_template_areas": null,
- "grid_template_columns": null,
- "grid_template_rows": null,
- "height": null,
- "justify_content": null,
- "justify_items": null,
- "left": null,
- "margin": null,
- "max_height": null,
- "max_width": null,
- "min_height": null,
- "min_width": null,
- "object_fit": null,
- "object_position": null,
- "order": null,
- "overflow": null,
- "overflow_x": null,
- "overflow_y": null,
- "padding": null,
- "right": null,
- "top": null,
- "visibility": null,
- "width": null
- }
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Saving sample.rttm to sample.rttm\n"
+ ]
},
- "8ddd76365cfd4408b8ca12309b183967": {
- "model_module": "@jupyter-widgets/controls",
- "model_name": "ProgressStyleModel",
- "model_module_version": "1.5.0",
- "state": {
- "_model_module": "@jupyter-widgets/controls",
- "_model_module_version": "1.5.0",
- "_model_name": "ProgressStyleModel",
- "_view_count": null,
- "_view_module": "@jupyter-widgets/base",
- "_view_module_version": "1.2.0",
- "_view_name": "StyleView",
- "bar_color": null,
- "description_width": ""
- }
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAABHQAAACsCAYAAAAaLvvnAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAOHUlEQVR4nO3de6ykZ10H8O+v3YIGCghbG1yqC+WiBWwpa9OKJk2DbQUVURRISCDyhxowXNQEFOzWqEnBtl4AjQVCDYSLgFpBqA1ZBJWCp1As5aJtbFPWUkStbVHLpT//mJdwaLuX2Z1zZp6zn08yOe95b/ObeeeZ951vnmemujsAAAAAjOOoZRcAAAAAwHwEOgAAAACDEegAAAAADEagAwAAADAYgQ4AAADAYAQ6AAAAAIMR6AAAAAAMRqADAAAAMBiBDgAAAMBgBDoAAAAAgxHoTKrqeVX1msPY/uSq+khVXVNVf1VVD1i37OVVdV1Vfa6qzllMxVvbRh2PqnpIVe2pqjsOZ/8AAACwTAKdBaiqo5O8PsnLuvvxSf48ya9Oy05K8qwkj01ybpLXTeuzQfZ3PJL8X5JXJvmVJZUHAAAAh22oQKeq7ldV762qT1bVp6rqmVV1Q1W9auqJ8bGqeuS07nFV9a6q+sfp9qRp/mlTz41PVNU/VNVj7uV+njqts72qzp6mP15Vf1ZV95/WuaGqLqiqjyf5mSSPTvKhaRdXJPnpafppSd7W3Xd2978muS7JaRv6RG2SEY9Hd3+5u/8us2AHAAAAhjRUoJNZD5d/6+6Tu/txSd4/zf/vqSfGa5L83jTv95Nc3N0/kNmH+ddP8z+b5Ie7+wlJfiPJ76y/g6p6epKXJXnKNOsVSZ7c3acmWUvy0nWr/0d3n9rdb0tybWbhTTILFE6YpnckuWndNp+f5m0FIx4PAAAAGN62w9l4744Tdic5bzGlJEnO37H3pt37WX5Nkgur6oIk7+nuD1dVkrx1Wv7WJBdP009OctK0PEkeMPXmeGCSS6vqUUk6yTHr9n9Wkl1Jzu7u26rqx5KclOTvp/3cJ8lH1q3/9nXTP5fkD6rqlUkuS/KVg37UC3L6eZfvzoKPx5Xnn7N7P8sdDwAAAFiCwwp0Nlt3/3NVnZpZb43fqqoPfGPR+tWmv0clOb27v2VozfRFuHu6++lVtTPJB9ctvj7JIzIbrrOWpJJc0d3P3kdJX15X22eTnD3dx6OTPHVatDff2jvkYdO84Q16PAAAAGB4Qw25qqrvSvI/3f3mJK9Ocuq06Jnr/n6jx8bfJPmlddueMk0+MN8MVJ53t7u4MbPhQH9aVY9NcmWSJ637Hpj7TeHAvdX2ndPfozIbFvTH06LLkjyrqu5bVQ9P8qgkH5vjYa+sQY8HAAAADK+6+8BrrYjpJ79fneSuJF9N8otJ3pnZUJsfTXJnkmd393VVtT3Ja5N8X2Y9kT7U3b9QVWckuTSz3hzvTfKc7t5ZVc9Lsqu7X1hVT0jyliQ/nuR7klyQ5L5TGa/o7suq6oZp/S9Ntb0oyQumdd6d5OU9PblV9euZDQH6WpIXd/f7NuQJ2mQDH48bkjwgsyFbt2Y2pOvTG/AUAQAAwIYYKtC5N3f/IM9yOR4AAACw8YYacgUAAADAFuihAwAAAHCk0UMHAAAAYDACHQAAAIDBCHQAAAAABrNtnpW3b9/eO3fu3KBSAAAAAI48V1111Ze6+7h5tpkr0Nm5c2fW1tbmqwoAAACAfaqqG+fdxpArAAAAgMEIdAAAAAAGI9ABAAAAGIxABwAAAGAwAh0AAACAwQh0AAAAAAYj0AEAAAAYjEAHAAAAYDACHQAAAIDBCHQAAAAABiPQAQAAABiMQAcAAABgMAIdAAAAgMEIdAAAAAAGI9ABAAAAGIxABwAAAGAwAh0AAACAwQh0AAAAAAYj0AEAAAAYjEAHAAAAYDACHQAAAIDBCHQAAAAABiPQAQAAABiMQAcAAABgMAIdAAAAgMEIdAAAAAAGI9ABAAAAGIxABwAAAGAwAh0AAACAwcwV6Hz9llsWeue3XXjRQveXJJfsuW7h+1yEVa1rFW3F52orPibG53XJKtnf63EjrhfgUB3q69F7LnCk8z64eHMFOnctONC5/aKLF7q/JHnDB69f+D4XYVXrWkVb8bnaio+J8Xldskr293rciOsFOFSH+nr0ngsc6bwPLp4hVwAAAACDEegAAAAADGbbvBvs3XHCRtSxUKefd/myS+AwOYawObQ1RjHC9QcciPdcABZJDx0AAACAwQh0AAAAAAYz95CrHXtvWtidb1T36SvPP2dD9ns4dLGdzyoew8Ph+LOqtlpbY1wHep9c5PUHHI7DuX71ngscyXwmWjw9dAAAAAAGI9ABAAAAGIxABwAAAGAwcwU6Rx1//ELv/NiXvmSh+0uS55954sL3uQirWtcq2orP1VZ8TIzP65JVsr/X40ZcL8ChOtTXo/dc4EjnfXDxqrsPeuVdu3b12traBpYDAAAAcGSpqqu6e9c82xhyBQAAADAYgQ4AAADAYAQ6AAAAAIMR6AAAAAAMRqADAAAAMBiBDgAAAMBgBDoAAAAAgxHoAAAAAAxGoAMAAAAwGIEOAAAAwGAEOgAAAACDEegAAAAADEagAwAAADAYgQ4AAADAYAQ6AAAAAIMR6AAAAAAMRqADAAAAMBiBDgAAAMBgBDoAAAAAgxHoAAAAAAxGoAMAAAAwGIEOAAAAwGAEOgAAAACDEehsgtsuvGjZJQxvs55DxwruSbtg1Vyy57oh9gkAq8Z13dYi0NkEt1908bJLGN5mPYeOFdyTdsGqecMHrx9inwCwalzXbS0CHQAAAIDBCHQAAAAABiPQAQAAABjMtmUXcKTYu+OEZZfAQXKsAFbf6eddvuwSAGBIPu9sHXroAAAAAAxGoAMAAAAwGEOuNsmOvTctu4ShbWa3QMcKvpVuuayiK88/Z6H7M4QLgCOFzzsrqmruTfTQAQAAABiMQAcAAABgMAKdTXDsS1+y7BKGt1nPoWMF96RdsGqef+aJQ+wTAFaN67qtpbr7oFfetWtXr62tbWA5AAAAAEeWqrqqu3fNs40eOgAAAACDEegAAAAADEagAwAAADAYgQ4AAADAYAQ6AAAAAIMR6AAAAAAMRqADAAAAMBiBDgAAAMBgBDoAAAAAgxHoAAAAAAxGoAMAAAAwGIEOAAAAwGAEOgAAAACDEegAAAAADEagAwAAADAYgQ4AAADAYAQ6AAAAAIMR6AAAAAAMRqADAAAAMBiBDgAAAMBgBDoAAAAAgxHoAAAAAAxGoAMAAAAwGIEOAAAAwGAEOgAAAACDEegAAAAADEagAwAAADAYgQ4AAADAYAQ6AAAAAIOp7j74lav+PcmNG1cO3KvtSb607CKAQ6L9wpi0XRiTtgvjekx3HzvPBtvmWbm7j5uvHjh8VbXW3buWXQcwP+0XxqTtwpi0XRhXVa3Nu40hVwAAAACDEegAAAAADEagwwj+ZNkFAIdM+4UxabswJm0XxjV3+53rS5EBAAAAWD49dAAAAAAGI9BhpVTVG6vqi1X1qXXzHlxVV1TVv0x/v2OZNQL3tI+2u7uq9lbV1dPtKcusEbinqjqhqvZU1aer6tqqetE037kXVtx+2q/zL6ywqvq2qvpYVX1yarvnT/MfXlUfrarrqurtVXWfA+1LoMOqeVOSc+8272VJPtDdj0rygel/YLW8Kfdsu0lycXefMt3+epNrAg7sa0l+ubtPSnJ6khdU1Ulx7oUR7Kv9Js6/sMruTHJWd5+c5JQk51bV6UkuyKztPjLJfyV5/oF2JNBhpXT3h5L8591mPy3JpdP0pUl+clOLAg5oH20XWHHdfXN3f3yavj3JZ5LsiHMvrLz9tF9ghfXMHdO/x0y3TnJWkndO8w/q3CvQYQTHd/fN0/QXkhy/zGKAubywqv5pGpJlyAassKrameQJST4a514Yyt3ab+L8Cyutqo6uqquTfDHJFUmuT3Jrd39tWuXzOYiAVqDDUHr2s2x+mg3G8EdJTsysK+nNSS5cbjnAvlTV/ZO8K8mLu/u29cuce2G13Uv7df6FFdfdX+/uU5I8LMlpSb73UPYj0GEEt1TVQ5Nk+vvFJdcDHITuvmU6Wd2V5JLMTlbAiqmqYzL7MPiW7n73NNu5FwZwb+3X+RfG0d23JtmT5IwkD6qqbdOihyXZe6DtBTqM4LIkz52mn5vkL5dYC3CQvvFhcPL0JJ/a17rAclRVJXlDks9090XrFjn3worbV/t1/oXVVlXHVdWDpulvT/IjmX0H1p4kz5hWO6hzb8160cJqqKq3JjkzyfYktyQ5L8lfJHlHku9OcmOSn+1uX74KK2QfbffMzLp7d5Ibkvz8uu/kAFZAVf1Qkg8nuSbJXdPsX8vsezice2GF7af9PjvOv7Cyqur7M/vS46Mz62Tzju7+zap6RJK3JXlwkk8keU5337nffQl0AAAAAMZiyBUAAADAYAQ6AAAAAIMR6AAAAAAMRqADAAAAMBiBDgAAAMBgBDoAwMqrqodU1dXT7QtVtXeavqOqXrfs+gAANpufLQcAhlJVu5Pc0d2/u+xaAACWRQ8dAGBYVXVmVb1nmt5dVZdW1Yer6saq+qmqelVVXVNV76+qY6b1nlhVf1tVV1XV5VX10OU+CgCA+Ql0AICt5MQkZyX5iSRvTrKnux+f5H+TPHUKdf4wyTO6+4lJ3pjkt5dVLADAodq27AIAABbofd391aq6JsnRSd4/zb8myc4kj0nyuCRXVFWmdW5eQp0AAIdFoAMAbCV3Jkl331VVX+1vflngXZld91SSa7v7jGUVCACwCIZcAQBHks8lOa6qzkiSqjqmqh675JoAAOYm0AEAjhjd/ZUkz0hyQVV9MsnVSX5wuVUBAMzPz5YDAAAADEYPHQAAAIDBCHQAAAAABiPQAQAAABiMQAcAAABgMAIdAAAAgMEIdAAAAAAGI9ABAAAAGIxABwAAAGAw/w9yi/xWuRzNKQAAAABJRU5ErkJggg==",
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": null,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "groundtruth_rttm, _ = google.colab.files.upload().popitem()\n",
+ "groundtruths = load_rttm(groundtruth_rttm)\n",
+ "if OWN_FILE['audio'] in groundtruths:\n",
+ " groundtruth = groundtruths[OWN_FILE['audio']]\n",
+ "else:\n",
+ " _, groundtruth = groundtruths.popitem()\n",
+ "groundtruth"
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "5MclWK2GYnp_"
+ },
+ "source": [
+ "# Speaker diarization with `pyannote.pipeline`\n",
+ "\n",
+ "We are about to run a full speaker diarization pipeline, that includes speaker segmentation, speaker embedding, and a final clustering step. **Brace yourself!**\n",
+ "\n",
+ "To load the speaker diarization pipeline, \n",
+ "\n",
+ "* accept the user conditions on [hf.co/pyannote/speaker-diarization](https://hf.co/pyannote/speaker-diarization)\n",
+ "* accept the user conditions on [hf.co/pyannote/segmentation](https://hf.co/pyannote/segmentation)\n",
+ "* login using `notebook_login` below"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 301,
+ "referenced_widgets": [
+ "c8731777ce834e58a76a295076200cfc",
+ "859b12a6d95b4c6f987791ca848122b9",
+ "94756148d2e94a93ae233baba20af683",
+ "ba18cded436e486da34882d821d8f1eb",
+ "99898e6ee64a46bd832af112e79b58b7",
+ "79184c8c2a6f4b7493bb7f6983f18a09",
+ "ea95ffd922c0455d957120f034e541f8",
+ "13525aa369a9410a83343952ab511f3c",
+ "b2be65e192384c948fb8987d4cfca505",
+ "333b42ca7aa44788b1c22724eb11bcc3",
+ "0e382d66f09f4958a40baa7ab83c4ccb",
+ "6a45ce374e2e47ba9457d02e02522748",
+ "765485a1d3f941d28b79782dcffbf401",
+ "3499ef4dd9f243d9bef00b396e78ed69"
+ ]
},
- "df8dc69ca1cf4e57bfebf4762c0460f0": {
- "model_module": "@jupyter-widgets/base",
- "model_name": "LayoutModel",
- "model_module_version": "1.2.0",
- "state": {
- "_model_module": "@jupyter-widgets/base",
- "_model_module_version": "1.2.0",
- "_model_name": "LayoutModel",
- "_view_count": null,
- "_view_module": "@jupyter-widgets/base",
- "_view_module_version": "1.2.0",
- "_view_name": "LayoutView",
- "align_content": null,
- "align_items": null,
- "align_self": null,
- "border": null,
- "bottom": null,
- "display": null,
- "flex": null,
- "flex_flow": null,
- "grid_area": null,
- "grid_auto_columns": null,
- "grid_auto_flow": null,
- "grid_auto_rows": null,
- "grid_column": null,
- "grid_gap": null,
- "grid_row": null,
- "grid_template_areas": null,
- "grid_template_columns": null,
- "grid_template_rows": null,
- "height": null,
- "justify_content": null,
- "justify_items": null,
- "left": null,
- "margin": null,
- "max_height": null,
- "max_width": null,
- "min_height": null,
- "min_width": null,
- "object_fit": null,
- "object_position": null,
- "order": null,
- "overflow": null,
- "overflow_x": null,
- "overflow_y": null,
- "padding": null,
- "right": null,
- "top": null,
- "visibility": null,
- "width": null
- }
+ "id": "r5u7VMb-YnqB",
+ "outputId": "c714a997-d4f8-417a-e5ad-0a4924333859",
+ "vscode": {
+ "languageId": "python"
+ }
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Login successful\n",
+ "Your token has been saved to /root/.huggingface/token\n"
+ ]
+ }
+ ],
+ "source": [
+ "from huggingface_hub import notebook_login\n",
+ "notebook_login()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 273,
+ "referenced_widgets": [
+ "183c55d5d3ce4058ae338c81344547c5",
+ "70efa83bf3ea45b4bd8cc41f57613328",
+ "338747810ac74b4e83e356a01459c8a5",
+ "ac0bcfa1ef6e4e78a7769c4cb2e8762f",
+ "6efb7939bb954dc8ba116680139eb257",
+ "6242493d251a47609c0c44f1dbe82958",
+ "f439c1de68ac4c799d81fdb29d053d10",
+ "e4c1e9affaba4045a3ec903091b6f454",
+ "1946386483ed4947a2184cdb4ea6e434",
+ "549a30c85c47466eadedbd24da42e304",
+ "bedc7d916b9745f097094c5c51a81f06",
+ "d12f07e25bf5422facc38c3463700994",
+ "eae11f84c2644ada8295b445c924baec",
+ "bcf766d2a2c641f0aa2af596c7da1b18",
+ "74bf69aa6eaa4a8594b2ea9a0fb20957",
+ "2d7a0b901d7044d5b1f273a3e9bea560",
+ "2cbf0faadd4842c8b22e10541ff9de4e",
+ "ab32c7daa1d9404fb921f39fbc4fc05c",
+ "ee537ee5470f4d7b816a8c8f96948b4d",
+ "652e97509a914f3b914665c4889c6d11",
+ "ebc9801e164a44b3b6f8dc7f590e1c79",
+ "0821b47ae70444dfa38b84719c4836a6",
+ "c3358d32ac814ea6bc5714402c5bc62d",
+ "ecd8e5e364d34ea8bfbba4fbd467384d",
+ "0125df9fa8e14b3db0e2bce299529812",
+ "e3169ca885e04536a709d5751173ce9a",
+ "70abdfd99be84f7b9b8d24fee9eec022",
+ "554e567a83b348f88092c6ba01830930",
+ "6e334cad2e94462cae6e722bd6f11a9e",
+ "407e250e244b4985b1ce8c9d32a8af7d",
+ "8127c4258e374ad986ce1f8b4c70f704",
+ "358c3a67f8b54c4c899e095611fa116b",
+ "e1c9df12fa034c93a9b3530ea4a7c5aa",
+ "404f7ce06a01470fbb0b747981d00e84",
+ "38b3054ad59549e4b4f2de4697139a87",
+ "7d90af87c9574f5ca21fca058c39bf02",
+ "fee75343289f42fb8d6dfb4bf26fe368",
+ "f21c0c6379d74898ac6aadcb6fc14a8a",
+ "0adb304bf90f4079a4031caea1cfb924",
+ "40021e0b59fe4e1e9bac351dbec57c6c",
+ "ed169fd606274f2ebbb3e8f32ab42431",
+ "304e9682570b4abeb1719001c04449d6",
+ "16c0017f65b649f5ac5bebf1c955a1fd",
+ "5e2c207db5424f91829bf5c52040a9f2",
+ "8011d68253ac4080a637659ef3383dc4",
+ "e928540e99564d808cb2d12c92daa498",
+ "fc9a3c4ae0a947ec91a227360a80f602",
+ "f91dcd9f30c743d69f9d4b7e8d1beba5",
+ "6ede83f870a24e71b5182fcc458cdc42",
+ "c9974003727a401797953ef2885db5a2",
+ "77a361d1ff214e8799891bbeb28a0789",
+ "27f6f437c5264368bc2c679942ad1e53",
+ "e7728d9c55e44274966f8f6dbc445c54",
+ "2b2d7912186a49dd9891ae12c77482c7",
+ "1600b9cd09c446e581b7912e35c9f56e",
+ "28004251b0e44a6c9dfa7ce1b30dcb18",
+ "e98cf7a63c814ffd94f69928f0700ebf",
+ "6a4dee55cbae4959bd7fe3c4d92242b1",
+ "8dba487876124827919079519406ecb8",
+ "5c211704f90946afbae2f66a7586ce70",
+ "aba21021d3bb4565a58ffa40049810db",
+ "f7812fa7fbf744c1b261b985d085e28e",
+ "d7071582bfbe4ec4b2c3c9843e5481ae",
+ "0d80273cabbc42ba9a408fb1144151c9",
+ "67fcc38a1e5d4eb39381685447e397de",
+ "0b4bf8076fdf4d19843a3246c8bd61ac",
+ "d182e37b4a404158bee8446fc2728bd9",
+ "603e99f45afb4910a99f7684ffd21b6a",
+ "d13ba6030aff42bca48c72ff071c44c0",
+ "a899f4bc6ed842d397723cca582669e6",
+ "a02030ba8f324d93a7ed6cc793d70a3b",
+ "b26354d0278f447d92c7e1ad4c211d64",
+ "3bd33a372aad4c438f64d73c97f14c6a",
+ "c8e0c9a60ef34d2caee9d55a3c21c3d4",
+ "764aa53d75324d73ab06936c52fd8fc8",
+ "341615c971b04033b7293d82fc40f35c",
+ "17856a72e4e948039a66c51e8244cb50",
+ "41eb32a6fef141ff9cc3ce6e4d771822",
+ "0d10fb0edc9144b1a1fc1f2c9e322410",
+ "32accb0adfa24c62a75c15c8ec88df8c",
+ "bf299285318b4a04a88569cc581ecd75",
+ "ac2950d08fc145ba9eb9cf5824b1ee18",
+ "d33fba0d78fb41f983c55f5cd2a0a740",
+ "fd47487fc8734594823f8afa00c4239d",
+ "23d4e25ec6c541818d5927b69576d278",
+ "54d9456703324160aced03ee5fef2943",
+ "bacfb50c001047c4824a05c9f2ee2e40",
+ "c53a1cf68fcd4388abf1f0379891089a"
+ ]
},
- "799487c4c6de471c827f120f1c11d9e2": {
- "model_module": "@jupyter-widgets/controls",
- "model_name": "DescriptionStyleModel",
- "model_module_version": "1.5.0",
- "state": {
- "_model_module": "@jupyter-widgets/controls",
- "_model_module_version": "1.5.0",
- "_model_name": "DescriptionStyleModel",
- "_view_count": null,
- "_view_module": "@jupyter-widgets/base",
- "_view_module_version": "1.2.0",
- "_view_name": "StyleView",
- "description_width": ""
- }
+ "id": "lUq1UvoJYnqB",
+ "outputId": "8c052808-d0b2-4f2e-8771-f86114ae3fe3",
+ "vscode": {
+ "languageId": "python"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "183c55d5d3ce4058ae338c81344547c5",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "Downloading: 0%| | 0.00/500 [00:00, ?B/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
},
- "9d713ac6d10949fb8d277286d969ad3b": {
- "model_module": "@jupyter-widgets/controls",
- "model_name": "HBoxModel",
- "model_module_version": "1.5.0",
- "state": {
- "_dom_classes": [],
- "_model_module": "@jupyter-widgets/controls",
- "_model_module_version": "1.5.0",
- "_model_name": "HBoxModel",
- "_view_count": null,
- "_view_module": "@jupyter-widgets/controls",
- "_view_module_version": "1.5.0",
- "_view_name": "HBoxView",
- "box_style": "",
- "children": [
- "IPY_MODEL_e2be4344fe8e4a36be35513041ea74a3",
- "IPY_MODEL_2ed58d60a46d4f8491de7ad61d7cc589",
- "IPY_MODEL_4ea0432a604e4ac197999debb131c557"
- ],
- "layout": "IPY_MODEL_21cd4080794342dbb3209df737d4f835"
- }
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "d12f07e25bf5422facc38c3463700994",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "Downloading: 0%| | 0.00/17.7M [00:00, ?B/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
},
- "e2be4344fe8e4a36be35513041ea74a3": {
- "model_module": "@jupyter-widgets/controls",
- "model_name": "HTMLModel",
- "model_module_version": "1.5.0",
- "state": {
- "_dom_classes": [],
- "_model_module": "@jupyter-widgets/controls",
- "_model_module_version": "1.5.0",
- "_model_name": "HTMLModel",
- "_view_count": null,
- "_view_module": "@jupyter-widgets/controls",
- "_view_module_version": "1.5.0",
- "_view_name": "HTMLView",
- "description": "",
- "description_tooltip": null,
- "layout": "IPY_MODEL_5cdd23be0a804fd192b6ccaddcb52964",
- "placeholder": "",
- "style": "IPY_MODEL_889aca71e695487d9cd31c2dae585a64",
- "value": "Downloading: 100%"
- }
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "c3358d32ac814ea6bc5714402c5bc62d",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "Downloading: 0%| | 0.00/318 [00:00, ?B/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
},
- "2ed58d60a46d4f8491de7ad61d7cc589": {
- "model_module": "@jupyter-widgets/controls",
- "model_name": "FloatProgressModel",
- "model_module_version": "1.5.0",
- "state": {
- "_dom_classes": [],
- "_model_module": "@jupyter-widgets/controls",
- "_model_module_version": "1.5.0",
- "_model_name": "FloatProgressModel",
- "_view_count": null,
- "_view_module": "@jupyter-widgets/controls",
- "_view_module_version": "1.5.0",
- "_view_name": "ProgressView",
- "bar_style": "success",
- "description": "",
- "description_tooltip": null,
- "layout": "IPY_MODEL_b9fc636fcc6f4a2785999385cd340ab9",
- "max": 17719103,
- "min": 0,
- "orientation": "horizontal",
- "style": "IPY_MODEL_ebf9284b6e514698b8c7389c758f7520",
- "value": 17719103
- }
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "404f7ce06a01470fbb0b747981d00e84",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "Downloading: 0%| | 0.00/1.92k [00:00, ?B/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "8011d68253ac4080a637659ef3383dc4",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "Downloading: 0%| | 0.00/83.3M [00:00, ?B/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "28004251b0e44a6c9dfa7ce1b30dcb18",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "Downloading: 0%| | 0.00/1.92k [00:00, ?B/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "d182e37b4a404158bee8446fc2728bd9",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "Downloading: 0%| | 0.00/5.53M [00:00, ?B/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "41eb32a6fef141ff9cc3ce6e4d771822",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "Downloading: 0%| | 0.00/129k [00:00, ?B/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "from pyannote.audio import Pipeline\n",
+ "pipeline = Pipeline.from_pretrained('pyannote/speaker-diarization', use_auth_token=True)\n",
+ "diarization = pipeline(DEMO_FILE)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "xkicJRq-YnqB"
+ },
+ "source": [
+ "That's it? Yes, that's it :-)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 230
+ },
+ "id": "DPosdyGrYnqB",
+ "outputId": "45a2315e-6841-4de4-e54e-1f3da7cf2d46",
+ "vscode": {
+ "languageId": "python"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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AAAAAACQPIEHAAAAAACQPIEHAAAAAACQPIFHst6NiPv+8rU1jAPsr+3vrY/fz7wntr+3vqWnAkArlvr+JvX5U5ysKwDYP/ahh67t771T0P4FHsl6NyIeiIMTeByMcYD9tf29d2L5z39Q8B0GAIe21Pc3qc+f4mRdAcD+sQ89dG3fVNjzzAIPAAAAAAAgeQIPAAAAAAAgeSUtPQEO1JaIeK/A/QMp2PH+lqjZsrGlpwFAK7Xj/dZxXGh/SXNqLe8LAGgpjs0OPTs/2FrQ/gUeyftKS08AKBJz/9/VLT0FACh69pcAAMXDsdmh54Oduwrav0taAQAAAAAAyRN4AAAAAAAAyRN4AAAAAAAAyfMZHsn7YUT0K2D/r4fPCYE0fGbKg9Gl7wktPQ0AWqlNb61sFddYtr+kObWW9wUAtBTHZoeeP6x4KeLRCwrWv8AjeeUR0bXA/QMpaNepPDqUH97S0wCglWrXqXUcF9pf0pxay/sCAFqKY7NDT+lhnQvav0taAQAAAAAAyRN4AAAAAAAAyRN4AAAAAAAAyRN4AAAAAAAAyRN4JKt7RIz/y9fWMA6wvzp2PSI+8f9Nio5dj2jpqQDQiqW+v0l9/hQn6woA9o996KGrY5fCnmfOZVmWFaLjLVu2REVFRWzevDnKy8sLMQQAAAAAAJCIQucG/sIDAAAAAABInsADAAAAAABInsADAAAAAABInsADAAAAAABInsADAAAAAABInsADAAAAAABInsADAAAAAABInsADAAAAAABInsADAAAAAABInsADAAAAAABInsADAAAAAABInsADAAAAAABInsADAAAAAABInsADAAAAAABInsADAAAAAABInsADAAAAAABInsADAAAAAABInsADAAAAAABInsADAAAAAABInsADAAAAAABInsADAAAAAABInsADAAAAAABInsADAAAAAABInsADAAAAAABInsADAAAAAABInsADAAAAAABInsADAAAAAABInsADAAAAAABInsADAAAAAABInsADAAAAAABInsADAAAAAABInsADAAAAAABInsADAAAAAABInsADAAAAAABInsADAAAAAABInsADAAAAAABInsADAAAAAABInsADAAAAAABInsADAAAAAABInsADAAAAAABInsADAAAAAABIXkmhOs6yLCIitmzZUqghAAAAAACAROzOC3bnB82tYIHHhg0bIiKid+/ehRoCAAAAAABIzIYNG6KioqLZ+y1Y4HH44YdHRMSaNWsKMnEgDVu2bInevXvHH/7whygvL2/p6QAtQB0A1AEgQi0A1AEgYvPmzdGnT598ftDcChZ4tGnz548HqaioUMCAKC8vVwvgEKcOAOoAEKEWAOoA8Nf8oNn7LUivAAAAAAAAB5HAAwAAAAAASF7bW2655ZaCdd62bZx33nlRUlKwK2cBCVALAHUAUAeACLUAUAeAwtaBXJZlWbP3CgAAAAAAcBC5pBUAAAAAAJA8gQcAAAAAAJA8gQcAAAAAAJA8gQcAAAAAAJC8Jgcef/rTn+Lyyy+Pbt26RceOHWPgwIGxePHi/PYsy+Kmm26Knj17RseOHWPo0KHx+uuv1+lj48aN8YUvfCHKy8ujS5cu8aUvfSm2bdt24M8GOCgaqgOzZs2KYcOGRbdu3SKXy8XSpUvr9VFTUxOTJk2Kbt26RVlZWYwZMybWrVt3MJ8GcID2VQt27twZkydPjoEDB0anTp2iV69e8cUvfjHefvvtOn04JoC0NXRMcMstt0T//v2jU6dO0bVr1xg6dGgsXLiwTh/qAKStoTrwcddcc03kcrn4t3/7tzr3qwOQvoZqwZVXXhm5XK7ObcSIEXX6UAsgbY05Jnj11Vfj4osvjoqKiujUqVN88pOfjDVr1uS3N8f5wiYFHu+9916cffbZUVpaGk899VS88sorcdddd0XXrl3zbe688874/ve/H/fee28sXLgwOnXqFMOHD4+ampp8my984QuxYsWKmD17djzxxBPxv//7vzFhwoQmTRxoGY2pA++//36cc845cccdd+y1n+uvvz4ef/zxmDlzZjz//PPx9ttvxyWXXHIwngLQDBqqBR988EG89NJLceONN8ZLL70Us2bNipUrV8bFF19cpx/HBJCuxhwTHH/88XHPPffE73//+3jhhRfi6KOPjmHDhsU777yTb6MOQLoaUwd2e/TRR+PFF1+MXr161dumDkDaGlsLRowYEWvXrs3fHn744Trb1QJIV2PqwKpVq+Kcc86J/v37x3PPPRfLli2LG2+8MTp06JBv0yznC7MmmDx5cnbOOefsdXttbW1WVVWVfe9738vft2nTpqx9+/bZww8/nGVZlr3yyitZRGS//e1v822eeuqpLJfLZX/605+aMh2gBTRUBz5u9erVWURkL7/8cp37N23alJWWlmYzZ87M3/fqq69mEZEtWLCgWecLFEZTasFuixYtyiIie+utt7Isc0wAqdufOrB58+YsIrI5c+ZkWaYOQOoaWwf++Mc/ZkceeWS2fPnyrG/fvtnUqVPz29QBSF9jasEVV1yRjRo1aq/b1QJIW2PqwOc+97ns8ssv3+v25jpf2KS/8PjVr34VZ5xxRlx66aXRo0ePGDRoUDzwwAP57atXr47q6uoYOnRo/r6Kioo488wzY8GCBRERsWDBgujSpUucccYZ+TZDhw6NNm3a1PvzdqD4NFQHGmPJkiWxc+fOOrWif//+0adPn3ytAIrb/tSCzZs3Ry6Xiy5dukSEYwJIXVPrwI4dO+L++++PioqKOOWUUyJCHYDUNaYO1NbWxrhx4+KGG26Ik046qV4f6gCkr7HHBM8991z06NEjTjjhhJg4cWJs2LAhv00tgLQ1VAdqa2vjySefjOOPPz6GDx8ePXr0iDPPPDMee+yxfJvmOl/YpMDj//7v/+JHP/pR9OvXL55++umYOHFiXHfddTF9+vSIiKiuro6IiMrKyjqPq6yszG+rrq6OHj161NleUlIShx9+eL4NULwaqgONUV1dHe3atcuf9Nzt47UCKG5NrQU1NTUxefLkGDt2bJSXl0eEYwJIXWPrwBNPPBFlZWXRoUOHmDp1asyePTu6d+8eEeoApK4xdeCOO+6IkpKSuO666/bYhzoA6WtMLRgxYkT85Cc/iWeffTbuuOOOeP755+PCCy+MXbt2RYRaAKlrqA6sX78+tm3bFrfffnuMGDEinnnmmRg9enRccskl8fzzz0dE850vLGnKxGtra+OMM86I2267LSIiBg0aFMuXL4977703rrjiiqZ0BSRKHQAimlYLdu7cGZdddllkWRY/+tGPWmK6QAE0tg585jOfiaVLl8a7774bDzzwQFx22WWxcOHCeic1gPQ0VAeWLFkSd999d7z00kuRy+VaeLZAoTTmmODzn/98vv3AgQPj5JNPjr/7u7+L5557Ls4///wWmTfQfBqqA7W1tRERMWrUqLj++usjIuLUU0+N+fPnx7333hvnnntus82lSX/h0bNnzxgwYECd+0488cT8J6lXVVVFRNT75PR169blt1VVVcX69evrbP/oo49i48aN+TZA8WqoDjRGVVVV7NixIzZt2lTn/o/XCqC4NbYW7A473nrrrZg9e3b+rzsiHBNA6hpbBzp16hTHHXdcnHXWWTFt2rQoKSmJadOmRYQ6AKlrqA7Mmzcv1q9fH3369ImSkpIoKSmJt956K/75n/85jj766IhQB6A12J/zBMcee2x079493njjjYhQCyB1DdWB7t27R0lJSYPZQnOcL2xS4HH22WfHypUr69z32muvRd++fSMi4phjjomqqqp49tln89u3bNkSCxcujMGDB0dExODBg2PTpk2xZMmSfJtf//rXUVtbG2eeeWZTpgO0gIbqQGOcfvrpUVpaWqdWrFy5MtasWZOvFUBxa0wt2B12vP766zFnzpzo1q1bnfaOCSBt+3tMUFtbGx9++GFEqAOQuobqwLhx42LZsmWxdOnS/K1Xr15xww03xNNPPx0R6gC0BvtzTPDHP/4xNmzYED179owItQBS11AdaNeuXXzyk5/cZ5tmO1/Y6I83z7Js0aJFWUlJSXbrrbdmr7/+evbTn/40O+yww7IZM2bk29x+++1Zly5dsl/+8pfZsmXLslGjRmXHHHNMtn379nybESNGZIMGDcoWLlyYvfDCC1m/fv2ysWPHNmUqQAtpTB3YsGFD9vLLL2dPPvlkFhHZz372s+zll1/O1q5dm29zzTXXZH369Ml+/etfZ4sXL84GDx6cDR48uCWeErAfGqoFO3bsyC6++OLsqKOOypYuXZqtXbs2f/vwww/z/TgmgHQ1VAe2bduWffOb38wWLFiQvfnmm9nixYuzq666Kmvfvn22fPnyfD/qAKSrMT8b/K2+fftmU6dOrXOfOgBpa6gWbN26NfuXf/mXbMGCBdnq1auzOXPmZKeddlrWr1+/rKamJt+PWgDpaswxwaxZs7LS0tLs/vvvz15//fXs3//937O2bdtm8+bNy7dpjvOFTQo8sizLHn/88ewTn/hE1r59+6x///7Z/fffX2d7bW1tduONN2aVlZVZ+/bts/PPPz9buXJlnTYbNmzIxo4dm5WVlWXl5eXZVVddlW3durWpUwFaSEN14KGHHsoiot7t5ptvzrfZvn179pWvfCXr2rVrdthhh2WjR4+uE4gAxW9ftWD16tV7rAMRkc2dOzffzjEBpG1fdWD79u3Z6NGjs169emXt2rXLevbsmV188cXZokWL6vShDkDaGvrZ4G/tKfBQByB9+6oFH3zwQTZs2LDsiCOOyEpLS7O+fftm48ePz6qrq+v0oRZA2hpzTDBt2rTsuOOOyzp06JCdcsop2WOPPVZne3OcL8xlWZY14a9TAAAAAAAAik6TPsMDAAAAAACgGAk8AAAAAACA5Ak8AAAAAACA5Ak8AAAAAACA5Ak8AAAAAACA5Ak8AAAAAACA5Ak8AAAAAACA5Ak8AAAAAACA5Ak8AACAA3bllVfGP/7jP7b0NAAAgENYSUtPAAAAKG65XG6f22+++ea4++67I8uygzQjAACA+gQeAADAPq1duzb/70ceeSRuuummWLlyZf6+srKyKCsra4mpAURkWjEAAAKCSURBVAAA5LmkFQAAsE9VVVX5W0VFReRyuTr3lZWV1buk1XnnnRfXXnttfO1rX4uuXbtGZWVlPPDAA/H+++/HVVddFZ07d47jjjsunnrqqTpjLV++PC688MIoKyuLysrKGDduXLz77rsH+ykDAAAJEngAAAAFMX369OjevXssWrQorr322pg4cWJceuml8alPfSpeeumlGDZsWIwbNy4++OCDiIjYtGlTDBkyJAYNGhSLFy+O//mf/4l169bFZZdd1sLPBAAASIHAAwAAKIhTTjklpkyZEv369YtvfvOb0aFDh+jevXuMHz8++vXrFzfddFNs2LAhli1bFhER99xzTwwaNChuu+226N+/fwwaNCgefPDBmDt3brz22mst/GwAAIBi5zM8AACAgjj55JPz/27btm1069YtBg4cmL+vsrIyIiLWr18fERG/+93vYu7cuXv8PJBVq1bF8ccfX+AZAwAAKRN4AAAABVFaWlrn/7lcrs59uVwuIiJqa2sjImLbtm3x2c9+Nu644456ffXs2bOAMwUAAFoDgQcAAFAUTjvttPjFL34RRx99dJSU+FEFAABoGp/hAQAAFIVJkybFxo0bY+zYsfHb3/42Vq1aFU8//XRcddVVsWvXrpaeHgAAUOQEHgAAQFHo1atX/OY3v4ldu3bFsGHDYuDAgfG1r30tunTpEm3a+NEFAADYt1yWZVlLTwIAAAAAAOBA+DUpAAAAAAAgeQIPAAAAAAAgeQIPAAAAAAAgeQIPAAAAAAAgeQIPAAAAAAAgeQIPAAAAAAAgeQIPAAAAAAAgeQIPAAAAAAAgeQIPAAAAAAAgeQIPAAAAAAAgeQIPAAAAAAAgef8/bx6E89WIYcEAAAAASUVORK5CYII=",
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 8,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "diarization"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "DLhErS6wYnqB"
+ },
+ "source": [
+ "# Evaluation with `pyannote.metrics`\n",
+ "\n",
+ "Because groundtruth is available, we can evaluate the quality of the diarization pipeline by computing the [diarization error rate](http://pyannote.github.io/pyannote-metrics/reference.html#diarization)."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "vNHQRTUIYnqB",
+ "vscode": {
+ "languageId": "python"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "from pyannote.metrics.diarization import DiarizationErrorRate\n",
+ "metric = DiarizationErrorRate()\n",
+ "der = metric(groundtruth, diarization)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "9d0vKQ0fYnqB",
+ "outputId": "9a664753-cd84-4211-9153-d33e929bb252",
+ "vscode": {
+ "languageId": "python"
+ }
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "diarization error rate = 19.2%\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(f'diarization error rate = {100 * der:.1f}%')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "Xz5QJV9nYnqB"
+ },
+ "source": [
+ "This implementation of diarization error rate is brought to you by [`pyannote.metrics`](http://pyannote.github.io/pyannote-metrics/).\n",
+ "\n",
+ "It can also be used to improve visualization by find the optimal one-to-one mapping between groundtruth and hypothesized speakers."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 230
+ },
+ "id": "xMLf4mrYYnqB",
+ "outputId": "ed08bcc8-24c6-439c-a244-3a673ff480b0",
+ "vscode": {
+ "languageId": "python"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAABjwAAADyCAYAAAD5q2z1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nO3de5AV5Z038N/AXMAZZkBwBjBcjILoiooh5RLdjUYDWFS8ZF9NjKISy42E9baJL2tF0JiViJbFurqlJaWuMUG34rKJQY1Ro64ogaASNbKIBDAqIxFkuA/K9PuHL2czAWRmOIdznuHzqTpVTPczTz99+vSve/rL6S7LsiwLAAAAAACAhHUp9gAAAAAAAAD2lsADAAAAAABInsADAAAAAABInsADAAAAAABInsADAAAAAABInsADAAAAAABInsADAAAAAABInsADAAAAAABInsADAAAAAABInsADAAAAAABInsADAAAAAABInsADAAAAAABInsADAAAAAABInsADAAAAAABInsADAAAAAABInsADAAAAAABInsBjFy666KIoKyvb6fXWW2/tdt7YsWNzvz948OBdtrnppptybd5+++0YN25cHHDAAVFfXx9XX311fPzxx7n5q1atim984xsxdOjQ6NKlS1x55ZU7jXP27NkxcuTI6NmzZ1RXV8exxx4bDzzwQGHfnMSlsm0jItatWxeTJk2Kfv36RVVVVQwdOjQee+yxwr05Cdux7S699NKd5k2aNCnKysrioosuatW2VLbzDg899FCUlZXFmWeeuZfvBgAAAADsn8qLsdAPN23bp8vrVV3Z7t8ZO3Zs3Hfffa2mHXTQQbudV1VV1ernG264IS655JJW03r06BEREdu3b49x48ZF375948UXX4xVq1bFBRdcEBUVFTFt2rSIiGhubo6DDjoorr322pgxY8Yux3jggQfG9773vRg2bFhUVlbGnDlzYsKECVFfXx9jxoxp9zrvrabmpn26vLqqug79Xgrbdtu2bfHlL3856uvr4+GHH46DDz44Vq5cGT179uzQOu+tLU1b9+nyutd1a/fvDBgwIB566KGYMWNGdO/ePSIitm7dGrNmzYqBAwe2alsq23mHFStWxHe/+934m7/5m3avNwAAAADwiaIEHqfd/Mw+Xd5vvt/+i/9VVVXRt2/fds/boUePHrtt86tf/SreeOONeOqpp6KhoSGOPfbY+MEPfhCTJ0+O66+/PiorK2Pw4MFx2223RUTEvffeu8t+TjrppFY/X3HFFXH//ffH3LlzixJ4jH/8G/t0eY+c+WiHfi+FbXvvvffG2rVr48UXX4yKioqI+ORbB8Xyowse3qfL+9bPz2/37xx33HGxbNmymD17dpx33nkR8cm3oAYOHBiHHHJIq7alsp0jPglPzjvvvPj+978fzz//fKxbt649qw0AAAAA/H9uaVUE8+bNi+HDh0dDQ0Nu2pgxY2L9+vXx+9//vkN9ZlkWTz/9dCxZsiT+9m//Nl9DpZ3ytW0feeSRGDVqVEyaNCkaGhriqKOOimnTpsX27dsLMexO45vf/Garb27ce++9MWHChLwvJ5/78A033BD19fVx8cUX53uYAAAAALBfEXjsxpw5c6Kmpib3Ovvss3c7r6amJncbmx0mT568U5vnn38+IiIaGxtbXSiNiNzPjY2N7RpnU1NT1NTURGVlZYwbNy5uv/32+PKXv9yRVd5vpLBt//CHP8TDDz8c27dvj8ceeyymTJkSt956a/zzP/9zR1d7v3D++efH3LlzY+XKlbFy5cp44YUX4vzzd/62SKls57lz58Y999wTM2fObO+qAgAAAAB/oSi3tErBySefHHfeeWfu5+rq6t3Oi/jkeRp/7uqrr849JHmHgw8+OO/j7NGjRyxatCg2btwYTz/9dPzjP/5jfPazn93pdlf8rxS2bUtLS9TX18fdd98dXbt2jc997nPx7rvvxi233BLXXXddXpfVmRx00EExbty4+Pd///fIsizGjRsXffr02aldKWznDRs2xPjx42PmzJm7HCMAAAAA0D5FCTwe/78nF2Ox7VJdXR2HHXZYu+ft0KdPn9226du3byxYsKDVtPfffz83rz26dOmSW86xxx4bixcvjh/+8IdFCTweOG3WPl9mR6Swbfv16xcVFRXRtWvX3LQjjjgiGhsbY9u2bVFZWdnmvvLhgh/9n326vL3xzW9+M/7hH/4hIiL+7d/+bZdtSmE7L1u2LFasWBFf+cpXctNaWloiIqK8vDyWLFkShx56aJv6AgAAAACKFHj0qt63F2tLzahRo+LGG2+M1atXR319fUREPPnkk1FbWxtHHnnkXvXd0tISzc3N+Rhmu9VV1RVluaUkX9v2hBNO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vXr1yrW5+eab41//9V/jrrvuivnz50d1dXWMGTMmtm7dmmtz3nnnxe9///t48sknY86cOfHf//3f8fd///ftGjhQHG2pA5s2bYoTTzwxpk+fvtt+rrrqqvjFL34RP/3pT+O5556L9957L7761a/ui1UA8mBPtWDz5s3x8ssvx5QpU+Lll1+O2bNnx5IlS+L0009v1Y9zAkhXW84Jhg4dGnfccUe89tprMXfu3Bg8eHCMHj06/vSnP+XaqAOQrrbUgR3+67/+K37zm99E//79d5qnDkDa2loLxo4dG6tWrcq9HnzwwVbz1QJIV1vqwLJly+LEE0+MYcOGxbPPPhuvvvpqTJkyJbp165Zrk5frhVk7TJ48OTvxxBN3O7+lpSXr27dvdsstt+SmrVu3LquqqsoefPDBLMuy7I033sgiIvvtb3+ba/P4449nZWVl2bvvvtue4QBFsKc68OeWL1+eRUT2yiuvtJq+bt26rKKiIvvpT3+am7Z48eIsIrJ58+bldbxAYbSnFuywYMGCLCKylStXZlnmnABS15E60NTUlEVE9tRTT2VZpg5A6tpaB955553s4IMPzl5//fVs0KBB2YwZM3Lz1AFIX1tqwYUXXpidccYZu52vFkDa2lIHvva1r2Xnn3/+bufn63phu77h8cgjj8TIkSPj7LPPjvr6+hgxYkTMnDkzN3/58uXR2NgYp556am5aXV1dHH/88TFv3ryIiJg3b1707NkzRo4cmWtz6qmnRpcuXXb6ejtQevZUB9ripZdeio8++qhVrRg2bFgMHDgwVyuA0taRWtDU1BRlZWXRs2fPiHBOAKlrbx3Ytm1b3H333VFXVxfHHHNMRKgDkLq21IGWlpYYP358XH311fFXf/VXO/WhDkD62npO8Oyzz0Z9fX0cfvjhMXHixFizZk1unloAadtTHWhpaYlHH300hg4dGmPGjIn6+vo4/vjj42c/+1muTb6uF7Yr8PjDH/4Qd955ZwwZMiSeeOKJmDhxYlx++eVx//33R0REY2NjREQ0NDS0+r2GhobcvMbGxqivr281v7y8PA488MBcG6B07akOtEVjY2NUVlbmLnru8Oe1Aiht7a0FW7dujcmTJ8e5554btbW1EeGcAFLX1jowZ86cqKmpiW7dusWMGTPiySefjD59+kSEOgCpa0sdmD59epSXl8fll1++yz7UAUhfW2rB2LFj40c/+lE8/fTTMX369HjuuefitNNOi+3bt0eEWgCp21MdWL16dWzcuDFuuummGDt2bPzqV7+Ks846K7761a/Gc889FxH5u15Y3p6Bt7S0xMiRI2PatGkRETFixIh4/fXX46677ooLL7ywPV0BiVIHgIj21YKPPvoozjnnnMiyLO68885iDBcogLbWgZNPPjkWLVoUH3zwQcycOTPOOeecmD9//k4XNYD07KkOvPTSS3HbbbfFyy+/HGVlZUUeLVAobTkn+PrXv55rP3z48Dj66KPj0EMPjWeffTZOOeWUoowbyJ891YGWlpaIiDjjjDPiqquuioiIY489Nl588cW466674otf/GLextKub3j069cvjjzyyFbTjjjiiNyT1Pv27RsRsdOT099///3cvL59+8bq1atbzf/4449j7dq1uTZA6dpTHWiLvn37xrZt22LdunWtpv95rQBKW1trwY6wY+XKlfHkk0/mvt0R4ZwAUtfWOlBdXR2HHXZY/PVf/3Xcc889UV5eHvfcc09EqAOQuj3Vgeeffz5Wr14dAwcOjPLy8igvL4+VK1fGd77znRg8eHBEqAPQGXTkOsFnP/vZ6NOnT7z11lsRoRZA6vZUB/r06RPl5eV7zBbycb2wXYHHCSecEEuWLGk17c0334xBgwZFRMQhhxwSffv2jaeffjo3f/369TF//vwYNWpURESMGjUq1q1bFy+99FKuza9//etoaWmJ448/vj3DAYpgT3WgLT73uc9FRUVFq1qxZMmSePvtt3O1AihtbakFO8KOpUuXxlNPPRW9e/du1d45AaSto+cELS0t0dzcHBHqAKRuT3Vg/Pjx8eqrr8aiRYtyr/79+8fVV18dTzzxRESoA9AZdOSc4J133ok1a9ZEv379IkItgNTtqQ5UVlbG5z//+U9tk7frhW1+vHmWZQsWLMjKy8uzG2+8MVu6dGn2k5/8JDvggAOyH//4x7k2N910U9azZ8/s5z//efbqq69mZ5xxRnbIIYdkW7ZsybUZO3ZsNmLEiGz+/PnZ3LlzsyFDhmTnnntue4YCFElb6sCaNWuyV155JXv00UeziMgeeuih7JVXXslWrVqVa3PppZdmAwcOzH79619nCxcuzEaNGpWNGjWqGKsEdMCeasG2bduy008/PfvMZz6TLVq0KFu1alXu1dzcnOvHOQGka091YOPGjdk111yTzZs3L1uxYkW2cOHCbMKECVlVVVX2+uuv5/pRByBdbfnb4C8NGjQomzFjRqtp6gCkbU+1YMOGDdl3v/vdbN68edny5cuzp556KjvuuOOyIUOGZFu3bs31oxZAutpyTjB79uysoqIiu/vuu7OlS5dmt99+e9a1a9fs+eefz7XJx/XCdgUeWZZlv/jFL7Kjjjoqq6qqyoYNG5bdfffdrea3tLRkU6ZMyRoaGrKqqqrslFNOyZYsWdKqzZo1a7Jzzz03q6mpyWpra7MJEyZkGzZsaO9QgCLZUx247777sojY6XXdddfl2mzZsiX79re/nfXq1Ss74IADsrPOOqtVIAKUvk+rBcuXL99lHYiI7Jlnnsm1c04Aafu0OrBly5bsrLPOyvr3759VVlZm/fr1y04//fRswYIFrfpQByBte/rb4C/tKvBQByB9n1YLNm/enI0ePTo76KCDsoqKimzQoEHZJZdckjU2NrbqQy2AtLXlnOCee+7JDjvssKxbt27ZMccck/3sZz9rNT8f1wvLsizL2vHtFAAAAAAAgJLTrmd4AAAAAAAAlCKBBwAAAAAAkDyBBwAAAAAAkDyBBwAAAAAAkDyBBwAAAAAAkDyBBwAAAAAAkDyBBwAAAAAAkDyBBwAAsNcuuuiiOPPMM4s9DAAAYD9WXuwBAAAApa2srOxT51933XVx2223RZZl+2hEAAAAOxN4AAAAn2rVqlW5f//Hf/xHTJ06NZYsWZKbVlNTEzU1NcUYGgAAQI5bWgEAAJ+qb9++uVddXV2UlZW1mlZTU7PTLa1OOumkuOyyy+LKK6+MXr16RUNDQ8ycOTM2bdoUEyZMiB49esRhhx0Wjz/+eKtlvf7663HaaadFTU1NNDQ0xPjx4+ODDz7Y16sMAAAkSOABAAAUxP333x99+vSJBQsWxGWXXRYTJ06Ms88+O77whS/Eyy+/HKNHj47x48fH5s2bIyJi3bp18aUvfSlGjBgRCxcujF/+8pfx/vvvxznnnFPkNQEAAFIg8AAAAArimGOOiWuvvTaGDBkS11xzTXTr1i369OkTl1xySQwZMiSmTp0aa9asiVdffTUiIu64444YMWJETJs2LYYNGxYjRoyIe++9N5555pl48803i7w2AABAqfMMDwAAoCCOPvro3L+7du0avXv3juHDh+emNTQ0RETE6tWrIyLid7/7XTzzzDO7fB7IsmXLYujQoQUeMQAAkDKBBwAAUBAVFRWtfi4rK2s1raysLCIiWlpaIiJi48aN8ZWvfCWmT5++U1/9+vUr4EgBAIDOQOABAACUhOOOOy7+8z//MwYPHhzl5f5UAQAA2sczPAAAgJIwadKkWLt2bZx77rnx29/+NpYtWxZPPPFETJgwIbZv317s4QEAACVO4AEAAJSE/v37xwsvvBDbt2+P0aNHx/Dhw+PKK6+Mnj17Rpcu/nQBAAA+XVmWZVmxBwEAAAAAALA3/DcpAAAAAAAgeQIPAAAAAAAgeQIPAAAAAAAgedWHukUAAABXSURBVAIPAAAAAAAgeQIPAAAAAAAgeQIPAAAAAAAgeQIPAAAAAAAgeQIPAAAAAAAgeQIPAAAAAAAgeQIPAAAAAAAgeQIPAAAAAAAgeQIPAAAAAAAgef8P+AlOrStvWy0AAAAASUVORK5CYII=",
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 11,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "mapping = metric.optimal_mapping(groundtruth, diarization)\n",
+ "diarization.rename_labels(mapping=mapping)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 230
},
- "4ea0432a604e4ac197999debb131c557": {
+ "id": "Z0ewsLlQYnqB",
+ "outputId": "8a8cd040-ee1d-48f7-d4be-eef9e08e9e55",
+ "vscode": {
+ "languageId": "python"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAABjwAAADyCAYAAAD5q2z1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nO3de3RV5Zk/8CeQCzEhCRcDwXJTRLygoHQs6kztVAHrEmtntFJEpY5WB7V2quO4vNE6WmlrqaOzdGS0Y50q01bbsVbrXSvC4JVaKwuRCrZKoCYSAkJAsn9/8OPUlEsSck5Odvh81spaZO/3vPvd593nOfucL9m7IEmSJAAAAAAAAFKsR74HAAAAAAAA0FECDwAAAAAAIPUEHgAAAAAAQOoJPAAAAAAAgNQTeAAAAAAAAKkn8AAAAAAAAFJP4AEAAAAAAKSewAMAAAAAAEg9gQcAAAAAAJB6Ag8AAAAAACD1BB4AAAAAAEDqCTwAAAAAAIDUE3gAAAAAAACpJ/AAAAAAAABST+ABAAAAAACknsADAAAAAABIPYHHDpx99tlRUFCw3c9bb72103WTJk3KPH7YsGE7bHPjjTdm2rzzzjtx4oknxl577RXV1dVx2WWXxUcffZRZv3LlyvjSl74UI0eOjB49esQll1yy3TgfeOCBGDduXFRVVUVZWVmMGTMm7rnnntw+OSmXlrmNiFizZk3MmDEjampqoqSkJEaOHBkPP/xw7p6cFNs2d+eff/5262bMmBEFBQVx9tlnt2jbVeZ5m7lz50ZBQUF8/vOf7+Cz0b1le64jIubPnx+f+9znok+fPtGrV68YPXp0fO9734stW7a0aFdfXx9Tp06NioqKqKqqinPOOSfWrVuXWb9x48Y4++yzY/To0VFYWLjDuXzmmWd2OKba2tosPDsAAAAAe7bCfGz0g/WbOnV7fcqK2/2YSZMmxQ9+8IMWy/bee++drispKWnx+ze/+c0499xzWyzr3bt3RERs2bIlTjzxxBg4cGDMnz8/Vq5cGWeeeWYUFRXFDTfcEBERTU1Nsffee8dVV10Vs2fP3uEY+/btG1deeWWMGjUqiouL46GHHorp06dHdXV1TJw4sd373FENTQ2dur3Kksrdelwa5nbTpk1x/PHHR3V1dfz0pz+NffbZJ1asWBFVVVW7tc8dtaFhY6dur7SyV7sfM3jw4Jg7d27Mnj07SktLI2LrF9D33ntvDBkypEXbrjLP2yxfvjwuvfTS+Ou//ut273c2bamr69Tt9ezXb7cel825/tnPfhannXZaTJ8+PZ5++umoqqqKJ554Iv75n/85FixYED/+8Y+joKAgIiKmTp0aK1eujMcffzw2b94c06dPj/POOy/uvffeiNh6XJSWlsbFF18c999//y73YcmSJVFRUZH5vbq6ereeCwAAAAD+LC+BxwnffrpTt/d/32j/l/8lJSUxcODAdq/bpnfv3jtt89hjj8Ubb7wRTzzxRAwYMCDGjBkT1113XVx++eUxc+bMKC4ujmHDhsXNN98cERF33XXXDvs59thjW/z+1a9+Ne6+++6YN29eXgKPaY98qVO39+Dnf7lbj0vD3N51111RX18f8+fPj6KioojY+lcH+fLDM3/aqdv7yv+e0e7HHH744bFs2bJ44IEHYurUqRGx9a+ghgwZEsOHD2/RtqvMc8TWL8mnTp0a3/jGN+K5556LNWvWtGe3s6r20DGdur193v3Dbj0uW3O9fv36OPfcc2Py5Mlxxx13ZJb/wz/8QwwYMCAmT54cP/7xj+OLX/xiLF68OH71q1/Fiy++GOPGjYuIiFtuuSU+97nPxXe/+90YNGhQlJWVxW233RYREc8///wu57K6ujpvASYAAABAd+WSVnmwYMGCGD16dAwYMCCzbOLEibF27dr43e9+t1t9JkkSTz75ZCxZsiT+5m/+JltDpZ2yNbcPPvhgjB8/PmbMmBEDBgyIQw45JG644YbtLrFDS1/+8pdb/G/+u+66K6ZPn5717WTzNfzNb34zqqur45xzzsn2MLu1bMz1Y489FnV1dXHppZdut+6kk06KkSNHxn333RcRW+e8qqoqE3ZERBx33HHRo0ePWLhwYbvHP2bMmKipqYnjjz8+nn/++XY/HgAAAIDtCTx24qGHHory8vLMz6mnnrrTdeXl5ZnL2Gxz+eWXb9fmueeei4iI2traFl+URkTm9/Zex72hoSHKy8ujuLg4TjzxxLjlllvi+OOP351d3mOkYW5///vfx09/+tPYsmVLPPzww3H11VfHTTfdFP/6r/+6u7u9RzjjjDNi3rx5sWLFilixYkU8//zzccYZ2/+1SFeZ53nz5sWdd94Zc+bMae+u7vGyMddvvvlmREQceOCBO9zGqFGjMm1qa2u3u+xUYWFh9O3bt11zXlNTE7fffnvcf//9cf/998fgwYPj2GOPjVdeeaXNfQAAAACwY3m5pFUafOYzn8lcmiQioqysbKfrIrbeT+PjLrvsssyNc7fZZ599sj7O3r17x6JFi2LdunXx5JNPxj/90z/Fvvvuu93lrvizNMxtc3NzVFdXxx133BE9e/aMI444It599934zne+E9dee21Wt9Wd7L333nHiiSfGf/3Xf0WSJHHiiSdG//79t2vXFea5sbExpk2bFnPmzNnhGNm1bM51kiQ5HevHHXDAAXHAAQdkfj/qqKNi2bJlMXv27Ljnnns6bRwAAAAA3VFeAo9H/vkz+dhsu5SVlcWIESPavW6b/v3777TNwIED44UXXmixbNWqVZl17dGjR4/MdsaMGROLFy+Ob33rW3kJPO454d5O3+buSMPc1tTURFFRUfTs2TOz7MADD4za2trYtGlTFBcXt7mvbDjzh3/fqdvriC9/+ctx4YUXRkTEv//7v++wTVeY52XLlsXy5cvjpJNOyixrbm6OiK1/ObBkyZLYb7/92tRXtgx8bVGnbq+jOjrXI0eOjIiIxYsXx1FHHbXd+sWLF8dBBx0UEVvndfXq1S3Wf/TRR1FfX9/uuv2X/uqv/irmzZvXoT4AAAAAyFPg0aesc7+s7WrGjx8f119/faxevTpziZTHH388KioqMl+u7a7m5uZoamrKxjDbrbKkMi/b7UqyNbdHH3103HvvvdHc3Bw9emy98tybb74ZNTU1nR52RESUVvbq9G3urkmTJsWmTZuioKAgJk6cmJNtZGOeR40aFb/97W9bLLvqqquisbExbr755hg8eHDWx92anv36dfo2O6Kjcz1hwoTo27dv3HTTTdsFHg8++GAsXbo0rrvuuojYOudr1qyJl19+OY444oiIiHjqqaeiubk5jjzyyA7tx6JFi6KmpqZDfQAAAADgkla7pampabtrthcWFra4nEpjY+N2bfbaa6+oqKiICRMmxEEHHRTTpk2Lb3/721FbWxtXXXVVzJgxI0pKSjLtFy3a+r+t161bF3/6059i0aJFUVxcnPlC9Vvf+laMGzcu9ttvv2hqaoqHH3447rnnnu0u30LbdZW5veCCC+LWW2+Nr371q3HRRRfF0qVL44YbboiLL744V7vebfTs2TMWL16c+feOdIV5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0047LZIkidtuuy0fwwVyoK114DOf+UwsWrQo3n///ZgzZ06cdtppsXDhwu2+1ADSp7U68PLLL8fNN98cr7zyShQUFOR5tECutOWc4PTTT8+0Hz16dBx66KGx3377xTPPPBOf/exn8zJuIHtaqwPNzc0REXHyySfH1772tYiIGDNmTMyfPz9uv/32+PSnP521sbTrLzxqamrioIMOarHswAMPzNxJfeDAgRER2905fdWqVZl1AwcOjNWrV7dY/9FHH0V9fX2mDdB1tVYH2mLgwIGxadOmWLNmTYvlH68VQNfW1lqwLexYsWJFPP7445vo3U4AAAbjSURBVJm/7ohwTgBp19Y6UFZWFiNGjIhPfepTceedd0ZhYWHceeedEaEOQNq1Vgeee+65WL16dQwZMiQKCwujsLAwVqxYEV//+tdj2LBhEaEOQHewO98T7LvvvtG/f/946623IkItgLRrrQ70798/CgsLW80WsvF9YbsCj6OPPjqWLFnSYtmbb74ZQ4cOjYiI4cOHx8CBA+PJJ5/MrF+7dm0sXLgwxo8fHxER48ePjzVr1sTLL7+cafPUU09Fc3NzHHnkke0ZDpAHrdWBtjjiiCOiqKioRa1YsmRJvPPOO5laAXRtbakF28KOpUuXxhNPPBH9+vVr0d45AaTb7p4TNDc3R1NTU0SoA5B2rdWBadOmxWuvvRaLFi3K/AwaNCguu+yyePTRRyNCHYDuYHfOCf74xz9GXV1d1NTURIRaAGnXWh0oLi6OT37yk7tsk7XvC9t8e/MkSV544YWksLAwuf7665OlS5cmP/rRj5K99tor+e///u9MmxtvvDGpqqpK/vd//zd57bXXkpNPPjkZPnx4smHDhkybSZMmJWPHjk0WLlyYzJs3L9l///2TKVOmtGcoQJ60pQ7U1dUlr776avLLX/4yiYhk7ty5yauvvpqsXLky0+b8889PhgwZkjz11FPJSy+9lIwfPz4ZP358PnYJ2A2t1YJNmzYlkydPTj7xiU8kixYtSlauXJn5aWpqyvTjnADSq7U6sG7duuSKK65IFixYkCxfvjx56aWXkunTpyclJSXJ66+/nulHHYD0astng780dOjQZPbs2S2WqQOQbq3VgsbGxuTSSy9NFixYkLz99tvJE088kRx++OHJ/vvvn2zcuDHTj1oA6dWWc4IHHnggKSoqSu64445k6dKlyS233JL07Nkzee655zJtsvF9YbsCjyRJkl/84hfJIYcckpSUlCSjRo1K7rjjjhbrm5ubk6uvvjoZMGBAUlJSknz2s59NlixZ0qJNXV1dMmXKlKS8vDypqKhIpk+fnjQ2NrZ3KECetFYHfvCDHyQRsd3Ptddem2mzYcOG5B//8R+TPn36JHvttVdyyimntAhEgK5vV7Xg7bff3mEdiIjk6aefzrRzTgDptqs6sGHDhuSUU05JBg0alBQXFyc1NTXJ5MmTkxdeeKFFH+oApFtrnw3+0o4CD3UA0m9XteDDDz9MJkyYkOy9995JUVFRMnTo0OTcc89NamtrW/ShFkC6teWc4M4770xGjBiR9OrVKznssMOSn//85y3WZ+P7woIkSZJ2/HUKAAAAAABAl9Oue3gAAAAAAAB0RQIPAAAAAAAg9QQeAAAAAABA6gk8AAAAAACA1BN4AAAAAAAAqSfwAAAAAAAAUk/gAQAAAAAApJ7AAwAA6LCzzz47Pv/5z+d7GAAAwB6sMN8DAAAAuraCgoJdrr/22mvj5ptvjiRJOmlEAAAA2xN4AAAAu7Ry5crMv//nf/4nrrnmmliyZElmWXl5eZSXl+djaAAAABkuaQUAAOzSwIEDMz+VlZVRUFDQYll5efl2l7Q69thj46KLLopLLrkk+vTpEwMGDIg5c+bE+vXrY/r06dG7d+8YMWJEPPLIIy229frrr8cJJ5wQ5eXlMWDAgJg2bVq8//77nb3LAABACgk8AACAnLj77rujf//+8cILL8RFF10UF1xwQZx66qlx1FFHxSuvvBITJkyIadOmxYcffhgREWvWrIm//du/jbFjx8ZLL70Uv/rVr2LVqlVx2mmn5XlPAACANBB4AAAAOXHYYYfFVVddFfvvv39cccUV0atXr+jfv3+ce+65sf/++8c111wTdXV18dprr0VExK233hpjx46NG264IUaNGhVjx46Nu+66K55++ul4880387w3AABAV+ceHgAAQE4ceuihmX/37Nkz+vXrF6NHj84sGzBgQERErF69OiIifvOb38TTTz+9w/uBLFu2LEaOHJnjEQMAAGkm8AAAAHKiqKioxe8FBQUtlhUUFERERHNzc0RErFu3Lk466aSYNWvWdn3V1NTkcKQAAEB3IPAAAAC6hMMPPzzuv//+GDZsWBQW+qgCAAC0j3t4AAAAXcKMGTOivr4+pkyZEi+++GIsW7YsHn300Zg+fXps2bIl38MDAAC6OIEHAADQJQwaNCief/752LJlS0yYMCFGjx4dl1xySVRVVUWPHj66AAAAu1aQJEmS70EAAAAAAAB0hP8mBQAAAAAApJ7AAwAAAAAASD2BBwAAAAAAkHoCDwAAAAAAIPUEHgAAAAAAQOoJPAAAAAAAgNQTeAAAAAAAAKkn8AAAAAAAAFJP4AEAAAAAAKSewAMAAAAAAEg9gQcAAAAAAJB6Ag8AAAAAACD1/h//ffiQt3ubxgAAAABJRU5ErkJggg==",
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 12,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "groundtruth"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "MxlrTbyPYnqB"
+ },
+ "source": [
+ "# Going further \n",
+ "\n",
+ "We have only scratched the surface in this introduction. \n",
+ "\n",
+ "More details can be found in the [`pyannote.audio` Github repository](https://github.com/pyannote/pyannote-audio).\n"
+ ]
+ }
+ ],
+ "metadata": {
+ "accelerator": "GPU",
+ "colab": {
+ "include_colab_link": true,
+ "provenance": []
+ },
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "widgets": {
+ "application/vnd.jupyter.widget-state+json": {
+ "0125df9fa8e14b3db0e2bce299529812": {
"model_module": "@jupyter-widgets/controls",
- "model_name": "HTMLModel",
"model_module_version": "1.5.0",
+ "model_name": "FloatProgressModel",
"state": {
"_dom_classes": [],
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
- "_model_name": "HTMLModel",
+ "_model_name": "FloatProgressModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/controls",
"_view_module_version": "1.5.0",
- "_view_name": "HTMLView",
+ "_view_name": "ProgressView",
+ "bar_style": "success",
"description": "",
"description_tooltip": null,
- "layout": "IPY_MODEL_5749dba1be9b4eaaad17928a90ea411c",
- "placeholder": "",
- "style": "IPY_MODEL_f0f3451d91bf4c5a9a8e20623a7b528d",
- "value": " 17.7M/17.7M [00:00<00:00, 50.2MB/s]"
+ "layout": "IPY_MODEL_407e250e244b4985b1ce8c9d32a8af7d",
+ "max": 318,
+ "min": 0,
+ "orientation": "horizontal",
+ "style": "IPY_MODEL_8127c4258e374ad986ce1f8b4c70f704",
+ "value": 318
+ }
+ },
+ "0821b47ae70444dfa38b84719c4836a6": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_module_version": "1.5.0",
+ "model_name": "DescriptionStyleModel",
+ "state": {
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "DescriptionStyleModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "StyleView",
+ "description_width": ""
}
},
- "21cd4080794342dbb3209df737d4f835": {
+ "0adb304bf90f4079a4031caea1cfb924": {
"model_module": "@jupyter-widgets/base",
- "model_name": "LayoutModel",
"model_module_version": "1.2.0",
+ "model_name": "LayoutModel",
"state": {
"_model_module": "@jupyter-widgets/base",
"_model_module_version": "1.2.0",
@@ -502,77 +982,62 @@
"width": null
}
},
- "5cdd23be0a804fd192b6ccaddcb52964": {
- "model_module": "@jupyter-widgets/base",
- "model_name": "LayoutModel",
- "model_module_version": "1.2.0",
+ "0b4bf8076fdf4d19843a3246c8bd61ac": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_module_version": "1.5.0",
+ "model_name": "DescriptionStyleModel",
"state": {
- "_model_module": "@jupyter-widgets/base",
- "_model_module_version": "1.2.0",
- "_model_name": "LayoutModel",
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "DescriptionStyleModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/base",
"_view_module_version": "1.2.0",
- "_view_name": "LayoutView",
- "align_content": null,
- "align_items": null,
- "align_self": null,
- "border": null,
- "bottom": null,
- "display": null,
- "flex": null,
- "flex_flow": null,
- "grid_area": null,
- "grid_auto_columns": null,
- "grid_auto_flow": null,
- "grid_auto_rows": null,
- "grid_column": null,
- "grid_gap": null,
- "grid_row": null,
- "grid_template_areas": null,
- "grid_template_columns": null,
- "grid_template_rows": null,
- "height": null,
- "justify_content": null,
- "justify_items": null,
- "left": null,
- "margin": null,
- "max_height": null,
- "max_width": null,
- "min_height": null,
- "min_width": null,
- "object_fit": null,
- "object_position": null,
- "order": null,
- "overflow": null,
- "overflow_x": null,
- "overflow_y": null,
- "padding": null,
- "right": null,
- "top": null,
- "visibility": null,
- "width": null
+ "_view_name": "StyleView",
+ "description_width": ""
}
},
- "889aca71e695487d9cd31c2dae585a64": {
+ "0d10fb0edc9144b1a1fc1f2c9e322410": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_module_version": "1.5.0",
+ "model_name": "HTMLModel",
+ "state": {
+ "_dom_classes": [],
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "HTMLModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/controls",
+ "_view_module_version": "1.5.0",
+ "_view_name": "HTMLView",
+ "description": "",
+ "description_tooltip": null,
+ "layout": "IPY_MODEL_d33fba0d78fb41f983c55f5cd2a0a740",
+ "placeholder": "",
+ "style": "IPY_MODEL_fd47487fc8734594823f8afa00c4239d",
+ "value": "Downloading: 100%"
+ }
+ },
+ "0d80273cabbc42ba9a408fb1144151c9": {
"model_module": "@jupyter-widgets/controls",
- "model_name": "DescriptionStyleModel",
"model_module_version": "1.5.0",
+ "model_name": "ProgressStyleModel",
"state": {
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
- "_model_name": "DescriptionStyleModel",
+ "_model_name": "ProgressStyleModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/base",
"_view_module_version": "1.2.0",
"_view_name": "StyleView",
+ "bar_color": null,
"description_width": ""
}
},
- "b9fc636fcc6f4a2785999385cd340ab9": {
+ "0e382d66f09f4958a40baa7ab83c4ccb": {
"model_module": "@jupyter-widgets/base",
- "model_name": "LayoutModel",
"model_module_version": "1.2.0",
+ "model_name": "LayoutModel",
"state": {
"_model_module": "@jupyter-widgets/base",
"_model_module_version": "1.2.0",
@@ -621,26 +1086,40 @@
"width": null
}
},
- "ebf9284b6e514698b8c7389c758f7520": {
+ "13525aa369a9410a83343952ab511f3c": {
"model_module": "@jupyter-widgets/controls",
- "model_name": "ProgressStyleModel",
"model_module_version": "1.5.0",
+ "model_name": "DescriptionStyleModel",
"state": {
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
- "_model_name": "ProgressStyleModel",
+ "_model_name": "DescriptionStyleModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "StyleView",
+ "description_width": ""
+ }
+ },
+ "1600b9cd09c446e581b7912e35c9f56e": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_module_version": "1.5.0",
+ "model_name": "DescriptionStyleModel",
+ "state": {
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "DescriptionStyleModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/base",
"_view_module_version": "1.2.0",
"_view_name": "StyleView",
- "bar_color": null,
"description_width": ""
}
},
- "5749dba1be9b4eaaad17928a90ea411c": {
+ "16c0017f65b649f5ac5bebf1c955a1fd": {
"model_module": "@jupyter-widgets/base",
- "model_name": "LayoutModel",
"model_module_version": "1.2.0",
+ "model_name": "LayoutModel",
"state": {
"_model_module": "@jupyter-widgets/base",
"_model_module_version": "1.2.0",
@@ -689,10 +1168,10 @@
"width": null
}
},
- "f0f3451d91bf4c5a9a8e20623a7b528d": {
+ "17856a72e4e948039a66c51e8244cb50": {
"model_module": "@jupyter-widgets/controls",
- "model_name": "DescriptionStyleModel",
"model_module_version": "1.5.0",
+ "model_name": "DescriptionStyleModel",
"state": {
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
@@ -704,10 +1183,10 @@
"description_width": ""
}
},
- "0f8ee54b3031408da0281f7aa98eff25": {
+ "183c55d5d3ce4058ae338c81344547c5": {
"model_module": "@jupyter-widgets/controls",
- "model_name": "HBoxModel",
"model_module_version": "1.5.0",
+ "model_name": "HBoxModel",
"state": {
"_dom_classes": [],
"_model_module": "@jupyter-widgets/controls",
@@ -719,83 +1198,33 @@
"_view_name": "HBoxView",
"box_style": "",
"children": [
- "IPY_MODEL_ff89e65846414100b84b1f9cf8b70fd9",
- "IPY_MODEL_a950bac54c5742e79cd2de4fda29c2e0",
- "IPY_MODEL_3f5459fa25654a76bfec64d1dcb542b6"
+ "IPY_MODEL_70efa83bf3ea45b4bd8cc41f57613328",
+ "IPY_MODEL_338747810ac74b4e83e356a01459c8a5",
+ "IPY_MODEL_ac0bcfa1ef6e4e78a7769c4cb2e8762f"
],
- "layout": "IPY_MODEL_fa10eb9e43fd43a49934cdb4301aefff"
- }
- },
- "ff89e65846414100b84b1f9cf8b70fd9": {
- "model_module": "@jupyter-widgets/controls",
- "model_name": "HTMLModel",
- "model_module_version": "1.5.0",
- "state": {
- "_dom_classes": [],
- "_model_module": "@jupyter-widgets/controls",
- "_model_module_version": "1.5.0",
- "_model_name": "HTMLModel",
- "_view_count": null,
- "_view_module": "@jupyter-widgets/controls",
- "_view_module_version": "1.5.0",
- "_view_name": "HTMLView",
- "description": "",
- "description_tooltip": null,
- "layout": "IPY_MODEL_547cbb166dba40d1b626bd204ff3cf96",
- "placeholder": "",
- "style": "IPY_MODEL_a2aba4e8152c4fbda91bf59a42f25604",
- "value": "Downloading: 100%"
- }
- },
- "a950bac54c5742e79cd2de4fda29c2e0": {
- "model_module": "@jupyter-widgets/controls",
- "model_name": "FloatProgressModel",
- "model_module_version": "1.5.0",
- "state": {
- "_dom_classes": [],
- "_model_module": "@jupyter-widgets/controls",
- "_model_module_version": "1.5.0",
- "_model_name": "FloatProgressModel",
- "_view_count": null,
- "_view_module": "@jupyter-widgets/controls",
- "_view_module_version": "1.5.0",
- "_view_name": "ProgressView",
- "bar_style": "success",
- "description": "",
- "description_tooltip": null,
- "layout": "IPY_MODEL_69a8212dded54f79adf3f8b60b9eb000",
- "max": 318,
- "min": 0,
- "orientation": "horizontal",
- "style": "IPY_MODEL_25142cfd61084c128fe39adad5016109",
- "value": 318
+ "layout": "IPY_MODEL_6efb7939bb954dc8ba116680139eb257"
}
},
- "3f5459fa25654a76bfec64d1dcb542b6": {
+ "1946386483ed4947a2184cdb4ea6e434": {
"model_module": "@jupyter-widgets/controls",
- "model_name": "HTMLModel",
"model_module_version": "1.5.0",
+ "model_name": "ProgressStyleModel",
"state": {
- "_dom_classes": [],
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
- "_model_name": "HTMLModel",
+ "_model_name": "ProgressStyleModel",
"_view_count": null,
- "_view_module": "@jupyter-widgets/controls",
- "_view_module_version": "1.5.0",
- "_view_name": "HTMLView",
- "description": "",
- "description_tooltip": null,
- "layout": "IPY_MODEL_7e64327fa6e948edae034c8d52bb96b4",
- "placeholder": "",
- "style": "IPY_MODEL_32895abb57a7426aa089230aa49cfff2",
- "value": " 318/318 [00:00<00:00, 9.69kB/s]"
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "StyleView",
+ "bar_color": null,
+ "description_width": ""
}
},
- "fa10eb9e43fd43a49934cdb4301aefff": {
+ "23d4e25ec6c541818d5927b69576d278": {
"model_module": "@jupyter-widgets/base",
- "model_name": "LayoutModel",
"model_module_version": "1.2.0",
+ "model_name": "LayoutModel",
"state": {
"_model_module": "@jupyter-widgets/base",
"_model_module_version": "1.2.0",
@@ -844,10 +1273,10 @@
"width": null
}
},
- "547cbb166dba40d1b626bd204ff3cf96": {
+ "27f6f437c5264368bc2c679942ad1e53": {
"model_module": "@jupyter-widgets/base",
- "model_name": "LayoutModel",
"model_module_version": "1.2.0",
+ "model_name": "LayoutModel",
"state": {
"_model_module": "@jupyter-widgets/base",
"_model_module_version": "1.2.0",
@@ -896,25 +1325,32 @@
"width": null
}
},
- "a2aba4e8152c4fbda91bf59a42f25604": {
+ "28004251b0e44a6c9dfa7ce1b30dcb18": {
"model_module": "@jupyter-widgets/controls",
- "model_name": "DescriptionStyleModel",
"model_module_version": "1.5.0",
+ "model_name": "HBoxModel",
"state": {
+ "_dom_classes": [],
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
- "_model_name": "DescriptionStyleModel",
+ "_model_name": "HBoxModel",
"_view_count": null,
- "_view_module": "@jupyter-widgets/base",
- "_view_module_version": "1.2.0",
- "_view_name": "StyleView",
- "description_width": ""
+ "_view_module": "@jupyter-widgets/controls",
+ "_view_module_version": "1.5.0",
+ "_view_name": "HBoxView",
+ "box_style": "",
+ "children": [
+ "IPY_MODEL_e98cf7a63c814ffd94f69928f0700ebf",
+ "IPY_MODEL_6a4dee55cbae4959bd7fe3c4d92242b1",
+ "IPY_MODEL_8dba487876124827919079519406ecb8"
+ ],
+ "layout": "IPY_MODEL_5c211704f90946afbae2f66a7586ce70"
}
},
- "69a8212dded54f79adf3f8b60b9eb000": {
+ "2b2d7912186a49dd9891ae12c77482c7": {
"model_module": "@jupyter-widgets/base",
- "model_name": "LayoutModel",
"model_module_version": "1.2.0",
+ "model_name": "LayoutModel",
"state": {
"_model_module": "@jupyter-widgets/base",
"_model_module_version": "1.2.0",
@@ -963,26 +1399,62 @@
"width": null
}
},
- "25142cfd61084c128fe39adad5016109": {
- "model_module": "@jupyter-widgets/controls",
- "model_name": "ProgressStyleModel",
- "model_module_version": "1.5.0",
+ "2cbf0faadd4842c8b22e10541ff9de4e": {
+ "model_module": "@jupyter-widgets/base",
+ "model_module_version": "1.2.0",
+ "model_name": "LayoutModel",
"state": {
- "_model_module": "@jupyter-widgets/controls",
- "_model_module_version": "1.5.0",
- "_model_name": "ProgressStyleModel",
+ "_model_module": "@jupyter-widgets/base",
+ "_model_module_version": "1.2.0",
+ "_model_name": "LayoutModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/base",
"_view_module_version": "1.2.0",
- "_view_name": "StyleView",
- "bar_color": null,
- "description_width": ""
+ "_view_name": "LayoutView",
+ "align_content": null,
+ "align_items": null,
+ "align_self": null,
+ "border": null,
+ "bottom": null,
+ "display": null,
+ "flex": null,
+ "flex_flow": null,
+ "grid_area": null,
+ "grid_auto_columns": null,
+ "grid_auto_flow": null,
+ "grid_auto_rows": null,
+ "grid_column": null,
+ "grid_gap": null,
+ "grid_row": null,
+ "grid_template_areas": null,
+ "grid_template_columns": null,
+ "grid_template_rows": null,
+ "height": null,
+ "justify_content": null,
+ "justify_items": null,
+ "left": null,
+ "margin": null,
+ "max_height": null,
+ "max_width": null,
+ "min_height": null,
+ "min_width": null,
+ "object_fit": null,
+ "object_position": null,
+ "order": null,
+ "overflow": null,
+ "overflow_x": null,
+ "overflow_y": null,
+ "padding": null,
+ "right": null,
+ "top": null,
+ "visibility": null,
+ "width": null
}
},
- "7e64327fa6e948edae034c8d52bb96b4": {
+ "2d7a0b901d7044d5b1f273a3e9bea560": {
"model_module": "@jupyter-widgets/base",
- "model_name": "LayoutModel",
"model_module_version": "1.2.0",
+ "model_name": "LayoutModel",
"state": {
"_model_module": "@jupyter-widgets/base",
"_model_module_version": "1.2.0",
@@ -1031,68 +1503,65 @@
"width": null
}
},
- "32895abb57a7426aa089230aa49cfff2": {
+ "304e9682570b4abeb1719001c04449d6": {
"model_module": "@jupyter-widgets/controls",
- "model_name": "DescriptionStyleModel",
"model_module_version": "1.5.0",
+ "model_name": "ProgressStyleModel",
"state": {
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
- "_model_name": "DescriptionStyleModel",
+ "_model_name": "ProgressStyleModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/base",
"_view_module_version": "1.2.0",
"_view_name": "StyleView",
+ "bar_color": null,
"description_width": ""
}
},
- "747aa6596d1a4b04a6f77e38179776ad": {
+ "32accb0adfa24c62a75c15c8ec88df8c": {
"model_module": "@jupyter-widgets/controls",
- "model_name": "HBoxModel",
"model_module_version": "1.5.0",
+ "model_name": "FloatProgressModel",
"state": {
"_dom_classes": [],
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
- "_model_name": "HBoxModel",
+ "_model_name": "FloatProgressModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/controls",
"_view_module_version": "1.5.0",
- "_view_name": "HBoxView",
- "box_style": "",
- "children": [
- "IPY_MODEL_e65942656e2347eba0a3fe3ae872159b",
- "IPY_MODEL_6e5c84bfa614482b960be701f92ee22c",
- "IPY_MODEL_def1205f95274d3db0fafc9c8dd1c913"
- ],
- "layout": "IPY_MODEL_46a04e196f9e461bb43e541270022b8d"
+ "_view_name": "ProgressView",
+ "bar_style": "success",
+ "description": "",
+ "description_tooltip": null,
+ "layout": "IPY_MODEL_23d4e25ec6c541818d5927b69576d278",
+ "max": 128619,
+ "min": 0,
+ "orientation": "horizontal",
+ "style": "IPY_MODEL_54d9456703324160aced03ee5fef2943",
+ "value": 128619
}
},
- "e65942656e2347eba0a3fe3ae872159b": {
+ "333b42ca7aa44788b1c22724eb11bcc3": {
"model_module": "@jupyter-widgets/controls",
- "model_name": "HTMLModel",
"model_module_version": "1.5.0",
+ "model_name": "DescriptionStyleModel",
"state": {
- "_dom_classes": [],
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
- "_model_name": "HTMLModel",
+ "_model_name": "DescriptionStyleModel",
"_view_count": null,
- "_view_module": "@jupyter-widgets/controls",
- "_view_module_version": "1.5.0",
- "_view_name": "HTMLView",
- "description": "",
- "description_tooltip": null,
- "layout": "IPY_MODEL_18a02eecf49746cc972882c2cca9ded2",
- "placeholder": "",
- "style": "IPY_MODEL_31e65957ea204c1084119e3e39528832",
- "value": "Downloading: 100%"
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "StyleView",
+ "description_width": ""
}
},
- "6e5c84bfa614482b960be701f92ee22c": {
+ "338747810ac74b4e83e356a01459c8a5": {
"model_module": "@jupyter-widgets/controls",
- "model_name": "FloatProgressModel",
"model_module_version": "1.5.0",
+ "model_name": "FloatProgressModel",
"state": {
"_dom_classes": [],
"_model_module": "@jupyter-widgets/controls",
@@ -1105,39 +1574,18 @@
"bar_style": "success",
"description": "",
"description_tooltip": null,
- "layout": "IPY_MODEL_aa6ccf1390cc4139b7ba23ea7129b273",
- "max": 1920,
+ "layout": "IPY_MODEL_e4c1e9affaba4045a3ec903091b6f454",
+ "max": 500,
"min": 0,
"orientation": "horizontal",
- "style": "IPY_MODEL_264cde3fae9d442abdb74b4d45288be3",
- "value": 1920
+ "style": "IPY_MODEL_1946386483ed4947a2184cdb4ea6e434",
+ "value": 500
}
},
- "def1205f95274d3db0fafc9c8dd1c913": {
- "model_module": "@jupyter-widgets/controls",
- "model_name": "HTMLModel",
- "model_module_version": "1.5.0",
- "state": {
- "_dom_classes": [],
- "_model_module": "@jupyter-widgets/controls",
- "_model_module_version": "1.5.0",
- "_model_name": "HTMLModel",
- "_view_count": null,
- "_view_module": "@jupyter-widgets/controls",
- "_view_module_version": "1.5.0",
- "_view_name": "HTMLView",
- "description": "",
- "description_tooltip": null,
- "layout": "IPY_MODEL_2c28a61cfa474c7498a8381e74639530",
- "placeholder": "",
- "style": "IPY_MODEL_5895a4011e3143a1931566822a65fd50",
- "value": " 1.92k/1.92k [00:00<00:00, 61.7kB/s]"
- }
- },
- "46a04e196f9e461bb43e541270022b8d": {
+ "341615c971b04033b7293d82fc40f35c": {
"model_module": "@jupyter-widgets/base",
- "model_name": "LayoutModel",
"model_module_version": "1.2.0",
+ "model_name": "LayoutModel",
"state": {
"_model_module": "@jupyter-widgets/base",
"_model_module_version": "1.2.0",
@@ -1186,10 +1634,25 @@
"width": null
}
},
- "18a02eecf49746cc972882c2cca9ded2": {
+ "3499ef4dd9f243d9bef00b396e78ed69": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_module_version": "1.5.0",
+ "model_name": "DescriptionStyleModel",
+ "state": {
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "DescriptionStyleModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "StyleView",
+ "description_width": ""
+ }
+ },
+ "358c3a67f8b54c4c899e095611fa116b": {
"model_module": "@jupyter-widgets/base",
- "model_name": "LayoutModel",
"model_module_version": "1.2.0",
+ "model_name": "LayoutModel",
"state": {
"_model_module": "@jupyter-widgets/base",
"_model_module_version": "1.2.0",
@@ -1238,10 +1701,46 @@
"width": null
}
},
- "31e65957ea204c1084119e3e39528832": {
+ "38b3054ad59549e4b4f2de4697139a87": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_module_version": "1.5.0",
+ "model_name": "HTMLModel",
+ "state": {
+ "_dom_classes": [],
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "HTMLModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/controls",
+ "_view_module_version": "1.5.0",
+ "_view_name": "HTMLView",
+ "description": "",
+ "description_tooltip": null,
+ "layout": "IPY_MODEL_0adb304bf90f4079a4031caea1cfb924",
+ "placeholder": "",
+ "style": "IPY_MODEL_40021e0b59fe4e1e9bac351dbec57c6c",
+ "value": "Downloading: 100%"
+ }
+ },
+ "3bd33a372aad4c438f64d73c97f14c6a": {
"model_module": "@jupyter-widgets/controls",
+ "model_module_version": "1.5.0",
"model_name": "DescriptionStyleModel",
+ "state": {
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "DescriptionStyleModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "StyleView",
+ "description_width": ""
+ }
+ },
+ "40021e0b59fe4e1e9bac351dbec57c6c": {
+ "model_module": "@jupyter-widgets/controls",
"model_module_version": "1.5.0",
+ "model_name": "DescriptionStyleModel",
"state": {
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
@@ -1253,10 +1752,32 @@
"description_width": ""
}
},
- "aa6ccf1390cc4139b7ba23ea7129b273": {
+ "404f7ce06a01470fbb0b747981d00e84": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_module_version": "1.5.0",
+ "model_name": "HBoxModel",
+ "state": {
+ "_dom_classes": [],
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "HBoxModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/controls",
+ "_view_module_version": "1.5.0",
+ "_view_name": "HBoxView",
+ "box_style": "",
+ "children": [
+ "IPY_MODEL_38b3054ad59549e4b4f2de4697139a87",
+ "IPY_MODEL_7d90af87c9574f5ca21fca058c39bf02",
+ "IPY_MODEL_fee75343289f42fb8d6dfb4bf26fe368"
+ ],
+ "layout": "IPY_MODEL_f21c0c6379d74898ac6aadcb6fc14a8a"
+ }
+ },
+ "407e250e244b4985b1ce8c9d32a8af7d": {
"model_module": "@jupyter-widgets/base",
- "model_name": "LayoutModel",
"model_module_version": "1.2.0",
+ "model_name": "LayoutModel",
"state": {
"_model_module": "@jupyter-widgets/base",
"_model_module_version": "1.2.0",
@@ -1305,26 +1826,32 @@
"width": null
}
},
- "264cde3fae9d442abdb74b4d45288be3": {
+ "41eb32a6fef141ff9cc3ce6e4d771822": {
"model_module": "@jupyter-widgets/controls",
- "model_name": "ProgressStyleModel",
"model_module_version": "1.5.0",
+ "model_name": "HBoxModel",
"state": {
+ "_dom_classes": [],
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
- "_model_name": "ProgressStyleModel",
+ "_model_name": "HBoxModel",
"_view_count": null,
- "_view_module": "@jupyter-widgets/base",
- "_view_module_version": "1.2.0",
- "_view_name": "StyleView",
- "bar_color": null,
- "description_width": ""
+ "_view_module": "@jupyter-widgets/controls",
+ "_view_module_version": "1.5.0",
+ "_view_name": "HBoxView",
+ "box_style": "",
+ "children": [
+ "IPY_MODEL_0d10fb0edc9144b1a1fc1f2c9e322410",
+ "IPY_MODEL_32accb0adfa24c62a75c15c8ec88df8c",
+ "IPY_MODEL_bf299285318b4a04a88569cc581ecd75"
+ ],
+ "layout": "IPY_MODEL_ac2950d08fc145ba9eb9cf5824b1ee18"
}
},
- "2c28a61cfa474c7498a8381e74639530": {
+ "549a30c85c47466eadedbd24da42e304": {
"model_module": "@jupyter-widgets/base",
- "model_name": "LayoutModel",
"model_module_version": "1.2.0",
+ "model_name": "LayoutModel",
"state": {
"_model_module": "@jupyter-widgets/base",
"_model_module_version": "1.2.0",
@@ -1373,113 +1900,26 @@
"width": null
}
},
- "5895a4011e3143a1931566822a65fd50": {
+ "54d9456703324160aced03ee5fef2943": {
"model_module": "@jupyter-widgets/controls",
- "model_name": "DescriptionStyleModel",
"model_module_version": "1.5.0",
+ "model_name": "ProgressStyleModel",
"state": {
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
- "_model_name": "DescriptionStyleModel",
+ "_model_name": "ProgressStyleModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/base",
"_view_module_version": "1.2.0",
"_view_name": "StyleView",
+ "bar_color": null,
"description_width": ""
}
},
- "43ada2ceb8ad44d7b8c1a3a1d0aefe2d": {
- "model_module": "@jupyter-widgets/controls",
- "model_name": "HBoxModel",
- "model_module_version": "1.5.0",
- "state": {
- "_dom_classes": [],
- "_model_module": "@jupyter-widgets/controls",
- "_model_module_version": "1.5.0",
- "_model_name": "HBoxModel",
- "_view_count": null,
- "_view_module": "@jupyter-widgets/controls",
- "_view_module_version": "1.5.0",
- "_view_name": "HBoxView",
- "box_style": "",
- "children": [
- "IPY_MODEL_42b71601aeef4271ac150288a78bf66a",
- "IPY_MODEL_300b503e606147bb8bc9ff7a98be0bac",
- "IPY_MODEL_dcce36fe0b0946aaa484ae1f5f7eb6da"
- ],
- "layout": "IPY_MODEL_5beb3def5ae64f05b3ceb26c611dcb79"
- }
- },
- "42b71601aeef4271ac150288a78bf66a": {
- "model_module": "@jupyter-widgets/controls",
- "model_name": "HTMLModel",
- "model_module_version": "1.5.0",
- "state": {
- "_dom_classes": [],
- "_model_module": "@jupyter-widgets/controls",
- "_model_module_version": "1.5.0",
- "_model_name": "HTMLModel",
- "_view_count": null,
- "_view_module": "@jupyter-widgets/controls",
- "_view_module_version": "1.5.0",
- "_view_name": "HTMLView",
- "description": "",
- "description_tooltip": null,
- "layout": "IPY_MODEL_030181ab29c149dfaf4940ea2c713190",
- "placeholder": "",
- "style": "IPY_MODEL_cdec3493e32e49a1abc5f3c6783a49d9",
- "value": "Downloading: 100%"
- }
- },
- "300b503e606147bb8bc9ff7a98be0bac": {
- "model_module": "@jupyter-widgets/controls",
- "model_name": "FloatProgressModel",
- "model_module_version": "1.5.0",
- "state": {
- "_dom_classes": [],
- "_model_module": "@jupyter-widgets/controls",
- "_model_module_version": "1.5.0",
- "_model_name": "FloatProgressModel",
- "_view_count": null,
- "_view_module": "@jupyter-widgets/controls",
- "_view_module_version": "1.5.0",
- "_view_name": "ProgressView",
- "bar_style": "success",
- "description": "",
- "description_tooltip": null,
- "layout": "IPY_MODEL_b0efbf56235f4f9f866137c85ea2e189",
- "max": 83316686,
- "min": 0,
- "orientation": "horizontal",
- "style": "IPY_MODEL_12bee4747bc74073bf4cbfd36f0445cb",
- "value": 83316686
- }
- },
- "dcce36fe0b0946aaa484ae1f5f7eb6da": {
- "model_module": "@jupyter-widgets/controls",
- "model_name": "HTMLModel",
- "model_module_version": "1.5.0",
- "state": {
- "_dom_classes": [],
- "_model_module": "@jupyter-widgets/controls",
- "_model_module_version": "1.5.0",
- "_model_name": "HTMLModel",
- "_view_count": null,
- "_view_module": "@jupyter-widgets/controls",
- "_view_module_version": "1.5.0",
- "_view_name": "HTMLView",
- "description": "",
- "description_tooltip": null,
- "layout": "IPY_MODEL_cb0fc23346fa4b638c3cce496ac6cd70",
- "placeholder": "",
- "style": "IPY_MODEL_0200715daa5e4f4e8f7839d2ea579f19",
- "value": " 83.3M/83.3M [00:03<00:00, 35.1MB/s]"
- }
- },
- "5beb3def5ae64f05b3ceb26c611dcb79": {
+ "554e567a83b348f88092c6ba01830930": {
"model_module": "@jupyter-widgets/base",
- "model_name": "LayoutModel",
"model_module_version": "1.2.0",
+ "model_name": "LayoutModel",
"state": {
"_model_module": "@jupyter-widgets/base",
"_model_module_version": "1.2.0",
@@ -1528,10 +1968,10 @@
"width": null
}
},
- "030181ab29c149dfaf4940ea2c713190": {
+ "5c211704f90946afbae2f66a7586ce70": {
"model_module": "@jupyter-widgets/base",
- "model_name": "LayoutModel",
"model_module_version": "1.2.0",
+ "model_name": "LayoutModel",
"state": {
"_model_module": "@jupyter-widgets/base",
"_model_module_version": "1.2.0",
@@ -1580,10 +2020,10 @@
"width": null
}
},
- "cdec3493e32e49a1abc5f3c6783a49d9": {
+ "5e2c207db5424f91829bf5c52040a9f2": {
"model_module": "@jupyter-widgets/controls",
- "model_name": "DescriptionStyleModel",
"model_module_version": "1.5.0",
+ "model_name": "DescriptionStyleModel",
"state": {
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
@@ -1595,10 +2035,31 @@
"description_width": ""
}
},
- "b0efbf56235f4f9f866137c85ea2e189": {
+ "603e99f45afb4910a99f7684ffd21b6a": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_module_version": "1.5.0",
+ "model_name": "HTMLModel",
+ "state": {
+ "_dom_classes": [],
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "HTMLModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/controls",
+ "_view_module_version": "1.5.0",
+ "_view_name": "HTMLView",
+ "description": "",
+ "description_tooltip": null,
+ "layout": "IPY_MODEL_b26354d0278f447d92c7e1ad4c211d64",
+ "placeholder": "",
+ "style": "IPY_MODEL_3bd33a372aad4c438f64d73c97f14c6a",
+ "value": "Downloading: 100%"
+ }
+ },
+ "6242493d251a47609c0c44f1dbe82958": {
"model_module": "@jupyter-widgets/base",
- "model_name": "LayoutModel",
"model_module_version": "1.2.0",
+ "model_name": "LayoutModel",
"state": {
"_model_module": "@jupyter-widgets/base",
"_model_module_version": "1.2.0",
@@ -1647,10 +2108,10 @@
"width": null
}
},
- "12bee4747bc74073bf4cbfd36f0445cb": {
+ "652e97509a914f3b914665c4889c6d11": {
"model_module": "@jupyter-widgets/controls",
- "model_name": "ProgressStyleModel",
"model_module_version": "1.5.0",
+ "model_name": "ProgressStyleModel",
"state": {
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
@@ -1663,10 +2124,10 @@
"description_width": ""
}
},
- "cb0fc23346fa4b638c3cce496ac6cd70": {
+ "67fcc38a1e5d4eb39381685447e397de": {
"model_module": "@jupyter-widgets/base",
- "model_name": "LayoutModel",
"model_module_version": "1.2.0",
+ "model_name": "LayoutModel",
"state": {
"_model_module": "@jupyter-widgets/base",
"_model_module_version": "1.2.0",
@@ -1715,68 +2176,26 @@
"width": null
}
},
- "0200715daa5e4f4e8f7839d2ea579f19": {
+ "6a45ce374e2e47ba9457d02e02522748": {
"model_module": "@jupyter-widgets/controls",
- "model_name": "DescriptionStyleModel",
"model_module_version": "1.5.0",
+ "model_name": "ButtonStyleModel",
"state": {
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
- "_model_name": "DescriptionStyleModel",
+ "_model_name": "ButtonStyleModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/base",
"_view_module_version": "1.2.0",
"_view_name": "StyleView",
- "description_width": ""
- }
- },
- "892182c8c97d426d9acf5467d1354d32": {
- "model_module": "@jupyter-widgets/controls",
- "model_name": "HBoxModel",
- "model_module_version": "1.5.0",
- "state": {
- "_dom_classes": [],
- "_model_module": "@jupyter-widgets/controls",
- "_model_module_version": "1.5.0",
- "_model_name": "HBoxModel",
- "_view_count": null,
- "_view_module": "@jupyter-widgets/controls",
- "_view_module_version": "1.5.0",
- "_view_name": "HBoxView",
- "box_style": "",
- "children": [
- "IPY_MODEL_32acc8ab3c5643d7a4c3595fd67da269",
- "IPY_MODEL_3c3189d90a404112ac7f6081acab7e61",
- "IPY_MODEL_34e0fb65b69d470099506bd24362c52c"
- ],
- "layout": "IPY_MODEL_c697909d569d40918acd835108e29ae7"
+ "button_color": null,
+ "font_weight": ""
}
},
- "32acc8ab3c5643d7a4c3595fd67da269": {
+ "6a4dee55cbae4959bd7fe3c4d92242b1": {
"model_module": "@jupyter-widgets/controls",
- "model_name": "HTMLModel",
"model_module_version": "1.5.0",
- "state": {
- "_dom_classes": [],
- "_model_module": "@jupyter-widgets/controls",
- "_model_module_version": "1.5.0",
- "_model_name": "HTMLModel",
- "_view_count": null,
- "_view_module": "@jupyter-widgets/controls",
- "_view_module_version": "1.5.0",
- "_view_name": "HTMLView",
- "description": "",
- "description_tooltip": null,
- "layout": "IPY_MODEL_d690ed1451e74799a2c4c265cd562ed9",
- "placeholder": "",
- "style": "IPY_MODEL_f89679f445424ec1ba2203fb8f7753de",
- "value": "Downloading: 100%"
- }
- },
- "3c3189d90a404112ac7f6081acab7e61": {
- "model_module": "@jupyter-widgets/controls",
"model_name": "FloatProgressModel",
- "model_module_version": "1.5.0",
"state": {
"_dom_classes": [],
"_model_module": "@jupyter-widgets/controls",
@@ -1789,39 +2208,33 @@
"bar_style": "success",
"description": "",
"description_tooltip": null,
- "layout": "IPY_MODEL_735b5f02606d4c0288f70469a8ab2902",
+ "layout": "IPY_MODEL_d7071582bfbe4ec4b2c3c9843e5481ae",
"max": 1921,
"min": 0,
"orientation": "horizontal",
- "style": "IPY_MODEL_0308a7a44b8b4a9cae7bda21fbad99f5",
+ "style": "IPY_MODEL_0d80273cabbc42ba9a408fb1144151c9",
"value": 1921
}
},
- "34e0fb65b69d470099506bd24362c52c": {
+ "6e334cad2e94462cae6e722bd6f11a9e": {
"model_module": "@jupyter-widgets/controls",
- "model_name": "HTMLModel",
"model_module_version": "1.5.0",
+ "model_name": "DescriptionStyleModel",
"state": {
- "_dom_classes": [],
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
- "_model_name": "HTMLModel",
+ "_model_name": "DescriptionStyleModel",
"_view_count": null,
- "_view_module": "@jupyter-widgets/controls",
- "_view_module_version": "1.5.0",
- "_view_name": "HTMLView",
- "description": "",
- "description_tooltip": null,
- "layout": "IPY_MODEL_967a5451e89049b4ac4688338495b50e",
- "placeholder": "",
- "style": "IPY_MODEL_bb655ffda271431892bba5ebab9fd93b",
- "value": " 1.92k/1.92k [00:00<00:00, 50.8kB/s]"
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "StyleView",
+ "description_width": ""
}
},
- "c697909d569d40918acd835108e29ae7": {
+ "6ede83f870a24e71b5182fcc458cdc42": {
"model_module": "@jupyter-widgets/base",
- "model_name": "LayoutModel",
"model_module_version": "1.2.0",
+ "model_name": "LayoutModel",
"state": {
"_model_module": "@jupyter-widgets/base",
"_model_module_version": "1.2.0",
@@ -1870,10 +2283,62 @@
"width": null
}
},
- "d690ed1451e74799a2c4c265cd562ed9": {
+ "6efb7939bb954dc8ba116680139eb257": {
"model_module": "@jupyter-widgets/base",
+ "model_module_version": "1.2.0",
"model_name": "LayoutModel",
+ "state": {
+ "_model_module": "@jupyter-widgets/base",
+ "_model_module_version": "1.2.0",
+ "_model_name": "LayoutModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "LayoutView",
+ "align_content": null,
+ "align_items": null,
+ "align_self": null,
+ "border": null,
+ "bottom": null,
+ "display": null,
+ "flex": null,
+ "flex_flow": null,
+ "grid_area": null,
+ "grid_auto_columns": null,
+ "grid_auto_flow": null,
+ "grid_auto_rows": null,
+ "grid_column": null,
+ "grid_gap": null,
+ "grid_row": null,
+ "grid_template_areas": null,
+ "grid_template_columns": null,
+ "grid_template_rows": null,
+ "height": null,
+ "justify_content": null,
+ "justify_items": null,
+ "left": null,
+ "margin": null,
+ "max_height": null,
+ "max_width": null,
+ "min_height": null,
+ "min_width": null,
+ "object_fit": null,
+ "object_position": null,
+ "order": null,
+ "overflow": null,
+ "overflow_x": null,
+ "overflow_y": null,
+ "padding": null,
+ "right": null,
+ "top": null,
+ "visibility": null,
+ "width": null
+ }
+ },
+ "70abdfd99be84f7b9b8d24fee9eec022": {
+ "model_module": "@jupyter-widgets/base",
"model_module_version": "1.2.0",
+ "model_name": "LayoutModel",
"state": {
"_model_module": "@jupyter-widgets/base",
"_model_module_version": "1.2.0",
@@ -1922,25 +2387,68 @@
"width": null
}
},
- "f89679f445424ec1ba2203fb8f7753de": {
+ "70efa83bf3ea45b4bd8cc41f57613328": {
"model_module": "@jupyter-widgets/controls",
- "model_name": "DescriptionStyleModel",
"model_module_version": "1.5.0",
+ "model_name": "HTMLModel",
"state": {
+ "_dom_classes": [],
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
- "_model_name": "DescriptionStyleModel",
+ "_model_name": "HTMLModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/controls",
+ "_view_module_version": "1.5.0",
+ "_view_name": "HTMLView",
+ "description": "",
+ "description_tooltip": null,
+ "layout": "IPY_MODEL_6242493d251a47609c0c44f1dbe82958",
+ "placeholder": "",
+ "style": "IPY_MODEL_f439c1de68ac4c799d81fdb29d053d10",
+ "value": "Downloading: 100%"
+ }
+ },
+ "74bf69aa6eaa4a8594b2ea9a0fb20957": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_module_version": "1.5.0",
+ "model_name": "HTMLModel",
+ "state": {
+ "_dom_classes": [],
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "HTMLModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/controls",
+ "_view_module_version": "1.5.0",
+ "_view_name": "HTMLView",
+ "description": "",
+ "description_tooltip": null,
+ "layout": "IPY_MODEL_ebc9801e164a44b3b6f8dc7f590e1c79",
+ "placeholder": "",
+ "style": "IPY_MODEL_0821b47ae70444dfa38b84719c4836a6",
+ "value": " 17.7M/17.7M [00:00<00:00, 54.3MB/s]"
+ }
+ },
+ "764aa53d75324d73ab06936c52fd8fc8": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_module_version": "1.5.0",
+ "model_name": "ProgressStyleModel",
+ "state": {
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "ProgressStyleModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/base",
"_view_module_version": "1.2.0",
"_view_name": "StyleView",
+ "bar_color": null,
"description_width": ""
}
},
- "735b5f02606d4c0288f70469a8ab2902": {
+ "765485a1d3f941d28b79782dcffbf401": {
"model_module": "@jupyter-widgets/base",
- "model_name": "LayoutModel",
"model_module_version": "1.2.0",
+ "model_name": "LayoutModel",
"state": {
"_model_module": "@jupyter-widgets/base",
"_model_module_version": "1.2.0",
@@ -1989,26 +2497,25 @@
"width": null
}
},
- "0308a7a44b8b4a9cae7bda21fbad99f5": {
+ "77a361d1ff214e8799891bbeb28a0789": {
"model_module": "@jupyter-widgets/controls",
- "model_name": "ProgressStyleModel",
"model_module_version": "1.5.0",
+ "model_name": "DescriptionStyleModel",
"state": {
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
- "_model_name": "ProgressStyleModel",
+ "_model_name": "DescriptionStyleModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/base",
"_view_module_version": "1.2.0",
"_view_name": "StyleView",
- "bar_color": null,
"description_width": ""
}
},
- "967a5451e89049b4ac4688338495b50e": {
+ "79184c8c2a6f4b7493bb7f6983f18a09": {
"model_module": "@jupyter-widgets/base",
- "model_name": "LayoutModel",
"model_module_version": "1.2.0",
+ "model_name": "LayoutModel",
"state": {
"_model_module": "@jupyter-widgets/base",
"_model_module_version": "1.2.0",
@@ -2018,13 +2525,13 @@
"_view_module_version": "1.2.0",
"_view_name": "LayoutView",
"align_content": null,
- "align_items": null,
+ "align_items": "center",
"align_self": null,
"border": null,
"bottom": null,
- "display": null,
+ "display": "flex",
"flex": null,
- "flex_flow": null,
+ "flex_flow": "column",
"grid_area": null,
"grid_auto_columns": null,
"grid_auto_flow": null,
@@ -2054,28 +2561,37 @@
"right": null,
"top": null,
"visibility": null,
- "width": null
+ "width": "50%"
}
},
- "bb655ffda271431892bba5ebab9fd93b": {
+ "7d90af87c9574f5ca21fca058c39bf02": {
"model_module": "@jupyter-widgets/controls",
- "model_name": "DescriptionStyleModel",
"model_module_version": "1.5.0",
+ "model_name": "FloatProgressModel",
"state": {
+ "_dom_classes": [],
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
- "_model_name": "DescriptionStyleModel",
+ "_model_name": "FloatProgressModel",
"_view_count": null,
- "_view_module": "@jupyter-widgets/base",
- "_view_module_version": "1.2.0",
- "_view_name": "StyleView",
- "description_width": ""
+ "_view_module": "@jupyter-widgets/controls",
+ "_view_module_version": "1.5.0",
+ "_view_name": "ProgressView",
+ "bar_style": "success",
+ "description": "",
+ "description_tooltip": null,
+ "layout": "IPY_MODEL_ed169fd606274f2ebbb3e8f32ab42431",
+ "max": 1920,
+ "min": 0,
+ "orientation": "horizontal",
+ "style": "IPY_MODEL_304e9682570b4abeb1719001c04449d6",
+ "value": 1920
}
},
- "f7626a7dae2a421ba31a578746be491d": {
+ "8011d68253ac4080a637659ef3383dc4": {
"model_module": "@jupyter-widgets/controls",
- "model_name": "HBoxModel",
"model_module_version": "1.5.0",
+ "model_name": "HBoxModel",
"state": {
"_dom_classes": [],
"_model_module": "@jupyter-widgets/controls",
@@ -2087,17 +2603,33 @@
"_view_name": "HBoxView",
"box_style": "",
"children": [
- "IPY_MODEL_97d03beea7cb4e479e1ee67edfa5f883",
- "IPY_MODEL_00751b0ca24b47c1b7d337a5b17fc6c1",
- "IPY_MODEL_9fc668b6710c449e898d4b8401fe974c"
+ "IPY_MODEL_e928540e99564d808cb2d12c92daa498",
+ "IPY_MODEL_fc9a3c4ae0a947ec91a227360a80f602",
+ "IPY_MODEL_f91dcd9f30c743d69f9d4b7e8d1beba5"
],
- "layout": "IPY_MODEL_d0ea1fb45fe24bc3b549acc4e05860cd"
+ "layout": "IPY_MODEL_6ede83f870a24e71b5182fcc458cdc42"
}
},
- "97d03beea7cb4e479e1ee67edfa5f883": {
+ "8127c4258e374ad986ce1f8b4c70f704": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_module_version": "1.5.0",
+ "model_name": "ProgressStyleModel",
+ "state": {
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "ProgressStyleModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "StyleView",
+ "bar_color": null,
+ "description_width": ""
+ }
+ },
+ "859b12a6d95b4c6f987791ca848122b9": {
"model_module": "@jupyter-widgets/controls",
- "model_name": "HTMLModel",
"model_module_version": "1.5.0",
+ "model_name": "HTMLModel",
"state": {
"_dom_classes": [],
"_model_module": "@jupyter-widgets/controls",
@@ -2109,40 +2641,60 @@
"_view_name": "HTMLView",
"description": "",
"description_tooltip": null,
- "layout": "IPY_MODEL_c15d7b4b314b4fb1beb5e8b001114392",
+ "layout": "IPY_MODEL_ea95ffd922c0455d957120f034e541f8",
"placeholder": "",
- "style": "IPY_MODEL_6f73694403ae46538b7280ab31657ebc",
- "value": "Downloading: 100%"
+ "style": "IPY_MODEL_13525aa369a9410a83343952ab511f3c",
+ "value": " Copy a token from your Hugging Face\ntokens page and paste it below. Immediately click login after copying\nyour token or it might be stored in plain text in this notebook file. "
}
},
- "00751b0ca24b47c1b7d337a5b17fc6c1": {
+ "8dba487876124827919079519406ecb8": {
"model_module": "@jupyter-widgets/controls",
- "model_name": "FloatProgressModel",
"model_module_version": "1.5.0",
+ "model_name": "HTMLModel",
"state": {
"_dom_classes": [],
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
- "_model_name": "FloatProgressModel",
+ "_model_name": "HTMLModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/controls",
"_view_module_version": "1.5.0",
- "_view_name": "ProgressView",
- "bar_style": "success",
+ "_view_name": "HTMLView",
"description": "",
"description_tooltip": null,
- "layout": "IPY_MODEL_f33d2ce982144ced87a7a834fe83bdb8",
- "max": 5534328,
- "min": 0,
- "orientation": "horizontal",
- "style": "IPY_MODEL_7693042eb27e4994b86ed1afb293be56",
- "value": 5534328
+ "layout": "IPY_MODEL_67fcc38a1e5d4eb39381685447e397de",
+ "placeholder": "",
+ "style": "IPY_MODEL_0b4bf8076fdf4d19843a3246c8bd61ac",
+ "value": " 1.92k/1.92k [00:00<00:00, 63.2kB/s]"
}
},
- "9fc668b6710c449e898d4b8401fe974c": {
+ "94756148d2e94a93ae233baba20af683": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_module_version": "1.5.0",
+ "model_name": "PasswordModel",
+ "state": {
+ "_dom_classes": [],
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "PasswordModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/controls",
+ "_view_module_version": "1.5.0",
+ "_view_name": "PasswordView",
+ "continuous_update": true,
+ "description": "Token:",
+ "description_tooltip": null,
+ "disabled": false,
+ "layout": "IPY_MODEL_b2be65e192384c948fb8987d4cfca505",
+ "placeholder": "",
+ "style": "IPY_MODEL_333b42ca7aa44788b1c22724eb11bcc3",
+ "value": ""
+ }
+ },
+ "99898e6ee64a46bd832af112e79b58b7": {
"model_module": "@jupyter-widgets/controls",
- "model_name": "HTMLModel",
"model_module_version": "1.5.0",
+ "model_name": "HTMLModel",
"state": {
"_dom_classes": [],
"_model_module": "@jupyter-widgets/controls",
@@ -2154,16 +2706,16 @@
"_view_name": "HTMLView",
"description": "",
"description_tooltip": null,
- "layout": "IPY_MODEL_fd6ccdba0a2746419e744035e1096bf2",
+ "layout": "IPY_MODEL_765485a1d3f941d28b79782dcffbf401",
"placeholder": "",
- "style": "IPY_MODEL_2dc0b625a4ff4a60abc4fa3c6671c9ab",
- "value": " 5.53M/5.53M [00:00<00:00, 28.0MB/s]"
+ "style": "IPY_MODEL_3499ef4dd9f243d9bef00b396e78ed69",
+ "value": "\nPro Tip: If you don't already have one, you can create a dedicated\n'notebooks' token with 'write' access, that you can then easily reuse for all\nnotebooks. "
}
},
- "d0ea1fb45fe24bc3b549acc4e05860cd": {
+ "a02030ba8f324d93a7ed6cc793d70a3b": {
"model_module": "@jupyter-widgets/base",
- "model_name": "LayoutModel",
"model_module_version": "1.2.0",
+ "model_name": "LayoutModel",
"state": {
"_model_module": "@jupyter-widgets/base",
"_model_module_version": "1.2.0",
@@ -2212,10 +2764,46 @@
"width": null
}
},
- "c15d7b4b314b4fb1beb5e8b001114392": {
+ "a899f4bc6ed842d397723cca582669e6": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_module_version": "1.5.0",
+ "model_name": "HTMLModel",
+ "state": {
+ "_dom_classes": [],
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "HTMLModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/controls",
+ "_view_module_version": "1.5.0",
+ "_view_name": "HTMLView",
+ "description": "",
+ "description_tooltip": null,
+ "layout": "IPY_MODEL_341615c971b04033b7293d82fc40f35c",
+ "placeholder": "",
+ "style": "IPY_MODEL_17856a72e4e948039a66c51e8244cb50",
+ "value": " 5.53M/5.53M [00:00<00:00, 21.7MB/s]"
+ }
+ },
+ "ab32c7daa1d9404fb921f39fbc4fc05c": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_module_version": "1.5.0",
+ "model_name": "DescriptionStyleModel",
+ "state": {
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "DescriptionStyleModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "StyleView",
+ "description_width": ""
+ }
+ },
+ "aba21021d3bb4565a58ffa40049810db": {
"model_module": "@jupyter-widgets/base",
- "model_name": "LayoutModel",
"model_module_version": "1.2.0",
+ "model_name": "LayoutModel",
"state": {
"_model_module": "@jupyter-widgets/base",
"_model_module_version": "1.2.0",
@@ -2264,25 +2852,31 @@
"width": null
}
},
- "6f73694403ae46538b7280ab31657ebc": {
+ "ac0bcfa1ef6e4e78a7769c4cb2e8762f": {
"model_module": "@jupyter-widgets/controls",
- "model_name": "DescriptionStyleModel",
"model_module_version": "1.5.0",
+ "model_name": "HTMLModel",
"state": {
+ "_dom_classes": [],
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
- "_model_name": "DescriptionStyleModel",
+ "_model_name": "HTMLModel",
"_view_count": null,
- "_view_module": "@jupyter-widgets/base",
- "_view_module_version": "1.2.0",
- "_view_name": "StyleView",
- "description_width": ""
+ "_view_module": "@jupyter-widgets/controls",
+ "_view_module_version": "1.5.0",
+ "_view_name": "HTMLView",
+ "description": "",
+ "description_tooltip": null,
+ "layout": "IPY_MODEL_549a30c85c47466eadedbd24da42e304",
+ "placeholder": "",
+ "style": "IPY_MODEL_bedc7d916b9745f097094c5c51a81f06",
+ "value": " 500/500 [00:00<00:00, 5.05kB/s]"
}
},
- "f33d2ce982144ced87a7a834fe83bdb8": {
+ "ac2950d08fc145ba9eb9cf5824b1ee18": {
"model_module": "@jupyter-widgets/base",
- "model_name": "LayoutModel",
"model_module_version": "1.2.0",
+ "model_name": "LayoutModel",
"state": {
"_model_module": "@jupyter-widgets/base",
"_model_module_version": "1.2.0",
@@ -2331,26 +2925,10 @@
"width": null
}
},
- "7693042eb27e4994b86ed1afb293be56": {
- "model_module": "@jupyter-widgets/controls",
- "model_name": "ProgressStyleModel",
- "model_module_version": "1.5.0",
- "state": {
- "_model_module": "@jupyter-widgets/controls",
- "_model_module_version": "1.5.0",
- "_model_name": "ProgressStyleModel",
- "_view_count": null,
- "_view_module": "@jupyter-widgets/base",
- "_view_module_version": "1.2.0",
- "_view_name": "StyleView",
- "bar_color": null,
- "description_width": ""
- }
- },
- "fd6ccdba0a2746419e744035e1096bf2": {
+ "b26354d0278f447d92c7e1ad4c211d64": {
"model_module": "@jupyter-widgets/base",
- "model_name": "LayoutModel",
"model_module_version": "1.2.0",
+ "model_name": "LayoutModel",
"state": {
"_model_module": "@jupyter-widgets/base",
"_model_module_version": "1.2.0",
@@ -2399,68 +2977,136 @@
"width": null
}
},
- "2dc0b625a4ff4a60abc4fa3c6671c9ab": {
- "model_module": "@jupyter-widgets/controls",
- "model_name": "DescriptionStyleModel",
- "model_module_version": "1.5.0",
+ "b2be65e192384c948fb8987d4cfca505": {
+ "model_module": "@jupyter-widgets/base",
+ "model_module_version": "1.2.0",
+ "model_name": "LayoutModel",
"state": {
- "_model_module": "@jupyter-widgets/controls",
- "_model_module_version": "1.5.0",
- "_model_name": "DescriptionStyleModel",
- "_view_count": null,
+ "_model_module": "@jupyter-widgets/base",
+ "_model_module_version": "1.2.0",
+ "_model_name": "LayoutModel",
+ "_view_count": null,
"_view_module": "@jupyter-widgets/base",
"_view_module_version": "1.2.0",
- "_view_name": "StyleView",
- "description_width": ""
+ "_view_name": "LayoutView",
+ "align_content": null,
+ "align_items": null,
+ "align_self": null,
+ "border": null,
+ "bottom": null,
+ "display": null,
+ "flex": null,
+ "flex_flow": null,
+ "grid_area": null,
+ "grid_auto_columns": null,
+ "grid_auto_flow": null,
+ "grid_auto_rows": null,
+ "grid_column": null,
+ "grid_gap": null,
+ "grid_row": null,
+ "grid_template_areas": null,
+ "grid_template_columns": null,
+ "grid_template_rows": null,
+ "height": null,
+ "justify_content": null,
+ "justify_items": null,
+ "left": null,
+ "margin": null,
+ "max_height": null,
+ "max_width": null,
+ "min_height": null,
+ "min_width": null,
+ "object_fit": null,
+ "object_position": null,
+ "order": null,
+ "overflow": null,
+ "overflow_x": null,
+ "overflow_y": null,
+ "padding": null,
+ "right": null,
+ "top": null,
+ "visibility": null,
+ "width": null
}
},
- "0552df02d084406da5b7c51e18fd2cb0": {
+ "ba18cded436e486da34882d821d8f1eb": {
"model_module": "@jupyter-widgets/controls",
- "model_name": "HBoxModel",
"model_module_version": "1.5.0",
+ "model_name": "ButtonModel",
"state": {
"_dom_classes": [],
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
- "_model_name": "HBoxModel",
+ "_model_name": "ButtonModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/controls",
"_view_module_version": "1.5.0",
- "_view_name": "HBoxView",
- "box_style": "",
- "children": [
- "IPY_MODEL_f61c385e5fa542a98652a434ad4cd324",
- "IPY_MODEL_923af70854ad4651bd2d2a8556ab59f6",
- "IPY_MODEL_170805a3d7ec457aaacd4d9a0acd09d0"
- ],
- "layout": "IPY_MODEL_14713e02e5734e46bfb9f9f815699e39"
+ "_view_name": "ButtonView",
+ "button_style": "",
+ "description": "Login",
+ "disabled": false,
+ "icon": "",
+ "layout": "IPY_MODEL_0e382d66f09f4958a40baa7ab83c4ccb",
+ "style": "IPY_MODEL_6a45ce374e2e47ba9457d02e02522748",
+ "tooltip": ""
}
},
- "f61c385e5fa542a98652a434ad4cd324": {
- "model_module": "@jupyter-widgets/controls",
- "model_name": "HTMLModel",
- "model_module_version": "1.5.0",
+ "bacfb50c001047c4824a05c9f2ee2e40": {
+ "model_module": "@jupyter-widgets/base",
+ "model_module_version": "1.2.0",
+ "model_name": "LayoutModel",
"state": {
- "_dom_classes": [],
- "_model_module": "@jupyter-widgets/controls",
- "_model_module_version": "1.5.0",
- "_model_name": "HTMLModel",
+ "_model_module": "@jupyter-widgets/base",
+ "_model_module_version": "1.2.0",
+ "_model_name": "LayoutModel",
"_view_count": null,
- "_view_module": "@jupyter-widgets/controls",
- "_view_module_version": "1.5.0",
- "_view_name": "HTMLView",
- "description": "",
- "description_tooltip": null,
- "layout": "IPY_MODEL_bea9fb28848d4c3da10df4fec3dfdb6b",
- "placeholder": "",
- "style": "IPY_MODEL_a296598d7d3040e8b8b4dab4f7819e91",
- "value": "Downloading: 100%"
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "LayoutView",
+ "align_content": null,
+ "align_items": null,
+ "align_self": null,
+ "border": null,
+ "bottom": null,
+ "display": null,
+ "flex": null,
+ "flex_flow": null,
+ "grid_area": null,
+ "grid_auto_columns": null,
+ "grid_auto_flow": null,
+ "grid_auto_rows": null,
+ "grid_column": null,
+ "grid_gap": null,
+ "grid_row": null,
+ "grid_template_areas": null,
+ "grid_template_columns": null,
+ "grid_template_rows": null,
+ "height": null,
+ "justify_content": null,
+ "justify_items": null,
+ "left": null,
+ "margin": null,
+ "max_height": null,
+ "max_width": null,
+ "min_height": null,
+ "min_width": null,
+ "object_fit": null,
+ "object_position": null,
+ "order": null,
+ "overflow": null,
+ "overflow_x": null,
+ "overflow_y": null,
+ "padding": null,
+ "right": null,
+ "top": null,
+ "visibility": null,
+ "width": null
}
},
- "923af70854ad4651bd2d2a8556ab59f6": {
+ "bcf766d2a2c641f0aa2af596c7da1b18": {
"model_module": "@jupyter-widgets/controls",
- "model_name": "FloatProgressModel",
"model_module_version": "1.5.0",
+ "model_name": "FloatProgressModel",
"state": {
"_dom_classes": [],
"_model_module": "@jupyter-widgets/controls",
@@ -2473,18 +3119,33 @@
"bar_style": "success",
"description": "",
"description_tooltip": null,
- "layout": "IPY_MODEL_ab878626da504834b827f1762bcd2c20",
- "max": 128619,
+ "layout": "IPY_MODEL_ee537ee5470f4d7b816a8c8f96948b4d",
+ "max": 17719103,
"min": 0,
"orientation": "horizontal",
- "style": "IPY_MODEL_f5a6de62a96340f4ab3094f08e8d54ef",
- "value": 128619
+ "style": "IPY_MODEL_652e97509a914f3b914665c4889c6d11",
+ "value": 17719103
}
},
- "170805a3d7ec457aaacd4d9a0acd09d0": {
+ "bedc7d916b9745f097094c5c51a81f06": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_module_version": "1.5.0",
+ "model_name": "DescriptionStyleModel",
+ "state": {
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "DescriptionStyleModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "StyleView",
+ "description_width": ""
+ }
+ },
+ "bf299285318b4a04a88569cc581ecd75": {
"model_module": "@jupyter-widgets/controls",
- "model_name": "HTMLModel",
"model_module_version": "1.5.0",
+ "model_name": "HTMLModel",
"state": {
"_dom_classes": [],
"_model_module": "@jupyter-widgets/controls",
@@ -2496,16 +3157,76 @@
"_view_name": "HTMLView",
"description": "",
"description_tooltip": null,
- "layout": "IPY_MODEL_af1e4e3e52304c51a46eab4b989a3f0b",
+ "layout": "IPY_MODEL_bacfb50c001047c4824a05c9f2ee2e40",
"placeholder": "",
- "style": "IPY_MODEL_b0b8bb8fe0bc47908273136304cf4870",
- "value": " 129k/129k [00:00<00:00, 210kB/s]"
+ "style": "IPY_MODEL_c53a1cf68fcd4388abf1f0379891089a",
+ "value": " 129k/129k [00:00<00:00, 155kB/s]"
+ }
+ },
+ "c3358d32ac814ea6bc5714402c5bc62d": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_module_version": "1.5.0",
+ "model_name": "HBoxModel",
+ "state": {
+ "_dom_classes": [],
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "HBoxModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/controls",
+ "_view_module_version": "1.5.0",
+ "_view_name": "HBoxView",
+ "box_style": "",
+ "children": [
+ "IPY_MODEL_ecd8e5e364d34ea8bfbba4fbd467384d",
+ "IPY_MODEL_0125df9fa8e14b3db0e2bce299529812",
+ "IPY_MODEL_e3169ca885e04536a709d5751173ce9a"
+ ],
+ "layout": "IPY_MODEL_70abdfd99be84f7b9b8d24fee9eec022"
+ }
+ },
+ "c53a1cf68fcd4388abf1f0379891089a": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_module_version": "1.5.0",
+ "model_name": "DescriptionStyleModel",
+ "state": {
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "DescriptionStyleModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "StyleView",
+ "description_width": ""
+ }
+ },
+ "c8731777ce834e58a76a295076200cfc": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_module_version": "1.5.0",
+ "model_name": "VBoxModel",
+ "state": {
+ "_dom_classes": [],
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "VBoxModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/controls",
+ "_view_module_version": "1.5.0",
+ "_view_name": "VBoxView",
+ "box_style": "",
+ "children": [
+ "IPY_MODEL_859b12a6d95b4c6f987791ca848122b9",
+ "IPY_MODEL_94756148d2e94a93ae233baba20af683",
+ "IPY_MODEL_ba18cded436e486da34882d821d8f1eb",
+ "IPY_MODEL_99898e6ee64a46bd832af112e79b58b7"
+ ],
+ "layout": "IPY_MODEL_79184c8c2a6f4b7493bb7f6983f18a09"
}
},
- "14713e02e5734e46bfb9f9f815699e39": {
+ "c8e0c9a60ef34d2caee9d55a3c21c3d4": {
"model_module": "@jupyter-widgets/base",
- "model_name": "LayoutModel",
"model_module_version": "1.2.0",
+ "model_name": "LayoutModel",
"state": {
"_model_module": "@jupyter-widgets/base",
"_model_module_version": "1.2.0",
@@ -2554,10 +3275,10 @@
"width": null
}
},
- "bea9fb28848d4c3da10df4fec3dfdb6b": {
+ "c9974003727a401797953ef2885db5a2": {
"model_module": "@jupyter-widgets/base",
- "model_name": "LayoutModel",
"model_module_version": "1.2.0",
+ "model_name": "LayoutModel",
"state": {
"_model_module": "@jupyter-widgets/base",
"_model_module_version": "1.2.0",
@@ -2606,25 +3327,78 @@
"width": null
}
},
- "a296598d7d3040e8b8b4dab4f7819e91": {
+ "d12f07e25bf5422facc38c3463700994": {
"model_module": "@jupyter-widgets/controls",
- "model_name": "DescriptionStyleModel",
"model_module_version": "1.5.0",
+ "model_name": "HBoxModel",
"state": {
+ "_dom_classes": [],
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
- "_model_name": "DescriptionStyleModel",
+ "_model_name": "HBoxModel",
"_view_count": null,
- "_view_module": "@jupyter-widgets/base",
- "_view_module_version": "1.2.0",
- "_view_name": "StyleView",
- "description_width": ""
+ "_view_module": "@jupyter-widgets/controls",
+ "_view_module_version": "1.5.0",
+ "_view_name": "HBoxView",
+ "box_style": "",
+ "children": [
+ "IPY_MODEL_eae11f84c2644ada8295b445c924baec",
+ "IPY_MODEL_bcf766d2a2c641f0aa2af596c7da1b18",
+ "IPY_MODEL_74bf69aa6eaa4a8594b2ea9a0fb20957"
+ ],
+ "layout": "IPY_MODEL_2d7a0b901d7044d5b1f273a3e9bea560"
+ }
+ },
+ "d13ba6030aff42bca48c72ff071c44c0": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_module_version": "1.5.0",
+ "model_name": "FloatProgressModel",
+ "state": {
+ "_dom_classes": [],
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "FloatProgressModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/controls",
+ "_view_module_version": "1.5.0",
+ "_view_name": "ProgressView",
+ "bar_style": "success",
+ "description": "",
+ "description_tooltip": null,
+ "layout": "IPY_MODEL_c8e0c9a60ef34d2caee9d55a3c21c3d4",
+ "max": 5534328,
+ "min": 0,
+ "orientation": "horizontal",
+ "style": "IPY_MODEL_764aa53d75324d73ab06936c52fd8fc8",
+ "value": 5534328
+ }
+ },
+ "d182e37b4a404158bee8446fc2728bd9": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_module_version": "1.5.0",
+ "model_name": "HBoxModel",
+ "state": {
+ "_dom_classes": [],
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "HBoxModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/controls",
+ "_view_module_version": "1.5.0",
+ "_view_name": "HBoxView",
+ "box_style": "",
+ "children": [
+ "IPY_MODEL_603e99f45afb4910a99f7684ffd21b6a",
+ "IPY_MODEL_d13ba6030aff42bca48c72ff071c44c0",
+ "IPY_MODEL_a899f4bc6ed842d397723cca582669e6"
+ ],
+ "layout": "IPY_MODEL_a02030ba8f324d93a7ed6cc793d70a3b"
}
},
- "ab878626da504834b827f1762bcd2c20": {
+ "d33fba0d78fb41f983c55f5cd2a0a740": {
"model_module": "@jupyter-widgets/base",
- "model_name": "LayoutModel",
"model_module_version": "1.2.0",
+ "model_name": "LayoutModel",
"state": {
"_model_module": "@jupyter-widgets/base",
"_model_module_version": "1.2.0",
@@ -2673,26 +3447,10 @@
"width": null
}
},
- "f5a6de62a96340f4ab3094f08e8d54ef": {
- "model_module": "@jupyter-widgets/controls",
- "model_name": "ProgressStyleModel",
- "model_module_version": "1.5.0",
- "state": {
- "_model_module": "@jupyter-widgets/controls",
- "_model_module_version": "1.5.0",
- "_model_name": "ProgressStyleModel",
- "_view_count": null,
- "_view_module": "@jupyter-widgets/base",
- "_view_module_version": "1.2.0",
- "_view_name": "StyleView",
- "bar_color": null,
- "description_width": ""
- }
- },
- "af1e4e3e52304c51a46eab4b989a3f0b": {
+ "d7071582bfbe4ec4b2c3c9843e5481ae": {
"model_module": "@jupyter-widgets/base",
- "model_name": "LayoutModel",
"model_module_version": "1.2.0",
+ "model_name": "LayoutModel",
"state": {
"_model_module": "@jupyter-widgets/base",
"_model_module_version": "1.2.0",
@@ -2741,10 +3499,10 @@
"width": null
}
},
- "b0b8bb8fe0bc47908273136304cf4870": {
+ "e1c9df12fa034c93a9b3530ea4a7c5aa": {
"model_module": "@jupyter-widgets/controls",
- "model_name": "DescriptionStyleModel",
"model_module_version": "1.5.0",
+ "model_name": "DescriptionStyleModel",
"state": {
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
@@ -2755,908 +3513,554 @@
"_view_name": "StyleView",
"description_width": ""
}
- }
- }
- }
- },
- "cells": [
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "view-in-github",
- "colab_type": "text"
- },
- "source": [
- " "
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "nxNf1l8Ye_U9"
- },
- "source": [
- "[`pyannote.audio`](https://github.com/pyannote/pyannote-audio) is an open-source toolkit written in Python for **speaker diarization**. \n",
- "\n",
- "Based on [`PyTorch`](https://pytorch.org) machine learning framework, it provides a set of trainable end-to-end neural building blocks that can be combined and jointly optimized to build speaker diarization pipelines. \n",
- "\n",
- "`pyannote.audio` also comes with pretrained [models](https://huggingface.co/models?other=pyannote-audio-model) and [pipelines](https://huggingface.co/models?other=pyannote-audio-pipeline) covering a wide range of domains for voice activity detection, speaker segmentation, overlapped speech detection, speaker embedding reaching state-of-the-art performance for most of them. \n",
- "\n",
- "**This notebook will teach you how to apply those pretrained pipelines on your own data.**\n",
- "\n",
- "Make sure you run it using a GPU (or it might otherwise be slow...)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "42nBTa_QgooG"
- },
- "source": [
- "## Installation"
- ]
- },
- {
- "cell_type": "code",
- "metadata": {
- "id": "vJGyKTQJqdzq",
- "outputId": "28eabcb6-b64b-4e78-9dc0-a181797c3e84",
- "colab": {
- "base_uri": "https://localhost:8080/"
- }
- },
- "source": [
- "# for speechbrain\n",
- "!pip install -qq torch==1.11.0 torchvision==0.12.0 torchaudio==0.11.0 torchtext==0.12.0\n",
- "!pip install -qq speechbrain==0.5.12\n",
- "\n",
- "# pyannote.audio\n",
- "!pip install -qq pyannote.audio\n",
- "\n",
- "# for visualization purposes\n",
- "!pip install -qq moviepy ipython==7.34.0"
- ],
- "execution_count": 1,
- "outputs": [
- {
- "output_type": "stream",
- "name": "stdout",
- "text": [
- "\u001b[K |████████████████████████████████| 750.6 MB 12 kB/s \n",
- "\u001b[K |████████████████████████████████| 21.0 MB 1.4 MB/s \n",
- "\u001b[K |████████████████████████████████| 2.9 MB 49.5 MB/s \n",
- "\u001b[K |████████████████████████████████| 10.4 MB 56.5 MB/s \n",
- "\u001b[K |████████████████████████████████| 496 kB 34.8 MB/s \n",
- "\u001b[K |████████████████████████████████| 101 kB 13.2 MB/s \n",
- "\u001b[K |████████████████████████████████| 1.2 MB 58.4 MB/s \n",
- "\u001b[K |████████████████████████████████| 596 kB 56.7 MB/s \n",
- "\u001b[K |████████████████████████████████| 109 kB 75.9 MB/s \n",
- "\u001b[K |████████████████████████████████| 546 kB 74.2 MB/s \n",
- "\u001b[?25h Building wheel for hyperpyyaml (setup.py) ... \u001b[?25l\u001b[?25hdone\n",
- "\u001b[K |████████████████████████████████| 385 kB 30.0 MB/s \n",
- "\u001b[K |████████████████████████████████| 110 kB 66.8 MB/s \n",
- "\u001b[K |████████████████████████████████| 79 kB 9.1 MB/s \n",
- "\u001b[K |████████████████████████████████| 47 kB 5.7 MB/s \n",
- "\u001b[K |████████████████████████████████| 41 kB 537 kB/s \n",
- "\u001b[K |████████████████████████████████| 129 kB 63.0 MB/s \n",
- "\u001b[K |████████████████████████████████| 419 kB 65.9 MB/s \n",
- "\u001b[K |████████████████████████████████| 51 kB 201 kB/s \n",
- "\u001b[K |████████████████████████████████| 65 kB 5.4 MB/s \n",
- "\u001b[K |████████████████████████████████| 585 kB 71.6 MB/s \n",
- "\u001b[K |████████████████████████████████| 117 kB 74.6 MB/s \n",
- "\u001b[K |████████████████████████████████| 130 kB 64.6 MB/s \n",
- "\u001b[K |████████████████████████████████| 308 kB 77.2 MB/s \n",
- "\u001b[K |████████████████████████████████| 81 kB 11.4 MB/s \n",
- "\u001b[K |████████████████████████████████| 209 kB 75.5 MB/s \n",
- "\u001b[K |████████████████████████████████| 140 kB 74.8 MB/s \n",
- "\u001b[K |████████████████████████████████| 1.1 MB 64.1 MB/s \n",
- "\u001b[K |████████████████████████████████| 58 kB 7.2 MB/s \n",
- "\u001b[K |████████████████████████████████| 144 kB 68.4 MB/s \n",
- "\u001b[K |████████████████████████████████| 271 kB 68.2 MB/s \n",
- "\u001b[K |████████████████████████████████| 94 kB 4.3 MB/s \n",
- "\u001b[K |████████████████████████████████| 78 kB 8.5 MB/s \n",
- "\u001b[K |████████████████████████████████| 112 kB 68.5 MB/s \n",
- "\u001b[K |████████████████████████████████| 147 kB 73.3 MB/s \n",
- "\u001b[K |████████████████████████████████| 49 kB 6.3 MB/s \n",
- "\u001b[?25h Building wheel for antlr4-python3-runtime (setup.py) ... \u001b[?25l\u001b[?25hdone\n",
- " Building wheel for julius (setup.py) ... \u001b[?25l\u001b[?25hdone\n",
- " Building wheel for pyperclip (setup.py) ... \u001b[?25l\u001b[?25hdone\n",
- "\u001b[K |████████████████████████████████| 793 kB 22.7 MB/s \n",
- "\u001b[K |████████████████████████████████| 381 kB 72.2 MB/s \n",
- "\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n",
- "jupyter-console 5.2.0 requires prompt-toolkit<2.0.0,>=1.0.0, but you have prompt-toolkit 3.0.30 which is incompatible.\n",
- "google-colab 1.0.0 requires ipython~=5.5.0, but you have ipython 7.34.0 which is incompatible.\u001b[0m\n",
- "\u001b[?25h"
- ]
- }
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "5pSYhjbMhTwT"
- },
- "source": [
- "# Visualization with `pyannote.core`\n",
- "\n",
- "For the purpose of this notebook, we will download and use an audio file coming from the [AMI corpus](http://groups.inf.ed.ac.uk/ami/corpus/), which contains a conversation between 4 people in a meeting room."
- ]
- },
- {
- "cell_type": "code",
- "metadata": {
- "id": "w7YuPI28qlwZ"
- },
- "source": [
- "!wget -q http://groups.inf.ed.ac.uk/ami/AMICorpusMirror/amicorpus/ES2004a/audio/ES2004a.Mix-Headset.wav\n",
- "DEMO_FILE = {'uri': 'ES2004a.Mix-Headset', 'audio': 'ES2004a.Mix-Headset.wav'}"
- ],
- "execution_count": 2,
- "outputs": []
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "W0_wwm3dj_bO"
- },
- "source": [
- "Because AMI is a benchmarking dataset, it comes with manual annotations (a.k.a *groundtruth*). \n",
- "Let us load and visualize the expected output of the speaker diarization pipeline.\n"
- ]
- },
- {
- "cell_type": "code",
- "metadata": {
- "id": "1pra1iVnrp5D"
- },
- "source": [
- "!wget -q https://raw.githubusercontent.com/pyannote/AMI-diarization-setup/main/only_words/rttms/test/ES2004a.rttm"
- ],
- "execution_count": 5,
- "outputs": []
- },
- {
- "cell_type": "code",
- "metadata": {
- "id": "aj1obYqhr3Qk",
- "outputId": "2b1e6b24-c355-4edb-bf8f-46c1bd7f92d2",
- "colab": {
- "base_uri": "https://localhost:8080/",
- "height": 118
- }
- },
- "source": [
- "# load groundtruth\n",
- "from pyannote.database.util import load_rttm\n",
- "_, groundtruth = load_rttm('ES2004a.rttm').popitem()\n",
- "\n",
- "# visualize groundtruth\n",
- "groundtruth"
- ],
- "execution_count": 6,
- "outputs": [
- {
- "output_type": "execute_result",
- "data": {
- "text/plain": [
- ""
- ],
- "image/png": "iVBORw0KGgoAAAANSUhEUgAABG0AAACsCAYAAADBlVHFAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nO3df5QdZZ3n8c93iCA/HCEGEcKPZFhFDHEI6ZU0Iy7Lj8kw4QA7/HSW4491V4ZZxxln3UE4s4eOZ3RGh3RGZNZJmBDRkEQHEXJ05MfBZMyONmy3gXRizJiIEWICMfxIUDdR+e4ft6pTt7qqbt176/Z9uvv9Oifce5966qmnnnp+3Yeq2+buAgAAAAAAQFh+o9sZAAAAAAAAwGgs2gAAAAAAAASIRRsAAAAAAIAAsWgDAAAAAAAQIBZtAAAAAAAAAsSiDQAAAAAAQIBYtAEAAAAAAAgQizYAAAAAAAABYtEGAAAAAAAgQCzaAAAAAAAABGjcLdqY2a/N7MnEvxlmdoGZvZwKvzgn/sei8Jlm9riZbTOzL5nZ4VH4u8zsu2b2KzO7OnHc06LwJ81ss5n9UXdKoHrdKtNo26lm9oiZbTGz75nZjLE+/04wMzezFYnPU8xsj5l9Lfr8vuhzshzfFpX9L1Lh74n2mWtmw1H53mFmFoVfE9XJV82sJyMvp5rZK2b20bE6/05rtXyjbbPM7JtmttXMfmBm/ytRlhaV7TYz22hm5ySO8ZCZvRQfIxH+eTN7OnGcs8emFAAAAABMdFO6nYEW/MLd674URV/017v7ZWXiRz4labG7rzazf5D0AUmfk/RjSe+TlP6Cu0tSr7sfMLNjJG0yszXu/pO2ziYM3SpTSfqCpE+4+6NRub7a8lmE5WeSzjKzI939F5IukbQzFedL7v6hZEBU7ttzyvdzkv6bpMcl/bOk35P0DUmbJP2BpCU5eemP4k0krZbvkZLWSLrJ3R8xs6MkfUXSH0v6e0mXSnpz9O9c1cr83Gj3v5V0lKQbM/LzP939vkrODAAAAAAi4+5OmypE/1f9Qknxl6x7JF0pSe7+I3ffqNTigbsfdPcD0ccjNEnLLk8rZRrd+TDF3R+N4r3i7j8fu1x33D9LWhC9f7ekVa0mZGYnSvpNdx9wd1dtsSsu3y3uvjVnvyslPS1pc6vHDlgr5fuHkv7V3R+RpKi+fUjSx6LtV0j6gtcMSDo2Knu5+2OS9leYfwAAAAAoNB4XHo5MPIbw1UT4+alHIU7PiP+kmV0n6Q2SXnL3X0VxnpU0vdGBzewUM9so6RlJn5ogd9lI3SvTt0h6yczuN7MNZva3ZnZYtafWVaslXW9mr5X0dtXukEm6LlWOR0bhp6fCz1etLJ9N7NuwfKM7l26WtLCSswlPK+U7S9JQMpK7b5d0jJn9pmpl+kxic6m+QdInosepFpvZEa2eEAAAAAAktfV41LzbHu6TdFs1WZEkLRxYOL+vQZy8R3NKP8pjZtNayZy7PyPp7WZ2kqQHzOw+d3+ulbTyXP7Agj5VXKZrrvx6X4M43SrTKZLOlzRHtUeovqTaY1TLWkgr15IrVvSp4jK98cEb+hpFcveN0eNO71btrpC0rMd3pIzHo7J+q6aEPtUeV3slSrcjdk4/pU8Vl+/0nc/0NYrURvlW7RZJuyUdLmmpagtlH+/EgQAAAABMLuPxTpsq7FXtsYd40epkjf49jFzRHTabVFtwQE0rZfqspCfd/YfRHToPSDqnwT7jzRpJt6uNR6MiO1Ur01iZ8j1X0qfN7EeS/kzSrWb2oeJdxp1my/d7kuYmA8zstyS94u77VCvTUxKbG5azu++KHqc6IGm5pHeUzAsAAAAAFJqUizbRb4KslRT/JaP3SnqwaB8zOzl+fMXMjpP0TkmZvyMyGbVSppL+r2oLPcdHny9U7Uv1RHK3pIXuPtxOIu6+S9I+M5sX/X7Qe9SgfN39fHef4e4zJP2dpE+6+53t5CNAzZbvvZLeaYf+EtqRku6Q9Olo+xpJ74n+itQ8SS9HZZ8r/s2b6LpcqdqCLgAAAAC0zWrftccPM3vF3Y9JhV2g2hfYpxPBf+Xu95nZryUlv9A95O4fi/7v+mpJUyVtkHRD9Jeh/r2kr0o6TtL/k7Tb3WeZ2SWSFklySSbpTndf2pmzHFvdKtPoOHG5mmq/NfJBdz/YifMcSwVl+lF3v8zM3qfaXyNK3sXxx5J+ImmL6hcE73b3O6JHpD4v6UjV/hrUn7i7m9l/kvRZScdLekm1u5fmp47dp9rdJLdXdpJd1Gr5uvu3zWy2auV1oqTDJH1R0sejsjRJd6r2l7l+Lun97j4Ypb9e0lslHaPanWUfcPeHzeybqpW9SXpS0h+5+ysdOnUAAAAAk8i4W7QBAAAAAACYDCbl41EAAAAAAAChY9EGAAAAAAAgQCzaAAAAAAAABIhFGwAAAAAAgACxaAMAAAAAABCgKc1EnjZtms+YMaNDWQEAAAAAAJh8hoaGfurux6fDm1q0mTFjhgYHB6vLFQAAAAAAwCRnZjuywnk8CgAAAAAAIEAs2gAAAAAAAASIRRsAAAAAAIAAsWgDAAAAAAAQIBZtAAAAAAAAAsSiDQAAAAAAQIBYtAEAAAAAAAgQizYAAAAAAAABYtEGAAAAAAAgQCzaAAAAAAAABIhFGwAAAAAAgACxaAMAAAAAABAgFm0AAAAAAAACxKINAAAAAABAgJpatPn1c89p36L+UnHvWrst9/O+Rf268xNfrAtPvq7ccq8kZb4m39909xMN83HL+ptzt8Vp5X0ukiyHvDLZc9U1DdNJl1Mz7lq7ra39u5X2WCjK/11rt41cm3bPMbn/Z27668Lt7QrlmqTzkdfWs8r4rrXbtG9Rv/Yt6h/V9pPitl32WJJG0s2SPmbecZuV7JOyjl+mv4zjlO1bqxQfc3DVUyNhg6ue0r9c+ZcaXPVUXXiRdLysz8n+dfkdKxqmkZbsy+N6UVQfktemHfFxsvIXh6Vf88LyPjfKZ3J71riVHBezyiUr/TLjX3oMzop7y/qbM/NXRdmXFR8rXWeLrlkr6TcbJ69c0teplb4onislj9Ho3G7/p0WZeWymrcTt8Jb1N+umu58o3G/5HStG8pQ1Z1pz6yN1eciycsu9+vCXv5q5LTlfbEXeXDNL1lyyaH4Z6+aYHfdb8TX46ocvHdn2r3+yRFJr7SGpaB5e1bmn+/sy8+8s6XqW/hxfz0/9zaJS/XKZ4zUTLy/+LetvHjV3aVS2ybKKyyhr/tNs+y+K12xduuFvvqk9V11T6lyu//w/lE43Lp8ln1zbVH6Sis4lnus3mrt2QjPp3rV2m9Z96C8zr386vWQdy5tfJbcl5/fpfqYoj2XHvHh7me/5eVZuuVebL33XSLtud54Sj9tV+Og3PjsyriXbYqM8NbVo8+pzz2l//+JScZet2577eX//Yq04+Ma68OTr6q0rJSnzNfl+w44XG+Zj895NudvitPI+F0mWQ16ZHBwYaJhOupyasWzd9rb271baY6Eo/8vWbR+5Nu2eY3L/VW88p3B7u0K5Jul85LX1rDJetm679vcv1v7+xaPaflLctsseS9JIulnSx8w7brOSfVLW8cv0l3Gcsn1rleJjDq0eHgkbWj2s7/tbNbR6uC68SDpe1udk/3rwscZppCX78rheFNWH5LVpR3ycrPzFYenXvLC8z43ymdyeNW4lx8WscslKv8z4lx6Ds+Ju3rspM39VlH1Z8bHSdbbomrWSfrNx8solfZ1a6YviuVLyGI3O7Vuv+WZmHptpK3E73Lx3kzbseLFwv4OPHcpT1pxp1+bn6/KQZfXWlXpi81GZ25LzxVbkzTWzZM0li+aXsW6O2XG/FV+Dd3zlUH43/fhoSa21h6SieXhV557u78vMv7Ok61n6c3w9j/3OCaX65TLHayZeXvzNezeNmrs0KttkWcVllDX/abb9F8Vrti5t+8UvdXBgoNS5/OjpmaXTHSmfx3c2lZ+konOJ5/qN5q6d0Ey6y9Zt15u/ek/m9U+nl6xjefOr5Lbk/D7dzxTlseyYF28v8z0/z+qtK3XsxqdH2nW785R43K7Cvx14aGRcS7bFRnni8SgAAAAAAIAAsWgDAAAAAAAQIBZtAAAAAAAAAjSlk4nPu+3hprYnP1/+wIK6bcnP6W3taCetndNPqSQPjcqp0/t3K+2xUCb/VZ7jeC+vVjXb1svuV9U+Ve7frGb6iar6lFYsuWL0jwMXhbeSXtzfLtC7W043bSyvZ1Ges7Y1U6bNjEVZcRvtXyb9ojitpF/lWN2qqupZq+dSdr+q6nHh+b6/M9ckL80Fenfd53b6t6LyqeKcOllXQ5oXjFyDnr+urG0U6dS5j9VYOVZ9WJnjFH1nKqvT7aipOnX28SNvOzVX71QdH+vvFlVpda5e9XGqPFYzqpinVJHvN87JTqtRXrjTBgAAAAAAIEAs2gAAAAAAAASoo49HDSycP/I+63aigYXz68KTn9dc+fW624SSn9Pb2rHmyq+PvG82zek7n5HU/m2ayXJqRlxWre7frbTHQlH+03WxnXNslFaIt0d2Qpm2nrUt3QdUcayy+4/VtYn7iTzJ/qNR3Kolj33jgzdIGn07cRxeJOsW5OR+8fa4v12yfMWodFu9jbnd+tCMojzf+OANmWXXbNlkSY9NWeNWo3ExnX5W3KI4jcbKeHvePp1UdN5V1bNG55KXh6xyydLsOJRX14va69cfWFWqHjQrr2yWLK8v63bmTEVjeav1LG+OWbVuzaOy6sjIGHPFitz+qUpVnHvReXT6Mal2+rBm6lOZ+peeuxSVbV7/UDT/KXOujfJYZr4QW576/pen2e8jyXNrJj9JjdpFmblrJ7+btarRd5RW5uRljpN1vFbqb7vamafE+1RxXS9/4I6RtJLn2qgf4E4bAAAAAACAALFoAwAAAAAAEKDD+vr6SkdeunRp340f+YiOOK+3YVyXNHfm1PzPLr3jXb89Ep58PWfGVM0+/u1y16jXs6bNHnl/cP90XTZnemE+Nu7ZqItPuyQ7j1G6eZ8bSZZDVpkc+PZ3dPR11xamkS6XZsRl1er+3Up7LBTl3yXN+slWHX3dtW2Vf5xWvP/PvvxPmnfZ+bnb2xXKNUnnI6+tx/U/uT3e94jeXh3e21vX9pOGnn5Bl82ZXvpYsSN6e3P7p+Qxs/ZtRbJPyjt+mf4yjlMmbtVqx3SdNPtNUYjr9Zu/pdOu/4866awTEuFFPBVv9OcTzzphpJyG92zUnHPTfW16n3rJvjyuF+n2UFfXUtemVYeOdVxG/uI8p1+ztuWdZ33ZZOYhMTZljVvJcfGsabNHl0vG2FZm/EuPwVlxN+7ZqItOvXhU/podT9tx6FieqrNZdaq4nhWn31ycrOsWX6PkdWqlL4rrZX0dLz63ncO7dd6s80blMc5PmesVt8ONezbquF+fowVnT8/db3jPRp197uyRPKXnTD8Z3q0zLjq9sK261/5dOuvM0dt0aL7Yiqw5Zl5aWXPJovllMo/dGrNr5XPcSJt4bMejOvPS2uMiB779HZ36+z1qpT0kxWN13vGrOPes/r7R/DsznVQ9S3+Or+djOx7V77yzt2G/XOZ4ZfZvVP/iPjY9jyoq22TZx/OS9Fxs7sypTbf/4nNqri6te/zHWvAbu3XUtdc0PJcX7bu6+uyeUunG5ePu6jl/Zun8pFPJO5d4rt9o7tqp72Zl0/XoPzN+/8JR1z+dXrKO5c2v4vjnzJha9x1qZH4U9TNFeUx/5290nkX9S8Pzd+nYJ7dr9/y5uvi0S3LH47JtPG4rVVzXoadf0Jtef6QunXVmXVuM83T/39+/q6+vb2l6P3P30gfp6enxwcHBtjMLAAAAAACAGjMbcvdRq5Q8HgUAAAAAABAgFm0AAAAAAAACxKINAAAAAABAgFi0AQAAAAAACBCLNgAAAAAAAAFi0QYAAAAAACBALNoAAAAAAAAEiEUbAAAAAACAALFoAwAAAAAAEKAgF23uWrtNd63dNios+TpR7FvUr32L+ke9ByaaPVddE0x6Re2sE21w5ZZ7tfyOFRpc9ZRuWX9z5ek3OvbKLfeOCk/3s8n+Jyt+Ojyrn846Rtb7dg2uempM9knKK8dW5I1ng6ueysxnXnhZa259pKl00vHS1zpOL/2+UZ2I04xfq64fVVyfsmncdPcTDeOUaSOtSF6brOsZt+W8eZRUf93y0ilj4R3/J/Mc88KaKY+iuLesv7nUGJC+TkXzy3ZVlc6eq66puz5l+56ivj7rfVX9WZl8lR33bll/88i5F41DN939RMe/D+SlH9e7rDn74Kqn9P33/UWl8/msdJJh+xb1a82tjxRez3hb3viSlu7XJWnJJ9dmpt3u2JoeF5LhjdJud1yO+4N0Oq2m2ex+jfIfb0/+azVfe666ZqR+NrJvUX9Lx2o1f+3WoXbk1bt47Gh2/pXu6/KuW1a6jfq0IBdtlq3brmXrto8KS75OFPv7F2t//+JR74GJ5uDAQDDpFbWzTrTB1VtX6uBj0tDqYW3eu6ny9Bsde/XWlaPC0/1ssv/Jip8Oz+qns46R9b5dQ6uHx2SfpLxybEXeeDa0ejgzn3nhZe3a/HxT6aTjpa91nF76faM6EacZv1ZdP6q4PmXT2LDjxYZxyrSRViSvTdb1jNty3jxKqr9ueemU8Y29P8s8x7ywZsqjKO7mvZtKjQHp61Q0v2xXVekcHBiouz5l+56ivj7rfVX9WZl8lR33Nu/dNHLuRePQhh0vdvz7QF76cb3LmrMPrR7W6x5dVel8PiudZNj+/sXatfn5wusZb8sbX9LS/bok6fGdmWm3O7amx4VkeKO02x2X4/4gnU6raTa7X6P8x9uT/1rN18GBgZH62cj+/sUtHavV/LVbh9qRV+/isaPZ+Ve6r8u7blnpNurTgly0AQAAAAAAmOxYtAEAAAAAAAgQizYAAAAAAAABmtLtDDRj3m0PdzsLACaIndNP6XYWgnb5AwsqSadT/faSK1Z0JN2xMlnHs/R1q7ocqqq3oStb/5sp35ba1NnHN33sEOt+iHmqUt75hd5eGuUv9OvWyXlGVtplrmcr7XzebQ/r/S3uW0aI43mobaOKfJWtl2NZBiHWgW4o6tO40wYAAAAAACBALNoAAAAAAAAEaFw9HjWwcH7wt0ICGB+m73wmM5zHpmrWXPn1UWGt3Co7sHC+pOpvY7/xwRuaih/arbeTdTy78cEb6q5F1fUjq942I9Rb4tPi+t+oXsflKzUu42bblCQtL0gzeezk8dPhecayfZTNU5GQ23NeO2u3vZTRTptqNA5Vcd3yVHE98+YZzcibk8RpJ7fnXc9kmaXbeZmxcWDhfC25YkVmH1HF2JoeF0LQStsYi/Gjinw1qpdxnWr2WO2cfyvjTxVCq3cDC+fLPp69jTttAAAAAAAAAsSiDQAAAAAAQIAO6+vrKx156dKlfR/84Ac7l5uISzpnxlTNnTm1LmzuzKkjrxPJEb29OuK83lHvgYnkwLe/o6OvuzaY9IraWdVt0F2SS2efO1s/fdNzuvi0SypNv9Gxz5o2W7OPf3t9uEb3s3H/465R8eO04vCs/UfF16H+utq+23XS7DeNwT6JvXPKsaW0lDeeuU4664SMfOaFl/OT4d0646LTm0inPl76Wh9Kr/594zoRX4Paa9X1I6/ediKNoadf0GVzphenpcZtpDXJupxdr4/o7dXhvb2Z8yip/roVpdPIzuHd+g/nnjrqHLOuZ7PlUVQnNu7ZqHc+e3TDMSB9nYrml+2qKp0D3/6OXjrzXYfaVcm+p6ivz2pnVbSXMtwll5ca9zbu2agzX56tMy46vXAcOrh/uhbMmd7R7wN51zM59xg9Z3fJXdOuvKTS+XxWOsmwvcfM1FsuPD33eh4qy6x2Pjos3a/PnTlVQ0/vVc/5M7NSb2tsTY8LdeENxqt2x+W4PzhnxtS6dFptG83u1yj/8fbkv1bz9ZZ/e0VHXXvNSP1s5PDe3qaP1Xqf0m4dakd2vdt19GuisaO5+dfGPRvr+rr8azw63bitLVy4cFdfX9/SdNrm7qVPq6enxwcHB0vHBwAAAAAAQDEzG3L3nnQ4j0cBAAAAAAAEiEUbAAAAAACAALFoAwAAAAAAECAWbQAAAAAAAALEog0AAAAAAECAWLQBAAAAAAAIEIs2AAAAAAAAAWLRBgAAAAAAIEAs2gAAAAAAAASIRRsAQEv2Leqve82LU7R9Mlu55V6t3HJvt7PRNYOrnqp77ZSb7n6io+l3S1a7Sofl1bG71m4rFZZWZVnesv7mytKayAZXPVWqjZSNF6Nvnpxod5Nb0bxjos1Jqhiv4nGxzPhYhT1XXZO7jUUbAEBL9vcvrnvNi1O0fTJbvXWlVm9d2e1sdM3Q6uG6107ZsOPFjqbfLVntKh2WV8eWrdteKiytyrLcvHdTZWlNZEOrh0u1kbLxYvTNkxPtbnIrmndMtDlJFeNVPC6WGR+rcHBgIHcbizYAAAAAAAABYtEGAAAAAAAgQFO6nQEAwPi1c/op3c4CxrElV6zodhbGtXba37zbHq4wJwAATDyhjJXcaQMAAAAAABAgFm0AAAAAAAACxONRAICWTd/5DI9IoWU3PngDj0i1YfrOZ+o+N9MWBxbOr/scyi3gAACEYmDh/CDGR+60AQAAAAAACBCLNgAAAAAAAAFi0QYAAAAAACBA/KYNAKAlr/vzj9S9FsXBaNef8YfdzkJXzb1+dt1rp8w57biOpt8tWW0rHZZXxz5wwemlwtKqLMtZbzirsrQmsrLto9l2RN88OdHuJreiecdEm5NUMV7F42KZ8bEKh8+bJ91/X+Y2c/fSCfX09Pjg4GBV+QIAAAAAAJj0zGzI3XvS4TweBQAAAAAAECAWbQAAAAAAAALEog0AAAAAAECAWLQBAAAAAAAIEIs2AAAAAAAAAWLRBgAAAAAAIEAs2gAAAAAAAASIRRsAAAAAAIAAsWgDAAAAAAAQIBZtAADAmNu3qF/7FvV3OxtA0GgnAMbCmlsf6XYWUIBFGwAAMOb29y/W/v7F3c4GEDTaCYCxsGvz893OAgqwaAMAAAAAABAgFm0AAAAAAAACxKINAAAAAABAgFi0AQAAAAAACBCLNgAAAAAAAAFi0QYAAAAAACBALNoAAAAAAAAEiEUbAAAAAACAAE3pdgYAAMDk87o//0i3swAEj3YCYCycOOuN3c4CCpi7l47c09Pjg4ODHcwOAAAAAADA5GJmQ+7ekw7n8SgAAAAAAIAAsWgDAAAAAAAQIBZtAAAAAAAAAsSiDQAAAAAAQIBYtAEAAAAAAAgQizYAAAAAAAABYtEGAAAAAAAgQCzaAAAAAAAABIhFGwAAAAAAgACxaAMAAAAAABAgFm0AAAAAAAACxKINAAAAAABAgFi0AQAAAAAACBCLNgAAAAAAAAFi0QYAAAAAACBA5u7lI5vtkbSjc9kBJpVpkn7a7UwAEwhtCqgWbQqoFm0KqNZEa1Onufvx6cCmFm0AVMfMBt29p9v5ACYK2hRQLdoUUC3aFFCtydKmeDwKAAAAAAAgQCzaAAAAAAAABIhFG6B7lnY7A8AEQ5sCqkWbAqpFmwKqNSnaFL9pAwAAAAAAECDutAEAAAAAAAgQizZAB5jZKWa21sy+Z2abzexPo/CpZvaomf0gej0uCjczu8PMtpnZRjM7p7tnAITJzA4zsw1m9rXo80wzezxqO18ys8Oj8COiz9ui7TO6mW8gRGZ2rJndZ2bfN7MtZtbLOAW0zsw+Es37NpnZKjN7LeMUUJ6Z3W1mz5vZpkRY0+OSmb03iv8DM3tvN86lSizaAJ3xK0n/w93fJmmepP9uZm+T9DFJj7n7myU9Fn2WpEslvTn690FJnxv7LAPjwp9K2pL4/ClJi93930l6UdIHovAPSHoxCl8cxQNQ7zOSHnL3t0r6bdXaFuMU0AIzmy7pw5J63P0sSYdJul6MU0AzPi/p91JhTY1LZjZV0m2SzpX0Dkm3xQs94xWLNkAHuPsud/9u9H6/ahPh6ZKukHRPFO0eSVdG76+Q9AWvGZB0rJmdOMbZBoJmZidLWiDpH6PPJulCSfdFUdJtKm5r90m6KIoPQJKZvV7SuyQtkyR3P+juL4lxCmjHFElHmtkUSUdJ2iXGKaA0d/+WpBdSwc2OS/MlPeruL7j7i5Ie1eiFoHGFRRugw6LbXedIelzSCe6+K9q0W9IJ0fvpkp5J7PZsFAbgkL+T9BeSXo0+v0HSS+7+q+hzst2MtKlo+8tRfAA1MyXtkbQ8euTwH83saDFOAS1x952Sbpf0Y9UWa16WNCTGKaBdzY5LE268YtEG6CAzO0bSVyT9mbvvS27z2p9u48+3ASWY2WWSnnf3oW7nBZggpkg6R9Ln3H2OpJ/p0C3nkhingGZEj19codqC6EmSjtY4/7/7QGgm67jEog3QIWb2GtUWbO519/uj4Ofi28mj1+ej8J2STknsfnIUBqDmdyRdbmY/krRatdvNP6ParbBTojjJdjPSpqLtr5e0dywzDATuWUnPuvvj0ef7VFvEYZwCWnOxpKfdfY+7/1LS/aqNXYxTQHuaHZcm3HjFog3QAdEzycskbXH3/sSmNZLiXzB/r6QHE+HviX4FfZ6klxO3AQKTnrvf4u4nu/sM1X7Y8Zvu/p8lrZV0dRQt3abitnZ1FH/S/Z8ZII+775b0jJmdEQVdJOl7YpwCWvVjSfPM7KhoHhi3KcYpoD3NjksPS/pdMzsuugPud6OwccvoG4Dqmdk7Ja2XNKxDv79xq2q/a/NlSadK2iHpWnd/IRrc71TtNtqfS3q/uw+OecaBccDMLpD0UXe/zMx+S7U7b6ZK2iDpBnc/YGavlfRF1X5P6gVJ17v7D7uVZyBEZna2aj/sfbikH0p6v2r/Q49xCmiBmS2UdJ1qf0V0g6T/qtpvaTBOASWY2SpJF0iaJuk51f4K1ANqclwys/+i2ncvSfqEuy8fy/OoGos2AAAAAAAAAeLxKAAAAAAAgACxaAMAAAAAABAgFm0AAAAAAAACxKINAAAAAABAgFi0AQAAAAAACBCLNgAAIHhm9gYzezL6t9vMdkbvXzGz/93t/AEAAC0YCW0AAAFkSURBVHQCf/IbAACMK2bWJ+kVd7+923kBAADoJO60AQAA45aZXWBmX4ve95nZPWa23sx2mNkfmNmnzWzYzB4ys9dE8eaa2b+Y2ZCZPWxmJ3b3LAAAALKxaAMAACaS0yVdKOlySSskrXX32ZJ+IWlBtHDzWUlXu/tcSXdL+kS3MgsAAFBkSrczAAAAUKFvuPsvzWxY0mGSHorChyXNkHSGpLMkPWpmiuLs6kI+AQAAGmLRBgAATCQHJMndXzWzX/qhH+97VbV5j0na7O693cogAABAWTweBQAAJpOtko43s15JMrPXmNmsLucJAAAgE4s2AABg0nD3g5KulvQpM3tK0pOSzuturgAAALLxJ78BAAAAAAACxJ02AAAAAAAAAWLRBgAAAAAAIEAs2gAAAAAAAASIRRsAAAAAAIAAsWgDAAAAAAAQIBZtAAAAAAAAAsSiDQAAAAAAQIBYtAEAAAAAAAjQ/wchOdB/wwYbgAAAAABJRU5ErkJggg==\n"
- },
- "metadata": {},
- "execution_count": 6
- }
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "JDhKjfUBlsjH"
- },
- "source": [
- "For the rest of this notebook, we will only listen to and visualize a one-minute long excerpt of the file (but will process the whole file anyway)."
- ]
- },
- {
- "cell_type": "code",
- "metadata": {
- "id": "YAa_HoA9mnTZ",
- "outputId": "6ff35b05-9b2c-49fa-bd4b-b674a44c7118",
- "colab": {
- "base_uri": "https://localhost:8080/",
- "height": 117
- }
- },
- "source": [
- "from pyannote.core import Segment, notebook\n",
- "# make notebook visualization zoom on 600s < t < 660s time range\n",
- "EXCERPT = Segment(600, 660)\n",
- "notebook.crop = EXCERPT\n",
- "\n",
- "# visualize excerpt groundtruth\n",
- "groundtruth"
- ],
- "execution_count": 7,
- "outputs": [
- {
- "output_type": "execute_result",
- "data": {
- "text/plain": [
- ""
- ],
- "image/png": "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\n"
- },
- "metadata": {},
- "execution_count": 7
- }
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "TpqTxB12F9Do"
- },
- "source": [
- "This nice visualization is brought to you by [`pyannote.core`](http://pyannote.github.io/pyannote-core/) and basically indicates when each speaker speaks. "
- ]
- },
- {
- "cell_type": "code",
- "metadata": {
- "id": "62flXtNIsA9q",
- "outputId": "7fe6edc9-194b-45c5-d3fb-973bf0553282",
- "colab": {
- "base_uri": "https://localhost:8080/",
- "height": 119
- }
- },
- "source": [
- "from pyannote.audio import Audio \n",
- "from IPython.display import Audio as IPythonAudio\n",
- "waveform, sr = Audio().crop(DEMO_FILE, EXCERPT)\n",
- "IPythonAudio(waveform.flatten(), rate=sr)"
- ],
- "execution_count": 8,
- "outputs": [
- {
- "output_type": "stream",
- "name": "stderr",
- "text": [
- "/usr/local/lib/python3.7/dist-packages/resampy/interpn.py:114: NumbaWarning: \u001b[1m\u001b[1mThe TBB threading layer requires TBB version 2019.5 or later i.e., TBB_INTERFACE_VERSION >= 11005. Found TBB_INTERFACE_VERSION = 9107. The TBB threading layer is disabled.\u001b[0m\u001b[0m\n",
- " _resample_loop_p(x, t_out, interp_win, interp_delta, num_table, scale, y)\n"
- ]
},
- {
- "output_type": "execute_result",
- "data": {
- "text/plain": [
- ""
- ],
- "text/html": [
- "\n",
- " \n",
- " \n",
- " Your browser does not support the audio element.\n",
- " \n",
- " "
- ]
- },
- "metadata": {},
- "execution_count": 8
- }
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "xD7QfHCHEIgE"
- },
- "source": [
- "# Processing your own audio file (optional)\n",
- "\n",
- "In case you just want to go ahead with the demo file, skip this section entirely.\n",
- "\n",
- "In case you want to try processing your own audio file, proceed with running this section. It will offer you to upload an audio file (preferably a `wav` file but all formats supported by [`SoundFile`](https://pysoundfile.readthedocs.io/en/latest/) should work just fine)."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "CKsR0OZqLj1d"
- },
- "source": [
- "## Upload audio file"
- ]
- },
- {
- "cell_type": "code",
- "metadata": {
- "id": "HQRCi0C7EHor",
- "outputId": "79a008b1-6ae9-48bd-b57a-22af28d1341b",
- "colab": {
- "resources": {
- "http://localhost:8080/nbextensions/google.colab/files.js": {
- "data": "Ly8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQwovLwovLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgovLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLy8KLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLy8KLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQovLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAovLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAovLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IEhlbHBlcnMgZm9yIGdvb2dsZS5jb2xhYiBQeXRob24gbW9kdWxlLgogKi8KKGZ1bmN0aW9uKHNjb3BlKSB7CmZ1bmN0aW9uIHNwYW4odGV4dCwgc3R5bGVBdHRyaWJ1dGVzID0ge30pIHsKICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogIGVsZW1lbnQudGV4dENvbnRlbnQgPSB0ZXh0OwogIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHN0eWxlQXR0cmlidXRlcykpIHsKICAgIGVsZW1lbnQuc3R5bGVba2V5XSA9IHN0eWxlQXR0cmlidXRlc1trZXldOwogIH0KICByZXR1cm4gZWxlbWVudDsKfQoKLy8gTWF4IG51bWJlciBvZiBieXRlcyB3aGljaCB3aWxsIGJlIHVwbG9hZGVkIGF0IGEgdGltZS4KY29uc3QgTUFYX1BBWUxPQURfU0laRSA9IDEwMCAqIDEwMjQ7CgpmdW5jdGlvbiBfdXBsb2FkRmlsZXMoaW5wdXRJZCwgb3V0cHV0SWQpIHsKICBjb25zdCBzdGVwcyA9IHVwbG9hZEZpbGVzU3RlcChpbnB1dElkLCBvdXRwdXRJZCk7CiAgY29uc3Qgb3V0cHV0RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG91dHB1dElkKTsKICAvLyBDYWNoZSBzdGVwcyBvbiB0aGUgb3V0cHV0RWxlbWVudCB0byBtYWtlIGl0IGF2YWlsYWJsZSBmb3IgdGhlIG5leHQgY2FsbAogIC8vIHRvIHVwbG9hZEZpbGVzQ29udGludWUgZnJvbSBQeXRob24uCiAgb3V0cHV0RWxlbWVudC5zdGVwcyA9IHN0ZXBzOwoKICByZXR1cm4gX3VwbG9hZEZpbGVzQ29udGludWUob3V0cHV0SWQpOwp9CgovLyBUaGlzIGlzIHJvdWdobHkgYW4gYXN5bmMgZ2VuZXJhdG9yIChub3Qgc3VwcG9ydGVkIGluIHRoZSBicm93c2VyIHlldCksCi8vIHdoZXJlIHRoZXJlIGFyZSBtdWx0aXBsZSBhc3luY2hyb25vdXMgc3RlcHMgYW5kIHRoZSBQeXRob24gc2lkZSBpcyBnb2luZwovLyB0byBwb2xsIGZvciBjb21wbGV0aW9uIG9mIGVhY2ggc3RlcC4KLy8gVGhpcyB1c2VzIGEgUHJvbWlzZSB0byBibG9jayB0aGUgcHl0aG9uIHNpZGUgb24gY29tcGxldGlvbiBvZiBlYWNoIHN0ZXAsCi8vIHRoZW4gcGFzc2VzIHRoZSByZXN1bHQgb2YgdGhlIHByZXZpb3VzIHN0ZXAgYXMgdGhlIGlucHV0IHRvIHRoZSBuZXh0IHN0ZXAuCmZ1bmN0aW9uIF91cGxvYWRGaWxlc0NvbnRpbnVlKG91dHB1dElkKSB7CiAgY29uc3Qgb3V0cHV0RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG91dHB1dElkKTsKICBjb25zdCBzdGVwcyA9IG91dHB1dEVsZW1lbnQuc3RlcHM7CgogIGNvbnN0IG5leHQgPSBzdGVwcy5uZXh0KG91dHB1dEVsZW1lbnQubGFzdFByb21pc2VWYWx1ZSk7CiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXh0LnZhbHVlLnByb21pc2UpLnRoZW4oKHZhbHVlKSA9PiB7CiAgICAvLyBDYWNoZSB0aGUgbGFzdCBwcm9taXNlIHZhbHVlIHRvIG1ha2UgaXQgYXZhaWxhYmxlIHRvIHRoZSBuZXh0CiAgICAvLyBzdGVwIG9mIHRoZSBnZW5lcmF0b3IuCiAgICBvdXRwdXRFbGVtZW50Lmxhc3RQcm9taXNlVmFsdWUgPSB2YWx1ZTsKICAgIHJldHVybiBuZXh0LnZhbHVlLnJlc3BvbnNlOwogIH0pOwp9CgovKioKICogR2VuZXJhdG9yIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCBiZXR3ZWVuIGVhY2ggYXN5bmMgc3RlcCBvZiB0aGUgdXBsb2FkCiAqIHByb2Nlc3MuCiAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dElkIEVsZW1lbnQgSUQgb2YgdGhlIGlucHV0IGZpbGUgcGlja2VyIGVsZW1lbnQuCiAqIEBwYXJhbSB7c3RyaW5nfSBvdXRwdXRJZCBFbGVtZW50IElEIG9mIHRoZSBvdXRwdXQgZGlzcGxheS4KICogQHJldHVybiB7IUl0ZXJhYmxlPCFPYmplY3Q+fSBJdGVyYWJsZSBvZiBuZXh0IHN0ZXBzLgogKi8KZnVuY3Rpb24qIHVwbG9hZEZpbGVzU3RlcChpbnB1dElkLCBvdXRwdXRJZCkgewogIGNvbnN0IGlucHV0RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlucHV0SWQpOwogIGlucHV0RWxlbWVudC5kaXNhYmxlZCA9IGZhbHNlOwoKICBjb25zdCBvdXRwdXRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQob3V0cHV0SWQpOwogIG91dHB1dEVsZW1lbnQuaW5uZXJIVE1MID0gJyc7CgogIGNvbnN0IHBpY2tlZFByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gewogICAgaW5wdXRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIChlKSA9PiB7CiAgICAgIHJlc29sdmUoZS50YXJnZXQuZmlsZXMpOwogICAgfSk7CiAgfSk7CgogIGNvbnN0IGNhbmNlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpOwogIGlucHV0RWxlbWVudC5wYXJlbnRFbGVtZW50LmFwcGVuZENoaWxkKGNhbmNlbCk7CiAgY2FuY2VsLnRleHRDb250ZW50ID0gJ0NhbmNlbCB1cGxvYWQnOwogIGNvbnN0IGNhbmNlbFByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gewogICAgY2FuY2VsLm9uY2xpY2sgPSAoKSA9PiB7CiAgICAgIHJlc29sdmUobnVsbCk7CiAgICB9OwogIH0pOwoKICAvLyBXYWl0IGZvciB0aGUgdXNlciB0byBwaWNrIHRoZSBmaWxlcy4KICBjb25zdCBmaWxlcyA9IHlpZWxkIHsKICAgIHByb21pc2U6IFByb21pc2UucmFjZShbcGlja2VkUHJvbWlzZSwgY2FuY2VsUHJvbWlzZV0pLAogICAgcmVzcG9uc2U6IHsKICAgICAgYWN0aW9uOiAnc3RhcnRpbmcnLAogICAgfQogIH07CgogIGNhbmNlbC5yZW1vdmUoKTsKCiAgLy8gRGlzYWJsZSB0aGUgaW5wdXQgZWxlbWVudCBzaW5jZSBmdXJ0aGVyIHBpY2tzIGFyZSBub3QgYWxsb3dlZC4KICBpbnB1dEVsZW1lbnQuZGlzYWJsZWQgPSB0cnVlOwoKICBpZiAoIWZpbGVzKSB7CiAgICByZXR1cm4gewogICAgICByZXNwb25zZTogewogICAgICAgIGFjdGlvbjogJ2NvbXBsZXRlJywKICAgICAgfQogICAgfTsKICB9CgogIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykgewogICAgY29uc3QgbGkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaScpOwogICAgbGkuYXBwZW5kKHNwYW4oZmlsZS5uYW1lLCB7Zm9udFdlaWdodDogJ2JvbGQnfSkpOwogICAgbGkuYXBwZW5kKHNwYW4oCiAgICAgICAgYCgke2ZpbGUudHlwZSB8fCAnbi9hJ30pIC0gJHtmaWxlLnNpemV9IGJ5dGVzLCBgICsKICAgICAgICBgbGFzdCBtb2RpZmllZDogJHsKICAgICAgICAgICAgZmlsZS5sYXN0TW9kaWZpZWREYXRlID8gZmlsZS5sYXN0TW9kaWZpZWREYXRlLnRvTG9jYWxlRGF0ZVN0cmluZygpIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ24vYSd9IC0gYCkpOwogICAgY29uc3QgcGVyY2VudCA9IHNwYW4oJzAlIGRvbmUnKTsKICAgIGxpLmFwcGVuZENoaWxkKHBlcmNlbnQpOwoKICAgIG91dHB1dEVsZW1lbnQuYXBwZW5kQ2hpbGQobGkpOwoKICAgIGNvbnN0IGZpbGVEYXRhUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7CiAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7CiAgICAgIHJlYWRlci5vbmxvYWQgPSAoZSkgPT4gewogICAgICAgIHJlc29sdmUoZS50YXJnZXQucmVzdWx0KTsKICAgICAgfTsKICAgICAgcmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKGZpbGUpOwogICAgfSk7CiAgICAvLyBXYWl0IGZvciB0aGUgZGF0YSB0byBiZSByZWFkeS4KICAgIGxldCBmaWxlRGF0YSA9IHlpZWxkIHsKICAgICAgcHJvbWlzZTogZmlsZURhdGFQcm9taXNlLAogICAgICByZXNwb25zZTogewogICAgICAgIGFjdGlvbjogJ2NvbnRpbnVlJywKICAgICAgfQogICAgfTsKCiAgICAvLyBVc2UgYSBjaHVua2VkIHNlbmRpbmcgdG8gYXZvaWQgbWVzc2FnZSBzaXplIGxpbWl0cy4gU2VlIGIvNjIxMTU2NjAuCiAgICBsZXQgcG9zaXRpb24gPSAwOwogICAgZG8gewogICAgICBjb25zdCBsZW5ndGggPSBNYXRoLm1pbihmaWxlRGF0YS5ieXRlTGVuZ3RoIC0gcG9zaXRpb24sIE1BWF9QQVlMT0FEX1NJWkUpOwogICAgICBjb25zdCBjaHVuayA9IG5ldyBVaW50OEFycmF5KGZpbGVEYXRhLCBwb3NpdGlvbiwgbGVuZ3RoKTsKICAgICAgcG9zaXRpb24gKz0gbGVuZ3RoOwoKICAgICAgY29uc3QgYmFzZTY0ID0gYnRvYShTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGNodW5rKSk7CiAgICAgIHlpZWxkIHsKICAgICAgICByZXNwb25zZTogewogICAgICAgICAgYWN0aW9uOiAnYXBwZW5kJywKICAgICAgICAgIGZpbGU6IGZpbGUubmFtZSwKICAgICAgICAgIGRhdGE6IGJhc2U2NCwKICAgICAgICB9LAogICAgICB9OwoKICAgICAgbGV0IHBlcmNlbnREb25lID0gZmlsZURhdGEuYnl0ZUxlbmd0aCA9PT0gMCA/CiAgICAgICAgICAxMDAgOgogICAgICAgICAgTWF0aC5yb3VuZCgocG9zaXRpb24gLyBmaWxlRGF0YS5ieXRlTGVuZ3RoKSAqIDEwMCk7CiAgICAgIHBlcmNlbnQudGV4dENvbnRlbnQgPSBgJHtwZXJjZW50RG9uZX0lIGRvbmVgOwoKICAgIH0gd2hpbGUgKHBvc2l0aW9uIDwgZmlsZURhdGEuYnl0ZUxlbmd0aCk7CiAgfQoKICAvLyBBbGwgZG9uZS4KICB5aWVsZCB7CiAgICByZXNwb25zZTogewogICAgICBhY3Rpb246ICdjb21wbGV0ZScsCiAgICB9CiAgfTsKfQoKc2NvcGUuZ29vZ2xlID0gc2NvcGUuZ29vZ2xlIHx8IHt9OwpzY29wZS5nb29nbGUuY29sYWIgPSBzY29wZS5nb29nbGUuY29sYWIgfHwge307CnNjb3BlLmdvb2dsZS5jb2xhYi5fZmlsZXMgPSB7CiAgX3VwbG9hZEZpbGVzLAogIF91cGxvYWRGaWxlc0NvbnRpbnVlLAp9Owp9KShzZWxmKTsK",
- "ok": true,
- "headers": [
- [
- "content-type",
- "application/javascript"
- ]
- ],
- "status": 200,
- "status_text": "OK"
- }
- },
- "base_uri": "https://localhost:8080/",
- "height": 121
- }
- },
- "source": [
- "import google.colab\n",
- "own_file, _ = google.colab.files.upload().popitem()\n",
- "OWN_FILE = {'audio': own_file}\n",
- "notebook.reset()\n",
- "\n",
- "# load audio waveform and play it\n",
- "waveform, sample_rate = Audio()(OWN_FILE)\n",
- "IPythonAudio(data=waveform.squeeze(), rate=sample_rate, autoplay=True)"
- ],
- "execution_count": null,
- "outputs": [
- {
- "output_type": "display_data",
- "data": {
- "text/html": [
- "\n",
- " \n",
- " \n",
- " Upload widget is only available when the cell has been executed in the\n",
- " current browser session. Please rerun this cell to enable.\n",
- " \n",
- " "
- ],
- "text/plain": [
- ""
- ]
- },
- "metadata": {}
+ "e3169ca885e04536a709d5751173ce9a": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_module_version": "1.5.0",
+ "model_name": "HTMLModel",
+ "state": {
+ "_dom_classes": [],
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "HTMLModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/controls",
+ "_view_module_version": "1.5.0",
+ "_view_name": "HTMLView",
+ "description": "",
+ "description_tooltip": null,
+ "layout": "IPY_MODEL_358c3a67f8b54c4c899e095611fa116b",
+ "placeholder": "",
+ "style": "IPY_MODEL_e1c9df12fa034c93a9b3530ea4a7c5aa",
+ "value": " 318/318 [00:00<00:00, 11.0kB/s]"
+ }
+ },
+ "e4c1e9affaba4045a3ec903091b6f454": {
+ "model_module": "@jupyter-widgets/base",
+ "model_module_version": "1.2.0",
+ "model_name": "LayoutModel",
+ "state": {
+ "_model_module": "@jupyter-widgets/base",
+ "_model_module_version": "1.2.0",
+ "_model_name": "LayoutModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "LayoutView",
+ "align_content": null,
+ "align_items": null,
+ "align_self": null,
+ "border": null,
+ "bottom": null,
+ "display": null,
+ "flex": null,
+ "flex_flow": null,
+ "grid_area": null,
+ "grid_auto_columns": null,
+ "grid_auto_flow": null,
+ "grid_auto_rows": null,
+ "grid_column": null,
+ "grid_gap": null,
+ "grid_row": null,
+ "grid_template_areas": null,
+ "grid_template_columns": null,
+ "grid_template_rows": null,
+ "height": null,
+ "justify_content": null,
+ "justify_items": null,
+ "left": null,
+ "margin": null,
+ "max_height": null,
+ "max_width": null,
+ "min_height": null,
+ "min_width": null,
+ "object_fit": null,
+ "object_position": null,
+ "order": null,
+ "overflow": null,
+ "overflow_x": null,
+ "overflow_y": null,
+ "padding": null,
+ "right": null,
+ "top": null,
+ "visibility": null,
+ "width": null
+ }
},
- {
- "output_type": "stream",
- "name": "stdout",
- "text": [
- "Saving sample.wav to sample.wav\n"
- ]
+ "e7728d9c55e44274966f8f6dbc445c54": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_module_version": "1.5.0",
+ "model_name": "ProgressStyleModel",
+ "state": {
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "ProgressStyleModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "StyleView",
+ "bar_color": null,
+ "description_width": ""
+ }
},
- {
- "output_type": "execute_result",
- "data": {
- "text/html": [
- "\n",
- " \n",
- " \n",
- " Your browser does not support the audio element.\n",
- " \n",
- " "
- ],
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "execution_count": 7
- }
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "dLDSdzCuI0ED"
- },
- "source": [
- "Simply replace `DEMO_FILE` by `OWN_FILE` in the rest of the notebook.\n",
- "\n",
- "Note, however, that unless you provide a groundtruth annotation in the next cell, you will (obviously) not be able to visualize groundtruth annotation nor evaluate the performance of the diarization pipeline quantitatively"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "numGt3msL39D"
- },
- "source": [
- "## Upload groundtruth (optional)\n",
- "\n",
- "The groundtruth file is expected to use the RTTM format, with one line per speech turn with the following convention:\n",
- "\n",
- "```\n",
- "SPEAKER {file_name} 1 {start_time} {duration} {speaker_name} \n",
- "```"
- ]
- },
- {
- "cell_type": "code",
- "metadata": {
- "id": "f5u8wRm3GYFr",
- "colab": {
- "resources": {
- "http://localhost:8080/nbextensions/google.colab/files.js": {
- "data": "Ly8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQwovLwovLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgovLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLy8KLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLy8KLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQovLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAovLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAovLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IEhlbHBlcnMgZm9yIGdvb2dsZS5jb2xhYiBQeXRob24gbW9kdWxlLgogKi8KKGZ1bmN0aW9uKHNjb3BlKSB7CmZ1bmN0aW9uIHNwYW4odGV4dCwgc3R5bGVBdHRyaWJ1dGVzID0ge30pIHsKICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogIGVsZW1lbnQudGV4dENvbnRlbnQgPSB0ZXh0OwogIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHN0eWxlQXR0cmlidXRlcykpIHsKICAgIGVsZW1lbnQuc3R5bGVba2V5XSA9IHN0eWxlQXR0cmlidXRlc1trZXldOwogIH0KICByZXR1cm4gZWxlbWVudDsKfQoKLy8gTWF4IG51bWJlciBvZiBieXRlcyB3aGljaCB3aWxsIGJlIHVwbG9hZGVkIGF0IGEgdGltZS4KY29uc3QgTUFYX1BBWUxPQURfU0laRSA9IDEwMCAqIDEwMjQ7CgpmdW5jdGlvbiBfdXBsb2FkRmlsZXMoaW5wdXRJZCwgb3V0cHV0SWQpIHsKICBjb25zdCBzdGVwcyA9IHVwbG9hZEZpbGVzU3RlcChpbnB1dElkLCBvdXRwdXRJZCk7CiAgY29uc3Qgb3V0cHV0RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG91dHB1dElkKTsKICAvLyBDYWNoZSBzdGVwcyBvbiB0aGUgb3V0cHV0RWxlbWVudCB0byBtYWtlIGl0IGF2YWlsYWJsZSBmb3IgdGhlIG5leHQgY2FsbAogIC8vIHRvIHVwbG9hZEZpbGVzQ29udGludWUgZnJvbSBQeXRob24uCiAgb3V0cHV0RWxlbWVudC5zdGVwcyA9IHN0ZXBzOwoKICByZXR1cm4gX3VwbG9hZEZpbGVzQ29udGludWUob3V0cHV0SWQpOwp9CgovLyBUaGlzIGlzIHJvdWdobHkgYW4gYXN5bmMgZ2VuZXJhdG9yIChub3Qgc3VwcG9ydGVkIGluIHRoZSBicm93c2VyIHlldCksCi8vIHdoZXJlIHRoZXJlIGFyZSBtdWx0aXBsZSBhc3luY2hyb25vdXMgc3RlcHMgYW5kIHRoZSBQeXRob24gc2lkZSBpcyBnb2luZwovLyB0byBwb2xsIGZvciBjb21wbGV0aW9uIG9mIGVhY2ggc3RlcC4KLy8gVGhpcyB1c2VzIGEgUHJvbWlzZSB0byBibG9jayB0aGUgcHl0aG9uIHNpZGUgb24gY29tcGxldGlvbiBvZiBlYWNoIHN0ZXAsCi8vIHRoZW4gcGFzc2VzIHRoZSByZXN1bHQgb2YgdGhlIHByZXZpb3VzIHN0ZXAgYXMgdGhlIGlucHV0IHRvIHRoZSBuZXh0IHN0ZXAuCmZ1bmN0aW9uIF91cGxvYWRGaWxlc0NvbnRpbnVlKG91dHB1dElkKSB7CiAgY29uc3Qgb3V0cHV0RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG91dHB1dElkKTsKICBjb25zdCBzdGVwcyA9IG91dHB1dEVsZW1lbnQuc3RlcHM7CgogIGNvbnN0IG5leHQgPSBzdGVwcy5uZXh0KG91dHB1dEVsZW1lbnQubGFzdFByb21pc2VWYWx1ZSk7CiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXh0LnZhbHVlLnByb21pc2UpLnRoZW4oKHZhbHVlKSA9PiB7CiAgICAvLyBDYWNoZSB0aGUgbGFzdCBwcm9taXNlIHZhbHVlIHRvIG1ha2UgaXQgYXZhaWxhYmxlIHRvIHRoZSBuZXh0CiAgICAvLyBzdGVwIG9mIHRoZSBnZW5lcmF0b3IuCiAgICBvdXRwdXRFbGVtZW50Lmxhc3RQcm9taXNlVmFsdWUgPSB2YWx1ZTsKICAgIHJldHVybiBuZXh0LnZhbHVlLnJlc3BvbnNlOwogIH0pOwp9CgovKioKICogR2VuZXJhdG9yIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCBiZXR3ZWVuIGVhY2ggYXN5bmMgc3RlcCBvZiB0aGUgdXBsb2FkCiAqIHByb2Nlc3MuCiAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dElkIEVsZW1lbnQgSUQgb2YgdGhlIGlucHV0IGZpbGUgcGlja2VyIGVsZW1lbnQuCiAqIEBwYXJhbSB7c3RyaW5nfSBvdXRwdXRJZCBFbGVtZW50IElEIG9mIHRoZSBvdXRwdXQgZGlzcGxheS4KICogQHJldHVybiB7IUl0ZXJhYmxlPCFPYmplY3Q+fSBJdGVyYWJsZSBvZiBuZXh0IHN0ZXBzLgogKi8KZnVuY3Rpb24qIHVwbG9hZEZpbGVzU3RlcChpbnB1dElkLCBvdXRwdXRJZCkgewogIGNvbnN0IGlucHV0RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlucHV0SWQpOwogIGlucHV0RWxlbWVudC5kaXNhYmxlZCA9IGZhbHNlOwoKICBjb25zdCBvdXRwdXRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQob3V0cHV0SWQpOwogIG91dHB1dEVsZW1lbnQuaW5uZXJIVE1MID0gJyc7CgogIGNvbnN0IHBpY2tlZFByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gewogICAgaW5wdXRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIChlKSA9PiB7CiAgICAgIHJlc29sdmUoZS50YXJnZXQuZmlsZXMpOwogICAgfSk7CiAgfSk7CgogIGNvbnN0IGNhbmNlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpOwogIGlucHV0RWxlbWVudC5wYXJlbnRFbGVtZW50LmFwcGVuZENoaWxkKGNhbmNlbCk7CiAgY2FuY2VsLnRleHRDb250ZW50ID0gJ0NhbmNlbCB1cGxvYWQnOwogIGNvbnN0IGNhbmNlbFByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gewogICAgY2FuY2VsLm9uY2xpY2sgPSAoKSA9PiB7CiAgICAgIHJlc29sdmUobnVsbCk7CiAgICB9OwogIH0pOwoKICAvLyBXYWl0IGZvciB0aGUgdXNlciB0byBwaWNrIHRoZSBmaWxlcy4KICBjb25zdCBmaWxlcyA9IHlpZWxkIHsKICAgIHByb21pc2U6IFByb21pc2UucmFjZShbcGlja2VkUHJvbWlzZSwgY2FuY2VsUHJvbWlzZV0pLAogICAgcmVzcG9uc2U6IHsKICAgICAgYWN0aW9uOiAnc3RhcnRpbmcnLAogICAgfQogIH07CgogIGNhbmNlbC5yZW1vdmUoKTsKCiAgLy8gRGlzYWJsZSB0aGUgaW5wdXQgZWxlbWVudCBzaW5jZSBmdXJ0aGVyIHBpY2tzIGFyZSBub3QgYWxsb3dlZC4KICBpbnB1dEVsZW1lbnQuZGlzYWJsZWQgPSB0cnVlOwoKICBpZiAoIWZpbGVzKSB7CiAgICByZXR1cm4gewogICAgICByZXNwb25zZTogewogICAgICAgIGFjdGlvbjogJ2NvbXBsZXRlJywKICAgICAgfQogICAgfTsKICB9CgogIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykgewogICAgY29uc3QgbGkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaScpOwogICAgbGkuYXBwZW5kKHNwYW4oZmlsZS5uYW1lLCB7Zm9udFdlaWdodDogJ2JvbGQnfSkpOwogICAgbGkuYXBwZW5kKHNwYW4oCiAgICAgICAgYCgke2ZpbGUudHlwZSB8fCAnbi9hJ30pIC0gJHtmaWxlLnNpemV9IGJ5dGVzLCBgICsKICAgICAgICBgbGFzdCBtb2RpZmllZDogJHsKICAgICAgICAgICAgZmlsZS5sYXN0TW9kaWZpZWREYXRlID8gZmlsZS5sYXN0TW9kaWZpZWREYXRlLnRvTG9jYWxlRGF0ZVN0cmluZygpIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ24vYSd9IC0gYCkpOwogICAgY29uc3QgcGVyY2VudCA9IHNwYW4oJzAlIGRvbmUnKTsKICAgIGxpLmFwcGVuZENoaWxkKHBlcmNlbnQpOwoKICAgIG91dHB1dEVsZW1lbnQuYXBwZW5kQ2hpbGQobGkpOwoKICAgIGNvbnN0IGZpbGVEYXRhUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7CiAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7CiAgICAgIHJlYWRlci5vbmxvYWQgPSAoZSkgPT4gewogICAgICAgIHJlc29sdmUoZS50YXJnZXQucmVzdWx0KTsKICAgICAgfTsKICAgICAgcmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKGZpbGUpOwogICAgfSk7CiAgICAvLyBXYWl0IGZvciB0aGUgZGF0YSB0byBiZSByZWFkeS4KICAgIGxldCBmaWxlRGF0YSA9IHlpZWxkIHsKICAgICAgcHJvbWlzZTogZmlsZURhdGFQcm9taXNlLAogICAgICByZXNwb25zZTogewogICAgICAgIGFjdGlvbjogJ2NvbnRpbnVlJywKICAgICAgfQogICAgfTsKCiAgICAvLyBVc2UgYSBjaHVua2VkIHNlbmRpbmcgdG8gYXZvaWQgbWVzc2FnZSBzaXplIGxpbWl0cy4gU2VlIGIvNjIxMTU2NjAuCiAgICBsZXQgcG9zaXRpb24gPSAwOwogICAgZG8gewogICAgICBjb25zdCBsZW5ndGggPSBNYXRoLm1pbihmaWxlRGF0YS5ieXRlTGVuZ3RoIC0gcG9zaXRpb24sIE1BWF9QQVlMT0FEX1NJWkUpOwogICAgICBjb25zdCBjaHVuayA9IG5ldyBVaW50OEFycmF5KGZpbGVEYXRhLCBwb3NpdGlvbiwgbGVuZ3RoKTsKICAgICAgcG9zaXRpb24gKz0gbGVuZ3RoOwoKICAgICAgY29uc3QgYmFzZTY0ID0gYnRvYShTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGNodW5rKSk7CiAgICAgIHlpZWxkIHsKICAgICAgICByZXNwb25zZTogewogICAgICAgICAgYWN0aW9uOiAnYXBwZW5kJywKICAgICAgICAgIGZpbGU6IGZpbGUubmFtZSwKICAgICAgICAgIGRhdGE6IGJhc2U2NCwKICAgICAgICB9LAogICAgICB9OwoKICAgICAgbGV0IHBlcmNlbnREb25lID0gZmlsZURhdGEuYnl0ZUxlbmd0aCA9PT0gMCA/CiAgICAgICAgICAxMDAgOgogICAgICAgICAgTWF0aC5yb3VuZCgocG9zaXRpb24gLyBmaWxlRGF0YS5ieXRlTGVuZ3RoKSAqIDEwMCk7CiAgICAgIHBlcmNlbnQudGV4dENvbnRlbnQgPSBgJHtwZXJjZW50RG9uZX0lIGRvbmVgOwoKICAgIH0gd2hpbGUgKHBvc2l0aW9uIDwgZmlsZURhdGEuYnl0ZUxlbmd0aCk7CiAgfQoKICAvLyBBbGwgZG9uZS4KICB5aWVsZCB7CiAgICByZXNwb25zZTogewogICAgICBhY3Rpb246ICdjb21wbGV0ZScsCiAgICB9CiAgfTsKfQoKc2NvcGUuZ29vZ2xlID0gc2NvcGUuZ29vZ2xlIHx8IHt9OwpzY29wZS5nb29nbGUuY29sYWIgPSBzY29wZS5nb29nbGUuY29sYWIgfHwge307CnNjb3BlLmdvb2dsZS5jb2xhYi5fZmlsZXMgPSB7CiAgX3VwbG9hZEZpbGVzLAogIF91cGxvYWRGaWxlc0NvbnRpbnVlLAp9Owp9KShzZWxmKTsK",
- "ok": true,
- "headers": [
- [
- "content-type",
- "application/javascript"
- ]
- ],
- "status": 200,
- "status_text": "OK"
- }
- },
- "base_uri": "https://localhost:8080/",
- "height": 193
+ "e928540e99564d808cb2d12c92daa498": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_module_version": "1.5.0",
+ "model_name": "HTMLModel",
+ "state": {
+ "_dom_classes": [],
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "HTMLModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/controls",
+ "_view_module_version": "1.5.0",
+ "_view_name": "HTMLView",
+ "description": "",
+ "description_tooltip": null,
+ "layout": "IPY_MODEL_c9974003727a401797953ef2885db5a2",
+ "placeholder": "",
+ "style": "IPY_MODEL_77a361d1ff214e8799891bbeb28a0789",
+ "value": "Downloading: 100%"
+ }
},
- "outputId": "a0c2b7a7-177d-430c-fc7e-d93d168aaf90"
- },
- "source": [
- "groundtruth_rttm, _ = google.colab.files.upload().popitem()\n",
- "groundtruths = load_rttm(groundtruth_rttm)\n",
- "if OWN_FILE['audio'] in groundtruths:\n",
- " groundtruth = groundtruths[OWN_FILE['audio']]\n",
- "else:\n",
- " _, groundtruth = groundtruths.popitem()\n",
- "groundtruth"
- ],
- "execution_count": null,
- "outputs": [
- {
- "output_type": "display_data",
- "data": {
- "text/html": [
- "\n",
- " \n",
- " \n",
- " Upload widget is only available when the cell has been executed in the\n",
- " current browser session. Please rerun this cell to enable.\n",
- " \n",
- " "
- ],
- "text/plain": [
- ""
- ]
- },
- "metadata": {}
+ "e98cf7a63c814ffd94f69928f0700ebf": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_module_version": "1.5.0",
+ "model_name": "HTMLModel",
+ "state": {
+ "_dom_classes": [],
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "HTMLModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/controls",
+ "_view_module_version": "1.5.0",
+ "_view_name": "HTMLView",
+ "description": "",
+ "description_tooltip": null,
+ "layout": "IPY_MODEL_aba21021d3bb4565a58ffa40049810db",
+ "placeholder": "",
+ "style": "IPY_MODEL_f7812fa7fbf744c1b261b985d085e28e",
+ "value": "Downloading: 100%"
+ }
+ },
+ "ea95ffd922c0455d957120f034e541f8": {
+ "model_module": "@jupyter-widgets/base",
+ "model_module_version": "1.2.0",
+ "model_name": "LayoutModel",
+ "state": {
+ "_model_module": "@jupyter-widgets/base",
+ "_model_module_version": "1.2.0",
+ "_model_name": "LayoutModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "LayoutView",
+ "align_content": null,
+ "align_items": null,
+ "align_self": null,
+ "border": null,
+ "bottom": null,
+ "display": null,
+ "flex": null,
+ "flex_flow": null,
+ "grid_area": null,
+ "grid_auto_columns": null,
+ "grid_auto_flow": null,
+ "grid_auto_rows": null,
+ "grid_column": null,
+ "grid_gap": null,
+ "grid_row": null,
+ "grid_template_areas": null,
+ "grid_template_columns": null,
+ "grid_template_rows": null,
+ "height": null,
+ "justify_content": null,
+ "justify_items": null,
+ "left": null,
+ "margin": null,
+ "max_height": null,
+ "max_width": null,
+ "min_height": null,
+ "min_width": null,
+ "object_fit": null,
+ "object_position": null,
+ "order": null,
+ "overflow": null,
+ "overflow_x": null,
+ "overflow_y": null,
+ "padding": null,
+ "right": null,
+ "top": null,
+ "visibility": null,
+ "width": null
+ }
+ },
+ "eae11f84c2644ada8295b445c924baec": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_module_version": "1.5.0",
+ "model_name": "HTMLModel",
+ "state": {
+ "_dom_classes": [],
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "HTMLModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/controls",
+ "_view_module_version": "1.5.0",
+ "_view_name": "HTMLView",
+ "description": "",
+ "description_tooltip": null,
+ "layout": "IPY_MODEL_2cbf0faadd4842c8b22e10541ff9de4e",
+ "placeholder": "",
+ "style": "IPY_MODEL_ab32c7daa1d9404fb921f39fbc4fc05c",
+ "value": "Downloading: 100%"
+ }
+ },
+ "ebc9801e164a44b3b6f8dc7f590e1c79": {
+ "model_module": "@jupyter-widgets/base",
+ "model_module_version": "1.2.0",
+ "model_name": "LayoutModel",
+ "state": {
+ "_model_module": "@jupyter-widgets/base",
+ "_model_module_version": "1.2.0",
+ "_model_name": "LayoutModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "LayoutView",
+ "align_content": null,
+ "align_items": null,
+ "align_self": null,
+ "border": null,
+ "bottom": null,
+ "display": null,
+ "flex": null,
+ "flex_flow": null,
+ "grid_area": null,
+ "grid_auto_columns": null,
+ "grid_auto_flow": null,
+ "grid_auto_rows": null,
+ "grid_column": null,
+ "grid_gap": null,
+ "grid_row": null,
+ "grid_template_areas": null,
+ "grid_template_columns": null,
+ "grid_template_rows": null,
+ "height": null,
+ "justify_content": null,
+ "justify_items": null,
+ "left": null,
+ "margin": null,
+ "max_height": null,
+ "max_width": null,
+ "min_height": null,
+ "min_width": null,
+ "object_fit": null,
+ "object_position": null,
+ "order": null,
+ "overflow": null,
+ "overflow_x": null,
+ "overflow_y": null,
+ "padding": null,
+ "right": null,
+ "top": null,
+ "visibility": null,
+ "width": null
+ }
},
- {
- "output_type": "stream",
- "name": "stdout",
- "text": [
- "Saving sample.rttm to sample.rttm\n"
- ]
+ "ecd8e5e364d34ea8bfbba4fbd467384d": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_module_version": "1.5.0",
+ "model_name": "HTMLModel",
+ "state": {
+ "_dom_classes": [],
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "HTMLModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/controls",
+ "_view_module_version": "1.5.0",
+ "_view_name": "HTMLView",
+ "description": "",
+ "description_tooltip": null,
+ "layout": "IPY_MODEL_554e567a83b348f88092c6ba01830930",
+ "placeholder": "",
+ "style": "IPY_MODEL_6e334cad2e94462cae6e722bd6f11a9e",
+ "value": "Downloading: 100%"
+ }
},
- {
- "output_type": "execute_result",
- "data": {
- "image/png": "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\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "execution_count": 8
- }
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "ByXlUaTfneEB"
- },
- "source": [
- "# Speaker diarization with `pyannote.pipeline`\n",
- "\n",
- "We are about to run a full speaker diarization pipeline, that includes speaker segmentation, speaker embedding, and a final clustering step. **Brace yourself!**"
- ]
- },
- {
- "cell_type": "code",
- "metadata": {
- "id": "go1wJBYJnsIx",
- "outputId": "2c496b59-b574-4f30-80df-059b5ccb71f7",
- "colab": {
- "base_uri": "https://localhost:8080/",
- "height": 273,
- "referenced_widgets": [
- "5da54fdb45e1485badd323232321bc96",
- "e6f461cb90cc498da90a20f2a6c610e0",
- "3e8a884bd6c94a86a324cfa7b9580ea7",
- "0b03a220e59848dfafb6411b24c3b37f",
- "001a4d8dd8954706802b3add70f34d4b",
- "b950f7fe8ea34776bde01ed2f4244f5f",
- "f7b175bb312c4f43809c97f98e6e84a3",
- "e0c6b8aff2ad4849b3dac392ee388112",
- "8ddd76365cfd4408b8ca12309b183967",
- "df8dc69ca1cf4e57bfebf4762c0460f0",
- "799487c4c6de471c827f120f1c11d9e2",
- "9d713ac6d10949fb8d277286d969ad3b",
- "e2be4344fe8e4a36be35513041ea74a3",
- "2ed58d60a46d4f8491de7ad61d7cc589",
- "4ea0432a604e4ac197999debb131c557",
- "21cd4080794342dbb3209df737d4f835",
- "5cdd23be0a804fd192b6ccaddcb52964",
- "889aca71e695487d9cd31c2dae585a64",
- "b9fc636fcc6f4a2785999385cd340ab9",
- "ebf9284b6e514698b8c7389c758f7520",
- "5749dba1be9b4eaaad17928a90ea411c",
- "f0f3451d91bf4c5a9a8e20623a7b528d",
- "0f8ee54b3031408da0281f7aa98eff25",
- "ff89e65846414100b84b1f9cf8b70fd9",
- "a950bac54c5742e79cd2de4fda29c2e0",
- "3f5459fa25654a76bfec64d1dcb542b6",
- "fa10eb9e43fd43a49934cdb4301aefff",
- "547cbb166dba40d1b626bd204ff3cf96",
- "a2aba4e8152c4fbda91bf59a42f25604",
- "69a8212dded54f79adf3f8b60b9eb000",
- "25142cfd61084c128fe39adad5016109",
- "7e64327fa6e948edae034c8d52bb96b4",
- "32895abb57a7426aa089230aa49cfff2",
- "747aa6596d1a4b04a6f77e38179776ad",
- "e65942656e2347eba0a3fe3ae872159b",
- "6e5c84bfa614482b960be701f92ee22c",
- "def1205f95274d3db0fafc9c8dd1c913",
- "46a04e196f9e461bb43e541270022b8d",
- "18a02eecf49746cc972882c2cca9ded2",
- "31e65957ea204c1084119e3e39528832",
- "aa6ccf1390cc4139b7ba23ea7129b273",
- "264cde3fae9d442abdb74b4d45288be3",
- "2c28a61cfa474c7498a8381e74639530",
- "5895a4011e3143a1931566822a65fd50",
- "43ada2ceb8ad44d7b8c1a3a1d0aefe2d",
- "42b71601aeef4271ac150288a78bf66a",
- "300b503e606147bb8bc9ff7a98be0bac",
- "dcce36fe0b0946aaa484ae1f5f7eb6da",
- "5beb3def5ae64f05b3ceb26c611dcb79",
- "030181ab29c149dfaf4940ea2c713190",
- "cdec3493e32e49a1abc5f3c6783a49d9",
- "b0efbf56235f4f9f866137c85ea2e189",
- "12bee4747bc74073bf4cbfd36f0445cb",
- "cb0fc23346fa4b638c3cce496ac6cd70",
- "0200715daa5e4f4e8f7839d2ea579f19",
- "892182c8c97d426d9acf5467d1354d32",
- "32acc8ab3c5643d7a4c3595fd67da269",
- "3c3189d90a404112ac7f6081acab7e61",
- "34e0fb65b69d470099506bd24362c52c",
- "c697909d569d40918acd835108e29ae7",
- "d690ed1451e74799a2c4c265cd562ed9",
- "f89679f445424ec1ba2203fb8f7753de",
- "735b5f02606d4c0288f70469a8ab2902",
- "0308a7a44b8b4a9cae7bda21fbad99f5",
- "967a5451e89049b4ac4688338495b50e",
- "bb655ffda271431892bba5ebab9fd93b",
- "f7626a7dae2a421ba31a578746be491d",
- "97d03beea7cb4e479e1ee67edfa5f883",
- "00751b0ca24b47c1b7d337a5b17fc6c1",
- "9fc668b6710c449e898d4b8401fe974c",
- "d0ea1fb45fe24bc3b549acc4e05860cd",
- "c15d7b4b314b4fb1beb5e8b001114392",
- "6f73694403ae46538b7280ab31657ebc",
- "f33d2ce982144ced87a7a834fe83bdb8",
- "7693042eb27e4994b86ed1afb293be56",
- "fd6ccdba0a2746419e744035e1096bf2",
- "2dc0b625a4ff4a60abc4fa3c6671c9ab",
- "0552df02d084406da5b7c51e18fd2cb0",
- "f61c385e5fa542a98652a434ad4cd324",
- "923af70854ad4651bd2d2a8556ab59f6",
- "170805a3d7ec457aaacd4d9a0acd09d0",
- "14713e02e5734e46bfb9f9f815699e39",
- "bea9fb28848d4c3da10df4fec3dfdb6b",
- "a296598d7d3040e8b8b4dab4f7819e91",
- "ab878626da504834b827f1762bcd2c20",
- "f5a6de62a96340f4ab3094f08e8d54ef",
- "af1e4e3e52304c51a46eab4b989a3f0b",
- "b0b8bb8fe0bc47908273136304cf4870"
- ]
- }
- },
- "source": [
- "from pyannote.audio import Pipeline\n",
- "pipeline = Pipeline.from_pretrained('pyannote/speaker-diarization')\n",
- "diarization = pipeline(DEMO_FILE)"
- ],
- "execution_count": 9,
- "outputs": [
- {
- "output_type": "display_data",
- "data": {
- "text/plain": [
- "Downloading: 0%| | 0.00/598 [00:00, ?B/s]"
- ],
- "application/vnd.jupyter.widget-view+json": {
- "version_major": 2,
- "version_minor": 0,
- "model_id": "5da54fdb45e1485badd323232321bc96"
- }
- },
- "metadata": {}
+ "ed169fd606274f2ebbb3e8f32ab42431": {
+ "model_module": "@jupyter-widgets/base",
+ "model_module_version": "1.2.0",
+ "model_name": "LayoutModel",
+ "state": {
+ "_model_module": "@jupyter-widgets/base",
+ "_model_module_version": "1.2.0",
+ "_model_name": "LayoutModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "LayoutView",
+ "align_content": null,
+ "align_items": null,
+ "align_self": null,
+ "border": null,
+ "bottom": null,
+ "display": null,
+ "flex": null,
+ "flex_flow": null,
+ "grid_area": null,
+ "grid_auto_columns": null,
+ "grid_auto_flow": null,
+ "grid_auto_rows": null,
+ "grid_column": null,
+ "grid_gap": null,
+ "grid_row": null,
+ "grid_template_areas": null,
+ "grid_template_columns": null,
+ "grid_template_rows": null,
+ "height": null,
+ "justify_content": null,
+ "justify_items": null,
+ "left": null,
+ "margin": null,
+ "max_height": null,
+ "max_width": null,
+ "min_height": null,
+ "min_width": null,
+ "object_fit": null,
+ "object_position": null,
+ "order": null,
+ "overflow": null,
+ "overflow_x": null,
+ "overflow_y": null,
+ "padding": null,
+ "right": null,
+ "top": null,
+ "visibility": null,
+ "width": null
+ }
},
- {
- "output_type": "display_data",
- "data": {
- "text/plain": [
- "Downloading: 0%| | 0.00/17.7M [00:00, ?B/s]"
- ],
- "application/vnd.jupyter.widget-view+json": {
- "version_major": 2,
- "version_minor": 0,
- "model_id": "9d713ac6d10949fb8d277286d969ad3b"
- }
- },
- "metadata": {}
+ "ee537ee5470f4d7b816a8c8f96948b4d": {
+ "model_module": "@jupyter-widgets/base",
+ "model_module_version": "1.2.0",
+ "model_name": "LayoutModel",
+ "state": {
+ "_model_module": "@jupyter-widgets/base",
+ "_model_module_version": "1.2.0",
+ "_model_name": "LayoutModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "LayoutView",
+ "align_content": null,
+ "align_items": null,
+ "align_self": null,
+ "border": null,
+ "bottom": null,
+ "display": null,
+ "flex": null,
+ "flex_flow": null,
+ "grid_area": null,
+ "grid_auto_columns": null,
+ "grid_auto_flow": null,
+ "grid_auto_rows": null,
+ "grid_column": null,
+ "grid_gap": null,
+ "grid_row": null,
+ "grid_template_areas": null,
+ "grid_template_columns": null,
+ "grid_template_rows": null,
+ "height": null,
+ "justify_content": null,
+ "justify_items": null,
+ "left": null,
+ "margin": null,
+ "max_height": null,
+ "max_width": null,
+ "min_height": null,
+ "min_width": null,
+ "object_fit": null,
+ "object_position": null,
+ "order": null,
+ "overflow": null,
+ "overflow_x": null,
+ "overflow_y": null,
+ "padding": null,
+ "right": null,
+ "top": null,
+ "visibility": null,
+ "width": null
+ }
},
- {
- "output_type": "display_data",
- "data": {
- "text/plain": [
- "Downloading: 0%| | 0.00/318 [00:00, ?B/s]"
- ],
- "application/vnd.jupyter.widget-view+json": {
- "version_major": 2,
- "version_minor": 0,
- "model_id": "0f8ee54b3031408da0281f7aa98eff25"
- }
- },
- "metadata": {}
+ "f21c0c6379d74898ac6aadcb6fc14a8a": {
+ "model_module": "@jupyter-widgets/base",
+ "model_module_version": "1.2.0",
+ "model_name": "LayoutModel",
+ "state": {
+ "_model_module": "@jupyter-widgets/base",
+ "_model_module_version": "1.2.0",
+ "_model_name": "LayoutModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "LayoutView",
+ "align_content": null,
+ "align_items": null,
+ "align_self": null,
+ "border": null,
+ "bottom": null,
+ "display": null,
+ "flex": null,
+ "flex_flow": null,
+ "grid_area": null,
+ "grid_auto_columns": null,
+ "grid_auto_flow": null,
+ "grid_auto_rows": null,
+ "grid_column": null,
+ "grid_gap": null,
+ "grid_row": null,
+ "grid_template_areas": null,
+ "grid_template_columns": null,
+ "grid_template_rows": null,
+ "height": null,
+ "justify_content": null,
+ "justify_items": null,
+ "left": null,
+ "margin": null,
+ "max_height": null,
+ "max_width": null,
+ "min_height": null,
+ "min_width": null,
+ "object_fit": null,
+ "object_position": null,
+ "order": null,
+ "overflow": null,
+ "overflow_x": null,
+ "overflow_y": null,
+ "padding": null,
+ "right": null,
+ "top": null,
+ "visibility": null,
+ "width": null
+ }
},
- {
- "output_type": "display_data",
- "data": {
- "text/plain": [
- "Downloading: 0%| | 0.00/1.92k [00:00, ?B/s]"
- ],
- "application/vnd.jupyter.widget-view+json": {
- "version_major": 2,
- "version_minor": 0,
- "model_id": "747aa6596d1a4b04a6f77e38179776ad"
- }
- },
- "metadata": {}
+ "f439c1de68ac4c799d81fdb29d053d10": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_module_version": "1.5.0",
+ "model_name": "DescriptionStyleModel",
+ "state": {
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "DescriptionStyleModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "StyleView",
+ "description_width": ""
+ }
},
- {
- "output_type": "display_data",
- "data": {
- "text/plain": [
- "Downloading: 0%| | 0.00/83.3M [00:00, ?B/s]"
- ],
- "application/vnd.jupyter.widget-view+json": {
- "version_major": 2,
- "version_minor": 0,
- "model_id": "43ada2ceb8ad44d7b8c1a3a1d0aefe2d"
- }
- },
- "metadata": {}
+ "f7812fa7fbf744c1b261b985d085e28e": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_module_version": "1.5.0",
+ "model_name": "DescriptionStyleModel",
+ "state": {
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "DescriptionStyleModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "StyleView",
+ "description_width": ""
+ }
},
- {
- "output_type": "display_data",
- "data": {
- "text/plain": [
- "Downloading: 0%| | 0.00/1.92k [00:00, ?B/s]"
- ],
- "application/vnd.jupyter.widget-view+json": {
- "version_major": 2,
- "version_minor": 0,
- "model_id": "892182c8c97d426d9acf5467d1354d32"
- }
- },
- "metadata": {}
+ "f91dcd9f30c743d69f9d4b7e8d1beba5": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_module_version": "1.5.0",
+ "model_name": "HTMLModel",
+ "state": {
+ "_dom_classes": [],
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "HTMLModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/controls",
+ "_view_module_version": "1.5.0",
+ "_view_name": "HTMLView",
+ "description": "",
+ "description_tooltip": null,
+ "layout": "IPY_MODEL_2b2d7912186a49dd9891ae12c77482c7",
+ "placeholder": "",
+ "style": "IPY_MODEL_1600b9cd09c446e581b7912e35c9f56e",
+ "value": " 83.3M/83.3M [00:01<00:00, 60.9MB/s]"
+ }
},
- {
- "output_type": "display_data",
- "data": {
- "text/plain": [
- "Downloading: 0%| | 0.00/5.53M [00:00, ?B/s]"
- ],
- "application/vnd.jupyter.widget-view+json": {
- "version_major": 2,
- "version_minor": 0,
- "model_id": "f7626a7dae2a421ba31a578746be491d"
- }
- },
- "metadata": {}
+ "fc9a3c4ae0a947ec91a227360a80f602": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_module_version": "1.5.0",
+ "model_name": "FloatProgressModel",
+ "state": {
+ "_dom_classes": [],
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "FloatProgressModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/controls",
+ "_view_module_version": "1.5.0",
+ "_view_name": "ProgressView",
+ "bar_style": "success",
+ "description": "",
+ "description_tooltip": null,
+ "layout": "IPY_MODEL_27f6f437c5264368bc2c679942ad1e53",
+ "max": 83316686,
+ "min": 0,
+ "orientation": "horizontal",
+ "style": "IPY_MODEL_e7728d9c55e44274966f8f6dbc445c54",
+ "value": 83316686
+ }
},
- {
- "output_type": "display_data",
- "data": {
- "text/plain": [
- "Downloading: 0%| | 0.00/129k [00:00, ?B/s]"
- ],
- "application/vnd.jupyter.widget-view+json": {
- "version_major": 2,
- "version_minor": 0,
- "model_id": "0552df02d084406da5b7c51e18fd2cb0"
- }
- },
- "metadata": {}
- }
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "eTODmPKeofGo"
- },
- "source": [
- "That's it? Yes, that's it :-)"
- ]
- },
- {
- "cell_type": "code",
- "metadata": {
- "id": "FKEnEtrOoIAk",
- "outputId": "0d5523ee-6c6d-4a7e-d0ab-362c99e60858",
- "colab": {
- "base_uri": "https://localhost:8080/",
- "height": 117
- }
- },
- "source": [
- "diarization"
- ],
- "execution_count": 10,
- "outputs": [
- {
- "output_type": "execute_result",
- "data": {
- "text/plain": [
- ""
- ],
- "image/png": "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\n"
- },
- "metadata": {},
- "execution_count": 10
- }
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "smAd5ofBqWWB"
- },
- "source": [
- "# Evaluation with `pyannote.metrics`\n",
- "\n",
- "Because groundtruth is available, we can evaluate the quality of the diarization pipeline by computing the [diarization error rate](http://pyannote.github.io/pyannote-metrics/reference.html#diarization)."
- ]
- },
- {
- "cell_type": "code",
- "metadata": {
- "id": "z0Ore3eGpNyy"
- },
- "source": [
- "from pyannote.metrics.diarization import DiarizationErrorRate\n",
- "metric = DiarizationErrorRate()\n",
- "der = metric(groundtruth, diarization)"
- ],
- "execution_count": 11,
- "outputs": []
- },
- {
- "cell_type": "code",
- "metadata": {
- "id": "e0F8IUaqYFU8",
- "outputId": "4de50c4e-640a-46d2-d412-c7242cccb263",
- "colab": {
- "base_uri": "https://localhost:8080/"
- }
- },
- "source": [
- "print(f'diarization error rate = {100 * der:.1f}%')"
- ],
- "execution_count": 12,
- "outputs": [
- {
- "output_type": "stream",
- "name": "stdout",
- "text": [
- "diarization error rate = 18.4%\n"
- ]
- }
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "2w0Xp_ElrYTa"
- },
- "source": [
- "This implementation of diarization error rate is brought to you by [`pyannote.metrics`](http://pyannote.github.io/pyannote-metrics/).\n",
- "\n",
- "It can also be used to improve visualization by find the optimal one-to-one mapping between groundtruth and hypothesized speakers."
- ]
- },
- {
- "cell_type": "code",
- "metadata": {
- "id": "WPF5JG3Ppt9K",
- "outputId": "7963cc1e-b26a-4fde-cdb0-d72057975dd4",
- "colab": {
- "base_uri": "https://localhost:8080/",
- "height": 117
- }
- },
- "source": [
- "mapping = metric.optimal_mapping(groundtruth, diarization)\n",
- "diarization.rename_labels(mapping=mapping)"
- ],
- "execution_count": 13,
- "outputs": [
- {
- "output_type": "execute_result",
- "data": {
- "text/plain": [
- ""
- ],
- "image/png": "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\n"
- },
- "metadata": {},
- "execution_count": 13
- }
- ]
- },
- {
- "cell_type": "code",
- "metadata": {
- "id": "DKk6ePLWp4eB",
- "outputId": "e0a18bd2-ebbb-49b1-f2c9-73196177b799",
- "colab": {
- "base_uri": "https://localhost:8080/",
- "height": 117
- }
- },
- "source": [
- "groundtruth"
- ],
- "execution_count": 14,
- "outputs": [
- {
- "output_type": "execute_result",
- "data": {
- "text/plain": [
- ""
- ],
- "image/png": "iVBORw0KGgoAAAANSUhEUgAABH0AAACsCAYAAADmO9AtAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAUdElEQVR4nO3df7BtZXkf8O9TrlKiSdVAU4OklzJqJqgxchMhExxjmmKCA2hNQ4zjjzJVk+pMfyStJtNysLVTFaVFGyoGEq0gWhvxjijI+CNx2sHkosgPCQ1EDdyAje0oohZEnv6x1+09Xs6595yz97n77HU+n5kzd++137XWs971nHXWfu777l3dHQAAAADG5a/NOwAAAAAAZk/RBwAAAGCEFH0AAAAARkjRBwAAAGCEFH0AAAAARkjRBwAAAGCEFH0AAAAARkjRBwAAAGCEFH0AAAAARkjRBwAAAGCERlP0qarvVtUNy352VtWzq+rrByz/u6u0f+2w/Piq+kxV3V5V76uqRw7Ln1VVn62qB6vqhcv2+7eH5TdU1S1V9ar59MDszatPh9d+pKo+VlW3VtUXqmrn4T7+zVBVXVXvWfZ8R1X9VVV9eHj+suH58n78saHvv33A8pcM65xUVTcN/XthVdWw/JeGnHyoqnatEMuPVNV9VfUbh+v4N9tG+3d47cSq+kRV3VZVf1ZV/2pZX9bQt7dX1Y1V9Yxl+7i6qr62bx/Llv9+VX1x2X6efnh6AQAAYGLHvAOYoW939/e8qRoKBZ/u7uetpf3gjUku6O4rquo/JzknyUVJ/iLJy5Ic+Ab57iSndPf9VfXoJDdX1e7u/supjmZrmFefJsm7k7yhu68d+vWhDR/F1vLNJE+pqqO6+9tJfj7J3gPavK+7X718wdDvd6zSvxcl+UdJPpPkI0mem+SjSW5O8oIk71gllrcO7cZko/17VJLdSX6tuz9WVd+X5L8l+fUk/ynJLyR54vDzzEz6/JnD6m9O8n1JXrlCPL/Z3R+YyZEBAACs02hG+szC8L/6z0my703au5KclSTd/aXuvjEHFB+6+4Huvn94emT06ffYSJ8OIy92dPe1Q7v7uvtbhy/qTfeRJKcPj38lyXs3uqGqenySH+ju67q7MymW7evfW7v7tlXWOyvJF5PcstF9b2Eb6d8XJfnv3f2xJBny7dVJXju8fmaSd/fEdUkeM/R9uvvjSb4xw/gBAABmYkwFiqOWTaP44LLlpx4wleOEFdrfUFW/nOQHk3ytux8c2tyV5NhD7biqjquqG5PcmeSNIxnlk8yvT5+U5GtV9QdV9bmqenNVHTHbQ5urK5KcXVV/PcnTMhmhs9wvH9CPRw3LTzhg+amZ9OVdy9Y9ZP8OI6f+ZZLzZnI0W89G+vfEJNcvb9TddyR5dFX9QCZ9eueyl9d0bUjyhmE62AVVdeRGDwgAAGAjNmV618nnXrOU5NwZbvK86847bekQbVabWrTmqUhVdfRGguvuO5M8rap+OMmVVfWB7v7KRra1mjOuPH0pM+7T3WddtXSINvPq0x1JTk3yE5lMAXtfJtPALtnAtlb1jjPfs5QZ9+krP/TipUM16u4bh+lav5LJqJQDrTT9KFlhetdKn9WzBkuZTLe7b9jupth77HFLmXH/Hrv3zqVDNZqif2ftdUnuSfLIJBdnUmh7/WbsCAAAYCVjGukzC/87k2kb+4phT8jDPw9kVcMIn5szKVgwsZE+vSvJDd3958MIoSuTPOMQ6yya3UnOzxRTuwZ7M+nTfdbSv89M8qaq+lKSf5Lkt6rq1QdfZeGst3+/kOSk5Quq6u8kua+7782kT49b9vIh+7m77x6mg92f5PeS/NQaYwEAAJgJRZ9lhs9E+WSSfd8k9dIkHzrYOlX1hH3Tb6rqsUl+JsmKn6OyHW2kT5P8SSaFomOG58/J5E35mFya5LzuvmmajXT33UnuraqTh89PekkO0b/dfWp37+zunUn+Q5J/191vnyaOLWi9/XtZkp+p/d9Ed1SSC5O8aXh9d5KXDN/idXKSrw99v6p9n/kznJezMikIAwAAHDY1eU+++Krqvu5+9AHLnp3JG+AvLlv8b7v7A1X13STL3xBe3d2vHf53/4okj0vyuSQvHr6Z6yeTfDDJY5P83yT3dPeJVfXzSd6SpJNUkrd398Wbc5SH17z6dNjPvn6tTD5r5RXd/cBmHOfhdJA+/Y3ufl5VvSyTb4NaPork15P8ZZJb870FxUu7+8JhitfvJzkqk2/jek13d1U9P8nbkhyT5GuZjJ467YB9L2UymuX8mR3kHG20f7v7f1TVUzPpr8cnOSLJf0ny+qEvK8nbM/lmtG8leXl37xm2/+kkP5rk0ZmMbDunu6+pqk9k0veV5IYkr+ru+zbp0AEAAB5mNEUfAAAAAPYzvQsAAABghBR9AAAAAEZI0QcAAABghBR9AAAAAEZI0QcAAABghHbMYiNHH31079y5cxabAgAAACDJ9ddf/9XuPmaj68+k6LNz587s2bNnFpsCAAAAIElVfXma9U3vAgAAABghRR8AAACAEVL0AQAAABghRR8AAACAEVL0AQAAABghRR8AAACAEVL0AQAAABghRR8AAACAEVL0AQAAABghRR8AAACAEVL0AQAAABghRR8AAACAEVL0AQAAABghRR8AAACAEVL0AQAAABghRR8AAACAEVL0AQAAABghRR8AAACAEVL0AQAAABghRR8AAACAEZpJ0edb/+fbs9gMfI/z/+tb5h0C63T5rZclSfa89/NTbWfa9beCe9/y1nmHsKKtFNdGzvM8c2Nffq/3NRbLNOdy37rv/OTtswqHTTbLc+U6AOO21X7Ht1o8ydaMiRkVfb6p6MMm+KNHfGLeIbBOV9x2eZLk+itummo7066/FXzjrRfMO4QVbaW4NnKe55kb+/J7va+xWKY5l/vWveRTd8wqHDbZLM+V6wCM21b7Hd9q8SRbMyZM7wIAAAAYJUUfAAAAgBHaMasNvePM98xqUzDx8uSMK0+fdxRskGtCsvfY4+Ydwpa3aHnimrQ9zOI8n3zuNTOIhEXjGgEcTq45rIWRPgAAAAAjpOgDAAAAMEIzm971yg+9eFabgiTJVVe+N7vPumreYbAOy4eYTnNNWLQpP6s5du+d8w7hYbbalLP15sm8c2O1a5Lh1eOy0b89y/PguvNOm1U4bKJZT8Nz3wLjtRX/1m+1a85W7COM9AEAAAAYJUUfAAAAgBFS9AEAAAAYoZkUfR71uKNmsRn4Hs/6znPmHQLrdPaTX5QkOensp061nWnX3wq+/5/903mHsKKtFNdGzvM8c2Nffq/3NRbLNOdy37rnPPuEWYXDJpvluXIdgHHbar/jWy2eZGvGRFLdPfVGdu3a1Xv27JlBOAAAAAAkSVVd3927Nrq+6V0AAAAAI6ToAwAAADBCij4AAAAAI6ToAwAAADBCij4AAAAAI6ToAwAAADBCij4AAAAAI6ToAwAAADBCij4AAAAAI6ToAwAAADBCij4AAAAAI6ToAwAAADBCij4AAAAAI6ToAwAAADBCij4zcvmtlx2WdWbhwP2uN453fvL2dS2fxrTb3IyYtjP9OZ3N7j/nh+1K7o/Havcka7lXufctb13XvtbbHtbjUNcl163N64Pt2Lfb8ZhZO0WfGbnitssPyzqzcOB+1xvHJZ+6Y13LpzHtNjcjpu1Mf05ns/vP+WG7kvvjsdo9yVruVb7x1gvWta/1tof1ONR1yXVr8/pgO/btdjxm1k7RBwAAAGCEFH0AAAAARmjHvAMYkzOuPH3eIazZtLGefO41M4pka+2LQ3M+tjbnB1h009yj7D32uBlGAtPxN/nQ9NHs6EtWY6QPAAAAwAgp+gAAAACMkOldM7T7rKvW1X6e08GWx7qROK4777SHLdusIYUr7WutDHOcvWnOx3Z3OPLR+WE7cq0fl5Xup9Z6r3Ls3jvXvB9TwdhsB/ub7Lo1sRn3Ldu1b90Djle9frr1jfQBAAAAGCFFHwAAAIARUvQBAAAAGKEjlpaWpt7IxRdfvPSKV7xi+mgWWHfy1GOetunrzMKB+11vHJ3kpOMft+bl05h2m5sR03amP6ez2f3n/LBdyf3xWO2eZK33Kkf+9Cnr2t9628NaHeq65Lq1eX2wHft2Ox7zdnLeeefdvbS0dPFG16/unjqIXbt29Z49e6beDgAAAAATVXV9d+/a6PqmdwEAAACMkKIPAAAAwAgp+gAAAACMkKIPAAAAwAgp+gAAAACMkKIPAAAAwAgp+gAAAACMkKIPAAAAwAgp+gAAAACMkKIPAAAAwAgp+gAAAACMkKIPAAAAwAgp+gAAAACMkKIPAAAAwAgp+hwG7/zk7etaDsB+l9962UGfAwAAK1P0OQwu+dQd61oOwH5X3Hb5QZ8DAAArU/QBAAAAGCFFHwAAAIARUvQBAAAAGKEd8w5guzj53GvmHQLAwjrjytPnHQIAACwcI30AAAAARkjRBwAAAGCETO86TK4777SHLTPlC2Btdp911f9/bKoXAACsjZE+AAAAACOk6AMAAAAwQoo+h8E5zz5hXcsB2O/sJ7/ooM8BAICVVXdPvZFdu3b1nj17ZhAOAAAAAElSVdd3966Nrm+kDwAAAMAIKfoAAAAAjJCiDwAAAMAIKfoAAAAAjJCiDwAAAMAIKfoAAAAAjJCiDwAAAMAIKfoAAAAAjJCiDwAAAMAIKfoAAAAAjJCiDwAAAMAIKfoAAAAAjJCiDwAAAMAIKfoAAAAAjJCiDwAAAMAIKfoAAAAAjJCiDwAAAMAIKfoAAAAAjJCiDwAAAMAIKfoAAAAAjFB19/QbqfpGktumDwe2tKOTfHXeQcAmk+dsB/Kc7UCesx3Ic7aDJ3f392905R0zCuK27t41o23BllRVe+Q5YyfP2Q7kOduBPGc7kOdsB1W1Z5r1Te8CAAAAGCFFHwAAAIARmlXR5+IZbQe2MnnOdiDP2Q7kOduBPGc7kOdsB1Pl+Uw+yBkAAACArcX0LgAAAIARWlPRp6oeU1UfqKo/rapbq+qUqnpcVV1bVX82/PvYoW1V1YVVdXtV3VhVz9jcQ4DZWCXPf6mqbqmqh6pq1wHtXzfk+W1Vddq84ob1WCXP3zw8v7GqPlhVj1nWXp6zcFbJ838z5PgNVfWxqvrhoa37FhbSSnm+7LV/XlVdVUcPz+U5C2mV6/lSVe0druc3VNUvLmvvvoWFs9r1vKpeMyy7paretKz9uvJ8rSN9/mOSq7v7R5P8eJJbk7w2yce7+4lJPj48T5JfSPLE4ecVSS5a4z5g3lbK85uTvCDJHy1vWFU/luTsJCcmeW6S36mqIw5vuLAhK+X5tUme0t1PS/I/k7wukecstJXy/M3d/bTufnqSDyf510Nb9y0sqpXyPFV1XJK/l+QvlrWV5yyqFfM8yQXd/fTh5yOJ+xYW2sPyvKp+NsmZSX68u09Mcn6ysTw/ZNGnqv5GkmcluSRJuvuB7v7aEMC7hmbvSnLW8PjMJO/uieuSPKaqHr+OA4bDbrU87+5bu/u2FVY5M8kV3X1/d38xye1JfurwRQzrd5A8/1h3Pzg0uy7JE4bH8pyFc5A8v3dZs0cl2fehhu5bWDgHuT9PkguS/Ivsz/FEnrOADpHnK3HfwsI5SJ7/WpJ/3933D8v/17DKuvN8LSN9jk/yV0l+r6o+V1W/W1WPSvJD3X330OaeJD80PD42yZ3L1r9rWAZb2Wp5vhp5ziJaS57/wyQfHR7LcxbRqnleVW+oqjuT/Gr2j/SR5yyiFfO8qs5Msre7P39Ae3nOIjrYfcurh6mKl9bwMSOR5yym1fL8SUlOrarPVNUfVtVPDu3XnedrKfrsSPKMJBd1908k+Wb2T+VKkvTkK8B8DRiL7JB5DiNw0Dyvqt9O8mCSy+YTHszEqnne3b/d3cdlkuOvnl+IMLWV8nwpyW9lf0ETFt1q1/OLkpyQ5OlJ7k7ylrlFCNNbLc93JHlckpOT/GaS91dVbWQHayn63JXkru7+zPD8A0NQX9k3LHT4d99wo71Jjlu2/hOGZbCVrZbnq5HnLKJV87yqXpbkeUl+dSjkJ/KcxbSW6/llSf7+8Fies4hWy/Pjk3y+qr6USS5/tqr+VuQ5i2nFPO/ur3T3d7v7oSTvzP6pLfKcRbTa9fyuJH8wTMv94yQPJTk6G8jzQxZ9uvueJHdW1ZOHRT+X5AtJdid56bDspUk+NDzeneQlw7cEnJzk68umgcGWdJA8X83uJGdX1ZFVdXwmH4z4x5scJkxltTyvqudm8vkPZ3T3t5atIs9ZOAfJ8ycua3Zmkj8dHrtvYeGskuef7e6/2d07u3tnJm8YnjG0lecsnINcz5d/HtXzM/nilcR9CwvoIO9Dr0zys0lSVU9K8sgkX80G8nzHGmN5TZLLquqRSf48ycszKRi9v6rOSfLlJP9gaPuRJL+YyQcKfWtoC4vgYXleVc9P8rYkxyS5qqpu6O7TuvuWqnp/Jr+QDyb5x9393blFDmu30vX8T5IcmeTaYdTodd39KnnOAlspz393uKF6KJP7llcNbd23sKhWyvPVyHMW1Up5fmFVPT2Tjxf5UpJXJon7FhbYSnn+zSSXVtXNSR5I8tJhNP6687z2j+IHAAAAYCzW8pk+AAAAACwYRR8AAACAEVL0AQAAABghRR8AAACAEVL0AQAAABghRR8AYGFV1Q9W1Q3Dzz1VtXd4fF9V/c684wMAmCdf2Q4AjEJVLSW5r7vPn3csAABbgZE+AMDoVNWzq+rDw+OlqnpXVX26qr5cVS+oqjdV1U1VdXVVPWJod1JV/WFVXV9V11TV4+d7FAAA01H0AQC2gxOSPCfJGUnek+ST3f3UJN9OcvpQ+Hlbkhd290lJLk3yhnkFCwAwCzvmHQAAwGHw0e7+TlXdlOSIJFcPy29KsjPJk5M8Jcm1VZWhzd1ziBMAYGYUfQCA7eD+JOnuh6rqO73/Qw0fyuR+qJLc0t2nzCtAAIBZM70LACC5LckxVXVKklTVI6rqxDnHBAAwFUUfAGDb6+4HkrwwyRur6vNJbkjy0/ONCgBgOr6yHQAAAGCEjPQBAAAAGCFFHwAAAIARUvQBAAAAGCFFHwAAAIARUvQBAAAAGCFFHwAAAIARUvQBAAAAGCFFHwAAAIAR+n9eCFmA+OnY+QAAAABJRU5ErkJggg==\n"
- },
- "metadata": {},
- "execution_count": 14
+ "fd47487fc8734594823f8afa00c4239d": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_module_version": "1.5.0",
+ "model_name": "DescriptionStyleModel",
+ "state": {
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "DescriptionStyleModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/base",
+ "_view_module_version": "1.2.0",
+ "_view_name": "StyleView",
+ "description_width": ""
+ }
+ },
+ "fee75343289f42fb8d6dfb4bf26fe368": {
+ "model_module": "@jupyter-widgets/controls",
+ "model_module_version": "1.5.0",
+ "model_name": "HTMLModel",
+ "state": {
+ "_dom_classes": [],
+ "_model_module": "@jupyter-widgets/controls",
+ "_model_module_version": "1.5.0",
+ "_model_name": "HTMLModel",
+ "_view_count": null,
+ "_view_module": "@jupyter-widgets/controls",
+ "_view_module_version": "1.5.0",
+ "_view_name": "HTMLView",
+ "description": "",
+ "description_tooltip": null,
+ "layout": "IPY_MODEL_16c0017f65b649f5ac5bebf1c955a1fd",
+ "placeholder": "",
+ "style": "IPY_MODEL_5e2c207db5424f91829bf5c52040a9f2",
+ "value": " 1.92k/1.92k [00:00<00:00, 48.3kB/s]"
+ }
}
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "id": "q4Rjo1aasVS1"
- },
- "source": [
- "# Going further \n",
- "\n",
- "We have only scratched the surface in this introduction. \n",
- "\n",
- "More details can be found in the [`pyannote.audio` Github repository](https://github.com/pyannote/pyannote-audio).\n"
- ]
- },
- {
- "cell_type": "code",
- "source": [
- ""
- ],
- "metadata": {
- "id": "wFK33Y6Dfkw3"
- },
- "execution_count": null,
- "outputs": []
+ }
}
- ]
-}
\ No newline at end of file
+ },
+ "nbformat": 4,
+ "nbformat_minor": 0
+}
diff --git a/tutorials/overlapped_speech_detection.ipynb b/tutorials/overlapped_speech_detection.ipynb
index 78c6372cb..1ad5d4090 100644
--- a/tutorials/overlapped_speech_detection.ipynb
+++ b/tutorials/overlapped_speech_detection.ipynb
@@ -20,6 +20,7 @@
]
},
{
+ "attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
@@ -39,6 +40,7 @@
]
},
{
+ "attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
@@ -49,6 +51,7 @@
]
},
{
+ "attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
@@ -84,6 +87,7 @@
]
},
{
+ "attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
@@ -103,6 +107,7 @@
]
},
{
+ "attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
@@ -110,6 +115,7 @@
]
},
{
+ "attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
@@ -130,6 +136,7 @@
]
},
{
+ "attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
@@ -147,6 +154,7 @@
]
},
{
+ "attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
@@ -161,10 +169,11 @@
"source": [
"import pytorch_lightning as pl\n",
"trainer = pl.Trainer(max_epochs=10)\n",
- "trainer.fit(model, osd)"
+ "trainer.fit(model)"
]
},
{
+ "attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
@@ -185,6 +194,7 @@
]
},
{
+ "attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
@@ -212,6 +222,7 @@
]
},
{
+ "attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
@@ -219,6 +230,7 @@
]
},
{
+ "attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
@@ -242,6 +254,7 @@
]
},
{
+ "attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
@@ -258,6 +271,7 @@
]
},
{
+ "attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
@@ -265,6 +279,7 @@
]
},
{
+ "attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
@@ -297,6 +312,7 @@
]
},
{
+ "attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
diff --git a/tutorials/prodigy.md b/tutorials/prodigy.md
deleted file mode 100644
index 4efd05f48..000000000
--- a/tutorials/prodigy.md
+++ /dev/null
@@ -1,151 +0,0 @@
-# Annotating your own data with 💥 Prodigy
-
-Manually segmenting and labeling audio data is time consuming. For speaker diarization, depending on the required level of precision, it may take more than 10 times the duration of a recording to annotate it.
-
-## Table of content
-
-* [Recipes](#recipes)
-* [Keyboard shortcuts](#keyboard-shortcuts)
-
-## Recipes
-
-`pyannote.audio` comes with a bunch of [💥 Prodigy](https://prodi.gy) recipes designed to speed things up a bit.
-
-| Recipe | Usage |
-|-----------------------|-------------------------------------------------------|
- 🦻 `pyannote.audio` | Annotate with a [pretrained pipeline](https://huggingface.co/models?other=pyannote-audio-pipeline) in the loop
- 🧐 `pyannote.review` | Merge multiple annotations
- 🤲 `pyannote.diff` | Show differences between two annotations
- 🗄 `pyannote.database` | Dump annotations as [`pyannote.database`](https://github.com/pyannote/pyannote-database/) protocols
-
-### 🦻 `pyannote.audio` | Annotate with a pretrained pipeline in the loop
-
-```bash
-prodigy pyannote.audio dataset /path/to/audio/directory pyannote/speaker-segmentation
-```
-
-![pyannote.audio screenshot](./assets/prodigy-pyannote.audio.png)
-
-`pyannote.audio` recipe will stream in `.wav` files in chunks and apply [a pretrained pipeline](https://huggingface.co/models?other=pyannote-audio-pipeline). You can then adjust the regions manually if needed.
-
-
-
-More options
-
-```
-prodigy pyannote.audio [options] dataset source pipeline
-
- dataset Prodigy dataset to save annotations to.
- source Path to directory containing audio files to annotate.
- pipeline Name of pretrained pipeline on huggingface.co (e.g.
- pyannote/speaker-segmentation) or path to local YAML file.
- -chunk DURATION Split audio files into shorter chunks of that many seconds.
- Defaults to 10s.
- -precision STEP Temporal precision of keyboard controls, in milliseconds.
- Defaults to 200ms.
- -beep Produce a beep when the player reaches the end of a region.
-```
-
-
-
-
-### 🧐 `pyannote.review` | Merge multiple annotations
-
-```bash
-prodigy pyannote.review dataset /path/to/audio/directory input1.rttm,input2.rttm
-```
-
-![pyannote.review screenshot](./assets/pyannote.review.PNG)
-
-`pyannote.review` recipe take as many annotation files, using the RTTM file format, as you want and let you compare and choose which ones are best within the same stream as `pyannote.audio` recipe.
-Click on a segment of the annotation files to add it to the ouput audio, or on "Input X" to add all segments at once.
-
-
-More options
-
-```
-prodigy pyannote.review [options] dataset source annotations
-
- dataset Prodigy dataset to save annotations to.
- source Path to directory containing audio files whose annotation is to be checked.
- annotations Comma-separated paths to annotation files.
- -chunk DURATION Split audio files into shorter chunks of that many seconds.
- Defaults to 30s.
- -diarization Make a optimal one-to-one mapping between the first annotation and the others.
- -precision STEP Temporal precision of keyboard controls, in milliseconds.
- Defaults to 200ms.
- -beep Produce a beep when the player reaches the end of a region.
-```
-
-
-
-
-### 🤲 `pyannote.diff` | Show differences between two annotations
-
-```bash
-prodigy pyannote.diff dataset /path/to/audio/directory /path/to/reference.rttm /path/to/hypothesis.rttm
-```
-
-![pyannote.diff screenshot](./assets/pyannote.diff.PNG)
-
-`pyannote.diff` recipe take one reference file and one hypothesis file, using the RTTM file format, and focus where there are the most errors among missed detections, false alarms and confusions.
-You can filter on one or more error types and their minimum duration with the corresponding options.
-
-
-
-More options
-
-```
-prodigy pyannote.diff [options] dataset source reference hypothesis
-
- dataset Prodigy dataset to save annotations to.
- source Path to directory containing audio files whose annotation is to be checked.
- reference Path to reference file.
- hypothesis Path to hypothesis file.
- -chunk DURATION Split audio files into shorter chunks of that many seconds.
- Defaults to 30s.
- -min-duration DURATION Minimum duration of errors in ms.
- Defaults to 200ms.
- -diarization Make a optimal one-to-one mapping between reference and hypothesis.
- -false-alarm Display false alarm errors.
- -speaker-confusion Display confusion errors.
- -missed-detection Display missed detection errors.
-```
-
-
-
-### 🗄 `pyannote.database` | Dump annotations as `pyannote.database` protocols
-
-Work in progress
-
-
-## Keyboard shortcuts
-
-Though `pyannote.audio` recipes are built on top of the Prodigy [audio interface](https://prodi.gy/docs/api-interfaces#audio), they provide a bunch of handy additional keyboard shortcuts.
-
-| Shortcut | Description |
-|-----------------------------------|--------------------------------------------------|
-| `left` / `right` (+ `w`) | Shift player cursor (speed up) |
-| `up` / `down` | Switch active region |
-| `shift + left` / `shift + right` | Shift active region start time |
-| `ctrl + left` / `ctrl + right` | Shift active region end time |
-| `shift + up` | Create a new region |
-| `shift + down` / `backspace` | Remove active region |
-| `spacebar` | Play/pause player |
-| `escape` | Ignore this sample |
-| `enter` | Validate annotation |
-
-
-## RTTM file format
-
-RTTM files contain one line per speech turn, using the following convention:
-
-```bash
-SPEAKER {uri} 1 {start_time} {duration} {speaker_id}
-```
-* uri: file identifier (as given by pyannote.database protocols)
-* start_time: speech turn start time in seconds
-* duration: speech turn duration in seconds
-* confidence: confidence score (can be anything, not used for now)
-* gender: speaker gender (can be anything, not used for now)
-* speaker_id: speaker identifier
diff --git a/tutorials/speaker_verification.ipynb b/tutorials/speaker_verification.ipynb
index 84382e6bd..0014bed93 100644
--- a/tutorials/speaker_verification.ipynb
+++ b/tutorials/speaker_verification.ipynb
@@ -1,6 +1,7 @@
{
"cells": [
{
+ "attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
@@ -15,7 +16,7 @@
"\n",
"from pyannote.audio import Audio\n",
"from pyannote.core import Segment\n",
- "audio = Audio(sample_rate=16000, mono=True)\n",
+ "audio = Audio(sample_rate=16000, mono=\"downmix\")\n",
"\n",
"# extract embedding for a speaker speaking between t=3s and t=6s\n",
"speaker1 = Segment(3., 6.)\n",
diff --git a/tutorials/training_a_model.ipynb b/tutorials/training_a_model.ipynb
index 871ab1d1c..f3e019f8b 100644
--- a/tutorials/training_a_model.ipynb
+++ b/tutorials/training_a_model.ipynb
@@ -2,7 +2,7 @@
"cells": [
{
"cell_type": "code",
- "execution_count": 17,
+ "execution_count": null,
"metadata": {},
"outputs": [],
"source": [
@@ -35,7 +35,7 @@
},
{
"cell_type": "code",
- "execution_count": 3,
+ "execution_count": null,
"metadata": {},
"outputs": [],
"source": [
@@ -64,7 +64,7 @@
},
{
"cell_type": "code",
- "execution_count": 5,
+ "execution_count": null,
"metadata": {},
"outputs": [],
"source": [
@@ -84,7 +84,7 @@
},
{
"cell_type": "code",
- "execution_count": 6,
+ "execution_count": null,
"metadata": {},
"outputs": [],
"source": [
@@ -101,7 +101,7 @@
},
{
"cell_type": "code",
- "execution_count": 7,
+ "execution_count": null,
"metadata": {},
"outputs": [
{
@@ -180,7 +180,7 @@
],
"source": [
"import pytorch_lightning as pl\n",
- "trainer = pl.Trainer(gpus=1, max_epochs=1)\n",
+ "trainer = pl.Trainer(devices=1, accelerator=\"gpu\", max_epochs=1)\n",
"trainer.fit(vad_model)"
]
},
@@ -202,7 +202,7 @@
},
{
"cell_type": "code",
- "execution_count": 8,
+ "execution_count": null,
"metadata": {},
"outputs": [],
"source": [
@@ -220,17 +220,17 @@
},
{
"cell_type": "code",
- "execution_count": 18,
+ "execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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",
"text/plain": [
- ""
+ ""
]
},
- "execution_count": 18,
+ "execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
@@ -252,7 +252,7 @@
},
{
"cell_type": "code",
- "execution_count": 19,
+ "execution_count": null,
"metadata": {},
"outputs": [
{
@@ -262,7 +262,7 @@
", , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ])>"
]
},
- "execution_count": 19,
+ "execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
@@ -280,17 +280,32 @@
"\n",
"Speaker diarization is the task of partitioning a given audio stream of recording into according to the speaker identity.\n",
"\n",
- "[`pyannote/segmentation`](https://hf.co/pyannote/segmentation) is a model that was pretrained to perform speaker diarization, but only locally, on 5s-long audio chunks. "
+ "[`pyannote/segmentation`](https://hf.co/pyannote/segmentation) is a model that was pretrained to perform speaker diarization, but only locally, on 5s-long audio chunks. \n",
+ "\n",
+ "To load the speaker segmentation model, \n",
+ "\n",
+ "* accept the user conditions on [hf.co/pyannote/segmentation](https://hf.co/pyannote/segmentation).\n",
+ "* login using `notebook_login` below"
]
},
{
"cell_type": "code",
- "execution_count": 20,
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from huggingface_hub import notebook_login\n",
+ "notebook_login()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from pyannote.audio import Model\n",
- "pretrained = Model.from_pretrained(\"pyannote/segmentation\")"
+ "pretrained = Model.from_pretrained(\"pyannote/segmentation\", use_auth_token=True)"
]
},
{
@@ -302,17 +317,17 @@
},
{
"cell_type": "code",
- "execution_count": 23,
+ "execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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Wf/7gJervGLztfS6/WLla+3ljoD8qfl57NblYGstEej+VehaU26k93NB08v07Z037vBsst/L2K3XebapnWTpdj5nus6H/B2a7fryd6/NYrrV78l/v7at5dT9iT/B69ovGv+YzK9F5eCQO27LvwYYlzK3lJDTrW++UBCCIbxArvWK64Jxtu7DstavuYiTr4mDk0vQuI7/cBz/Ep3N7ftyf3M8m5vH7XahYNu/Zc/h2/Z928xvtjM9/8l0zecY5h52MrJ7FTzhM2/ePLtgwYJBrUNERERERERERLYabMJHNWhFREREREREREYYJXxEREREREREREYYJXxEREREREREREYYJXxEREREREREREYYJXxEREREREREREYYJXxEREREREREREYYJXxEREREREREREYYJXxEREREREREREYYY60d3AqM2Qx0AA1DEpHI8FSLyriMfCrnMhqonMtooHIuo4HKuYx0tUCptbZuoCsYdMIHwBizwFo7b9ArEhmmVMZlNFA5l9FA5VxGA5VzGQ1UzmWkG4oyriZdIiIiIiIiIiIjjBI+IiIiIiIiIiIjzFAlfH49ROsRGa5UxmU0UDmX0UDlXEYDlXMZDVTOZaQbdBkfkj58RERERERERERk+FCTLhERERERERGREWanCR9jzCRjzKPGmNeMMa8aYy7LTX9v7rlnjJm3zTJfNsa8aYxZaow5eVcFLzJU+lvOjTFTjTFxY8yLucd1hYtepG92UM5/YIxZYox52RhztzGmstsy2p9L0ehvGde+XIrRDsr5t3Nl/EVjzAPGmPG56cYY87PcvvxlY8yBhX0HIjs3gHJ+jDGmpdv+/OuFfQciO7e9ct7t9c8bY6wxpjb3vN/785026TLG1AP11trnjTFlwELgTMACHnA98L/W2gW5+fcGbgEOAcYDDwF7WGuz/Xv7IrvPAMr5VOBea+0+hYlYpP92UM4nAo9YazPGmKsBrLVXaH8uxWYAZXwq2pdLkdlBOV9jrW3NzfNZYG9r7cXGmFOBS4FTgfnANdba+YWJXqRvBlDOj8E/Vn9XgUIW6bftlXNr7WvGmEnAb4E9gYOstQ0D2Z/vtIaPtXa9tfb53HgbsBiYYK1dbK1d2ssi7wZutdYmrbXLgTfxTxZEhq0BlHORorODcv6AtTaTm+0Z/JNj0P5ciswAyrhI0dlBOW/tNlsp/kUr8Pflf7S+Z4DK3EmGyLA1gHIuUnS2V85zL/8E+CI9y3i/9+f96sMndyXsAOC/O5htArC62/M13YIWGfb6WM4BphljXjDGPG6MOWrXRyYydHZQzj8G/DM3rv25FK0+lnHQvlyK2Lbl3BjzXWPMauCDQFeTFu3Lpaj1sZwDHGaMeckY809jzJzdH6nIwHUv58aYdwNrrbUvbTNbv/fnfU74GGNiwJ3A5dtkVkVGjH6U8/XAZGvtAcDngD8bY8p3R4wig7W9cm6M+SqQAW4uVGwiQ6EfZVz7cilavZVza+1XrbWT8Mv4ZwoZn8hQ6Ec5fx6YYq3dD7gW+GsBwhUZkO7lHP845Sv0TGYOWJ8SPsaYYC6Am621d+1k9rXApG7PJ+amiQxr/SnnuSYuW3LjC4G3gD12fZQig7O9cm6M+SjwLuCDdmvnbtqfS9HpTxnXvlyKVR+OWW4Gzs6Na18uRak/5dxa22qtbc+N3wcEuzq6FRnOeinnM4BpwEvGmBX4++znjTHjGMD+vC936TLADcBia+2P+xDzPcB5xpiwMWYaMAt4tg/LiRRMf8u5MabOGOPmxqfjl/NluzZKkcHZXjk3xpyC30b4DGttZ7dFtD+XotLfMq59uRSjHZTzWd1mezewJDd+D/Dh3N1dDgVarLXrd1vAIgPQ33JujBmXWwZjzCH457lbdl/EIv3XWzm31i6y1o6x1k611k7Fb7Z1oLV2AwPYnwf6EMcRwIeARcaYF3PTvgKE8avL1QH/MMa8aK092Vr7qjHmduA1/OpIn9YdXaQI9KucA0cD3zLGpPHv4nWxtbZx94ct0i/bK+c/wy/rD+aOlZ6x1l6s/bkUoX6VcbQvl+K0vXL+cWPMbPyyvBK4OPfaffh3dHkT6AQu2K3RigxMf8v5OcAlxpgMEAfO61ZjWWS46rWc52qp9abf+/Od3pZdRERERERERESKS7/u0iUiIiIiIiIiIsOfEj4iIiIiIiIiIiOMEj4iIiIiIiIiIiOMEj4iIiIiIiIiIiOMEj4iIiIiIiIiIiOMEj4iIiJStIwxNcaYF3OPDcaYtbnxdmPMLwsdn4iIiEih6LbsIiIiMiIYY74JtFtrf1joWEREREQKTTV8REREZMQxxhxjjLk3N/5NY8wfjDFPGmNWGmPOMsZ83xizyBjzL2NMMDffQcaYx40xC40x9xtj6gv7LkREREQGTgkfERERGQ1mAMcBZwA3AY9aa/cF4sBpuaTPtcA51tqDgN8B3y1UsCIiIiKDFSh0ACIiIiK7wT+ttWljzCLABf6Vm74ImArMBvYBHjTGkJtnfQHiFBERERkSSviIiIjIaJAEsNZ6xpi03dqJoYd/PGSAV621hxUqQBEREZGhpCZdIiIiIrAUqDPGHAZgjAkaY+YUOCYRERGRAVPCR0REREY9a20KOAe42hjzEvAicHhBgxIREREZBN2WXURERERERERkhFENHxERERERERGREUYJHxERERERERGREUYJHxERERERERGREUYJHxERERERERGREUYJHxERERERERGREUYJHxERERERERGREUYJHxERERERERGREUYJHxERERERERGREeb/A0KZQ28YdpupAAAAAElFTkSuQmCC",
"text/plain": [
- ""
+ ""
]
},
- "execution_count": 23,
+ "execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
@@ -331,17 +346,17 @@
},
{
"cell_type": "code",
- "execution_count": 22,
+ "execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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",
"text/plain": [
- ""
+ ""
]
},
- "execution_count": 22,
+ "execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
@@ -359,12 +374,12 @@
},
{
"cell_type": "code",
- "execution_count": 24,
+ "execution_count": null,
"metadata": {},
"outputs": [],
"source": [
- "from pyannote.audio.tasks import Segmentation\n",
- "seg_task = Segmentation(ami, duration=5.0, max_num_speakers=4)"
+ "from pyannote.audio.tasks import SpeakerDiarization\n",
+ "seg_task = SpeakerDiarization(ami, duration=5.0, max_num_speakers=4)"
]
},
{
@@ -376,7 +391,7 @@
},
{
"cell_type": "code",
- "execution_count": 15,
+ "execution_count": null,
"metadata": {},
"outputs": [],
"source": [
@@ -409,7 +424,7 @@
},
{
"cell_type": "code",
- "execution_count": 16,
+ "execution_count": null,
"metadata": {},
"outputs": [
{
@@ -434,7 +449,7 @@
},
{
"cell_type": "code",
- "execution_count": 29,
+ "execution_count": null,
"metadata": {},
"outputs": [],
"source": [
@@ -452,7 +467,7 @@
},
{
"cell_type": "code",
- "execution_count": 30,
+ "execution_count": null,
"metadata": {},
"outputs": [
{
@@ -530,7 +545,7 @@
}
],
"source": [
- "trainer = pl.Trainer(gpus=1, max_epochs=1)\n",
+ "trainer = pl.Trainer(devices=1, accelerator=\"gpu\", max_epochs=1)\n",
"trainer.fit(finetuned)"
]
},
@@ -543,7 +558,7 @@
},
{
"cell_type": "code",
- "execution_count": 19,
+ "execution_count": null,
"metadata": {},
"outputs": [
{
@@ -575,38 +590,39 @@
},
{
"cell_type": "code",
- "execution_count": 37,
+ "execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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Wf/7gJervGLztfS6/WLla+3ljoD8qfl57NblYGstEej+VehaU26k93NB08v07Z037vBsst/L2K3XebapnWTpdj5nus6H/B2a7fryd6/NYrrV78l/v7at5dT9iT/B69ovGv+YzK9F5eCQO27LvwYYlzK3lJDTrW++UBCCIbxArvWK64Jxtu7DstavuYiTr4mDk0vQuI7/cBz/Ep3N7ftyf3M8m5vH7XahYNu/Zc/h2/Z928xvtjM9/8l0zecY5h52MrJ7FTzhM2/ePLtgwYJBrUNERERERERERLYabMJHNWhFREREREREREYYJXxEREREREREREYYJXxEREREREREREYYJXxEREREREREREYYJXxEREREREREREYYJXxEREREREREREYYJXxEREREREREREYYJXxEREREREREREYYY60d3AqM2Qx0AA1DEpHI8FSLyriMfCrnMhqonMtooHIuo4HKuYx0tUCptbZuoCsYdMIHwBizwFo7b9ArEhmmVMZlNFA5l9FA5VxGA5VzGQ1UzmWkG4oyriZdIiIiIiIiIiIjjBI+IiIiIiIiIiIjzFAlfH49ROsRGa5UxmU0UDmX0UDlXEYDlXMZDVTOZaQbdBkfkj58RERERERERERk+FCTLhERERERERGREWanCR9jzCRjzKPGmNeMMa8aYy7LTX9v7rlnjJm3zTJfNsa8aYxZaow5eVcFLzJU+lvOjTFTjTFxY8yLucd1hYtepG92UM5/YIxZYox52RhztzGmstsy2p9L0ehvGde+XIrRDsr5t3Nl/EVjzAPGmPG56cYY87PcvvxlY8yBhX0HIjs3gHJ+jDGmpdv+/OuFfQciO7e9ct7t9c8bY6wxpjb3vN/785026TLG1AP11trnjTFlwELgTMACHnA98L/W2gW5+fcGbgEOAcYDDwF7WGuz/Xv7IrvPAMr5VOBea+0+hYlYpP92UM4nAo9YazPGmKsBrLVXaH8uxWYAZXwq2pdLkdlBOV9jrW3NzfNZYG9r7cXGmFOBS4FTgfnANdba+YWJXqRvBlDOj8E/Vn9XgUIW6bftlXNr7WvGmEnAb4E9gYOstQ0D2Z/vtIaPtXa9tfb53HgbsBiYYK1dbK1d2ssi7wZutdYmrbXLgTfxTxZEhq0BlHORorODcv6AtTaTm+0Z/JNj0P5ciswAyrhI0dlBOW/tNlsp/kUr8Pflf7S+Z4DK3EmGyLA1gHIuUnS2V85zL/8E+CI9y3i/9+f96sMndyXsAOC/O5htArC62/M13YIWGfb6WM4BphljXjDGPG6MOWrXRyYydHZQzj8G/DM3rv25FK0+lnHQvlyK2Lbl3BjzXWPMauCDQFeTFu3Lpaj1sZwDHGaMeckY809jzJzdH6nIwHUv58aYdwNrrbUvbTNbv/fnfU74GGNiwJ3A5dtkVkVGjH6U8/XAZGvtAcDngD8bY8p3R4wig7W9cm6M+SqQAW4uVGwiQ6EfZVz7cilavZVza+1XrbWT8Mv4ZwoZn8hQ6Ec5fx6YYq3dD7gW+GsBwhUZkO7lHP845Sv0TGYOWJ8SPsaYYC6Am621d+1k9rXApG7PJ+amiQxr/SnnuSYuW3LjC4G3gD12fZQig7O9cm6M+SjwLuCDdmvnbtqfS9HpTxnXvlyKVR+OWW4Gzs6Na18uRak/5dxa22qtbc+N3wcEuzq6FRnOeinnM4BpwEvGmBX4++znjTHjGMD+vC936TLADcBia+2P+xDzPcB5xpiwMWYaMAt4tg/LiRRMf8u5MabOGOPmxqfjl/NluzZKkcHZXjk3xpyC30b4DGttZ7dFtD+XotLfMq59uRSjHZTzWd1mezewJDd+D/Dh3N1dDgVarLXrd1vAIgPQ33JujBmXWwZjzCH457lbdl/EIv3XWzm31i6y1o6x1k611k7Fb7Z1oLV2AwPYnwf6EMcRwIeARcaYF3PTvgKE8avL1QH/MMa8aK092Vr7qjHmduA1/OpIn9YdXaQI9KucA0cD3zLGpPHv4nWxtbZx94ct0i/bK+c/wy/rD+aOlZ6x1l6s/bkUoX6VcbQvl+K0vXL+cWPMbPyyvBK4OPfaffh3dHkT6AQu2K3RigxMf8v5OcAlxpgMEAfO61ZjWWS46rWc52qp9abf+/Od3pZdRERERERERESKS7/u0iUiIiIiIiIiIsOfEj4iIiIiIiIiIiOMEj4iIiIiIiIiIiOMEj4iIiIiIiIiIiOMEj4iIiIiIiIiIiOMEj4iIiJStIwxNcaYF3OPDcaYtbnxdmPMLwsdn4iIiEih6LbsIiIiMiIYY74JtFtrf1joWEREREQKTTV8REREZMQxxhxjjLk3N/5NY8wfjDFPGmNWGmPOMsZ83xizyBjzL2NMMDffQcaYx40xC40x9xtj6gv7LkREREQGTgkfERERGQ1mAMcBZwA3AY9aa/cF4sBpuaTPtcA51tqDgN8B3y1UsCIiIiKDFSh0ACIiIiK7wT+ttWljzCLABf6Vm74ImArMBvYBHjTGkJtnfQHiFBERERkSSviIiIjIaJAEsNZ6xpi03dqJoYd/PGSAV621hxUqQBEREZGhpCZdIiIiIrAUqDPGHAZgjAkaY+YUOCYRERGRAVPCR0REREY9a20KOAe42hjzEvAicHhBgxIREREZBN2WXURERERERERkhFENHxERERERERGREUYJHxERERERERGREUYJHxERERERERGREUYJHxERERERERGREUYJHxERERERERGREUYJHxERERERERGREUYJHxERERERERGREUYJHxERERERERGREeb/A0KZQ28YdpupAAAAAElFTkSuQmCC",
"text/plain": [
- ""
+ ""
]
},
- "execution_count": 37,
+ "execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
- "Inference('pyannote/segmentation', step=2.5)(test_file)"
+ "\n",
+ "Inference('pyannote/segmentation', use_auth_token=True, step=2.5)(test_file)"
]
},
{
"cell_type": "code",
- "execution_count": 38,
+ "execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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",
"text/plain": [
- ""
+ ""
]
},
- "execution_count": 38,
+ "execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
@@ -625,14 +641,14 @@
},
{
"cell_type": "code",
- "execution_count": 39,
+ "execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from pyannote.audio.tasks import OverlappedSpeechDetection\n",
"osd_task = OverlappedSpeechDetection(ami, duration=2.0)\n",
"\n",
- "osd_model = Model.from_pretrained(\"pyannote/segmentation\")\n",
+ "osd_model = Model.from_pretrained(\"pyannote/segmentation\", use_auth_token=True)\n",
"osd_model.task = osd_task"
]
},
@@ -645,7 +661,7 @@
},
{
"cell_type": "code",
- "execution_count": 40,
+ "execution_count": null,
"metadata": {},
"outputs": [
{
@@ -669,7 +685,7 @@
" 'lstm']"
]
},
- "execution_count": 40,
+ "execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
@@ -687,7 +703,7 @@
},
{
"cell_type": "code",
- "execution_count": 41,
+ "execution_count": null,
"metadata": {},
"outputs": [
{
@@ -765,7 +781,7 @@
}
],
"source": [
- "trainer = pl.Trainer(gpus=1, max_epochs=1)\n",
+ "trainer = pl.Trainer(devices=1, accelerator=\"gpu\", max_epochs=1)\n",
"trainer.fit(osd_model)"
]
},
@@ -778,17 +794,17 @@
},
{
"cell_type": "code",
- "execution_count": 46,
+ "execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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",
"text/plain": [
- ""
+ ""
]
},
- "execution_count": 46,
+ "execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
@@ -800,17 +816,17 @@
},
{
"cell_type": "code",
- "execution_count": 44,
+ "execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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",
"text/plain": [
- ""
+ ""
]
},
- "execution_count": 44,
+ "execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
@@ -838,7 +854,7 @@
"We also benefit from all the nice things [`pytorch-lightning`](ttps://pytorch-lightning.readthedocs.io) has to offer (like multi-gpu training, for instance).\n",
"\n",
"```python\n",
- "trainer = Trainer(gpus=4, strategy='ddp')\n",
+ "trainer = Trainer(devices=4, accelerator=\"gpu\", strategy='ddp')\n",
"trainer.fit(model)\n",
"```\n",
"\n",
@@ -860,21 +876,9 @@
],
"metadata": {
"kernelspec": {
- "display_name": "Python 3",
+ "display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
- },
- "language_info": {
- "codemirror_mode": {
- "name": "ipython",
- "version": 3
- },
- "file_extension": ".py",
- "mimetype": "text/x-python",
- "name": "python",
- "nbconvert_exporter": "python",
- "pygments_lexer": "ipython3",
- "version": "3.8.0"
}
},
"nbformat": 4,
diff --git a/tutorials/voice_activity_detection.ipynb b/tutorials/voice_activity_detection.ipynb
index 1b80bd391..df2cadd15 100644
--- a/tutorials/voice_activity_detection.ipynb
+++ b/tutorials/voice_activity_detection.ipynb
@@ -273,7 +273,7 @@
],
"source": [
"import pytorch_lightning as pl\n",
- "trainer = pl.Trainer(gpus=1, max_epochs=2)\n",
+ "trainer = pl.Trainer(devices=1, accelerator=\"gpu\", max_epochs=2)\n",
"trainer.fit(model)"
]
},
diff --git a/version.txt b/version.txt
index 38f77a65b..4a36342fc 100644
--- a/version.txt
+++ b/version.txt
@@ -1 +1 @@
-2.0.1
+3.0.0