From 1021dca6275342760d844a940952270f59efaeab Mon Sep 17 00:00:00 2001 From: jaberkow Date: Tue, 15 Dec 2020 16:17:58 -0800 Subject: [PATCH] added readme --- README.md | 37 +++++++++++++++++++++++++++++++++++++ pipeline.png | Bin 0 -> 27397 bytes 2 files changed, 37 insertions(+) create mode 100644 README.md create mode 100644 pipeline.png diff --git a/README.md b/README.md new file mode 100644 index 0000000..67d1495 --- /dev/null +++ b/README.md @@ -0,0 +1,37 @@ +# Detecting Distribution Shift in Speech Audio + +This repo contains tools for doing covariate shift detection on speech audio, and an example application on the [VOiCES dataset](https://iqtlabs.github.io/voices/). Our approach uses pretrained speech featurizers and aggregation methods to embed waveforms into fixed length vectors. + +![Embedding pipeline](pipeline.png) + +We then use the approach of [Failing Loudly](https://arxiv.org/abs/1810.11953) to detect distribution shift, by first using untrained autoencoders for dimensionality reduction on the embeddings, followed up by two-sample non-parametric hypothesis testing on samples of source and target data. + +## Contents + +* `embeddors.py`: Classes wrapping models that convert waveforms to sequences of feature vectors. +* `aggregators.py`: Classes for aggregrating sequences of feature vectors into single, fixed-length vector embeddings. +* `data_utils.py`: Tools for combining featurizors and aggregators into the embedding pipeline and applying it to lists of waveforms or .wav files. +* `detection_utils.py`: Functional wrappers around [the alibi_detect implementation](https://docs.seldon.io/projects/alibi-detect/en/stable/methods/mmddrift.html) of [MMD two sample testing](https://en.wikipedia.org/wiki/Kernel_embedding_of_distributions#Kernel_two-sample_test) for single and repeated tests. +* `hypothesis_test.ipynb`: This notebook walks through loading the VOiCES dataset, preprocessing the waveforms into embeddings, and evaluating the performance of distribution shift detection. + +## Dependencies and prerequisites + +To follow the experiments in `hypothesis_test.ipynb` you will need to download the [VOiCES dataset](https://iqtlabs.github.io/voices/). Instructions for that can be found [here](https://iqtlabs.github.io/voices/downloads/). We recommend using the devkit subset for expediency. + +The following packages are required + +``` +alibi-detect +torch +fairseq +tensorflow +tensorflow_hub +librosa +pandas +seaborn +wget +``` +All can be installed using pip +``` +pip install -r requirements.txt +``` \ No newline at end of file diff --git a/pipeline.png b/pipeline.png new file mode 100644 index 0000000000000000000000000000000000000000..73020e28ab63807994e22b0a5e4c53701fa613da GIT binary patch literal 27397 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 bEEJb*vMg}_p++$FbyDie_mti$AjAF(Cw(B< literal 0 HcmV?d00001