File size: 2,037 Bytes
1ffed4c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
import json
import re
from math import sqrt

import cv2

def get_duration(d):
    return d.minutes*60 + d.seconds + d.milliseconds / 1000


def clean_str(str):
    str = str.replace("\n", " ")
    return re.sub(r'[^A-Za-z0-9 ]+', '', str)


def get_sqrt(n):
    """return the smallest number x such that x**2 > n"""
    x = int(sqrt(n))
    while x**2 < n:
        x = int(x + 1)
    return x


def read_and_preprocess_transcript(path, song_name, n_lines=None):
    """
    Read transcription file, prepend the songname at the start (before first lyrice line),
    set the duration of each lyrics line to last until the next one starts
    """

    transcript = json.load(open(path))

    for i in range(len(transcript)):
        if i < len(transcript) - 1:
            transcript[i]['duration'] = transcript[i+1]['start'] - transcript[i]['start']

    transcript = [{'text': song_name, 'start': 0, 'duration':  transcript[0]['start']}] + transcript

    if n_lines is not None:
        transcript = transcript[:int(n_lines)]
    return transcript


def put_subtitles_on_frame(frame, text, resize_factor=1):
    w, h = frame.shape[:2]
    frame = cv2.resize(frame, (w*resize_factor, h*resize_factor))
    w, h = frame.shape[:2]
    kwargs = {
        'thickness':2,
        'fontScale':0.75,
        'fontFace':cv2.FONT_HERSHEY_SIMPLEX
    }
    (tw, th), _ = cv2.getTextSize(text, **kwargs)
    if tw > w:
        words = text.split()
        first_line = " ".join(words[:len(words) // 2:])
        (tw, th), _ = cv2.getTextSize(first_line, **kwargs)
        frame = cv2.putText(frame, first_line, (w//2 - tw // 2, h - int(th * 3)), color=(255, 255, 255), **kwargs)
        second_line = " ".join(words[len(words) // 2:])
        (tw, th), _ = cv2.getTextSize(second_line, **kwargs)
        frame = cv2.putText(frame, second_line, (w//2 - tw // 2, h - int(th * 1.5)), color=(255, 255, 255), **kwargs)
    else:
        frame = cv2.putText(frame, text, (w//2 - tw // 2, h - int(th * 2)), color=(255, 255, 255), **kwargs)
    return frame