{"action":"created","comment":{"url":"https://api.github.com/repos/NVIDIA/NeMo/pulls/comments/349367338","pull_request_review_id":321245121,"id":349367338,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDM0OTM2NzMzOA==","diff_hunk":"@@ -0,0 +1,470 @@\n+# Copyright (C) NVIDIA CORPORATION. All Rights Reserved.\n+#\n+# Licensed under the Apache License, Version 2.0 (the \"License\");\n+# you may not use this file except in compliance with the License.\n+# You may obtain a copy of the License at\n+#\n+#      http://www.apache.org/licenses/LICENSE-2.0\n+#\n+# Unless required by applicable law or agreed to in writing, software\n+# distributed under the License is distributed on an \"AS IS\" BASIS,\n+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n+# See the License for the specific language governing permissions and\n+# limitations under the License.****\n+\"\"\"\n+This file contains neural modules responsible for preprocessing audio data.\n+\"\"\"\n+__all__ = ['AudioPreprocessor',\n+           'AudioToMFCCPreprocessor',\n+           'AudioToMelSpectrogramPreprocessor',\n+           'AudioToSpectrogramPreprocessor',\n+           'MultiplyBatch',\n+           'SpectrogramAugmentation']\n+\n+import math\n+import torch\n+import torchaudio\n+try:\n+    from apex import amp\n+except AttributeError:\n+    print(\"Unable to import APEX. Mixed precision and distributed training \"\n+          \"will not work.\")\n+\n+from nemo.backends.pytorch import NonTrainableNM\n+from nemo.core import Optimization\n+from nemo.core.neural_types import *\n+from .parts.features import FilterbankFeatures\n+from .parts.spectr_augment import SpecAugment, SpecCutout\n+\n+\n+class AudioPreprocessor(NonTrainableNM):\n+    \"\"\"\n+    A base class for Neural Modules that performs audio preprocessing,\n+    transforming the wav files to features.\n+    \"\"\"\n+    @staticmethod\n+    def create_ports():\n+        input_ports = {\n+            \"input_signal\": NeuralType({0: AxisType(BatchTag),\n+                                        1: AxisType(TimeTag)}),\n+\n+            \"length\": NeuralType({0: AxisType(BatchTag)}),\n+        }\n+\n+        output_ports = {\n+            \"processed_signal\": NeuralType({0: AxisType(BatchTag),\n+                                            1: AxisType(SpectrogramSignalTag),\n+                                            2: AxisType(ProcessedTimeTag)}),\n+\n+            \"processed_length\": NeuralType({0: AxisType(BatchTag)})\n+        }\n+        return input_ports, output_ports\n+\n+    def __init__(self, **kwargs):\n+        super().__init__(**kwargs)\n+\n+        self.disable_casts = (self._opt_level == Optimization.mxprO1)\n+\n+        self.torch_windows = {\n+            'hann': torch.hann_window,\n+            'hamming': torch.hamming_window,\n+            'blackman': torch.blackman_window,\n+            'bartlett': torch.bartlett_window,\n+            'none': None,\n+        }\n+\n+    @torch.no_grad()\n+    def forward(self, input_signal, length):\n+        if self.disable_casts:\n+            with amp.disable_casts():\n+                processed_signal = self.get_features(\n+                        input_signal.to(torch.float), length)\n+        else:\n+            processed_signal = self.get_features(input_signal, length)\n+\n+        processed_length = self.get_seq_len(length)\n+        return processed_signal, processed_length\n+\n+    def get_features(self, input_signal, length):\n+        # Called by forward(). Subclasses should implement this.\n+        raise NotImplementedError\n+\n+    def get_seq_len(self, length):\n+        # Called by forward(). Subclasses should implement this.\n+        raise NotImplementedError\n+\n+\n+class AudioToSpectrogramPreprocessor(AudioPreprocessor):\n+    \"\"\"Preprocessor that converts wavs to spectrograms.\n+    Uses torchaudio's Spectrogram class as a featurizer.\n+\n+    Args:\n+        sample_rate (int): Sample rate of the input audio data.\n+            Defaults to 16000\n+        window_size (float): Size of window for fft in seconds\n+            Defaults to 0.02\n+        window_stride (float): Stride of window for fft in seconds\n+            Defaults to 0.01\n+        n_fft (int): Length of FT window. If None, it uses the smallest power\n+            of 2 that is larger than n_window_size.\n+            Defaults to None\n+        window (str): Windowing function for fft. can be one of ['hann',\n+            'hamming', 'blackman', 'bartlett']\n+            Defaults to \"hamming\"\n+        normalized (bool): Whether to normalize by magnitude after stft\n+        pad (int): Two sided padding\n+    \"\"\"\n+    def __init__(\n+            self, *,\n+            sample_rate=16000,\n+            window_size=0.02,\n+            window_stride=0.01,\n+            n_fft=None,\n+            window=\"hamming\",\n+            normalized=True,\n+            pad=8,\n+            **kwargs\n+    ):\n+        super().__init__(**kwargs)\n+\n+        self.win_length = int(sample_rate * window_size)\n+        self.hop_length = int(sample_rate * window_stride)\n+        self.n_fft = n_fft or 2 ** math.ceil(math.log2(self.win_length))\n+\n+        window_fn = self.torch_windows.get(window, None)\n+        if window_fn is None:\n+            raise ValueError(\n+                f\"Window argument for AudioProcessor is invalid: {window}\")\n+\n+        # Create featurizer\n+        self.featurizer = torchaudio.transforms.Spectrogram(\n+            n_fft=self.n_fft,\n+            win_length=self.win_length,\n+            hop_length=self.hop_length,\n+            pad=pad,\n+            window_fn=window_fn,\n+            normalized=normalized\n+        )\n+        self.featurizer.to(self._device)\n+\n+    def get_features(self, input_signal, length):\n+        return self.featurizer(input_signal)\n+\n+    def get_seq_len(self, seq_len):\n+        return torch.ceil(\n+                seq_len.to(dtype=torch.float) / self.hop_length).to(\n+                        dtype=torch.long)\n+\n+\n+class AudioToMelSpectrogramPreprocessor(AudioPreprocessor):\n+    \"\"\"Featurizer that converts wavs to mel spectrograms.\n+    We don't use torchaudio's implementation here because the original\n+    implementation is not the same, so for the sake of backwards-compatibility\n+    this will use the old FilterbankFeatures for now.\n+\n+    Args:\n+        sample_rate (int): Sample rate of the input audio data.\n+            Defaults to 16000\n+        window_size (float): Size of window for fft in seconds\n+            Defaults to 0.02\n+        window_stride (float): Stride of window for fft in seconds\n+            Defaults to 0.01\n+        window (str): Windowing function for fft. can be one of ['hann',\n+            'hamming', 'blackman', 'bartlett']\n+            Defaults to \"hann\"\n+        normalize (str): Can be one of ['per_feature', 'all_features']; all\n+            other options disable feature normalization. 'all_features'\n+            normalizes the entire spectrogram to be mean 0 with std 1.\n+            'pre_features' normalizes per channel / freq instead.\n+            Defaults to \"per_feature\"\n+        n_fft (int): Length of FT window. If None, it uses the smallest power\n+            of 2 that is larger than n_window_size.\n+            Defaults to None\n+        preemph (float): Amount of pre emphasis to add to audio. Can be\n+            disabled by passing None.\n+            Defaults to 0.97\n+        features (int): Number of mel spectrogram freq bins to output.\n+            Defaults to 64\n+        lowfreq (int): Lower bound on mel basis in Hz.\n+            Defaults to 0\n+        highfreq  (int): Lower bound on mel basis in Hz.\n+            Defaults to None\n+        log (bool): Log features.\n+            Defaults to True\n+        dither (float): Amount of white-noise dithering.\n+            Defaults to 1e-5\n+        pad_to (int): Ensures that the output size of the time dimension is\n+            a multiple of pad_to.\n+            Defaults to 16\n+        frame_splicing (int): Defaults to 1\n+        stft_conv (bool): If True, uses pytorch_stft and convolutions. If\n+            False, uses torch.stft.\n+            Defaults to False\n+    \"\"\"\n+    def __init__(\n+            self, *,\n+            sample_rate=16000,\n+            window_size=0.02,\n+            window_stride=0.01,\n+            window=\"hann\",\n+            normalize=\"per_feature\",\n+            n_fft=None,\n+            preemph=0.97,\n+            features=64,\n+            lowfreq=0,\n+            highfreq=None,\n+            log=True,\n+            dither=1e-5,\n+            pad_to=16,\n+            frame_splicing=1,\n+            stft_conv=False,\n+            **kwargs\n+    ):\n+        super().__init__(**kwargs)\n+\n+        self.featurizer = FilterbankFeatures(\n+            sample_rate=sample_rate,\n+            window_size=window_size,\n+            window_stride=window_stride,\n+            window=window,\n+            normalize=normalize,\n+            n_fft=n_fft,\n+            preemph=preemph,\n+            nfilt=features,\n+            lowfreq=lowfreq,\n+            highfreq=highfreq,\n+            log=log,\n+            dither=dither,\n+            pad_to=pad_to,\n+            frame_splicing=frame_splicing,\n+            stft_conv=stft_conv,\n+            logger=self._logger\n+        )\n+        self.featurizer.to(self._device)\n+\n+    def get_features(self, input_signal, length):\n+        return self.featurizer(input_signal, length)\n+\n+    def get_seq_len(self, seq_len):\n+        return self.featurizer.get_seq_len(seq_len)\n+\n+\n+class AudioToMFCCPreprocessor(AudioPreprocessor):\n+    \"\"\"Preprocessor that converts wavs to MFCCs.\n+    Uses torchaudio.transforms.MFCC, and several arguments are the same.\n+\n+    Args:\n+        sample_rate: The sample rate of the audio.\n+            Defaults to 16000.\n+        window_size: Size of window for fft in seconds. Used to calculate the\n+            win_length arg for mel spectrogram, overrides mel_kwargs if set.\n+            Defaults to None\n+        window_stride: Stride of window for fft in seconds. Used to caculate\n+            the hop_length arg for mel spect, overrides mel_kwargs if set.\n+            Defaults to None\n+        window: Windowing function for fft. can be one of ['hann',\n+            'hamming', 'blackman', 'bartlett', None]. Overrides mel_kwargs\n+            if set; otherwise, torchaudio defaults to hann.\n+            Defaults to None\n+        n_mfcc: Number of coefficients to retain\n+            Defaults to 64\n+        dct_type: Type of discrete cosine transform to use\n+        norm: Type of norm to use\n+        log: Whether to use log-mel spectrograms instead of db-scaled.\n+            Defaults to True.\n+        mel_kwargs: Dict of arguments for torchaudio.transforms.MelSpectrogram\n+    \"\"\"\n+    def __init__(\n+            self, *,\n+            sample_rate=16000,\n+            window_size=None,\n+            window_stride=None,\n+            window=None,\n+            n_mfcc=64,\n+            dct_type=2,\n+            norm='ortho',\n+            log=True,\n+            mel_kwargs=None,\n+            **kwargs):\n+        super().__init__(**kwargs)\n+\n+        if mel_kwargs is None:\n+            mel_kwargs = {}\n+\n+        # Use the sample rate given instead of in mel_kwargs\n+        if 'sample_rate' in mel_kwargs:\n+            del mel_kwargs['sample_rate']\n+\n+        # Override mel_kwargs if window_size or window_stride are set\n+        if window_size is not None:\n+            mel_kwargs['win_length'] = int(sample_rate * window_size)\n+        if window_stride is not None:\n+            mel_kwargs['hop_length'] = int(sample_rate * window_stride)\n+\n+        # Set window_fn if window arg is given\n+        if window:\n+            window_fn = self.torch_windows.get(window, None)\n+            if window_fn is None:","path":"collections/nemo_asr/nemo_asr/audio_preprocessing.py","position":307,"original_position":307,"commit_id":"ff473b55f59611064a65e8054ea245a957a16879","original_commit_id":"ff473b55f59611064a65e8054ea245a957a16879","user":{"login":"blisc","id":4763352,"node_id":"MDQ6VXNlcjQ3NjMzNTI=","avatar_url":"https://avatars3.githubusercontent.com/u/4763352?v=4","gravatar_id":"","url":"https://api.github.com/users/blisc","html_url":"https://github.com/blisc","followers_url":"https://api.github.com/users/blisc/followers","following_url":"https://api.github.com/users/blisc/following{/other_user}","gists_url":"https://api.github.com/users/blisc/gists{/gist_id}","starred_url":"https://api.github.com/users/blisc/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/blisc/subscriptions","organizations_url":"https://api.github.com/users/blisc/orgs","repos_url":"https://api.github.com/users/blisc/repos","events_url":"https://api.github.com/users/blisc/events{/privacy}","received_events_url":"https://api.github.com/users/blisc/received_events","type":"User","site_admin":false},"body":"Same comment as above.\r\nA None window type should be allowed. AKA your window is just 1.\r\nHowever, an unknown window type should throw this error. This is a stuble difference depending on what you intend self.torch_windows[\"none\"] to mean.","created_at":"2019-11-21T23:21:09Z","updated_at":"2019-11-21T23:21:19Z","html_url":"https://github.com/NVIDIA/NeMo/pull/138#discussion_r349367338","pull_request_url":"https://api.github.com/repos/NVIDIA/NeMo/pulls/138","author_association":"COLLABORATOR","_links":{"self":{"href":"https://api.github.com/repos/NVIDIA/NeMo/pulls/comments/349367338"},"html":{"href":"https://github.com/NVIDIA/NeMo/pull/138#discussion_r349367338"},"pull_request":{"href":"https://api.github.com/repos/NVIDIA/NeMo/pulls/138"}}},"pull_request":{"url":"https://api.github.com/repos/NVIDIA/NeMo/pulls/138","id":344265807,"node_id":"MDExOlB1bGxSZXF1ZXN0MzQ0MjY1ODA3","html_url":"https://github.com/NVIDIA/NeMo/pull/138","diff_url":"https://github.com/NVIDIA/NeMo/pull/138.diff","patch_url":"https://github.com/NVIDIA/NeMo/pull/138.patch","issue_url":"https://api.github.com/repos/NVIDIA/NeMo/issues/138","number":138,"state":"open","locked":false,"title":"MFCC features & featurizer refactoring","user":{"login":"redoctopus","id":4268876,"node_id":"MDQ6VXNlcjQyNjg4NzY=","avatar_url":"https://avatars0.githubusercontent.com/u/4268876?v=4","gravatar_id":"","url":"https://api.github.com/users/redoctopus","html_url":"https://github.com/redoctopus","followers_url":"https://api.github.com/users/redoctopus/followers","following_url":"https://api.github.com/users/redoctopus/following{/other_user}","gists_url":"https://api.github.com/users/redoctopus/gists{/gist_id}","starred_url":"https://api.github.com/users/redoctopus/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/redoctopus/subscriptions","organizations_url":"https://api.github.com/users/redoctopus/orgs","repos_url":"https://api.github.com/users/redoctopus/repos","events_url":"https://api.github.com/users/redoctopus/events{/privacy}","received_events_url":"https://api.github.com/users/redoctopus/received_events","type":"User","site_admin":false},"body":"Moved audio preprocessing featurizers into their own file, rearranged the class structure, and replaced some code with torchaudio.transforms, as discussed previously.\r\n\r\nThis refactor splits AudioPreprocessing into a base class + three NMs, one per transform: audio -> [spectrogram, mel spec, MFCC].\r\n\r\nI'm holding off on more granularity (i.e. intermediate transforms) for now because we only support loading audio and kaldi MFCCs (which don't need this preprocessing), and as far as I know don't have plans to support loading intermediate features. We can revisit discussion about structuring the preprocessors if we decide to in the future.","created_at":"2019-11-21T22:35:57Z","updated_at":"2019-11-21T23:21:18Z","closed_at":null,"merged_at":null,"merge_commit_sha":null,"assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/NVIDIA/NeMo/pulls/138/commits","review_comments_url":"https://api.github.com/repos/NVIDIA/NeMo/pulls/138/comments","review_comment_url":"https://api.github.com/repos/NVIDIA/NeMo/pulls/comments{/number}","comments_url":"https://api.github.com/repos/NVIDIA/NeMo/issues/138/comments","statuses_url":"https://api.github.com/repos/NVIDIA/NeMo/statuses/ff473b55f59611064a65e8054ea245a957a16879","head":{"label":"redoctopus:mfcc_features","ref":"mfcc_features","sha":"ff473b55f59611064a65e8054ea245a957a16879","user":{"login":"redoctopus","id":4268876,"node_id":"MDQ6VXNlcjQyNjg4NzY=","avatar_url":"https://avatars0.githubusercontent.com/u/4268876?v=4","gravatar_id":"","url":"https://api.github.com/users/redoctopus","html_url":"https://github.com/redoctopus","followers_url":"https://api.github.com/users/redoctopus/followers","following_url":"https://api.github.com/users/redoctopus/following{/other_user}","gists_url":"https://api.github.com/users/redoctopus/gists{/gist_id}","starred_url":"https://api.github.com/users/redoctopus/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/redoctopus/subscriptions","organizations_url":"https://api.github.com/users/redoctopus/orgs","repos_url":"https://api.github.com/users/redoctopus/repos","events_url":"https://api.github.com/users/redoctopus/events{/privacy}","received_events_url":"https://api.github.com/users/redoctopus/received_events","type":"User","site_admin":false},"repo":{"id":211422701,"node_id":"MDEwOlJlcG9zaXRvcnkyMTE0MjI3MDE=","name":"NeMo","full_name":"redoctopus/NeMo","private":false,"owner":{"login":"redoctopus","id":4268876,"node_id":"MDQ6VXNlcjQyNjg4NzY=","avatar_url":"https://avatars0.githubusercontent.com/u/4268876?v=4","gravatar_id":"","url":"https://api.github.com/users/redoctopus","html_url":"https://github.com/redoctopus","followers_url":"https://api.github.com/users/redoctopus/followers","following_url":"https://api.github.com/users/redoctopus/following{/other_user}","gists_url":"https://api.github.com/users/redoctopus/gists{/gist_id}","starred_url":"https://api.github.com/users/redoctopus/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/redoctopus/subscriptions","organizations_url":"https://api.github.com/users/redoctopus/orgs","repos_url":"https://api.github.com/users/redoctopus/repos","events_url":"https://api.github.com/users/redoctopus/events{/privacy}","received_events_url":"https://api.github.com/users/redoctopus/received_events","type":"User","site_admin":false},"html_url":"https://github.com/redoctopus/NeMo","description":"Neural Modules: a toolkit for conversational AI","fork":true,"url":"https://api.github.com/repos/redoctopus/NeMo","forks_url":"https://api.github.com/repos/redoctopus/NeMo/forks","keys_url":"https://api.github.com/repos/redoctopus/NeMo/keys{/key_id}","collaborators_url":"https://api.github.com/repos/redoctopus/NeMo/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/redoctopus/NeMo/teams","hooks_url":"https://api.github.com/repos/redoctopus/NeMo/hooks","issue_events_url":"https://api.github.com/repos/redoctopus/NeMo/issues/events{/number}","events_url":"https://api.github.com/repos/redoctopus/NeMo/events","assignees_url":"https://api.github.com/repos/redoctopus/NeMo/assignees{/user}","branches_url":"https://api.github.com/repos/redoctopus/NeMo/branches{/branch}","tags_url":"https://api.github.com/repos/redoctopus/NeMo/tags","blobs_url":"https://api.github.com/repos/redoctopus/NeMo/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/redoctopus/NeMo/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/redoctopus/NeMo/git/refs{/sha}","trees_url":"https://api.github.com/repos/redoctopus/NeMo/git/trees{/sha}","statuses_url":"https://api.github.com/repos/redoctopus/NeMo/statuses/{sha}","languages_url":"https://api.github.com/repos/redoctopus/NeMo/languages","stargazers_url":"https://api.github.com/repos/redoctopus/NeMo/stargazers","contributors_url":"https://api.github.com/repos/redoctopus/NeMo/contributors","subscribers_url":"https://api.github.com/repos/redoctopus/NeMo/subscribers","subscription_url":"https://api.github.com/repos/redoctopus/NeMo/subscription","commits_url":"https://api.github.com/repos/redoctopus/NeMo/commits{/sha}","git_commits_url":"https://api.github.com/repos/redoctopus/NeMo/git/commits{/sha}","comments_url":"https://api.github.com/repos/redoctopus/NeMo/comments{/number}","issue_comment_url":"https://api.github.com/repos/redoctopus/NeMo/issues/comments{/number}","contents_url":"https://api.github.com/repos/redoctopus/NeMo/contents/{+path}","compare_url":"https://api.github.com/repos/redoctopus/NeMo/compare/{base}...{head}","merges_url":"https://api.github.com/repos/redoctopus/NeMo/merges","archive_url":"https://api.github.com/repos/redoctopus/NeMo/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/redoctopus/NeMo/downloads","issues_url":"https://api.github.com/repos/redoctopus/NeMo/issues{/number}","pulls_url":"https://api.github.com/repos/redoctopus/NeMo/pulls{/number}","milestones_url":"https://api.github.com/repos/redoctopus/NeMo/milestones{/number}","notifications_url":"https://api.github.com/repos/redoctopus/NeMo/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/redoctopus/NeMo/labels{/name}","releases_url":"https://api.github.com/repos/redoctopus/NeMo/releases{/id}","deployments_url":"https://api.github.com/repos/redoctopus/NeMo/deployments","created_at":"2019-09-28T00:45:30Z","updated_at":"2019-11-20T19:38:53Z","pushed_at":"2019-11-21T22:26:46Z","git_url":"git://github.com/redoctopus/NeMo.git","ssh_url":"git@github.com:redoctopus/NeMo.git","clone_url":"https://github.com/redoctopus/NeMo.git","svn_url":"https://github.com/redoctopus/NeMo","homepage":"https://nvidia.github.io/NeMo/","size":16868,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":0,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"NVIDIA:master","ref":"master","sha":"a3e981420d5f803b7ab76160326c2668fc4a22af","user":{"login":"NVIDIA","id":1728152,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE3MjgxNTI=","avatar_url":"https://avatars2.githubusercontent.com/u/1728152?v=4","gravatar_id":"","url":"https://api.github.com/users/NVIDIA","html_url":"https://github.com/NVIDIA","followers_url":"https://api.github.com/users/NVIDIA/followers","following_url":"https://api.github.com/users/NVIDIA/following{/other_user}","gists_url":"https://api.github.com/users/NVIDIA/gists{/gist_id}","starred_url":"https://api.github.com/users/NVIDIA/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/NVIDIA/subscriptions","organizations_url":"https://api.github.com/users/NVIDIA/orgs","repos_url":"https://api.github.com/users/NVIDIA/repos","events_url":"https://api.github.com/users/NVIDIA/events{/privacy}","received_events_url":"https://api.github.com/users/NVIDIA/received_events","type":"Organization","site_admin":false},"repo":{"id":200722670,"node_id":"MDEwOlJlcG9zaXRvcnkyMDA3MjI2NzA=","name":"NeMo","full_name":"NVIDIA/NeMo","private":false,"owner":{"login":"NVIDIA","id":1728152,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE3MjgxNTI=","avatar_url":"https://avatars2.githubusercontent.com/u/1728152?v=4","gravatar_id":"","url":"https://api.github.com/users/NVIDIA","html_url":"https://github.com/NVIDIA","followers_url":"https://api.github.com/users/NVIDIA/followers","following_url":"https://api.github.com/users/NVIDIA/following{/other_user}","gists_url":"https://api.github.com/users/NVIDIA/gists{/gist_id}","starred_url":"https://api.github.com/users/NVIDIA/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/NVIDIA/subscriptions","organizations_url":"https://api.github.com/users/NVIDIA/orgs","repos_url":"https://api.github.com/users/NVIDIA/repos","events_url":"https://api.github.com/users/NVIDIA/events{/privacy}","received_events_url":"https://api.github.com/users/NVIDIA/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/NVIDIA/NeMo","description":"Neural Modules: a toolkit for conversational AI","fork":false,"url":"https://api.github.com/repos/NVIDIA/NeMo","forks_url":"https://api.github.com/repos/NVIDIA/NeMo/forks","keys_url":"https://api.github.com/repos/NVIDIA/NeMo/keys{/key_id}","collaborators_url":"https://api.github.com/repos/NVIDIA/NeMo/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/NVIDIA/NeMo/teams","hooks_url":"https://api.github.com/repos/NVIDIA/NeMo/hooks","issue_events_url":"https://api.github.com/repos/NVIDIA/NeMo/issues/events{/number}","events_url":"https://api.github.com/repos/NVIDIA/NeMo/events","assignees_url":"https://api.github.com/repos/NVIDIA/NeMo/assignees{/user}","branches_url":"https://api.github.com/repos/NVIDIA/NeMo/branches{/branch}","tags_url":"https://api.github.com/repos/NVIDIA/NeMo/tags","blobs_url":"https://api.github.com/repos/NVIDIA/NeMo/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/NVIDIA/NeMo/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/NVIDIA/NeMo/git/refs{/sha}","trees_url":"https://api.github.com/repos/NVIDIA/NeMo/git/trees{/sha}","statuses_url":"https://api.github.com/repos/NVIDIA/NeMo/statuses/{sha}","languages_url":"https://api.github.com/repos/NVIDIA/NeMo/languages","stargazers_url":"https://api.github.com/repos/NVIDIA/NeMo/stargazers","contributors_url":"https://api.github.com/repos/NVIDIA/NeMo/contributors","subscribers_url":"https://api.github.com/repos/NVIDIA/NeMo/subscribers","subscription_url":"https://api.github.com/repos/NVIDIA/NeMo/subscription","commits_url":"https://api.github.com/repos/NVIDIA/NeMo/commits{/sha}","git_commits_url":"https://api.github.com/repos/NVIDIA/NeMo/git/commits{/sha}","comments_url":"https://api.github.com/repos/NVIDIA/NeMo/comments{/number}","issue_comment_url":"https://api.github.com/repos/NVIDIA/NeMo/issues/comments{/number}","contents_url":"https://api.github.com/repos/NVIDIA/NeMo/contents/{+path}","compare_url":"https://api.github.com/repos/NVIDIA/NeMo/compare/{base}...{head}","merges_url":"https://api.github.com/repos/NVIDIA/NeMo/merges","archive_url":"https://api.github.com/repos/NVIDIA/NeMo/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/NVIDIA/NeMo/downloads","issues_url":"https://api.github.com/repos/NVIDIA/NeMo/issues{/number}","pulls_url":"https://api.github.com/repos/NVIDIA/NeMo/pulls{/number}","milestones_url":"https://api.github.com/repos/NVIDIA/NeMo/milestones{/number}","notifications_url":"https://api.github.com/repos/NVIDIA/NeMo/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/NVIDIA/NeMo/labels{/name}","releases_url":"https://api.github.com/repos/NVIDIA/NeMo/releases{/id}","deployments_url":"https://api.github.com/repos/NVIDIA/NeMo/deployments","created_at":"2019-08-05T20:16:42Z","updated_at":"2019-11-21T22:56:31Z","pushed_at":"2019-11-21T23:15:25Z","git_url":"git://github.com/NVIDIA/NeMo.git","ssh_url":"git@github.com:NVIDIA/NeMo.git","clone_url":"https://github.com/NVIDIA/NeMo.git","svn_url":"https://github.com/NVIDIA/NeMo","homepage":"https://nvidia.github.io/NeMo/","size":17044,"stargazers_count":840,"watchers_count":840,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":83,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":9,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":83,"open_issues":9,"watchers":840,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/NVIDIA/NeMo/pulls/138"},"html":{"href":"https://github.com/NVIDIA/NeMo/pull/138"},"issue":{"href":"https://api.github.com/repos/NVIDIA/NeMo/issues/138"},"comments":{"href":"https://api.github.com/repos/NVIDIA/NeMo/issues/138/comments"},"review_comments":{"href":"https://api.github.com/repos/NVIDIA/NeMo/pulls/138/comments"},"review_comment":{"href":"https://api.github.com/repos/NVIDIA/NeMo/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/NVIDIA/NeMo/pulls/138/commits"},"statuses":{"href":"https://api.github.com/repos/NVIDIA/NeMo/statuses/ff473b55f59611064a65e8054ea245a957a16879"}},"author_association":"COLLABORATOR"}}
{"actor":{"display_login":"blisc"}}