{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Speaker Vector" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "This tutorial is available as an IPython notebook at [malaya-speech/example/speaker-vector](https://github.com/huseinzol05/malaya-speech/tree/master/example/speaker-vector).\n", " \n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "This module is language independent, so it save to use on different languages. Pretrained models trained on multilanguages.\n", " \n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "This is an application of malaya-speech Pipeline, read more about malaya-speech Pipeline at [malaya-speech/example/pipeline](https://github.com/huseinzol05/malaya-speech/tree/master/example/pipeline).\n", " \n", "
" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import os\n", "\n", "os.environ['CUDA_VISIBLE_DEVICES'] = ''" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "`pyaudio` is not available, `malaya_speech.streaming.stream` is not able to use.\n" ] } ], "source": [ "from malaya_speech import Pipeline\n", "import malaya_speech\n", "import numpy as np" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "import logging\n", "\n", "logging.basicConfig(level=logging.INFO)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### List available deep model" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "INFO:malaya_speech.speaker_vector:tested on VoxCeleb2 test set. Lower EER is better.\n", "INFO:malaya_speech.speaker_vector:download the test set at https://github.com/huseinzol05/malaya-speech/tree/master/data/voxceleb\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Size (MB)Quantized Size (MB)Embedding SizeEER
deep-speaker96.724.40512.00.21870
vggvox-v170.817.701024.00.13944
vggvox-v243.27.92512.00.04460
conformer-base99.427.20512.00.06938
conformer-tiny20.36.21512.00.08687
\n", "
" ], "text/plain": [ " Size (MB) Quantized Size (MB) Embedding Size EER\n", "deep-speaker 96.7 24.40 512.0 0.21870\n", "vggvox-v1 70.8 17.70 1024.0 0.13944\n", "vggvox-v2 43.2 7.92 512.0 0.04460\n", "conformer-base 99.4 27.20 512.0 0.06938\n", "conformer-tiny 20.3 6.21 512.0 0.08687" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "malaya_speech.speaker_vector.available_model()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Smaller EER the better model is**." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Load deep model\n", "\n", "```python\n", "def deep_model(model: str = 'vggvox-v2', quantized: bool = False, **kwargs):\n", " \"\"\"\n", " Load Speaker2Vec model.\n", "\n", " Parameters\n", " ----------\n", " model : str, optional (default='speakernet')\n", " Check available models at `malaya_speech.speaker_vector.available_model()`.\n", " quantized : bool, optional (default=False)\n", " if True, will load 8-bit quantized model.\n", " Quantized model not necessary faster, totally depends on the machine.\n", "\n", " Returns\n", " -------\n", " result : malaya_speech.supervised.classification.load function\n", " \"\"\"\n", "```" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "scrolled": true }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "2023-01-27 23:13:07.304958: I tensorflow/core/platform/cpu_feature_guard.cc:142] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations: AVX2 FMA\n", "To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.\n", "2023-01-27 23:13:07.314286: E tensorflow/stream_executor/cuda/cuda_driver.cc:271] failed call to cuInit: CUDA_ERROR_NO_DEVICE: no CUDA-capable device is detected\n", "2023-01-27 23:13:07.314317: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:169] retrieving CUDA diagnostic information for host: husein-MS-7D31\n", "2023-01-27 23:13:07.314322: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:176] hostname: husein-MS-7D31\n", "2023-01-27 23:13:07.314421: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:200] libcuda reported version is: Not found: was unable to find libcuda.so DSO loaded into this program\n", "2023-01-27 23:13:07.314615: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:204] kernel reported version is: 470.161.3\n" ] } ], "source": [ "model = malaya_speech.speaker_vector.deep_model('conformer-base')" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "scrolled": true }, "outputs": [], "source": [ "from glob import glob\n", "\n", "speakers = ['speech/example-speaker/khalil-nooh.wav',\n", "'speech/example-speaker/mas-aisyah.wav',\n", "'speech/example-speaker/shafiqah-idayu.wav',\n", "'speech/example-speaker/husein-zolkepli.wav'\n", " ]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Pipeline" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "def load_wav(file):\n", " return malaya_speech.load(file)[0]\n", "\n", "p = Pipeline()\n", "frame = p.foreach_map(load_wav).map(model)" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p.visualize()" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "r = p(speakers)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Calculate similarity" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 1. , -0.40519101, -0.35340283, 0.41143028],\n", " [-0.40519101, 1. , 0.49214888, -0.43672686],\n", " [-0.35340283, 0.49214888, 1. , -0.27411077],\n", " [ 0.41143028, -0.43672686, -0.27411077, 1. ]])" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from scipy.spatial.distance import cdist\n", "\n", "1 - cdist(r['speaker-vector'], r['speaker-vector'], metric = 'cosine')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Remember, our files are,\n", "\n", "```python\n", "['speech/example-speaker/khalil-nooh.wav',\n", " 'speech/example-speaker/mas-aisyah.wav',\n", " 'speech/example-speaker/shafiqah-idayu.wav',\n", " 'speech/example-speaker/husein-zolkepli.wav']\n", "```" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.10" }, "varInspector": { "cols": { "lenName": 16, "lenType": 16, "lenVar": 40 }, "kernels_config": { "python": { "delete_cmd_postfix": "", "delete_cmd_prefix": "del ", "library": "var_list.py", "varRefreshCmd": "print(var_dic_list())" }, "r": { "delete_cmd_postfix": ") ", "delete_cmd_prefix": "rm(", "library": "var_list.r", "varRefreshCmd": "cat(var_dic_list()) " } }, "types_to_exclude": [ "module", "function", "builtin_function_or_method", "instance", "_Feature" ], "window_display": false } }, "nbformat": 4, "nbformat_minor": 4 }