pyannote.database 6.1.0__tar.gz → 6.2.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. pyannote_database-6.2.0/.github/social-preview.png +0 -0
  2. pyannote_database-6.2.0/.github/workflows/build-wheels.yml +35 -0
  3. pyannote_database-6.2.0/.github/workflows/ci.yml +87 -0
  4. pyannote_database-6.2.0/.github/workflows/doc.yml +55 -0
  5. pyannote_database-6.2.0/.github/workflows/lint.yml +30 -0
  6. pyannote_database-6.2.0/.github/workflows/test.yml +59 -0
  7. pyannote_database-6.2.0/.github/workflows/version-guard.yml +70 -0
  8. {pyannote_database-6.1.0 → pyannote_database-6.2.0}/.gitignore +7 -0
  9. pyannote_database-6.2.0/.pre-commit-config.yaml +7 -0
  10. pyannote_database-6.2.0/CHANGELOG.md +297 -0
  11. {pyannote_database-6.1.0 → pyannote_database-6.2.0}/PKG-INFO +158 -71
  12. {pyannote_database-6.1.0 → pyannote_database-6.2.0}/README.md +155 -68
  13. {pyannote_database-6.1.0 → pyannote_database-6.2.0}/doc/source/conf.py +42 -38
  14. {pyannote_database-6.1.0 → pyannote_database-6.2.0}/doc/source/index.rst +2 -2
  15. {pyannote_database-6.1.0 → pyannote_database-6.2.0}/pyproject.toml +8 -2
  16. {pyannote_database-6.1.0 → pyannote_database-6.2.0}/src/pyannote/database/__init__.py +8 -20
  17. {pyannote_database-6.1.0 → pyannote_database-6.2.0}/src/pyannote/database/cli.py +15 -17
  18. {pyannote_database-6.1.0 → pyannote_database-6.2.0}/src/pyannote/database/custom.py +73 -66
  19. {pyannote_database-6.1.0 → pyannote_database-6.2.0}/src/pyannote/database/database.py +4 -9
  20. {pyannote_database-6.1.0 → pyannote_database-6.2.0}/src/pyannote/database/file_finder.py +59 -45
  21. {pyannote_database-6.1.0 → pyannote_database-6.2.0}/src/pyannote/database/loader.py +10 -12
  22. {pyannote_database-6.1.0 → pyannote_database-6.2.0}/src/pyannote/database/protocol/__init__.py +3 -8
  23. {pyannote_database-6.1.0 → pyannote_database-6.2.0}/src/pyannote/database/protocol/collection.py +4 -6
  24. {pyannote_database-6.1.0 → pyannote_database-6.2.0}/src/pyannote/database/protocol/protocol.py +14 -32
  25. {pyannote_database-6.1.0 → pyannote_database-6.2.0}/src/pyannote/database/protocol/segmentation.py +9 -18
  26. {pyannote_database-6.1.0 → pyannote_database-6.2.0}/src/pyannote/database/protocol/speaker_diarization.py +2 -4
  27. {pyannote_database-6.1.0 → pyannote_database-6.2.0}/src/pyannote/database/protocol/speaker_identification.py +0 -3
  28. {pyannote_database-6.1.0 → pyannote_database-6.2.0}/src/pyannote/database/protocol/speaker_recognition.py +113 -116
  29. {pyannote_database-6.1.0 → pyannote_database-6.2.0}/src/pyannote/database/protocol/speaker_spotting.py +0 -3
  30. {pyannote_database-6.1.0 → pyannote_database-6.2.0}/src/pyannote/database/protocol/speaker_verification.py +10 -13
  31. {pyannote_database-6.1.0 → pyannote_database-6.2.0}/src/pyannote/database/registry.py +209 -44
  32. {pyannote_database-6.1.0 → pyannote_database-6.2.0}/src/pyannote/database/util.py +12 -22
  33. {pyannote_database-6.1.0 → pyannote_database-6.2.0}/tests/data/database.yml +1 -1
  34. pyannote_database-6.2.0/tests/data/stms/filename1.stm +2 -0
  35. pyannote_database-6.2.0/tests/data/stms/filename2.stm +3 -0
  36. pyannote_database-6.2.0/tests/test_file_finder.py +105 -0
  37. pyannote_database-6.2.0/tests/test_optional_features.py +59 -0
  38. pyannote_database-6.2.0/tests/test_protocols.py +91 -0
  39. {pyannote_database-6.1.0 → pyannote_database-6.2.0}/tests/test_registry.py +16 -9
  40. pyannote_database-6.1.0/tests/trial.py → pyannote_database-6.2.0/tests/test_trials.py +22 -10
  41. pyannote_database-6.2.0/tests/test_versions.py +224 -0
  42. pyannote_database-6.1.0/.github/workflows/doc.yml +0 -33
  43. pyannote_database-6.1.0/.github/workflows/release.yml +0 -125
  44. pyannote_database-6.1.0/.github/workflows/test.yml +0 -36
  45. pyannote_database-6.1.0/doc/source/changelog.rst +0 -340
  46. pyannote_database-6.1.0/setup.py +0 -84
  47. pyannote_database-6.1.0/tests/test.py +0 -86
  48. pyannote_database-6.1.0/uv.lock +0 -1397
  49. {pyannote_database-6.1.0 → pyannote_database-6.2.0}/.gitattributes +0 -0
  50. {pyannote_database-6.1.0 → pyannote_database-6.2.0}/.github/FUNDING.yml +0 -0
  51. {pyannote_database-6.1.0 → pyannote_database-6.2.0}/LICENSE +0 -0
  52. {pyannote_database-6.1.0 → pyannote_database-6.2.0}/doc/Makefile +0 -0
  53. {pyannote_database-6.1.0 → pyannote_database-6.2.0}/doc/make.bat +0 -0
  54. {pyannote_database-6.1.0 → pyannote_database-6.2.0}/setup.cfg +0 -0
  55. {pyannote_database-6.1.0 → pyannote_database-6.2.0}/src/pyannote/database/py.typed +0 -0
  56. {pyannote_database-6.1.0 → pyannote_database-6.2.0}/tests/data/audio/filename1.wav +0 -0
  57. {pyannote_database-6.1.0 → pyannote_database-6.2.0}/tests/data/audio/filename2.wav +0 -0
  58. {pyannote_database-6.1.0 → pyannote_database-6.2.0}/tests/data/ctms/filename1.ctm +0 -0
  59. {pyannote_database-6.1.0 → pyannote_database-6.2.0}/tests/data/ctms/filename2.ctm +0 -0
  60. {pyannote_database-6.1.0 → pyannote_database-6.2.0}/tests/data/lists/train.lst +0 -0
  61. {pyannote_database-6.1.0 → pyannote_database-6.2.0}/tests/data/mapping/domain.map +0 -0
  62. {pyannote_database-6.1.0 → pyannote_database-6.2.0}/tests/data/mapping/duration.map +0 -0
  63. {pyannote_database-6.1.0 → pyannote_database-6.2.0}/tests/data/rttms/train.rttm +0 -0
  64. {pyannote_database-6.1.0 → pyannote_database-6.2.0}/tests/data/trial/train.trial +0 -0
  65. {pyannote_database-6.1.0 → pyannote_database-6.2.0}/tests/data/uems/train.uem +0 -0
@@ -0,0 +1,35 @@
1
+ name: Build Wheels
2
+
3
+ on:
4
+ workflow_call:
5
+ inputs:
6
+ release-tag:
7
+ description: Release tag; empty on pull requests
8
+ required: false
9
+ type: string
10
+ default: ""
11
+
12
+ permissions:
13
+ contents: read
14
+
15
+ jobs:
16
+ build:
17
+ runs-on: ubuntu-latest
18
+ steps:
19
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
20
+ with:
21
+ persist-credentials: false
22
+ # hatch-vcs needs Git history and tags to derive the package version.
23
+ fetch-depth: 0
24
+ - uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7.6.0
25
+ - uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0
26
+ with:
27
+ python-version-file: .python-version
28
+ - name: Build wheel and source distribution
29
+ run: uv build
30
+ - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
31
+ with:
32
+ name: python-package-distributions
33
+ path: dist/
34
+ if-no-files-found: error
35
+ retention-days: ${{ inputs.release-tag != '' && 90 || 3 }}
@@ -0,0 +1,87 @@
1
+ name: CI
2
+
3
+ on:
4
+ pull_request:
5
+ release:
6
+ types: [published]
7
+
8
+ permissions:
9
+ contents: read
10
+
11
+ concurrency:
12
+ group: ${{ github.workflow }}-${{ github.ref }}
13
+ cancel-in-progress: ${{ github.event_name == 'pull_request' }}
14
+
15
+ # lint (PR only)
16
+ # build ──┬──► test ──────────┬──► publish (release only)
17
+ # └──► version-guard ─┘
18
+ # ci-complete collects all required results.
19
+
20
+ jobs:
21
+ lint:
22
+ if: github.event_name == 'pull_request'
23
+ uses: ./.github/workflows/lint.yml
24
+
25
+ build:
26
+ uses: ./.github/workflows/build-wheels.yml
27
+ with:
28
+ release-tag: ${{ github.event.release.tag_name || '' }}
29
+
30
+ test:
31
+ needs: build
32
+ uses: ./.github/workflows/test.yml
33
+
34
+ version-guard:
35
+ name: versions
36
+ if: github.event_name == 'release'
37
+ needs: build
38
+ uses: ./.github/workflows/version-guard.yml
39
+ with:
40
+ release-tag: ${{ github.event.release.tag_name }}
41
+
42
+ # PyPI trusted publishing must run in a top-level workflow.
43
+ publish:
44
+ if: github.event_name == 'release'
45
+ needs: [build, test, version-guard]
46
+ runs-on: ubuntu-latest
47
+ environment:
48
+ name: pypi
49
+ url: https://pypi.org/project/pyannote-database/
50
+ permissions:
51
+ contents: write
52
+ id-token: write
53
+ steps:
54
+ - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
55
+ with:
56
+ name: python-package-distributions
57
+ path: dist/
58
+ - name: Upload distributions to GitHub Release
59
+ uses: softprops/action-gh-release@3d0d9888cb7fd7b750713d6e236d1fcb99157228 # v3.0.2
60
+ with:
61
+ tag_name: ${{ github.event.release.tag_name }}
62
+ files: |
63
+ dist/*.whl
64
+ dist/*.tar.gz
65
+ fail_on_unmatched_files: true
66
+ - uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7.6.0
67
+ - name: Upload to PyPI
68
+ run: >-
69
+ uv publish --trusted-publishing always
70
+ --publish-url https://upload.pypi.org/legacy/
71
+ --check-url https://pypi.org/simple/
72
+
73
+ ci-complete:
74
+ if: always()
75
+ needs: [lint, build, test, version-guard, publish]
76
+ runs-on: ubuntu-latest
77
+ env:
78
+ RESULTS: ${{ join(needs.*.result, ' ') }}
79
+ steps:
80
+ - name: Check results
81
+ run: |
82
+ for result in $RESULTS; do
83
+ if [[ "$result" == failure || "$result" == cancelled ]]; then
84
+ echo "::error::Required job finished with result: $result"
85
+ exit 1
86
+ fi
87
+ done
@@ -0,0 +1,55 @@
1
+ name: Documentation
2
+
3
+ on:
4
+ pull_request:
5
+ push:
6
+ branches: [main]
7
+
8
+ permissions:
9
+ contents: read
10
+
11
+ concurrency:
12
+ group: ${{ github.workflow }}-${{ github.ref }}
13
+ cancel-in-progress: ${{ github.event_name == 'pull_request' }}
14
+
15
+ jobs:
16
+ build:
17
+ runs-on: ubuntu-latest
18
+ steps:
19
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
20
+ with:
21
+ persist-credentials: false
22
+ # hatch-vcs needs Git history and tags to derive the package version.
23
+ fetch-depth: 0
24
+ - uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7.6.0
25
+ - uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0
26
+ with:
27
+ python-version-file: .python-version
28
+ - name: Install documentation dependencies
29
+ run: |
30
+ uv venv
31
+ uv pip install '.[doc,cli]'
32
+ - name: Build documentation
33
+ run: uv run --no-project --python .venv/bin/python sphinx-build -W --keep-going -b html doc/source doc/build/html
34
+ - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
35
+ with:
36
+ name: documentation
37
+ path: doc/build/html
38
+ include-hidden-files: true
39
+ retention-days: 3
40
+
41
+ deploy:
42
+ if: github.event_name == 'push'
43
+ needs: build
44
+ runs-on: ubuntu-latest
45
+ permissions:
46
+ contents: write
47
+ steps:
48
+ - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
49
+ with:
50
+ name: documentation
51
+ path: doc/build/html
52
+ - uses: peaceiris/actions-gh-pages@373f7f263a76c20808c831209c920827a82a2847 # v3
53
+ with:
54
+ github_token: ${{ secrets.GITHUB_TOKEN }}
55
+ publish_dir: doc/build/html
@@ -0,0 +1,30 @@
1
+ name: Lint
2
+
3
+ on:
4
+ workflow_call:
5
+
6
+ permissions:
7
+ contents: read
8
+
9
+ jobs:
10
+ ruff:
11
+ name: python
12
+ runs-on: ubuntu-latest
13
+ steps:
14
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
15
+ with:
16
+ persist-credentials: false
17
+ # Report lint/format issues without blocking PRs.
18
+ # Remove continue-on-error once the codebase is clean.
19
+ - name: Run ruff check
20
+ uses: astral-sh/ruff-action@0ce1b0bf8b818ef400413f810f8a11cdbda0034b # v4.0.0
21
+ continue-on-error: true
22
+ with:
23
+ version: "0.17.1"
24
+ args: "check ."
25
+ - name: Run ruff format
26
+ uses: astral-sh/ruff-action@0ce1b0bf8b818ef400413f810f8a11cdbda0034b # v4.0.0
27
+ continue-on-error: true
28
+ with:
29
+ version: "0.17.1"
30
+ args: "format --check ."
@@ -0,0 +1,59 @@
1
+ name: Test
2
+
3
+ on:
4
+ workflow_call:
5
+
6
+ permissions:
7
+ contents: read
8
+
9
+ jobs:
10
+ test:
11
+ name: Test Python ${{ matrix.python-version }}
12
+ runs-on: ubuntu-latest
13
+ strategy:
14
+ fail-fast: false
15
+ matrix:
16
+ python-version: ["3.11", "3.12", "3.13", "3.14", "3.15", "3.x"]
17
+ steps:
18
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
19
+ with:
20
+ persist-credentials: false
21
+ - uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7.6.0
22
+ - id: python
23
+ uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0
24
+ with:
25
+ python-version: ${{ matrix.python-version }}
26
+ check-latest: ${{ matrix.python-version == '3.x' }}
27
+ - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
28
+ with:
29
+ name: python-package-distributions
30
+ path: dist/
31
+ - name: Install the built wheel with test dependencies
32
+ run: |
33
+ uv venv --python "${{ steps.python.outputs.python-path }}"
34
+ uv pip install "$(echo dist/*.whl)[test]"
35
+ - name: Run tests against the installed wheel
36
+ run: uv run --no-project --python .venv/bin/python python -m pytest tests
37
+
38
+ optional-features:
39
+ name: Optional features (Python 3.11)
40
+ runs-on: ubuntu-latest
41
+ steps:
42
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
43
+ with:
44
+ persist-credentials: false
45
+ - uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7.6.0
46
+ - id: python
47
+ uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0
48
+ with:
49
+ python-version: "3.11"
50
+ - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
51
+ with:
52
+ name: python-package-distributions
53
+ path: dist/
54
+ - name: Install the built wheel with test dependencies
55
+ run: |
56
+ uv venv --python "${{ steps.python.outputs.python-path }}"
57
+ uv pip install "$(echo dist/*.whl)[test,cli,transcription]"
58
+ - name: Run tests against the installed wheel
59
+ run: uv run --no-project --python .venv/bin/python python -m pytest tests/test_optional_features.py
@@ -0,0 +1,70 @@
1
+ name: Version Guard
2
+
3
+ on:
4
+ workflow_call:
5
+ inputs:
6
+ release-tag:
7
+ description: Release tag expected to match the package version
8
+ required: true
9
+ type: string
10
+
11
+ permissions:
12
+ contents: read
13
+
14
+ jobs:
15
+ not-already-published:
16
+ name: pyannote-database
17
+ runs-on: ubuntu-latest
18
+ steps:
19
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
20
+ with:
21
+ persist-credentials: false
22
+ - uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0
23
+ with:
24
+ python-version-file: .python-version
25
+ - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
26
+ with:
27
+ name: python-package-distributions
28
+ path: dist/
29
+ - name: Compare distributions with PyPI
30
+ env:
31
+ RELEASE_TAG: ${{ inputs.release-tag }}
32
+ shell: python
33
+ run: |
34
+ import hashlib
35
+ import json
36
+ import os
37
+ from pathlib import Path
38
+ from urllib.error import HTTPError
39
+ from urllib.request import urlopen
40
+ from zipfile import ZipFile
41
+ from email.parser import BytesParser
42
+
43
+
44
+ directory = Path("dist")
45
+ tag = os.environ["RELEASE_TAG"]
46
+ wheels = list(directory.glob("*.whl"))
47
+ sources = list(directory.glob("*.tar.gz"))
48
+ if len(wheels) != 1 or len(sources) != 1:
49
+ raise ValueError("Expected exactly one wheel and one source distribution")
50
+ with ZipFile(wheels[0]) as wheel:
51
+ metadata_path, = [n for n in wheel.namelist() if n.endswith(".dist-info/METADATA")]
52
+ metadata = BytesParser().parsebytes(wheel.read(metadata_path))
53
+ version = metadata["Version"]
54
+ if metadata["Name"] != "pyannote-database" or version != tag.removeprefix("v"):
55
+ raise ValueError(f"Release tag {tag!r} does not match pyannote-database {version}")
56
+ try:
57
+ with urlopen(f"https://pypi.org/pypi/pyannote-database/{version}/json", timeout=30) as response:
58
+ published = json.load(response)["urls"]
59
+ except HTTPError as error:
60
+ if error.code != 404:
61
+ raise
62
+ published = []
63
+ hashes = {item["filename"]: item["digests"]["sha256"] for item in published}
64
+ for artifact in wheels + sources:
65
+ if artifact.name not in hashes:
66
+ print(f"{artifact.name}: not published yet")
67
+ elif hashlib.sha256(artifact.read_bytes()).hexdigest() == hashes[artifact.name]:
68
+ print(f"{artifact.name}: already published with identical contents")
69
+ else:
70
+ raise ValueError(f"{artifact.name} already exists with different contents. Use a new version.")
@@ -89,3 +89,10 @@ ENV/
89
89
  .ropeproject
90
90
 
91
91
  .mypy_cache
92
+
93
+ .venv/
94
+ .ruff_cache/
95
+ .pytest_cache/
96
+
97
+ # Local dependency resolution
98
+ uv.lock
@@ -0,0 +1,7 @@
1
+ repos:
2
+ - repo: https://github.com/astral-sh/ruff-pre-commit
3
+ rev: v0.17.1
4
+ hooks:
5
+ - id: ruff-check
6
+ args: [--fix]
7
+ - id: ruff-format
@@ -0,0 +1,297 @@
1
+ # Changelog
2
+
3
+ ## Version 6.2.0 (2026-11-02)
4
+
5
+ - BREAKING: require Python 3.11 or newer; Python 3.10 is no longer supported
6
+ - BREAKING: forbid `@` in protocol names (now used to select a version)
7
+ - BREAKING: reserve `version` key in subsets (now used to store the annotation version)
8
+ - feat: add annotation versions with optional metadata (selected with `Database.Task.Protocol@version`)
9
+ - feat: add `PYANNOTE_DATABASE_DATA_DIRS` environment variable to set root directories of relative `Databases:` paths
10
+ - fix: resolve meta-protocol members using the registry that loaded them
11
+ - fix: support `X` meta-protocols with Python 3.14
12
+ - fix: `FileFinder` patterns only match files (not directories nor hidden files)
13
+
14
+ ## Version 6.1.1 (2025-12-07)
15
+
16
+ - fix: fix warning about invalid espace sequence
17
+
18
+ ## Version 6.1.0 (2025-09-19)
19
+
20
+ - BREAKING: update `STMLoader` to return `meeteval.io.SegLST` instances
21
+
22
+ ## Version 6.0.0 (2025-09-09)
23
+
24
+ - BREAKING: drop support to `Python` < 3.10
25
+ - BREAKING: switch to native namespace package
26
+ - setup: switch to `uv`
27
+
28
+ ## Version 5.1.3 (2025-01-15)
29
+
30
+ - chore: remove deprecated use of `delim_whitespace`
31
+ - chore: use `importlib.metadata` instead of `pkg_resources`
32
+
33
+ ## Version 5.1.0 (2024-04-05)
34
+
35
+ - BREAKING: switch to python 3.9+ (no support for 3.12 yet)
36
+ - feat(registry): make registry iterable (yields protocol names)
37
+ - fix(setup): fix `typer`` dependency
38
+
39
+ ## Version 5.0.1 (2023-04-21)
40
+
41
+ - fix: fix support for numeric values in custom protocols (e.g. `channel: 0`)
42
+ - improve: do not complain about missing scope for meta protocols
43
+
44
+ ## Version 5.0.0 (2023-03-27)
45
+
46
+ - feat(registry): add pyannote.database.registry to load multiple YAML configuration file
47
+ - BREAKING: turn pyannote.database.get_{database|protocol|protocols} function into registry methods
48
+ - BREAKING: remove support for database plugins (via "pyannote.database.database" entrypoint)
49
+ - feat(protocol): add generic segmentation protocol with "classes" metadata
50
+ - feat(protocol): add support for label "scope" in speaker diarization protocols
51
+ - improve(protocol): make ProtocolFile pickable
52
+ - feat(loader): add support for LAB and STM files
53
+ - feat(loader): add option to filter RTTM lines by "type"
54
+ - fix(cli): fix corner case when annotation key is missing
55
+
56
+ ## Version 4.1.3 (2022-02-11)
57
+
58
+ - fix: fix corner case with missing uris in RTTM and UEM files
59
+ - fix(CI): fix documentation deployment
60
+
61
+ ## Version 4.1.1 (2021-08-4)
62
+
63
+ - fix: fix support for meta verification protocol
64
+
65
+ ## Version 4.1 (2021-04-07)
66
+
67
+ - feat: make {RTTM|UEM}Loader usable as preprocessors
68
+ - improve: remove the need for underscore prefix in database.yml
69
+ - fix: fix ProtocolFile.__iter__ (dictionary changed size during iteration)
70
+
71
+ ## Version 4.0.4 (2020-12-14)
72
+
73
+ - fix: fix ProtocolFile.__iter__ (dictionary changed size during iteration)
74
+
75
+ ## Version 4.0.3 (2020-10-11)
76
+
77
+ - fix: make custom protocols pickable
78
+
79
+ ## Version 4.0.2 (2020-10-02)
80
+
81
+ - feat: automagically crop "annotated" to file "duration" when available
82
+ - fix: fix a bug in SpeakerDiarizationProtocols
83
+ - improve: avoid loading ProtocolFile (lazy) keys in "get_unique_identifier"
84
+
85
+ ## Version 4.0.1 (2020-06-26)
86
+
87
+ - feat: set "name" attribute in get_protocol
88
+ - fix: display warning only when precomputed value is modified
89
+
90
+ ## Version 4.0 (2020-06-15)
91
+
92
+ - feat: add support for custom speaker verification protocols
93
+ - feat: add pyannote.database.loader entrypoint
94
+ - feat: add pyannote-database CLI
95
+ - feat: add a few dataloaders (RTTM, UEM, CTM, MAP)
96
+ - feat: add support for nested ProtocolFile
97
+ - doc: major documentation update (README and docstrings)
98
+ - BREAKING: custom protocols must define a "uri" section
99
+ - BREAKING: remove support for "preprocessors" in Database constructor
100
+ - BREAKING: remove support for progress bars
101
+
102
+ ## Version 3.0.1 (2020-03-31)
103
+
104
+ - BREAKING (feat): if a "database.yml" file exists in current working directory, it will be used even if PYANNOTE_DATABASE_CONFIG is set to another value.
105
+ - feat: add support in FileFinder for paths relative to "database.yml"
106
+ - BREAKING: rename "config_yml" option to "database_yml" in FileFinder
107
+ - feat: add support in custom protocols for paths relative to "database.yml" (@PaulLerner)
108
+ - BREAKING (feat): use "annotated" to crop "annotation" in custom protocols (@PaulLerner)
109
+ - fix: add support for int-like protocol name in custom protocols (@PaulLerner)
110
+
111
+ ## Version 2.5 (2020-02-04)
112
+
113
+ - BREAKING: refactor {current | protocol}_file_iter
114
+ - BREAKING: only rely on "uri" to decide if a ProtocolFile contains multiple files
115
+ - BREAKING: deprecate FileFinder.current_file_iter in favor of ProtocolFile.files
116
+ - BREAKING: deprecate FileFinder.protocol_file_iter in favor of Protocol.files
117
+ - fix: fix support for lazy preprocessors in {Protocol | ProtocolFile}.files
118
+
119
+ ## Version 2.4.3 (2020-01-24)
120
+
121
+ - fix: fix infinite recursion in "ProtocolFile" lazy evaluation
122
+
123
+ ## Version 2.4.2 (2020-01-06)
124
+
125
+ - fix: add support for int-like database name in custom protocol
126
+
127
+ ## Version 2.4.1 (2019-12-20)
128
+
129
+ - fix: make ProtocolFile thread-safe
130
+
131
+ ## Version 2.4 (2019-12-17)
132
+
133
+ - feat: make preprocessors lazy
134
+ - fix: pandas would convert a label to NaN ([@PaulLerner](https://github.com/PaulLerner))
135
+ - feat: setup continuous integration
136
+ - setup: switch to pyannote.core 3.2
137
+
138
+ ## Version 2.3.1 (2019-09-04)
139
+
140
+ - fix: fix support for MDTM files in `pyannote.database.custom.subset_iter` ([#23](https://github.com/pyannote/pyannote-database/issues/23))
141
+
142
+ ## Version 2.3 (2019-07-19)
143
+
144
+ - feat: add LabelMapper preprocessor ([@MarvinLvn](https://github.com/MarvinLvn))
145
+ - chore: replace (deprecated) pandas.read_table with pandas.read_csv ([@V-assim](https://github.com/V-assim))
146
+ - chore: use YAML safe loader ([@V-assim](https://github.com/V-assim))
147
+
148
+ ## Version 2.2 (2019-06-26)
149
+
150
+ - setup: switch to pyannote.core 3.0
151
+ - feat: add RTTMLoader preprocessor
152
+
153
+ ## Version 2.1 (2019-04-04)
154
+
155
+ - feat: add support for "domain" key in generic protocol
156
+
157
+ ## Version 2.0 (2019-03-20)
158
+
159
+ - BREAKING: change location and format of pyannote.database configuration file
160
+ - feat: add support for PYANNOTE_DATABASE_CONFIG environment variable
161
+
162
+ ## Version 1.6 (2019-03-12)
163
+
164
+ - feat: add support for [file-based speaker diarization protocols](https://github.com/pyannote/pyannote-database/tree/develop#generic-speaker-diarization-protocols)
165
+ - setup: switch to pyannote.core 2.1
166
+
167
+ ## Version 1.5.5 (2018-11-30)
168
+
169
+ - fix: fix Collection.files when progress=True
170
+
171
+ ## Version 1.5.4 (2018-11-14)
172
+
173
+ - fix: skip files with no "uri" entry in FileFinder.protocol_file_iter
174
+
175
+ ## Version 1.5.3 (2018-11-08)
176
+
177
+ - fix: fix broken SpeakerVerificationProtocol
178
+
179
+ ## Version 1.5.1 (2018-10-16)
180
+
181
+ - fix: fix support for string preprocessors
182
+
183
+ ## Version 1.5 (2018-09-25)
184
+
185
+ - BREAKING: simplify SpeakerVerificationProtocol with {subset}_trial methods
186
+
187
+ ## Version 1.4 (2018-07-13)
188
+
189
+ - feat: add raw collection protocol
190
+
191
+ ## Version 1.3.2 (2018-05-16)
192
+
193
+ - fix: fix regression introduced in 1.3.1
194
+
195
+ ## Version 1.3.1 (2018-05-11)
196
+
197
+ - fix: fix bug in `FileFinder.protocol_file_iter` with empty iterators
198
+
199
+ ## Version 1.3 (2018-02-04)
200
+
201
+ - feat: add `extra_keys` parameter to `{protocol | current}_file_iter`
202
+
203
+ ## Version 1.2.1 (2018-02-03)
204
+
205
+ - setup: drop support for Python 2
206
+ - feat: add `protocol_file_iter` and `current_file_iter` to FileFinder
207
+ - feat: add `get_label_identifier` utility function
208
+ - fix: fix "get_unique_identifier" when "database" or "channel" is None
209
+
210
+ ## Version 1.1 (2017-10-13)
211
+
212
+ - feat: add speaker identification protocol
213
+ - feat: add speaker verification protocols
214
+ - feat: add support for list of uris in FileFinder
215
+
216
+ ## Version 1.0 (2017-10-02)
217
+
218
+ - feat: add support for "meta" protocols
219
+ - feat: add speaker spotting protocol
220
+ - setup: switch to pyannote.core 1.1
221
+
222
+ ## Version 0.12 (2017-06-28)
223
+
224
+ - feat: add utility functions at package root
225
+ - doc: improve documentation
226
+ - doc: add link to pyannote-db-template repository
227
+
228
+ ## Version 0.11.2 (2017-03-15)
229
+
230
+ - fix: fix a bug with string template preprocessors
231
+ - doc: improve documentation
232
+
233
+ ## Version 0.11.1 (2017-01_16)
234
+
235
+ - feat: add 'get_protocol' helper function
236
+
237
+ ## Version 0.11 (2017-01-11)
238
+
239
+ - feat: add support for validation on training set to speaker recognition protocols
240
+ - feat: add 'get_annotated' helper function
241
+
242
+ ## Version 0.10.2 (2017-01-04)
243
+
244
+ - fix: fix bug in FileFinder
245
+
246
+ ## Version 0.10.1 (2016-12-17)
247
+
248
+ - improve: change signature of preprocessor.__call__
249
+
250
+ ## Version 0.9 (2016-12-14)
251
+
252
+ - feat: add "get_unique_identifier" utility function
253
+
254
+ ## Version 0.8.1 (2016-12-12)
255
+
256
+ - fix: fix progress bar support
257
+
258
+ ## Version 0.8 (2016-12-06)
259
+
260
+ - feat: add progress bar support
261
+
262
+ ## Version 0.7.1 (2016-12-03)
263
+
264
+ - fix: add 'yield_name' parameter to speaker recognition generators
265
+
266
+ ## Version 0.7 (2016-12-02)
267
+
268
+ - feat: add speaker recognition protocol
269
+
270
+ ## Version 0.6.1 (2016-12-02)
271
+
272
+ - feat: add FileFinder utility class
273
+ - fix: fix SpeakerDiarizationProtocol.stats()
274
+
275
+ ## Version 0.5 (2016-12-01)
276
+
277
+ - BREAKING: replace 'medium_template' by (more generic) 'preprocessors'
278
+
279
+ ## Version 0.4.1 (2016-11-17)
280
+
281
+ - fix: rename 'speakers' to 'labels' in statistics dictionary
282
+
283
+ ## Version 0.4 (2016-10-27)
284
+
285
+ - feat: add a method providing global statistics about a subset
286
+
287
+ ## Version 0.3 (2016-09-22)
288
+
289
+ - feat: add support for multiple media
290
+
291
+ ## Version 0.2 (2016-09-21)
292
+
293
+ - feat: add support for 'medium_template' attribute
294
+
295
+ ## Version 0.1 (2016-09-20)
296
+
297
+ - first public version