TEST_A = "/Users/joregan/Playing/rd_ctm_edit/H5C120171011va"
lines = []
with open(TEST_A) as f:
    for line in f.readlines():
        lines.append(line.strip())
def accept_all(lines):
    outlines = []
    for line in lines:
        parts = line.split(" ")
        if parts[-1] == "cor":
            outlines.append(line)
        elif parts[-1] == "sub":
            parts[4] = parts[6]
            parts[-1] = "cor"
            outlines.append(" ".join(parts))
    return outlines
accept_all(lines)
['2442205210012872721 1 27.86 0.06 Herr 1.0 Herr cor',
 '2442205210012872721 1 28.0 0.48 talman! 1.0 talman! cor',
 '2442205210012872721 1 28.72 0.96 Riksdagsledamöter! 1.0 Riksdagsledamöter! cor',
 '2442205210012872721 1 30.16 0.82 Allianspartierna 1.0 Allianspartierna cor',
 '2442205210012872721 1 31.08 0.56 Moderaterna, 1.0 Moderaterna, cor',
 '2442205210012872721 1 32.08 0.74 Centerpartiet, 1.0 Centerpartiet, cor',
 '2442205210012872721 1 33.02 0.579 Liberalerna 1.0 Liberalerna cor',
 '2442205210012872721 1 33.74 0.079 och 1.0 och cor',
 '2442205210012872721 1 33.88 0.759 Kristdemokraterna 1.0 Kristdemokraterna cor',
 '2442205210012872721 1 34.76 0.399 föreslår 1.0 föreslår cor',
 '2442205210012872721 1 35.22 0.079 som 1.0 som cor',
 '2442205210012872721 1 35.36 0.579 riksdagens 1.0 riksdagens cor',
 '2442205210012872721 1 36.02 0.239 förste 1.0 förste cor',
 '2442205210012872721 1 36.32 0.179 vice 1.0 vice cor',
 '2442205210012872721 1 36.58 0.34 talman 1.0 talman cor',
 '2442205210012872721 1 37.32 0.14 Ewa 1.0 Ewa cor',
 '2442205210012872721 1 37.56 0.28 Thalén 1.0 Thalén cor',
 '2442205210012872721 1 38.14 0.32 Finné. 1.0 Finné. cor']
def ctm_to_timed(lines):
    output = []
    for line in lines:
        parts = line.split(" ")
        start = float(parts[2])
        dur = float(parts[3])
        output.append({
            "start": start,
            "end": start + dur,
            "text": parts[6]
        })
    return output
side_a = ctm_to_timed(accept_all(lines))
phonfile = "/Users/joregan/Playing/rd_phonetic/2442205210012872721_480p.json"
import json
with open(phonfile) as f:
    pieces = json.load(f)
def hf_json_to_timed(data):
    output = []
    for chunk in data["chunks"]:
        output.append({
            "start": chunk["timestamp"][0],
            "end": chunk["timestamp"][1],
            "text": chunk["text"]
        })
    return output
side_b = hf_json_to_timed(pieces)
def prune_to_other(left, right, fudge=0.5):
    safe = left
    working = right
    # if right[0]["start"] > (left[0]["start"] - fudge) and right[-1]["end"] < (left[-1]["end"] + fudge):
    #     safe = right
    #     working = left
    output = []
    for item in working:
        if item["start"] < safe[0]["start"] - fudge:
            continue
        elif item["end"] > safe[-1]["end"] + fudge:
            continue
        else:
            output.append(item)

    return safe, output
new_a, new_b = prune_to_other(side_a, side_b)
new_b[0]
{'start': 27.86, 'end': 27.9, 'text': 'ɑː'}
new_a[0]
{'start': 27.86, 'end': 27.919999999999998, 'text': 'Herr'}
def cost(a, b):
    starts = abs(a["start"] - b["start"])
    ends = abs(a["end"] - b["end"])
    return starts + ends
def in_start_range(a, b, range=0.2):
    return abs(a["start"] - b["start"]) <= range

def in_end_range(a, b, range=0.2):
    return abs(a["end"] - b["end"]) <= range

def in_range(a, b, range=0.2):
    r_start = in_start_range(a, b, range)
    r_end = in_end_range(a, b, range)
    return r_start or r_end
in_range(new_a[0], new_b[-1])
False
in_range(new_a[0], new_b[0])
True
import numpy as np
dist_matrix = np.zeros((len(new_a) + 1, len(new_b) + 1))
for i in range(1, len(new_a) + 1):
    for j in range(1, len(new_b) + 1):
        if not in_range(new_a[i-1], new_b[j-1]):
            continue
        pair_cost = cost(new_a[i-1], new_b[j-1])
        dist_matrix[i, j] = pair_cost
        print(new_a[i-1], new_b[j-1], pair_cost)
{'start': 27.86, 'end': 27.919999999999998, 'text': 'Herr'} {'start': 27.86, 'end': 27.9, 'text': 'ɑː'} 0.019999999999999574
{'start': 27.86, 'end': 27.919999999999998, 'text': 'Herr'} {'start': 28.0, 'end': 28.6, 'text': 'tɑːlman'} 0.8200000000000038
{'start': 28.0, 'end': 28.48, 'text': 'talman!'} {'start': 27.86, 'end': 27.9, 'text': 'ɑː'} 0.7200000000000024
{'start': 28.0, 'end': 28.48, 'text': 'talman!'} {'start': 28.0, 'end': 28.6, 'text': 'tɑːlman'} 0.120000000000001
{'start': 28.72, 'end': 29.68, 'text': 'Riksdagsledamöter!'} {'start': 28.7, 'end': 29.18, 'text': 'rɪksasleːda'} 0.5199999999999996
{'start': 28.72, 'end': 29.68, 'text': 'Riksdagsledamöter!'} {'start': 29.24, 'end': 29.58, 'text': 'møːtœ̞'} 0.620000000000001
{'start': 30.16, 'end': 30.98, 'text': 'Allianspartierna'} {'start': 30.0, 'end': 30.04, 'text': '<pa>'} 1.1000000000000014
{'start': 30.16, 'end': 30.98, 'text': 'Allianspartierna'} {'start': 30.16, 'end': 30.26, 'text': 'al'} 0.7199999999999989
{'start': 30.16, 'end': 30.98, 'text': 'Allianspartierna'} {'start': 30.32, 'end': 30.98, 'text': 'aspatiːæɳa'} 0.16000000000000014
{'start': 31.08, 'end': 31.639999999999997, 'text': 'Moderaterna,'} {'start': 31.06, 'end': 31.64, 'text': 'mʊdɑːtœ̞ɔɳa'} 0.020000000000003126
{'start': 31.08, 'end': 31.639999999999997, 'text': 'Moderaterna,'} {'start': 31.78, 'end': 31.82, 'text': '<pa>'} 0.8800000000000061
{'start': 32.08, 'end': 32.82, 'text': 'Centerpartiet,'} {'start': 32.06, 'end': 32.3, 'text': 'sentə'} 0.5399999999999991
{'start': 32.08, 'end': 32.82, 'text': 'Centerpartiet,'} {'start': 32.36, 'end': 32.86, 'text': 'patiːət'} 0.3200000000000003
{'start': 33.02, 'end': 33.599000000000004, 'text': 'Liberalerna'} {'start': 33.02, 'end': 33.62, 'text': 'lɪbɑːlɔɳa'} 0.02099999999999369
{'start': 33.02, 'end': 33.599000000000004, 'text': 'Liberalerna'} {'start': 33.74, 'end': 33.78, 'text': 'oː'} 0.9009999999999962
{'start': 33.74, 'end': 33.819, 'text': 'och'} {'start': 33.02, 'end': 33.62, 'text': 'lɪbɑːlɔɳa'} 0.919000000000004
{'start': 33.74, 'end': 33.819, 'text': 'och'} {'start': 33.74, 'end': 33.78, 'text': 'oː'} 0.03900000000000148
{'start': 33.74, 'end': 33.819, 'text': 'och'} {'start': 33.84, 'end': 34.04, 'text': 'kɪs'} 0.32099999999999795
{'start': 33.88, 'end': 34.639, 'text': 'Kristdemokraterna'} {'start': 33.74, 'end': 33.78, 'text': 'oː'} 0.9990000000000023
{'start': 33.88, 'end': 34.639, 'text': 'Kristdemokraterna'} {'start': 33.84, 'end': 34.04, 'text': 'kɪs'} 0.6390000000000029
{'start': 33.88, 'end': 34.639, 'text': 'Kristdemokraterna'} {'start': 34.08, 'end': 34.64, 'text': 'demɔkɑːtɔɳa'} 0.2009999999999934
{'start': 34.76, 'end': 35.159, 'text': 'föreslår'} {'start': 34.76, 'end': 35.1, 'text': 'fœ̞ːesoː'} 0.0589999999999975
{'start': 34.76, 'end': 35.159, 'text': 'föreslår'} {'start': 35.2, 'end': 35.32, 'text': 'sɔm'} 0.6010000000000062
{'start': 35.22, 'end': 35.299, 'text': 'som'} {'start': 34.76, 'end': 35.1, 'text': 'fœ̞ːesoː'} 0.6589999999999989
{'start': 35.22, 'end': 35.299, 'text': 'som'} {'start': 35.2, 'end': 35.32, 'text': 'sɔm'} 0.04099999999999682
{'start': 35.22, 'end': 35.299, 'text': 'som'} {'start': 35.36, 'end': 35.94, 'text': 'rɪksdɑːɡəns'} 0.7809999999999988
{'start': 35.36, 'end': 35.939, 'text': 'riksdagens'} {'start': 35.2, 'end': 35.32, 'text': 'sɔm'} 0.7789999999999964
{'start': 35.36, 'end': 35.939, 'text': 'riksdagens'} {'start': 35.36, 'end': 35.94, 'text': 'rɪksdɑːɡəns'} 0.0009999999999976694
{'start': 36.02, 'end': 36.259, 'text': 'förste'} {'start': 36.02, 'end': 36.24, 'text': 'fœ̞st'} 0.01899999999999835
{'start': 36.32, 'end': 36.499, 'text': 'vice'} {'start': 36.3, 'end': 36.5, 'text': 'viːsə'} 0.021000000000000796
{'start': 36.58, 'end': 36.92, 'text': 'talman'} {'start': 36.58, 'end': 36.96, 'text': 'tɑːlman'} 0.03999999999999915
{'start': 36.58, 'end': 36.92, 'text': 'talman'} {'start': 37.08, 'end': 37.12, 'text': '<pa>'} 0.6999999999999957
{'start': 37.32, 'end': 37.46, 'text': 'Ewa'} {'start': 37.3, 'end': 37.46, 'text': 'eva'} 0.020000000000003126
{'start': 37.56, 'end': 37.84, 'text': 'Thalén'} {'start': 37.56, 'end': 37.86, 'text': 'tareːn'} 0.01999999999999602
{'start': 38.14, 'end': 38.46, 'text': 'Finné.'} {'start': 38.14, 'end': 38.32, 'text': 'fɪne'} 0.14000000000000057
s1 = len(new_a) + 1
s2 = len(new_b) + 1

for i in range(s1):
    dist_matrix[i, 0] = float(i)
for j in range(s2):
    dist_matrix[0, j] = float(j)

for i in range(1, s1):
    for j in range(1, s2):
        if not in_range(new_a[i-1], new_b[j-1]):
            continue
        pair_cost = cost(new_a[i-1], new_b[j-1])
        dist_matrix[i, j] = min(
            dist_matrix[i - 1][j] + pair_cost,
            dist_matrix[i][j - 1] + pair_cost,
            dist_matrix[i - 1][j - 1] + pair_cost
        )
import pandas as pd
df = pd.DataFrame(data=dist_matrix,index=[""] + [x["text"] for x in new_a], columns=[""] + [x["text"] for x in new_b])
def falls_between(a1, a2, b):
    if b["end"] <= a2["start"] and b["start"] >= a1["end"]:
        return True
    return False
df
ɑː tɑːlman rɪksasleːda møːtœ̞ <pa> al aspatiːæɳa mʊdɑːtœ̞ɔɳa <pa> ... fœ̞ːesoː sɔm rɪksdɑːɡəns fœ̞st viːsə tɑːlman <pa> eva tareːn fɪne
0.0 1.00 2.00 3.00 4.00 5.0 6.00 7.00 8.00 9.00 ... 16.000 17.000 18.000 19.000 20.000 21.00 22.0 23.00 24.00 25.00
Herr 1.0 0.02 0.84 0.00 0.00 0.0 0.00 0.00 0.00 0.00 ... 0.000 0.000 0.000 0.000 0.000 0.00 0.0 0.00 0.00 0.00
talman! 2.0 0.74 0.14 0.00 0.00 0.0 0.00 0.00 0.00 0.00 ... 0.000 0.000 0.000 0.000 0.000 0.00 0.0 0.00 0.00 0.00
Riksdagsledamöter! 3.0 0.00 0.00 0.52 0.62 0.0 0.00 0.00 0.00 0.00 ... 0.000 0.000 0.000 0.000 0.000 0.00 0.0 0.00 0.00 0.00
Allianspartierna 4.0 0.00 0.00 0.00 0.00 1.1 0.72 0.16 0.00 0.00 ... 0.000 0.000 0.000 0.000 0.000 0.00 0.0 0.00 0.00 0.00
Moderaterna, 5.0 0.00 0.00 0.00 0.00 0.0 0.00 0.00 0.02 0.88 ... 0.000 0.000 0.000 0.000 0.000 0.00 0.0 0.00 0.00 0.00
Centerpartiet, 6.0 0.00 0.00 0.00 0.00 0.0 0.00 0.00 0.00 0.00 ... 0.000 0.000 0.000 0.000 0.000 0.00 0.0 0.00 0.00 0.00
Liberalerna 7.0 0.00 0.00 0.00 0.00 0.0 0.00 0.00 0.00 0.00 ... 0.000 0.000 0.000 0.000 0.000 0.00 0.0 0.00 0.00 0.00
och 8.0 0.00 0.00 0.00 0.00 0.0 0.00 0.00 0.00 0.00 ... 0.000 0.000 0.000 0.000 0.000 0.00 0.0 0.00 0.00 0.00
Kristdemokraterna 9.0 0.00 0.00 0.00 0.00 0.0 0.00 0.00 0.00 0.00 ... 0.000 0.000 0.000 0.000 0.000 0.00 0.0 0.00 0.00 0.00
föreslår 10.0 0.00 0.00 0.00 0.00 0.0 0.00 0.00 0.00 0.00 ... 0.059 0.601 0.000 0.000 0.000 0.00 0.0 0.00 0.00 0.00
som 11.0 0.00 0.00 0.00 0.00 0.0 0.00 0.00 0.00 0.00 ... 0.659 0.100 0.781 0.000 0.000 0.00 0.0 0.00 0.00 0.00
riksdagens 12.0 0.00 0.00 0.00 0.00 0.0 0.00 0.00 0.00 0.00 ... 0.000 0.779 0.101 0.000 0.000 0.00 0.0 0.00 0.00 0.00
förste 13.0 0.00 0.00 0.00 0.00 0.0 0.00 0.00 0.00 0.00 ... 0.000 0.000 0.000 0.019 0.000 0.00 0.0 0.00 0.00 0.00
vice 14.0 0.00 0.00 0.00 0.00 0.0 0.00 0.00 0.00 0.00 ... 0.000 0.000 0.000 0.000 0.021 0.00 0.0 0.00 0.00 0.00
talman 15.0 0.00 0.00 0.00 0.00 0.0 0.00 0.00 0.00 0.00 ... 0.000 0.000 0.000 0.000 0.000 0.04 0.7 0.00 0.00 0.00
Ewa 16.0 0.00 0.00 0.00 0.00 0.0 0.00 0.00 0.00 0.00 ... 0.000 0.000 0.000 0.000 0.000 0.00 0.0 0.02 0.00 0.00
Thalén 17.0 0.00 0.00 0.00 0.00 0.0 0.00 0.00 0.00 0.00 ... 0.000 0.000 0.000 0.000 0.000 0.00 0.0 0.00 0.02 0.00
Finné. 18.0 0.00 0.00 0.00 0.00 0.0 0.00 0.00 0.00 0.00 ... 0.000 0.000 0.000 0.000 0.000 0.00 0.0 0.00 0.00 0.14

19 rows × 26 columns