{"action":"created","comment":{"url":"https://api.github.com/repos/freewym/kaldi/pulls/comments/43653105","id":43653105,"diff_hunk":"@@ -0,0 +1,235 @@\n+#!/usr/bin/env python\n+\n+from __future__ import print_function\n+import os\n+import argparse\n+import sys\n+import warnings\n+import copy\n+import imp\n+\n+nodes = imp.load_source('', 'steps/nnet3/components.py')\n+\n+def PrintConfig(file_name, config_lines):\n+    f = open(file_name, 'w')\n+    f.write(\"\\n\".join(config_lines['components'])+\"\\n\")\n+    f.write(\"\\n#Component nodes\\n\")\n+    f.write(\"\\n\".join(config_lines['component-nodes']))\n+    f.close()\n+\n+def ParseSpliceString(splice_indexes, label_delay=None):\n+    ## Work out splice_array e.g. splice_array = [ [ -3,-2,...3 ], [0], [-2,2], .. [ -8,8 ] ]\n+    split1 = splice_indexes.split(\" \");  # we already checked the string is nonempty.\n+    if len(split1) < 1:\n+        splice_indexes = \"0\"\n+\n+    left_context=0\n+    right_context=0\n+    if label_delay is not None:\n+        left_context = -label_delay\n+        right_context = label_delay\n+\n+    splice_array = []\n+    try:\n+        for i in range(len(split1)):\n+            indexes = map(lambda x: int(x), split1[i].strip().split(\",\"))\n+            print(indexes)\n+            if len(indexes) < 1:\n+                raise ValueError(\"invalid --splice-indexes argument, too-short element: \"\n+                                + splice_indexes)\n+\n+            if (i > 0)  and ((len(indexes) != 1) or (indexes[0] != 0)):\n+                raise ValueError(\"elements of --splice-indexes splicing is only allowed initial layer.\")\n+\n+            if not indexes == sorted(indexes):\n+                raise ValueError(\"elements of --splice-indexes must be sorted: \"\n+                                + splice_indexes)\n+            left_context += -indexes[0]\n+            right_context += indexes[-1]\n+            splice_array.append(indexes)\n+    except ValueError as e:\n+        raise ValueError(\"invalid --splice-indexes argument \" + splice_indexes + str(e))\n+\n+    left_context = max(0, left_context)\n+    right_context = max(0, right_context)\n+\n+    return {'left_context':left_context,\n+            'right_context':right_context,\n+            'splice_indexes':splice_array,\n+            'num_hidden_layers':len(splice_array)\n+            }\n+\n+def ParseLstmDelayString(lstm_delay):\n+    ## Work out lstm_delay e.g. lstm_delay = [ [-1], [-1, 1], [-2] ]\n+    split1 = lstm_delay.split(\" \");\n+    lstm_delay_array = []\n+    try:\n+        for i in range(len(split1)):\n+            indexes = map(lambda x: int(x), split1[i].strip().split(\",\"))\n+            print(indexes)\n+            if len(indexes) < 1:\n+                raise ValueError(\"invalid --lstm-delay argument, too-short element: \"\n+                                + lstm_delay)\n+            lstm_delay_array.append(indexes)\n+    except ValueError as e:\n+        raise ValueError(\"invalid --lstm-delay argument \" + lstm_delay + str(e))\n+\n+    return lstm_delay_array\n+\n+   \n+if __name__ == \"__main__\":\n+    # we add compulsary arguments as named arguments for readability\n+    parser = argparse.ArgumentParser(description=\"Writes config files and variables \"\n+                                                 \"for LSTMs creation and training\",\n+                                     epilog=\"See steps/nnet3/lstm/train.sh for example.\")\n+    # General neural network options\n+    parser.add_argument(\"--splice-indexes\", type=str,\n+                        help=\"Splice indexes at input layer, e.g. '-3,-2,-1,0,1,2,3' [compulsary argument]\", default=\"0\")\n+    parser.add_argument(\"--feat-dim\", type=int,\n+                        help=\"Raw feature dimension, e.g. 13\")\n+    parser.add_argument(\"--ivector-dim\", type=int,\n+                        help=\"iVector dimension, e.g. 100\", default=0)\n+\n+    # LSTM options\n+    parser.add_argument(\"--num-lstm-layers\", type=int,\n+                        help=\"Number of LSTM layers to be stacked\", default=1)\n+    parser.add_argument(\"--cell-dim\", type=int,\n+                        help=\"dimension of lstm-cell\")\n+    parser.add_argument(\"--recurrent-projection-dim\", type=int,\n+                        help=\"dimension of recurrent projection\")\n+    parser.add_argument(\"--non-recurrent-projection-dim\", type=int,\n+                        help=\"dimension of non-recurrent projection\")\n+    parser.add_argument(\"--hidden-dim\", type=int,\n+                        help=\"dimension of fully-connected layers\")\n+\n+    # Natural gradient options\n+    parser.add_argument(\"--ng-per-element-scale-options\", type=str,\n+                        help=\"options to be supplied to NaturalGradientPerElementScaleComponent\", default=\"\")\n+    parser.add_argument(\"--ng-affine-options\", type=str,\n+                        help=\"options to be supplied to NaturalGradientAffineComponent\", default=\"\")\n+\n+    # Gradient clipper options\n+    parser.add_argument(\"--norm-based-clipping\", type=str,\n+                        help=\"use norm based clipping in ClipGradient components \", default=\"false\", choices = [\"false\", \"true\"])\n+    parser.add_argument(\"--clipping-threshold\", type=float,\n+                        help=\"clipping threshold used in ClipGradient components, if clipping-threshold=0 no clipping is done\", default=15)\n+\n+    parser.add_argument(\"--num-targets\", type=int,\n+                        help=\"number of network targets (e.g. num-pdf-ids/num-leaves)\")\n+    parser.add_argument(\"config_dir\",\n+                        help=\"Directory to write config files and variables\")\n+\n+    # Delay options\n+    parser.add_argument(\"--label-delay\", type=int, default=None,\n+                        help=\"option to delay the labels to make the lstm robust\")\n+\n+    parser.add_argument(\"--lstm-delay\", type=str, default=None,\n+                        help=\"option to have different delays in recurrence for each lstm\")\n+\n+\n+\n+    print(' '.join(sys.argv))\n+\n+    args = parser.parse_args()\n+\n+    if not os.path.exists(args.config_dir):\n+        os.makedirs(args.config_dir)\n+\n+    ## Check arguments.\n+    if args.splice_indexes is None:\n+        sys.exit(\"--splice-indexes argument is required\")\n+    if args.feat_dim is None or not (args.feat_dim > 0):\n+        sys.exit(\"--feat-dim argument is required\")\n+    if args.num_targets is None or not (args.num_targets > 0):\n+        sys.exit(\"--feat-dim argument is required\")\n+    if (args.num_lstm_layers < 1):\n+        sys.exit(\"--num-lstm-layers has to be a positive integer\")\n+    if (args.clipping_threshold < 0):\n+        sys.exit(\"--clipping-threshold has to be a non-negative\")\n+    if args.lstm_delay is None:\n+        lstm_delay = [-1] * args.num_lstm_layers\n+    else:\n+        try:\n+            lstm_delay = ParseLstmDelayString(args.lstm_delay.strip())\n+        except ValueError:\n+            sys.exit(\"--lstm-delay has incorrect format value. Provided value is '{0}'\".format(args.lstm_delay))\n+        if len(lstm_delay) != args.num_lstm_layers:\n+            sys.exit(\"--lstm-delay: Number of delays provided has to match --num-lstm-layers\")\n+\n+    parsed_splice_output = ParseSpliceString(args.splice_indexes.strip(), args.label_delay)\n+    left_context = parsed_splice_output['left_context']\n+    right_context = parsed_splice_output['right_context']\n+    num_hidden_layers = parsed_splice_output['num_hidden_layers']\n+    splice_indexes = parsed_splice_output['splice_indexes']\n+\n+    if (num_hidden_layers < args.num_lstm_layers):\n+        sys.exit(\"--num-lstm-layers : number of lstm layers has to be greater than number of layers, decided based on splice-indexes\")\n+\n+    # write the files used by other scripts like steps/nnet3/get_egs.sh\n+    f = open(args.config_dir + \"/vars\", \"w\")\n+    print('model_left_context=' + str(left_context), file=f)\n+    print('model_right_context=' + str(right_context), file=f)\n+    print('num_hidden_layers=' + str(num_hidden_layers), file=f)\n+    # print('initial_right_context=' + str(splice_array[0][-1]), file=f)\n+    f.close()\n+\n+    config_lines = {'components':[], 'component-nodes':[]}\n+\n+    config_files={}\n+    prev_layer_output = nodes.AddInputLayer(config_lines, args.feat_dim, splice_indexes[0], args.ivector_dim)\n+\n+    # Add the init config lines for estimating the preconditioning matrices\n+    init_config_lines = copy.deepcopy(config_lines)\n+    init_config_lines['components'].insert(0, '# Config file for initializing neural network prior to')\n+    init_config_lines['components'].insert(0, '# preconditioning matrix computation')\n+    nodes.AddOutputNode(init_config_lines, prev_layer_output)\n+    config_files[args.config_dir + '/init.config'] = init_config_lines\n+\n+    prev_layer_output = nodes.AddLdaLayer(config_lines, \"L0\", prev_layer_output, args.config_dir + '/lda.mat')\n+\n+    for i in range(args.num_lstm_layers):\n+\tif len(lstm_delay[i]) == 2: # BLSTM layer case, add both forward and backward","path":"egs/wsj/s5/steps/nnet3/blstm/make_configs.py","position":191,"original_position":191,"commit_id":"4e71866c1b198fbd0cda8e6fc4e4f530bb537f9b","original_commit_id":"4e71866c1b198fbd0cda8e6fc4e4f530bb537f9b","user":{"login":"vijayaditya","id":3895456,"avatar_url":"https://avatars.githubusercontent.com/u/3895456?v=3","gravatar_id":"","url":"https://api.github.com/users/vijayaditya","html_url":"https://github.com/vijayaditya","followers_url":"https://api.github.com/users/vijayaditya/followers","following_url":"https://api.github.com/users/vijayaditya/following{/other_user}","gists_url":"https://api.github.com/users/vijayaditya/gists{/gist_id}","starred_url":"https://api.github.com/users/vijayaditya/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/vijayaditya/subscriptions","organizations_url":"https://api.github.com/users/vijayaditya/orgs","repos_url":"https://api.github.com/users/vijayaditya/repos","events_url":"https://api.github.com/users/vijayaditya/events{/privacy}","received_events_url":"https://api.github.com/users/vijayaditya/received_events","type":"User","site_admin":false},"body":"assert that the delays are positive and negative","created_at":"2015-11-02T17:12:05Z","updated_at":"2015-11-02T17:12:05Z","html_url":"https://github.com/freewym/kaldi/pull/2#discussion_r43653105","pull_request_url":"https://api.github.com/repos/freewym/kaldi/pulls/2","_links":{"self":{"href":"https://api.github.com/repos/freewym/kaldi/pulls/comments/43653105"},"html":{"href":"https://github.com/freewym/kaldi/pull/2#discussion_r43653105"},"pull_request":{"href":"https://api.github.com/repos/freewym/kaldi/pulls/2"}}},"pull_request":{"url":"https://api.github.com/repos/freewym/kaldi/pulls/2","id":48957362,"html_url":"https://github.com/freewym/kaldi/pull/2","diff_url":"https://github.com/freewym/kaldi/pull/2.diff","patch_url":"https://github.com/freewym/kaldi/pull/2.patch","issue_url":"https://api.github.com/repos/freewym/kaldi/issues/2","number":2,"state":"open","locked":false,"title":"Blstm","user":{"login":"freewym","id":3506322,"avatar_url":"https://avatars.githubusercontent.com/u/3506322?v=3","gravatar_id":"","url":"https://api.github.com/users/freewym","html_url":"https://github.com/freewym","followers_url":"https://api.github.com/users/freewym/followers","following_url":"https://api.github.com/users/freewym/following{/other_user}","gists_url":"https://api.github.com/users/freewym/gists{/gist_id}","starred_url":"https://api.github.com/users/freewym/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/freewym/subscriptions","organizations_url":"https://api.github.com/users/freewym/orgs","repos_url":"https://api.github.com/users/freewym/repos","events_url":"https://api.github.com/users/freewym/events{/privacy}","received_events_url":"https://api.github.com/users/freewym/received_events","type":"User","site_admin":false},"body":"","created_at":"2015-10-28T02:19:33Z","updated_at":"2015-11-02T17:12:05Z","closed_at":null,"merged_at":null,"merge_commit_sha":"5b8ecd16be9cd220b508f0227db19f5d1773f201","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/freewym/kaldi/pulls/2/commits","review_comments_url":"https://api.github.com/repos/freewym/kaldi/pulls/2/comments","review_comment_url":"https://api.github.com/repos/freewym/kaldi/pulls/comments{/number}","comments_url":"https://api.github.com/repos/freewym/kaldi/issues/2/comments","statuses_url":"https://api.github.com/repos/freewym/kaldi/statuses/4e71866c1b198fbd0cda8e6fc4e4f530bb537f9b","head":{"label":"freewym:blstm","ref":"blstm","sha":"4e71866c1b198fbd0cda8e6fc4e4f530bb537f9b","user":{"login":"freewym","id":3506322,"avatar_url":"https://avatars.githubusercontent.com/u/3506322?v=3","gravatar_id":"","url":"https://api.github.com/users/freewym","html_url":"https://github.com/freewym","followers_url":"https://api.github.com/users/freewym/followers","following_url":"https://api.github.com/users/freewym/following{/other_user}","gists_url":"https://api.github.com/users/freewym/gists{/gist_id}","starred_url":"https://api.github.com/users/freewym/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/freewym/subscriptions","organizations_url":"https://api.github.com/users/freewym/orgs","repos_url":"https://api.github.com/users/freewym/repos","events_url":"https://api.github.com/users/freewym/events{/privacy}","received_events_url":"https://api.github.com/users/freewym/received_events","type":"User","site_admin":false},"repo":{"id":41891891,"name":"kaldi","full_name":"freewym/kaldi","owner":{"login":"freewym","id":3506322,"avatar_url":"https://avatars.githubusercontent.com/u/3506322?v=3","gravatar_id":"","url":"https://api.github.com/users/freewym","html_url":"https://github.com/freewym","followers_url":"https://api.github.com/users/freewym/followers","following_url":"https://api.github.com/users/freewym/following{/other_user}","gists_url":"https://api.github.com/users/freewym/gists{/gist_id}","starred_url":"https://api.github.com/users/freewym/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/freewym/subscriptions","organizations_url":"https://api.github.com/users/freewym/orgs","repos_url":"https://api.github.com/users/freewym/repos","events_url":"https://api.github.com/users/freewym/events{/privacy}","received_events_url":"https://api.github.com/users/freewym/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/freewym/kaldi","description":"This is now the official location of the Kaldi project.","fork":true,"url":"https://api.github.com/repos/freewym/kaldi","forks_url":"https://api.github.com/repos/freewym/kaldi/forks","keys_url":"https://api.github.com/repos/freewym/kaldi/keys{/key_id}","collaborators_url":"https://api.github.com/repos/freewym/kaldi/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/freewym/kaldi/teams","hooks_url":"https://api.github.com/repos/freewym/kaldi/hooks","issue_events_url":"https://api.github.com/repos/freewym/kaldi/issues/events{/number}","events_url":"https://api.github.com/repos/freewym/kaldi/events","assignees_url":"https://api.github.com/repos/freewym/kaldi/assignees{/user}","branches_url":"https://api.github.com/repos/freewym/kaldi/branches{/branch}","tags_url":"https://api.github.com/repos/freewym/kaldi/tags","blobs_url":"https://api.github.com/repos/freewym/kaldi/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/freewym/kaldi/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/freewym/kaldi/git/refs{/sha}","trees_url":"https://api.github.com/repos/freewym/kaldi/git/trees{/sha}","statuses_url":"https://api.github.com/repos/freewym/kaldi/statuses/{sha}","languages_url":"https://api.github.com/repos/freewym/kaldi/languages","stargazers_url":"https://api.github.com/repos/freewym/kaldi/stargazers","contributors_url":"https://api.github.com/repos/freewym/kaldi/contributors","subscribers_url":"https://api.github.com/repos/freewym/kaldi/subscribers","subscription_url":"https://api.github.com/repos/freewym/kaldi/subscription","commits_url":"https://api.github.com/repos/freewym/kaldi/commits{/sha}","git_commits_url":"https://api.github.com/repos/freewym/kaldi/git/commits{/sha}","comments_url":"https://api.github.com/repos/freewym/kaldi/comments{/number}","issue_comment_url":"https://api.github.com/repos/freewym/kaldi/issues/comments{/number}","contents_url":"https://api.github.com/repos/freewym/kaldi/contents/{+path}","compare_url":"https://api.github.com/repos/freewym/kaldi/compare/{base}...{head}","merges_url":"https://api.github.com/repos/freewym/kaldi/merges","archive_url":"https://api.github.com/repos/freewym/kaldi/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/freewym/kaldi/downloads","issues_url":"https://api.github.com/repos/freewym/kaldi/issues{/number}","pulls_url":"https://api.github.com/repos/freewym/kaldi/pulls{/number}","milestones_url":"https://api.github.com/repos/freewym/kaldi/milestones{/number}","notifications_url":"https://api.github.com/repos/freewym/kaldi/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/freewym/kaldi/labels{/name}","releases_url":"https://api.github.com/repos/freewym/kaldi/releases{/id}","created_at":"2015-09-04T01:18:16Z","updated_at":"2015-09-04T01:18:25Z","pushed_at":"2015-10-30T04:04:06Z","git_url":"git://github.com/freewym/kaldi.git","ssh_url":"git@github.com:freewym/kaldi.git","clone_url":"https://github.com/freewym/kaldi.git","svn_url":"https://github.com/freewym/kaldi","homepage":"http://kaldi-asr.org","size":73563,"stargazers_count":0,"watchers_count":0,"language":"C++","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":2,"forks":0,"open_issues":2,"watchers":0,"default_branch":"master"}},"base":{"label":"freewym:master","ref":"master","sha":"b31fe616fcb9a43558c8a3f3bca55650a1f47562","user":{"login":"freewym","id":3506322,"avatar_url":"https://avatars.githubusercontent.com/u/3506322?v=3","gravatar_id":"","url":"https://api.github.com/users/freewym","html_url":"https://github.com/freewym","followers_url":"https://api.github.com/users/freewym/followers","following_url":"https://api.github.com/users/freewym/following{/other_user}","gists_url":"https://api.github.com/users/freewym/gists{/gist_id}","starred_url":"https://api.github.com/users/freewym/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/freewym/subscriptions","organizations_url":"https://api.github.com/users/freewym/orgs","repos_url":"https://api.github.com/users/freewym/repos","events_url":"https://api.github.com/users/freewym/events{/privacy}","received_events_url":"https://api.github.com/users/freewym/received_events","type":"User","site_admin":false},"repo":{"id":41891891,"name":"kaldi","full_name":"freewym/kaldi","owner":{"login":"freewym","id":3506322,"avatar_url":"https://avatars.githubusercontent.com/u/3506322?v=3","gravatar_id":"","url":"https://api.github.com/users/freewym","html_url":"https://github.com/freewym","followers_url":"https://api.github.com/users/freewym/followers","following_url":"https://api.github.com/users/freewym/following{/other_user}","gists_url":"https://api.github.com/users/freewym/gists{/gist_id}","starred_url":"https://api.github.com/users/freewym/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/freewym/subscriptions","organizations_url":"https://api.github.com/users/freewym/orgs","repos_url":"https://api.github.com/users/freewym/repos","events_url":"https://api.github.com/users/freewym/events{/privacy}","received_events_url":"https://api.github.com/users/freewym/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/freewym/kaldi","description":"This is now the official location of the Kaldi project.","fork":true,"url":"https://api.github.com/repos/freewym/kaldi","forks_url":"https://api.github.com/repos/freewym/kaldi/forks","keys_url":"https://api.github.com/repos/freewym/kaldi/keys{/key_id}","collaborators_url":"https://api.github.com/repos/freewym/kaldi/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/freewym/kaldi/teams","hooks_url":"https://api.github.com/repos/freewym/kaldi/hooks","issue_events_url":"https://api.github.com/repos/freewym/kaldi/issues/events{/number}","events_url":"https://api.github.com/repos/freewym/kaldi/events","assignees_url":"https://api.github.com/repos/freewym/kaldi/assignees{/user}","branches_url":"https://api.github.com/repos/freewym/kaldi/branches{/branch}","tags_url":"https://api.github.com/repos/freewym/kaldi/tags","blobs_url":"https://api.github.com/repos/freewym/kaldi/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/freewym/kaldi/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/freewym/kaldi/git/refs{/sha}","trees_url":"https://api.github.com/repos/freewym/kaldi/git/trees{/sha}","statuses_url":"https://api.github.com/repos/freewym/kaldi/statuses/{sha}","languages_url":"https://api.github.com/repos/freewym/kaldi/languages","stargazers_url":"https://api.github.com/repos/freewym/kaldi/stargazers","contributors_url":"https://api.github.com/repos/freewym/kaldi/contributors","subscribers_url":"https://api.github.com/repos/freewym/kaldi/subscribers","subscription_url":"https://api.github.com/repos/freewym/kaldi/subscription","commits_url":"https://api.github.com/repos/freewym/kaldi/commits{/sha}","git_commits_url":"https://api.github.com/repos/freewym/kaldi/git/commits{/sha}","comments_url":"https://api.github.com/repos/freewym/kaldi/comments{/number}","issue_comment_url":"https://api.github.com/repos/freewym/kaldi/issues/comments{/number}","contents_url":"https://api.github.com/repos/freewym/kaldi/contents/{+path}","compare_url":"https://api.github.com/repos/freewym/kaldi/compare/{base}...{head}","merges_url":"https://api.github.com/repos/freewym/kaldi/merges","archive_url":"https://api.github.com/repos/freewym/kaldi/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/freewym/kaldi/downloads","issues_url":"https://api.github.com/repos/freewym/kaldi/issues{/number}","pulls_url":"https://api.github.com/repos/freewym/kaldi/pulls{/number}","milestones_url":"https://api.github.com/repos/freewym/kaldi/milestones{/number}","notifications_url":"https://api.github.com/repos/freewym/kaldi/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/freewym/kaldi/labels{/name}","releases_url":"https://api.github.com/repos/freewym/kaldi/releases{/id}","created_at":"2015-09-04T01:18:16Z","updated_at":"2015-09-04T01:18:25Z","pushed_at":"2015-10-30T04:04:06Z","git_url":"git://github.com/freewym/kaldi.git","ssh_url":"git@github.com:freewym/kaldi.git","clone_url":"https://github.com/freewym/kaldi.git","svn_url":"https://github.com/freewym/kaldi","homepage":"http://kaldi-asr.org","size":73563,"stargazers_count":0,"watchers_count":0,"language":"C++","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":2,"forks":0,"open_issues":2,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/freewym/kaldi/pulls/2"},"html":{"href":"https://github.com/freewym/kaldi/pull/2"},"issue":{"href":"https://api.github.com/repos/freewym/kaldi/issues/2"},"comments":{"href":"https://api.github.com/repos/freewym/kaldi/issues/2/comments"},"review_comments":{"href":"https://api.github.com/repos/freewym/kaldi/pulls/2/comments"},"review_comment":{"href":"https://api.github.com/repos/freewym/kaldi/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/freewym/kaldi/pulls/2/commits"},"statuses":{"href":"https://api.github.com/repos/freewym/kaldi/statuses/4e71866c1b198fbd0cda8e6fc4e4f530bb537f9b"}}}}