{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Realtime ASR Mixed\n", "\n", "Let say you want to transcribe realtime recording / input, malaya-speech able to do that, plus able to understand local english and malay!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "This tutorial is available as an IPython notebook at [malaya-speech/example/realtime-asr-mixed](https://github.com/huseinzol05/malaya-speech/tree/master/example/realtime-asr-mixed).\n", " \n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "This module is not language independent, so it not save to use on different languages. Pretrained models trained on hyperlocal languages.\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 malaya_speech\n", "from malaya_speech import Pipeline" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Load VAD model\n", "\n", "We are going to use WebRTC VAD model, read more about VAD at https://malaya-speech.readthedocs.io/en/latest/load-vad.html" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "scrolled": true }, "outputs": [], "source": [ "vad_model = malaya_speech.vad.webrtc()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Recording interface\n", "\n", "So, to start recording audio including realtime VAD and Classification, we need to use `malaya_speech.streaming.record`. We use `pyaudio` library as the backend.\n", "\n", "```python\n", "def record(\n", " vad,\n", " asr_model = None,\n", " classification_model = None,\n", " device = None,\n", " input_rate: int = 16000,\n", " sample_rate: int = 16000,\n", " blocks_per_second: int = 50,\n", " padding_ms: int = 300,\n", " ratio: float = 0.75,\n", " min_length: float = 0.1,\n", " filename: str = None,\n", " spinner: bool = False,\n", "):\n", " \"\"\"\n", " Record an audio using pyaudio library. This record interface required a VAD model.\n", "\n", " Parameters\n", " ----------\n", " vad: object\n", " vad model / pipeline.\n", " asr_model: object\n", " ASR model / pipeline, will transcribe each subsamples realtime.\n", " classification_model: object\n", " classification pipeline, will classify each subsamples realtime.\n", " device: None\n", " `device` parameter for pyaudio, check available devices from `sounddevice.query_devices()`.\n", " input_rate: int, optional (default = 16000)\n", " sample rate from input device, this will auto resampling.\n", " sample_rate: int, optional (default = 16000)\n", " output sample rate.\n", " blocks_per_second: int, optional (default = 50)\n", " size of frame returned from pyaudio, frame size = sample rate / (blocks_per_second / 2).\n", " 50 is good for WebRTC, 30 or less is good for Malaya Speech VAD.\n", " padding_ms: int, optional (default = 300)\n", " size of queue to store frames, size = padding_ms // (1000 * blocks_per_second // sample_rate)\n", " ratio: float, optional (default = 0.75)\n", " if 75% of the queue is positive, assumed it is a voice activity.\n", " min_length: float, optional (default=0.1)\n", " minimum length (s) to accept a subsample.\n", " filename: str, optional (default=None)\n", " if None, will auto generate name based on timestamp.\n", " spinner: bool, optional (default=False)\n", " if True, will use spinner object from halo library.\n", "\n", "\n", " Returns\n", " -------\n", " result : [filename, samples]\n", " \"\"\"\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**pyaudio will returned int16 bytes, so we need to change to numpy array, normalize it to -1 and +1 floating point**." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Check available devices" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "> 0 External Microphone, Core Audio (1 in, 0 out)\n", "< 1 External Headphones, Core Audio (0 in, 2 out)\n", " 2 MacBook Pro Microphone, Core Audio (1 in, 0 out)\n", " 3 MacBook Pro Speakers, Core Audio (0 in, 2 out)\n", " 4 JustStream Audio Driver, Core Audio (2 in, 2 out)" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import sounddevice\n", "\n", "sounddevice.query_devices()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "By default it will use `0` index." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Load ASR model" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "model = malaya_speech.stt.deep_transducer(model = 'conformer-mixed')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### ASR Pipeline\n", "\n", "Because pyaudio will returned int16 bytes, so we need to change to numpy array then normalize to float, feel free to add speech enhancement or any function, but in this example, I just keep it simple." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "image/png": "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fX09ysrKcOXKFfj4+GD16tXIyMjglqUBN75Ivr6+SExMHPR70DPH1t3dzbVdu3YNarUajDE89NBDCAgIwJ49e7hgra2txfHjx1FdXY28vDwoFIrbvh8972Fzc7NB//21D/b9BYD169dDJpPh2rVrBstDRxrGGLZs2YK5c+eO6DqHFL8rQ4wnIyODiUQi9q9//YvvUvo4fetwDzMAACAASURBVPo0tznD6tWrWVlZGUtLS2NhYWEMAFu0aBErKChgp0+fZlFRUQwAe/TRR1lJSQljjLG1a9cysVjMfHx82GeffcaSkpKYVCplMTExrLm5ma1fv56JRCK2YcMGtmnTJrZ8+XIWFxfHWltbuRp+/vlnJhAImEQiYQqFYsBa09LSmFgsZnK5nH300UeMMcY6OzvZc889x4KDg9muXbvY9u3b2aJFi1hlZeWg34P09HTm5eXFALB169axuro6tm/fPmZvb88AsNdff51pNBpWXl7OwsPDGQDm5eXFnnjiCRYXF8dmz57NPv30U9bZ2XnL9+Ptt99mbm5u3Ht49uxZxhhj27dv77d9MO9vb08//TT7+OOPB/26+fD2228ziUTCsrKy+C7FWMxj85Ief//735lIJDLYhMNU9A4txhjr6urirq9fv55JJBLGGGOVlZVMqVT2+xzXrl1jzzzzjMGmK/1RKBR9+utpP3XqFKuqqrrT8u9YY2MjU6lUjLEbh9q62a3ej7sx2Oe79957WUtLy+/qazh99dVXTCgUsnfffZfvUoypa+QuLR0Gr776KhobG7F8+XJ88MEH2LBhA98lDRk7OzuD2wOdpOdWh4HPy8tDZGTkbXenGmiPB5lMhnvuuadP+7PPPnvL5wOAxMRETJ069bbT9eh94uf+zos72PdjsAbzfLm5ufDy8hqxa/jfeecdbN68Ga+88gpeeuklvssxKrMKOgD46KOP4O3tjRdeeAFHjhzB559/bvJrnjo6OqDVaqFSqQY8WbZWq0VnZydWr1495P333u5tIKP1jPXZ2dl4+eWXERoaivT0dBw8eJDvkvqor6/HM888g8OHD+PNN980z0Na8T1PyZcTJ04wX19fJpfL2eeff853OcNm7969zMXFhQFgzz77LLfbFhkaWVlZzM7OjslkMvbtt9/yXU4f3377LXN0dGReXl4sPT2d73L4Yl7L6G7W1tbGnnvuOSYQ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\n", "text/plain": [ "" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p_asr = Pipeline()\n", "pipeline_asr = (\n", " p_asr.map(malaya_speech.astype.to_ndarray)\n", " .map(malaya_speech.astype.int_to_float)\n", " .map(lambda x: model(x), name = 'speech-to-text')\n", ")\n", "p_asr.visualize()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**You need to make sure the last output should named as `speech-to-text` or else the realtime engine will throw an error**." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Start Recording" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Again, once you start to run the code below, it will straight away recording your voice**. \n", "\n", "If you run in jupyter notebook, press button stop up there to stop recording, if in terminal, press `CTRL + c`." ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Listening (ctrl-C to stop recording) ... \n", "\n", "Sample 0 2021-06-29 17:18:11.304366: hello\n", "Sample 1 2021-06-29 17:18:13.970897: nama saya musim\n", "Sample 2 2021-06-29 17:18:16.227266: i like to eat chicken so much\n", "Sample 3 2021-06-29 17:18:18.309072: uh korang sc\n", "Sample 4 2021-06-29 17:18:20.032183: semua suka makan ayam tak\n", "Sample 5 2021-06-29 17:18:23.831369: uni funny lah\n", "Sample 6 2021-06-29 17:18:29.609492: makasih\n", "Sample 7 2021-06-29 17:18:31.709068: thank you so much\n", "saved audio to realtime-asr-mixed.wav\n" ] }, { "data": { "text/plain": [ "'realtime-asr-mixed.wav'" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "file, samples = malaya_speech.streaming.record(vad = vad_model, asr_model = p_asr, spinner = False,\n", " filename = 'realtime-asr-mixed.wav')\n", "file" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "the wav file can get at [malaya-speech/speech/record](https://github.com/huseinzol05/malaya-speech/tree/master/speech/record)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Actually it is pretty nice. As you can see, it able to transcribe realtime, you can try it by yourself." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import IPython.display as ipd\n", "\n", "ipd.Audio(file)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "(bytearray, 'semua suka makan ayam tak')" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type(samples[4][0]), samples[4][1]" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y = malaya_speech.utils.astype.to_ndarray(samples[4][0])\n", "ipd.Audio(y, rate = 16000)" ] } ], "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.7.7" } }, "nbformat": 4, "nbformat_minor": 4 }