{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Speaker Vector HuggingFace" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "This tutorial is available as an IPython notebook at [malaya-speech/example/speaker-vector-huggingface](https://github.com/huseinzol05/malaya-speech/tree/master/example/speaker-vector-huggingface).\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.pyaudio_vad.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 HuggingFace 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", "
Size (MB)Embedding SizeEER
microsoft/wavlm-base-sv405.0512.00.078274
microsoft/wavlm-base-plus-sv405.0512.00.066884
microsoft/unispeech-sat-large-sv1290.0512.00.203277
microsoft/unispeech-sat-base-sv404.0512.00.078282
microsoft/unispeech-sat-base-plus-sv404.0512.00.076128
\n", "
" ], "text/plain": [ " Size (MB) Embedding Size EER\n", "microsoft/wavlm-base-sv 405.0 512.0 0.078274\n", "microsoft/wavlm-base-plus-sv 405.0 512.0 0.066884\n", "microsoft/unispeech-sat-large-sv 1290.0 512.0 0.203277\n", "microsoft/unispeech-sat-base-sv 404.0 512.0 0.078282\n", "microsoft/unispeech-sat-base-plus-sv 404.0 512.0 0.076128" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "malaya_speech.speaker_vector.available_huggingface()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Smaller EER the better model is**." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Load HuggingFace model\n", "\n", "```python\n", "def huggingface(\n", " model: str = 'microsoft/wavlm-base-plus-sv',\n", " force_check: bool = True,\n", " **kwargs,\n", "):\n", " \"\"\"\n", " Load Finetuned models from HuggingFace.\n", "\n", " Parameters\n", " ----------\n", " model : str, optional (default='microsoft/wavlm-base-plus-sv')\n", " Check available models at `malaya_speech.speaker_vector.available_huggingface()`.\n", " force_check: bool, optional (default=True)\n", " Force check model one of malaya model.\n", " Set to False if you have your own huggingface model.\n", "\n", " Returns\n", " -------\n", " result : malaya_speech.torch_model.huggingface.XVector class\n", " \"\"\"\n", "```" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "scrolled": true }, "outputs": [], "source": [ "model = malaya_speech.speaker_vector.huggingface()" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "scrolled": true }, "outputs": [], "source": [ "from glob import glob\n", "\n", "speakers = [\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", "]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Pipeline" ] }, { "cell_type": "code", "execution_count": 7, "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": 8, "metadata": { "scrolled": true }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/husein/.local/lib/python3.8/site-packages/networkx/readwrite/graphml.py:346: DeprecationWarning: `np.int` is a deprecated alias for the builtin `int`. To silence this warning, use `int` by itself. Doing this will not modify any behavior and is safe. When replacing `np.int`, you may wish to use e.g. `np.int64` or `np.int32` to specify the precision. If you wish to review your current use, check the release note link for additional information.\n", "Deprecated in NumPy 1.20; for more details and guidance: https://numpy.org/devdocs/release/1.20.0-notes.html#deprecations\n", " (np.int, \"int\"), (np.int8, \"int\"),\n", "/home/husein/.local/lib/python3.8/site-packages/networkx/readwrite/gexf.py:220: DeprecationWarning: `np.int` is a deprecated alias for the builtin `int`. To silence this warning, use `int` by itself. Doing this will not modify any behavior and is safe. When replacing `np.int`, you may wish to use e.g. `np.int64` or `np.int32` to specify the precision. If you wish to review your current use, check the release note link for additional information.\n", "Deprecated in NumPy 1.20; for more details and guidance: https://numpy.org/devdocs/release/1.20.0-notes.html#deprecations\n", " (np.int, \"int\"), (np.int8, \"int\"),\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p.visualize()" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "scrolled": true }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/husein/.local/lib/python3.8/site-packages/transformers/models/wavlm/modeling_wavlm.py:1755: UserWarning: __floordiv__ is deprecated, and its behavior will change in a future version of pytorch. It currently rounds toward 0 (like the 'trunc' function NOT 'floor'). This results in incorrect rounding for negative values. To keep the current behavior, use torch.div(a, b, rounding_mode='trunc'), or for actual floor division, use torch.div(a, b, rounding_mode='floor').\n", " return (input_length - kernel_size) // stride + 1\n" ] } ], "source": [ "r = p(speakers)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Calculate similarity" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "from sklearn.metrics.pairwise import cosine_similarity" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[1.0000001 , 0.4988824 , 0.36581534, 0.92033345],\n", " [0.4988824 , 1.0000001 , 0.6961168 , 0.48723692],\n", " [0.36581534, 0.6961168 , 1.0000002 , 0.38700205],\n", " [0.92033345, 0.48723692, 0.38700205, 1.0000001 ]], dtype=float32)" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cosine_similarity(r['speaker-vector-huggingface'])" ] }, { "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 }