Files
silero-vad/examples/pyaudio-streaming/pyaudio-streaming-examples.ipynb
2021-04-27 23:17:03 +02:00

212 lines
36 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"id": "62a0cccb",
"metadata": {},
"source": [
"# Pyaudio Microphone Streaming Examples\n",
"\n",
"A simple notebook that uses pyaudio to get the microphone audio and feeds this audio then to Silero VAD.\n",
"\n",
"I created it as an example on how binary data from a stream could be feed into Silero VAD."
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "5a647d8d",
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import torch\n",
"torch.set_num_threads(1)\n",
"import torchaudio\n",
"import matplotlib\n",
"import matplotlib.pylab as plt\n",
"torchaudio.set_audio_backend(\"soundfile\")"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "725d7066",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Downloading: \"https://github.com/snakers4/silero-vad/archive/master.zip\" to /home/kaik/.cache/torch/hub/master.zip\n"
]
}
],
"source": [
"model, utils = torch.hub.load(repo_or_dir='snakers4/silero-vad',\n",
" model='silero_vad',\n",
" force_reload=True)"
]
},
{
"cell_type": "markdown",
"id": "f9112603",
"metadata": {},
"source": [
"### Helper Methods"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "5abc6330",
"metadata": {},
"outputs": [],
"source": [
"# Taken from utils_vad.py\n",
"def validate(model,\n",
" inputs: torch.Tensor):\n",
" with torch.no_grad():\n",
" outs = model(inputs)\n",
" return outs\n",
"\n",
"# Provided by Alexander Veysov\n",
"def int2float(sound):\n",
" abs_max = np.abs(sound).max()\n",
" sound = sound.astype('float32')\n",
" if abs_max > 0:\n",
" sound *= 1/abs_max\n",
" sound = sound.squeeze() # depends on the use case\n",
" return sound"
]
},
{
"cell_type": "markdown",
"id": "5124095e",
"metadata": {},
"source": [
"## Pyaudio"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "a845356e",
"metadata": {},
"outputs": [],
"source": [
"import pyaudio\n",
"import io\n",
"\n",
"FORMAT = pyaudio.paInt16\n",
"CHANNELS = 1\n",
"SAMPLE_RATE = 16000\n",
"CHUNK = int(SAMPLE_RATE / 10)\n",
"\n",
"audio = pyaudio.PyAudio()"
]
},
{
"cell_type": "markdown",
"id": "0b910c99",
"metadata": {},
"source": [
"## Simple Example\n",
"The following example reads the audio as 250ms chunks from the microphone, converts them to a Pytorch Tensor, and gets the probabilities/confidences if the model thinks the frame is voiced."
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "9d3d2c10",
"metadata": {},
"outputs": [],
"source": [
"# Configure how long you want to record the audio\n",
"frames_to_record = 20 # frames_to_record * frame_duration_ms = recording duration\n",
"frame_duration_ms = 250"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "3cb44a4a",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 1440x432 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"stream = audio.open(format=FORMAT,\n",
" channels=CHANNELS,\n",
" rate=SAMPLE_RATE,\n",
" input=True,\n",
" frames_per_buffer=CHUNK)\n",
"data = []\n",
"voiced_confidences = []\n",
"\n",
"\n",
"for i in range(0, frames_to_record):\n",
" \n",
" audio_chunk = stream.read(int(SAMPLE_RATE * frame_duration_ms / 1000.0))\n",
" \n",
" # in case you want to save the audio later\n",
" data.append(audio_chunk)\n",
" \n",
" audio_int16 = np.frombuffer(audio_chunk, np.int16);\n",
"\n",
" audio_float32 = int2float(audio_int16)\n",
" \n",
" # get the confidences and add them to the list to plot them later\n",
" vad_outs = validate(model, torch.from_numpy(audio_float32))\n",
" # only keep the confidence for the speech\n",
" voiced_confidences.append(vad_outs[:,1])\n",
"\n",
"# plot the confidences for the speech\n",
"plt.figure(figsize=(20,6))\n",
"plt.plot(voiced_confidences)\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "56b225f5",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.6"
}
},
"nbformat": 4,
"nbformat_minor": 5
}