{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Realtime ASR + Rubberband\n", "\n", "To improve Realtime ASR, you can stretch voice output using [pyrubberband](https://github.com/bmcfee/pyrubberband)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "This tutorial is available as an IPython notebook at [malaya-speech/example/realtime-asr](https://github.com/huseinzol05/malaya-speech/tree/master/example/realtime-asr).\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": [ "### Install pyrubberband\n", "\n", "```bash\n", "pip3 install pyrubberband\n", "```\n", "\n", "[pyrubberband](https://github.com/bmcfee/pyrubberband) is a python wrapper for [rubberband](http://breakfastquay.com/rubberband/)." ] }, { "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')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Test pyrubberband" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "import pyrubberband as pyrb\n", "import IPython.display as ipd" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "y, sr = malaya_speech.load('speech/example-speaker/husein-zolkepli.wav')\n", "y_stretch = pyrb.time_stretch(y, sr, 0.8)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ipd.Audio(y, rate = sr)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ipd.Audio(y_stretch, rate = sr)" ] }, { "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": 9, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sr = 16000\n", "stretch_ratio = 0.85\n", "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: pyrb.time_stretch(x, sr, stretch_ratio), name = 'stretch')\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": 10, "metadata": { "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Listening (ctrl-C to stop recording) ... \n", "\n", "Sample 0 2021-06-12 11:03:39.804085: helo nama saya hussein \n", "Sample 1 2021-06-12 11:03:40.041678: hari ini saya mahu cakap tentang bohong\n", "Sample 2 2021-06-12 11:03:40.274277: apakah itu bon\n", "Sample 3 2021-06-12 11:03:40.543731: yalah pinjaman yang dikeluarkan oleh\n", "Sample 4 2021-06-12 11:03:42.442084: atau kerajaan\n", "Sample 5 2021-06-12 11:03:46.897266: tak ada investor dengan bunga setiap tahun\n", "Sample 6 2021-06-12 11:03:51.883495: enam bulan tiga bulan bergantung kepada bank dan akan ada tempoh mata\n", "Sample 7 2021-06-12 11:03:54.447205: terima kasih\n", "saved audio to realtime-asr-rubberband.wav\n" ] }, { "data": { "text/plain": [ "'realtime-asr-rubberband.wav'" ] }, "execution_count": 10, "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-rubberband.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": 11, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import IPython.display as ipd\n", "\n", "ipd.Audio(file)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "(bytearray,\n", " 'enam bulan tiga bulan bergantung kepada bank dan akan ada tempoh mata')" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type(samples[6][0]), samples[6][1]" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y = malaya_speech.utils.astype.to_ndarray(samples[6][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 }