Evaluating many recordings
Upload a set of recordings, get answers to the same questions about each one and compare them row by row. Clone this Gradio app to follow along, or fork it as a starting point.


By the end you will have the app running locally, and you will know how it stays within the rate limit, sends long recordings in parts, estimates a run’s tokens, picks up a stopped run and shows the answers.
Prerequisites
- Python 3.11 or later, and git.
- An API key from the API keys page of the Hume Platform. See Authentication.
- Recordings in MP3, or in WAV with PCM or floating-point samples, each at least 5 seconds long. The app sends a recording longer than 5 minutes in parts.
Run the example
Clone the repository and install its dependencies. If you use uv, it needs version 0.13.6 or later and installs the Python version in .python-version for you.
uv
pip
Set your API key. The app creates the SDK client when it starts, which reads HUME_API_KEY on the server, so the key never reaches the browser. If the variable is not set, the app exits when it starts.
Start the app and open http://localhost:7860.
uv
pip
Add recordings under Recordings in the sidebar, then press Run. To ask your own questions, edit the Request first. Each part of each recording gets a row with the input tokens it was billed and one column per question. Select a row to hear its part and see its full response. Press Estimate tokens before a run to see what it would be billed. During a run, Stop cancels the requests in flight, and pressing Run again sends only what has no answer yet. Results last as long as the browser tab, so download them as CSV or JSON before you reload the page.
How it works
Adapt it to your recordings
- Change the default request. It is
DEFAULT_REQUESTinquestions.py. To try a request before you change the code, edit it in the app’s Request editor. See Writing questions. - Change the pace.
REQUESTS_PER_MINUTEinevaluation.pysets the pace,CONCURRENT_RECORDINGSthe number of recordings sent at once andMAX_PART_MSthe longest part, which must be 5 minutes or less. Sending more recordings at once never raises the pace aboveREQUESTS_PER_MINUTE, and it holds more audio in memory. Every API key in your organization shares a limit of 60 requests a minute. See Limits. - Change how answers are shown.
_cellinresults.pyformats each answer’s cell. For example, ascorecell can show the level with the largest share of raters instead of the mean. See Interpreting answers. - Keep the results.
write_downloadsinresults.pywrites the CSV and JSON downloads. The JSON holds the request and, for every part that was sent, its response with itsrun_idor its error. To keep results past the browser tab, save them to your own storage there. See Store the results. - Before you share it. The app listens only on your own machine and has no sign-in. Anyone who can reach it can spend your API key, so add authentication before you expose it on a network or through a Gradio share link.