Spaces:
Running
on
Zero
Running
on
Zero
renhang
commited on
Commit
·
a7334d4
1
Parent(s):
054eb24
Intuitive UI
Browse files- app.py +104 -22
- examples/1442432310/lyrics.json +1 -0
- examples/input.json +8 -0
- requirements.txt +1 -0
- utils.py +133 -0
app.py
CHANGED
@@ -1,9 +1,12 @@
|
|
1 |
import spaces
|
2 |
import gradio as gr
|
3 |
import os
|
|
|
|
|
4 |
from pathlib import Path
|
5 |
|
6 |
from model import Jamify
|
|
|
7 |
|
8 |
# Initialize the Jamify model once
|
9 |
print("Initializing Jamify model...")
|
@@ -15,32 +18,106 @@ print("Jamify model ready.")
|
|
15 |
gr.set_static_paths(paths=[Path.cwd().absolute()])
|
16 |
|
17 |
@spaces.GPU(duration=100)
|
18 |
-
def generate_song(reference_audio,
|
19 |
# We need to save the uploaded files to temporary paths to pass to the model
|
20 |
reference_audio = reference_audio not in ("", None) and reference_audio or None
|
21 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
22 |
|
23 |
-
|
24 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
25 |
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
|
30 |
-
|
31 |
-
)
|
32 |
|
33 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
34 |
|
35 |
# Gradio interface
|
36 |
with gr.Blocks() as demo:
|
37 |
gr.Markdown("# Jamify: Music Generation from Lyrics and Style")
|
38 |
gr.Markdown("Provide your lyrics, a style reference (either an audio file or a text prompt), and a desired duration to generate a song.")
|
39 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
40 |
with gr.Row():
|
41 |
with gr.Column():
|
42 |
gr.Markdown("### Inputs")
|
43 |
-
|
|
|
|
|
|
|
|
|
|
|
44 |
duration_slider = gr.Slider(minimum=5, maximum=230, value=120, step=30, label="Duration (seconds)")
|
45 |
|
46 |
with gr.Tab("Style from Audio"):
|
@@ -56,20 +133,25 @@ with gr.Blocks() as demo:
|
|
56 |
|
57 |
generate_button.click(
|
58 |
fn=generate_song,
|
59 |
-
inputs=[reference_audio,
|
60 |
outputs=output_audio,
|
61 |
api_name="generate_song"
|
62 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
63 |
|
64 |
-
|
65 |
-
|
66 |
-
|
67 |
-
|
68 |
-
|
69 |
-
|
70 |
-
|
71 |
-
fn=generate_song,
|
72 |
-
cache_examples=True
|
73 |
-
)
|
74 |
|
75 |
demo.queue().launch()
|
|
|
1 |
import spaces
|
2 |
import gradio as gr
|
3 |
import os
|
4 |
+
import json
|
5 |
+
import tempfile
|
6 |
from pathlib import Path
|
7 |
|
8 |
from model import Jamify
|
9 |
+
from utils import json_to_text, text_to_json
|
10 |
|
11 |
# Initialize the Jamify model once
|
12 |
print("Initializing Jamify model...")
|
|
|
18 |
gr.set_static_paths(paths=[Path.cwd().absolute()])
|
19 |
|
20 |
@spaces.GPU(duration=100)
|
21 |
+
def generate_song(reference_audio, lyrics_text, style_prompt, duration):
|
22 |
# We need to save the uploaded files to temporary paths to pass to the model
|
23 |
reference_audio = reference_audio not in ("", None) and reference_audio or None
|
24 |
|
25 |
+
# Convert text format to JSON and save to temporary file
|
26 |
+
lyrics_json = text_to_json(lyrics_text)
|
27 |
+
|
28 |
+
# Create temporary file for lyrics JSON
|
29 |
+
with tempfile.NamedTemporaryFile(mode='w', suffix='.json', delete=False) as f:
|
30 |
+
json.dump(lyrics_json, f, indent=2)
|
31 |
+
lyrics_file = f.name
|
32 |
|
33 |
+
try:
|
34 |
+
output_path = jamify_model.predict(
|
35 |
+
reference_audio_path=reference_audio,
|
36 |
+
lyrics_json_path=lyrics_file,
|
37 |
+
style_prompt=style_prompt,
|
38 |
+
duration_sec=duration
|
39 |
+
)
|
40 |
+
return output_path
|
41 |
+
finally:
|
42 |
+
# Clean up temporary file
|
43 |
+
if os.path.exists(lyrics_file):
|
44 |
+
os.unlink(lyrics_file)
|
45 |
|
46 |
+
# Load and cache examples
|
47 |
+
def load_examples():
|
48 |
+
"""Load examples from the examples directory and pre-compute text formats"""
|
49 |
+
examples = []
|
50 |
+
examples_file = "examples/input.json"
|
|
|
51 |
|
52 |
+
if os.path.exists(examples_file):
|
53 |
+
print("Loading and caching examples...")
|
54 |
+
with open(examples_file, 'r') as f:
|
55 |
+
examples_data = json.load(f)
|
56 |
+
|
57 |
+
for example in examples_data:
|
58 |
+
example_id = example.get('id', '')
|
59 |
+
audio_path = example.get('audio_path', '')
|
60 |
+
lrc_path = example.get('lrc_path', '')
|
61 |
+
duration = example.get('duration', 120)
|
62 |
+
|
63 |
+
# Load lyrics and convert to text format (pre-computed/cached)
|
64 |
+
lyrics_text = ""
|
65 |
+
if os.path.exists(lrc_path):
|
66 |
+
try:
|
67 |
+
with open(lrc_path, 'r') as f:
|
68 |
+
lyrics_json = json.load(f)
|
69 |
+
lyrics_text = json_to_text(lyrics_json)
|
70 |
+
print(f"Cached example {example_id}: {len(lyrics_text)} chars")
|
71 |
+
except Exception as e:
|
72 |
+
print(f"Error loading lyrics from {lrc_path}: {e}")
|
73 |
+
|
74 |
+
examples.append({
|
75 |
+
'id': example_id,
|
76 |
+
'audio_path': audio_path if os.path.exists(audio_path) else None,
|
77 |
+
'lyrics_text': lyrics_text,
|
78 |
+
'duration': duration
|
79 |
+
})
|
80 |
+
|
81 |
+
print(f"Loaded {len(examples)} cached examples")
|
82 |
+
return examples
|
83 |
+
|
84 |
+
def load_example(example_idx, examples):
|
85 |
+
"""Load a specific example and return its data"""
|
86 |
+
if 0 <= example_idx < len(examples):
|
87 |
+
example = examples[example_idx]
|
88 |
+
return (
|
89 |
+
example['audio_path'],
|
90 |
+
example['lyrics_text'],
|
91 |
+
example['duration']
|
92 |
+
)
|
93 |
+
return None, "", 120
|
94 |
+
|
95 |
+
# Load examples at startup
|
96 |
+
examples = load_examples()
|
97 |
|
98 |
# Gradio interface
|
99 |
with gr.Blocks() as demo:
|
100 |
gr.Markdown("# Jamify: Music Generation from Lyrics and Style")
|
101 |
gr.Markdown("Provide your lyrics, a style reference (either an audio file or a text prompt), and a desired duration to generate a song.")
|
102 |
|
103 |
+
# Sample buttons section
|
104 |
+
if examples:
|
105 |
+
gr.Markdown("### Sample Examples")
|
106 |
+
with gr.Row():
|
107 |
+
example_buttons = []
|
108 |
+
for i, example in enumerate(examples):
|
109 |
+
button = gr.Button(f"Example {example['id']}", variant="secondary", size="sm")
|
110 |
+
example_buttons.append(button)
|
111 |
+
|
112 |
with gr.Row():
|
113 |
with gr.Column():
|
114 |
gr.Markdown("### Inputs")
|
115 |
+
lyrics_text = gr.Textbox(
|
116 |
+
label="Lyrics",
|
117 |
+
lines=10,
|
118 |
+
placeholder="Enter lyrics in format: word[start:end] word[start:end]...\nExample: It's[4.96:5.52] a[5.52:5.84] long[5.84:6.16] way[6.16:6.48]...",
|
119 |
+
value=""
|
120 |
+
)
|
121 |
duration_slider = gr.Slider(minimum=5, maximum=230, value=120, step=30, label="Duration (seconds)")
|
122 |
|
123 |
with gr.Tab("Style from Audio"):
|
|
|
133 |
|
134 |
generate_button.click(
|
135 |
fn=generate_song,
|
136 |
+
inputs=[reference_audio, lyrics_text, style_prompt, duration_slider],
|
137 |
outputs=output_audio,
|
138 |
api_name="generate_song"
|
139 |
)
|
140 |
+
|
141 |
+
# Connect example buttons to load data
|
142 |
+
if examples:
|
143 |
+
for i, button in enumerate(example_buttons):
|
144 |
+
button.click(
|
145 |
+
fn=lambda idx=i: load_example(idx, examples),
|
146 |
+
outputs=[reference_audio, lyrics_text, duration_slider]
|
147 |
+
)
|
148 |
|
149 |
+
# Create necessary temporary directories for Gradio
|
150 |
+
print("Creating temporary directories...")
|
151 |
+
try:
|
152 |
+
os.makedirs("/tmp/gradio", exist_ok=True)
|
153 |
+
print("Temporary directories created successfully.")
|
154 |
+
except Exception as e:
|
155 |
+
print(f"Warning: Could not create temporary directories: {e}")
|
|
|
|
|
|
|
156 |
|
157 |
demo.queue().launch()
|
examples/1442432310/lyrics.json
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
{"char": [{"char": ["It"], "start_offset": 62, "end_offset": 65, "start": 4.96, "end": 5.2}, {"char": ["'"], "start_offset": 65, "end_offset": 65, "start": 5.2, "end": 5.2}, {"char": ["s"], "start_offset": 69, "end_offset": 69, "start": 5.5200000000000005, "end": 5.5200000000000005}, {"char": ["a"], "start_offset": 69, "end_offset": 73, "start": 5.5200000000000005, "end": 5.84}, {"char": ["long"], "start_offset": 73, "end_offset": 77, "start": 5.84, "end": 6.16}, {"char": ["way"], "start_offset": 77, "end_offset": 81, "start": 6.16, "end": 6.48}, {"char": ["to"], "start_offset": 84, "end_offset": 88, "start": 6.72, "end": 7.04}, {"char": ["t"], "start_offset": 88, "end_offset": 90, "start": 7.04, "end": 7.2}, {"char": ["i"], "start_offset": 90, "end_offset": 92, "start": 7.2, "end": 7.36}, {"char": ["pp"], "start_offset": 92, "end_offset": 94, "start": 7.36, "end": 7.5200000000000005}, {"char": ["er"], "start_offset": 94, "end_offset": 96, "start": 7.5200000000000005, "end": 7.68}, {"char": ["y"], "start_offset": 104, "end_offset": 107, "start": 8.32, "end": 8.56}, {"char": ["."], "start_offset": 107, "end_offset": 107, "start": 8.56, "end": 8.56}, {"char": ["It"], "start_offset": 118, "end_offset": 120, "start": 9.44, "end": 9.6}, {"char": ["'"], "start_offset": 120, "end_offset": 120, "start": 9.6, "end": 9.6}, {"char": ["s"], "start_offset": 123, "end_offset": 123, "start": 9.84, "end": 9.84}, {"char": ["a"], "start_offset": 123, "end_offset": 127, "start": 9.84, "end": 10.16}, {"char": ["long"], "start_offset": 127, "end_offset": 131, "start": 10.16, "end": 10.48}, {"char": ["way"], "start_offset": 135, "end_offset": 139, "start": 10.8, "end": 11.120000000000001}, {"char": ["to"], "start_offset": 143, "end_offset": 147, "start": 11.44, "end": 11.76}, {"char": ["go"], "start_offset": 155, "end_offset": 159, "start": 12.4, "end": 12.72}, {"char": ["."], "start_offset": 159, "end_offset": 159, "start": 12.72, "end": 12.72}, {"char": ["It"], "start_offset": 174, "end_offset": 176, "start": 13.92, "end": 14.08}, {"char": ["'"], "start_offset": 176, "end_offset": 176, "start": 14.08, "end": 14.08}, {"char": ["s"], "start_offset": 179, "end_offset": 179, "start": 14.32, "end": 14.32}, {"char": ["a"], "start_offset": 179, "end_offset": 183, "start": 14.32, "end": 14.64}, {"char": ["long"], "start_offset": 183, "end_offset": 187, "start": 14.64, "end": 14.96}, {"char": ["way"], "start_offset": 187, "end_offset": 191, "start": 14.96, "end": 15.280000000000001}, {"char": ["to"], "start_offset": 195, "end_offset": 198, "start": 15.6, "end": 15.84}, {"char": ["t"], "start_offset": 198, "end_offset": 200, "start": 15.84, "end": 16.0}, {"char": ["i"], "start_offset": 200, "end_offset": 202, "start": 16.0, "end": 16.16}, {"char": ["pp"], "start_offset": 202, "end_offset": 204, "start": 16.16, "end": 16.32}, {"char": ["er"], "start_offset": 204, "end_offset": 206, "start": 16.32, "end": 16.48}, {"char": ["ary"], "start_offset": 208, "end_offset": 211, "start": 16.64, "end": 16.88}, {"char": ["to"], "start_offset": 227, "end_offset": 231, "start": 18.16, "end": 18.48}, {"char": ["the"], "start_offset": 231, "end_offset": 234, "start": 18.48, "end": 18.72}, {"char": ["s"], "start_offset": 234, "end_offset": 236, "start": 18.72, "end": 18.88}, {"char": ["we"], "start_offset": 236, "end_offset": 240, "start": 18.88, "end": 19.2}, {"char": ["et"], "start_offset": 240, "end_offset": 244, "start": 19.2, "end": 19.52}, {"char": ["est"], "start_offset": 244, "end_offset": 248, "start": 19.52, "end": 19.84}, {"char": ["g"], "start_offset": 248, "end_offset": 252, "start": 19.84, "end": 20.16}, {"char": ["ir"], "start_offset": 252, "end_offset": 256, "start": 20.16, "end": 20.48}, {"char": ["l"], "start_offset": 256, "end_offset": 256, "start": 20.48, "end": 20.48}, {"char": ["I"], "start_offset": 258, "end_offset": 262, "start": 20.64, "end": 20.96}, {"char": ["know"], "start_offset": 266, "end_offset": 270, "start": 21.28, "end": 21.6}, {"char": ["."], "start_offset": 270, "end_offset": 270, "start": 21.6, "end": 21.6}, {"char": ["G"], "start_offset": 289, "end_offset": 291, "start": 23.12, "end": 23.28}, {"char": ["ood"], "start_offset": 291, "end_offset": 295, "start": 23.28, "end": 23.6}, {"char": ["b"], "start_offset": 295, "end_offset": 298, "start": 23.6, "end": 23.84}, {"char": ["y"], "start_offset": 298, "end_offset": 301, "start": 23.84, "end": 24.080000000000002}, {"char": ["e"], "start_offset": 301, "end_offset": 305, "start": 24.080000000000002, "end": 24.400000000000002}, {"char": ["to"], "start_offset": 305, "end_offset": 308, "start": 24.400000000000002, "end": 24.64}, {"char": ["P"], "start_offset": 308, "end_offset": 310, "start": 24.64, "end": 24.8}, {"char": ["ic"], "start_offset": 310, "end_offset": 312, "start": 24.8, "end": 24.96}, {"char": ["c"], "start_offset": 312, "end_offset": 313, "start": 24.96, "end": 25.04}, {"char": ["ad"], "start_offset": 315, "end_offset": 317, "start": 25.2, "end": 25.36}, {"char": ["ill"], "start_offset": 317, "end_offset": 320, "start": 25.36, "end": 25.6}, {"char": ["y"], "start_offset": 324, "end_offset": 328, "start": 25.92, "end": 26.240000000000002}, {"char": ["."], "start_offset": 328, "end_offset": 328, "start": 26.240000000000002, "end": 26.240000000000002}, {"char": ["F"], "start_offset": 343, "end_offset": 346, "start": 27.44, "end": 27.68}, {"char": ["are"], "start_offset": 346, "end_offset": 349, "start": 27.68, "end": 27.92}, {"char": ["we"], "start_offset": 351, "end_offset": 353, "start": 28.080000000000002, "end": 28.240000000000002}, {"char": ["ll"], "start_offset": 353, "end_offset": 355, "start": 28.240000000000002, "end": 28.400000000000002}, {"char": [","], "start_offset": 355, "end_offset": 355, "start": 28.400000000000002, "end": 28.400000000000002}, {"char": ["L"], "start_offset": 357, "end_offset": 359, "start": 28.560000000000002, "end": 28.72}, {"char": ["e"], "start_offset": 359, "end_offset": 361, "start": 28.72, "end": 28.88}, {"char": ["ic"], "start_offset": 361, "end_offset": 363, "start": 28.88, "end": 29.04}, {"char": ["es"], "start_offset": 363, "end_offset": 366, "start": 29.04, "end": 29.28}, {"char": ["ter"], "start_offset": 366, "end_offset": 369, "start": 29.28, "end": 29.52}, {"char": ["S"], "start_offset": 369, "end_offset": 373, "start": 29.52, "end": 29.84}, {"char": ["qu"], "start_offset": 373, "end_offset": 377, "start": 29.84, "end": 30.16}, {"char": ["are"], "start_offset": 377, "end_offset": 381, "start": 30.16, "end": 30.48}, {"char": ["."], "start_offset": 381, "end_offset": 381, "start": 30.48, "end": 30.48}, {"char": ["It"], "start_offset": 393, "end_offset": 395, "start": 31.44, "end": 31.6}, {"char": ["'"], "start_offset": 395, "end_offset": 395, "start": 31.6, "end": 31.6}, {"char": ["s"], "start_offset": 397, "end_offset": 397, "start": 31.76, "end": 31.76}, {"char": ["a"], "start_offset": 397, "end_offset": 400, "start": 31.76, "end": 32.0}, {"char": ["long"], "start_offset": 400, "end_offset": 404, "start": 32.0, "end": 32.32}, {"char": [","], "start_offset": 404, "end_offset": 404, "start": 32.32, "end": 32.32}, {"char": ["long"], "start_offset": 406, "end_offset": 408, "start": 32.480000000000004, "end": 32.64}, {"char": ["way"], "start_offset": 412, "end_offset": 415, "start": 32.96, "end": 33.2}, {"char": ["to"], "start_offset": 415, "end_offset": 419, "start": 33.2, "end": 33.52}, {"char": ["t"], "start_offset": 419, "end_offset": 421, "start": 33.52, "end": 33.68}, {"char": ["i"], "start_offset": 421, "end_offset": 423, "start": 33.68, "end": 33.84}, {"char": ["pp"], "start_offset": 423, "end_offset": 424, "start": 33.84, "end": 33.92}, {"char": ["er"], "start_offset": 424, "end_offset": 426, "start": 33.92, "end": 34.08}, {"char": ["y"], "start_offset": 442, "end_offset": 446, "start": 35.36, "end": 35.68}, {"char": ["."], "start_offset": 446, "end_offset": 446, "start": 35.68, "end": 35.68}, {"char": ["But"], "start_offset": 450, "end_offset": 454, "start": 36.0, "end": 36.32}, {"char": ["my"], "start_offset": 454, "end_offset": 458, "start": 36.32, "end": 36.64}, {"char": ["he"], "start_offset": 462, "end_offset": 466, "start": 36.96, "end": 37.28}, {"char": ["art"], "start_offset": 466, "end_offset": 470, "start": 37.28, "end": 37.6}, {"char": ["'"], "start_offset": 470, "end_offset": 470, "start": 37.6, "end": 37.6}, {"char": ["s"], "start_offset": 473, "end_offset": 477, "start": 37.84, "end": 38.160000000000004}, {"char": ["right"], "start_offset": 477, "end_offset": 481, "start": 38.160000000000004, "end": 38.480000000000004}, {"char": ["there"], "start_offset": 484, "end_offset": 488, "start": 38.72, "end": 39.04}, {"char": ["."], "start_offset": 488, "end_offset": 488, "start": 39.04, "end": 39.04}, {"char": ["P"], "start_offset": 512, "end_offset": 514, "start": 40.96, "end": 41.12}, {"char": ["ack"], "start_offset": 514, "end_offset": 517, "start": 41.12, "end": 41.36}, {"char": ["up"], "start_offset": 517, "end_offset": 520, "start": 41.36, "end": 41.6}, {"char": ["your"], "start_offset": 520, "end_offset": 523, "start": 41.6, "end": 41.84}, {"char": ["tr"], "start_offset": 523, "end_offset": 525, "start": 41.84, "end": 42.0}, {"char": ["ou"], "start_offset": 525, "end_offset": 527, "start": 42.0, "end": 42.160000000000004}, {"char": ["b"], "start_offset": 527, "end_offset": 529, "start": 42.160000000000004, "end": 42.32}, {"char": ["les"], "start_offset": 529, "end_offset": 531, "start": 42.32, "end": 42.480000000000004}, {"char": ["in"], "start_offset": 531, "end_offset": 534, "start": 42.480000000000004, "end": 42.72}, {"char": ["your"], "start_offset": 534, "end_offset": 537, "start": 42.72, "end": 42.96}, {"char": ["o"], "start_offset": 537, "end_offset": 540, "start": 42.96, "end": 43.2}, {"char": ["ld"], "start_offset": 540, "end_offset": 542, "start": 43.2, "end": 43.36}, {"char": ["k"], "start_offset": 542, "end_offset": 545, "start": 43.36, "end": 43.6}, {"char": ["it"], "start_offset": 545, "end_offset": 547, "start": 43.6, "end": 43.76}, {"char": ["s"], "start_offset": 547, "end_offset": 549, "start": 43.76, "end": 43.92}, {"char": ["b"], "start_offset": 551, "end_offset": 555, "start": 44.08, "end": 44.4}, {"char": ["ag"], "start_offset": 555, "end_offset": 559, "start": 44.4, "end": 44.72}, {"char": ["and"], "start_offset": 559, "end_offset": 563, "start": 44.72, "end": 45.04}, {"char": ["sm"], "start_offset": 563, "end_offset": 567, "start": 45.04, "end": 45.36}, {"char": ["ile"], "start_offset": 567, "end_offset": 570, "start": 45.36, "end": 45.6}, {"char": [","], "start_offset": 570, "end_offset": 570, "start": 45.6, "end": 45.6}, {"char": ["sm"], "start_offset": 577, "end_offset": 581, "start": 46.160000000000004, "end": 46.480000000000004}, {"char": ["ile"], "start_offset": 581, "end_offset": 585, "start": 46.480000000000004, "end": 46.800000000000004}, {"char": [","], "start_offset": 585, "end_offset": 585, "start": 46.800000000000004, "end": 46.800000000000004}, {"char": ["sm"], "start_offset": 591, "end_offset": 595, "start": 47.28, "end": 47.6}, {"char": ["ile"], "start_offset": 595, "end_offset": 599, "start": 47.6, "end": 47.92}, {"char": ["."], "start_offset": 599, "end_offset": 599, "start": 47.92, "end": 47.92}, {"char": ["Wh"], "start_offset": 621, "end_offset": 623, "start": 49.68, "end": 49.84}, {"char": ["ile"], "start_offset": 623, "end_offset": 625, "start": 49.84, "end": 50.0}, {"char": ["you"], "start_offset": 625, "end_offset": 628, "start": 50.0, "end": 50.24}, {"char": ["the"], "start_offset": 630, "end_offset": 631, "start": 50.4, "end": 50.480000000000004}, {"char": ["L"], "start_offset": 633, "end_offset": 635, "start": 50.64, "end": 50.800000000000004}, {"char": ["uc"], "start_offset": 635, "end_offset": 637, "start": 50.800000000000004, "end": 50.96}, {"char": ["if"], "start_offset": 637, "end_offset": 640, "start": 50.96, "end": 51.2}, {"char": ["er"], "start_offset": 640, "end_offset": 642, "start": 51.2, "end": 51.36}, {"char": ["de"], "start_offset": 643, "end_offset": 645, "start": 51.44, "end": 51.6}, {"char": ["l"], "start_offset": 645, "end_offset": 647, "start": 51.6, "end": 51.76}, {"char": ["ight"], "start_offset": 647, "end_offset": 650, "start": 51.76, "end": 52.0}, {"char": ["your"], "start_offset": 654, "end_offset": 656, "start": 52.32, "end": 52.480000000000004}, {"char": ["f"], "start_offset": 660, "end_offset": 664, "start": 52.800000000000004, "end": 53.120000000000005}, {"char": ["ag"], "start_offset": 664, "end_offset": 667, "start": 53.120000000000005, "end": 53.36}, {"char": ["sm"], "start_offset": 674, "end_offset": 675, "start": 53.92, "end": 54.0}, {"char": ["ile"], "start_offset": 677, "end_offset": 680, "start": 54.160000000000004, "end": 54.4}, {"char": [","], "start_offset": 680, "end_offset": 680, "start": 54.4, "end": 54.4}, {"char": ["bo"], "start_offset": 681, "end_offset": 684, "start": 54.480000000000004, "end": 54.72}, {"char": ["ys"], "start_offset": 684, "end_offset": 687, "start": 54.72, "end": 54.96}, {"char": [","], "start_offset": 687, "end_offset": 687, "start": 54.96, "end": 54.96}, {"char": ["that"], "start_offset": 689, "end_offset": 692, "start": 55.120000000000005, "end": 55.36}, {"char": ["'"], "start_offset": 692, "end_offset": 692, "start": 55.36, "end": 55.36}, {"char": ["s"], "start_offset": 694, "end_offset": 698, "start": 55.52, "end": 55.84}, {"char": ["the"], "start_offset": 698, "end_offset": 702, "start": 55.84, "end": 56.160000000000004}, {"char": ["st"], "start_offset": 702, "end_offset": 706, "start": 56.160000000000004, "end": 56.480000000000004}, {"char": ["y"], "start_offset": 706, "end_offset": 710, "start": 56.480000000000004, "end": 56.800000000000004}, {"char": ["le"], "start_offset": 710, "end_offset": 714, "start": 56.800000000000004, "end": 57.120000000000005}, {"char": ["."], "start_offset": 714, "end_offset": 714, "start": 57.120000000000005, "end": 57.120000000000005}, {"char": ["What"], "start_offset": 731, "end_offset": 735, "start": 58.480000000000004, "end": 58.800000000000004}, {"char": ["'"], "start_offset": 735, "end_offset": 735, "start": 58.800000000000004, "end": 58.800000000000004}, {"char": ["s"], "start_offset": 739, "end_offset": 743, "start": 59.120000000000005, "end": 59.44}, {"char": ["the"], "start_offset": 743, "end_offset": 747, "start": 59.44, "end": 59.76}, {"char": ["use"], "start_offset": 747, "end_offset": 751, "start": 59.76, "end": 60.08}, {"char": ["of"], "start_offset": 751, "end_offset": 755, "start": 60.08, "end": 60.4}, {"char": ["wor"], "start_offset": 755, "end_offset": 759, "start": 60.4, "end": 60.72}, {"char": ["ry"], "start_offset": 763, "end_offset": 766, "start": 61.04, "end": 61.28}, {"char": ["ing"], "start_offset": 766, "end_offset": 769, "start": 61.28, "end": 61.52}, {"char": ["?"], "start_offset": 769, "end_offset": 769, "start": 61.52, "end": 61.52}, {"char": ["It"], "start_offset": 780, "end_offset": 784, "start": 62.4, "end": 62.72}, {"char": ["never"], "start_offset": 788, "end_offset": 792, "start": 63.04, "end": 63.36}, {"char": ["was"], "start_offset": 796, "end_offset": 800, "start": 63.68, "end": 64.0}, {"char": ["wor"], "start_offset": 804, "end_offset": 808, "start": 64.32000000000001, "end": 64.64}, {"char": ["th"], "start_offset": 808, "end_offset": 811, "start": 64.64, "end": 64.88}, {"char": ["w"], "start_offset": 813, "end_offset": 816, "start": 65.04, "end": 65.28}, {"char": ["h"], "start_offset": 816, "end_offset": 820, "start": 65.28, "end": 65.6}, {"char": ["ile"], "start_offset": 820, "end_offset": 820, "start": 65.6, "end": 65.6}, {"char": ["."], "start_offset": 820, "end_offset": 820, "start": 65.6, "end": 65.6}, {"char": ["So"], "start_offset": 828, "end_offset": 831, "start": 66.24, "end": 66.48}, {"char": ["p"], "start_offset": 837, "end_offset": 841, "start": 66.96000000000001, "end": 67.28}, {"char": ["ack"], "start_offset": 841, "end_offset": 845, "start": 67.28, "end": 67.6}, {"char": ["up"], "start_offset": 845, "end_offset": 849, "start": 67.6, "end": 67.92}, {"char": ["your"], "start_offset": 849, "end_offset": 852, "start": 67.92, "end": 68.16}, {"char": ["tr"], "start_offset": 852, "end_offset": 854, "start": 68.16, "end": 68.32000000000001}, {"char": ["ou"], "start_offset": 854, "end_offset": 856, "start": 68.32000000000001, "end": 68.48}, {"char": ["b"], "start_offset": 856, "end_offset": 858, "start": 68.48, "end": 68.64}, {"char": ["les"], "start_offset": 858, "end_offset": 861, "start": 68.64, "end": 68.88}, {"char": ["in"], "start_offset": 861, "end_offset": 864, "start": 68.88, "end": 69.12}, {"char": ["your"], "start_offset": 864, "end_offset": 867, "start": 69.12, "end": 69.36}, {"char": ["o"], "start_offset": 867, "end_offset": 870, "start": 69.36, "end": 69.60000000000001}, {"char": ["ld"], "start_offset": 870, "end_offset": 873, "start": 69.60000000000001, "end": 69.84}, {"char": ["k"], "start_offset": 873, "end_offset": 876, "start": 69.84, "end": 70.08}, {"char": ["it"], "start_offset": 876, "end_offset": 878, "start": 70.08, "end": 70.24}, {"char": ["'"], "start_offset": 878, "end_offset": 878, "start": 70.24, "end": 70.24}, {"char": ["s"], "start_offset": 880, "end_offset": 882, "start": 70.4, "end": 70.56}, {"char": ["b"], "start_offset": 882, "end_offset": 885, "start": 70.56, "end": 70.8}, {"char": ["ag"], "start_offset": 885, "end_offset": 888, "start": 70.8, "end": 71.04}, {"char": ["and"], "start_offset": 890, "end_offset": 894, "start": 71.2, "end": 71.52}, {"char": ["sm"], "start_offset": 894, "end_offset": 898, "start": 71.52, "end": 71.84}, {"char": ["ile"], "start_offset": 898, "end_offset": 902, "start": 71.84, "end": 72.16}, {"char": [","], "start_offset": 902, "end_offset": 902, "start": 72.16, "end": 72.16}, {"char": ["sm"], "start_offset": 907, "end_offset": 911, "start": 72.56, "end": 72.88}, {"char": ["ile"], "start_offset": 911, "end_offset": 915, "start": 72.88, "end": 73.2}, {"char": [","], "start_offset": 915, "end_offset": 915, "start": 73.2, "end": 73.2}, {"char": ["sm"], "start_offset": 921, "end_offset": 925, "start": 73.68, "end": 74.0}, {"char": ["ile"], "start_offset": 925, "end_offset": 929, "start": 74.0, "end": 74.32000000000001}, {"char": ["."], "start_offset": 929, "end_offset": 929, "start": 74.32000000000001, "end": 74.32000000000001}, {"char": ["It"], "start_offset": 945, "end_offset": 947, "start": 75.60000000000001, "end": 75.76}, {"char": ["'"], "start_offset": 947, "end_offset": 947, "start": 75.76, "end": 75.76}, {"char": ["s"], "start_offset": 951, "end_offset": 951, "start": 76.08, "end": 76.08}, {"char": ["a"], "start_offset": 951, "end_offset": 955, "start": 76.08, "end": 76.4}, {"char": ["long"], "start_offset": 955, "end_offset": 959, "start": 76.4, "end": 76.72}, {"char": ["way"], "start_offset": 959, "end_offset": 962, "start": 76.72, "end": 76.96000000000001}, {"char": ["to"], "start_offset": 965, "end_offset": 968, "start": 77.2, "end": 77.44}, {"char": ["t"], "start_offset": 968, "end_offset": 971, "start": 77.44, "end": 77.68}, {"char": ["i"], "start_offset": 971, "end_offset": 973, "start": 77.68, "end": 77.84}, {"char": ["pp"], "start_offset": 973, "end_offset": 974, "start": 77.84, "end": 77.92}, {"char": ["er"], "start_offset": 974, "end_offset": 976, "start": 77.92, "end": 78.08}, {"char": ["y"], "start_offset": 984, "end_offset": 987, "start": 78.72, "end": 78.96000000000001}, {"char": ["."], "start_offset": 987, "end_offset": 987, "start": 78.96000000000001, "end": 78.96000000000001}, {"char": ["It"], "start_offset": 999, "end_offset": 1002, "start": 79.92, "end": 80.16}, {"char": ["'"], "start_offset": 1002, "end_offset": 1002, "start": 80.16, "end": 80.16}, {"char": ["s"], "start_offset": 1006, "end_offset": 1006, "start": 80.48, "end": 80.48}, {"char": ["a"], "start_offset": 1006, "end_offset": 1010, "start": 80.48, "end": 80.8}, {"char": ["long"], "start_offset": 1010, "end_offset": 1014, "start": 80.8, "end": 81.12}, {"char": ["way"], "start_offset": 1014, "end_offset": 1018, "start": 81.12, "end": 81.44}, {"char": ["to"], "start_offset": 1026, "end_offset": 1030, "start": 82.08, "end": 82.4}, {"char": ["go"], "start_offset": 1034, "end_offset": 1038, "start": 82.72, "end": 83.04}, {"char": ["."], "start_offset": 1038, "end_offset": 1038, "start": 83.04, "end": 83.04}, {"char": ["It"], "start_offset": 1054, "end_offset": 1056, "start": 84.32000000000001, "end": 84.48}, {"char": ["'"], "start_offset": 1056, "end_offset": 1056, "start": 84.48, "end": 84.48}, {"char": ["s"], "start_offset": 1060, "end_offset": 1060, "start": 84.8, "end": 84.8}, {"char": ["a"], "start_offset": 1060, "end_offset": 1064, "start": 84.8, "end": 85.12}, {"char": ["long"], "start_offset": 1064, "end_offset": 1068, "start": 85.12, "end": 85.44}, {"char": ["way"], "start_offset": 1068, "end_offset": 1072, "start": 85.44, "end": 85.76}, {"char": ["to"], "start_offset": 1074, "end_offset": 1078, "start": 85.92, "end": 86.24}, {"char": ["t"], "start_offset": 1078, "end_offset": 1081, "start": 86.24, "end": 86.48}, {"char": ["i"], "start_offset": 1081, "end_offset": 1083, "start": 86.48, "end": 86.64}, {"char": ["pp"], "start_offset": 1083, "end_offset": 1084, "start": 86.64, "end": 86.72}, {"char": ["er"], "start_offset": 1084, "end_offset": 1086, "start": 86.72, "end": 86.88}, {"char": ["y"], "start_offset": 1094, "end_offset": 1097, "start": 87.52, "end": 87.76}, {"char": ["to"], "start_offset": 1108, "end_offset": 1111, "start": 88.64, "end": 88.88}, {"char": ["the"], "start_offset": 1111, "end_offset": 1115, "start": 88.88, "end": 89.2}, {"char": ["s"], "start_offset": 1115, "end_offset": 1117, "start": 89.2, "end": 89.36}, {"char": ["we"], "start_offset": 1117, "end_offset": 1121, "start": 89.36, "end": 89.68}, {"char": ["et"], "start_offset": 1121, "end_offset": 1125, "start": 89.68, "end": 90.0}, {"char": ["est"], "start_offset": 1125, "end_offset": 1129, "start": 90.0, "end": 90.32000000000001}, {"char": ["g"], "start_offset": 1129, "end_offset": 1132, "start": 90.32000000000001, "end": 90.56}, {"char": ["ir"], "start_offset": 1132, "end_offset": 1135, "start": 90.56, "end": 90.8}, {"char": ["l"], "start_offset": 1135, "end_offset": 1138, "start": 90.8, "end": 91.04}, {"char": ["I"], "start_offset": 1138, "end_offset": 1142, "start": 91.04, "end": 91.36}, {"char": ["know"], "start_offset": 1146, "end_offset": 1150, "start": 91.68, "end": 92.0}, {"char": ["."], "start_offset": 1150, "end_offset": 1150, "start": 92.0, "end": 92.0}, {"char": ["G"], "start_offset": 1170, "end_offset": 1172, "start": 93.60000000000001, "end": 93.76}, {"char": ["ood"], "start_offset": 1172, "end_offset": 1176, "start": 93.76, "end": 94.08}, {"char": ["b"], "start_offset": 1176, "end_offset": 1179, "start": 94.08, "end": 94.32000000000001}, {"char": ["y"], "start_offset": 1179, "end_offset": 1182, "start": 94.32000000000001, "end": 94.56}, {"char": ["e"], "start_offset": 1182, "end_offset": 1185, "start": 94.56, "end": 94.8}, {"char": ["to"], "start_offset": 1185, "end_offset": 1188, "start": 94.8, "end": 95.04}, {"char": ["P"], "start_offset": 1188, "end_offset": 1190, "start": 95.04, "end": 95.2}, {"char": ["ic"], "start_offset": 1190, "end_offset": 1192, "start": 95.2, "end": 95.36}, {"char": ["c"], "start_offset": 1193, "end_offset": 1194, "start": 95.44, "end": 95.52}, {"char": ["ad"], "start_offset": 1194, "end_offset": 1196, "start": 95.52, "end": 95.68}, {"char": ["ill"], "start_offset": 1200, "end_offset": 1203, "start": 96.0, "end": 96.24000000000001}, {"char": ["y"], "start_offset": 1203, "end_offset": 1206, "start": 96.24000000000001, "end": 96.48}, {"char": ["."], "start_offset": 1206, "end_offset": 1206, "start": 96.48, "end": 96.48}, {"char": ["F"], "start_offset": 1225, "end_offset": 1228, "start": 98.0, "end": 98.24000000000001}, {"char": ["are"], "start_offset": 1228, "end_offset": 1231, "start": 98.24000000000001, "end": 98.48}, {"char": ["we"], "start_offset": 1231, "end_offset": 1233, "start": 98.48, "end": 98.64}, {"char": ["ll"], "start_offset": 1233, "end_offset": 1235, "start": 98.64, "end": 98.8}, {"char": [","], "start_offset": 1235, "end_offset": 1235, "start": 98.8, "end": 98.8}, {"char": ["L"], "start_offset": 1238, "end_offset": 1240, "start": 99.04, "end": 99.2}, {"char": ["e"], "start_offset": 1240, "end_offset": 1242, "start": 99.2, "end": 99.36}, {"char": ["ic"], "start_offset": 1242, "end_offset": 1244, "start": 99.36, "end": 99.52}, {"char": ["es"], "start_offset": 1244, "end_offset": 1247, "start": 99.52, "end": 99.76}, {"char": ["ter"], "start_offset": 1247, "end_offset": 1250, "start": 99.76, "end": 100.0}, {"char": ["S"], "start_offset": 1250, "end_offset": 1254, "start": 100.0, "end": 100.32000000000001}, {"char": ["qu"], "start_offset": 1254, "end_offset": 1258, "start": 100.32000000000001, "end": 100.64}, {"char": ["are"], "start_offset": 1258, "end_offset": 1262, "start": 100.64, "end": 100.96000000000001}, {"char": ["."], "start_offset": 1262, "end_offset": 1262, "start": 100.96000000000001, "end": 100.96000000000001}, {"char": ["It"], "start_offset": 1274, "end_offset": 1276, "start": 101.92, "end": 102.08}, {"char": ["'"], "start_offset": 1276, "end_offset": 1276, "start": 102.08, "end": 102.08}, {"char": ["s"], "start_offset": 1279, "end_offset": 1279, "start": 102.32000000000001, "end": 102.32000000000001}, {"char": ["a"], "start_offset": 1279, "end_offset": 1281, "start": 102.32000000000001, "end": 102.48}, {"char": ["long"], "start_offset": 1281, "end_offset": 1284, "start": 102.48, "end": 102.72}, {"char": [","], "start_offset": 1284, "end_offset": 1284, "start": 102.72, "end": 102.72}, {"char": ["long"], "start_offset": 1287, "end_offset": 1289, "start": 102.96000000000001, "end": 103.12}, {"char": ["way"], "start_offset": 1293, "end_offset": 1296, "start": 103.44, "end": 103.68}, {"char": ["to"], "start_offset": 1296, "end_offset": 1299, "start": 103.68, "end": 103.92}, {"char": ["t"], "start_offset": 1299, "end_offset": 1302, "start": 103.92, "end": 104.16}, {"char": ["i"], "start_offset": 1302, "end_offset": 1304, "start": 104.16, "end": 104.32000000000001}, {"char": ["pp"], "start_offset": 1304, "end_offset": 1305, "start": 104.32000000000001, "end": 104.4}, {"char": ["er"], "start_offset": 1305, "end_offset": 1307, "start": 104.4, "end": 104.56}, {"char": ["y"], "start_offset": 1322, "end_offset": 1326, "start": 105.76, "end": 106.08}, {"char": ["."], "start_offset": 1326, "end_offset": 1326, "start": 106.08, "end": 106.08}, {"char": ["But"], "start_offset": 1330, "end_offset": 1334, "start": 106.4, "end": 106.72}, {"char": ["my"], "start_offset": 1334, "end_offset": 1338, "start": 106.72, "end": 107.04}, {"char": ["he"], "start_offset": 1342, "end_offset": 1346, "start": 107.36, "end": 107.68}, {"char": ["art"], "start_offset": 1346, "end_offset": 1350, "start": 107.68, "end": 108.0}, {"char": ["'"], "start_offset": 1350, "end_offset": 1350, "start": 108.0, "end": 108.0}, {"char": ["s"], "start_offset": 1353, "end_offset": 1357, "start": 108.24000000000001, "end": 108.56}, {"char": ["right"], "start_offset": 1357, "end_offset": 1361, "start": 108.56, "end": 108.88}, {"char": ["there"], "start_offset": 1365, "end_offset": 1369, "start": 109.2, "end": 109.52}, {"char": ["."], "start_offset": 1369, "end_offset": 1369, "start": 109.52, "end": 109.52}, {"char": ["It"], "start_offset": 1385, "end_offset": 1387, "start": 110.8, "end": 110.96000000000001}, {"char": ["'"], "start_offset": 1387, "end_offset": 1387, "start": 110.96000000000001, "end": 110.96000000000001}, {"char": ["s"], "start_offset": 1390, "end_offset": 1390, "start": 111.2, "end": 111.2}, {"char": ["a"], "start_offset": 1390, "end_offset": 1394, "start": 111.2, "end": 111.52}, {"char": ["long"], "start_offset": 1394, "end_offset": 1398, "start": 111.52, "end": 111.84}, {"char": ["way"], "start_offset": 1398, "end_offset": 1402, "start": 111.84, "end": 112.16}, {"char": ["to"], "start_offset": 1405, "end_offset": 1409, "start": 112.4, "end": 112.72}, {"char": ["t"], "start_offset": 1409, "end_offset": 1411, "start": 112.72, "end": 112.88}, {"char": ["i"], "start_offset": 1411, "end_offset": 1413, "start": 112.88, "end": 113.04}, {"char": ["pp"], "start_offset": 1413, "end_offset": 1414, "start": 113.04, "end": 113.12}, {"char": ["er"], "start_offset": 1416, "end_offset": 1418, "start": 113.28, "end": 113.44}, {"char": ["ary"], "start_offset": 1420, "end_offset": 1423, "start": 113.60000000000001, "end": 113.84}, {"char": ["."], "start_offset": 1423, "end_offset": 1423, "start": 113.84, "end": 113.84}, {"char": ["It"], "start_offset": 1439, "end_offset": 1441, "start": 115.12, "end": 115.28}, {"char": ["'"], "start_offset": 1441, "end_offset": 1441, "start": 115.28, "end": 115.28}, {"char": ["s"], "start_offset": 1444, "end_offset": 1444, "start": 115.52, "end": 115.52}, {"char": ["a"], "start_offset": 1444, "end_offset": 1448, "start": 115.52, "end": 115.84}, {"char": ["long"], "start_offset": 1448, "end_offset": 1452, "start": 115.84, "end": 116.16}, {"char": ["way"], "start_offset": 1456, "end_offset": 1460, "start": 116.48, "end": 116.8}, {"char": ["to"], "start_offset": 1464, "end_offset": 1467, "start": 117.12, "end": 117.36}, {"char": ["go"], "start_offset": 1475, "end_offset": 1479, "start": 118.0, "end": 118.32000000000001}, {"char": ["."], "start_offset": 1479, "end_offset": 1479, "start": 118.32000000000001, "end": 118.32000000000001}, {"char": ["It"], "start_offset": 1494, "end_offset": 1496, "start": 119.52, "end": 119.68}, {"char": ["'"], "start_offset": 1496, "end_offset": 1496, "start": 119.68, "end": 119.68}, {"char": ["s"], "start_offset": 1500, "end_offset": 1500, "start": 120.0, "end": 120.0}, {"char": ["a"], "start_offset": 1500, "end_offset": 1504, "start": 120.0, "end": 120.32000000000001}, {"char": ["long"], "start_offset": 1504, "end_offset": 1508, "start": 120.32000000000001, "end": 120.64}, {"char": ["way"], "start_offset": 1508, "end_offset": 1512, "start": 120.64, "end": 120.96000000000001}, {"char": ["to"], "start_offset": 1515, "end_offset": 1519, "start": 121.2, "end": 121.52}, {"char": ["t"], "start_offset": 1519, "end_offset": 1521, "start": 121.52, "end": 121.68}, {"char": ["i"], "start_offset": 1521, "end_offset": 1523, "start": 121.68, "end": 121.84}, {"char": ["pp"], "start_offset": 1523, "end_offset": 1524, "start": 121.84, "end": 121.92}, {"char": ["er"], "start_offset": 1524, "end_offset": 1526, "start": 121.92, "end": 122.08}, {"char": ["y"], "start_offset": 1537, "end_offset": 1540, "start": 122.96000000000001, "end": 123.2}, {"char": ["to"], "start_offset": 1548, "end_offset": 1552, "start": 123.84, "end": 124.16}, {"char": ["the"], "start_offset": 1552, "end_offset": 1555, "start": 124.16, "end": 124.4}, {"char": ["s"], "start_offset": 1555, "end_offset": 1558, "start": 124.4, "end": 124.64}, {"char": ["we"], "start_offset": 1558, "end_offset": 1562, "start": 124.64, "end": 124.96000000000001}, {"char": ["et"], "start_offset": 1562, "end_offset": 1565, "start": 124.96000000000001, "end": 125.2}, {"char": ["est"], "start_offset": 1565, "end_offset": 1569, "start": 125.2, "end": 125.52}, {"char": ["g"], "start_offset": 1572, "end_offset": 1575, "start": 125.76, "end": 126.0}, {"char": ["ir"], "start_offset": 1575, "end_offset": 1578, "start": 126.0, "end": 126.24000000000001}, {"char": ["l"], "start_offset": 1578, "end_offset": 1582, "start": 126.24000000000001, "end": 126.56}, {"char": ["I"], "start_offset": 1582, "end_offset": 1586, "start": 126.56, "end": 126.88000000000001}, {"char": ["know"], "start_offset": 1586, "end_offset": 1590, "start": 126.88000000000001, "end": 127.2}, {"char": ["."], "start_offset": 1590, "end_offset": 1590, "start": 127.2, "end": 127.2}, {"char": ["G"], "start_offset": 1610, "end_offset": 1612, "start": 128.8, "end": 128.96}, {"char": ["ood"], "start_offset": 1612, "end_offset": 1616, "start": 128.96, "end": 129.28}, {"char": ["b"], "start_offset": 1616, "end_offset": 1619, "start": 129.28, "end": 129.52}, {"char": ["y"], "start_offset": 1619, "end_offset": 1623, "start": 129.52, "end": 129.84}, {"char": ["e"], "start_offset": 1623, "end_offset": 1626, "start": 129.84, "end": 130.08}, {"char": [","], "start_offset": 1626, "end_offset": 1626, "start": 130.08, "end": 130.08}, {"char": ["P"], "start_offset": 1629, "end_offset": 1631, "start": 130.32, "end": 130.48}, {"char": ["ic"], "start_offset": 1631, "end_offset": 1634, "start": 130.48, "end": 130.72}, {"char": ["c"], "start_offset": 1634, "end_offset": 1635, "start": 130.72, "end": 130.8}, {"char": ["ad"], "start_offset": 1635, "end_offset": 1637, "start": 130.8, "end": 130.96}, {"char": ["ill"], "start_offset": 1639, "end_offset": 1642, "start": 131.12, "end": 131.36}, {"char": ["y"], "start_offset": 1642, "end_offset": 1646, "start": 131.36, "end": 131.68}, {"char": ["."], "start_offset": 1646, "end_offset": 1646, "start": 131.68, "end": 131.68}, {"char": ["F"], "start_offset": 1665, "end_offset": 1668, "start": 133.2, "end": 133.44}, {"char": ["are"], "start_offset": 1668, "end_offset": 1672, "start": 133.44, "end": 133.76}, {"char": ["we"], "start_offset": 1672, "end_offset": 1675, "start": 133.76, "end": 134.0}, {"char": ["ll"], "start_offset": 1675, "end_offset": 1678, "start": 134.0, "end": 134.24}, {"char": [","], "start_offset": 1678, "end_offset": 1678, "start": 134.24, "end": 134.24}, {"char": ["L"], "start_offset": 1681, "end_offset": 1683, "start": 134.48, "end": 134.64000000000001}, {"char": ["e"], "start_offset": 1683, "end_offset": 1685, "start": 134.64000000000001, "end": 134.8}, {"char": ["ic"], "start_offset": 1685, "end_offset": 1687, "start": 134.8, "end": 134.96}, {"char": ["es"], "start_offset": 1687, "end_offset": 1689, "start": 134.96, "end": 135.12}, {"char": ["ter"], "start_offset": 1689, "end_offset": 1691, "start": 135.12, "end": 135.28}, {"char": ["S"], "start_offset": 1693, "end_offset": 1696, "start": 135.44, "end": 135.68}, {"char": ["qu"], "start_offset": 1696, "end_offset": 1700, "start": 135.68, "end": 136.0}, {"char": ["are"], "start_offset": 1700, "end_offset": 1704, "start": 136.0, "end": 136.32}, {"char": ["."], "start_offset": 1704, "end_offset": 1704, "start": 136.32, "end": 136.32}, {"char": ["It"], "start_offset": 1714, "end_offset": 1716, "start": 137.12, "end": 137.28}, {"char": ["'"], "start_offset": 1716, "end_offset": 1716, "start": 137.28, "end": 137.28}, {"char": ["s"], "start_offset": 1718, "end_offset": 1718, "start": 137.44, "end": 137.44}, {"char": ["a"], "start_offset": 1718, "end_offset": 1721, "start": 137.44, "end": 137.68}, {"char": ["long"], "start_offset": 1721, "end_offset": 1724, "start": 137.68, "end": 137.92000000000002}, {"char": [","], "start_offset": 1724, "end_offset": 1724, "start": 137.92000000000002, "end": 137.92000000000002}, {"char": ["long"], "start_offset": 1728, "end_offset": 1732, "start": 138.24, "end": 138.56}, {"char": ["way"], "start_offset": 1732, "end_offset": 1736, "start": 138.56, "end": 138.88}, {"char": ["to"], "start_offset": 1736, "end_offset": 1739, "start": 138.88, "end": 139.12}, {"char": ["T"], "start_offset": 1739, "end_offset": 1741, "start": 139.12, "end": 139.28}, {"char": ["i"], "start_offset": 1741, "end_offset": 1743, "start": 139.28, "end": 139.44}, {"char": ["pp"], "start_offset": 1743, "end_offset": 1744, "start": 139.44, "end": 139.52}, {"char": ["er"], "start_offset": 1746, "end_offset": 1748, "start": 139.68, "end": 139.84}, {"char": ["ary"], "start_offset": 1750, "end_offset": 1753, "start": 140.0, "end": 140.24}, {"char": ["."], "start_offset": 1753, "end_offset": 1753, "start": 140.24, "end": 140.24}, {"char": ["But"], "start_offset": 1770, "end_offset": 1773, "start": 141.6, "end": 141.84}, {"char": ["my"], "start_offset": 1776, "end_offset": 1780, "start": 142.08, "end": 142.4}, {"char": ["he"], "start_offset": 1784, "end_offset": 1788, "start": 142.72, "end": 143.04}, {"char": ["art"], "start_offset": 1788, "end_offset": 1792, "start": 143.04, "end": 143.36}, {"char": ["'"], "start_offset": 1792, "end_offset": 1792, "start": 143.36, "end": 143.36}, {"char": ["s"], "start_offset": 1796, "end_offset": 1800, "start": 143.68, "end": 144.0}, {"char": ["right"], "start_offset": 1800, "end_offset": 1804, "start": 144.0, "end": 144.32}, {"char": ["there"], "start_offset": 1804, "end_offset": 1808, "start": 144.32, "end": 144.64000000000001}, {"char": ["."], "start_offset": 1808, "end_offset": 1808, "start": 144.64000000000001, "end": 144.64000000000001}], "word": [{"word": "It's", "start_offset": 62, "end_offset": 69, "start": 4.96, "end": 5.5200000000000005, "phoneme": "\u026ats|_"}, {"word": "a", "start_offset": 69, "end_offset": 73, "start": 5.5200000000000005, "end": 5.84, "phoneme": "\u0259|_"}, {"word": "long", "start_offset": 73, "end_offset": 77, "start": 5.84, "end": 6.16, "phoneme": "l\u0254\u014b|_"}, {"word": "way", "start_offset": 77, "end_offset": 81, "start": 6.16, "end": 6.48, "phoneme": "we\u026a|_"}, {"word": "to", "start_offset": 84, "end_offset": 88, "start": 6.72, "end": 7.04, "phoneme": "tu\u02d0|_"}, {"word": "tippery.", "start_offset": 88, "end_offset": 107, "start": 7.04, "end": 8.56, "phoneme": "t\u026ap\u025di."}, {"word": "It's", "start_offset": 118, "end_offset": 123, "start": 9.44, "end": 9.84, "phoneme": "\u026ats|_"}, {"word": "a", "start_offset": 123, "end_offset": 127, "start": 9.84, "end": 10.16, "phoneme": "\u0259|_"}, {"word": "long", "start_offset": 127, "end_offset": 131, "start": 10.16, "end": 10.48, "phoneme": "l\u0254\u014b|_"}, {"word": "way", "start_offset": 135, "end_offset": 139, "start": 10.8, "end": 11.120000000000001, "phoneme": "we\u026a|_"}, {"word": "to", "start_offset": 143, "end_offset": 147, "start": 11.44, "end": 11.76, "phoneme": "tu\u02d0|_"}, {"word": "go.", "start_offset": 155, "end_offset": 159, "start": 12.4, "end": 12.72, "phoneme": "go\u028a."}, {"word": "It's", "start_offset": 174, "end_offset": 179, "start": 13.92, "end": 14.32, "phoneme": "\u026ats|_"}, {"word": "a", "start_offset": 179, "end_offset": 183, "start": 14.32, "end": 14.64, "phoneme": "\u0259|_"}, {"word": "long", "start_offset": 183, "end_offset": 187, "start": 14.64, "end": 14.96, "phoneme": "l\u0254\u014b|_"}, {"word": "way", "start_offset": 187, "end_offset": 191, "start": 14.96, "end": 15.280000000000001, "phoneme": "we\u026a|_"}, {"word": "to", "start_offset": 195, "end_offset": 198, "start": 15.6, "end": 15.84, "phoneme": "tu\u02d0|_"}, {"word": "tipperary", "start_offset": 198, "end_offset": 211, "start": 15.84, "end": 16.88, "phoneme": "t\u026ap\u025d\u025bri|_"}, {"word": "to", "start_offset": 227, "end_offset": 231, "start": 18.16, "end": 18.48, "phoneme": "tu\u02d0|_"}, {"word": "the", "start_offset": 231, "end_offset": 234, "start": 18.48, "end": 18.72, "phoneme": "\u00f0\u0259|_"}, {"word": "sweetest", "start_offset": 234, "end_offset": 248, "start": 18.72, "end": 19.84, "phoneme": "swi\u02d0t\u0259st|_"}, {"word": "girl", "start_offset": 248, "end_offset": 256, "start": 19.84, "end": 20.48, "phoneme": "g\u025d\u02d0l|_"}, {"word": "I", "start_offset": 258, "end_offset": 262, "start": 20.64, "end": 20.96, "phoneme": "a\u026a|_"}, {"word": "know.", "start_offset": 266, "end_offset": 270, "start": 21.28, "end": 21.6, "phoneme": "no\u028a."}, {"word": "Goodbye", "start_offset": 289, "end_offset": 305, "start": 23.12, "end": 24.400000000000002, "phoneme": "g\u028adba\u026a|_"}, {"word": "to", "start_offset": 305, "end_offset": 308, "start": 24.400000000000002, "end": 24.64, "phoneme": "tu\u02d0|_"}, {"word": "Piccadilly.", "start_offset": 308, "end_offset": 328, "start": 24.64, "end": 26.240000000000002, "phoneme": "p\u026ak\u0259d\u026ali."}, {"word": "Farewell,", "start_offset": 343, "end_offset": 355, "start": 27.44, "end": 28.400000000000002, "phoneme": "f\u025brw\u025bl,"}, {"word": "Leicester", "start_offset": 357, "end_offset": 369, "start": 28.560000000000002, "end": 29.52, "phoneme": "l\u025bst\u025d"}, {"word": "Square.", "start_offset": 369, "end_offset": 381, "start": 29.52, "end": 30.48, "phoneme": "skw\u025br."}, {"word": "It's", "start_offset": 393, "end_offset": 397, "start": 31.44, "end": 31.76, "phoneme": "\u026ats|_"}, {"word": "a", "start_offset": 397, "end_offset": 400, "start": 31.76, "end": 32.0, "phoneme": "\u0259|_"}, {"word": "long,", "start_offset": 400, "end_offset": 404, "start": 32.0, "end": 32.32, "phoneme": "l\u0254\u014b,"}, {"word": "long", "start_offset": 406, "end_offset": 408, "start": 32.480000000000004, "end": 32.64, "phoneme": "l\u0254\u014b|_"}, {"word": "way", "start_offset": 412, "end_offset": 415, "start": 32.96, "end": 33.2, "phoneme": "we\u026a|_"}, {"word": "to", "start_offset": 415, "end_offset": 419, "start": 33.2, "end": 33.52, "phoneme": "tu\u02d0|_"}, {"word": "tippery.", "start_offset": 419, "end_offset": 446, "start": 33.52, "end": 35.68, "phoneme": "t\u026ap\u025di."}, {"word": "But", "start_offset": 450, "end_offset": 454, "start": 36.0, "end": 36.32, "phoneme": "b\u028ct|_"}, {"word": "my", "start_offset": 454, "end_offset": 458, "start": 36.32, "end": 36.64, "phoneme": "ma\u026a|_"}, {"word": "heart's", "start_offset": 462, "end_offset": 477, "start": 36.96, "end": 38.160000000000004, "phoneme": "h\u0251\u02d0rts|_"}, {"word": "right", "start_offset": 477, "end_offset": 481, "start": 38.160000000000004, "end": 38.480000000000004, "phoneme": "ra\u026at|_"}, {"word": "there.", "start_offset": 484, "end_offset": 488, "start": 38.72, "end": 39.04, "phoneme": "\u00f0\u025br."}, {"word": "Pack", "start_offset": 512, "end_offset": 517, "start": 40.96, "end": 41.36, "phoneme": "p\u00e6k|_"}, {"word": "up", "start_offset": 517, "end_offset": 520, "start": 41.36, "end": 41.6, "phoneme": "\u028cp|_"}, {"word": "your", "start_offset": 520, "end_offset": 523, "start": 41.6, "end": 41.84, "phoneme": "j\u0254r"}, {"word": "troubles", "start_offset": 523, "end_offset": 531, "start": 41.84, "end": 42.480000000000004, "phoneme": "tr\u028cb\u0259lz"}, {"word": "in", "start_offset": 531, "end_offset": 534, "start": 42.480000000000004, "end": 42.72, "phoneme": "\u026an|_"}, {"word": "your", "start_offset": 534, "end_offset": 537, "start": 42.72, "end": 42.96, "phoneme": "j\u0254r"}, {"word": "old", "start_offset": 537, "end_offset": 542, "start": 42.96, "end": 43.36, "phoneme": "o\u028ald"}, {"word": "kits", "start_offset": 542, "end_offset": 549, "start": 43.36, "end": 43.92, "phoneme": "k\u026ats|_"}, {"word": "bag", "start_offset": 551, "end_offset": 559, "start": 44.08, "end": 44.72, "phoneme": "b\u00e6g"}, {"word": "and", "start_offset": 559, "end_offset": 563, "start": 44.72, "end": 45.04, "phoneme": "\u0259nd"}, {"word": "smile,", "start_offset": 563, "end_offset": 570, "start": 45.04, "end": 45.6, "phoneme": "sma\u026al,"}, {"word": "smile,", "start_offset": 577, "end_offset": 585, "start": 46.160000000000004, "end": 46.800000000000004, "phoneme": "sma\u026al,"}, {"word": "smile.", "start_offset": 591, "end_offset": 599, "start": 47.28, "end": 47.92, "phoneme": "sma\u026al."}, {"word": "While", "start_offset": 621, "end_offset": 625, "start": 49.68, "end": 50.0, "phoneme": "wa\u026al|_"}, {"word": "you", "start_offset": 625, "end_offset": 628, "start": 50.0, "end": 50.24, "phoneme": "ju\u02d0|_"}, {"word": "the", "start_offset": 630, "end_offset": 631, "start": 50.4, "end": 50.480000000000004, "phoneme": "\u00f0\u0259|_"}, {"word": "Lucifer", "start_offset": 633, "end_offset": 642, "start": 50.64, "end": 51.36, "phoneme": "lu\u02d0s\u0259f\u025d"}, {"word": "delight", "start_offset": 643, "end_offset": 650, "start": 51.44, "end": 52.0, "phoneme": "d\u026ala\u026at|_"}, {"word": "your", "start_offset": 654, "end_offset": 656, "start": 52.32, "end": 52.480000000000004, "phoneme": "j\u0254r"}, {"word": "fag", "start_offset": 660, "end_offset": 667, "start": 52.800000000000004, "end": 53.36, "phoneme": "f\u00e6g"}, {"word": "smile,", "start_offset": 674, "end_offset": 680, "start": 53.92, "end": 54.4, "phoneme": "sma\u026al,"}, {"word": "boys,", "start_offset": 681, "end_offset": 687, "start": 54.480000000000004, "end": 54.96, "phoneme": "b\u0254\u026az,"}, {"word": "that's", "start_offset": 689, "end_offset": 698, "start": 55.120000000000005, "end": 55.84, "phoneme": "\u03b8\u00e6ts|_"}, {"word": "the", "start_offset": 698, "end_offset": 702, "start": 55.84, "end": 56.160000000000004, "phoneme": "\u00f0\u0259|_"}, {"word": "style.", "start_offset": 702, "end_offset": 714, "start": 56.160000000000004, "end": 57.120000000000005, "phoneme": "sta\u026al."}, {"word": "What's", "start_offset": 731, "end_offset": 743, "start": 58.480000000000004, "end": 59.44, "phoneme": "w\u0259ts|_"}, {"word": "the", "start_offset": 743, "end_offset": 747, "start": 59.44, "end": 59.76, "phoneme": "\u00f0\u0259|_"}, {"word": "use", "start_offset": 747, "end_offset": 751, "start": 59.76, "end": 60.08, "phoneme": "ju\u02d0s|_"}, {"word": "of", "start_offset": 751, "end_offset": 755, "start": 60.08, "end": 60.4, "phoneme": "\u028cv"}, {"word": "worrying?", "start_offset": 755, "end_offset": 769, "start": 60.4, "end": 61.52, "phoneme": "w\u025d\u02d0i\u02d0\u026a\u014b?"}, {"word": "It", "start_offset": 780, "end_offset": 784, "start": 62.4, "end": 62.72, "phoneme": "\u026at|_"}, {"word": "never", "start_offset": 788, "end_offset": 792, "start": 63.04, "end": 63.36, "phoneme": "n\u025bv\u025d"}, {"word": "was", "start_offset": 796, "end_offset": 800, "start": 63.68, "end": 64.0, "phoneme": "w\u0251\u02d0z"}, {"word": "worthwhile.", "start_offset": 804, "end_offset": 820, "start": 64.32000000000001, "end": 65.6, "phoneme": "w\u025d\u02d0\u03b8wa\u026al."}, {"word": "So", "start_offset": 828, "end_offset": 831, "start": 66.24, "end": 66.48, "phoneme": "so\u028a|_"}, {"word": "pack", "start_offset": 837, "end_offset": 845, "start": 66.96000000000001, "end": 67.6, "phoneme": "p\u00e6k|_"}, {"word": "up", "start_offset": 845, "end_offset": 849, "start": 67.6, "end": 67.92, "phoneme": "\u028cp|_"}, {"word": "your", "start_offset": 849, "end_offset": 852, "start": 67.92, "end": 68.16, "phoneme": "j\u0254r"}, {"word": "troubles", "start_offset": 852, "end_offset": 861, "start": 68.16, "end": 68.88, "phoneme": "tr\u028cb\u0259lz"}, {"word": "in", "start_offset": 861, "end_offset": 864, "start": 68.88, "end": 69.12, "phoneme": "\u026an|_"}, {"word": "your", "start_offset": 864, "end_offset": 867, "start": 69.12, "end": 69.36, "phoneme": "j\u0254r"}, {"word": "old", "start_offset": 867, "end_offset": 873, "start": 69.36, "end": 69.84, "phoneme": "o\u028ald"}, {"word": "kit's", "start_offset": 873, "end_offset": 882, "start": 69.84, "end": 70.56, "phoneme": "k\u026ats|_"}, {"word": "bag", "start_offset": 882, "end_offset": 888, "start": 70.56, "end": 71.04, "phoneme": "b\u00e6g"}, {"word": "and", "start_offset": 890, "end_offset": 894, "start": 71.2, "end": 71.52, "phoneme": "\u0259nd"}, {"word": "smile,", "start_offset": 894, "end_offset": 902, "start": 71.52, "end": 72.16, "phoneme": "sma\u026al,"}, {"word": "smile,", "start_offset": 907, "end_offset": 915, "start": 72.56, "end": 73.2, "phoneme": "sma\u026al,"}, {"word": "smile.", "start_offset": 921, "end_offset": 929, "start": 73.68, "end": 74.32000000000001, "phoneme": "sma\u026al."}, {"word": "It's", "start_offset": 945, "end_offset": 951, "start": 75.60000000000001, "end": 76.08, "phoneme": "\u026ats|_"}, {"word": "a", "start_offset": 951, "end_offset": 955, "start": 76.08, "end": 76.4, "phoneme": "\u0259|_"}, {"word": "long", "start_offset": 955, "end_offset": 959, "start": 76.4, "end": 76.72, "phoneme": "l\u0254\u014b|_"}, {"word": "way", "start_offset": 959, "end_offset": 962, "start": 76.72, "end": 76.96000000000001, "phoneme": "we\u026a|_"}, {"word": "to", "start_offset": 965, "end_offset": 968, "start": 77.2, "end": 77.44, "phoneme": "tu\u02d0|_"}, {"word": "tippery.", "start_offset": 968, "end_offset": 987, "start": 77.44, "end": 78.96000000000001, "phoneme": "t\u026ap\u025di."}, {"word": "It's", "start_offset": 999, "end_offset": 1006, "start": 79.92, "end": 80.48, "phoneme": "\u026ats|_"}, {"word": "a", "start_offset": 1006, "end_offset": 1010, "start": 80.48, "end": 80.8, "phoneme": "\u0259|_"}, {"word": "long", "start_offset": 1010, "end_offset": 1014, "start": 80.8, "end": 81.12, "phoneme": "l\u0254\u014b|_"}, {"word": "way", "start_offset": 1014, "end_offset": 1018, "start": 81.12, "end": 81.44, "phoneme": "we\u026a|_"}, {"word": "to", "start_offset": 1026, "end_offset": 1030, "start": 82.08, "end": 82.4, "phoneme": "tu\u02d0|_"}, {"word": "go.", "start_offset": 1034, "end_offset": 1038, "start": 82.72, "end": 83.04, "phoneme": "go\u028a."}, {"word": "It's", "start_offset": 1054, "end_offset": 1060, "start": 84.32000000000001, "end": 84.8, "phoneme": "\u026ats|_"}, {"word": "a", "start_offset": 1060, "end_offset": 1064, "start": 84.8, "end": 85.12, "phoneme": "\u0259|_"}, {"word": "long", "start_offset": 1064, "end_offset": 1068, "start": 85.12, "end": 85.44, "phoneme": "l\u0254\u014b|_"}, {"word": "way", "start_offset": 1068, "end_offset": 1072, "start": 85.44, "end": 85.76, "phoneme": "we\u026a|_"}, {"word": "to", "start_offset": 1074, "end_offset": 1078, "start": 85.92, "end": 86.24, "phoneme": "tu\u02d0|_"}, {"word": "tippery", "start_offset": 1078, "end_offset": 1097, "start": 86.24, "end": 87.76, "phoneme": "t\u026ap\u025di|_"}, {"word": "to", "start_offset": 1108, "end_offset": 1111, "start": 88.64, "end": 88.88, "phoneme": "tu\u02d0|_"}, {"word": "the", "start_offset": 1111, "end_offset": 1115, "start": 88.88, "end": 89.2, "phoneme": "\u00f0\u0259|_"}, {"word": "sweetest", "start_offset": 1115, "end_offset": 1129, "start": 89.2, "end": 90.32000000000001, "phoneme": "swi\u02d0t\u0259st|_"}, {"word": "girl", "start_offset": 1129, "end_offset": 1138, "start": 90.32000000000001, "end": 91.04, "phoneme": "g\u025d\u02d0l|_"}, {"word": "I", "start_offset": 1138, "end_offset": 1142, "start": 91.04, "end": 91.36, "phoneme": "a\u026a|_"}, {"word": "know.", "start_offset": 1146, "end_offset": 1150, "start": 91.68, "end": 92.0, "phoneme": "no\u028a."}, {"word": "Goodbye", "start_offset": 1170, "end_offset": 1185, "start": 93.60000000000001, "end": 94.8, "phoneme": "g\u028adba\u026a|_"}, {"word": "to", "start_offset": 1185, "end_offset": 1188, "start": 94.8, "end": 95.04, "phoneme": "tu\u02d0|_"}, {"word": "Piccadilly.", "start_offset": 1188, "end_offset": 1206, "start": 95.04, "end": 96.48, "phoneme": "p\u026ak\u0259d\u026ali."}, {"word": "Farewell,", "start_offset": 1225, "end_offset": 1235, "start": 98.0, "end": 98.8, "phoneme": "f\u025brw\u025bl,"}, {"word": "Leicester", "start_offset": 1238, "end_offset": 1250, "start": 99.04, "end": 100.0, "phoneme": "l\u025bst\u025d"}, {"word": "Square.", "start_offset": 1250, "end_offset": 1262, "start": 100.0, "end": 100.96000000000001, "phoneme": "skw\u025br."}, {"word": "It's", "start_offset": 1274, "end_offset": 1279, "start": 101.92, "end": 102.32000000000001, "phoneme": "\u026ats|_"}, {"word": "a", "start_offset": 1279, "end_offset": 1281, "start": 102.32000000000001, "end": 102.48, "phoneme": "\u0259|_"}, {"word": "long,", "start_offset": 1281, "end_offset": 1284, "start": 102.48, "end": 102.72, "phoneme": "l\u0254\u014b,"}, {"word": "long", "start_offset": 1287, "end_offset": 1289, "start": 102.96000000000001, "end": 103.12, "phoneme": "l\u0254\u014b|_"}, {"word": "way", "start_offset": 1293, "end_offset": 1296, "start": 103.44, "end": 103.68, "phoneme": "we\u026a|_"}, {"word": "to", "start_offset": 1296, "end_offset": 1299, "start": 103.68, "end": 103.92, "phoneme": "tu\u02d0|_"}, {"word": "tippery.", "start_offset": 1299, "end_offset": 1326, "start": 103.92, "end": 106.08, "phoneme": "t\u026ap\u025di."}, {"word": "But", "start_offset": 1330, "end_offset": 1334, "start": 106.4, "end": 106.72, "phoneme": "b\u028ct|_"}, {"word": "my", "start_offset": 1334, "end_offset": 1338, "start": 106.72, "end": 107.04, "phoneme": "ma\u026a|_"}, {"word": "heart's", "start_offset": 1342, "end_offset": 1357, "start": 107.36, "end": 108.56, "phoneme": "h\u0251\u02d0rts|_"}, {"word": "right", "start_offset": 1357, "end_offset": 1361, "start": 108.56, "end": 108.88, "phoneme": "ra\u026at|_"}, {"word": "there.", "start_offset": 1365, "end_offset": 1369, "start": 109.2, "end": 109.52, "phoneme": "\u00f0\u025br."}, {"word": "It's", "start_offset": 1385, "end_offset": 1390, "start": 110.8, "end": 111.2, "phoneme": "\u026ats|_"}, {"word": "a", "start_offset": 1390, "end_offset": 1394, "start": 111.2, "end": 111.52, "phoneme": "\u0259|_"}, {"word": "long", "start_offset": 1394, "end_offset": 1398, "start": 111.52, "end": 111.84, "phoneme": "l\u0254\u014b|_"}, {"word": "way", "start_offset": 1398, "end_offset": 1402, "start": 111.84, "end": 112.16, "phoneme": "we\u026a|_"}, {"word": "to", "start_offset": 1405, "end_offset": 1409, "start": 112.4, "end": 112.72, "phoneme": "tu\u02d0|_"}, {"word": "tipperary.", "start_offset": 1409, "end_offset": 1423, "start": 112.72, "end": 113.84, "phoneme": "t\u026ap\u025d\u025bri."}, {"word": "It's", "start_offset": 1439, "end_offset": 1444, "start": 115.12, "end": 115.52, "phoneme": "\u026ats|_"}, {"word": "a", "start_offset": 1444, "end_offset": 1448, "start": 115.52, "end": 115.84, "phoneme": "\u0259|_"}, {"word": "long", "start_offset": 1448, "end_offset": 1452, "start": 115.84, "end": 116.16, "phoneme": "l\u0254\u014b|_"}, {"word": "way", "start_offset": 1456, "end_offset": 1460, "start": 116.48, "end": 116.8, "phoneme": "we\u026a|_"}, {"word": "to", "start_offset": 1464, "end_offset": 1467, "start": 117.12, "end": 117.36, "phoneme": "tu\u02d0|_"}, {"word": "go.", "start_offset": 1475, "end_offset": 1479, "start": 118.0, "end": 118.32000000000001, "phoneme": "go\u028a."}, {"word": "It's", "start_offset": 1494, "end_offset": 1500, "start": 119.52, "end": 120.0, "phoneme": "\u026ats|_"}, {"word": "a", "start_offset": 1500, "end_offset": 1504, "start": 120.0, "end": 120.32000000000001, "phoneme": "\u0259|_"}, {"word": "long", "start_offset": 1504, "end_offset": 1508, "start": 120.32000000000001, "end": 120.64, "phoneme": "l\u0254\u014b|_"}, {"word": "way", "start_offset": 1508, "end_offset": 1512, "start": 120.64, "end": 120.96000000000001, "phoneme": "we\u026a|_"}, {"word": "to", "start_offset": 1515, "end_offset": 1519, "start": 121.2, "end": 121.52, "phoneme": "tu\u02d0|_"}, {"word": "tippery", "start_offset": 1519, "end_offset": 1540, "start": 121.52, "end": 123.2, "phoneme": "t\u026ap\u025di|_"}, {"word": "to", "start_offset": 1548, "end_offset": 1552, "start": 123.84, "end": 124.16, "phoneme": "tu\u02d0|_"}, {"word": "the", "start_offset": 1552, "end_offset": 1555, "start": 124.16, "end": 124.4, "phoneme": "\u00f0\u0259|_"}, {"word": "sweetest", "start_offset": 1555, "end_offset": 1569, "start": 124.4, "end": 125.52, "phoneme": "swi\u02d0t\u0259st|_"}, {"word": "girl", "start_offset": 1572, "end_offset": 1582, "start": 125.76, "end": 126.56, "phoneme": "g\u025d\u02d0l|_"}, {"word": "I", "start_offset": 1582, "end_offset": 1586, "start": 126.56, "end": 126.88000000000001, "phoneme": "a\u026a|_"}, {"word": "know.", "start_offset": 1586, "end_offset": 1590, "start": 126.88000000000001, "end": 127.2, "phoneme": "no\u028a."}, {"word": "Goodbye,", "start_offset": 1610, "end_offset": 1626, "start": 128.8, "end": 130.08, "phoneme": "g\u028adba\u026a,"}, {"word": "Piccadilly.", "start_offset": 1629, "end_offset": 1646, "start": 130.32, "end": 131.68, "phoneme": "p\u026ak\u0259d\u026ali."}, {"word": "Farewell,", "start_offset": 1665, "end_offset": 1678, "start": 133.2, "end": 134.24, "phoneme": "f\u025brw\u025bl,"}, {"word": "Leicester", "start_offset": 1681, "end_offset": 1691, "start": 134.48, "end": 135.28, "phoneme": "l\u025bst\u025d"}, {"word": "Square.", "start_offset": 1693, "end_offset": 1704, "start": 135.44, "end": 136.32, "phoneme": "skw\u025br."}, {"word": "It's", "start_offset": 1714, "end_offset": 1718, "start": 137.12, "end": 137.44, "phoneme": "\u026ats|_"}, {"word": "a", "start_offset": 1718, "end_offset": 1721, "start": 137.44, "end": 137.68, "phoneme": "\u0259|_"}, {"word": "long,", "start_offset": 1721, "end_offset": 1724, "start": 137.68, "end": 137.92000000000002, "phoneme": "l\u0254\u014b,"}, {"word": "long", "start_offset": 1728, "end_offset": 1732, "start": 138.24, "end": 138.56, "phoneme": "l\u0254\u014b|_"}, {"word": "way", "start_offset": 1732, "end_offset": 1736, "start": 138.56, "end": 138.88, "phoneme": "we\u026a|_"}, {"word": "to", "start_offset": 1736, "end_offset": 1739, "start": 138.88, "end": 139.12, "phoneme": "tu\u02d0|_"}, {"word": "Tipperary.", "start_offset": 1739, "end_offset": 1753, "start": 139.12, "end": 140.24, "phoneme": "t\u026ap\u025d\u025bri."}, {"word": "But", "start_offset": 1770, "end_offset": 1773, "start": 141.6, "end": 141.84, "phoneme": "b\u028ct|_"}, {"word": "my", "start_offset": 1776, "end_offset": 1780, "start": 142.08, "end": 142.4, "phoneme": "ma\u026a|_"}, {"word": "heart's", "start_offset": 1784, "end_offset": 1800, "start": 142.72, "end": 144.0, "phoneme": "h\u0251\u02d0rts|_"}, {"word": "right", "start_offset": 1800, "end_offset": 1804, "start": 144.0, "end": 144.32, "phoneme": "ra\u026at|_"}, {"word": "there.", "start_offset": 1804, "end_offset": 1808, "start": 144.32, "end": 144.64000000000001, "phoneme": "\u00f0\u025br."}], "segment": [{"segment": "It's a long way to tippery.", "start_offset": 62, "end_offset": 107, "start": 4.96, "end": 8.56}, {"segment": "It's a long way to go.", "start_offset": 118, "end_offset": 159, "start": 9.44, "end": 12.72}, {"segment": "It's a long way to tipperary to the sweetest girl I know.", "start_offset": 174, "end_offset": 270, "start": 13.92, "end": 21.6}, {"segment": "Goodbye to Piccadilly.", "start_offset": 289, "end_offset": 328, "start": 23.12, "end": 26.240000000000002}, {"segment": "Farewell, Leicester Square.", "start_offset": 343, "end_offset": 381, "start": 27.44, "end": 30.48}, {"segment": "It's a long, long way to tippery.", "start_offset": 393, "end_offset": 446, "start": 31.44, "end": 35.68}, {"segment": "But my heart's right there.", "start_offset": 450, "end_offset": 488, "start": 36.0, "end": 39.04}, {"segment": "Pack up your troubles in your old kits bag and smile, smile, smile.", "start_offset": 512, "end_offset": 599, "start": 40.96, "end": 47.92}, {"segment": "While you the Lucifer delight your fag smile, boys, that's the style.", "start_offset": 621, "end_offset": 714, "start": 49.68, "end": 57.120000000000005}, {"segment": "What's the use of worrying?", "start_offset": 731, "end_offset": 769, "start": 58.480000000000004, "end": 61.52}, {"segment": "It never was worthwhile.", "start_offset": 780, "end_offset": 820, "start": 62.4, "end": 65.6}, {"segment": "So pack up your troubles in your old kit's bag and smile, smile, smile.", "start_offset": 828, "end_offset": 929, "start": 66.24, "end": 74.32000000000001}, {"segment": "It's a long way to tippery.", "start_offset": 945, "end_offset": 987, "start": 75.60000000000001, "end": 78.96000000000001}, {"segment": "It's a long way to go.", "start_offset": 999, "end_offset": 1038, "start": 79.92, "end": 83.04}, {"segment": "It's a long way to tippery to the sweetest girl I know.", "start_offset": 1054, "end_offset": 1150, "start": 84.32000000000001, "end": 92.0}, {"segment": "Goodbye to Piccadilly.", "start_offset": 1170, "end_offset": 1206, "start": 93.60000000000001, "end": 96.48}, {"segment": "Farewell, Leicester Square.", "start_offset": 1225, "end_offset": 1262, "start": 98.0, "end": 100.96000000000001}, {"segment": "It's a long, long way to tippery.", "start_offset": 1274, "end_offset": 1326, "start": 101.92, "end": 106.08}, {"segment": "But my heart's right there.", "start_offset": 1330, "end_offset": 1369, "start": 106.4, "end": 109.52}, {"segment": "It's a long way to tipperary.", "start_offset": 1385, "end_offset": 1423, "start": 110.8, "end": 113.84}, {"segment": "It's a long way to go.", "start_offset": 1439, "end_offset": 1479, "start": 115.12, "end": 118.32000000000001}, {"segment": "It's a long way to tippery to the sweetest girl I know.", "start_offset": 1494, "end_offset": 1590, "start": 119.52, "end": 127.2}, {"segment": "Goodbye, Piccadilly.", "start_offset": 1610, "end_offset": 1646, "start": 128.8, "end": 131.68}, {"segment": "Farewell, Leicester Square.", "start_offset": 1665, "end_offset": 1704, "start": 133.2, "end": 136.32}, {"segment": "It's a long, long way to Tipperary.", "start_offset": 1714, "end_offset": 1753, "start": 137.12, "end": 140.24}, {"segment": "But my heart's right there.", "start_offset": 1770, "end_offset": 1808, "start": 141.6, "end": 144.64000000000001}]}
|
examples/input.json
ADDED
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
[
|
2 |
+
{
|
3 |
+
"id": "1442432310",
|
4 |
+
"audio_path": "examples/1442432310/reference_audio.mp3",
|
5 |
+
"lrc_path": "examples/1442432310/lyrics.json",
|
6 |
+
"duration": 150
|
7 |
+
}
|
8 |
+
]
|
requirements.txt
CHANGED
@@ -15,6 +15,7 @@ librosa
|
|
15 |
jiwer
|
16 |
demucs
|
17 |
audiobox-aesthetics
|
|
|
18 |
|
19 |
# WebDataset
|
20 |
webdataset
|
|
|
15 |
jiwer
|
16 |
demucs
|
17 |
audiobox-aesthetics
|
18 |
+
transformers==4.53.0
|
19 |
|
20 |
# WebDataset
|
21 |
webdataset
|
utils.py
ADDED
@@ -0,0 +1,133 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
|
2 |
+
def regroup_words(
|
3 |
+
words: list[dict],
|
4 |
+
max_len: float = 15.0,
|
5 |
+
gap: float = 0.50,
|
6 |
+
) -> list[dict]:
|
7 |
+
"""
|
8 |
+
Returns a list of segments with keys:
|
9 |
+
'start', 'end', 'text', 'words'
|
10 |
+
"""
|
11 |
+
|
12 |
+
if not words:
|
13 |
+
return []
|
14 |
+
|
15 |
+
segs, seg_words = [], []
|
16 |
+
seg_start = words[0]["start"]
|
17 |
+
last_end = seg_start
|
18 |
+
|
19 |
+
for w in words:
|
20 |
+
over_max = (w["end"] - seg_start) > max_len
|
21 |
+
long_gap = (w["start"] - last_end) > gap
|
22 |
+
|
23 |
+
if (seg_words and (over_max or long_gap)):
|
24 |
+
segs.append({
|
25 |
+
"start": seg_start,
|
26 |
+
"end": last_end,
|
27 |
+
"segment": " ".join(x["word"] for x in seg_words),
|
28 |
+
})
|
29 |
+
seg_words = []
|
30 |
+
seg_start = w["start"]
|
31 |
+
|
32 |
+
seg_words.append(w)
|
33 |
+
last_end = w["end"]
|
34 |
+
|
35 |
+
# flush final segment
|
36 |
+
segs.append({
|
37 |
+
"start": seg_start,
|
38 |
+
"end": last_end,
|
39 |
+
"segment": " ".join(x["word"] for x in seg_words),
|
40 |
+
})
|
41 |
+
return segs
|
42 |
+
|
43 |
+
|
44 |
+
def text_to_words(text: str) -> list[dict]:
|
45 |
+
"""
|
46 |
+
Convert text format like "word[start:end] word[start:end]..." to word list.
|
47 |
+
|
48 |
+
Args:
|
49 |
+
text: String in format "It's[4.96:5.52] a[5.52:5.84] long[5.84:6.16]..."
|
50 |
+
|
51 |
+
Returns:
|
52 |
+
List of word dictionaries with keys: 'word', 'start', 'end'
|
53 |
+
"""
|
54 |
+
import re
|
55 |
+
|
56 |
+
if not text.strip():
|
57 |
+
return []
|
58 |
+
|
59 |
+
# Pattern to match word[start:end] format
|
60 |
+
pattern = r'(\S+?)\[([^:]+):([^\]]+)\]'
|
61 |
+
matches = re.findall(pattern, text)
|
62 |
+
|
63 |
+
words = []
|
64 |
+
for word, start_str, end_str in matches:
|
65 |
+
try:
|
66 |
+
start = float(start_str) if start_str != 'xxx' else 0.0
|
67 |
+
end = float(end_str) if end_str != 'xxx' else 0.0
|
68 |
+
words.append({
|
69 |
+
'word': word,
|
70 |
+
'start': start,
|
71 |
+
'end': end
|
72 |
+
})
|
73 |
+
except ValueError:
|
74 |
+
# Skip invalid entries
|
75 |
+
continue
|
76 |
+
|
77 |
+
return words
|
78 |
+
|
79 |
+
|
80 |
+
def words_to_text(words: list[dict]) -> str:
|
81 |
+
"""
|
82 |
+
Convert word list to text format "word[start:end] word[start:end]...".
|
83 |
+
|
84 |
+
Args:
|
85 |
+
words: List of word dictionaries with keys: 'word', 'start', 'end'
|
86 |
+
|
87 |
+
Returns:
|
88 |
+
String in format "It's[4.96:5.52] a[5.52:5.84] long[5.84:6.16]..."
|
89 |
+
"""
|
90 |
+
if not words:
|
91 |
+
return ""
|
92 |
+
|
93 |
+
text_parts = []
|
94 |
+
for word in words:
|
95 |
+
word_text = word.get('word', '')
|
96 |
+
start = word.get('start', 0.0)
|
97 |
+
end = word.get('end', 0.0)
|
98 |
+
text_parts.append(f"{word_text}[{start}:{end}]")
|
99 |
+
|
100 |
+
return " ".join(text_parts)
|
101 |
+
|
102 |
+
|
103 |
+
def json_to_text(json_data: dict) -> str:
|
104 |
+
"""
|
105 |
+
Convert JSON lyrics data to text format for display.
|
106 |
+
Only uses the 'word' layer from the JSON structure.
|
107 |
+
|
108 |
+
Args:
|
109 |
+
json_data: Dictionary with 'word' key containing list of word objects
|
110 |
+
|
111 |
+
Returns:
|
112 |
+
String in format "word[start:end] word[start:end]..."
|
113 |
+
"""
|
114 |
+
if not isinstance(json_data, dict) or 'word' not in json_data:
|
115 |
+
return ""
|
116 |
+
|
117 |
+
words = json_data['word']
|
118 |
+
return words_to_text(words)
|
119 |
+
|
120 |
+
|
121 |
+
def text_to_json(text: str) -> dict:
|
122 |
+
"""
|
123 |
+
Convert text format to JSON structure expected by the model.
|
124 |
+
Creates the 'word' layer that the model needs.
|
125 |
+
|
126 |
+
Args:
|
127 |
+
text: String in format "word[start:end] word[start:end]..."
|
128 |
+
|
129 |
+
Returns:
|
130 |
+
Dictionary with 'word' key containing list of word objects
|
131 |
+
"""
|
132 |
+
words = text_to_words(text)
|
133 |
+
return {"word": words}
|