Audiophile
A service that stores information about audio files, provides access to this information and periodically updates this data with updates from an included deep learning model.
API Reference
Get all audio files
GET /api/files
Get audio file
GET /api/files/{file_id}
Parameter | Type | Description |
---|---|---|
id |
string |
Required. The ID of file to fetch |
Get audio file with predictions filtered by model
GET /api/files/{file_id}/{model}
Parameter | Type | Description |
---|---|---|
id |
string |
Required. The ID of file to fetch |
POST /api/files/upload
Uploads a file to the local media directory
Body | Type | Description |
---|---|---|
file |
binary |
Required. The audio file to be uploaded |
POST /api/files/upload/s3
Uploads a file to an S3 bucket
Body | Type | Description |
---|---|---|
file |
binary |
Required. The audio file to be uploaded |
Authors
Demo
https://www.github.com/f-gozie
Environment Variables
To run this project, you will need to add the following environment variables to your .env file
Mandatory -ish .env Variables
This is for if you choose to run this project with POSTGRESQL as the database. You'd need to add
the .env variables for postgresql. If you'd rather use a local database, you can change the SQLALCHEMY_DATABASE_URL
in audiophile/config/databases.py
to use SQLite instead.
DB_USER
DB_PASSWORD
DB_HOST
DB_PORT
DB_NAME
Optional .env variables (if you want to upload to s3 instead of locally)
AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY
AWS_REGION
AWS_S3_BUCKET
S3_BUCKET_URL
Run Locally (Without Docker)
Clone the project
git clone https://github.com/f-gozie/audiophile
Go to the project directory
cd audiophile
Activate preferred virtual environment
conda activate audiophile
Install dependencies
pip install -r requirements.txt
Start the server
uvicorn audiophile.main:app --reload
Run Locally (With Docker [ideally using sqlite3])
Clone the project
git clone https://github.com/f-gozie/audiophile
Go to the project directory
cd audiophile
Build docker image using Dockerfile
docker build -t audiophile .
Create a volume to persist DB
docker volume create audiophile-db
Start the server
docker run -p 8000:8000 --env-file=.env -v audiophile-db:/app audiophile
Run Locally (With Docker Compose [the easiest way])
Clone the project
git clone https://github.com/f-gozie/audiophile
Go to the project directory
cd audiophile
Build docker images
docker compose build
Start the server
docker compose up
Appendix
For the Prediction
model, the reference
field on them is basically used to retrieve the latest predictions for a particular file. Whenever new predictions are generated (every 2 minutes), we create a new reference and update the file with the latest reference, and all newly generated predictions have the same reference. So when getting a file's detail, we filter the predictions by the reference on the file whic returns the latest predictions for the file.
Audio files can be added on demand by uploading them using the /api/files/upload
endpoint. There is also an option to upload to an S3 bucket, but the default is to upload locally (since the code solution should be local and easy to run)
For the ability to have multiple models to run inferences against, we have a models
class where we can add our models, and we group the models together which we use when running inferences. We run each phrase/utterance against each model and store the model information with the prediction that was generated.
We have a helper method does_data_drift_exist
which helps us monitor our input data and compare against existing data to check for cases of data drifting. We then log these in a list, which we could potentially write into a DB, exclude from the new data to add, notify an admin, or whatever action we would like to perform at that point