Git Product home page Git Product logo

speakerbox's Introduction

speakerbox

Build Status Documentation status

Few-Shot Multi-Recording Speaker Identification Transformer Fine-Tuning and Application


Installation

Stable Release: pip install speakerbox
Development Head: pip install git+https://github.com/CouncilDataProject/speakerbox.git

Documentation

For full package documentation please visit councildataproject.github.io/speakerbox.

Example Usage Video

screenshot from example usage youtube video

Link: https://youtu.be/SK2oVqSKPTE

In the example video, we use the Speakerbox library to quickly annotate a dataset of audio clips from the show The West Wing and train a speaker identification model to identify three of the show's characters (President Bartlet, Charlie Young, and Leo McGarry).

Problem

Given a set of recordings of multi-speaker recordings:

example/
├── 0.wav
├── 1.wav
├── 2.wav
├── 3.wav
├── 4.wav
└── 5.wav

Where each recording has some or all of a set of speakers, for example:

  • 0.wav -- contains speakers: A, B, C
  • 1.wav -- contains speakers: A, C
  • 2.wav -- contains speakers: B, C
  • 3.wav -- contains speakers: A, B, C
  • 4.wav -- contains speakers: A, B, C
  • 5.wav -- contains speakers: A, B, C

You want to train a model to classify portions of audio as one of the N known speakers in future recordings not included in your original training set.

f(audio) -> [(start_time, end_time, speaker), (start_time, end_time, speaker), ...]

i.e. f(audio) -> [(2.4, 10.5, "A"), (10.8, 14.1, "D"), (14.8, 22.7, "B"), ...]

The speakerbox library contains methods for both generating datasets for annotation and for utilizing multiple audio annotation schemes to train such a model.

Typical workflow to prepare a speaker identification dataset and fine-tune a new model using tools provided from the Speakerbox library. The user starts with a collection of audio files that include portions speech from the speakers they want to train a model to identify. The diarize_and_split_audio function will create a new directory with the same name as the audio file, diarize the audio file, and finally, sort the audio portions produced from diarization into sub-directories within this new directory. The user should then manually rename each of the produced sub-directories to the correct speaker identifier (i.e. the speaker's name or a unique id) and additionally remove any incorrectly diarized or mislabeled portions of audio. Finally, the user can prepare training, evaluation, and testing datasets (via the expand_labeled_diarized_audio_dir_to_dataset and preprocess_dataset functions) and fine-tune a new speaker identification model (via the train function).

The following table shows model performance results as the dataset size increases:

dataset_size mean_accuracy mean_precision mean_recall mean_training_duration_seconds
15-minutes 0.874 ± 0.029 0.881 ± 0.037 0.874 ± 0.029 101 ± 1
30-minutes 0.929 ± 0.006 0.94 ± 0.007 0.929 ± 0.006 186 ± 3
60-minutes 0.937 ± 0.02 0.94 ± 0.017 0.937 ± 0.02 453 ± 7

All results reported are the average of five model training and evaluation trials for each of the different dataset sizes. All models were fine-tuned using an NVIDIA GTX 1070 TI.

Note: this table can be reproduced in ~1 hour using an NVIDIA GTX 1070 TI by:

Installing the example data download dependency:

pip install speakerbox[example_data]

Then running the following commands in Python:

from speakerbox.examples import (
    download_preprocessed_example_data,
    train_and_eval_all_example_models,
)

# Download and unpack the preprocessed example data
dataset = download_preprocessed_example_data()

# Train and eval models with different subsets of the data
results = train_and_eval_all_example_models(dataset)

Workflow

Diarization

We quickly generate an annotated dataset by first diarizing (or clustering based on the features of speaker audio) portions of larger audio files and splitting each the of the clusters into their own directories that you can then manually clean up (by removing incorrectly clustered audio segments).

Notes

  • It is recommended to have each larger audio file named with a unique id that can be used to act as a "recording id".
  • Diarization time depends on machine resources and make take a long time -- one potential recommendation is to run a diarization script overnight and clean up the produced annotations the following day.
  • During this process audio will be duplicated in the form of smaller audio clips -- ensure you have enough space on your machine to complete this process before you begin.
  • Clustering accuracy depends on how many speakers there are, how distinct their voices are, and how much speech is talking over one-another.
  • If possible, try to find recordings where speakers have a roughly uniform distribution of speaking durations.

⚠️ To use the diarization portions of speakerbox you need to complete the following steps: ⚠️

  1. Visit hf.co/pyannote/speaker-diarization and accept user conditions.
  2. Visit hf.co/pyannote/segmentation and accept user conditions.
  3. Visit hf.co/settings/tokens to create an access token (only if you had to complete 1.)

Diarize a single file:

from speakerbox import preprocess

# The token can also be provided via the 'HUGGINGFACE_TOKEN` environment variable.
diarized_and_split_audio_dir = preprocess.diarize_and_split_audio(
    "0.wav",
    hf_token="token-from-hugging-face",
)

Diarize all files in a directory:

from speakerbox import preprocess
from pathlib import Path
from tqdm import tqdm

# Iterate over all 'wav' format files in a directory called 'data'
for audio_file in tqdm(list(Path("data").glob("*.wav"))):
    # The token can also be provided via the 'HUGGINGFACE_TOKEN` environment variable.
    diarized_and_split_audio_dir = preprocess.diarize_and_split_audio(
        audio_file,
        # Create a new directory to place all created sub-directories within
        storage_dir=f"diarized-audio/{audio_file.stem}",
        hf_token="token-from-hugging-face",
    )

Cleaning

Diarization will produce a directory structure organized by unlabeled speakers with the audio clips that were clustered together.

For example, if "0.wav" had three speakers, the produced directory structure may look like the following tree:

0/
├── SPEAKER_00
│   ├── 567-12928.wav
│   ├── ...
│   └── 76192-82901.wav
├── SPEAKER_01
│   ├── 34123-38918.wav
│   ├── ...
│   └── 88212-89111.wav
└── SPEAKER_02
    ├── ...
    └── 53998-62821.wav

We leave it to you as a user to then go through these directories and remove any audio clips that were incorrectly clustered together as well as renaming the sub-directories to their correct speaker labels. For example, labelled sub-directories may look like the following tree:

0/
├── A
│   ├── 567-12928.wav
│   ├── ...
│   └── 76192-82901.wav
├── B
│   ├── 34123-38918.wav
│   ├── ...
│   └── 88212-89111.wav
└── D
    ├── ...
    └── 53998-62821.wav

Notes

  • Most operating systems have an audio playback application to queue an entire directory of audio files as a playlist for playback. This makes it easy to listen to a whole unlabeled sub-directory (i.e. "SPEAKER_00") at a time and pause playback and remove files from the directory which were incorrectly clustered.
  • If any clips have overlapping speakers, it is up to you as a user if you want to remove those clips or keep them and properly label them with the speaker you wish to associate them with.

Training Preparation

Once you have annotated what you think is enough recordings, you can try preparing a dataset for training.

The following functions will prepare the audio for training by:

  1. Finding all labeled audio clips in the provided directories
  2. Chunk all found audio clips into smaller duration clips (parametrizable)
  3. Check that the provided annotated dataset meets the following conditions:
    1. There is enough data such that the training, test, and validation subsets all contain different recording ids.
    2. There is enough data such that the training, test, and validation subsets each contain all labels present in the whole dataset.

Notes

  • During this process audio will be duplicated in the form of smaller audio clips -- ensure you have enough space on your machine to complete this process before you begin.
  • Directory names are used as recording ids during dataset construction.
from speakerbox import preprocess

dataset = preprocess.expand_labeled_diarized_audio_dir_to_dataset(
    labeled_diarized_audio_dir=[
        "0/",  # The cleaned and checked audio clips for recording id 0
        "1/",  # ... recording id 1
        "2/",  # ... recording id 2
        "3/",  # ... recording id 3
        "4/",  # ... recording id 4
        "5/",  # ... recording id 5
    ]
)

dataset_dict, value_counts = preprocess.prepare_dataset(
    dataset,
    # good if you have large variation in number of data points for each label
    equalize_data_within_splits=True,
    # set seed to get a reproducible data split
    seed=60,
)

# You can print the value_counts dataframe to see how many audio clips of each label
# (speaker) are present in each data subset.
value_counts

Model Training and Evaluation

Once you have your dataset prepared and available, you can provide it directly to the training function to begin training a new model.

The eval_model function will store a filed called results.md with the accuracy, precision, and recall of the model and additionally store a file called validation-confusion.png which is a confusion matrix.

Notes

  • The model (and evaluation metrics) will be stored in a new directory called trained-speakerbox (parametrizable).
  • Training time depends on how much data you have annotated and provided.
  • It is recommended to train with an NVidia GPU with CUDA available to speed up the training process.
  • Speakerbox has only been tested on English-language audio and the base model for fine-tuning was trained on English-language audio. We provide no guarantees as to it's effectiveness on non-English-language audio. If you try Speakerbox on with non-English-language audio, please let us know!
from speakerbox import train, eval_model

# dataset_dict comes from previous preparation step
train(dataset_dict)

eval_model(dataset_dict["valid"])

Model Inference

Once you have a trained model, you can use it against a new audio file:

from speakerbox import apply

annotation = apply(
    "new-audio.wav",
    "path-to-my-model-directory/",
)

The apply function returns a pyannote.core.Annotation.

Development

See CONTRIBUTING.md for information related to developing the code.

Citation

@article{Brown2023,
    doi = {10.21105/joss.05132},
    url = {https://doi.org/10.21105/joss.05132},
    year = {2023},
    publisher = {The Open Journal},
    volume = {8},
    number = {83},
    pages = {5132},
    author = {Eva Maxfield Brown and To Huynh and Nicholas Weber},
    title = {Speakerbox: Few-Shot Learning for Speaker Identification with Transformers},
    journal = {Journal of Open Source Software}
} 

MIT License

speakerbox's People

Contributors

dependabot[bot] avatar evamaxfield avatar faroit avatar nniiicc avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

speakerbox's Issues

[Enhancement] Number of dependencies of dependencies

(First, let's me tell you that i found your library superb! very nice work, thanks for sharing!)

Feature Description

Decrease the number of dependancies of dependancies:
while the nb of depandancies in pyproject.toml is quite low, some of your dependencies probably have themselves a lot of (unusual) dependencies, which means that pip will install a lot of dependencies.

Dependencies bring issues with time, compatibility issues etc.

Solution

If it's possible for you, i think it would be a good idea to identify the dependencies that have the most dependencies themselves and try to see if you can bypass their use.


The list of dependencies that were installed with speakerbox:

pandas~=1.0
speechbrain~=0.5.11
pyannote.audio~=2.1
torchaudio~=0.10
matplotlib~=3.5
torch~=1.10
datasets[audio]~=1.18
dataclasses-json~=0.5
scikit-learn~=1.0
transformers~=4.16
pydub~=0.25
librosa~=0.8
marshmallow-enum<2.0.0,>=1.5.1
marshmallow<4.0.0,>=3.3.0
typing-inspect>=0.4.0
pyarrow!=4.0.0,>=3.0.0
multiprocess
aiohttp
requests>=2.19.0
huggingface-hub<1.0.0,>=0.1.0
responses<0.19
numpy>=1.17
dill
xxhash
fsspec[http]>=2021.05.0
packaging
tqdm>=4.62.1
joblib>=0.14
numba>=0.45.1
resampy>=0.2.2
pooch>=1.0
scipy>=1.2.0
soundfile>=0.10.2
audioread>=2.1.9
decorator>=4.0.10
python-dateutil>=2.8.1
pytz>=2020.1
torchmetrics<1.0,>=0.6
singledispatchmethod
backports.cached-property
pyannote.database<5.0,>=4.1.1
pyannote.pipeline<3.0,>=2.3
pytorch-lightning<1.7,>=1.5.4
omegaconf<3.0,>=2.1
asteroid-filterbanks<0.5,>=0.4
torch-audiomentations>=0.11.0
semver<3.0,>=2.10.2
hmmlearn<0.3,>=0.2.7
pytorch-metric-learning<2.0,>=1.0.0
typing-extensions
networkx<3.0,>=2.6
einops<0.4.0,>=0.3
pyannote.metrics<4.0,>=3.2
pyannote.core<5.0,>=4.4
threadpoolctl>=2.0.0
hyperpyyaml
sentencepiece
regex!=2019.12.17
tokenizers!=0.11.3,<0.14,>=0.11.1
filelock
pyyaml>=5.1
frozenlist>=1.1.1
multidict<7.0,>=4.5
attrs>=17.3.0
async-timeout<5.0,>=4.0.0a3
charset-normalizer<3.0,>=2.0
aiosignal>=1.1.2
yarl<2.0,>=1.0
llvmlite<0.40,>=0.39.0dev0
setuptools
antlr4-python3-runtime==4.9.*
pyparsing!=3.0.5,>=2.0.2
appdirs>=1.3.0
simplejson>=3.8.1
sortedcontainers>=2.0.4
typer[all]>=0.2.1
tabulate>=0.7.7
docopt>=0.6.2
sympy>=1.1
optuna>=1.4
six>=1.5
protobuf<=3.20.1
pyDeprecate>=0.3.1
tensorboard>=2.2.0
torchvision
urllib3>=1.25.10
cffi>=1.0
torch-pitch-shift>=1.2.2
julius<0.3,>=0.2.3
mypy-extensions>=0.3.0
ruamel.yaml>=0.17.8
pycparser
alembic>=1.5.0
sqlalchemy>=1.3.0
colorlog
cmaes>=0.8.2
importlib-metadata<5.0.0
cliff
ruamel.yaml.clib>=0.2.6
wheel>=0.26
werkzeug>=1.0.1
tensorboard-plugin-wit>=1.6.0
google-auth<3,>=1.6.3
google-auth-oauthlib<0.5,>=0.4.1
grpcio>=1.24.3
markdown>=2.6.8
absl-py>=0.4
tensorboard-data-server<0.7.0,>=0.6.0
primePy>=1.3
click<9.0.0,>=7.1.1
colorama<0.5.0,>=0.4.3
shellingham<2.0.0,>=1.3.0
rich<13.0.0,>=10.11.0
idna>=2.0
pillow!=8.3.*,>=5.3.0
Mako
pyasn1-modules>=0.2.1
cachetools<6.0,>=2.0.0
rsa<5,>=3.1.4
requests-oauthlib>=0.7.0
pygments<3.0.0,>=2.6.0
commonmark<0.10.0,>=0.9.0
greenlet!=0.4.17
MarkupSafe>=2.1.1
PrettyTable>=0.7.2
stevedore>=2.0.1
autopage>=0.4.0
cmd2>=1.0.0
wcwidth>=0.1.7
pyperclip>=1.6
pyasn1<0.5.0,>=0.4.6
oauthlib>=3.0.0
pbr!=2.1.0,>=2.0.0

Adding new speakers

Hi!

First of all, thank you for developing SpeakerBox. It has proven to be an invaluable tool for my current project.

Allow me to provide you with some context regarding my situation. I am currently a third-year undergraduate computer science student, and I am attempting to transcribe all the meetings held among the individuals in my lab. To accomplish this task, I have been training the SpeakerBox model using a fixed set of approximately ten individuals from my lab.

However, I anticipate that new members may join the lab in the future, and it is crucial for me to be able to identify their voices as well. This is where I would greatly appreciate your guidance. Could you kindly offer any suggestions or recommendations on how I can tweak the SpeakerBox model to support the inclusion of new speakers?

I am particularly interested in understanding how I can adapt the model to incorporate the voices of new lab members seamlessly. Any advice or insights you can provide on this matter would be highly appreciated.

Thank you once again for creating SpeakerBox and for your time and assistance.

accelerate or tranformers[torch] required

Describe the Bug

After a small training run, the program halted with the following error indicating a required library was missing.

Expected Behavior

Completion of training.

Reproduction

pipenv install speakerbox==1.2.0
Execute script that calls speakerbox.train()

...
File "...code/transcribe/.venv/lib/python3.10/site-packages/speakerbox/main.py", line 265, in train
    args = TrainingArguments(
  File "<string>", line 117, in __init__
  File "...code/transcribe/.venv/lib/python3.10/site-packages/transformers/training_args.py", line 1442, in __post_init__
    and (self.device.type != "cuda")
  File "...code/transcribe/.venv/lib/python3.10/site-packages/transformers/training_args.py", line 1887, in device
    return self._setup_devices
  File "...code/transcribe/.venv/lib/python3.10/site-packages/transformers/utils/generic.py", line 54, in __get__
    cached = self.fget(obj)
  File "...code/transcribe/.venv/lib/python3.10/site-packages/transformers/training_args.py", line 1787, in _setup_devices
    raise ImportError(
ImportError: Using the `Trainer` with `PyTorch` requires `accelerate>=0.20.1`: Please run `pip install transformers[torch]` or `pip install accelerate -U`

Environment

  • OS Version: macOS 13.4
  • Python: 3.10.13
  • speakerbox Version: 1.2.0

Support different audio / directory structures

Feature Description

Support a more direct directory structure of speakers instead of "conversations". i.e.:

data/
├── bob/
|   ├── 0.wav
|   ├── 1.wav
|   ├── 2.wav
|   ├── 3.wav
|   ├── 4.wav
├── sally/
|   ├── 5.wav
|   ├── 6.wav
|   ├── 7.wav
|   ├── 8.wav
|   ├── 9.wav
└── eva/
    ├── 10.wav
    ├── 11.wav
    ├── 12.wav
    ├── 13.wav
    ├── 14.wav

Where all the audio for each speaker is provided as a directory. This would involve creating new functions for preparing the dataset -- with no guarantee that the "conversation id" holdout condition is met.

Use Case

See #17 -- direct use case already done.

Solution

Alternatives

datasets ~=1.18 requirement introduces conflict w/ numpy > 1.23

Describe the Bug

speakerbox requires datasets~=1.18 which in turn requires numpy>=1.17. The datasets 1.x line hasn't been updated since mid-2022. numpy v1.20 deprecated use of aliases of built-in types and expired those deprecations in v1.24. The datasets 1.x line uses those aliases, so a default install of speakerbox fails during training.

Expected Behavior

Training should work.

Reproduction

pipenv install speakerbox==1.2.0
Use speakerbox.train()

Environment

  • OS Version: macOS 13.4
  • Python: 3.10.13
  • speakerbox Version: 1.2.0

Portuguese Training

Hello, thank you in advance for the tool that you have developed.

Just to share, I'm doing some tests with your tool in my Portuguese language.
Initially I trained with 170 different speakers and approximately one hour of base. So far I have 86% accuracy.
The quality of the audios is extremely bad, they are from the call center and have 8000 hz, but even so the accuracy of your engine is very good.

Of course I made some changes to your code, mainly in the prepare_dataset section, because there you depend on a conversation ID, which is a little different for my scenario where I only have separate folders per person, that's all. But other than that, it was pretty simple to train.
It's even a suggestion for improvement that I suggest, I didn't see much need to separate the dataSet by conversation.

I opened an issue because I didn't have any discussion place in this repository, I just made it to share with you.

Epoch | Training Loss | Validation Loss | Accuracy

1 | 5.137100 | 5.217264 | 0.007317
2 | 4.836000 | 4.813613 | 0.046341
3 | 4.222300 | 4.175541 | 0.132927
4 | 3.446100 | 3.478938 | 0.236585
5 | 2.382000 | 2.762814 | 0.360976
6 | 2.422300 | 1.931921 | 0.502439
7 | 1.907200 | 1.598777 | 0.600000
8 | 1.262300 | 1.402867 | 0.613415
9 | 1.160200 | 1.040319 | 0.713415
10 | 1.402000 | 1.434696 | 0.632927
11 | 0.818900 | 1.030849 | 0.719512
12 | 0.636200 | 0.888412 | 0.774390
13 | 0.775500 | 0.888210 | 0.770732
14 | 0.180300 | 0.820457 | 0.785366
15 | 0.389300 | 0.771072 | 0.820732
16 | 0.305800 | 0.843936 | 0.791463
17 | 0.194600 | 0.796410 | 0.800000
18 | 0.372000 | 0.765828 | 0.820732
19 | 0.247800 | 0.736840 | 0.836585
20 | 0.196900 | 0.744377 | 0.834146
21 | 0.172800 | 0.661944 | 0.830488
22 | 0.145900 | 0.617652 | 0.852439
23 | 0.171100 | 0.709798 | 0.841463
24 | 0.238700 | 0.722369 | 0.852439
25 | 0.158100 | 0.705889 | 0.842683
26 | 0.124300 | 0.611421 | 0.867073
27 | 0.270200 | 0.647974 | 0.860976
28 | 0.178900 | 0.634960 | 0.859756
29 | 0.049200 | 0.567398 | 0.875610
30 | 0.025100 | 0.604317 | 0.864634

apply._diarize() does not allow for specification of Hugging Face token

Describe the Bug

The apply() function fails as a Hugging Face token is not supplied. The contained _diarize() function calls:

diarization_pipeline = Pipeline.from_pretrained("pyannote/speaker-diarization")

This results in an error indicating the pipeline is private/gated.

Expected Behavior

The HUGGINGFACE_TOKEN environment variable is not utilized as it is in preprocess.diarize_and_split_audio().

Reproduction

pipenv install speakerbox=1.2.0
Executive script which calls apply() function with a trained model.

Environment

  • OS Version: macOS 13.4
  • Python: 3.10.13
  • speakerbox Version: 1.2.0

pipenv install speakerbox retrieves v0.0.2 by default

Describe the Bug

When attempting an installation of the module, version 0.0.2 is installed by default.

Expected Behavior

PyPI has all of the versions, not sure why this version would be selected.

Reproduction

pipenv install speakerbox

Environment

  • OS Version: macOS 13.4
  • Python Version: 3.11.2
  • speakerbox Version (expected): 1.2.0
  • pipenv Version: 2023.11.14

Speaker diarisation before annotation

Already in progress in #1, implement a function to apply speaker diarisation to help with annotation. Additional utilities can be developed as well to place the grouped audio samples into a directory with the speaker label as the directory name. Labeling them all at once?

[Deprecation warning]

Not very urgent, but on python3.10 ubuntu22.04, I get

/usr/lib/python3/dist-packages/paramiko/transport.py:236: CryptographyDeprecationWarning: Blowfish has been deprecated
  "class": algorithms.Blowfish

upon execution of preprocess.expand_labeled_diarized_audio_dir_to_dataset

I managed to find that this is due to this import from pyannote.audio import Pipeline

I use the last version of every pip package, espacially pyannote.audio~=2.1.

torch requirements causing installation failure

Describe the Bug

When attempting to install version 1.2.0, no matching distribution is found which meets some of the speakerbox requirements.

Expected Behavior

Dependencies installed.

Reproduction

I attempted two different installation methods.

pipenv install speakerbox==1.2.0 resulted in a failure No matching distribution found for torch~=1.10

pipenv install -e git+https://github.com/CouncilDataProject/speakerbox.git#egg=speakerbox indicated:

ERROR: Could not find a version that satisfies the requirement torchaudio~=0.10 (from speakerbox) (from versions: 2.0.0, 2.0.1, 2.0.2, 2.1.0, 2.1.1)

Environment

  • OS Version: 13.4
  • Python Version: 3.11.2
  • speakerbox Version: 1.2.0

Write function to check the basics of the data (splits and amount)

We don't care how many events are used so much as there are enough events to have entirely new events in the holdout set. And how long events are doesn't matter as long as the number of sentences per person * their average length is generally enough to train a model.

It may actually be better to have a 20% train set and an 80% holdout set so that we can even more so try to ensure the model performs well on new data.

`AudioSegment.from_file` is not restricted to WAV files

Feature Description

In preprocess.py, you use AudioSegment.from_file to load the audio files. According to definition of this function, it seems it accepts a bunch of file formats.
but at the previous line, you restrict the user to wav files for ... in label_dir.glob("*.wav")
Is there a reason to that? Mp3/ogg/etc. files would be useful, as they take less place on the disk.

Use Case

Basic preprocess then train, as in README.

Solution

replace .glob('*wav') by a list of formats pydub accepts. I didn't find a list yet, but the implementation of from_file gives us some hints of the formats accepted.

Pinned hmmlearn version in unknown project dependency preventing compilation on M1 Macs

Describe the Bug

When attempting to install the latest version of speakerbox (1.2.0) on an M1 Mac, the installation fails when attempting to build a wheel for hmmlearn. This is a known and resolved issue on the hmmlearn project in version 0.3.0. So it looks like one of the dependencies which speakerbox relies on has hmmlearn pinned < 0.3.0 but I'm not sure which one, and until that's resolved it looks like I'm stuck.

Expected Behavior

speakerbox installation completes.

Reproduction

On M1 Mac:
pyenv local 3.10
pipenv --python 3.10
pipenv install speakerbox==1.2.0

Environment

  • OS Version: 13.4
  • Python Version: 3.10.13
  • speakerbox Version: 1.2.0

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.