{ "info": { "author": "Quan Wang", "author_email": "quanw@google.com", "bugtrack_url": null, "classifiers": [ "License :: OSI Approved :: Apache Software License", "Operating System :: OS Independent", "Programming Language :: Python :: 3" ], "description": "# UIS-RNN [![Build Status](https://travis-ci.org/google/uis-rnn.svg?branch=master)](https://travis-ci.org/google/uis-rnn) [![PyPI Version](https://img.shields.io/pypi/v/uisrnn.svg)](https://pypi.python.org/pypi/uisrnn) [![Python Versions](https://img.shields.io/pypi/pyversions/uisrnn.svg)](https://pypi.org/project/uisrnn) [![codecov](https://codecov.io/gh/google/uis-rnn/branch/master/graph/badge.svg)](https://codecov.io/gh/google/uis-rnn) [![Documentation](https://img.shields.io/badge/api-documentation-blue.svg)](https://google.github.io/uis-rnn)\n\n## Overview\n\nThis is the library for the\n*Unbounded Interleaved-State Recurrent Neural Network (UIS-RNN)* algorithm.\nUIS-RNN solves the problem of segmenting and clustering sequential data\nby learning from examples.\n\nThis algorithm was originally proposed in the paper\n[Fully Supervised Speaker Diarization](https://arxiv.org/abs/1810.04719).\n\nThe work has been introduced by\n[Google AI Blog](https://ai.googleblog.com/2018/11/accurate-online-speaker-diarization.html).\n\n![gif](https://raw.githubusercontent.com/google/uis-rnn/master/resources/uisrnn.gif)\n\n## Disclaimer\n\nThis open source implementation is slightly different than the internal one\nwhich we used to produce the results in the\n[paper](https://arxiv.org/abs/1810.04719), due to dependencies on\nsome internal libraries.\n\nWe CANNOT share the data, code, or model for the speaker recognition system\n([d-vector embeddings](https://google.github.io/speaker-id/publications/GE2E/))\nused in the paper, since the speaker recognition system\nheavily depends on Google's internal infrastructure and proprietary data.\n\n**This library is NOT an official Google product.**\n\n## Dependencies\n\nThis library depends on:\n\n* python 3.5+\n* numpy 1.15.1\n* pytorch 0.4.0\n* scipy 1.1.0 (for evaluation only)\n\n## Getting Started\n\n[![YouTube](resources/YouTube_lecture_screenshot.png)](https://www.youtube.com/watch?v=pGkqwRPzx9U)\n\n### Install the package\n\nWithout downloading the repository, you can install the\n[package](https://pypi.org/project/uisrnn/) by:\n\n```\npip3 install uisrnn\n```\n\nor\n\n```\npython3 -m pip install uisrnn\n```\n\n### Run the demo\n\nTo get started, simply run this command:\n\n```bash\npython3 demo.py --train_iteration=1000 -l=0.001\n```\n\nThis will train a UIS-RNN model using `data/toy_training_data.npz`,\nthen store the model on disk, perform inference on `data/toy_testing_data.npz`,\nprint the inference results, and save the averaged accuracy in a text file.\n\nPS. The files under `data/` are manually generated *toy data*,\nfor demonstration purpose only.\nThese data are very simple, so we are supposed to get 100% accuracy on the\ntesting data.\n\n### Run the tests\n\nYou can also verify the correctness of this library by running:\n\n```bash\nbash run_tests.sh\n```\n\nIf you fork this library and make local changes, be sure to use these tests\nas a sanity check.\n\nBesides, these tests are also great examples for learning\nthe APIs, especially `tests/integration_test.py`.\n\n## Core APIs\n\n### Glossary\n\n| General Machine Learning | Speaker Diarization |\n|--------------------------|------------------------|\n| Sequence | Utterance |\n| Observation / Feature | Embedding / d-vector |\n| Label / Cluster ID | Speaker |\n\n### Arguments\n\nIn your main script, call this function to get the arguments:\n\n```python\nmodel_args, training_args, inference_args = uisrnn.parse_arguments()\n```\n\n### Model construction\n\nAll algorithms are implemented as the `UISRNN` class. First, construct a\n`UISRNN` object by:\n\n```python\nmodel = uisrnn.UISRNN(args)\n```\n\nThe definitions of the args are described in `uisrnn/arguments.py`.\nSee `model_parser`.\n\n### Training\n\nNext, train the model by calling the `fit()` function:\n\n```python\nmodel.fit(train_sequences, train_cluster_ids, args)\n```\n\nThe definitions of the args are described in `uisrnn/arguments.py`.\nSee `training_parser`.\n\nThe `fit()` function accepts two types of input, as described below.\n\n#### Input as list of sequences (recommanded)\n\nHere, `train_sequences` is a list of observation sequences.\nEach observation sequence is a 2-dim numpy array of type `float`.\n\n* The first dimension is the length of this sequence. And the length\n can vary from one sequence to another.\n* The second dimension is the size of each observation. This\n must be consistent among all sequences. For speaker diarization,\n the observation could be the\n [d-vector embeddings](https://google.github.io/speaker-id/publications/GE2E/).\n\n`train_cluster_ids` is also a list, which has the same length as\n`train_sequences`. Each element of `train_cluster_ids` is a 1-dim list or\nnumpy array of strings, containing the ground truth labels for the\ncorresponding sequence in `train_sequences`.\nFor speaker diarization, these labels are the speaker identifiers for each\nobservation.\n\nWhen calling `fit()` in this way, please be very careful with the argument\n`--enforce_cluster_id_uniqueness`.\n\nFor example, assume:\n\n```python\ntrain_cluster_ids = [['a', 'b'], ['a', 'c']]\n```\n\nIf the label `'a'` from the two sequences refers to the same cluster across\nthe entire dataset, then we should have `enforce_cluster_id_uniqueness=False`;\notherwise, if `'a'` is only a local indicator to distinguish from `'b'` in the\n1st sequence, and to distinguish from `'c'` in the 2nd sequence, then we should\nhave `enforce_cluster_id_uniqueness=True`.\n\nAlso, please note that, when calling `fit()` in this way, we are going to\nconcatenate all sequences and all cluster IDs, and delegate to\nthe next section below.\n\n#### Input as single concatenated sequence\n\nHere, `train_sequences` should be a single 2-dim numpy array of type `float`,\nfor the **concatenated** observation sequences.\n\nFor example, if you have *M* training utterances,\nand each utterance is a sequence of *L* embeddings. Each embedding is\na vector of *D* numbers. Then the shape of `train_sequences` is *N * D*,\nwhere *N = M * L*.\n\n`train_cluster_ids` is a 1-dim list or numpy array of strings, of length *N*.\nIt is the **concatenated** ground truth labels of all training data.\n\nSince we are concatenating observation sequences, it is important to note that,\nground truth labels in `train_cluster_id` across different sequences are\nsupposed to be **globally unique**.\n\nFor example, if the set of labels in the first\nsequence is `{'A', 'B', 'C'}`, and the set of labels in the second sequence\nis `{'B', 'C', 'D'}`. Then before concatenation, we should rename them to\nsomething like `{'1_A', '1_B', '1_C'}` and `{'2_B', '2_C', '2_D'}`,\nunless `'B'` and `'C'` in the two sequences are meaningfully identical\n(in speaker diarization, this means they are the same speakers across\nutterances). This part will be automatically taken care of by the argument\n`--enforce_cluster_id_uniqueness` for the previous section.\n\nThe reason we concatenate all training sequences is that, we will be resampling\nand *block-wise* shuffling the training data as a **data augmentation**\nprocess, such that we result in a robust model even when there is insufficient\nnumber of training sequences.\n\n#### Training on large datasets\n\nFor large datasets, the data usually could not be loaded into memory at once.\nIn such cases, the `fit()` function needs to be called multiple times.\n\nHere we provide a few guidelines as our suggestions:\n\n1. Do not feed different datasets into different calls of `fit()`. Instead,\n for each call of `fit()`, the input should cover sequences from\n different datasets.\n2. For each call to the `fit()` function, make the size of input roughly the\n same. And, don't make the input size too small.\n\n### Prediction\n\nOnce we are done with training, we can run the trained model to perform\ninference on new sequences by calling the `predict()` function:\n\n```python\npredicted_cluster_ids = model.predict(test_sequences, args)\n```\n\nHere `test_sequences` should be a list of 2-dim numpy arrays of type `float`,\ncorresponding to the observation sequences for testing.\n\nThe returned `predicted_cluster_ids` is a list of the same size as\n`test_sequences`. Each element of `predicted_cluster_ids` is a list of integers,\nwith the same length as the corresponding test sequence.\n\nYou can also use a single test sequence for `test_sequences`. Then the returned\n`predicted_cluster_ids` will also be a single list of integers.\n\nThe definitions of the args are described in `uisrnn/arguments.py`.\nSee `inference_parser`.\n\n## Citations\n\nOur paper is cited as:\n\n```\n@inproceedings{zhang2019fully,\n title={Fully supervised speaker diarization},\n author={Zhang, Aonan and Wang, Quan and Zhu, Zhenyao and Paisley, John and Wang, Chong},\n booktitle={International Conference on Acoustics, Speech and Signal Processing (ICASSP)},\n pages={6301--6305},\n year={2019},\n organization={IEEE}\n}\n```\n\n## References\n\n### Baseline diarization system\n\nTo learn more about our baseline diarization system based on\n*unsupervised clustering* algorithms, check out\n[this site](https://google.github.io/speaker-id/publications/LstmDiarization/).\n\nA Python re-implementation of the *spectral clustering* algorithm used in this\npaper is available [here](https://github.com/wq2012/SpectralCluster).\n\nThe ground truth labels for the\n[NIST SRE 2000](https://catalog.ldc.upenn.edu/LDC2001S97)\ndataset (Disk6 and Disk8) can be found\n[here](https://github.com/google/speaker-id/tree/master/publications/LstmDiarization/evaluation/NIST_SRE2000).\n\nFor more public resources on speaker diarization, check out [awesome-diarization](https://github.com/wq2012/awesome-diarization).\n\n### Speaker recognizer/encoder\n\nTo learn more about our speaker embedding system, check out\n[this site](https://google.github.io/speaker-id/publications/GE2E/).\n\nWe are aware of several third-party implementations of this work:\n\n* [TensorFlow implementation by Janghyun1230](https://github.com/Janghyun1230/Speaker_Verification)\n* [PyTorch implementaion by HarryVolek](https://github.com/HarryVolek/PyTorch_Speaker_Verification) - with UIS-RNN integration\n* [PyTorch implementation as part of SV2TTS](https://github.com/CorentinJ/Real-Time-Voice-Cloning)\n\nPlease use your own judgement to decide whether you want to use these\nimplementations.\n\n**We are NOT responsible for the correctness of any third-party implementations.**\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/google/uis-rnn", "keywords": "", "license": "", "maintainer": "", "maintainer_email": "", "name": "uisrnn", "package_url": "https://pypi.org/project/uisrnn/", "platform": "", "project_url": "https://pypi.org/project/uisrnn/", "project_urls": { "Homepage": "https://github.com/google/uis-rnn" }, "release_url": "https://pypi.org/project/uisrnn/0.0.8/", "requires_dist": null, "requires_python": "", "summary": "Unbounded Interleaved-State Recurrent Neural Network", "version": "0.0.8" }, "last_serial": 5796942, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "md5": "5a098d712fdb6249b6c028aa767b2297", "sha256": "e89bfb33c44b347e9401464fde607c2441f8387cade2c520d3633f5c2f584d74" }, "downloads": -1, "filename": "uisrnn-0.0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "5a098d712fdb6249b6c028aa767b2297", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 17179, "upload_time": "2018-12-26T17:05:22", "url": "https://files.pythonhosted.org/packages/1a/ba/74a0d96e64d779714a53648b6848e271ffa5f1d1fd95c953af47f085b168/uisrnn-0.0.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "51c35a042f29005bb4d3240038144d55", "sha256": "8bd6aa2f2a70b6b5a4a87646d4b3ddbdecf0af035001b8b42e085c81bd429361" }, "downloads": -1, "filename": "uisrnn-0.0.1.tar.gz", "has_sig": false, "md5_digest": "51c35a042f29005bb4d3240038144d55", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13488, "upload_time": "2018-12-26T17:05:24", "url": "https://files.pythonhosted.org/packages/05/dd/c0aeec84436ff8735696d018cd6a42b0e998a0d4d3d1214bfd54f0a229fa/uisrnn-0.0.1.tar.gz" } ], "0.0.2": [ { "comment_text": "", "digests": { "md5": "d28dfa28e6d68413844d494ee4105027", "sha256": "f912230737731f8fb5c2da7830b40b51e8955718fc3306b212da43bf43bec2e9" }, "downloads": -1, "filename": "uisrnn-0.0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "d28dfa28e6d68413844d494ee4105027", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 17335, "upload_time": "2018-12-26T18:01:33", "url": "https://files.pythonhosted.org/packages/03/0d/937fa6fe54612b9a10eab6cf9be200fb5f5ed3b9d2132d55051e7125f27b/uisrnn-0.0.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a279508ebf6ef3d75a34f75cb4839fa7", "sha256": "a619d14aa0361574c50ee4ab335e3c84d6e023bba2e2b79438731b71f764fa17" }, "downloads": -1, "filename": "uisrnn-0.0.2.tar.gz", "has_sig": false, "md5_digest": "a279508ebf6ef3d75a34f75cb4839fa7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13672, "upload_time": "2018-12-26T18:01:34", "url": "https://files.pythonhosted.org/packages/57/5f/7b467056dc1940f8b04d4cf9d5a2322a68466d25fa10c61f1c05d20d4234/uisrnn-0.0.2.tar.gz" } ], "0.0.3": [ { "comment_text": "", "digests": { "md5": "e930d7fe46777e7faf1975bcecafae22", "sha256": "17e86f5f7aecc43ad82b419730cf2d9841259beda0800e935cf62066ee6283f4" }, "downloads": -1, "filename": "uisrnn-0.0.3-py3-none-any.whl", "has_sig": false, "md5_digest": "e930d7fe46777e7faf1975bcecafae22", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 17410, "upload_time": "2018-12-26T18:37:58", "url": "https://files.pythonhosted.org/packages/f9/6c/48edaeffcac788fe1f608b5d2899d129b11af07c82866e126efc27782f9f/uisrnn-0.0.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a5d2dfc98d0fa2f0b2b702f038d3bf7a", "sha256": "19b694c54a4a9b1dbae7f2cf9fedb69f1eedd50f1cde03e640dba0e15ef95879" }, "downloads": -1, "filename": "uisrnn-0.0.3.tar.gz", "has_sig": false, "md5_digest": "a5d2dfc98d0fa2f0b2b702f038d3bf7a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13727, "upload_time": "2018-12-26T18:37:59", "url": "https://files.pythonhosted.org/packages/ea/8c/deacf2152126a0ac4bc3dbe66f91a8bf97ca477b66b2a5e57f2cbca47471/uisrnn-0.0.3.tar.gz" } ], "0.0.4": [ { "comment_text": "", "digests": { "md5": "ef1f39305d47eb8623c2efbe167a0a9e", "sha256": "05f2010115822987bdb356ac0bd8736ac55c6fb5d8cef9e26eb6a272f093463f" }, "downloads": -1, "filename": "uisrnn-0.0.4-py3-none-any.whl", "has_sig": false, "md5_digest": "ef1f39305d47eb8623c2efbe167a0a9e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 17883, "upload_time": "2018-12-26T20:24:04", "url": "https://files.pythonhosted.org/packages/9d/8b/f46e5aa5ae18ab0163bc0c68aa46284c00dfb2b5e7e8b8f38cc381dc8777/uisrnn-0.0.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "bda2bd725f00b5f9e304996116f77a4b", "sha256": "b828ad10ec7bb8b293bfdd1dcf62f8cac4da9268cfda8987260fd4d53cd54bd6" }, "downloads": -1, "filename": "uisrnn-0.0.4.tar.gz", "has_sig": false, "md5_digest": "bda2bd725f00b5f9e304996116f77a4b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14312, "upload_time": "2018-12-26T20:24:05", "url": "https://files.pythonhosted.org/packages/c4/43/eba922bdc96b73d92ffd18b5c99a05e7b4b69c5d05b7eb395c52b251ea14/uisrnn-0.0.4.tar.gz" } ], "0.0.5": [ { "comment_text": "", "digests": { "md5": "dde2636be92e9d96bab291468116d116", "sha256": "ec49db71ded5ea314758385ba2fc685aa17e098f44d43fc3cd3f8bd41669f638" }, "downloads": -1, "filename": "uisrnn-0.0.5-py3-none-any.whl", "has_sig": false, "md5_digest": "dde2636be92e9d96bab291468116d116", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 20002, "upload_time": "2019-01-04T20:40:39", "url": "https://files.pythonhosted.org/packages/dd/d8/fb6c53dc4bbdbb9ab4ca6aafa6341678cb6927e3ce44c1815566ca2884b6/uisrnn-0.0.5-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8f02ad67a4468d6747b69c3570127f1c", "sha256": "9f251258a93d9d71b45b592aa64be6e1f4ba964d4efd04ee396c7f1282f1256c" }, "downloads": -1, "filename": "uisrnn-0.0.5.tar.gz", "has_sig": false, "md5_digest": "8f02ad67a4468d6747b69c3570127f1c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16417, "upload_time": "2019-01-04T20:40:41", "url": "https://files.pythonhosted.org/packages/3d/40/bb72a8595a16798dd9a47836d1c284ab8b0afb89cfb83cd8a26676036fe3/uisrnn-0.0.5.tar.gz" } ], "0.0.6": [ { "comment_text": "", "digests": { "md5": "83bb34f58744ba5c0cb290d4ffab19ec", "sha256": "905209aeff6ee432d76f302f00f2f416b3237946244cf79db0903801b661a8e6" }, "downloads": -1, "filename": "uisrnn-0.0.6-py3-none-any.whl", "has_sig": false, "md5_digest": "83bb34f58744ba5c0cb290d4ffab19ec", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 20546, "upload_time": "2019-02-18T20:47:40", "url": "https://files.pythonhosted.org/packages/bd/fd/06d0afca8c492ac38c7e9693e446c7e0abd81286fb8a51b9efadb176cd22/uisrnn-0.0.6-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "dfae1461f7840d1a74f4679aa2f1209c", "sha256": "dbbf0f47255ae1fef1524d209838def46525954afdd76e90f55c38c2c6024972" }, "downloads": -1, "filename": "uisrnn-0.0.6.tar.gz", "has_sig": false, "md5_digest": "dfae1461f7840d1a74f4679aa2f1209c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20677, "upload_time": "2019-02-18T20:47:41", "url": "https://files.pythonhosted.org/packages/78/d6/27e84cc3949b3f92fdae060c282e1df918070e9e343b1407b5ad827cda84/uisrnn-0.0.6.tar.gz" } ], "0.0.7": [ { "comment_text": "", "digests": { "md5": "70695d3635f09e28840841dd73c0ad72", "sha256": "82cadc44a377b0a1dc5eb30ee444e7422c813a15126ac4e105e762b62e52904b" }, "downloads": -1, "filename": "uisrnn-0.0.7-py3-none-any.whl", "has_sig": false, "md5_digest": "70695d3635f09e28840841dd73c0ad72", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 24147, "upload_time": "2019-04-25T15:49:12", "url": "https://files.pythonhosted.org/packages/14/ff/4363c8521f8db60983e1c2d5c057a4fbb1cb6fe6dfbe0ebc7d5ce3cedfa1/uisrnn-0.0.7-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4bd31b8d9a29f0ce92855cd855cd1353", "sha256": "0635d8bc2718d2bc2adb934da82b3b33a31e4b3dc0fcb923632d15fac7ec4c97" }, "downloads": -1, "filename": "uisrnn-0.0.7.tar.gz", "has_sig": false, "md5_digest": "4bd31b8d9a29f0ce92855cd855cd1353", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16932, "upload_time": "2019-04-25T15:49:15", "url": "https://files.pythonhosted.org/packages/90/46/f3aff16ac759009b281384cbe180f1ba0a8b0e6b21811f2f0f3a1f4f0027/uisrnn-0.0.7.tar.gz" } ], "0.0.8": [ { "comment_text": "", "digests": { "md5": "b1927e147396097695294e383ecd977c", "sha256": "fa6104f719cac8dfbfe25156bd3188bc13a197629939261b22d0525678d8eeb5" }, "downloads": -1, "filename": "uisrnn-0.0.8-py3-none-any.whl", "has_sig": false, "md5_digest": "b1927e147396097695294e383ecd977c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 24750, "upload_time": "2019-09-07T18:28:26", "url": "https://files.pythonhosted.org/packages/6f/53/f3691b43144333b635b5d511e39cc9dffeeedf1faa68689cf4a84df02fbf/uisrnn-0.0.8-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1ca8065a4fb1a2bddce39a4a4a6156ba", "sha256": "3125e66eb5fffa44bd620b0d44977f79de9d99e7df2ba43d06f805f42481d4ad" }, "downloads": -1, "filename": "uisrnn-0.0.8.tar.gz", "has_sig": false, "md5_digest": "1ca8065a4fb1a2bddce39a4a4a6156ba", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21322, "upload_time": "2019-09-07T18:28:28", "url": "https://files.pythonhosted.org/packages/b1/68/116b7cb947747398152e85fb302836c72b8a91876638e58cb9894a4cc677/uisrnn-0.0.8.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "b1927e147396097695294e383ecd977c", "sha256": "fa6104f719cac8dfbfe25156bd3188bc13a197629939261b22d0525678d8eeb5" }, "downloads": -1, "filename": "uisrnn-0.0.8-py3-none-any.whl", "has_sig": false, "md5_digest": "b1927e147396097695294e383ecd977c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 24750, "upload_time": "2019-09-07T18:28:26", "url": "https://files.pythonhosted.org/packages/6f/53/f3691b43144333b635b5d511e39cc9dffeeedf1faa68689cf4a84df02fbf/uisrnn-0.0.8-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1ca8065a4fb1a2bddce39a4a4a6156ba", "sha256": "3125e66eb5fffa44bd620b0d44977f79de9d99e7df2ba43d06f805f42481d4ad" }, "downloads": -1, "filename": "uisrnn-0.0.8.tar.gz", "has_sig": false, "md5_digest": "1ca8065a4fb1a2bddce39a4a4a6156ba", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21322, "upload_time": "2019-09-07T18:28:28", "url": "https://files.pythonhosted.org/packages/b1/68/116b7cb947747398152e85fb302836c72b8a91876638e58cb9894a4cc677/uisrnn-0.0.8.tar.gz" } ] }