mirror of
https://github.com/snakers4/silero-vad.git
synced 2026-02-05 01:49:22 +08:00
272 lines
37 KiB
Plaintext
272 lines
37 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.\n",
|
|
"\n",
|
|
"\n",
|
|
"Has been tested on Ubuntu 21.04 (x86). After you installed the dependencies below, no additional setup is required."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "64cbe1eb",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Dependencies\n",
|
|
"The cell below lists all used dependencies and the used versions. Uncomment to install them from within the notebook."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 1,
|
|
"id": "57bc2aac",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"#!pip install numpy==1.20.2\n",
|
|
"#!pip install torch==1.8.1\n",
|
|
"#!pip install matplotlib==3.4.2\n",
|
|
"#!pip install torchaudio==0.8.1\n",
|
|
"#!pip install soundfile==0.10.3.post1\n",
|
|
"#!pip install pyaudio==0.2.11"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "110de761",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Imports"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 2,
|
|
"id": "5a647d8d",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"import io\n",
|
|
"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\")\n",
|
|
"import pyaudio"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 3,
|
|
"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": "code",
|
|
"execution_count": 4,
|
|
"id": "1c0b2ea7",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"(get_speech_ts,\n",
|
|
" get_speech_ts_adaptive,\n",
|
|
" save_audio,\n",
|
|
" read_audio,\n",
|
|
" state_generator,\n",
|
|
" single_audio_stream,\n",
|
|
" collect_chunks) = utils"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "f9112603",
|
|
"metadata": {},
|
|
"source": [
|
|
"### Helper Methods"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 5,
|
|
"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 Set-up"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 6,
|
|
"id": "a845356e",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"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": 7,
|
|
"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": 11,
|
|
"id": "3cb44a4a",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Started Recording\n",
|
|
"Stopped the recording\n"
|
|
]
|
|
},
|
|
{
|
|
"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",
|
|
"print(\"Started Recording\")\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",
|
|
"print(\"Stopped the recording\")\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": "430a343e",
|
|
"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
|
|
}
|