{ "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", "from collections import deque\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", " _sound = np.copy(sound) # may be not necessary\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" ] }, { "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": "iVBORw0KGgoAAAANSUhEUgAABIEAAAFlCAYAAAB82/jyAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Z1A+gAAAACXBIWXMAAAsTAAALEwEAmpwYAABPH0lEQVR4nO3dd3ic1Z328fvMjKRRl6zibtmSx4Vig21cwDKQAAFSSAihJJAGISSbbOompG6STfKy6ckuIaGlAAmQTpaeAHFBMrbBBuMmS7LcZWnUy0hTzvuHRkaWZVu2JT1Tvp/r8qUpj6TbMB5p7jnn9xhrrQAAAAAAAJDYXE4HAAAAAAAAwOijBAIAAAAAAEgClEAAAAAAAABJgBIIAAAAAAAgCVACAQAAAAAAJAFKIAAAAAAAgCTgceobFxYW2unTpzv17QEAAAAAABLOhg0bGq21RUPd51gJNH36dK1fv96pbw8AAAAAAJBwjDF1x7qP7WAAAAAAAABJgBIIAAAAAAAgCVACAQAAAAAAJAFKIAAAAAAAgCRACQQAAAAAAJAEKIEAAAAAAACSACUQAAAAAABAEqAEAgAAAAAASAKUQAAAAAAAAEmAEggAAAAAACAJUAIBAAAAAAAkAUogADElFI7opdomHWjtlrXW6TgAAAAAkDA8TgcAgIHueHKb7l1dK0nK9no0a3x29E+WZo/Plm98tgqzUmWMcTgpAAAAAMQXSiAAMePFnY26d3Wt3nnOJC0sydf2+nbtqO/Qk5sP6PcvBQ8fNy4zVb7iLM2e0FcKzY6WRHkZqQ6mBwAAAIDYRgkEICa0dgX1uT9sUmlhpv7f1fOUnuo+fJ+1Vg0dPdpxsEM76tsP//nzy/vU0RM6fFxxdtoRK4dmTciWrzhL2d4UJ/5KAAAAABBTKIEAxISv/W2zGtp79KePnX9EASRJxhgVZ3tVnO3Vcl/h4duttTrQGuhbMXSwb9XQjvp2/e6lOgWCkcPHTc5L7yuFDhdE2ZpZnHXU9wEAAACAREYJBMBxf9u4T49t2q/PXjpL86fmDfvzjDGalJeuSXnpunh28eHbIxGrPc1dh0uhHfXt2n6wXWt2+tUbjkQ/V5o2LuONVUPRcqi0KFNpHsohAAAAAImHEgiAo/a3dOtrf92sc6fl6eMXlY3I13S5jEoKMlVSkKlLzxh/+PZQOKJd/q4jtpTtqO/Qc9sOKRzpOxOZ22U0vSCjb95QcbZmT+griaYXZMrj5oSKAAAAAOIXJRAAx0QiVp//wyaFIlY/ue6cUS9ZPG6XZhZnaWZxlq48e+Lh23tCYdU2dmr7wXZV1Xdoe327tuxv05ObD6r/LPWpbpdKizI1a3x2tCDqG0w9NT9DLhdnKgMAAAAQ+yiBADjm/jW1erHarzuuPlslBZmO5UjzuDVnQo7mTMg54vbu3rB2HjpyGPWGumY9tmn/4WO8KS75irPli57Cftb4bM2akK1JuV5OYw8AAAAgplACAXDE9oPt+t7T23XJ3PG67rypTscZUnqqW2dPydXZU3KPuL09EFTVoQ5V1bdr+8EOVR1q1+qqRv355X2Hj8lK88g3PkuzivtKodnjs7Voer68KcwbAgAAAOAMSiAAY64nFNanHn5FOV6P7nj32XG3Yibbm6IF0/K1YFr+Ebe3dPVqR3Q7WVV0GPUzWw7qkfV7JEmFWam6eXmpblw6jdPWAwAAABhzlEAAxtyPntmhbQfbdd8HFqkwK83pOCMmLyNVi2eM0+IZ4w7fZq1VY0evNu9r1f1ravXfT23TXS/s1AcvmKEPnT9d+ZmpDiYGAAAAkEwogQCMqcoav+5eVaMbFk/Tm+eOP/EnxDljjIqy03TxnGJdPKdYm/a06M7nd+pn/6zSvatqdOPSEt2yfIaKc7xORwUAAACQ4IztP/XNGFu0aJFdv369I98bgDPaAkFd8ZNVSnEbPf7v5cpMS94eevvBdv38hZ36+6b98rhdum7RVH30wlJNyc9wOhoAAACAOGaM2WCtXTTkfZRAAMbKZx/ZqL9t2q8/3rZM5w6ap5OsdjV26hf/qtafXt4ra6V3njtZH7uoTGVFWU5HAwAAABCHjlcCucY6DIDk9PirB/TnV/bpExfPpAAaYHphpu549zz96z8u1o1LS/R/r+7XJT/6l/7toZf1+v5Wp+MBAAAASCCsBAIw6g62BvSWn6zU9MJM/fG2ZUpx0z8fS2NHj+5bXasHKurU0RPSm+cU69/eNPOoM5EBAAAAwFDYDgbAMZGI1Qd+9ZLW72rW4/++XKVscxqW1q6gflOxS/evqVVLV1DnlxXoExfP1LKyAhljnI4HAAAAIEaxHQyAY35TsUurqhr1lbfOpQA6CbkZKfr3N/u05otv0leunKuqQx16771rdfVdL+qfW+vlVIEPAAAAIH6xEgjAqKmqb9fb/me1LphZqPs+sIgVLKchEAzrDxv26hcvVGtfS7fmTszRv11cpivOmii3i/+uAAAAAPqwHQzAmOsNRfSun6/RgdaAnvp0uYqzvU5HSgjBcER/27hfP39hp2oaOlVamKnbLirTu86dzKwlAAAAAGwHAzD2fvKPHXp9f5vuuPpsCqARlOJ26ZqFU/TsZy7Une9dIG+KW1/446u66Psv6LcVuxQIhp2OCAAAACBGUQIBGHHrdjXpF/+q1nWLpuqyMyc4HSchuV1Gb503UY//+3L96oPnaUKuV1//2+ta/t/P65f/qlZHT8jpiAAAAABiDNvBAIyo9kBQV/x0lVzG6IlPlSsrzeN0pKRgrVVlTZPufH6nVu9sVG56ij50wXR98PzpystIdToeAAAAgDFyvO1gvDoDMKK++fct2t/SrT/ctowCaAwZY7SsrEDLygr0yu5m3fl8tX7yjyrds7JGNy4r0S3LS1WUneZ0TAAAAAAO4hUagBHz1OYD+uOGvfrExTO1sGSc03GS1rnT8nXvBxZp64E23fn8Tt29ska/XrNL1583VbdeWKbJeelORwQAAADgALaDARgRh9oCestPVmpKfob+/PHzOVNVDKlp6NBdL1TrL6/skyRdvWCyPnbRTM0ozHQ4GQAAAICRxiniAYwqa60+9Ot1qqzx6/8+Wa6ZxVlOR8IQ9rV06+5/VevhdXsUDEf01nmT9G8Xl2nOhBynowEAAAAYIZwiHsCoerCyTi9sb9CXr5xLARTDJuel65tXnaVVX7xYH1lRque21uvyn6zSLb9Zr417WpyOBwAAAGCUDasEMsZcbozZbozZaYy5fYj7pxljnjfGvGKMedUYc+XIRwUQi6obOvSdJ7bqwllFumlpidNxMAzF2V596Yq5WnP7m/TpS3xat6tJ77xzjW68d60qqv1yaoUoAAAAgNF1wu1gxhi3pB2SLpW0V9I6STdYa7cMOOZuSa9Ya+8yxpwh6Qlr7fTjfV22gwHxLxiO6N13vajdTV165tMrVJzjdToSTkFHT0gPVdbpnlW1auzo0cKSfH3i4pm6aHaRjDFOxwMAAABwEk53O9hiSTuttTXW2l5JD0u6atAxVlL/UIlcSftPNSyA+PGzf1bp1b2t+n/vOpsCKI5lpXn00QvLtPqLF+tbV52pg60BfejX6/S2/1mtJ147oEiElUEAAABAIhhOCTRZ0p4B1/dGbxvoG5JuNMbslfSEpE8O9YWMMbcaY9YbY9Y3NDScQlwAsWJDXZPufH6n3r1giq44e6LTcTACvCluvX/ZdD3/+Yv0vWvmqas3rI8/9LIu/fG/9KcNexUMR5yOCAAAAOA0jNRg6Bsk/dpaO0XSlZIeMMYc9bWttXdbaxdZaxcVFRWN0LcGMNY6e0L6zCObNCkvXd94xxlOx8EIS/W4dO2iqfrHZy/U/9xwrlLcLn3uD5t08Q9e0IOVdQoEw05HBAAAAHAKhlMC7ZM0dcD1KdHbBrpZ0qOSZK2tkOSVVDgSAQHEnv/6vy3a09ylH117jrK9KU7HwShxu4zePn+SnvxUue59/yIVZqXpq3/drBXfe173rqpRV2/I6YgAAAAATsJwSqB1knzGmBnGmFRJ10t6bNAxuyW9WZKMMXPVVwKx3wtIQM9uqdfD6/botgvLtHjGOKfjYAwYY3TJGeP1l4+fr4duWaKyoix9+/GtuuCO5/TQ2jqn4wEAAAAYphOWQNbakKRPSHpa0lZJj1prXzfGfMsY847oYZ+T9BFjzCZJv5f0Qcs5hoGE09Deo9v/9KrOnJSjz1wyy+k4GGPGGF0ws1C/v3Wp/vSx81ValKWv/XWzWruDTkcDAAAAMAye4RxkrX1CfQOfB9729QGXt0i6YGSjAYgl1lp98U+vqr0npIevO0epnpEaKYZ4tLAkX1+8fI6u/WWFKqobdflZDAcHAAAAYh2v4gAMy+9e2q3nth3S7ZfPkW98ttNxEAPOnZanzFS3VlY1Oh0FAAAAwDBQAgE4oZqGDn37/7Zq+cxCffD86U7HQYxIcbu0rKxQK3c0iB3AAAAAQOyjBAJwXMFwRJ95dJNSPS794D3z5XIZpyMhhqyYVai9zd2q83c5HQUAAADACVACATiuO5/fqU17WvSdd52lCblep+MgxpT7iiRJq6o4ISQAAAAQ6yiBABzTK7ub9T/P7dS7zp2st82b5HQcxKDpBRmakp/OXCAAAAAgDlACARhSV29In310kybkePXNq850Og5ilDFG5b4iVVT7FQxHnI4DAAAA4DgogQAM6duPb9Uuf6d+eO185XhTnI6DGLbCV6iOnpA27mlxOgoAAACA46AEAnCUf26t1+/W7tZHyku1tLTA6TiIceeXFcplpFU7mAsEAAAAxDJKIABHaOzo0Rf/9KrmTMjW5y6b5XQcxIHcjBTNn5rHXCAAAAAgxlECATjMWqvb//Sa2rpD+sn15yjN43Y6EuJEua9Ir+5tUUtXr9NRAAAAABwDJRCAwx5dv0f/2FqvL1w+W3Mm5DgdB3Fkha9QESu9WO13OgoAAACAY6AEAiBJqvN36pt/36Lzywr04QtmOB0HcWb+1Dxlp3m0qoq5QAAAAECsogQCoFA4os88slEel9EP3jNfLpdxOhLiTIrbpWVlBVq5o1HWWqfjAAAAABgCJRAA3fVCtV7e3aL/eudZmpSX7nQcxKnyWUXa19Kt2sZOp6MAAAAAGAIlEJDkXt3bop/+s0pvnz9JV50z2ek4iGMX+ookSas4SxgAAAAQkyiBgCTW3RvWpx/ZqKLsNH37qrOcjoM4N60gQyUFGcwFAgAAAGIUJRCQxL77xFbVNHTqB++Zr9yMFKfjIAGU+wpVUe1XbyjidBQAAAAAg1ACAUnq+e2H9EBlnW5ePkMXzCx0Og4SRLmvSJ29Yb28u9npKAAAAAAGoQQCklBTZ6++8MdXNXt8tv7jLbOdjoMEsqysQG6XYUsYAAAAEIMogYAkY63Vl//8mlq7gvrxdefIm+J2OhISSI43RedOzWM4NAAAABCDKIGAJPPHDXv11OsH9bnLZumMSTlOx0ECKvcV6bV9rWrq7HU6CgAAAIABKIGAJLKnqUvf/PsWLZ4xTreUlzodBwmqfFahrJXW7GQ1EAAAABBLKIGAJBGOWH3mkY0ykn507Xy5XcbpSEhQ8ybnKsfrYS4QAAAAEGMogYAk8Yt/VWt9XbO+edWZmpKf4XQcJDCP26ULZhZqVVWjrLVOxwEAAAAQRQkEJIHN+1r142d36K1nT9S7zp3sdBwkgXJfkQ60BlTd0OF0FAAAAABRlEBAggsEw/r0IxtVkJWq77zrLBnDNjCMvnJfoSRp5Q7mAgEAAACxghIISHB3PLlNOw916Afvma+8jFSn4yBJTB2XoRmFmcwFAgAAAGIIJRCQwFZVNejXL+7SB8+frnJfkdNxkGTKfYWqrGlSTyjsdBQAAAAAogQCElZLV68+/4dNmlmcpduvmON0HCShcl+RuoNhbahrdjoKAAAAAFECAQnJWquv/GWz/B29+sl158ib4nY6EpLQ0tJx8riMVlUxFwgAAACIBZRAQAL6yyv79PhrB/SZS2fprMm5TsdBksr2pmjBtHzmAgEAAAAxghIISDB7m7v0n397XedNz9dtF5Y5HQdJbsWsQm3e1yZ/R4/TUQAAAICkRwkEJJBwxOpzj26SlfSja8+R28Xp4OGs/oHkq3eyJQwAAABwGiUQkEDuXVWjtbVN+s+3n6Gp4zKcjgPorMm5ystIYS4QAAAAEAMogYAEsWV/m37wzHZdfuYEXbNwitNxAEmS22V0wcxCrapqkLXW6TgAAABAUqMEAhJAIBjWpx95RXkZqfru1WfLGLaBIXas8BWqvq1HO+o7nI4CAAAAJDVKICABfP/p7dpR36HvXTNP4zJTnY4DHGF5dC4QZwkDAAAAnEUJBMS5NTsbdd/qWt20tEQXzy52Og5wlMl56SorytRK5gIBAAAAjqIEAuJYa1dQn//DJpUWZerLV851Og5wTOW+Iq2t8SsQDDsdBQAAAEhalEBAHPt/T25VQ3uPfnLdOUpPdTsdBzimFbMK1ROKaP2uZqejAAAAAEmLEgiIU5GI1ZObD+qqcyZr3pQ8p+MAx7VkRoFS3Ia5QAAAAICDKIGAOLXlQJtau4Na7itwOgpwQplpHi0syWcuEAAAAOAgSiAgTlXW+CVJS0spgRAfyn1F2nqgTYfaA05HAQAAAJISJRAQpypr/JpekKGJuelORwGGZUX0VPFrdrIaCAAAAHACJRAQh8IRq7W1TVpWxiogxI8zJ+UoPyNFq3ZQAgEAAABOoAQC4tDr+1vVHgixFQxxxeUyWu4r0sqqRllrnY4DAAAAJB1KICAO9c8DWkYJhDhT7itUY0ePth1sdzoKAAAAkHQogYA4VFHtV2lRpopzvE5HAU5Kua9QkjhVPAAAAOAASiAgzoTCEa3b1cwqIMSlibnpmjU+S6s4VTwAAAAw5iiBgDizeX+bOnqYB4T4Ve4r0traJgWCYaejAAAAAEmFEgiIMxXVffOAKIEQr8p9heoNRfRSbZPTUQAAAICkQgkExJmKGr98xVkqyk5zOgpwSpbMKFCq28VcIAAAAGCMUQIBcSQYjmj9riYtK2MVEOJXeqpb583I18odzAUCAAAAxhIlEBBHXt3bqq7eMFvBEPfKfUXaXt+u+raA01EAAACApEEJBMSRyhrmASExvHGqeFYDAQAAAGOFEgiIIxXVfs2ZkK1xmalORwFOy9wJOSrMSmUuEAAAADCGKIGAONEbimh9XROrgJAQXC6j5TMLtbqqUZGIdToOAAAAkBQogYA4sWlviwLBCCUQEka5r0j+zl5tOdDmdBQAAAAgKQyrBDLGXG6M2W6M2WmMuf0Yx1xrjNlijHndGPO7kY0JoKLaL2OkpaXjnI4CjAjmAgEAAABj64QlkDHGLelOSVdIOkPSDcaYMwYd45P0JUkXWGvPlPTpkY8KJLeKar/mTshRXgbzgJAYinO8mjMhm7lAAAAAwBgZzkqgxZJ2WmtrrLW9kh6WdNWgYz4i6U5rbbMkWWsPjWxMILkFgmG9vLuZrWBIOOW+Qq3f1ayu3pDTUQAAAICEN5wSaLKkPQOu743eNtAsSbOMMWuMMZXGmMuH+kLGmFuNMeuNMesbGnjnFxiujXta1BOKaFkZJRASS7mvSL3hiNbWNjkdBQAAAEh4IzUY2iPJJ+kiSTdIuscYkzf4IGvt3dbaRdbaRUVFRSP0rYHE1z8PaPEM5gEhsSyeMU6pHpdW7WAuEAAAADDahlMC7ZM0dcD1KdHbBtor6TFrbdBaWytph/pKIQAjoKLGrzMn5Sg3PcXpKMCI8qa4tWTGOOYCAQAAAGNgOCXQOkk+Y8wMY0yqpOslPTbomL+qbxWQjDGF6tseVjNyMYHkFQiGtXF3i5YxDwgJqtxXqKpDHTrQ2u10FAAAACChnbAEstaGJH1C0tOStkp61Fr7ujHmW8aYd0QPe1qS3xizRdLzkv7DWusfrdBAMnm5rlm9YeYBIXGtmNW3PZhTxQMAAACjyzOcg6y1T0h6YtBtXx9w2Ur6bPQPgBFUUeOXy0jnTWceEBLT7PHZKspO06qqRl27aOqJPwEAAADAKRmpwdAARklljV9nT85Vtpd5QEhMxhiV+wq1uqpBkYh1Og4AAACQsCiBgBjW3RvWxj0tWspWMCS4Fb4iNXcF9fr+NqejAAAAAAmLEgiIYevrmhQMW4ZCI+FdMLNQkrSSs4QBAAAAo4YSCIhhFdV+uV2GeUBIeEXZaTpjYo5W7qAEAgAAAEYLJRAQwypr/Jo3JVeZacOa4Q7EtfJZhXp5d7M6ekJORwEAAAASEiUQEKM6e0J6dW8rW8GQNFb4ihQMW62t8TsdBQAAAEhIlEBAjFq3q0mhiNUyhkIjSSwsyZc3xaVVVY1ORwEAAAASEiUQEKMqa5qU4jZaWJLvdBRgTHhT3Foyo4Dh0AAAAMAooQQCYlRFjV/zp+QpI5V5QEge5b5C1TR0am9zl9NRAAAAgIRDCQTEoPZAUJv3tbIVDElnxawiSdJqtoQBAAAAI44SCIhB63Y1KRyxDIVG0vEVZ2l8ThpzgQAAAIBRQAkExKDKmialul1awDwgJBljjMp9RVq9s1HhiHU6DgAAAJBQKIGAGFRR7dc50/LkTXE7HQUYc+W+QrV2B/XavlanowAAAAAJhRIIiDGt3UG9vr+VrWBIWstnFkqSVu3gLGEAAADASKIEAmLMS7VNilgxFBpJqyArTWdNzmEuEAAAADDCKIGAGFNZ41eqx6VzpuY5HQVwzApfkV7e3az2QNDpKAAAAEDCoAQCYkxFtV8Lp+UzDwhJrdxXpFDEqrKmyekoAAAAQMKgBAJiSEtXr7YebGMrGJLegpI8ZaS6taqKuUAAAADASKEEAmLI2tomWSstZSg0klyax62lpQXMBQIAAABGECUQEEMqqv3yprg0f2qu01EAx5X7ClXb2Kk9TV1ORwEAAAASAiUQEEMqa/xaVDJOaR7mAQHlviJJYjUQAAAAMEIogYAY4e/o0baD7cwDAqLKijI1KderlTuYCwQAAACMBEogIEa8VNt3FqSlpeMcTgLEBmOMyn1FWlPdqFA44nQcAAAAIO5RAgExoqLGr4xUt+ZNyXM6ChAzymcVqj0Q0qa9rU5HAQAAAOIeJRAQIyqq/Vo0fZxS3PyzBPpdUFYoY8Sp4gEAAIARwKtNIAY0dvSo6lAHW8GAQfIzUzVvci7DoQEAAIARQAkExIDKGr8kaVkpQ6GBwcp9Rdq4p0Wt3UGnowAAAABxjRIIiAEV1X5lpXl09uRcp6MAMafcV6hwxKqi2u90FAAAACCuUQIBMaCixq/zpufLwzwg4CjnTstXZqqbuUAAAADAaeIVJ+CwQ20B1TR0ailbwYAhpXpcWlZWwFwgAAAA4DRRAgEOq+ifB1RGCQQcS7mvSLubulTn73Q6CgAAABC3KIEAh1XW+JXt9ejMScwDAo6l3FcoSVrJaiAAAADglFECAQ6rrGnSkhnj5HYZp6MAMWtGYaam5Kdr1Q7mAgEAAACnihIIcNDB1oBqG5kHBJyIMUblviJVVPsVDEecjgMAAADEJUogwEEVNX1bWyiBgBNb4StUe09Im/a0OB0FAAAAiEuUQICDKqr9yk1P0RkTc5yOAsS888sK5TLMBQIAAABOFSUQ4KDKmiYtnjFOLuYBASeUm5Gi+VPztKqKuUAAAADAqaAEAhyyr6Vbu5u6tIytYMCwlfuKtGlPi1q7gk5HAQAAAOIOJRDgkIpqvyRpWRklEDBcK3yFiljpxWq2hAEAAAAnixIIcEhFtV/5GSmaPT7b6ShA3Jg/NU/ZaR7mAgEAAACngBIIcEhljV9LZhQwDwg4CSlul5aVFWjljgZZa52OAwAAAMQVSiDAAXuaurSvpZutYMApKJ9VpH0t3apt7HQ6CgAAABBXKIEABzAPCDh1K3yFkqRVbAkDAAAATgolEOCAyhq/CjJT5SvOcjoKEHdKCjI1bVwGp4oHAAAAThIlEDDGrLWqqPFraWmBjGEeEHAqyn2Fqqj2qzcUcToKAAAAEDcogYAxVufv0oHWgJayFQw4ZeW+InX2hvXK7manowAAAABxgxIIGGMVNdF5QKWUQMCpWlZWILfLMBcIAAAAOAmUQMAYq6zxqyg7TWVFmU5HAeJWbnqKzpmax1wgAAAA4CRQAgFjyFqrimrmAQEjYYWvSK/ua1VzZ6/TUQAAAIC4QAkEjKGaxk4dau9hKxgwAspnFcpaaU01W8IAAACA4aAEAsZQZf88IIZCA6dt3uRc5Xg9WrWDEggAAAAYDkogYAxVVPs1PidN0wsynI4CxD2P26ULZhZqVVWDrLVOxwEAAABiHiUQMEastaqsadIy5gEBI6bcV6T9rQFVN3Q6HQUAAACIeZRAwBjZeahDjR09bAUDRlC5r1CSOEsYAAAAMAyUQMAY6Z8HtJSh0MCImTouQzMKM7WqirlAAAAAwIlQAgFjpKLGr0m5Xk0bxzwgYCSV+wpVUe1XTyjsdBQAAAAgplECAWMgEumbB7S0jHlAwEgr9xWpOxjWy3UtTkcBAAAAYholEDAGdhxqV1Nnr5axFQwYcUtLx8njMswFAgAAAE5gWCWQMeZyY8x2Y8xOY8ztxznu3cYYa4xZNHIRgfhXWc08IGC0ZHtTtGBavlZSAgEAAADHdcISyBjjlnSnpCsknSHpBmPMGUMcly3pU5LWjnRIIN5V1Pg1JT9dU5kHBIyKcl+hNu9rk7+jx+koAAAAQMwazkqgxZJ2WmtrrLW9kh6WdNUQx/2XpP+WFBjBfEDci0Ss1tY2sRUMGEXls4okSat3cpYwAAAA4FiGUwJNlrRnwPW90dsOM8YskDTVWvv48b6QMeZWY8x6Y8z6hgaW7SM5bDvYrpauoJaVUQIBo+XsybnKTU/hVPEAAADAcZz2YGhjjEvSjyR97kTHWmvvttYustYuKioqOt1vDcSFihrmAQGjze0yWj6zUKuqGmStdToOAAAAEJOGUwLtkzR1wPUp0dv6ZUs6S9ILxphdkpZKeozh0ECfimq/SgoyNCkv3ekoQEIr9xWqvq1HVYc6nI4CAAAAxKThlEDrJPmMMTOMMamSrpf0WP+d1tpWa22htXa6tXa6pEpJ77DWrh+VxEAcCUes1tb6mQcEjIH+uUArd7DdGAAAABjKCUsga21I0ickPS1pq6RHrbWvG2O+ZYx5x2gHBOLZ1gNtag+E2AoGjIHJeekqK8pkLhAAAABwDJ7hHGStfULSE4Nu+/oxjr3o9GMBiaGium8eEEOhgbFR7ivSw+t2KxAMy5vidjoOAAAAEFNOezA0gGOrqPGrtDBT43O8TkcBksKKWYUKBCPaUNfsdBQAAAAg5lACAaMkFI5oXW2TlrIKCBgzS2YUKMVttLKKuUAAAADAYJRAwCh5fX+b2nuYBwSMpcw0jxaW5GvVDuYCAQAAAINRAgGjpKKmbx7Q0tJxDicBkku5r0hbDrSpob3H6SgAAABATKEEAkZJRbVfM4uzVJzNPCBgLK3w9Z0qfs1OVgMBAAAAA1ECAaMgGI5o/a4mVgEBDjhzUo7yM1KYCwQAAAAMQgkEjILX9rWqszesZaWFTkcBko7LZbTcV6RVVY2y1jodBwAAAIgZlEDAKKioZh4Q4KRyX6Ea2nu0vb7d6SgAAABAzKAEAkZBZY1fs8dnqyArzekoQFIq9/WtwuMsYQAAAMAbKIGAEdYbimj9rmZWAQEOmpibLl9xFnOBAAAAgAEogYAR9ureFnUHw1pWVuB0FCCplfuKtLa2SYFg2OkoAAAAQEygBAJGWEW1X8ZIS2ZQAgFOKp9VqN5QRC/VNjkdBQAAAIgJlEDACKus9WvOhBzlZ6Y6HQVIaktmjFOq26VVbAkDAAAAJFECASOqJxRmHhAQIzJSPVo0PV+rqhgODQAAAEiUQMCI2ri7RT2hiJaVshUMiAXlviJtO9iuQ20Bp6MAAAAAjqMEAkZQRQ3zgIBYsmJW9FTxrAYCAAAAKIGAkVRZ49cZE3OUm5HidBQAkuZOyFFhVipzgQAAAABRAgEjJhAM6+XdLWwFA2KIy2W0fGahVu9sVCRinY4DAAAAOIoSCBghL+9uVm8oomVllEBALCn3Famxo1dbD7Y5HQUAAABwFCUQMEIqa5rkMtJ5MzgzGBBLyn3MBQIAAAAkSiBgxFRW+3XW5FzleJkHBMSS4hyv5kzIZi4QAAAAkh4lEDACunvDemVPM/OAgBhV7ivUutpmdfeGnY4CAAAAOIYSCBgBG+qaFQxbLWUeEBCTyn1F6g1HtLbW73QUAAAAwDGUQMAIqKzxy+0yOm8684CAWLR4xjilelzMBQIAAEBSowQCRkBFjV9nT85VVprH6SgAhuBNcWvJjHHMBQIAAEBSowQCTlNnT0ib9rRwanggxpX7CrWjvkMHWwNORwEAAAAcQQkEnKb1dc0KRSxDoYEYV+4rkiRWAwEAACBpUQIBp6myxi+Py2hhSb7TUQAcx5wJ2SrMStNK5gIBAAAgSVECAaepotqv+VPzlMk8ICCmGWO0wleo1VUNikSs03EAAACAMUcJBJyGjp6QXtvXylYwIE6UzypUc1dQr+9vczoKAAAAMOYogYDTsG5Xk8IRy1BoIE5cMLNQkrSSuUAAAABIQpRAwGmorPYrxW20YBrzgIB4UJzt1dyJOQyHBgAAQFKiBAJOQ0WNX+dOzVd6qtvpKACGacWsQm2oa1ZnT8jpKAAAAMCYogQCTlFbIKjN+1q1lK1gQFxZ4StSMGy1ttbvdBQAAABgTFECAadoXW2TIlZaWjrO6SgATsLCknx5U1xauYNTxQMAACC5UAIBp6ii2q9Uj4t5QECc8aa4tWRGAXOBAAAAkHQogYBTVFHj14JpefKmMA8IiDflvkJVN3RqX0u301EAAACAMUMJBJyC1q6gthxo07LSQqejADgFK2YVSZJWsxoIAAAASYQSCDgFa2v9sswDAuKWrzhL43PStLKKuUAAAABIHpRAwCmoqPErzePSOdPynI4C4BQYY1TuK9KanY0KR6zTcQAAAIAxQQkEnIKKar8WTc9Xmod5QEC8KvcVqqUrqM37Wp2OAgAAAIwJSiDgJDV39mrbwXYtKy1wOgqA07B8Zt9ML84SBgAAgGRBCQScpLW1fknSUkogIK4VZKXprMk5zAUCAABA0qAEAk5SRbVf6SluzZuS53QUAKep3Fekl+ua1dETcjoKAAAAMOoogYCTVFnTpEXT85Xq4Z8PEO/KfYUKRawqq/1ORwEAAABGHa9igZPg7+jR9vp2toIBCWJhSb7SU9xayVwgAAAAJAFKIOAkVNY0SZKWlVECAYkgzePW0tJxWsVcIAAAACQBSiDgJFTUNCoz1a2zJ+c6HQXACCn3Fam2sVN7mrqcjgIAAACMKkog4CRU1jTpvBnjlOLmnw6QKFbM6j9VPKuBAAAAkNh4JQsM06H2gHYe6mAeEJBgyoqyNCnXq1XMBQIAAECCowQChunwPCBKICChGGNU7ivSmp2NCoUjTscBAAAARg0lEDBMFdV+Zad5dOakHKejABhh5bMK1RYI6dV9rU5HAQAAAEYNJRAwTGtr/Fo8Y5w8zAMCEs4FZYUyRlq1g7lAAAAASFy8mgWGob4toJrGTuYBAQkqPzNV8ybnMhcIAAAACY0SCBiGimq/JGlZGSUQkKjKfUV6ZU+L2gJBp6MAAAAAo4ISCBiGyhq/crwezZ3IPCAgUZX7ChWO2MOlLwAAAJBoKIGAYaio8WvxjAK5XcbpKABGybnT8pWZ6mZLGAAAABIWJRBwAvtbulXn72IrGJDgUj0uLSsr0KoqhkMDAAAgMQ2rBDLGXG6M2W6M2WmMuX2I+z9rjNlijHnVGPNPY0zJyEcFnHF4HhBDoYGEV+4rUp2/S4+s260Ndc060NqtcMQ6HQsAAAAYEZ4THWCMcUu6U9KlkvZKWmeMecxau2XAYa9IWmSt7TLGfEzS9yRdNxqBgbFWWeNXXkaK5kzIdjoKgFH2pjnF+s7jW/XFP712+Da3y2h8dpom5qVrYq5Xk6IfJ+ZGP+Z5VZiZJhfbRQEAABDjTlgCSVosaae1tkaSjDEPS7pK0uESyFr7/IDjKyXdOJIhASdV1Pi1ZMY4XuABSWDquAxt+Nol2tvcrQOt3drfEtCB1m4daA3oQEtAm/e16pkt9eoNRY74vFS3S+Nz0zQxN12Tcr2amBf9mJuuiXl9H/MzUmQMzyMAAABwznBKoMmS9gy4vlfSkuMcf7OkJ4e6wxhzq6RbJWnatGnDjAg4Z09Tl/Y2d+uW5TOcjgJgjGR7UzR3YsoxzwZorVVTZ68OtAa0v6WvINrf2q0DLQEdbA1ofV2zDr56QKFB28i8Ka43Vg/lpmtS3hsl0aTcdE3I9SrH66EoAgAAwKgZTgk0bMaYGyUtknThUPdba++WdLckLVq0iCELiHmVNdF5QGWFDicBECuMMSrISlNBVprOmpw75DGRiFVjR4/2twZ0oKX78McDrX0ri16sblR9W0CDxw1lprrf2HY2oCDqX000MderzLQR/dENAACAJDKc3yT3SZo64PqU6G1HMMZcIukrki601vaMTDzAWRU1fo3LTJWvOMvpKADiiMtlVJzjVXGOV+dMzRvymFA4okPtPUdsOxu4/WzbwXY1tB/94zTH63ljLtGgbWf9K4q8Ke5R/hsCAAAgHg2nBFonyWeMmaG+8ud6Se8deIAx5lxJv5R0ubX20IinBBxgrVVltV9LS5kHBGDkedwuTcpL16S8dC08xjk1e0MR1bcdve2svzDauKdFzV3Boz5vXGbqUdvO3jSnWLMZcA8AAJDUTlgCWWtDxphPSHpaklvS/dba140x35K03lr7mKTvS8qS9IfoLIPd1tp3jGJuYNTtburS/taAPsap4QE4JNXj0tRxGZo6LuOYxwSC4ejg6u4jt5+1dmtPU5fW1vrVHgjpf5+r0u9vXap5U/LG7i8AAACAmDKswQLW2ickPTHotq8PuHzJCOcCHPfGPCBKIACxy5vi1ozCTM0ozDzmMXubu3T93ZX6wP0v6dGPLpNvPCuCAAAAkpHL6QBArKqo9qswK01lRcwDAhDfpuRn6KFblsjjdunG+9ZqT1OX05EAAADgAEogYAjWWlXU9M0D4nTNABJBSUGmHrx5iQLBiN5371odags4HQkAAABjjBIIGEJtY6fq23rYCgYgocyekK1ff+g8NXb06Kb7XlJLV6/TkQAAADCGKIGAIVTWNEmSljEUGkCCOXdavu59/yLV+jv1wV+tU2dPyOlIAAAAGCOUQMAQKmr8Ks5OO+6gVQCIV+fPLNT/3nCuXtvXqlsfWK9AMOx0JAAAAIwBSiBgEGutKqr9WlZWwDwgAAnrsjMn6PvXzNOanX598vevKBSOOB0JAAAAo4wSCBikuqFTjR09bAUDkPCuXjBF33zHmXp2S72+8MdXFYlYpyMBAABgFHmcDgDEmooavyRpKSUQgCTwgfOnq607qB8+u0M56Sn6z7efwSpIAACABEUJBAxSWe3XxFyvSgoynI4CAGPiE2+aqbZAUPesqlWO16PPXjbb6UgAAAAYBZRAwADWWlXW+HXhrCLeCQeQNIwx+vKVc9XWHdLPntupnPQU3VJe6nQsAAAAjDBKIGCAqkMd8nf2amkZW8EAJBdjjL579dnq6Anp249vVbbXo+vOm+Z0LAAAAIwgSiBggIrqvnlADIUGkIzcLqMfX3eOOnpC+tKfX1O2N0VXnj3R6VgAAAAYIZwdDBigotqvyXnpmjqOeUAAklOqx6Vf3LhQC6bl61MPv6J/7WhwOhIAAABGCCUQEBWJWK2t9WsZW8EAJLn0VLfu++B58hVn66MPrNe6XU1ORwIAAMAIoAQCorbXt6u5K8ip4QFAUm56in5782JNyk3Xh3+9Tq/vb3U6EgAAAE4TJRAQdXgeECuBAECSVJiVpgduWaLsNI/ef99LqmnocDoSAAAATgMlEBBVUePXtHEZmpyX7nQUAIgZk/PS9eAtSyRJN967Vvtauh1OBAAAgFNFCQSobx7QS7VNnBUMAIZQWpSl3968WO09Id1071o1dvQ4HQkAAACngBIIkLTlQJtau4NaWjbO6SgAEJPOnJSrX33wPO1v7db773tJrd1BpyMBAADgJFECAZIqa6LzgEoLHU4CALFr0fRx+uVNi1R1qF03/3qdunvDTkcCAADASaAEAtQ3FHpGYaYm5HqdjgIAMe3CWUX66fXn6uXdzfrogxvUG4o4HQkAAADDRAmEpBeOzgPi1PAAMDxXnj1Rd1w9Tyt3NOgzj2xUOGKdjgQAAIBh8DgdAHDa6/tb1d4T0tJS5gEBwHBde95UtQWC+vbjW5WV5tEd7z5bxhinYwEAAOA4KIGQ9Cqq++cBsRIIAE7GLeWlausO6mfP7VS216OvvHUuRRAAAEAMowRC0qus8ausKFPFOcwDAoCT9ZlLZ6ktENK9q2uVm56iT77Z53QkAAAwSkLhiB5/7YDSPG695czxvPkThyiBkNRC4YjW7WrWVedMcjoKAMQlY4y+/rYz1BYI6ofP7lBOeoo+cP50p2MBAIAR9sL2Q/ruE1u1o75DkjR/ap6+cuVcLZ7BWI14QgmEpPbavlZ19IS0rIytYABwqlwuo++9e546AiH952OvKyvNo3cvnOJ0LAAAMAK2HWzTdx7fqlVVjSopyNBd71ugzt6wfvD0dl37ywq95czx+uLlc1RalOV0VAwDJRCSWkVN3zwgzgwGAKfH43bpZzecq5t/s05f+NOryvZ6dNmZE5yOBQAJpaG9R4+u36PHNu5XWXGmbikv1YJp+U7HQoI61B7Qj57ZoUfX71G2N0Vfe9sZumlpiVI9fScZf+vZE3Xf6hrd9UK1/rl1pW5cWqJ/f7NP4zJTHU6O4zHWOnNa10WLFtn169c78r2Bfu+//yUdbO3WM5+50OkoAJAQOntCet+9a7Vlf5t+9aHzdMHMQqcjAUBcs9ZqbW2THqys09OvH1QwbLWwJF9V9e1qC4S0sCRfHymfoUvPmCC3i/ksOH3dvWHds6pGv/hXtYLhiN6/bLo++aaZyssYutxpaO/RT/6xQw+v26OMFLc+fvFMfeiC6fKmuMc4OfoZYzZYaxcNeR8lEJJVMBzR/G8+o2sWTtG3rjrL6TgAkDBaunp13S8rtae5Sw/dskTn8i41AJy0tkBQf3l5nx6srFPVoQ5lez26ZuEUvW9JiWYWZ6mzJ6Q/rN+j+9bUak9Tt6aNy9CHL5iu9yyaqsw0Nnzg5EUiVn9+ZZ++//Q21bf16IqzJuiLl8/R9MLMYX1+VX277nhym/657ZAm56XrP94yW++YP0kuyskxRwkEDGFDXZPefVeF7nrfAl1x9kSn4wBAQjnUFtB7flmhlq6gHv3oMs2ekO10JACIC5v3teqhtXX66yv71R0Ma96UXN24pERvnz9J6alHr6wIR6yeef2g7llVo5d3tyjH69H7lpboA8uma0IuZ7/F8Ly4s1Hffnyrthxo0/ypefrqW+fqvOmnNvD5xepGffeJrdq8r01nT87VV946l/EbY4wSCBjCnc/v1Pef3q6Xv3Yp+1YBYBTsaerSNb94UREr/fG2ZSopGN47iQCQbALBsP7v1QN6sLJOG/e0yJvi0jvmT9KNS0s0b0resL/Ohrpm3be6Rk9tPii3y+jt8ybplvJSnTEpZ/TCI67tPNSh//fE1sOrd75w+Wy9fd7pr96JRKz+tmmfvv/Udu1vDeiSueN1+xVzNLOY4dFjgRIIGMKN965VY0ePnvr0CqejAEDCqqpv17W/rFBmmkd/vO183pUGgAFqGzv1UGWd/vjyXrV0BVValKkbl5To3QumKDcj5ZS/7m5/l+5fU6tH1+9RV29YF8ws0C3LS3XhrCK25kCS5O/o0U/+UaXfvbR7VOf4BIJh3b+mVj9/vlrdwbDeu3iaPnWJT4VZaSP6fXAkSiBgkJ5QWPO/+YyuP2+avvGOM52OAwAJ7dW9LXrvPWs1MderRz66jNWXAJJaKBzRP7bW68HK3Vq9s1Eel9Fbzpyg9y2dpmWlBTJm5Eqa1u6gfv/Sbv16zS4dbAtoZnGWblk+Q+88dzJDe5NUIBjWr9bs0s+f36muaCnz6Ut8KhjlUqaxo0c/+2eVHlq7W+kpbn3sojLdvHwGj8NRQgkEDPJSbZOu/WWFfnnTQr2FUxgDwKirrPHrA/e/pNkTsvXQLUuU7T31d7gBIB4dbA3o4XW79fuXdqu+rUcTc726YfE0XX/eVBXnjO4qyd5QRI+/tl/3rKzVlgNtKshM1U3LSnTT0pJRf/GP2GCt1WOb9ut7T23XvpZuXTK3OLo9a2xn9lU3dOiOJ7fp2S31mpjr1ecvm613nTuZFWojjBIIGORn/6zSj/+xQ6987dJjnuoQADCynttWr1t/u0ELS/L1mw8v5t0/AAkvErF6sdqvByvr9OzWeoUjVitmFenGJdP0pjnF8rhdY5rHWquKar/uWVWj57c3KM3j0tULpujm5TOY1ZLA1u1q0rcf36pNe1p0xsQcffWtc3X+zEJHM62t8es7T2zVq3tbdeakHH3lSuczJRJKIGCQG+6uVGt3UE98qtzpKACQVP62cZ8+/chGvWl2sX5x00KljPELIAAYCy1dvfrjhr16aO1u1TZ2Kj8jRdcumqr3LpkWM0Pydx5q132ra/Wnl/epNxTRm+YU65byGSO+JQ3O2dXYqTue3KanXj+oCTleff4ts3V1DK26iUSs/v7qG6uT3jSnWF+6Yo584zmj6OmiBAIGCATDmvfNZ3TT0hJ97W1nOB0HAJLOg5V1+upfN+uqcybpx9eeEzO/jALA6bDWauOeFj1YuVv/9+p+9YQiWliSrxuXTtMVZ02M2dWPjR09eqCiTg9U1qmps1dnTsrRR8pL9dZ5Eynq41RLV69+9s+deqByl1LcLt12YZk+Ul6q9NTYfAwGgmH95sVd+t/nd6qzJ6TrF0/TZy6ZpaJstiqeKkogYIDKGr+uv7tS975/kS45Y7zTcQAgKf38hZ363lPbdePSafqvq87iXWcAcaurN6S/bdyvByvr9Pr+NmWmuvXOcyfrfUtK4urU7IFgWH95ZZ/uXVWj6oZOTcjx6oMXTNcNi6cpN505bvGgNxTRbyt26X+e26n2QFDXLpqqz146a9RnTo2Ups5e/eyfVXqwsk5pnr7y6pYYLq9iGSUQMMCPn92h/3muSq98/TJ+oAGAg+54cpt+8a9qffyiMn3h8jlOxwGAk1JV366H1u7WnzbsVXtPSHMmZOt9S0v0znMmxfXw+0jE6oUdh3TPylpV1PiVmerWtedN1YcvmKGp4zKcjochWGv11OaDuuOpbarzd6ncV6gvXzlXcyfGTwk5UG1jp7731DY9ufmgxuek6fOXzdbVC6bIzcrhYaMEAga49pcV6u4N6++fXO50FABIatZafeWvm/W7tbt1+xVzdNuFZU5HAoDj6g1F9PTrB/VgZZ3W1jYp1e3SFWdP0E1LS7SwJD/hVjVu3teq+1bX6u+b9itirS4/a4JuKS/Vgmn5TkdD1MY9LfrO41u0blezZo3P0pevnKuLZhc7HWtErI8OtN64p0VzJmTrK2+dq3JfkdOx4gIlEBAVCIY17xvP6IMXTNeXr5zrdBwASHrhiNWnH9mov2/ar+++62y9d8k0pyMBwFH2Nnfp9y/t1iPr9qqxo0dTx6XrvYtLdO2iKUlxivUDrd369Yu79Lu1u9UeCGlhSb4+Uj5Dl54xgdUZDtnb3KXvPbVdj23ar8KsVH320tm6dtGUMT/j3Giz1urx1w7ov5/apj1N3bpwVpG+fOVczZ7A8OjjoQQCol7c2aj33rtWv/rgebp4TmI05AAQ74LhiD76wAY9v/2Qfnr9uXrH/ElORwIAhSNWK3c06MHKOj2//ZAk6U1zivW+pSW60FeUlEPtO3tCenT9Ht2/plZ7mro1bVyGPnzBdL1n0VRlpnmcjpcU2gJB/fz5at2/plZG0kfKS3XbRWXKSvD//j2hsB6oqNPP/lmljp5Q3M07GmuUQEDUD5/Zrp+/UK2NX780rvdqA0CiCQTDev/9L+nlumbd8/5FFPUAHNPY0aNH1+/R79bu1t7mbhVmpen686bqhiXTNDkv3el4MSEcsXr69YO6Z1WNXtndohyvR+9bWqIPLJuuCbm8KB8NwXBED7+0Wz/+R5WaOnt19bmT9fm3zNakJHtMtnT16n+f26nfVOySx+XSRy8s1UfKSykhB6EEAqKuuetFBSNWf/u3C5yOAgAYpD0Q1HvvWasd9e367YcXa0lpgdORACQJa63W1zXrwco6PfnaQfWGI1paOk43Li3RZWdMUKonsbbYjKQNdc26d1WNnn79oNwuo7fPm6Rbykvj6sxoscxaq+e2HdJ3n9iq6oZOLZkxTl996xk6e0qu09EcVefv1Pee3q7HXz2gouw0fe7SWXrPoqlsT4yiBALUd/rO+d98RjcvL9XtV3AWGgCIRU2dvbr2lxU62BrQ7z+yNOl/yQUwutoDQf31lX16sHK3tte3KzvNo3cvnKL3LZkm33hmjpyM3f4u3b+mVo+u36Ou3rAumFmgW5aX6sJZybl1biRs3teq7z6xVS9W+1VamKnbr5ijS88Yn3ADyE/HhrpmffeJrdpQ16zZ47P1pSvnJMxg7NNBCQRIWlXVoJvue0m/+fBiXTiLqfIAEKsOtHbrmrsq1B0M69GPLtXMYl6IARhZW/a36cG1dfrbK/vU2RvWWZNzdOOSEr3jnEnKSGVbyelo7Qrqdy/t1q9frFV9W49mFmfpluUz9M5zJ8ub4nY6Xlw42BrQ95/erj+/sld56Sn69CWz9N4l05SSYEOfR4q1Vk9tPqg7ntqmOn+Xyn2F+tIVc5N6NRolECDpe09t090ra7TpPy9jzygAxLhdjZ265hcV8riM/nDbMk0dl+F0JABxLhAM64nXDujByjq9vLtFaR6X3j5/km5cWqL5U3JZXTHCekMR/d+r+3XPqlptPdCmwqxU3bR0um5cOi0pzqh2Kjp7Qvrlv6p196oaRSLShy6Yro9fPFO56cwyHY7eUEQPVtbpZ89VqbU7qGsWTNHnLpudlHOqKIEASe/6+RoZSX/+OPOAACAebDvYput+Wan8jBQ9etsyFWcn3y9x8aI3FNGh9oDq2wI62Nqjg20BHWzt1sG2HtW3BtQTCmt8jlcTc70anxv9mOPVxNx0TcjxKj2V1QEYPXX+Tv1u7W49un6PmruCKi3M1HuXTNM1C6coLyPV6XgJz1qrimq/7llVo+e3NyjN49LVC6bo5uUzNLM4y+l4MSEcsfrD+j364bM71NDeo7fNm6gvXj6HN0BOUWtXUHe+sFO/XrNLLpd0a3mpbr0w8c+gNhAlEJJKV29I9W09qm/r+2X0UPTyr17cpdsuLNV/vIV5QAAQL17e3awb712raeMy9Mity5SbwbuhY8laq/aekOpbAzrQGtDBtoDq+z+2BaJlT0CNHb1HfW6ax6UJ0bInzePSobYeHWjtVlsgdNSxuekpmpjr1YRcrybk9H0cXBTlpHtYqZEArLXqCUUUCIYVCEY/hgZcjt7eEwofeUwwEj0uev8xPi8QCqtn4G2hiMIRK7fL6LIzxuvGpSU6v6yAx5JDqurbdd/qWv35lX3qDUX05jnFurl8hpaVJu//k5U7GvTdJ7Zq28F2LZiWp6++7QwtmJbvdKyEsKepS99/erse27RfhVlp+sylPl23aKo8SbCtjhIICaEnFNahth4dau97l7G+LaD69jdKnv7Cp73n6F8uvSkuTc5L1/++d4HmTkzevaEAEI9WVzXqw79epzMn5+jBm5ewpXeEhCNWDe09h4uc/lKnv/Dpv97VGz7qc/MzUjQ+58jSZkJO3yqfCTl9f/IyUoZ8UdfVG9LB1r7v2V8sHRzwPQ+0BtTY0XPU56WnuAcUQ9HvGf1+E3PTNT43TYWZaQygPQWRiFVHb0gdgZC6ekNHFi9DlC1vlDgDjxlw/6DCZuDn9YQip5wzxW3k9biVluKWN8Ulb/9Hj/vw5bQUd/T6G/fnZ6TqbfMmJeWWkFjV2NGjByrq9EBlnZo6e3XW5BzdsrxUb503MWnm3uyob9d3Ht+qf+1o0NRx6br98rm68uwJSVuGjaaNe1r03ce36qVdTZpZnKUvXzlHF88uTuj/1pRAiGmhcESNHb2H31U81BZ4YyVPe0/0ekDNXcGjPjfFbVSc7dX4nDSNz/EO+JN2+GNxjlfZabx7CADx7KnNB/Xxhzbo/LJC3ffBRUrzsH3oeA4XLW1vFCv9K3j6t2g1dPQoHDny90CPyxxR7vRd7vuZ2l+2FOekjfpw1/7tZQcHlUT9l/tLq9Dx8h8uiI4sq4qzvQl1uu9gOKL2QF+B0xYIqj0QUnv0Y0fPG5fbBl1vDwTVEQj1Hdcb0qm8JDhctAwoXfpKmAEFzVD3DypuBpY5RxY8A7+Wm1M/J6BAMKw/v7xP966uUU1Dp1LdLuWke5TjTVF2eopyvH2Xc9I9yvZGr6enKPvw7Udezkx1x/zv/A3tPfrRszv0yLrdykrz6JNv8un955fwc22UWWv1zJZ63fHkNtU2dur8sgJ9+cq5OmtyYp6FlBIIjohErPydvX3FTvuAYqctWuxEb2vs6DnqFw+XkYqy044sdbL7LhcPKHzyj/EuIwAg8fxxw159/g+b9JYzx+vO9y5IiuXcg0UiVk1dvYeLkMPbsgYWJG0BtQ+x5Srb6zlchPSXOgPLkfE5XhVkpsbNSppIxKqxs+eI/xb9ZdeBw9e7FQgeufLEGKkgM+3oVUWDVhiN9hmirLUKBCN9pUxP6Mjy5ohCJ1rYDDqmPVroDP77DSXV41KOt+9FdFaaR9ne/j991/vvy/Z6lJ7qHrKAGVjopKW4lOZx8TsYRkwkYvXCjkNaW9vUV1p2B9UWfbwPvHyix7vLqK8sSvcoOy3ljUJpiCIpZ4giKdvrGbWfLd29Yd23ukZ3vVCtnlBENy4t0afe7FN+JnOpxlIwHNHv1u7WT/9ZpeauXr3r3Mn6/GWzNSkv3eloI4oSCCPKWqvW7uCRc3fa37jcX/Icau856h06SSrMSj1i9U7xoJJnfE6aCrLSeLcHAHCUX62p1Tf/vkXXLJyi7717XtwUFtZahSNWociRH8OHr/fNLQmGrZo6e4+YvTOw4DnUHlAwfOTP1v43TvpX7vQPX+7fltV/ORm30Vlr1dYdOlwIDV5Z1L9KqrX76NXGOV5PdJuZVxNz3hho3V8YFWWnqTcUGbKYObrQGXp1zlC/Jw2WmeruK2sGFDfZXo+y0wZdH6LQ6f8cVhggUfSEwofL0b5yKHiMy/0FUuiI24caGzFYRqr7uKuP+gul/tKor1B647jBBWkkYvXXjfv0/ae360BrQG85c7y+ePkclRYxFNtJbYGg7nqhWvetrpWRdEv5DN12YZmyvYkxe5ASCCdkrVVXb1it0SfQps7eAbN2eqKzd/rfcexR7xD7uXPTU94odrKP3pI1Pseroqy0hFqCDQAYez/9R5V+/I8des/CKVo8Y5widkC5En6jZInY/uuRIcuXvsuRIQqZI+8/6vbo9wjbAQVOeMD3jNjD1/vvH8Zr/SENnIPzxgqetOhqlb6ByYVZqUm5KmokdfeGT1gUDbVy+Xj6VyT0r7zJGVTMDCxvBhc6fWVOX/HDm2LAyAlHrDp6jl8atQf67mvrDqm95+gi6UTlbarbNaAc8qi9J6Sahk6dPTlXX33rXC0pLRijvy2GY29zl374zA795ZV9KshM1aO3LVNZAhR0lEBJIhiOHH4Sa+3uWzrZX+r0XQ8dvt52xP3Hf0LLSHVrwqBtWMXRrVoTcr0an+0dk/kAAABIfW9cfPeJrbpnVe2wPyfFbeR2GXlcLrmM5HG7otf7bu//03fddYzbjzze4zrB13Abucygz3X3fTx8u9t11NfOz0g9XPjkeJlpFyuC4YgOtffoYGu3Drb2qKE9oLQU9xCrc/ouZ8TBbBIAJ8daq+5g+IjVR20nWH3UG4ro2vOm6Kr5k+Nm9Woyem1vq3730m59+51nJUT5TgkUJ6y16uwNv1HODChpBpc6bYNKndbu4JBn7xgoxW2Um55yeMli/+Xc6HLGN66nKC89ReOjv4BmJeHycQBA7Nvf0n341M+egcXMoKKFX7oBAEAyOV4JxKv7Eda/GudY5U3/ipy2I66/cfzgs3QMNnD6fW66RyUFGUeUNzlej3IzBpc8fde9KQzwAwAkjkQb4ggAADDahlUCGWMul/RTSW5J91pr7xh0f5qk30paKMkv6Tpr7a6RjRqbbri7Uk2dvYdLnhOtxuk77WF09U16isZlpmp6QWa0sPEcLmwGFzi56ewLBwAAAAAAp+6EJZAxxi3pTkmXStoraZ0x5jFr7ZYBh90sqdlaO9MYc72k/5Z03WgEjjVZXs+xy5shbmduDgAAAAAAcMJwVgItlrTTWlsjScaYhyVdJWlgCXSVpG9EL/9R0v8aY4x1auDQGLrn/UNuswMAAAAAAIgpwzmf6GRJewZc3xu9bchjrLUhSa2Sjjr3nTHmVmPMemPM+oaGhlNLDAAAAAAAgJM2nBJoxFhr77bWLrLWLioqKhrLbw0AAAAAAJDUhlMC7ZM0dcD1KdHbhjzGGOORlKu+AdEAAAAAAACIAcMpgdZJ8hljZhhjUiVdL+mxQcc8JukD0cvXSHouGeYBAQAAAAAAxIsTDoa21oaMMZ+Q9LT6ThF/v7X2dWPMtyStt9Y+Juk+SQ8YY3ZKalJfUQQAAAAAAIAYMZyzg8la+4SkJwbd9vUBlwOS3jOy0QAAAAAAADBSxnQwNAAAAAAAAJxBCQQAAAAAAJAEKIEAAAAAAACSACUQAAAAAABAEqAEAgAAAAAASAKUQAAAAAAAAEmAEggAAAAAACAJGGutM9/YmAZJdY5885FXKKnR6RCIKTwmMBQeFxiMxwSGwuMCg/GYwFB4XGAwHhPoV2KtLRrqDsdKoERijFlvrV3kdA7EDh4TGAqPCwzGYwJD4XGBwXhMYCg8LjAYjwkMB9vBAAAAAAAAkgAlEAAAAAAAQBKgBBoZdzsdADGHxwSGwuMCg/GYwFB4XGAwHhMYCo8LDMZjAifETCAAAAAAAIAkwEogAAAAAACAJEAJdBKMMZcbY7YbY3YaY24f4v40Y8wj0fvXGmOmOxATY8QYM9UY87wxZosx5nVjzKeGOOYiY0yrMWZj9M/XnciKsWWM2WWMeS36/3z9EPcbY8zPos8VrxpjFjiRE2PDGDN7wHPARmNMmzHm04OO4bkiCRhj7jfGHDLGbB5w2zhjzLPGmKrox/xjfO4HosdUGWM+MHapMZqO8Zj4vjFmW/Tnw1+MMXnH+Nzj/qxB/DrG4+Ibxph9A35OXHmMzz3u6xXEp2M8Jh4Z8HjYZYzZeIzP5bkCR2A72DAZY9ySdki6VNJeSesk3WCt3TLgmI9Lmmetvc0Yc72kd1lrr3MkMEadMWaipInW2peNMdmSNkh656DHxEWSPm+tfZszKeEEY8wuSYustY3HuP9KSZ+UdKWkJZJ+aq1dMnYJ4ZToz5J9kpZYa+sG3H6ReK5IeMaYFZI6JP3WWntW9LbvSWqy1t4RfcGWb6394qDPGydpvaRFkqz6ft4stNY2j+lfACPuGI+JyyQ9Z60NGWP+W5IGPyaix+3ScX7WIH4d43HxDUkd1tofHOfzTvh6BfFpqMfEoPt/KKnVWvutIe7bJZ4rMAArgYZvsaSd1toaa22vpIclXTXomKsk/SZ6+Y+S3myMMWOYEWPIWnvAWvty9HK7pK2SJjubCnHiKvX9ELfW2kpJedFSEYnvzZKqBxZASB7W2pWSmgbdPPB3h99IeucQn/oWSc9aa5uixc+zki4frZwYO0M9Jqy1z1hrQ9GrlZKmjHkwOOoYzxXDMZzXK4hDx3tMRF9vXivp92MaCnGLEmj4JkvaM+D6Xh39gv/wMdEf3q2SCsYkHRwV3fp3rqS1Q9y9zBizyRjzpDHmzLFNBodYSc8YYzYYY24d4v7hPJ8gMV2vY/+SxnNFchpvrT0QvXxQ0vghjuE5I3l9WNKTx7jvRD9rkHg+Ed0meP8xto7yXJGcyiXVW2urjnE/zxU4AiUQcJqMMVmS/iTp09batkF3vyypxFo7X9L/SPrrGMeDM5ZbaxdIukLSv0WX8CLJGWNSJb1D0h+GuJvnCsj27dFnnz4kScaYr0gKSXroGIfwsya53CWpTNI5kg5I+qGjaRBLbtDxVwHxXIEjUAIN3z5JUwdcnxK9bchjjDEeSbmS/GOSDo4wxqSorwB6yFr758H3W2vbrLUd0ctPSEoxxhSOcUyMMWvtvujHQ5L+or7l2QMN5/kEiecKSS9ba+sH38FzRVKr798OGv14aIhjeM5IMsaYD0p6m6T32WMM8BzGzxokEGttvbU2bK2NSLpHQ///5rkiyURfc14t6ZFjHcNzBQajBBq+dZJ8xpgZ0Xdzr5f02KBjHpPUf8aOa9Q31I939BJUdP/tfZK2Wmt/dIxjJvTPhTLGLFbfvzmKwQRmjMmMDgqXMSZT0mWSNg867DFJ7zd9lqpvkN8BIdEd8506niuS2sDfHT4g6W9DHPO0pMuMMfnRLSCXRW9DAjLGXC7pC5LeYa3tOsYxw/lZgwQyaHbguzT0/+/hvF5BYrlE0jZr7d6h7uS5AkPxOB0gXkTP0PAJ9f3S5ZZ0v7X2dWPMtyStt9Y+pr5C4AFjzE71De663rnEGAMXSLpJ0msDTsn4ZUnTJMla+wv1lYEfM8aEJHVLup5iMOGNl/SX6Ot5j6TfWWufMsbcJh1+XDyhvjOD7ZTUJelDDmXFGIn+4nWppI8OuG3gY4LniiRgjPm9pIskFRpj9kr6T0l3SHrUGHOzpDr1DfeUMWaRpNustbdYa5uMMf+lvhd4kvQta+2pDI1FjDnGY+JLktIkPRv9WVIZPfPsJEn3Wmuv1DF+1jjwV8AoOMbj4iJjzDnq2zK6S9GfJwMfF8d6vTL2fwOMtKEeE9ba+zTErEGeK3AinCIeAAAAAAAgCbAdDAAAAAAAIAlQAgEAAAAAACQBSiAAAAAAAIAkQAkEAAAAAACQBCiBAAAAAAAAkgAlEAAAAAAAQBKgBAIAAAAAAEgClEAAAAAAAABJ4P8DCGW142XLsFkAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "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", " 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", " voiced_confidences.append(vad_outs[:,1])\n", "\n", "# Please note the different x axes scales of the plots\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 }