{"action":"created","comment":{"url":"https://api.github.com/repos/kaldi-asr/kaldi/pulls/comments/184836174","pull_request_review_id":116117524,"id":184836174,"diff_hunk":"@@ -0,0 +1,587 @@\n+#!/usr/bin/env python3\n+# Copyright   2018 Ashish Arora\n+# Apache 2.0\n+# minimum bounding box part in this script is originally from\n+#https://github.com/BebeSparkelSparkel/MinimumBoundingBox\n+\n+\"\"\" This module will be used for extracting line images from page image.\n+ Given the word segmentation (bounding box around a word) for  every word, it will\n+ extract line segmentation. To extract line segmentation, it will take word bounding\n+ boxes of a line as input, will create a minimum area bounding box that will contain \n+ all corner points of word bounding boxes. The obtained bounding box (will not necessarily \n+ be vertically or horizontally aligned). Hence to extract line image from line bounding box,\n+ page image is rotated and line image is cropped and saved.\n+ Args:\n+  database_path1: Path to the downloaded (and extracted) madcat data directory 1\n+          Eg. /export/corpora/LDC/LDC2012T15\n+  database_path2: Path to the downloaded (and extracted) madcat data directory 2\n+          Eg. /export/corpora/LDC/LDC2013T09\n+  database_path3: Path to the downloaded (and extracted) madcat data directory 3\n+          Eg. /export/corpora/LDC/LDC2013T15\n+  data_splits: Path to file that contains the train,test or development split information.\n+               There are total 3 split files. one of train, test and dev each.\n+          Eg. /home/kduh/proj/scale2018/data/madcat_datasplit/ar-en/madcat.train.raw.lineid\n+             groups.google.com_women1000_508c404bd84f8ba3_ARB_20060426_124900_3_LDC0188.madcat.xml s1\n+             <xml file name> <scribe id>\n+  out_dir: Directory location to write output files\n+  Eg. local/create_line_image_from_page_image.py /export/corpora/LDC/LDC2012T15 /export/corpora/LDC/LDC2013T09 \n+      /export/corpora/LDC/LDC2013T15 /home/kduh/proj/scale2018/data/madcat_datasplit/ar-en/madcat.train.raw.lineid\n+      data/local/lines\n+\"\"\"\n+\n+import sys\n+import argparse\n+import os\n+import xml.dom.minidom as minidom\n+import numpy as np\n+from math import atan2, cos, sin, pi, degrees, sqrt\n+from collections import namedtuple\n+\n+#Temporary change\n+from scipy.spatial import ConvexHull\n+#from skimage.io import imread, imsave\n+#from skimage.transform import rotate\n+#from skimage import img_as_uint\n+from PIL import Image\n+from scipy.misc import toimage\n+\n+parser = argparse.ArgumentParser(description=\"Creates line images from page image\",\n+                                 epilog=\"E.g.  \" + sys.argv[0] + \"  data/LDC2012T15\" \n+                                             \" data/LDC2013T09 data/LDC2013T15 data/madcat.train.raw.lineid \"\n+                                             \" data/local/lines \",\n+                                formatter_class=argparse.ArgumentDefaultsHelpFormatter)\n+parser.add_argument('database_path1', type=str,\n+                    help='Path to the downloaded madcat data directory 1')\n+parser.add_argument('data_splits', type=str,\n+                    help='Path to file that contains the train/test/dev split information')\n+parser.add_argument('out_dir', type=str,\n+                    help='directory location to write output files')\n+parser.add_argument('--padding', type=int, default=400,\n+                    help='padding across horizontal/verticle direction')\n+args = parser.parse_args()\n+\n+\"\"\"\n+bounding_box is a named tuple which contains:\n+\n+             area (float): area of the rectangle\n+             length_parallel (float): length of the side that is parallel to unit_vector\n+             length_orthogonal (float): length of the side that is orthogonal to unit_vector\n+             rectangle_center(int, int): coordinates of the rectangle center\n+             (use rectangle_corners to get the corner points of the rectangle)\n+             unit_vector (float, float): direction of the length_parallel side.\n+             (it's orthogonal vector can be found with the orthogonal_vector function\n+             unit_vector_angle (float): angle of the unit vector to be in radians.\n+             corner_points [(float, float)]: set that contains the corners of the rectangle\n+\"\"\"\n+\n+bounding_box_tuple = namedtuple('bounding_box_tuple', 'area '\n+                                        'length_parallel '\n+                                        'length_orthogonal '\n+                                        'rectangle_center '\n+                                        'unit_vector '\n+                                        'unit_vector_angle '\n+                                        'corner_points'\n+                         )\n+\n+def unit_vector(pt0, pt1):\n+    \"\"\" Returns an unit vector that points in the direction of pt0 to pt1.\n+    Args:\n+        pt0 (float, float): Point 0. Eg. (1.0, 2.0).\n+        pt1 (float, float): Point 1. Eg. (3.0, 8.0).\n+\n+    Returns:\n+        (float, float): unit vector that points in the direction of pt0 to pt1.\n+        Eg.  0.31622776601683794, 0.9486832980505138\n+    \"\"\"\n+    dis_0_to_1 = sqrt((pt0[0] - pt1[0])**2 + (pt0[1] - pt1[1])**2)\n+    return (pt1[0] - pt0[0]) / dis_0_to_1, \\\n+           (pt1[1] - pt0[1]) / dis_0_to_1\n+\n+\n+def orthogonal_vector(vector):\n+    \"\"\" From vector returns a orthogonal/perpendicular vector of equal length.\n+    Args:\n+        vector (float, float): A vector. Eg. (0.31622776601683794, 0.9486832980505138).\n+\n+    Returns:\n+        (float, float): A vector that points in the direction orthogonal to vector.\n+        Eg. - 0.9486832980505138,0.31622776601683794\n+    \"\"\"\n+    return -1 * vector[1], vector[0]\n+\n+\n+def bounding_area(index, hull):\n+    \"\"\" Returns a named tuple that mainly contains area of the box that bounds\n+        the hull. This bounding box orintation is same as the orientation of the \n+        lines formed by the point hull[index] and hull[index+1].\n+    Args:\n+        index (int): Eg. 1.\n+        hull [(float, float)]: list or tuple of point cloud\n+        Eg. ((1.0, -1.0), (2.0, -3.0), (3.0, 4.0), (5.0, 6.0)).\n+\n+    Returns: a named tuple that contains:\n+             area: area of the rectangle\n+             length_parallel: length of the side that is parallel to unit_vector\n+             length_orthogonal: length of the side that is orthogonal to unit_vector\n+             rectangle_center: coordinates of the rectangle center\n+             (use rectangle_corners to get the corner points of the rectangle)\n+             unit_vector: direction of the length_parallel side.\n+             (it's orthogonal vector can be found with the orthogonal_vector function\n+    \"\"\"\n+    unit_vector_p = unit_vector(hull[index], hull[index+1])\n+    unit_vector_o = orthogonal_vector(unit_vector_p)\n+\n+    dis_p = tuple(np.dot(unit_vector_p, pt) for pt in hull)\n+    dis_o = tuple(np.dot(unit_vector_o, pt) for pt in hull)\n+\n+    min_p = min(dis_p)\n+    min_o = min(dis_o)\n+    len_p = max(dis_p) - min_p\n+    len_o = max(dis_o) - min_o\n+\n+    return {'area': len_p * len_o,\n+            'length_parallel': len_p,\n+            'length_orthogonal': len_o,\n+            'rectangle_center': (min_p + len_p / 2, min_o + len_o / 2),\n+            'unit_vector': unit_vector_p,\n+            }\n+\n+\n+def to_xy_coordinates(unit_vector_angle, point):\n+    \"\"\" Returns converted unit vector coordinates in x, y coordinates.\n+    Args:\n+        unit_vector_angle (float): angle of unit vector to be in radians. \n+        Eg. 0.1543 .\n+        point (float, float): Point from origin. Eg. (1.0, 2.0).\n+\n+    Returns:\n+        (float, float): converted x,y coordinate of the unit vector.\n+        Eg. 0.680742447866183, 2.1299271629971663\n+    \"\"\"\n+    angle_orthogonal = unit_vector_angle + pi / 2\n+    return point[0] * cos(unit_vector_angle) + point[1] * cos(angle_orthogonal), \\\n+           point[0] * sin(unit_vector_angle) + point[1] * sin(angle_orthogonal)\n+\n+\n+def rotate_points(center_of_rotation, angle, points):\n+    \"\"\" Rotates a point cloud around the center_of_rotation point by angle\n+    Args:\n+        center_of_rotation (float, float): angle of unit vector to be in radians.\n+        Eg. (1.56, -23.4).\n+        angle (float): angle of rotation to be in radians. Eg. 0.1543 .\n+        points [(float, float)]: Points to be a list or tuple of points. Points to be rotated. \n+        Eg. ((1.56, -23.4), (1.56, -23.4))\n+\n+    Returns:\n+        [(float, float)]: Rotated points around center of rotation by angle\n+        Eg. ((1.16, -12.4), (2.34, -34.4))\n+    \"\"\"\n+\n+    rot_points = []\n+    ang = []\n+    for pt in points:\n+        diff = tuple([pt[d] - center_of_rotation[d] for d in range(2)])\n+        diff_angle = atan2(diff[1], diff[0]) + angle\n+        ang.append(diff_angle)\n+        diff_length = sqrt(sum([d**2 for d in diff]))\n+        rot_points.append((center_of_rotation[0] + diff_length * cos(diff_angle),\n+                           center_of_rotation[1] + diff_length * sin(diff_angle)))\n+\n+    return rot_points\n+\n+\n+def rectangle_corners(rectangle):\n+    \"\"\" Given rectangle center and its inclination. It returns the corner \n+        locations of the rectangle.\n+    Args:\n+        rectangle (bounding_box): the output of minimum bounding box rectangle\n+\n+    Returns:\n+    [(float, float)]: 4 corner points of rectangle.\n+        Eg. ((1.0, -1.0), (2.0, -3.0), (3.0, 4.0), (5.0, 6.0))\n+    \"\"\"\n+    corner_points = []\n+    for i1 in (.5, -.5):\n+        for i2 in (i1, -1 * i1):\n+            corner_points.append((rectangle['rectangle_center'][0] + i1 * rectangle['length_parallel'],\n+                            rectangle['rectangle_center'][1] + i2 * rectangle['length_orthogonal']))\n+\n+    return rotate_points(rectangle['rectangle_center'], rectangle['unit_vector_angle'], corner_points)\n+\n+\n+# use this function to find the listed properties of the minimum bounding box of a point cloud\n+def minimum_bounding_box(points):\n+    \"\"\" Given a point cloud, it returns the minimum area rectangle bounding all \n+        the points in the point cloud.\n+    Args:\n+        points [(float, float)]: points to be a list or tuple of 2D points\n+                                 needs to be more than 2 points\n+\n+    Returns: returns a namedtuple that contains:\n+             area: area of the rectangle\n+             length_parallel: length of the side that is parallel to unit_vector\n+             length_orthogonal: length of the side that is orthogonal to unit_vector\n+             rectangle_center: coordinates of the rectangle center\n+             (use rectangle_corners to get the corner points of the rectangle)\n+             unit_vector: direction of the length_parallel side. RADIANS\n+             (it's orthogonal vector can be found with the orthogonal_vector function\n+             unit_vector_angle: angle of the unit vector\n+             corner_points: set that contains the corners of the rectangle\n+    \"\"\"\n+\n+    if len(points) <= 2: raise ValueError('More than two points required.')\n+\n+    hull_ordered = [points[index] for index in ConvexHull(points).vertices]\n+    hull_ordered.append(hull_ordered[0])\n+    hull_ordered = tuple(hull_ordered)\n+\n+    min_rectangle = bounding_area(0, hull_ordered)\n+    for i in range(1, len(hull_ordered)-1):\n+        rectangle = bounding_area(i, hull_ordered)\n+        if rectangle['area'] < min_rectangle['area']:\n+            min_rectangle = rectangle\n+\n+    min_rectangle['unit_vector_angle'] = atan2(min_rectangle['unit_vector'][1], min_rectangle['unit_vector'][0])\n+    min_rectangle['rectangle_center'] = to_xy_coordinates(min_rectangle['unit_vector_angle'], min_rectangle['rectangle_center'])\n+\n+    return bounding_box_tuple(\n+        area=min_rectangle['area'],\n+        length_parallel=min_rectangle['length_parallel'],\n+        length_orthogonal=min_rectangle['length_orthogonal'],\n+        rectangle_center=min_rectangle['rectangle_center'],\n+        unit_vector=min_rectangle['unit_vector'],\n+        unit_vector_angle=min_rectangle['unit_vector_angle'],\n+        corner_points=set(rectangle_corners(min_rectangle))\n+    )\n+\n+\n+def get_center(im):\n+    \"\"\" Returns the center pixel location of an image\n+    Args:\n+        im: image \n+\n+    Returns:\n+        (int, int): center of the image\n+        Eg.  2550, 3300\n+    \"\"\"\n+    #Temporary change\n+    #center = im.shape\n+    #center_x = center[1] / 2\n+    #center_y = center[0] / 2\n+    center_x = im.size[0] / 2\n+    center_y = im.size[1] / 2\n+    return int(center_x), int(center_y)\n+\n+\n+def get_horizontal_angle(unit_vector_angle):\n+    \"\"\" Returns angle of the unit vector in first or fourth quadrant.\n+    Args:\n+        angle (float): angle of the unit vector to be in radians. Eg. 0.01543.\n+\n+    Returns:\n+        (float): updated angle of the unit vector to be in radians.\n+                 It is only in first or fourth quadrant.\n+        Eg. 0.01543.\n+    \"\"\"\n+\n+    if unit_vector_angle > pi / 2 and unit_vector_angle <= pi:\n+        unit_vector_angle = unit_vector_angle - pi\n+    elif unit_vector_angle > -pi and unit_vector_angle < -pi / 2:\n+        unit_vector_angle = unit_vector_angle + pi\n+\n+    return unit_vector_angle\n+\n+\n+def get_smaller_angle(bounding_box):\n+    \"\"\" Returns smallest absolute angle of a rectangle.\n+    Args:\n+        rectangle (bounding_box): bounding box rectangle\n+\n+    Returns:\n+        (float): smallest angle of the rectangle to be in radians.\n+        Eg. 0.01543.\n+    \"\"\"\n+\n+    unit_vector = bounding_box.unit_vector\n+    unit_vector_angle = bounding_box.unit_vector_angle\n+    ortho_vector = orthogonal_vector(unit_vector)\n+    ortho_vector_angle = atan2(ortho_vector[1], ortho_vector[0])\n+\n+    unit_vector_angle_updated = get_horizontal_angle(unit_vector_angle)\n+    ortho_vector_angle_updated = get_horizontal_angle(ortho_vector_angle)\n+\n+    if abs(unit_vector_angle_updated) < abs(ortho_vector_angle_updated):\n+        return unit_vector_angle_updated\n+    else:\n+        return ortho_vector_angle_updated\n+\n+\n+def rotated_points(bounding_box, center):\n+    \"\"\" Rotates the corners of a  bounding box rectangle around the center by smallest angle \n+        of the rectangle. It first finds the smallest angle of the rectangle\n+        then rotates it around the given center point.\n+    Args:\n+        rectangle (bounding_box): bounding box rectangle\n+        center (int, int): center point around which the corners of rectangle are rotated.\n+        Eg. (2550, 3300).\n+\n+    Returns: 4 corner points of rectangle.\n+        Eg. ((1.0, -1.0), (2.0, -3.0), (3.0, 4.0), (5.0, 6.0))\n+    \"\"\"\n+\n+    p1, p2, p3, p4 = bounding_box.corner_points\n+    x1, y1 = p1\n+    x2, y2 = p2\n+    x3, y3 = p3\n+    x4, y4 = p4\n+    center_x, center_y = center\n+    rotation_angle_in_rad = -get_smaller_angle(bounding_box)\n+    x_dash_1 = (x1 - center_x) * cos(rotation_angle_in_rad) - (y1 - center_y) * sin(rotation_angle_in_rad) + center_x\n+    x_dash_2 = (x2 - center_x) * cos(rotation_angle_in_rad) - (y2 - center_y) * sin(rotation_angle_in_rad) + center_x\n+    x_dash_3 = (x3 - center_x) * cos(rotation_angle_in_rad) - (y3 - center_y) * sin(rotation_angle_in_rad) + center_x\n+    x_dash_4 = (x4 - center_x) * cos(rotation_angle_in_rad) - (y4 - center_y) * sin(rotation_angle_in_rad) + center_x\n+\n+    y_dash_1 = (y1 - center_y) * cos(rotation_angle_in_rad) + (x1 - center_x) * sin(rotation_angle_in_rad) + center_y\n+    y_dash_2 = (y2 - center_y) * cos(rotation_angle_in_rad) + (x2 - center_x) * sin(rotation_angle_in_rad) + center_y\n+    y_dash_3 = (y3 - center_y) * cos(rotation_angle_in_rad) + (x3 - center_x) * sin(rotation_angle_in_rad) + center_y\n+    y_dash_4 = (y4 - center_y) * cos(rotation_angle_in_rad) + (x4 - center_x) * sin(rotation_angle_in_rad) + center_y\n+    return x_dash_1, y_dash_1, x_dash_2, y_dash_2, x_dash_3, y_dash_3, x_dash_4, y_dash_4\n+\n+\n+def pad_image(image):\n+    \"\"\" Pads the image around the border. It help in getting\n+        bounding boxes that are slightly outside the page boundary.\n+    Args:\n+        image: page image.\n+\n+    Returns:\n+        image: page image\n+    \"\"\"\n+\n+    #Temporary change\n+    #height = image.shape[0]\n+    #im_pad = np.concatenate((255 * np.ones((height, width_padding),\n+    #                                     dtype=int), image), axis=1)\n+    #im_pad1 = np.concatenate((im_pad, 255 * np.ones((height, width_padding),\n+    #                                              dtype=int)), axis=1)\n+\n+    #width = im_pad1.shape[1]\n+\n+    #im_pad2 = np.concatenate((255 * np.ones((height_padding, width),\n+    #                                      dtype=int), im_pad1), axis=0)\n+    #im_pad3 = np.concatenate((im_pad2, 255 * np.ones((height_padding, width),\n+    #                                               dtype=int)), axis=0)\n+\n+    padded_image = Image.new('RGB', (image.size[0] + padding, image.size[1] + padding), \"white\")\n+    padded_image.paste(im=image, box=(offset, offset))\n+    return padded_image\n+\n+\n+def update_minimum_bounding_box_input(bounding_box_input):\n+    \"\"\" Updates the word bounding box corner points.\n+    Args:\n+        points [(float, float)]: points, a list or tuple of 2D coordinates.\n+                                 ideally should be more than 2 points\n+    Returns:\n+        points [(float, float)]: points, a list or tuple of 2D coordinates\n+    \"\"\"\n+\n+    updated_minimum_bounding_box_input = []\n+    for point in bounding_box_input:\n+        x, y = point\n+        new_x = x + offset\n+        new_y = y + offset\n+        word_coordinate = (new_x, new_y)\n+        updated_minimum_bounding_box_input.append(word_coordinate)\n+\n+    return updated_minimum_bounding_box_input\n+\n+\n+def set_line_image_data(image, line_id, image_file_name):\n+    \"\"\" Flips a given line image and saves it. Line image file name \n+        is formed by appending the line id at the end page image name.\n+    Args:\n+        image: line image, non flipped\n+        line_id (string): id of the line image.\n+        image_file_name(string): name of the page image.\n+\n+    Returns:\n+    \"\"\"\n+\n+    base_name = os.path.splitext(os.path.basename(image_file_name))[0]\n+    image_file_name_wo_tif, b = image_file_name.split('.tif')\n+    line_id = '_' + line_id.zfill(4)\n+    line_image_file_name = base_name + line_id + '.tif'\n+    image_path = os.path.join(output_directory, line_image_file_name)\n+    #Temporary change\n+    #imgray_rev_arr = np.fliplr(image)\n+    #im = img_as_uint(imgray_rev_arr)\n+    #imsave(image_path, im)\n+    imgray = image.convert('L')\n+    imgray_rev_arr = np.fliplr(imgray)","path":"egs/madcat_zh/v1/local/create_line_image_from_page_image.py","position":421,"original_position":421,"commit_id":"6ebcbd195b61844d6943d805f22dc5d98a594357","original_commit_id":"6ebcbd195b61844d6943d805f22dc5d98a594357","user":{"login":"aarora8","id":29442373,"avatar_url":"https://avatars0.githubusercontent.com/u/29442373?v=4","gravatar_id":"","url":"https://api.github.com/users/aarora8","html_url":"https://github.com/aarora8","followers_url":"https://api.github.com/users/aarora8/followers","following_url":"https://api.github.com/users/aarora8/following{/other_user}","gists_url":"https://api.github.com/users/aarora8/gists{/gist_id}","starred_url":"https://api.github.com/users/aarora8/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/aarora8/subscriptions","organizations_url":"https://api.github.com/users/aarora8/orgs","repos_url":"https://api.github.com/users/aarora8/repos","events_url":"https://api.github.com/users/aarora8/events{/privacy}","received_events_url":"https://api.github.com/users/aarora8/received_events","type":"User","site_admin":false},"body":"Sorry, previously did it at the wrong location. This line flips the image, please remove this line.","created_at":"2018-04-28T02:07:45Z","updated_at":"2018-04-28T02:07:45Z","html_url":"https://github.com/kaldi-asr/kaldi/pull/2312#discussion_r184836174","pull_request_url":"https://api.github.com/repos/kaldi-asr/kaldi/pulls/2312","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/kaldi-asr/kaldi/pulls/comments/184836174"},"html":{"href":"https://github.com/kaldi-asr/kaldi/pull/2312#discussion_r184836174"},"pull_request":{"href":"https://api.github.com/repos/kaldi-asr/kaldi/pulls/2312"}}},"pull_request":{"url":"https://api.github.com/repos/kaldi-asr/kaldi/pulls/2312","id":177541883,"html_url":"https://github.com/kaldi-asr/kaldi/pull/2312","diff_url":"https://github.com/kaldi-asr/kaldi/pull/2312.diff","patch_url":"https://github.com/kaldi-asr/kaldi/pull/2312.patch","issue_url":"https://api.github.com/repos/kaldi-asr/kaldi/issues/2312","number":2312,"state":"open","locked":false,"title":"[WIP] Madcat Chinese ocr","user":{"login":"ChunChiehChang","id":28868330,"avatar_url":"https://avatars2.githubusercontent.com/u/28868330?v=4","gravatar_id":"","url":"https://api.github.com/users/ChunChiehChang","html_url":"https://github.com/ChunChiehChang","followers_url":"https://api.github.com/users/ChunChiehChang/followers","following_url":"https://api.github.com/users/ChunChiehChang/following{/other_user}","gists_url":"https://api.github.com/users/ChunChiehChang/gists{/gist_id}","starred_url":"https://api.github.com/users/ChunChiehChang/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ChunChiehChang/subscriptions","organizations_url":"https://api.github.com/users/ChunChiehChang/orgs","repos_url":"https://api.github.com/users/ChunChiehChang/repos","events_url":"https://api.github.com/users/ChunChiehChang/events{/privacy}","received_events_url":"https://api.github.com/users/ChunChiehChang/received_events","type":"User","site_admin":false},"body":"","created_at":"2018-03-26T19:18:58Z","updated_at":"2018-04-28T02:07:45Z","closed_at":null,"merged_at":null,"merge_commit_sha":"0740e00380e4faf4aadbd7f18cc979defd7ed765","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/kaldi-asr/kaldi/pulls/2312/commits","review_comments_url":"https://api.github.com/repos/kaldi-asr/kaldi/pulls/2312/comments","review_comment_url":"https://api.github.com/repos/kaldi-asr/kaldi/pulls/comments{/number}","comments_url":"https://api.github.com/repos/kaldi-asr/kaldi/issues/2312/comments","statuses_url":"https://api.github.com/repos/kaldi-asr/kaldi/statuses/6ebcbd195b61844d6943d805f22dc5d98a594357","head":{"label":"ChunChiehChang:miniSCALE_ocr","ref":"miniSCALE_ocr","sha":"6ebcbd195b61844d6943d805f22dc5d98a594357","user":{"login":"ChunChiehChang","id":28868330,"avatar_url":"https://avatars2.githubusercontent.com/u/28868330?v=4","gravatar_id":"","url":"https://api.github.com/users/ChunChiehChang","html_url":"https://github.com/ChunChiehChang","followers_url":"https://api.github.com/users/ChunChiehChang/followers","following_url":"https://api.github.com/users/ChunChiehChang/following{/other_user}","gists_url":"https://api.github.com/users/ChunChiehChang/gists{/gist_id}","starred_url":"https://api.github.com/users/ChunChiehChang/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ChunChiehChang/subscriptions","organizations_url":"https://api.github.com/users/ChunChiehChang/orgs","repos_url":"https://api.github.com/users/ChunChiehChang/repos","events_url":"https://api.github.com/users/ChunChiehChang/events{/privacy}","received_events_url":"https://api.github.com/users/ChunChiehChang/received_events","type":"User","site_admin":false},"repo":{"id":92067933,"name":"kaldi","full_name":"ChunChiehChang/kaldi","owner":{"login":"ChunChiehChang","id":28868330,"avatar_url":"https://avatars2.githubusercontent.com/u/28868330?v=4","gravatar_id":"","url":"https://api.github.com/users/ChunChiehChang","html_url":"https://github.com/ChunChiehChang","followers_url":"https://api.github.com/users/ChunChiehChang/followers","following_url":"https://api.github.com/users/ChunChiehChang/following{/other_user}","gists_url":"https://api.github.com/users/ChunChiehChang/gists{/gist_id}","starred_url":"https://api.github.com/users/ChunChiehChang/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ChunChiehChang/subscriptions","organizations_url":"https://api.github.com/users/ChunChiehChang/orgs","repos_url":"https://api.github.com/users/ChunChiehChang/repos","events_url":"https://api.github.com/users/ChunChiehChang/events{/privacy}","received_events_url":"https://api.github.com/users/ChunChiehChang/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/ChunChiehChang/kaldi","description":"This is now the official location of the Kaldi project.","fork":true,"url":"https://api.github.com/repos/ChunChiehChang/kaldi","forks_url":"https://api.github.com/repos/ChunChiehChang/kaldi/forks","keys_url":"https://api.github.com/repos/ChunChiehChang/kaldi/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ChunChiehChang/kaldi/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ChunChiehChang/kaldi/teams","hooks_url":"https://api.github.com/repos/ChunChiehChang/kaldi/hooks","issue_events_url":"https://api.github.com/repos/ChunChiehChang/kaldi/issues/events{/number}","events_url":"https://api.github.com/repos/ChunChiehChang/kaldi/events","assignees_url":"https://api.github.com/repos/ChunChiehChang/kaldi/assignees{/user}","branches_url":"https://api.github.com/repos/ChunChiehChang/kaldi/branches{/branch}","tags_url":"https://api.github.com/repos/ChunChiehChang/kaldi/tags","blobs_url":"https://api.github.com/repos/ChunChiehChang/kaldi/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ChunChiehChang/kaldi/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ChunChiehChang/kaldi/git/refs{/sha}","trees_url":"https://api.github.com/repos/ChunChiehChang/kaldi/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ChunChiehChang/kaldi/statuses/{sha}","languages_url":"https://api.github.com/repos/ChunChiehChang/kaldi/languages","stargazers_url":"https://api.github.com/repos/ChunChiehChang/kaldi/stargazers","contributors_url":"https://api.github.com/repos/ChunChiehChang/kaldi/contributors","subscribers_url":"https://api.github.com/repos/ChunChiehChang/kaldi/subscribers","subscription_url":"https://api.github.com/repos/ChunChiehChang/kaldi/subscription","commits_url":"https://api.github.com/repos/ChunChiehChang/kaldi/commits{/sha}","git_commits_url":"https://api.github.com/repos/ChunChiehChang/kaldi/git/commits{/sha}","comments_url":"https://api.github.com/repos/ChunChiehChang/kaldi/comments{/number}","issue_comment_url":"https://api.github.com/repos/ChunChiehChang/kaldi/issues/comments{/number}","contents_url":"https://api.github.com/repos/ChunChiehChang/kaldi/contents/{+path}","compare_url":"https://api.github.com/repos/ChunChiehChang/kaldi/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ChunChiehChang/kaldi/merges","archive_url":"https://api.github.com/repos/ChunChiehChang/kaldi/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ChunChiehChang/kaldi/downloads","issues_url":"https://api.github.com/repos/ChunChiehChang/kaldi/issues{/number}","pulls_url":"https://api.github.com/repos/ChunChiehChang/kaldi/pulls{/number}","milestones_url":"https://api.github.com/repos/ChunChiehChang/kaldi/milestones{/number}","notifications_url":"https://api.github.com/repos/ChunChiehChang/kaldi/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ChunChiehChang/kaldi/labels{/name}","releases_url":"https://api.github.com/repos/ChunChiehChang/kaldi/releases{/id}","deployments_url":"https://api.github.com/repos/ChunChiehChang/kaldi/deployments","created_at":"2017-05-22T15:16:20Z","updated_at":"2018-04-25T17:10:30Z","pushed_at":"2018-04-27T18:46:44Z","git_url":"git://github.com/ChunChiehChang/kaldi.git","ssh_url":"git@github.com:ChunChiehChang/kaldi.git","clone_url":"https://github.com/ChunChiehChang/kaldi.git","svn_url":"https://github.com/ChunChiehChang/kaldi","homepage":"http://kaldi-asr.org","size":111623,"stargazers_count":1,"watchers_count":1,"language":"Shell","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"other","name":"Other","spdx_id":null,"url":null},"forks":0,"open_issues":0,"watchers":1,"default_branch":"master"}},"base":{"label":"kaldi-asr:master","ref":"master","sha":"6a2dce879c8d934dfde7f2426c7421621d3ed31c","user":{"login":"kaldi-asr","id":11650082,"avatar_url":"https://avatars2.githubusercontent.com/u/11650082?v=4","gravatar_id":"","url":"https://api.github.com/users/kaldi-asr","html_url":"https://github.com/kaldi-asr","followers_url":"https://api.github.com/users/kaldi-asr/followers","following_url":"https://api.github.com/users/kaldi-asr/following{/other_user}","gists_url":"https://api.github.com/users/kaldi-asr/gists{/gist_id}","starred_url":"https://api.github.com/users/kaldi-asr/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kaldi-asr/subscriptions","organizations_url":"https://api.github.com/users/kaldi-asr/orgs","repos_url":"https://api.github.com/users/kaldi-asr/repos","events_url":"https://api.github.com/users/kaldi-asr/events{/privacy}","received_events_url":"https://api.github.com/users/kaldi-asr/received_events","type":"Organization","site_admin":false},"repo":{"id":34275045,"name":"kaldi","full_name":"kaldi-asr/kaldi","owner":{"login":"kaldi-asr","id":11650082,"avatar_url":"https://avatars2.githubusercontent.com/u/11650082?v=4","gravatar_id":"","url":"https://api.github.com/users/kaldi-asr","html_url":"https://github.com/kaldi-asr","followers_url":"https://api.github.com/users/kaldi-asr/followers","following_url":"https://api.github.com/users/kaldi-asr/following{/other_user}","gists_url":"https://api.github.com/users/kaldi-asr/gists{/gist_id}","starred_url":"https://api.github.com/users/kaldi-asr/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kaldi-asr/subscriptions","organizations_url":"https://api.github.com/users/kaldi-asr/orgs","repos_url":"https://api.github.com/users/kaldi-asr/repos","events_url":"https://api.github.com/users/kaldi-asr/events{/privacy}","received_events_url":"https://api.github.com/users/kaldi-asr/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/kaldi-asr/kaldi","description":"This is now the official location of the Kaldi project.","fork":false,"url":"https://api.github.com/repos/kaldi-asr/kaldi","forks_url":"https://api.github.com/repos/kaldi-asr/kaldi/forks","keys_url":"https://api.github.com/repos/kaldi-asr/kaldi/keys{/key_id}","collaborators_url":"https://api.github.com/repos/kaldi-asr/kaldi/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/kaldi-asr/kaldi/teams","hooks_url":"https://api.github.com/repos/kaldi-asr/kaldi/hooks","issue_events_url":"https://api.github.com/repos/kaldi-asr/kaldi/issues/events{/number}","events_url":"https://api.github.com/repos/kaldi-asr/kaldi/events","assignees_url":"https://api.github.com/repos/kaldi-asr/kaldi/assignees{/user}","branches_url":"https://api.github.com/repos/kaldi-asr/kaldi/branches{/branch}","tags_url":"https://api.github.com/repos/kaldi-asr/kaldi/tags","blobs_url":"https://api.github.com/repos/kaldi-asr/kaldi/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/kaldi-asr/kaldi/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/kaldi-asr/kaldi/git/refs{/sha}","trees_url":"https://api.github.com/repos/kaldi-asr/kaldi/git/trees{/sha}","statuses_url":"https://api.github.com/repos/kaldi-asr/kaldi/statuses/{sha}","languages_url":"https://api.github.com/repos/kaldi-asr/kaldi/languages","stargazers_url":"https://api.github.com/repos/kaldi-asr/kaldi/stargazers","contributors_url":"https://api.github.com/repos/kaldi-asr/kaldi/contributors","subscribers_url":"https://api.github.com/repos/kaldi-asr/kaldi/subscribers","subscription_url":"https://api.github.com/repos/kaldi-asr/kaldi/subscription","commits_url":"https://api.github.com/repos/kaldi-asr/kaldi/commits{/sha}","git_commits_url":"https://api.github.com/repos/kaldi-asr/kaldi/git/commits{/sha}","comments_url":"https://api.github.com/repos/kaldi-asr/kaldi/comments{/number}","issue_comment_url":"https://api.github.com/repos/kaldi-asr/kaldi/issues/comments{/number}","contents_url":"https://api.github.com/repos/kaldi-asr/kaldi/contents/{+path}","compare_url":"https://api.github.com/repos/kaldi-asr/kaldi/compare/{base}...{head}","merges_url":"https://api.github.com/repos/kaldi-asr/kaldi/merges","archive_url":"https://api.github.com/repos/kaldi-asr/kaldi/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/kaldi-asr/kaldi/downloads","issues_url":"https://api.github.com/repos/kaldi-asr/kaldi/issues{/number}","pulls_url":"https://api.github.com/repos/kaldi-asr/kaldi/pulls{/number}","milestones_url":"https://api.github.com/repos/kaldi-asr/kaldi/milestones{/number}","notifications_url":"https://api.github.com/repos/kaldi-asr/kaldi/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/kaldi-asr/kaldi/labels{/name}","releases_url":"https://api.github.com/repos/kaldi-asr/kaldi/releases{/id}","deployments_url":"https://api.github.com/repos/kaldi-asr/kaldi/deployments","created_at":"2015-04-20T17:23:16Z","updated_at":"2018-04-28T01:32:33Z","pushed_at":"2018-04-27T22:12:47Z","git_url":"git://github.com/kaldi-asr/kaldi.git","ssh_url":"git@github.com:kaldi-asr/kaldi.git","clone_url":"https://github.com/kaldi-asr/kaldi.git","svn_url":"https://github.com/kaldi-asr/kaldi","homepage":"http://kaldi-asr.org","size":111248,"stargazers_count":3593,"watchers_count":3593,"language":"Shell","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1746,"mirror_url":null,"archived":false,"open_issues_count":152,"license":{"key":"other","name":"Other","spdx_id":null,"url":null},"forks":1746,"open_issues":152,"watchers":3593,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/kaldi-asr/kaldi/pulls/2312"},"html":{"href":"https://github.com/kaldi-asr/kaldi/pull/2312"},"issue":{"href":"https://api.github.com/repos/kaldi-asr/kaldi/issues/2312"},"comments":{"href":"https://api.github.com/repos/kaldi-asr/kaldi/issues/2312/comments"},"review_comments":{"href":"https://api.github.com/repos/kaldi-asr/kaldi/pulls/2312/comments"},"review_comment":{"href":"https://api.github.com/repos/kaldi-asr/kaldi/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/kaldi-asr/kaldi/pulls/2312/commits"},"statuses":{"href":"https://api.github.com/repos/kaldi-asr/kaldi/statuses/6ebcbd195b61844d6943d805f22dc5d98a594357"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"aarora8"}}