diff --git a/.isort.cfg b/.isort.cfg new file mode 100644 index 0000000..bf7b9fb --- /dev/null +++ b/.isort.cfg @@ -0,0 +1,2 @@ +[settings] +profile=black \ No newline at end of file diff --git a/README.md b/README.md index 9e217f4..28c1e2c 100644 --- a/README.md +++ b/README.md @@ -1 +1,29 @@ -# nist_ai \ No newline at end of file +# nist_ai + +### Requires + +``` +python -m pip install -U openai-whisper +mamba install -y pymssql +``` + +Edit `demo.py` to convert the desired video. + +Run `nvidia-smi` to see which GPU to use + +Run `CUDA_VISIBLE_DEVICES=[GPU_ID] python demo.py` + + + +Want to make changes? + +``` +mamba install -y black isort +``` + +Before committing and pushing: + +``` +black . +isort . +``` \ No newline at end of file diff --git a/audio_processing.py b/audio_processing.py new file mode 100644 index 0000000..c6f6a41 --- /dev/null +++ b/audio_processing.py @@ -0,0 +1,177 @@ +# MIT License + +# Copyright (c) 2023 sciserver + +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: + +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. + +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +"""This module contains functions for processing audio data.""" + +import dataclasses as dc +import itertools +import logging +import os +import string +from typing import Any, Dict, List + +import pandas as pd + +import job_config as jc + + +def transcribe_audio_whisper( + audio_file_path: str, + whisper_config: jc.WhisperConfig, + logger: logging.Logger = logging.getLogger(__name__), +) -> List[Dict[str, Any]]: + """Transcribes audio using Whisper. + + Args: + audio_file_path (str): Path to the audio file. + whisper_config (WhisperConfig): Whisper configuration. + logger (logging.Logger, optional): Logger object. Defaults to logging.getLogger(__name__). + + Returns: + Tuple[pd.DataFrame, pd.DataFrame]: Transcription data with columns: "word", "start", "end", "probability". + + Raises: + ImportError: If `whisper` is not installed. + FileNotFoundError: If `audio_file_path` does not exist. + """ + logger.info(f"Transcribing audio using Whisper {whisper_config}") + + try: + import whisper + except ImportError: + msg = "whisper not installed. Please install it using `pip install -U openai-whisper`" + logger.error(msg) + raise ImportError(msg) + + if not os.path.exists(audio_file_path): + msg = f"File not found at {audio_file_path}" + logger.error(msg) + raise FileNotFoundError(msg) + + model = whisper.load_model( + whisper_config.model_name, + download_root=whisper_config.download_location, + ) + + # `transcribe` returns a dict with the following keys: + # - "text": str + # - "language": str + # - "segments": list[dict] + # We only the "segments" which is list of dictionaries with the following keys: + # - "id": int + # - "seek": float + # - "start": float + # - "end": float + # - "text": str + # - "tokens": list[int] + # - "temperature": float + # - "avg_logprob": float + # - "compression_ratio": float + # - "no_speech_prob": float + # - "words": list[dict] + # We need the words and their timestamps/scores which are in "words" and have the following keys: + # - "word": str + # - "start": float + # - "end": float + # - "probability": float + transcription: Dict[str, Any] = model.transcribe( + audio_file_path, word_timestamps=True, **whisper_config.transcribe_kwargs + ) + + keep_keys = ["start", "end", "text", "no_speech_prob"] + text_segments = list( + map( + lambda segment: dict( + list(filter(lambda item: item[0] in keep_keys, segment.items())) + ), + transcription["segments"], + ) + ) + + # Some of the words have whitespace at the beginning and end. Strip it. + # Also remove punctuation except for apstrohpes. + keep_punc = "'" + remove_punc = string.punctuation.replace(keep_punc, "") + remove_punc_table = str.maketrans("", "", remove_punc + string.whitespace) + + text_segments = [] + for segment in transcription["segments"]: + filtered_segment = dict( + list(filter(lambda item: item[0] in keep_keys, segment.items())) + ) + filtered_segment["words"] = list( + map( + lambda d: { + k: v.translate(remove_punc_table) if k == "word" else v + for k, v in d.items() + }, + segment["words"], + ) + ) + text_segments.append(filtered_segment) + + # TODO: add some length checks here + # words = list( + # itertools.chain.from_iterable( + # list(map(lambda v: v["words"], transcription["segments"])) + # ) + # ) + + # # Some of the words have whitespace at the beginning and end. Strip it. + # # Also remove punctuation except for apstrohpes. + # keep_punc = "'" + # remove_punc = string.punctuation.replace(keep_punc, "") + # remove_punc_table = str.maketrans("", "", remove_punc + string.whitespace) + # words_stripped = list( + # map( + # lambda d: { + # k: v.translate(remove_punc_table) if k == "word" else v + # for k, v in d.items() + # }, + # words, + # ) + # ) + + return text_segments + + +def transcribe_audio( + audio_file_path: str, + model_config: jc.WhisperConfig, + logger: logging.Logger = logging.getLogger(__name__), +) -> pd.DataFrame: + if type(model_config) == jc.WhisperConfig: + return transcribe_audio_whisper(audio_file_path, model_config, logger=logger) + else: + raise ValueError(f"Invalid model config {model_config}") + + +if __name__ == "__main__": + print( + transcribe_audio_whisper( + "sample_data/audio.mp3", + jc.WhisperConfig( + model_name="tiny.en", + download_location=".", + ), + ) + ) diff --git a/db_upload.ipynb b/db_upload.ipynb deleted file mode 100644 index 0a043c6..0000000 --- a/db_upload.ipynb +++ /dev/null @@ -1,734 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# text snippets etc to database" - ] - }, - { - "cell_type": "raw", - "metadata": { - "execution": { - "iopub.execute_input": "2023-08-13T17:56:20.330271Z", - "iopub.status.busy": "2023-08-13T17:56:20.327741Z", - "iopub.status.idle": "2023-08-13T17:58:25.446944Z", - "shell.execute_reply": "2023-08-13T17:58:25.443520Z", - "shell.execute_reply.started": "2023-08-13T17:56:20.330211Z" - }, - "tags": [] - }, - "source": [ - "%%time\n", - "%pip install moviepy\n", - "%pip install ffmpeg-python\n", - "%pip install --upgrade opencv-python-headless\n", - "%pip install -U openai-whisper" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# %env CUDA_VISIBLE_DEVICES = 4" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "import ffmpeg\n", - "import cv2\n", - "import sqlalchemy\n", - "from sqlalchemy.orm import Session\n", - "from sqlalchemy.ext.automap import automap_base\n", - "from moviepy.editor import VideoFileClip\n", - "from nist_database import MSSQLDatabase\n", - "from video_tools import generate_audio, generate_gps, get_checksum\n", - "import os\n", - "import json\n", - "import whisper\n", - "import pandas as pd\n", - "from io import StringIO\n", - "from datetime import datetime\n", - "from pytz import timezone\n", - "import time\n", - "import logging" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "COMMIT_EVERYTHING = False # whether to commit to db\n", - "DELETE_DUPS = True # whether to exclude files with checksums already in db\n", - "FOLDER_TO_ADD = 'assets/data/video/'\n", - "MODEL_TYPE = \"medium.en\" # tiny.en, base.en, small.en, medium.en, large\n", - "\n", - "assert FOLDER_TO_ADD[-1:] == '/'\n", - "logging.basicConfig(format='', filename='nist.log', level=logging.INFO)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Batching Video Files & Deleting Dup's" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "tags": [] - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 823 µs, sys: 1.94 ms, total: 2.76 ms\n", - "Wall time: 1.47 ms\n" - ] - } - ], - "source": [ - "%%time\n", - "\n", - "local_files = os.listdir(FOLDER_TO_ADD)\n", - "local_vid_files = [vid for vid in local_files if vid.split('.')[-1].lower() == 'mp4']\n", - "video_files = [FOLDER_TO_ADD + vid for vid in local_vid_files]\n", - "# video_files = [vid for vid in video_files if '093' in vid] # delete after\n", - "\n", - "for vid in video_files:\n", - " assert os.path.exists(vid), f'Video file {vid} does not exist'\n", - "\n", - "audio_files = [generate_audio(vid_file, \"wav\") or vid_file[:-3] + 'wav' for vid_file in video_files]\n", - "gps_files = [generate_gps(vid_file, \"go-pro\") or vid_file[:-3] + 'csv' for vid_file in video_files]\n" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "tags": [] - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "assets/data/video/hernandez-perfect-game-2012.mp4 has a duplicate called \n", - "assets/data/video/hernandez-perfect-game-2012.mp4\n", - "\n", - "assets/data/video/usa-japan-championship-2023.mp4 has a duplicate called \n", - "assets/data/video/usa-japan-championship-2023.mp4\n", - "\n", - "assets/data/video/henderson-hr-june-11-2023.mp4 has a duplicate called \n", - "assets/data/video/henderson-hr-june-11-2023.mp4\n", - "\n", - "assets/data/video/VIDEO_7152.mp4 has a duplicate called \n", - "assets/data/video/VIDEO_7152.mp4\n", - "\n", - "assets/data/video/budavari_GX_0101.MP4 has a duplicate called \n", - "assets/data/video/budavari_GX_0101.MP4\n", - "\n", - "assets/data/video/budavari_GX_0120.MP4 has a duplicate called \n", - "assets/data/video/budavari_GX_0120.MP4\n", - "\n", - "assets/data/video/budavari_GX_0124.MP4 has a duplicate called \n", - "assets/data/video/budavari_GX_0124.MP4\n", - "\n", - "[]\n" - ] - } - ], - "source": [ - "ffmpeg_binaries = '/home/idies/workspace/nist_ai/extras/ffmpeg-6.0-amd64-static'\n", - "assert os.path.exists(ffmpeg_binaries)\n", - "os.environ[\"PATH\"] = os.environ[\"PATH\"] + f\":{ffmpeg_binaries}\"\n", - "with open('/home/idies/workspace/nist_ai/Henry/nist-ai.json','r') as f:\n", - " AUTH = json.load(f)\n", - "DB=MSSQLDatabase(AUTH,'NIST_AI')\n", - "\n", - "# delete duplicate videos by checksum\n", - "unique_video_files, unique_audio_files = [], []\n", - "for video_file, audio_file in zip(video_files, audio_files):\n", - " checksum = get_checksum(video_file)\n", - " df = DB.execute_query(f\"select * from video where checksum='{checksum}'\")\n", - " if len(df.index) > 0:\n", - " dup_names = []\n", - " for i in df.index:\n", - " dup_names.append(df.loc[0]['filename'])\n", - " print(f\"{video_file} has {'duplicates' if len(dup_names) > 1 else 'a duplicate'} called \\n\" \\\n", - " f\"{dup_names[0] if len(dup_names) == 1 else ', '.join(dup_names)}\\n\")\n", - " continue\n", - " unique_video_files.append(video_file)\n", - " unique_audio_files.append(audio_file)\n", - "if DELETE_DUPS: video_files, audio_files = unique_video_files, unique_audio_files\n", - "print(video_files)\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Querying Tables" - ] - }, - { - "cell_type": "raw", - "metadata": { - "tags": [] - }, - "source": [ - "sql = \"select * from gps where timestamp between '2023-07-07 09:30:00' AND '2023-07-07 09:31:30'\" # check which tables are contained in the database\n", - "sql = \"select * from gps where video_id=42 and timestamp between '2023-07-06 13:25:19' and '2023-07-07 13:41:59'\"\n", - "sql = \"select * from video\"\n", - "df = DB.execute_query(sql)\n", - "df" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### deleting video" - ] - }, - { - "cell_type": "raw", - "metadata": { - "tags": [] - }, - "source": [ - "sql = \"delete from video where id in (45)\"\n", - "DB.execute_update(sql)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "execution": { - "iopub.execute_input": "2023-07-10T17:22:49.919640Z", - "iopub.status.busy": "2023-07-10T17:22:49.919089Z", - "iopub.status.idle": "2023-07-10T17:22:49.927763Z", - "shell.execute_reply": "2023-07-10T17:22:49.925522Z", - "shell.execute_reply.started": "2023-07-10T17:22:49.919589Z" - } - }, - "source": [ - "### adding table row" - ] - }, - { - "cell_type": "raw", - "metadata": { - "execution": { - "iopub.execute_input": "2023-07-10T17:22:18.104260Z", - "iopub.status.busy": "2023-07-10T17:22:18.103379Z", - "iopub.status.idle": "2023-07-10T17:22:19.112823Z", - "shell.execute_reply": "2023-07-10T17:22:19.111085Z", - "shell.execute_reply.started": "2023-07-10T17:22:18.104086Z" - }, - "tags": [] - }, - "source": [ - "video_ids = []\n", - "text_segment_ids = DB.execute_query(\"select * from text_segment\")['id'].tolist()\n", - "transcription_ids = DB.execute_query(\"select * from text_segment\")['transcription_id'].tolist()\n", - "for transcription_id in transcription_ids:\n", - " audio_id = DB.execute_query(f\"select * from transcription where id={transcription_id}\")['audio_id'].tolist()[0]\n", - " video_id = DB.execute_query(f\"select * from audio where id={audio_id}\")['video_id'].tolist()[0]\n", - " video_ids.append(video_id)\n", - " \n", - "for text_segment_id, video_id in zip(text_segment_ids, video_ids):\n", - " if not video_id: continue\n", - " DB.execute_update(f\"update text_segment set video_id={video_id} where id={text_segment_id}\")\n", - " \n", - "# df.to_json(orient='records')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### changing constraints" - ] - }, - { - "cell_type": "raw", - "metadata": {}, - "source": [ - "# give tables on cascade constraint\n", - "sql = \"\"\"\n", - "ALTER TABLE word_segment DROP CONSTRAINT fk_word_segment_text_run;\n", - "ALTER TABLE word_segment add constraint fk_word_segment_text_run foreign key (transcription_id) REFERENCES transcription(id) ON DELETE CASCADE\n", - "\"\"\"\n", - "df = DB.execute_update(sql)\n", - "df" - ] - }, - { - "cell_type": "raw", - "metadata": { - "tags": [] - }, - "source": [ - "sql = \"\"\"\n", - "SELECT * FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS\n", - "WHERE TABLE_NAME='word_segment'\n", - "\"\"\"\n", - "df = DB.execute_query(sql)\n", - "df" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Prepare database & Whisper Model" - ] - }, - { - "cell_type": "raw", - "metadata": {}, - "source": [ - "# BE CAREFULL!\n", - "Base.metadata.drop_all(bind = DB.ENGINE)" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [], - "source": [ - "# check if tables already exist\n", - "sql_table = lambda x: f\"\"\"\n", - "SELECT * FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS\n", - "WHERE TABLE_NAME='{x}'\n", - "\"\"\"\n", - "\n", - "table_df = DB.execute_query(sql_table('video'))\n", - "if len(table_df.index) == 0:\n", - " ddl = \"\"\"\n", - " create table video (\n", - " id bigint identity(1,1) not null\n", - " , filename varchar(1024) not null\n", - " , checksum varchar(36)\n", - " , metadata varchar(max) null -- JSON encoded dict metadata\n", - " , constraint pk_gemdmodel primary key(id)\n", - " )\"\"\"\n", - " DB.execute_update(ddl)\n", - "\n", - "table_df = DB.execute_query(sql_table('audio'))\n", - "if len(table_df.index) == 0:\n", - " ddl = \"\"\"\n", - " create table audio (\n", - " id bigint identity(1,1) not null\n", - " , video_id bigint\n", - " , filename varchar(1024) not null\n", - " , checksum varchar(36)\n", - " , constraint pk_audio primary key(id)\n", - " , constraint fk_audio_video foreign key (video_id) REFERENCES video(id) ON DELETE CASCADE\n", - " )\"\"\"\n", - " DB.execute_update(ddl)\n", - "\n", - "table_df = DB.execute_query(sql_table('transcription'))\n", - "if len(table_df.index) == 0:\n", - " ddl = \"\"\"\n", - " CREATE TABLE transcription (\n", - " id bigint identity(1,1) not null\n", - " , audio_id bigint not null\n", - " , config varchar(max) -- JSON string \n", - " , constraint pk_text_run primary key(id)\n", - " , constraint fk_text_run_audio foreign key (audio_id) REFERENCES audio(id) ON DELETE CASCADE\n", - " )\"\"\"\n", - " DB.execute_update(ddl)\n", - "\n", - "table_df = DB.execute_query(sql_table('text_segment'))\n", - "if len(table_df.index) == 0:\n", - " ddl = \"\"\"\n", - " CREATE TABLE text_segment(\n", - " id bigint identity(1,1) not null\n", - " , transcription_id bigint not null\n", - " , video_id bigint null\n", - " , segment varchar(max)\n", - " , temperature real\n", - " , time_start real\n", - " , time_end real\n", - " , constraint pk_text_segment primary key(id)\n", - " , constraint fk_text_segment_text_run foreign key (transcription_id) REFERENCES transcription(id) ON DELETE CASCADE\n", - " )\"\"\"\n", - " DB.execute_update(ddl)\n", - "\n", - "table_df = DB.execute_query(sql_table('word_segment'))\n", - "if len(table_df.index) == 0:\n", - " ddl = \"\"\"\n", - " CREATE TABLE word_segment(\n", - " id bigint identity(1,1) not null\n", - " , transcription_id bigint not null\n", - " , word varchar(max)\n", - " , probability real\n", - " , time_start real\n", - " , time_end real\n", - " , constraint pk_word_segment primary key(id)\n", - " , constraint fk_word_segment_text_run foreign key (transcription_id) REFERENCES transcription(id) ON DELETE CASCADE\n", - " )\"\"\"\n", - " DB.execute_update(ddl)\n", - "\n", - "table_df = DB.execute_query(sql_table('gps'))\n", - "if len(table_df.index) == 0:\n", - " ddl = \"\"\"\n", - " CREATE TABLE gps(\n", - " id bigint identity(1,1) not null\n", - " , video_id bigint not null\n", - " , location varchar(max) not null\n", - " , timestamp datetime\n", - " , latitude float\n", - " , longitude float\n", - " , altitude float\n", - " , constraint pk_gps primary key(id)\n", - " , constraint fk_gps foreign key (video_id) REFERENCES video(id) ON DELETE CASCADE\n", - " )\"\"\"\n", - " DB.execute_update(ddl)" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "Base = automap_base()\n", - "Base.prepare(DB.ENGINE, reflect=True)\n", - "# for c in Base.classes:\n", - "# print(c)\n", - "\n", - "Video = Base.classes.video\n", - "Audio = Base.classes.audio\n", - "Transcription = Base.classes.transcription\n", - "TextSegment = Base.classes.text_segment\n", - "WordSegment = Base.classes.word_segment\n", - "GPSPing = Base.classes.gps\n", - "session = Session(DB.ENGINE)" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Sun Aug 27 19:25:27 2023 \n", - "+-----------------------------------------------------------------------------+\n", - "| NVIDIA-SMI 450.66 Driver Version: 450.66 CUDA Version: 11.0 |\n", - "|-------------------------------+----------------------+----------------------+\n", - "| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |\n", - "| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |\n", - "| | | MIG M. |\n", - "|===============================+======================+======================|\n", - "| 0 Tesla V100-SXM2... Off | 00000000:61:00.0 Off | 0 |\n", - "| N/A 32C P0 54W / 300W | 0MiB / 16160MiB | 0% Default |\n", - "| | | N/A |\n", - "+-------------------------------+----------------------+----------------------+\n", - "| 1 Tesla V100-SXM2... Off | 00000000:62:00.0 Off | 0 |\n", - "| N/A 33C P0 54W / 300W | 0MiB / 16160MiB | 0% Default |\n", - "| | | N/A |\n", - "+-------------------------------+----------------------+----------------------+\n", - "| 2 Tesla V100-SXM2... Off | 00000000:89:00.0 Off | 0 |\n", - "| N/A 33C P0 55W / 300W | 0MiB / 16160MiB | 0% Default |\n", - "| | | N/A |\n", - "+-------------------------------+----------------------+----------------------+\n", - "| 3 Tesla V100-SXM2... Off | 00000000:8A:00.0 Off | 0 |\n", - "| N/A 35C P0 55W / 300W | 0MiB / 16160MiB | 0% Default |\n", - "| | | N/A |\n", - "+-------------------------------+----------------------+----------------------+\n", - " \n", - "+-----------------------------------------------------------------------------+\n", - "| Processes: |\n", - "| GPU GI CI PID Type Process name GPU Memory |\n", - "| ID ID Usage |\n", - "|=============================================================================|\n", - "| No running processes found |\n", - "+-----------------------------------------------------------------------------+\n" - ] - } - ], - "source": [ - "!nvidia-smi" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": { - "tags": [] - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 36.6 s, sys: 12.3 s, total: 48.9 s\n", - "Wall time: 36.1 s\n" - ] - } - ], - "source": [ - "%%time\n", - "model = whisper.load_model(MODEL_TYPE, download_root='/home/idies/workspace/nist_ai/extras/whisper-models')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Videos" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# add each video file to db\n", - "videos = []\n", - "for video_file in video_files:\n", - " metadata_dict = ffmpeg.probe(video_file)\n", - " metadata = json.dumps(metadata_dict)\n", - " checksum = get_checksum(video_file)\n", - " videos.append(Video(checksum=checksum, filename=video_file, metadata=metadata))\n", - " if COMMIT_EVERYTHING:\n", - " session.add(videos[-1])\n", - " session.commit()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Audio" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# add each audio file to db\n", - "audios = []\n", - "for audio_file, video in zip(audio_files, videos):\n", - " audios.append(Audio(video=video, filename=audio_file, checksum=get_checksum(audio_file)))\n", - " if COMMIT_EVERYTHING:\n", - " session.add(audios[-1])\n", - " session.commit()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Transcription, TextSegment, WordSegment" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": { - "tags": [] - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 2 µs, sys: 2 µs, total: 4 µs\n", - "Wall time: 7.87 µs\n" - ] - } - ], - "source": [ - "%%time\n", - "\n", - "# add each transcription to db\n", - "start_time = time.time()\n", - "results, transcriptions = [], []\n", - "for audio in audios:\n", - " results.append(model.transcribe(audio.filename, word_timestamps=True))\n", - " config_obj = {'model': 'whisper-net', 'load_model': MODEL_TYPE}\n", - " transcriptions.append(Transcription(audio=audio, config=json.dumps(config_obj)))\n", - " if COMMIT_EVERYTHING:\n", - " session.add(transcriptions[-1])\n", - " session.commit()\n", - " logging.info(f\"{datetime.now(timezone('EST')).strftime('%m/%d/%Y %H:%M:%S')}: transcribed \\\"{audio.filename.split('/')[-1]}\\\"\")\n", - " logging.info(f\"... w/ {MODEL_TYPE} ({round(time.time() - start_time, 1)} secs)\")\n" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": { - "tags": [] - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 3 µs, sys: 2 µs, total: 5 µs\n", - "Wall time: 8.34 µs\n" - ] - } - ], - "source": [ - "%%time\n", - "\n", - "# add text- and word- segments to db\n", - "for result, video, transcription, video_file in zip(results, videos, transcriptions, video_files):\n", - " vidcap = cv2.VideoCapture(video_file)\n", - " for segment in result[\"segments\"]:\n", - " \n", - " # add word segments\n", - " for word_dict in segment['words']:\n", - " \n", - " # make utf-8 solution\n", - " pretty_word = ''.join([c.lower() for c in word_dict['word'].strip() if 97 <= ord(c.lower()) <= 97 + 25])\n", - " if not pretty_word: continue\n", - " start, end, prob = word_dict['start'], word_dict['end'], word_dict['probability']\n", - " # print(f\"|{word_dict['word']}| -> |{pretty_word}|\")\n", - " print(pretty_word, end=' ')\n", - " word_row = WordSegment(transcription=transcription, word=pretty_word, probability=prob, \\\n", - " time_start=start, time_end=end)\n", - " if COMMIT_EVERYTHING: session.add(word_row)\n", - " \n", - " # get thumbnail binary\n", - " photo_bytes = None\n", - " milliseconds = int(segment['start'] * 1000)\n", - " vidcap.set(cv2.CAP_PROP_POS_MSEC, milliseconds)\n", - " success, image = vidcap.read()\n", - " if success:\n", - " success, buffer = cv2.imencode('.jpg', image) # get image as binary\n", - " photo_bytes = buffer.tobytes() # convert to bytes\n", - " \n", - " # add text segment\n", - " text_segment_row = TextSegment(transcription=transcription, video_id = video.id, thumbnail=photo_bytes, time_start=segment['start'], \\\n", - " time_end=segment['end'], segment=segment['text'])\n", - " if COMMIT_EVERYTHING: session.add(text_segment_row)\n", - " if COMMIT_EVERYTHING: session.commit()\n", - " print('\\n\\n', '-' * 3, '\\n')" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "execution": { - "iopub.execute_input": "2023-07-25T03:40:44.346376Z", - "iopub.status.busy": "2023-07-25T03:40:44.345218Z", - "iopub.status.idle": "2023-07-25T03:40:44.354086Z", - "shell.execute_reply": "2023-07-25T03:40:44.352485Z", - "shell.execute_reply.started": "2023-07-25T03:40:44.346323Z" - } - }, - "source": [ - "# GPS Metadata" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# add gps metadata to db\n", - "for gps_file, video, video_file in zip(gps_files, videos, video_files):\n", - " if not gps_file: continue\n", - " if not os.path.exists(gps_file): \n", - " if COMMIT_EVERYTHING: \n", - " pass\n", - " logging.warning(\"... no csv file w/ gps points found\")\n", - " continue\n", - "\n", - " with open(gps_file, 'r') as f:\n", - " # delete all lines that start with '#' or ' ', add to df\n", - " lines = [line for line in f.readlines() if line[0] not in ['#', ' ']]\n", - " df = pd.read_csv(StringIO(''.join(lines)))\n", - " if COMMIT_EVERYTHING: \n", - " pass\n", - " logging.info(f\"... found {df.shape[0]} gps points in csv\")\n", - "\n", - " # for every row in df, add json string of its elements\n", - " gps_info = []\n", - " for i in df.index:\n", - " gps_info.append(json.dumps(df.loc[i].to_dict()))\n", - " \n", - " # get timestamps from pd series\n", - " gps_timestamps_epoch = df['UTC Time'].values\n", - " gps_timestamps = []\n", - " for i, timestamp in enumerate(gps_timestamps_epoch):\n", - " timestamp = datetime.fromtimestamp(timestamp) # defaults correctly to utc\n", - " timestamp = timestamp.strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]\n", - " gps_timestamps.append(timestamp)\n", - " latitudes, longitudes, altitudes = df['Latitude'], df['Longitude'], df['Altitude (m)']\n", - "\n", - " # append items in df to gps table\n", - " for info_dict, timestamp, lat, lon, alt in zip(gps_info, gps_timestamps, latitudes, longitudes, altitudes):\n", - " gps_ping = GPSPing(video=video, location=info_dict, timestamp=timestamp, \\\n", - " latitude=lat, longitude=lon, altitude=alt)\n", - " if COMMIT_EVERYTHING: session.add(gps_ping)\n", - " if COMMIT_EVERYTHING: session.commit()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "myenv", - "language": "python", - "name": "myenv" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8.8" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/demo.py b/demo.py new file mode 100644 index 0000000..1a7ce2d --- /dev/null +++ b/demo.py @@ -0,0 +1,54 @@ +import functools +import logging +import os + +import end_to_end +import job_config as jc +import repository as repo + +logging.basicConfig( + filename="demo_log.txt", + filemode="a", + format="%(asctime)s,%(msecs)d %(name)s %(levelname)s %(message)s", + datefmt="%H:%M:%S", + level=logging.INFO, +) + + +def run(): + ffmpeg_binaries = "/home/idies/workspace/nist_ai/extras/ffmpeg-6.0-amd64-static" + assert os.path.exists(ffmpeg_binaries) + os.environ["PATH"] = f"{ffmpeg_binaries}:" + os.environ["PATH"] + + base_path = "/home/idies/workspace/nist_ai/data/video/Tanya" + with_base = functools.partial(os.path.join, base_path) + + video_path = with_base("Log-20230726-150129 apartments.mp4") + audio_path = with_base("Log-20230726-150129 apartments.mp3") + gps_path = with_base("Log-20230726-150129 apartments - Interpolated.csv") + + repository = repo.Repository( + db_auth_path="nist-ai.json", + DROP_AND_CREATE_DANGER=False, # this drops and creates tables + ) + + job_config = jc.EndToEndConfig( + transcription_config=jc.WhisperConfig(model_name="large"), + source_video_type=jc.VideoType.TRACK_ADDICT, + thumbnail_width=300, + ) + + logger = logging.getLogger("end-to-end-demo") + + end_to_end.process_video( + video_path=video_path, + audio_path=audio_path, + gps_path=gps_path, + repository=repository, + job_config=job_config, + logger=logger, + ) + + +if __name__ == "__main__": + run() diff --git a/end_to_end.py b/end_to_end.py new file mode 100644 index 0000000..1e7f11e --- /dev/null +++ b/end_to_end.py @@ -0,0 +1,134 @@ +# MIT License + +# Copyright (c) 2023 sciserver + +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: + +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. + +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +"""This module contains the code for end-to-end video processing.""" + +import dataclasses as dc +import functools +import json +import logging +import os + +import audio_processing as ap +import gps_processing as gp +import job_config as jc +import repository as repo +import utils +import video_processing as vp + + +def process_video( + video_path: str, + audio_path: str, + gps_path: str, + repository: repo.Repository, + job_config: jc.EndToEndConfig, + logger: logging.Logger, +) -> None: + """Processes a video file and loads it into a repository. + + The steps to processing a video are: + + 1. Extract the audio from the video. + 2. Transcribe the audio. + 3. Extract the GPS data from the video. + 4. Load the video, audio, and GPS data into the repository. + + Args: + video_path (str): Path to the video file. + logger (logging.Logger): Logger object. + """ + logger.info(f"Processing video: {video_path}") + + # Extract the audio from the video + with utils.LogTime(logger, "Getting audio/metadata from video"): + vp.extract_audio(video_path, audio_path, logger=logger) + video_metadata = vp.get_metadata(video_path, logger=logger) + + # transcribe the audio + # text_segments is a list of dicts with the keys: + # - text: str + # - start: float + # - end: float + # - no_speech_prob: float + # - words: dict + # -- word: str + # -- start: float + # -- end: float + # -- probability: float + with utils.LogTime(logger, "Transcribing audio"): + text_segments = ap.transcribe_audio( + audio_path, job_config.transcription_config, logger=logger + ) + + thumbnail_f = functools.partial( + vp.get_thumbnail, + video_path, + job_config.thumbnail_width, + ) + with utils.LogTime(logger, "Getting thumbnails for word segments"): + for segment in text_segments: + segment["thumbnail"] = thumbnail_f(segment["start"]) + + # Extract the GPS data from the video + # gps_data is a dataframe with the columns: + # - relative_time: float64 + # - utc_time: float + # - latitude: float + # - longitude: float + # - altitude_m: float + # - speed_kmh: float + with utils.LogTime(logger, "Parsing gps file"): + gps_data = gp.parse_gps_file( + gps_path, job_config.source_video_type, logger=logger + ) + + # Load the video, audio, and GPS data into the repository + fname = lambda f: os.path.split(f)[-1] + + video_kwargs = dict( + filename=fname(video_path), + checksum=utils.get_checksum(video_path), + gps_filename=fname(gps_path), + metadata=json.dumps(video_metadata), + ) + + audio_kwargs = dict( + filename=fname(audio_path), + checksum=utils.get_checksum(audio_path), + ) + + transcription_kwargs = dict( + config=json.dumps(dc.asdict(job_config.transcription_config)), + ) + + with utils.LogTime(logger, "Converting gps df to list"): + gps_kwargs = gps_data.to_dict(orient="records") + + with utils.LogTime(logger, "Saving data to repo"): + repository.save_data( + video_kwargs=video_kwargs, + audio_kwargs=audio_kwargs, + transcription_kwargs=transcription_kwargs, + text_segments_dicts=text_segments, + gps_kwargs=gps_kwargs, + ) diff --git a/gps_processing.py b/gps_processing.py new file mode 100644 index 0000000..0bbddd9 --- /dev/null +++ b/gps_processing.py @@ -0,0 +1,128 @@ +# MIT License + +# Copyright (c) 2023 sciserver + +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: + +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. + +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +"""This module contains functions for processing GPS data.""" + +import logging +import os + +import pandas as pd + +import job_config as jc + + +# TODO: Maybe this should stream to file instead of loading everything into memory +# and then we could also do a bulk import into the database +def parse_trackaddict_gps( + gps_csv_path: str, + logger: logging.Logger, +) -> pd.DataFrame: + """Parses GPS data from a TrackAddict CSV file. + + The CSV file is expected to have the following columns: + - Time + - UTC Time + - Latitude + - Longitude + - Altitude (m) + - Speed (Km/h) + + The function returns a DataFrame with the following columns and types: + - relative_time: float64 + - utc_time: float64 + - latitude: float64 + - longitude: float64 + - altitude_m: float32 + - speed_kmh: float32 + + + Args: + gps_csv_path (str): Path to the CSV file. + logger (logging.Logger): Logger object. + + Returns: + pd.DataFrame: GPS data. + + Raises: + FileNotFoundError: If `gps_csv_path` does not exist. + """ + + if not os.path.exists(gps_csv_path): + msg = f"File not found at {gps_csv_path}" + logger.error(msg) + raise FileNotFoundError(msg) + + df = pd.read_csv(gps_csv_path, engine="c", comment="#") + + if "Altitude (m)" not in df.columns: + if "Altitude (ft)" in df.columns: + df["Altitude (m)"] = df["Altitude (ft)"] * 0.3048 + else: + df["Altitude (m)"] = -1.0 + + if "Speed (Km/h)" not in df.columns: + if "Speed (MPH)" in df.columns: + df["Speed (Km/h)"] = df["Speed (MPH)"] * 1.609344 + else: + df["Speed (Km/h)"] = -1.0 + + keep_cols = [ + "Time", + "UTC Time", + "Latitude", + "Longitude", + "Altitude (m)", + "Speed (Km/h)", + ] + + col_dtypes = { + "Time": "float64", + "UTC Time": "float64", + "Latitude": "float64", + "Longitude": "float64", + "Altitude (m)": "float32", + "Speed (Km/h)": "float32", + } + + new_col_names = { + "Time": "relative_time", + "UTC Time": "utc_time", + "Latitude": "latitude", + "Longitude": "longitude", + "Altitude (m)": "altitude_m", + "Speed (Km/h)": "speed_kmh", + } + + return df.loc[:, keep_cols].astype(col_dtypes).rename(columns=new_col_names) + + +def parse_gps_file( + gps_file_path: str, + video_type: jc.VideoType, + logger: logging.Logger = logging.getLogger(__name__), +) -> pd.DataFrame: + if video_type == jc.VideoType.TRACK_ADDICT: + return parse_trackaddict_gps(gps_file_path, logger) + else: + msg = f"Unsupported video type {video_type}" + logger.error(msg) + raise ValueError(msg) diff --git a/job_config.py b/job_config.py new file mode 100644 index 0000000..946690e --- /dev/null +++ b/job_config.py @@ -0,0 +1,65 @@ +# MIT License + +# Copyright (c) 2023 sciserver + +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: + +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. + +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +import dataclasses as dc +import hashlib +import os +from enum import Enum +from typing import List, Optional, Union + +VideoType = Enum("VideoType", ["GOPRO", "TRACK_ADDICT"]) + + +@dc.dataclass +class WhisperConfig: + model_name: str = "tiny.en" + download_location: str = "." + transcribe_kwargs: dict = dc.field(default_factory=dict) + valid_model_names: List[str] = dc.field( + init=False, + default_factory=lambda: [ + "tiny", + "tiny.en", + "base", + "base.en", + "small", + "small.en", + "medium", + "medium.en", + "large", + ], + ) + + def __post_init__(self): + if not os.path.exists(self.download_location): + os.makedirs(self.download_location, exist_ok=True) + + if self.model_name not in self.valid_model_names: + msg = f"Invalid model name {self.model_name}. Valid model names are {self.valid_model_names}" + raise ValueError(msg) + + +@dc.dataclass +class EndToEndConfig: + transcription_config: Union[WhisperConfig, None] + source_video_type: VideoType + thumbnail_width: int = 300 diff --git a/nist_database.py b/nist_database.py deleted file mode 100644 index c758569..0000000 --- a/nist_database.py +++ /dev/null @@ -1,211 +0,0 @@ -import pymssql -import sqlalchemy as sqla -import pandas -import json -import regex as re - -class MSSQLDatabase(): - # wraps a Microsoft SQL Server database - def __init__(self,AUTH,DATABASE=None): - # AUTH should be a dict with some specific fields useful for a direct connection to the database - self.AUTH=AUTH - self.SERVER=AUTH['host'] - if DATABASE is None: - self.DATABASE=AUTH['database'] - else: - self.DATABASE=DATABASE - self.ENGINE=self.__create_engine() - - def execPyMSSQL(self,statement): - with pymssql.connect(self.SERVER, self.AUTH['user'], self.AUTH['pwd'], self.DATABASE) as conn: - cursor = conn.cursor() - r=cursor.execute(statement) - conn.commit() - return r - - def execute_query(self,sql): - if type(sql) == str: - sql = sqla.text(sql) - with self.ENGINE.connect() as conn: - return pandas.read_sql(sql,conn) - - def execute_update(self,statement): - if type(statement) == str: - statement = sqla.text(statement) - with self.ENGINE.connect() as conn: -# r=self.ENGINE.execute(statement) - trans = conn.begin() - try: - result = conn.execute(statement) - trans.commit() - except: - trans.rollback() - raise - return result - - def __create_engine(self): - return sqla.create_engine(f"mssql+pymssql://{self.AUTH['user']}:{self.AUTH['pwd']}@{self.SERVER}:1433/{self.DATABASE}?charset=utf8") - - def create_schema(self,schema): - self.ENGINE.execute(sqla.schema.CreateSchema(schema)) - - def get_source_id(self, ORG, schema='dbo'): - sql=f"select source_id from {schema}.metadata_source where source_type='org' and organization_name='{ORG}'" - with self.ENGINE.connect() as con: - SOURCE_ID=pandas.read_sql(sql,con).source_id[0] - return SOURCE_ID - - def drop_all_tables(self,schema,keep_tables=[]): - tables=reversed(list(self.sorted_tables(schema).keys())) - drop_all = "\n".join([f'drop table {schema}.{t}' for t in tables if t not in keep_tables]) - print(drop_all) -# execPyMSSQL(drop_all) - - def delete_from_all_tables(self,schema,keep_tables=[]): - tables=reversed(list(self.sorted_tables(schema).keys())) - delete_all = "\n".join([f'delete from {schema}.{t}' for t in tables if t not in keep_tables]) - print(delete_all) - self.execPyMSSQL(delete_all) - - def sorted_tables(self,schema): - # sort tables in a schema according to FK relationship - # returns tables ordered such tha if table t1 refers to table t2, t2 will be earlier in the result than t1 - # the 'engine' variable should be result of a SQLAlchemy create_engine statement - with self.ENGINE.connect() as conn: - sql=f""" - SELECT c.table_name, string_agg(c.column_name,',') within group(order by c.ordinal_position) as columns - , sum(case when c.column_name='source_id' then 1 else 0 end) as has_source_id - , max(case when COLUMNPROPERTY(object_id(c.TABLE_SCHEMA+'.'+c.TABLE_NAME), c.COLUMN_NAME, 'IsIdentity') = 1 then c.column_name else null end) as identity_column - from information_Schema.tables t - join information_schema.columns c on c.table_schema=t.table_schema and c.table_name=t.table_name - where t.table_schema = '{schema}' and t.table_type='BASE TABLE' - group by c.table_name - """ - tables=pandas.read_sql(sql,conn) - tables={t.table_name:{'columns':t.columns,'identity_column':t.identity_column,'has_source_id':t.has_source_id,'FKs':set()} for t in tables.itertuples()} - - sql=f""" - SELECT OBJECT_NAME(fk.parent_object_id) as from_table - , OBJECT_NAME(fk.referenced_object_id) to_table - FROM sys.foreign_keys fk - INNER JOIN sys.foreign_key_columns fkc - ON fkc.constraint_object_id = fk.object_id - INNER JOIN sys.columns c1 - ON fkc.parent_column_id = c1.column_id - AND fkc.parent_object_id = c1.object_id - INNER JOIN sys.columns c2 - ON fkc.referenced_column_id = c2.column_id - AND fkc.referenced_object_id = c2.object_id - inner join sys.schemas s on s.schema_id=fk.schema_id - where s.name='{schema}' - """ - FKs=pandas.read_sql(sql,conn) - for f in FKs.itertuples(): - tables[f.from_table]['FKs'].add(f.to_table) - - ordered=[] - done=set() - def topsort(t): - if t not in tables: - return - refs=tables[t]['FKs'] - for r in refs: - if r in done: - continue - topsort(r) - ordered.append(t) - done.add(t) - - for t in tables: - if t not in done: - topsort(t) - return {t:{'columns':tables[t]['columns'], - 'identity_column':tables[t]['identity_column'], - 'has_source_id':True if tables[t]['has_source_id']==1 else False,'FKs':tables[t]['FKs'] if len(tables[t]['FKs'])>0 else None} for t in ordered} - -# str = df.to_json(orient='records') -# df = pandas.read_json(json_string, orient='records') - -class MockDB(): - def __init__(self,AUTH,DATABASE=None): - # server stuff - self.AUTH=AUTH - self.SERVER=AUTH['host'] - if DATABASE is None: - self.DATABASE=AUTH['database'] - else: - self.DATABASE=DATABASE - self.ENGINE=self.__create_engine() - - # mock db stuff - # convert with df.to_json(orient='records') - self.video = pandas.read_json('[{"id":31,"filename":"assets\\/data\\/TrackAddict\\/Log-20230626-173441 walk home 20230626.mp4","checksum":"30b55d42d2d5a76d46a4387e4a5b55a2","metadata":"{\\"streams\\": [{\\"index\\": 0, \\"codec_name\\": \\"h264\\", \\"codec_long_name\\": \\"H.264 \\/ AVC \\/ MPEG-4 AVC \\/ MPEG-4 part 10\\", \\"profile\\": \\"High\\", \\"codec_type\\": \\"video\\", \\"codec_time_base\\": \\"1713211\\/103340000\\", \\"codec_tag_string\\": \\"avc1\\", \\"codec_tag\\": \\"0x31637661\\", \\"width\\": 1920, \\"height\\": 1080, \\"coded_width\\": 1920, \\"coded_height\\": 1088, \\"closed_captions\\": 0, \\"has_b_frames\\": 0, \\"sample_aspect_ratio\\": \\"1:1\\", \\"display_aspect_ratio\\": \\"16:9\\", \\"pix_fmt\\": \\"yuv420p\\", \\"level\\": 40, \\"color_range\\": \\"tv\\", \\"color_space\\": \\"bt709\\", \\"color_transfer\\": \\"bt709\\", \\"color_primaries\\": \\"bt709\\", \\"chroma_location\\": \\"left\\", \\"refs\\": 1, \\"is_avc\\": \\"true\\", \\"nal_length_size\\": \\"4\\", \\"r_frame_rate\\": \\"179\\/6\\", \\"avg_frame_rate\\": \\"51670000\\/1713211\\", \\"time_base\\": \\"1\\/90000\\", \\"start_pts\\": 0, \\"start_time\\": \\"0.000000\\", \\"duration_ts\\": 15411202, \\"duration\\": \\"171.235578\\", \\"bit_rate\\": \\"16779348\\", \\"bits_per_raw_sample\\": \\"8\\", \\"nb_frames\\": \\"5167\\", \\"disposition\\": {\\"default\\": 1, \\"dub\\": 0, \\"original\\": 0, \\"comment\\": 0, \\"lyrics\\": 0, \\"karaoke\\": 0, \\"forced\\": 0, \\"hearing_impaired\\": 0, \\"visual_impaired\\": 0, \\"clean_effects\\": 0, \\"attached_pic\\": 0, \\"timed_thumbnails\\": 0}, \\"tags\\": {\\"creation_time\\": \\"2023-06-26T21:37:35.000000Z\\", \\"language\\": \\"eng\\", \\"handler_name\\": \\"VideoHandle\\"}}, {\\"index\\": 1, \\"codec_name\\": \\"aac\\", \\"codec_long_name\\": \\"AAC (Advanced Audio Coding)\\", \\"profile\\": \\"LC\\", \\"codec_type\\": \\"audio\\", \\"codec_time_base\\": \\"1\\/48000\\", \\"codec_tag_string\\": \\"mp4a\\", \\"codec_tag\\": \\"0x6134706d\\", \\"sample_fmt\\": \\"fltp\\", \\"sample_rate\\": \\"48000\\", \\"channels\\": 2, \\"channel_layout\\": \\"stereo\\", \\"bits_per_sample\\": 0, \\"r_frame_rate\\": \\"0\\/0\\", \\"avg_frame_rate\\": \\"0\\/0\\", \\"time_base\\": \\"1\\/48000\\", \\"start_pts\\": 0, \\"start_time\\": \\"0.000000\\", \\"duration_ts\\": 8222592, \\"duration\\": \\"171.304000\\", \\"bit_rate\\": \\"156002\\", \\"max_bit_rate\\": \\"156000\\", \\"nb_frames\\": \\"8030\\", \\"disposition\\": {\\"default\\": 1, \\"dub\\": 0, \\"original\\": 0, \\"comment\\": 0, \\"lyrics\\": 0, \\"karaoke\\": 0, \\"forced\\": 0, \\"hearing_impaired\\": 0, \\"visual_impaired\\": 0, \\"clean_effects\\": 0, \\"attached_pic\\": 0, \\"timed_thumbnails\\": 0}, \\"tags\\": {\\"creation_time\\": \\"2023-06-26T21:37:35.000000Z\\", \\"language\\": \\"eng\\", \\"handler_name\\": \\"SoundHandle\\"}}], \\"format\\": {\\"filename\\": \\"assets\\/data\\/TrackAddict\\/Log-20230626-173441 walk home 20230626.mp4\\", \\"nb_streams\\": 2, \\"nb_programs\\": 0, \\"format_name\\": \\"mov,mp4,m4a,3gp,3g2,mj2\\", \\"format_long_name\\": \\"QuickTime \\/ MOV\\", \\"start_time\\": \\"0.000000\\", \\"duration\\": \\"171.304000\\", \\"size\\": \\"362561590\\", \\"bit_rate\\": \\"16931844\\", \\"probe_score\\": 100, \\"tags\\": {\\"major_brand\\": \\"mp42\\", \\"minor_version\\": \\"0\\", \\"compatible_brands\\": \\"isommp42\\", \\"creation_time\\": \\"2023-06-26T21:37:35.000000Z\\", \\"location\\": \\"+39.3327-076.6219\\/\\", \\"location-eng\\": \\"+39.3327-076.6219\\/\\", \\"com.android.version\\": \\"10\\"}}}"},{"id":33,"filename":"assets\\/data\\/TrackAddict\\/Log-20230711-174746 Segment_ryan_drive.mp4","checksum":"3d7e8f32590e6056970c05626195c1a8","metadata":"{\\"streams\\": [{\\"index\\": 0, \\"codec_name\\": \\"h264\\", \\"codec_long_name\\": \\"H.264 \\/ AVC \\/ MPEG-4 AVC \\/ MPEG-4 part 10\\", \\"profile\\": \\"High\\", \\"codec_type\\": \\"video\\", \\"codec_time_base\\": \\"777389\\/46660000\\", \\"codec_tag_string\\": \\"avc1\\", \\"codec_tag\\": \\"0x31637661\\", \\"width\\": 1920, \\"height\\": 1080, \\"coded_width\\": 1920, \\"coded_height\\": 1088, \\"closed_captions\\": 0, \\"has_b_frames\\": 0, \\"sample_aspect_ratio\\": \\"1:1\\", \\"display_aspect_ratio\\": \\"16:9\\", \\"pix_fmt\\": \\"yuvj420p\\", \\"level\\": 40, \\"color_range\\": \\"pc\\", \\"color_space\\": \\"smpte170m\\", \\"color_transfer\\": \\"smpte170m\\", \\"color_primaries\\": \\"smpte170m\\", \\"chroma_location\\": \\"left\\", \\"refs\\": 1, \\"is_avc\\": \\"true\\", \\"nal_length_size\\": \\"4\\", \\"r_frame_rate\\": \\"30\\/1\\", \\"avg_frame_rate\\": \\"23330000\\/777389\\", \\"time_base\\": \\"1\\/90000\\", \\"start_pts\\": 0, \\"start_time\\": \\"0.000000\\", \\"duration_ts\\": 41979006, \\"duration\\": \\"466.433400\\", \\"bit_rate\\": \\"16777420\\", \\"bits_per_raw_sample\\": \\"8\\", \\"nb_frames\\": \\"13998\\", \\"disposition\\": {\\"default\\": 1, \\"dub\\": 0, \\"original\\": 0, \\"comment\\": 0, \\"lyrics\\": 0, \\"karaoke\\": 0, \\"forced\\": 0, \\"hearing_impaired\\": 0, \\"visual_impaired\\": 0, \\"clean_effects\\": 0, \\"attached_pic\\": 0, \\"timed_thumbnails\\": 0}, \\"tags\\": {\\"rotate\\": \\"180\\", \\"creation_time\\": \\"2023-07-11T21:55:34.000000Z\\", \\"language\\": \\"eng\\", \\"handler_name\\": \\"VideoHandle\\"}, \\"side_data_list\\": [{\\"side_data_type\\": \\"Display Matrix\\", \\"displaymatrix\\": \\"\\\\n00000000: -65536 0 0\\\\n00000001: 0 -65536 0\\\\n00000002: 0 0 1073741824\\\\n\\", \\"rotation\\": -180}]}, {\\"index\\": 1, \\"codec_name\\": \\"aac\\", \\"codec_long_name\\": \\"AAC (Advanced Audio Coding)\\", \\"profile\\": \\"LC\\", \\"codec_type\\": \\"audio\\", \\"codec_time_base\\": \\"1\\/48000\\", \\"codec_tag_string\\": \\"mp4a\\", \\"codec_tag\\": \\"0x6134706d\\", \\"sample_fmt\\": \\"fltp\\", \\"sample_rate\\": \\"48000\\", \\"channels\\": 2, \\"channel_layout\\": \\"stereo\\", \\"bits_per_sample\\": 0, \\"r_frame_rate\\": \\"0\\/0\\", \\"avg_frame_rate\\": \\"0\\/0\\", \\"time_base\\": \\"1\\/48000\\", \\"start_pts\\": 0, \\"start_time\\": \\"0.000000\\", \\"duration_ts\\": 22390784, \\"duration\\": \\"466.474667\\", \\"bit_rate\\": \\"256001\\", \\"max_bit_rate\\": \\"256000\\", \\"nb_frames\\": \\"21866\\", \\"disposition\\": {\\"default\\": 1, \\"dub\\": 0, \\"original\\": 0, \\"comment\\": 0, \\"lyrics\\": 0, \\"karaoke\\": 0, \\"forced\\": 0, \\"hearing_impaired\\": 0, \\"visual_impaired\\": 0, \\"clean_effects\\": 0, \\"attached_pic\\": 0, \\"timed_thumbnails\\": 0}, \\"tags\\": {\\"creation_time\\": \\"2023-07-11T21:55:34.000000Z\\", \\"language\\": \\"eng\\", \\"handler_name\\": \\"SoundHandle\\"}}], \\"format\\": {\\"filename\\": \\"assets\\/data\\/TrackAddict\\/Log-20230711-174746 Segment_ryan_drive.mp4\\", \\"nb_streams\\": 2, \\"nb_programs\\": 0, \\"format_name\\": \\"mov,mp4,m4a,3gp,3g2,mj2\\", \\"format_long_name\\": \\"QuickTime \\/ MOV\\", \\"start_time\\": \\"0.000000\\", \\"duration\\": \\"466.475000\\", \\"size\\": \\"993337692\\", \\"bit_rate\\": \\"17035642\\", \\"probe_score\\": 100, \\"tags\\": {\\"major_brand\\": \\"mp42\\", \\"minor_version\\": \\"0\\", \\"compatible_brands\\": \\"isommp42\\", \\"creation_time\\": \\"2023-07-11T21:55:34.000000Z\\", \\"location\\": \\"+39.3323-076.6234\\/\\", \\"location-eng\\": \\"+39.3323-076.6234\\/\\", \\"com.android.version\\": \\"9\\"}}}"},{"id":42,"filename":"assets\\/data\\/TrackAddict\\/Log-20230707-093013 walk to work GL.mp4","checksum":"b9fbf97f0c79899a4f8af1304a245624","metadata":"{\\"streams\\": [{\\"index\\": 0, \\"codec_name\\": \\"h264\\", \\"codec_long_name\\": \\"H.264 \\/ AVC \\/ MPEG-4 AVC \\/ MPEG-4 part 10\\", \\"profile\\": \\"High\\", \\"codec_type\\": \\"video\\", \\"codec_time_base\\": \\"5867263\\/353640000\\", \\"codec_tag_string\\": \\"avc1\\", \\"codec_tag\\": \\"0x31637661\\", \\"width\\": 1920, \\"height\\": 1080, \\"coded_width\\": 1920, \\"coded_height\\": 1088, \\"closed_captions\\": 0, \\"has_b_frames\\": 0, \\"sample_aspect_ratio\\": \\"1:1\\", \\"display_aspect_ratio\\": \\"16:9\\", \\"pix_fmt\\": \\"yuv420p\\", \\"level\\": 40, \\"color_range\\": \\"tv\\", \\"color_space\\": \\"bt709\\", \\"color_transfer\\": \\"bt709\\", \\"color_primaries\\": \\"bt709\\", \\"chroma_location\\": \\"left\\", \\"refs\\": 1, \\"is_avc\\": \\"true\\", \\"nal_length_size\\": \\"4\\", \\"r_frame_rate\\": \\"179\\/6\\", \\"avg_frame_rate\\": \\"176820000\\/5867263\\", \\"time_base\\": \\"1\\/90000\\", \\"start_pts\\": 0, \\"start_time\\": \\"0.000000\\", \\"duration_ts\\": 17594370, \\"duration\\": \\"195.493000\\", \\"bit_rate\\": \\"16778210\\", \\"bits_per_raw_sample\\": \\"8\\", \\"nb_frames\\": \\"5894\\", \\"disposition\\": {\\"default\\": 1, \\"dub\\": 0, \\"original\\": 0, \\"comment\\": 0, \\"lyrics\\": 0, \\"karaoke\\": 0, \\"forced\\": 0, \\"hearing_impaired\\": 0, \\"visual_impaired\\": 0, \\"clean_effects\\": 0, \\"attached_pic\\": 0, \\"timed_thumbnails\\": 0}, \\"tags\\": {\\"creation_time\\": \\"2023-07-07T13:33:32.000000Z\\", \\"language\\": \\"eng\\", \\"handler_name\\": \\"VideoHandle\\"}}, {\\"index\\": 1, \\"codec_name\\": \\"aac\\", \\"codec_long_name\\": \\"AAC (Advanced Audio Coding)\\", \\"profile\\": \\"LC\\", \\"codec_type\\": \\"audio\\", \\"codec_time_base\\": \\"1\\/48000\\", \\"codec_tag_string\\": \\"mp4a\\", \\"codec_tag\\": \\"0x6134706d\\", \\"sample_fmt\\": \\"fltp\\", \\"sample_rate\\": \\"48000\\", \\"channels\\": 2, \\"channel_layout\\": \\"stereo\\", \\"bits_per_sample\\": 0, \\"r_frame_rate\\": \\"0\\/0\\", \\"avg_frame_rate\\": \\"0\\/0\\", \\"time_base\\": \\"1\\/48000\\", \\"start_pts\\": 0, \\"start_time\\": \\"0.000000\\", \\"duration_ts\\": 9385837, \\"duration\\": \\"195.538271\\", \\"bit_rate\\": \\"156002\\", \\"max_bit_rate\\": \\"156000\\", \\"nb_frames\\": \\"9166\\", \\"disposition\\": {\\"default\\": 1, \\"dub\\": 0, \\"original\\": 0, \\"comment\\": 0, \\"lyrics\\": 0, \\"karaoke\\": 0, \\"forced\\": 0, \\"hearing_impaired\\": 0, \\"visual_impaired\\": 0, \\"clean_effects\\": 0, \\"attached_pic\\": 0, \\"timed_thumbnails\\": 0}, \\"tags\\": {\\"creation_time\\": \\"2023-07-07T13:33:32.000000Z\\", \\"language\\": \\"eng\\", \\"handler_name\\": \\"SoundHandle\\"}}], \\"format\\": {\\"filename\\": \\"assets\\/data\\/TrackAddict\\/Log-20230707-093013 walk to work GL.mp4\\", \\"nb_streams\\": 2, \\"nb_programs\\": 0, \\"format_name\\": \\"mov,mp4,m4a,3gp,3g2,mj2\\", \\"format_long_name\\": \\"QuickTime \\/ MOV\\", \\"start_time\\": \\"0.000000\\", \\"duration\\": \\"195.538000\\", \\"size\\": \\"413893934\\", \\"bit_rate\\": \\"16933544\\", \\"probe_score\\": 100, \\"tags\\": {\\"major_brand\\": \\"mp42\\", \\"minor_version\\": \\"0\\", \\"compatible_brands\\": \\"isommp42\\", \\"creation_time\\": \\"2023-07-07T13:33:32.000000Z\\", \\"location\\": \\"+39.3356-076.6200\\/\\", \\"location-eng\\": \\"+39.3356-076.6200\\/\\", \\"com.android.version\\": \\"10\\"}}}"}]') - self.audio = pandas.read_json('[{"id":25,"video_id":31,"filename":"assets\\/data\\/TrackAddict\\/Log-20230626-173441 walk home 20230626.wav","checksum":"7d577446990e0d6c30cd86cd98f9c20b"},{"id":27,"video_id":33,"filename":"assets\\/data\\/TrackAddict\\/Log-20230711-174746 Segment_ryan_drive.wav","checksum":"6257ac17fdfa521d0707f648b2aa31e6"},{"id":36,"video_id":42,"filename":"assets\\/data\\/TrackAddict\\/Log-20230707-093013 walk to work GL.wav","checksum":"c16cd11373c78a796bb0e7b98f6fd8a3"}]') - self.transcription = pandas.read_json('[{"id":21,"audio_id":25,"config":"{\\"model\\": \\"whisper-net\\", \\"load_model\\": \\"base\\"}"},{"id":23,"audio_id":27,"config":"{\\"model\\": \\"whisper-net\\", \\"load_model\\": \\"base\\"}"},{"id":29,"audio_id":36,"config":"{\\"model\\": \\"whisper-net\\", \\"load_model\\": \\"base\\"}"}]') - self.text_segment = pandas.read_json('[{"id":4454,"transcription_id":21,"segment":" Here\'s a car.","temperature":null,"time_start":9.3800001144,"time_end":10.4799995422,"thumbnail":null,"video_id":31},{"id":4455,"transcription_id":21,"segment":" Here\'s a parking lot with lots of cars on it.","temperature":null,"time_start":11.0200004578,"time_end":13.8599996567,"thumbnail":null,"video_id":31},{"id":4456,"transcription_id":21,"segment":" I\'m walking.","temperature":null,"time_start":14.6800003052,"time_end":15.4600000381,"thumbnail":null,"video_id":31},{"id":4457,"transcription_id":21,"segment":" Here are more parking spaces.","temperature":null,"time_start":15.9799995422,"time_end":18.9200000763,"thumbnail":null,"video_id":31},{"id":4458,"transcription_id":21,"segment":" More cars on it.","temperature":null,"time_start":19.9799995422,"time_end":21.1200008392,"thumbnail":null,"video_id":31},{"id":4459,"transcription_id":21,"segment":" Here\'s a Prius.","temperature":null,"time_start":23.3600006104,"time_end":24.4799995422,"thumbnail":null,"video_id":31},{"id":4460,"transcription_id":21,"segment":" Here\'s a Camry.","temperature":null,"time_start":25.9799995422,"time_end":26.7399997711,"thumbnail":null,"video_id":31},{"id":4461,"transcription_id":21,"segment":" Here\'s a Chevrolet.","temperature":null,"time_start":29.5799999237,"time_end":31.1200008392,"thumbnail":null,"video_id":31},{"id":4462,"transcription_id":21,"segment":" Keep on going.","temperature":null,"time_start":31.5,"time_end":34.9599990845,"thumbnail":null,"video_id":31},{"id":4463,"transcription_id":21,"segment":" Here\'s a car coming towards us.","temperature":null,"time_start":35.9799995422,"time_end":38.2999992371,"thumbnail":null,"video_id":31},{"id":4464,"transcription_id":21,"segment":" Here\'s an Acura Toyota BMW.","temperature":null,"time_start":38.4199981689,"time_end":42.4000015259,"thumbnail":null,"video_id":31},{"id":4465,"transcription_id":21,"segment":" Somebody\'s walking in my direction now.","temperature":null,"time_start":45.1399993896,"time_end":52.9599990845,"thumbnail":null,"video_id":31},{"id":4466,"transcription_id":21,"segment":" Come behind the tree.","temperature":null,"time_start":53.4399986267,"time_end":54.9000015259,"thumbnail":null,"video_id":31},{"id":4467,"transcription_id":21,"segment":" There he is.","temperature":null,"time_start":55.2000007629,"time_end":55.7599983215,"thumbnail":null,"video_id":31},{"id":4468,"transcription_id":21,"segment":" He\'s a person and then walking.","temperature":null,"time_start":56.0200004578,"time_end":57.9399986267,"thumbnail":null,"video_id":31},{"id":4469,"transcription_id":21,"segment":" There are more people walking in the distance.","temperature":null,"time_start":59.2799987793,"time_end":62.0400009155,"thumbnail":null,"video_id":31},{"id":4470,"transcription_id":21,"segment":" Going to walk up the slope towards the sports field of Jones Hopkins.","temperature":null,"time_start":63.4599990845,"time_end":68.7200012207,"thumbnail":null,"video_id":31},{"id":4471,"transcription_id":21,"segment":" Here\'s some sporting equipment.","temperature":null,"time_start":69.4400024414,"time_end":71.8199996948,"thumbnail":null,"video_id":31},{"id":4472,"transcription_id":21,"segment":" ROTC climbing hall.","temperature":null,"time_start":73.1399993896,"time_end":76.8199996948,"thumbnail":null,"video_id":31},{"id":4473,"transcription_id":21,"segment":" The scoreboard of the home wood field.","temperature":null,"time_start":79.0400009155,"time_end":81.6600036621,"thumbnail":null,"video_id":31},{"id":4474,"transcription_id":21,"segment":" The distance is the hotel.","temperature":null,"time_start":82.0199966431,"time_end":84.6200027466,"thumbnail":null,"video_id":31},{"id":4475,"transcription_id":21,"segment":" The colon aid.","temperature":null,"time_start":85.5599975586,"time_end":86.2399978638,"thumbnail":null,"video_id":31},{"id":4476,"transcription_id":21,"segment":" Here\'s a sport field coming up across another sports.","temperature":null,"time_start":86.7200012207,"time_end":92.3199996948,"thumbnail":null,"video_id":31},{"id":4477,"transcription_id":21,"segment":" There\'s some of the cross-goals coming up there.","temperature":null,"time_start":99.7600021362,"time_end":101.9000015259,"thumbnail":null,"video_id":31},{"id":4478,"transcription_id":21,"segment":" This is the sports field of the whole.","temperature":null,"time_start":103.4599990845,"time_end":108.1999969482,"thumbnail":null,"video_id":31},{"id":4479,"transcription_id":21,"segment":" The stands, historical plates.","temperature":null,"time_start":108.1999969482,"time_end":113.2799987793,"thumbnail":null,"video_id":31},{"id":4480,"transcription_id":21,"segment":" There\'s a church of Christ\'s scientist.","temperature":null,"time_start":117.6399993896,"time_end":128.8800048828,"thumbnail":null,"video_id":31},{"id":4481,"transcription_id":21,"segment":" There\'s the Imagine Center of the University.","temperature":null,"time_start":129.5599975586,"time_end":133.4600067139,"thumbnail":null,"video_id":31},{"id":4482,"transcription_id":21,"segment":" More cars driving by the West University Parkway.","temperature":null,"time_start":134.0,"time_end":141.6399993896,"thumbnail":null,"video_id":31},{"id":4483,"transcription_id":21,"segment":" Light bulbs.","temperature":null,"time_start":142.2400054932,"time_end":147.5399932861,"thumbnail":null,"video_id":31},{"id":4484,"transcription_id":21,"segment":" Light bulbs.","temperature":null,"time_start":148.2599945068,"time_end":150.1199951172,"thumbnail":null,"video_id":31},{"id":4485,"transcription_id":21,"segment":" Some ballards.","temperature":null,"time_start":150.8600006104,"time_end":153.3399963379,"thumbnail":null,"video_id":31},{"id":4486,"transcription_id":21,"segment":" The stop sign coming up.","temperature":null,"time_start":156.2799987793,"time_end":159.8200073242,"thumbnail":null,"video_id":31},{"id":4487,"transcription_id":21,"segment":" Zip car parking lots.","temperature":null,"time_start":162.1799926758,"time_end":165.6999969482,"thumbnail":null,"video_id":31},{"id":4514,"transcription_id":23,"segment":" Okay, is the person in the crosswalk?","temperature":null,"time_start":2.0199999809,"time_end":4.9000000954,"thumbnail":null,"video_id":33},{"id":4515,"transcription_id":23,"segment":" All right.","temperature":null,"time_start":5.1799998283,"time_end":9.1999998093,"thumbnail":null,"video_id":33},{"id":4516,"transcription_id":23,"segment":" Lady with the backpack right over here.","temperature":null,"time_start":9.8999996185,"time_end":14.6000003815,"thumbnail":null,"video_id":33},{"id":4517,"transcription_id":23,"segment":" Okay.","temperature":null,"time_start":15.1000003815,"time_end":18.8199996948,"thumbnail":null,"video_id":33},{"id":4518,"transcription_id":23,"segment":" Following a four runner.","temperature":null,"time_start":20.8799991608,"time_end":24.0,"thumbnail":null,"video_id":33},{"id":4519,"transcription_id":23,"segment":" Here comes some pedestrians.","temperature":null,"time_start":24.7999992371,"time_end":28.4200000763,"thumbnail":null,"video_id":33},{"id":4520,"transcription_id":23,"segment":" People walking.","temperature":null,"time_start":30.5,"time_end":31.0200004578,"thumbnail":null,"video_id":33},{"id":4521,"transcription_id":23,"segment":" Oh look, these people are holding hands.","temperature":null,"time_start":32.1399993896,"time_end":36.8199996948,"thumbnail":null,"video_id":33},{"id":4522,"transcription_id":23,"segment":" Right there walking together.","temperature":null,"time_start":37.7999992371,"time_end":39.2400016785,"thumbnail":null,"video_id":33},{"id":4523,"transcription_id":23,"segment":" Here comes a lady looking in her satchel.","temperature":null,"time_start":39.9799995422,"time_end":44.3600006104,"thumbnail":null,"video_id":33},{"id":4524,"transcription_id":23,"segment":" She won\'t cut me well.","temperature":null,"time_start":44.8400001526,"time_end":45.7799987793,"thumbnail":null,"video_id":33},{"id":4525,"transcription_id":23,"segment":" All right.","temperature":null,"time_start":46.4599990845,"time_end":48.5999984741,"thumbnail":null,"video_id":33},{"id":4526,"transcription_id":23,"segment":" Here\'s another person with the backpack.","temperature":null,"time_start":49.7000007629,"time_end":52.8199996948,"thumbnail":null,"video_id":33},{"id":4527,"transcription_id":23,"segment":" Lots of trees in this area.","temperature":null,"time_start":54.9799995422,"time_end":58.0999984741,"thumbnail":null,"video_id":33},{"id":4528,"transcription_id":23,"segment":" There\'s a lamp post.","temperature":null,"time_start":58.0999984741,"time_end":63.2200012207,"thumbnail":null,"video_id":33},{"id":4529,"transcription_id":23,"segment":" Here\'s another pedestrian wearing all black.","temperature":null,"time_start":64.3600006104,"time_end":67.0800018311,"thumbnail":null,"video_id":33},{"id":4530,"transcription_id":23,"segment":" Here we\'re coming up to a traffic signal.","temperature":null,"time_start":68.0999984741,"time_end":74.3600006104,"thumbnail":null,"video_id":33},{"id":4531,"transcription_id":23,"segment":" Turning left at the traffic signal.","temperature":null,"time_start":75.9800033569,"time_end":79.7600021362,"thumbnail":null,"video_id":33},{"id":4532,"transcription_id":23,"segment":" Here we go.","temperature":null,"time_start":82.1200027466,"time_end":85.0800018311,"thumbnail":null,"video_id":33},{"id":4533,"transcription_id":23,"segment":" Here\'s a bike sign.","temperature":null,"time_start":85.3600006104,"time_end":86.4800033569,"thumbnail":null,"video_id":33},{"id":4534,"transcription_id":23,"segment":" And we\'re coming up to a crosswalk here.","temperature":null,"time_start":87.8000030518,"time_end":92.0999984741,"thumbnail":null,"video_id":33},{"id":4535,"transcription_id":23,"segment":" All right.","temperature":null,"time_start":93.1600036621,"time_end":94.4800033569,"thumbnail":null,"video_id":33},{"id":4536,"transcription_id":23,"segment":" Another traffic signal.","temperature":null,"time_start":95.6200027466,"time_end":99.1600036621,"thumbnail":null,"video_id":33},{"id":4537,"transcription_id":23,"segment":" Lots of parked cars here.","temperature":null,"time_start":105.9400024414,"time_end":108.6600036621,"thumbnail":null,"video_id":33},{"id":4538,"transcription_id":23,"segment":" Many, many, many, many parked cars.","temperature":null,"time_start":109.5800018311,"time_end":113.0400009155,"thumbnail":null,"video_id":33},{"id":4539,"transcription_id":23,"segment":" So many parked cars.","temperature":null,"time_start":113.5599975586,"time_end":116.4400024414,"thumbnail":null,"video_id":33},{"id":4540,"transcription_id":23,"segment":" All right.","temperature":null,"time_start":117.5999984741,"time_end":118.0,"thumbnail":null,"video_id":33},{"id":4541,"transcription_id":23,"segment":" A speed limit 30 sign.","temperature":null,"time_start":118.0800018311,"time_end":119.5999984741,"thumbnail":null,"video_id":33},{"id":4542,"transcription_id":23,"segment":" Some no stopping signs over here.","temperature":null,"time_start":121.6999969482,"time_end":125.2799987793,"thumbnail":null,"video_id":33},{"id":4543,"transcription_id":23,"segment":" More parked cars.","temperature":null,"time_start":125.2799987793,"time_end":127.6800003052,"thumbnail":null,"video_id":33},{"id":4544,"transcription_id":23,"segment":" Oh, here are some cars.","temperature":null,"time_start":128.2400054932,"time_end":133.4400024414,"thumbnail":null,"video_id":33},{"id":4545,"transcription_id":23,"segment":" This is a CRB.","temperature":null,"time_start":133.6199951172,"time_end":134.8999938965,"thumbnail":null,"video_id":33},{"id":4546,"transcription_id":23,"segment":" Maryland license plate.","temperature":null,"time_start":135.8000030518,"time_end":138.2400054932,"thumbnail":null,"video_id":33},{"id":4547,"transcription_id":23,"segment":" Protected the traffic.","temperature":null,"time_start":139.0,"time_end":140.6600036621,"thumbnail":null,"video_id":33},{"id":4548,"transcription_id":23,"segment":" I don\'t think your video was great.","temperature":null,"time_start":141.6600036621,"time_end":144.0200042725,"thumbnail":null,"video_id":33},{"id":4549,"transcription_id":23,"segment":" I\'m sorry, but we found some more trees.","temperature":null,"time_start":144.6999969482,"time_end":149.6199951172,"thumbnail":null,"video_id":33},{"id":4550,"transcription_id":23,"segment":" And parked cars.","temperature":null,"time_start":151.0399932861,"time_end":153.9799957275,"thumbnail":null,"video_id":33},{"id":4551,"transcription_id":23,"segment":" There\'s a yellow fire hydrant.","temperature":null,"time_start":155.3999938965,"time_end":160.1199951172,"thumbnail":null,"video_id":33},{"id":4552,"transcription_id":23,"segment":" There\'s more pedestrians.","temperature":null,"time_start":163.9600067139,"time_end":168.9199981689,"thumbnail":null,"video_id":33},{"id":4553,"transcription_id":23,"segment":" A green shirt.","temperature":null,"time_start":169.5800018311,"time_end":171.2799987793,"thumbnail":null,"video_id":33},{"id":4554,"transcription_id":23,"segment":" Here we\'re coming up to another traffic light.","temperature":null,"time_start":172.1000061035,"time_end":176.3399963379,"thumbnail":null,"video_id":33},{"id":4555,"transcription_id":23,"segment":" Lots of cars.","temperature":null,"time_start":176.9600067139,"time_end":177.6799926758,"thumbnail":null,"video_id":33},{"id":4556,"transcription_id":23,"segment":" This is a red light.","temperature":null,"time_start":178.7599945068,"time_end":181.8000030518,"thumbnail":null,"video_id":33},{"id":4557,"transcription_id":23,"segment":" That\'s right.","temperature":null,"time_start":183.0200042725,"time_end":183.9400024414,"thumbnail":null,"video_id":33},{"id":4558,"transcription_id":23,"segment":" What if there\'s information to them?","temperature":null,"time_start":184.4799957275,"time_end":188.0200042725,"thumbnail":null,"video_id":33},{"id":4559,"transcription_id":23,"segment":" No, this is good.","temperature":null,"time_start":188.4199981689,"time_end":189.1399993896,"thumbnail":null,"video_id":33},{"id":4560,"transcription_id":23,"segment":" Because this will be like my headlarks during the video.","temperature":null,"time_start":190.8000030518,"time_end":195.8600006104,"thumbnail":null,"video_id":33},{"id":4561,"transcription_id":23,"segment":" So then we can search and take a car.","temperature":null,"time_start":196.8000030518,"time_end":199.1199951172,"thumbnail":null,"video_id":33},{"id":4562,"transcription_id":23,"segment":" It\'s a park that\'s trying to park.","temperature":null,"time_start":199.1199951172,"time_end":200.5,"thumbnail":null,"video_id":33},{"id":4563,"transcription_id":23,"segment":" Parallel park and doing a great job.","temperature":null,"time_start":200.8999938965,"time_end":203.6600036621,"thumbnail":null,"video_id":33},{"id":4564,"transcription_id":23,"segment":" Oh, here we go.","temperature":null,"time_start":204.4199981689,"time_end":206.2799987793,"thumbnail":null,"video_id":33},{"id":4565,"transcription_id":23,"segment":" No left turn sign.","temperature":null,"time_start":206.9400024414,"time_end":209.0800018311,"thumbnail":null,"video_id":33},{"id":4566,"transcription_id":23,"segment":" That\'s it.","temperature":null,"time_start":212.5800018311,"time_end":218.3399963379,"thumbnail":null,"video_id":33},{"id":4567,"transcription_id":23,"segment":" I mean, we just keep this upright.","temperature":null,"time_start":218.5599975586,"time_end":219.9199981689,"thumbnail":null,"video_id":33},{"id":4568,"transcription_id":23,"segment":" All right.","temperature":null,"time_start":220.4199981689,"time_end":221.1399993896,"thumbnail":null,"video_id":33},{"id":4569,"transcription_id":23,"segment":" It\'s mundane, but this is the problem.","temperature":null,"time_start":221.5399932861,"time_end":223.6600036621,"thumbnail":null,"video_id":33},{"id":4570,"transcription_id":23,"segment":" Okay.","temperature":null,"time_start":223.7599945068,"time_end":224.3600006104,"thumbnail":null,"video_id":33},{"id":4571,"transcription_id":23,"segment":" Here we come.","temperature":null,"time_start":224.8399963379,"time_end":225.6600036621,"thumbnail":null,"video_id":33},{"id":4572,"transcription_id":23,"segment":" Yes.","temperature":null,"time_start":225.7799987793,"time_end":226.2200012207,"thumbnail":null,"video_id":33},{"id":4573,"transcription_id":23,"segment":" Here we are coming up to another traffic light.","temperature":null,"time_start":226.6600036621,"time_end":230.1199951172,"thumbnail":null,"video_id":33},{"id":4574,"transcription_id":23,"segment":" Still following the CRB.","temperature":null,"time_start":230.6999969482,"time_end":234.9799957275,"thumbnail":null,"video_id":33},{"id":4575,"transcription_id":23,"segment":" Is this okay?","temperature":null,"time_start":235.8000030518,"time_end":239.2200012207,"thumbnail":null,"video_id":33},{"id":4576,"transcription_id":23,"segment":" Yeah, that\'s right.","temperature":null,"time_start":242.0,"time_end":243.1600036621,"thumbnail":null,"video_id":33},{"id":4577,"transcription_id":23,"segment":" No, this is good.","temperature":null,"time_start":243.7799987793,"time_end":247.3800048828,"thumbnail":null,"video_id":33},{"id":4578,"transcription_id":23,"segment":" Yeah, as long as you can just see the things that you\'re talking about.","temperature":null,"time_start":247.7599945068,"time_end":250.1999969482,"thumbnail":null,"video_id":33},{"id":4579,"transcription_id":23,"segment":" Here\'s a gray sonata.","temperature":null,"time_start":254.3200073242,"time_end":257.1000061035,"thumbnail":null,"video_id":33},{"id":4580,"transcription_id":23,"segment":" Yeah, we want to say Honda as well.","temperature":null,"time_start":257.7200012207,"time_end":259.5799865723,"thumbnail":null,"video_id":33},{"id":4581,"transcription_id":23,"segment":" Honda.","temperature":null,"time_start":259.5799865723,"time_end":260.0799865723,"thumbnail":null,"video_id":33},{"id":4582,"transcription_id":23,"segment":" I don\'t know.","temperature":null,"time_start":260.3800048828,"time_end":261.0400085449,"thumbnail":null,"video_id":33},{"id":4583,"transcription_id":23,"segment":" Why is that?","temperature":null,"time_start":261.1199951172,"time_end":261.5599975586,"thumbnail":null,"video_id":33},{"id":4584,"transcription_id":23,"segment":" Oh, yeah.","temperature":null,"time_start":261.7600097656,"time_end":263.4400024414,"thumbnail":null,"video_id":33},{"id":4585,"transcription_id":23,"segment":" Why is that?","temperature":null,"time_start":263.8399963379,"time_end":264.700012207,"thumbnail":null,"video_id":33},{"id":4586,"transcription_id":23,"segment":" It\'s okay.","temperature":null,"time_start":264.7600097656,"time_end":265.1400146484,"thumbnail":null,"video_id":33},{"id":4587,"transcription_id":23,"segment":" Is this cool zone sign?","temperature":null,"time_start":266.3800048828,"time_end":270.5599975586,"thumbnail":null,"video_id":33},{"id":4588,"transcription_id":23,"segment":" Yeah.","temperature":null,"time_start":280.200012207,"time_end":280.7600097656,"thumbnail":null,"video_id":33},{"id":4589,"transcription_id":23,"segment":" I want all.","temperature":null,"time_start":280.7600097656,"time_end":282.6799926758,"thumbnail":null,"video_id":33},{"id":4590,"transcription_id":23,"segment":" Coming up to another traffic signal here in a dirage condominium sign.","temperature":null,"time_start":286.8399963379,"time_end":298.5599975586,"thumbnail":null,"video_id":33},{"id":4591,"transcription_id":23,"segment":" You can see that.","temperature":null,"time_start":299.2600097656,"time_end":302.6799926758,"thumbnail":null,"video_id":33},{"id":4592,"transcription_id":23,"segment":" Don\'t worry about it.","temperature":null,"time_start":303.3599853516,"time_end":304.8800048828,"thumbnail":null,"video_id":33},{"id":4593,"transcription_id":23,"segment":" It\'s not the end of the world if it\'s okay.","temperature":null,"time_start":306.799987793,"time_end":309.8599853516,"thumbnail":null,"video_id":33},{"id":4594,"transcription_id":23,"segment":" We just want these like, when you say these landmarks, then it\'s good.","temperature":null,"time_start":309.8999938965,"time_end":312.3999938965,"thumbnail":null,"video_id":33},{"id":4595,"transcription_id":23,"segment":" These are good things that we\'re searching for.","temperature":null,"time_start":313.1000061035,"time_end":315.8399963379,"thumbnail":null,"video_id":33},{"id":4596,"transcription_id":23,"segment":" It\'s like gas station over here on the left.","temperature":null,"time_start":316.2799987793,"time_end":320.2799987793,"thumbnail":null,"video_id":33},{"id":4597,"transcription_id":23,"segment":"","temperature":null,"time_start":320.5599975586,"time_end":320.5599975586,"thumbnail":null,"video_id":33},{"id":4598,"transcription_id":23,"segment":" An exon.","temperature":null,"time_start":321.0799865723,"time_end":322.0,"thumbnail":null,"video_id":33},{"id":4599,"transcription_id":23,"segment":" Circle K.","temperature":null,"time_start":322.9800109863,"time_end":324.0199890137,"thumbnail":null,"video_id":33},{"id":4600,"transcription_id":23,"segment":" All right.","temperature":null,"time_start":325.1400146484,"time_end":326.4800109863,"thumbnail":null,"video_id":33},{"id":4601,"transcription_id":23,"segment":" Here\'s, oh, a gas station on the right.","temperature":null,"time_start":326.700012207,"time_end":328.5,"thumbnail":null,"video_id":33},{"id":4602,"transcription_id":23,"segment":" Marathon.","temperature":null,"time_start":328.799987793,"time_end":329.2600097656,"thumbnail":null,"video_id":33},{"id":4603,"transcription_id":23,"segment":" Yeah.","temperature":null,"time_start":331.2399902344,"time_end":332.0199890137,"thumbnail":null,"video_id":33},{"id":4604,"transcription_id":23,"segment":" Yeah.","temperature":null,"time_start":332.3399963379,"time_end":332.8200073242,"thumbnail":null,"video_id":33},{"id":4605,"transcription_id":23,"segment":" Yeah.","temperature":null,"time_start":333.3399963379,"time_end":334.1199951172,"thumbnail":null,"video_id":33},{"id":4606,"transcription_id":23,"segment":"","temperature":null,"time_start":334.4599914551,"time_end":334.4599914551,"thumbnail":null,"video_id":33},{"id":4607,"transcription_id":23,"segment":" Yeah.","temperature":null,"time_start":334.8800048828,"time_end":335.1400146484,"thumbnail":null,"video_id":33},{"id":4608,"transcription_id":23,"segment":" Is that yield sign?","temperature":null,"time_start":335.6600036621,"time_end":338.7799987793,"thumbnail":null,"video_id":33},{"id":4609,"transcription_id":23,"segment":" Oh, it\'s me.","temperature":null,"time_start":342.6400146484,"time_end":347.1600036621,"thumbnail":null,"video_id":33},{"id":4610,"transcription_id":23,"segment":" What kind of parts is this in front?","temperature":null,"time_start":347.9800109863,"time_end":353.2200012207,"thumbnail":null,"video_id":33},{"id":4611,"transcription_id":23,"segment":" Honda.","temperature":null,"time_start":353.9400024414,"time_end":354.3200073242,"thumbnail":null,"video_id":33},{"id":4612,"transcription_id":23,"segment":" I want to take a picture of something.","temperature":null,"time_start":362.1400146484,"time_end":364.8599853516,"thumbnail":null,"video_id":33},{"id":4613,"transcription_id":23,"segment":" So I can zoom in now.","temperature":null,"time_start":365.6199951172,"time_end":367.1799926758,"thumbnail":null,"video_id":33},{"id":4614,"transcription_id":23,"segment":" I don\'t know if it\'s a creature or something.","temperature":null,"time_start":367.8999938965,"time_end":370.6799926758,"thumbnail":null,"video_id":33},{"id":4615,"transcription_id":23,"segment":" Right here?","temperature":null,"time_start":371.0400085449,"time_end":371.5199890137,"thumbnail":null,"video_id":33},{"id":4616,"transcription_id":23,"segment":" Over there.","temperature":null,"time_start":371.8999938965,"time_end":372.8999938965,"thumbnail":null,"video_id":33},{"id":4617,"transcription_id":23,"segment":" That bundle?","temperature":null,"time_start":373.1799926758,"time_end":373.6600036621,"thumbnail":null,"video_id":33},{"id":4618,"transcription_id":23,"segment":" Yeah.","temperature":null,"time_start":374.299987793,"time_end":374.5400085449,"thumbnail":null,"video_id":33},{"id":4619,"transcription_id":23,"segment":" Yeah.","temperature":null,"time_start":375.1600036621,"time_end":375.9599914551,"thumbnail":null,"video_id":33},{"id":4620,"transcription_id":23,"segment":" Six or six.","temperature":null,"time_start":376.2399902344,"time_end":377.1400146484,"thumbnail":null,"video_id":33},{"id":4621,"transcription_id":23,"segment":" Yeah.","temperature":null,"time_start":377.6000061035,"time_end":377.8200073242,"thumbnail":null,"video_id":33},{"id":4622,"transcription_id":23,"segment":" The same with the yard for the other.","temperature":null,"time_start":378.0,"time_end":379.299987793,"thumbnail":null,"video_id":33},{"id":4623,"transcription_id":23,"segment":" Oh, yeah.","temperature":null,"time_start":379.5199890137,"time_end":379.8599853516,"thumbnail":null,"video_id":33},{"id":4624,"transcription_id":23,"segment":" There\'s a scroll over there.","temperature":null,"time_start":379.8599853516,"time_end":380.799987793,"thumbnail":null,"video_id":33},{"id":4625,"transcription_id":23,"segment":" It\'s really cute.","temperature":null,"time_start":381.0599975586,"time_end":381.6600036621,"thumbnail":null,"video_id":33},{"id":4626,"transcription_id":23,"segment":" The car is like a six-story building.","temperature":null,"time_start":385.1199951172,"time_end":388.2600097656,"thumbnail":null,"video_id":33},{"id":4627,"transcription_id":23,"segment":" Mm-hmm.","temperature":null,"time_start":388.8800048828,"time_end":389.4800109863,"thumbnail":null,"video_id":33},{"id":4628,"transcription_id":23,"segment":" And the left for all the green.","temperature":null,"time_start":390.299987793,"time_end":391.700012207,"thumbnail":null,"video_id":33},{"id":4629,"transcription_id":23,"segment":" And the dog is a different.","temperature":null,"time_start":392.0,"time_end":392.9599914551,"thumbnail":null,"video_id":33},{"id":4630,"transcription_id":23,"segment":" Oh, that\'s a different one.","temperature":null,"time_start":393.2200012207,"time_end":395.0199890137,"thumbnail":null,"video_id":33},{"id":4631,"transcription_id":23,"segment":" There\'s a part over there.","temperature":null,"time_start":395.5799865723,"time_end":397.7799987793,"thumbnail":null,"video_id":33},{"id":4632,"transcription_id":23,"segment":" It\'s greener.","temperature":null,"time_start":398.1799926758,"time_end":399.1400146484,"thumbnail":null,"video_id":33},{"id":4633,"transcription_id":23,"segment":" And the pedestrian crossing inside is...","temperature":null,"time_start":400.6600036621,"time_end":407.8399963379,"thumbnail":null,"video_id":33},{"id":4634,"transcription_id":23,"segment":" Is that...","temperature":null,"time_start":407.8399963379,"time_end":410.799987793,"thumbnail":null,"video_id":33},{"id":4635,"transcription_id":23,"segment":" What do you have?","temperature":null,"time_start":410.799987793,"time_end":411.7799987793,"thumbnail":null,"video_id":33},{"id":4636,"transcription_id":23,"segment":"","temperature":null,"time_start":411.7799987793,"time_end":411.7799987793,"thumbnail":null,"video_id":33},{"id":4637,"transcription_id":23,"segment":" I don\'t know.","temperature":null,"time_start":412.5599975586,"time_end":413.4599914551,"thumbnail":null,"video_id":33},{"id":4638,"transcription_id":23,"segment":" Oh, three way signs.","temperature":null,"time_start":414.1000061035,"time_end":415.8599853516,"thumbnail":null,"video_id":33},{"id":4639,"transcription_id":23,"segment":" I\'m able to watch the one.","temperature":null,"time_start":416.9599914551,"time_end":419.1000061035,"thumbnail":null,"video_id":33},{"id":4640,"transcription_id":23,"segment":" Mm.","temperature":null,"time_start":420.1799926758,"time_end":420.3200073242,"thumbnail":null,"video_id":33},{"id":4641,"transcription_id":23,"segment":" That\'s interesting.","temperature":null,"time_start":421.0599975586,"time_end":421.5199890137,"thumbnail":null,"video_id":33},{"id":4642,"transcription_id":23,"segment":" You guys were looking at the side bars.","temperature":null,"time_start":422.0599975586,"time_end":424.9200134277,"thumbnail":null,"video_id":33},{"id":4643,"transcription_id":23,"segment":" Signed.","temperature":null,"time_start":425.2799987793,"time_end":425.9200134277,"thumbnail":null,"video_id":33},{"id":4644,"transcription_id":23,"segment":" We were going to wait for the 80-3 North in 83 South.","temperature":null,"time_start":425.9400024414,"time_end":430.7600097656,"thumbnail":null,"video_id":33},{"id":4645,"transcription_id":23,"segment":" The neighbor.","temperature":null,"time_start":431.200012207,"time_end":431.5799865723,"thumbnail":null,"video_id":33},{"id":4646,"transcription_id":23,"segment":" The Honda, the neighbor was going.","temperature":null,"time_start":431.9800109863,"time_end":433.7600097656,"thumbnail":null,"video_id":33},{"id":4647,"transcription_id":23,"segment":" Okay, man.","temperature":null,"time_start":434.3999938965,"time_end":434.9800109863,"thumbnail":null,"video_id":33},{"id":4648,"transcription_id":23,"segment":" It\'s in the side of the green.","temperature":null,"time_start":436.4599914551,"time_end":438.9599914551,"thumbnail":null,"video_id":33},{"id":4649,"transcription_id":23,"segment":" The field sign.","temperature":null,"time_start":438.9599914551,"time_end":440.1400146484,"thumbnail":null,"video_id":33},{"id":4650,"transcription_id":23,"segment":" On the ground, it.","temperature":null,"time_start":440.2200012207,"time_end":441.2200012207,"thumbnail":null,"video_id":33},{"id":4651,"transcription_id":23,"segment":" Okay.","temperature":null,"time_start":441.7600097656,"time_end":442.3800048828,"thumbnail":null,"video_id":33},{"id":4652,"transcription_id":23,"segment":" Are you going to stop it?","temperature":null,"time_start":443.0,"time_end":445.1600036621,"thumbnail":null,"video_id":33},{"id":4653,"transcription_id":23,"segment":" I don\'t know.","temperature":null,"time_start":445.6799926758,"time_end":446.5400085449,"thumbnail":null,"video_id":33},{"id":4654,"transcription_id":23,"segment":" I want to capture the freeway entrance.","temperature":null,"time_start":446.5400085449,"time_end":448.3800048828,"thumbnail":null,"video_id":33},{"id":4655,"transcription_id":23,"segment":" It\'s up to you.","temperature":null,"time_start":449.3599853516,"time_end":450.1000061035,"thumbnail":null,"video_id":33},{"id":4656,"transcription_id":23,"segment":" We can stop it.","temperature":null,"time_start":450.5,"time_end":452.5599975586,"thumbnail":null,"video_id":33},{"id":4657,"transcription_id":23,"segment":" Yeah, this one.","temperature":null,"time_start":453.4599914551,"time_end":453.9400024414,"thumbnail":null,"video_id":33},{"id":4658,"transcription_id":23,"segment":" I can\'t, I can\'t.","temperature":null,"time_start":454.0400085449,"time_end":454.4200134277,"thumbnail":null,"video_id":33},{"id":4659,"transcription_id":23,"segment":" I can\'t.","temperature":null,"time_start":454.4200134277,"time_end":454.6000061035,"thumbnail":null,"video_id":33},{"id":4660,"transcription_id":23,"segment":" I can\'t.","temperature":null,"time_start":455.3399963379,"time_end":456.5199890137,"thumbnail":null,"video_id":33},{"id":4661,"transcription_id":23,"segment":" I can\'t.","temperature":null,"time_start":456.5199890137,"time_end":458.2399902344,"thumbnail":null,"video_id":33},{"id":4662,"transcription_id":23,"segment":" Check out it.","temperature":null,"time_start":458.2399902344,"time_end":459.1400146484,"thumbnail":null,"video_id":33},{"id":4663,"transcription_id":23,"segment":" Oh, where we\'re going again.","temperature":null,"time_start":459.6000061035,"time_end":462.9800109863,"thumbnail":null,"video_id":33},{"id":4664,"transcription_id":23,"segment":" It\'s over.","temperature":null,"time_start":464.0799865723,"time_end":465.2200012207,"thumbnail":null,"video_id":33},{"id":4665,"transcription_id":23,"segment":" It\'s over.","temperature":null,"time_start":465.4800109863,"time_end":465.5799865723,"thumbnail":null,"video_id":33},{"id":4666,"transcription_id":23,"segment":" I can\'t.","temperature":null,"time_start":465.799987793,"time_end":466.3399963379,"thumbnail":null,"video_id":33},{"id":4667,"transcription_id":23,"segment":"","temperature":null,"time_start":466.3399963379,"time_end":466.3399963379,"thumbnail":null,"video_id":33},{"id":4668,"transcription_id":23,"segment":"","temperature":null,"time_start":466.3399963379,"time_end":466.3399963379,"thumbnail":null,"video_id":33},{"id":4799,"transcription_id":29,"segment":" Carbidstruck","temperature":null,"time_start":7.0199999809,"time_end":8.220000267,"thumbnail":null,"video_id":42},{"id":4800,"transcription_id":29,"segment":" Here comes the BMW driving by","temperature":null,"time_start":8.220000267,"time_end":11.1999998093,"thumbnail":null,"video_id":42},{"id":4801,"transcription_id":29,"segment":" That one I don\'t know","temperature":null,"time_start":11.1999998093,"time_end":16.7600002289,"thumbnail":null,"video_id":42},{"id":4802,"transcription_id":29,"segment":" A Dodge","temperature":null,"time_start":26.8600006104,"time_end":28.2399997711,"thumbnail":null,"video_id":42},{"id":4803,"transcription_id":29,"segment":" Another Toyota","temperature":null,"time_start":28.2399997711,"time_end":31.7800006866,"thumbnail":null,"video_id":42},{"id":4804,"transcription_id":29,"segment":" Another Toyota across the street","temperature":null,"time_start":31.7800006866,"time_end":40.8199996948,"thumbnail":null,"video_id":42},{"id":4805,"transcription_id":29,"segment":" There\'s a Subaru","temperature":null,"time_start":40.8199996948,"time_end":43.7400016785,"thumbnail":null,"video_id":42},{"id":4806,"transcription_id":29,"segment":" First a sweet Nissan Altira","temperature":null,"time_start":53.4000015259,"time_end":55.9199981689,"thumbnail":null,"video_id":42},{"id":4807,"transcription_id":29,"segment":" Pre used with the damaged backside","temperature":null,"time_start":55.9199981689,"time_end":59.7400016785,"thumbnail":null,"video_id":42},{"id":4808,"transcription_id":29,"segment":" A Audi","temperature":null,"time_start":63.4399986267,"time_end":66.3600006104,"thumbnail":null,"video_id":42},{"id":4809,"transcription_id":29,"segment":" Here\'s another Toyota","temperature":null,"time_start":66.3600006104,"time_end":79.6200027466,"thumbnail":null,"video_id":42},{"id":4810,"transcription_id":29,"segment":" Another Nissan Centra","temperature":null,"time_start":79.6200027466,"time_end":88.2200012207,"thumbnail":null,"video_id":42},{"id":4811,"transcription_id":29,"segment":" The Mazda","temperature":null,"time_start":91.7399978638,"time_end":94.7600021362,"thumbnail":null,"video_id":42},{"id":4812,"transcription_id":29,"segment":" Upcoming Hyundai Ionic","temperature":null,"time_start":94.7600021362,"time_end":103.5800018311,"thumbnail":null,"video_id":42},{"id":4813,"transcription_id":29,"segment":" In front of the Ionic there\'s a Volvo S60","temperature":null,"time_start":103.5800018311,"time_end":111.8000030518,"thumbnail":null,"video_id":42},{"id":4814,"transcription_id":29,"segment":" A Ford of that","temperature":null,"time_start":113.5999984741,"time_end":114.5599975586,"thumbnail":null,"video_id":42},{"id":4815,"transcription_id":29,"segment":" A more as mini","temperature":null,"time_start":114.5599975586,"time_end":117.0400009155,"thumbnail":null,"video_id":42},{"id":4816,"transcription_id":29,"segment":" A Toyota Camry","temperature":null,"time_start":117.0400009155,"time_end":121.4199981689,"thumbnail":null,"video_id":42},{"id":4817,"transcription_id":29,"segment":" A car I do not know","temperature":null,"time_start":121.4199981689,"time_end":127.6200027466,"thumbnail":null,"video_id":42},{"id":4818,"transcription_id":29,"segment":" Waiting in front of the traffic light","temperature":null,"time_start":127.6200027466,"time_end":132.5800018311,"thumbnail":null,"video_id":42},{"id":4819,"transcription_id":29,"segment":" Looking at the back of a Honda","temperature":null,"time_start":132.5800018311,"time_end":136.4799957275,"thumbnail":null,"video_id":42},{"id":4820,"transcription_id":29,"segment":" Crossing the zebra crossing now","temperature":null,"time_start":137.3200073242,"time_end":140.5200042725,"thumbnail":null,"video_id":42},{"id":4821,"transcription_id":29,"segment":" A Ford","temperature":null,"time_start":162.0399932861,"time_end":165.6799926758,"thumbnail":null,"video_id":42},{"id":4822,"transcription_id":29,"segment":" The Honda driving in","temperature":null,"time_start":165.6799926758,"time_end":169.5599975586,"thumbnail":null,"video_id":42},{"id":4823,"transcription_id":29,"segment":" A Subaru Forester","temperature":null,"time_start":169.5599975586,"time_end":188.1600036621,"thumbnail":null,"video_id":42},{"id":4824,"transcription_id":29,"segment":" That\'s it","temperature":null,"time_start":188.1600036621,"time_end":193.0399932861,"thumbnail":null,"video_id":42}]') - self.word_segment = pandas.read_json('[{"id":44092,"transcription_id":21,"word":"heres","probability":0.7884091139,"time_start":9.3800001144,"time_end":10.0600004196,"thumbnail":null},{"id":44093,"transcription_id":21,"word":"a","probability":0.9709889889,"time_start":10.0600004196,"time_end":10.1400003433,"thumbnail":null},{"id":44094,"transcription_id":21,"word":"car","probability":0.9919781685,"time_start":10.1400003433,"time_end":10.4799995422,"thumbnail":null},{"id":44095,"transcription_id":21,"word":"heres","probability":0.6766076684,"time_start":11.0200004578,"time_end":11.9600000381,"thumbnail":null},{"id":44096,"transcription_id":21,"word":"a","probability":0.3498734534,"time_start":11.9600000381,"time_end":12.0399999619,"thumbnail":null},{"id":44097,"transcription_id":21,"word":"parking","probability":0.9969442487,"time_start":12.0399999619,"time_end":12.3800001144,"thumbnail":null},{"id":44098,"transcription_id":21,"word":"lot","probability":0.9052708149,"time_start":12.3800001144,"time_end":12.6000003815,"thumbnail":null},{"id":44099,"transcription_id":21,"word":"with","probability":0.9765898585,"time_start":12.6000003815,"time_end":12.7600002289,"thumbnail":null},{"id":44100,"transcription_id":21,"word":"lots","probability":0.9905471206,"time_start":12.7600002289,"time_end":12.9200000763,"thumbnail":null},{"id":44101,"transcription_id":21,"word":"of","probability":0.9971745014,"time_start":12.9200000763,"time_end":13.1400003433,"thumbnail":null},{"id":44102,"transcription_id":21,"word":"cars","probability":0.9820548892,"time_start":13.1400003433,"time_end":13.4399995804,"thumbnail":null},{"id":44103,"transcription_id":21,"word":"on","probability":0.9902862906,"time_start":13.4399995804,"time_end":13.6599998474,"thumbnail":null},{"id":44104,"transcription_id":21,"word":"it","probability":0.9984556437,"time_start":13.6599998474,"time_end":13.8599996567,"thumbnail":null},{"id":44105,"transcription_id":21,"word":"im","probability":0.849326849,"time_start":14.6800003052,"time_end":15.1599998474,"thumbnail":null},{"id":44106,"transcription_id":21,"word":"walking","probability":0.9510896802,"time_start":15.1599998474,"time_end":15.4600000381,"thumbnail":null},{"id":44107,"transcription_id":21,"word":"here","probability":0.9524177313,"time_start":15.9799995422,"time_end":17.5,"thumbnail":null},{"id":44108,"transcription_id":21,"word":"are","probability":0.9079439044,"time_start":17.5,"time_end":17.6000003815,"thumbnail":null},{"id":44109,"transcription_id":21,"word":"more","probability":0.9699289203,"time_start":17.6000003815,"time_end":17.7800006866,"thumbnail":null},{"id":44110,"transcription_id":21,"word":"parking","probability":0.9934900999,"time_start":17.7800006866,"time_end":18.3199996948,"thumbnail":null},{"id":44111,"transcription_id":21,"word":"spaces","probability":0.9960513711,"time_start":18.3199996948,"time_end":18.9200000763,"thumbnail":null},{"id":44112,"transcription_id":21,"word":"more","probability":0.1253720522,"time_start":19.9799995422,"time_end":20.1800003052,"thumbnail":null},{"id":44113,"transcription_id":21,"word":"cars","probability":0.9684823751,"time_start":20.1800003052,"time_end":20.7199993134,"thumbnail":null},{"id":44114,"transcription_id":21,"word":"on","probability":0.9772063494,"time_start":20.7199993134,"time_end":20.9599990845,"thumbnail":null},{"id":44115,"transcription_id":21,"word":"it","probability":0.9931955338,"time_start":20.9599990845,"time_end":21.1200008392,"thumbnail":null},{"id":44116,"transcription_id":21,"word":"heres","probability":0.9206299782,"time_start":23.3600006104,"time_end":23.9200000763,"thumbnail":null},{"id":44117,"transcription_id":21,"word":"a","probability":0.9480460286,"time_start":23.9200000763,"time_end":24.0,"thumbnail":null},{"id":44118,"transcription_id":21,"word":"prius","probability":0.8827661276,"time_start":24.0,"time_end":24.4799995422,"thumbnail":null},{"id":44119,"transcription_id":21,"word":"heres","probability":0.9275217056,"time_start":25.9799995422,"time_end":26.2600002289,"thumbnail":null},{"id":44120,"transcription_id":21,"word":"a","probability":0.9709059596,"time_start":26.2600002289,"time_end":26.3400001526,"thumbnail":null},{"id":44121,"transcription_id":21,"word":"camry","probability":0.7508500218,"time_start":26.3400001526,"time_end":26.7399997711,"thumbnail":null},{"id":44122,"transcription_id":21,"word":"heres","probability":0.2868697345,"time_start":29.5799999237,"time_end":30.3400001526,"thumbnail":null},{"id":44123,"transcription_id":21,"word":"a","probability":0.3064138591,"time_start":30.3400001526,"time_end":30.4400005341,"thumbnail":null},{"id":44124,"transcription_id":21,"word":"chevrolet","probability":0.944000423,"time_start":30.4400005341,"time_end":31.1200008392,"thumbnail":null},{"id":44125,"transcription_id":21,"word":"keep","probability":0.7817819118,"time_start":31.5,"time_end":34.4199981689,"thumbnail":null},{"id":44126,"transcription_id":21,"word":"on","probability":0.9855389595,"time_start":34.4199981689,"time_end":34.5999984741,"thumbnail":null},{"id":44127,"transcription_id":21,"word":"going","probability":0.7324450612,"time_start":34.5999984741,"time_end":34.9599990845,"thumbnail":null},{"id":44128,"transcription_id":21,"word":"heres","probability":0.5682667494,"time_start":35.9799995422,"time_end":36.7400016785,"thumbnail":null},{"id":44129,"transcription_id":21,"word":"a","probability":0.9492810965,"time_start":36.7400016785,"time_end":36.7999992371,"thumbnail":null},{"id":44130,"transcription_id":21,"word":"car","probability":0.9966065884,"time_start":36.7999992371,"time_end":37.0600013733,"thumbnail":null},{"id":44131,"transcription_id":21,"word":"coming","probability":0.9840443134,"time_start":37.0600013733,"time_end":37.4199981689,"thumbnail":null},{"id":44132,"transcription_id":21,"word":"towards","probability":0.9753794074,"time_start":37.4199981689,"time_end":37.7999992371,"thumbnail":null},{"id":44133,"transcription_id":21,"word":"us","probability":0.9988843799,"time_start":37.7999992371,"time_end":38.2999992371,"thumbnail":null},{"id":44134,"transcription_id":21,"word":"heres","probability":0.848793447,"time_start":38.4199981689,"time_end":38.6199989319,"thumbnail":null},{"id":44135,"transcription_id":21,"word":"an","probability":0.9874777794,"time_start":38.6199989319,"time_end":38.7400016785,"thumbnail":null},{"id":44136,"transcription_id":21,"word":"acura","probability":0.5505670905,"time_start":38.7400016785,"time_end":39.2200012207,"thumbnail":null},{"id":44137,"transcription_id":21,"word":"toyota","probability":0.9977245927,"time_start":39.2200012207,"time_end":40.6199989319,"thumbnail":null},{"id":44138,"transcription_id":21,"word":"bmw","probability":0.9427520633,"time_start":40.6199989319,"time_end":42.4000015259,"thumbnail":null},{"id":44139,"transcription_id":21,"word":"somebodys","probability":0.8075475097,"time_start":45.1399993896,"time_end":51.5400009155,"thumbnail":null},{"id":44140,"transcription_id":21,"word":"walking","probability":0.8917831182,"time_start":51.5400009155,"time_end":51.8400001526,"thumbnail":null},{"id":44141,"transcription_id":21,"word":"in","probability":0.9399558902,"time_start":51.8400001526,"time_end":52.0,"thumbnail":null},{"id":44142,"transcription_id":21,"word":"my","probability":0.9977359772,"time_start":52.0,"time_end":52.1399993896,"thumbnail":null},{"id":44143,"transcription_id":21,"word":"direction","probability":0.9992448092,"time_start":52.1399993896,"time_end":52.5999984741,"thumbnail":null},{"id":44144,"transcription_id":21,"word":"now","probability":0.9502468109,"time_start":52.5999984741,"time_end":52.9599990845,"thumbnail":null},{"id":44145,"transcription_id":21,"word":"come","probability":0.0830525383,"time_start":53.4399986267,"time_end":54.0999984741,"thumbnail":null},{"id":44146,"transcription_id":21,"word":"behind","probability":0.9686512351,"time_start":54.0999984741,"time_end":54.4399986267,"thumbnail":null},{"id":44147,"transcription_id":21,"word":"the","probability":0.9814116359,"time_start":54.4399986267,"time_end":54.6599998474,"thumbnail":null},{"id":44148,"transcription_id":21,"word":"tree","probability":0.9686539173,"time_start":54.6599998474,"time_end":54.9000015259,"thumbnail":null},{"id":44149,"transcription_id":21,"word":"there","probability":0.9309554696,"time_start":55.2000007629,"time_end":55.3400001526,"thumbnail":null},{"id":44150,"transcription_id":21,"word":"he","probability":0.7661179304,"time_start":55.3400001526,"time_end":55.5,"thumbnail":null},{"id":44151,"transcription_id":21,"word":"is","probability":0.9968996048,"time_start":55.5,"time_end":55.7599983215,"thumbnail":null},{"id":44152,"transcription_id":21,"word":"hes","probability":0.5373111963,"time_start":56.0200004578,"time_end":56.7400016785,"thumbnail":null},{"id":44153,"transcription_id":21,"word":"a","probability":0.8787920475,"time_start":56.7400016785,"time_end":56.8199996948,"thumbnail":null},{"id":44154,"transcription_id":21,"word":"person","probability":0.9560839534,"time_start":56.8199996948,"time_end":57.1800003052,"thumbnail":null},{"id":44155,"transcription_id":21,"word":"and","probability":0.5332089663,"time_start":57.1800003052,"time_end":57.3800010681,"thumbnail":null},{"id":44156,"transcription_id":21,"word":"then","probability":0.743264854,"time_start":57.3800010681,"time_end":57.5,"thumbnail":null},{"id":44157,"transcription_id":21,"word":"walking","probability":0.9617287517,"time_start":57.5,"time_end":57.9399986267,"thumbnail":null},{"id":44158,"transcription_id":21,"word":"there","probability":0.7299346328,"time_start":59.2799987793,"time_end":60.2000007629,"thumbnail":null},{"id":44159,"transcription_id":21,"word":"are","probability":0.9731420279,"time_start":60.2000007629,"time_end":60.3199996948,"thumbnail":null},{"id":44160,"transcription_id":21,"word":"more","probability":0.6198428869,"time_start":60.3199996948,"time_end":60.4799995422,"thumbnail":null},{"id":44161,"transcription_id":21,"word":"people","probability":0.9937227368,"time_start":60.4799995422,"time_end":60.9399986267,"thumbnail":null},{"id":44162,"transcription_id":21,"word":"walking","probability":0.5416260362,"time_start":60.9399986267,"time_end":61.3400001526,"thumbnail":null},{"id":44163,"transcription_id":21,"word":"in","probability":0.9552502036,"time_start":61.3400001526,"time_end":61.5200004578,"thumbnail":null},{"id":44164,"transcription_id":21,"word":"the","probability":0.949999094,"time_start":61.5200004578,"time_end":61.5800018311,"thumbnail":null},{"id":44165,"transcription_id":21,"word":"distance","probability":0.9994564652,"time_start":61.5800018311,"time_end":62.0400009155,"thumbnail":null},{"id":44166,"transcription_id":21,"word":"going","probability":0.9497651458,"time_start":63.4599990845,"time_end":65.0400009155,"thumbnail":null},{"id":44167,"transcription_id":21,"word":"to","probability":0.9978743792,"time_start":65.0400009155,"time_end":65.1800003052,"thumbnail":null},{"id":44168,"transcription_id":21,"word":"walk","probability":0.9832350016,"time_start":65.1800003052,"time_end":65.4000015259,"thumbnail":null},{"id":44169,"transcription_id":21,"word":"up","probability":0.9842301011,"time_start":65.4000015259,"time_end":65.6399993896,"thumbnail":null},{"id":44170,"transcription_id":21,"word":"the","probability":0.9737687707,"time_start":65.6399993896,"time_end":65.8399963379,"thumbnail":null},{"id":44171,"transcription_id":21,"word":"slope","probability":0.9893576503,"time_start":65.8399963379,"time_end":66.5199966431,"thumbnail":null},{"id":44172,"transcription_id":21,"word":"towards","probability":0.9132679105,"time_start":66.5199966431,"time_end":66.9599990845,"thumbnail":null},{"id":44173,"transcription_id":21,"word":"the","probability":0.9326177835,"time_start":66.9599990845,"time_end":67.2600021362,"thumbnail":null},{"id":44174,"transcription_id":21,"word":"sports","probability":0.8790309429,"time_start":67.2600021362,"time_end":67.5800018311,"thumbnail":null},{"id":44175,"transcription_id":21,"word":"field","probability":0.8344593644,"time_start":67.5800018311,"time_end":67.8600006104,"thumbnail":null},{"id":44176,"transcription_id":21,"word":"of","probability":0.9881145954,"time_start":67.8600006104,"time_end":68.1200027466,"thumbnail":null},{"id":44177,"transcription_id":21,"word":"jones","probability":0.4210872054,"time_start":68.1200027466,"time_end":68.2799987793,"thumbnail":null},{"id":44178,"transcription_id":21,"word":"hopkins","probability":0.9391921759,"time_start":68.2799987793,"time_end":68.7200012207,"thumbnail":null},{"id":44179,"transcription_id":21,"word":"heres","probability":0.706342876,"time_start":69.4400024414,"time_end":70.6999969482,"thumbnail":null},{"id":44180,"transcription_id":21,"word":"some","probability":0.9960215688,"time_start":70.6999969482,"time_end":70.8399963379,"thumbnail":null},{"id":44181,"transcription_id":21,"word":"sporting","probability":0.9782602191,"time_start":70.8399963379,"time_end":71.2600021362,"thumbnail":null},{"id":44182,"transcription_id":21,"word":"equipment","probability":0.9989209175,"time_start":71.2600021362,"time_end":71.8199996948,"thumbnail":null},{"id":44183,"transcription_id":21,"word":"rotc","probability":0.775300622,"time_start":73.1399993896,"time_end":74.7600021362,"thumbnail":null},{"id":44184,"transcription_id":21,"word":"climbing","probability":0.2109429985,"time_start":74.7600021362,"time_end":76.2200012207,"thumbnail":null},{"id":44185,"transcription_id":21,"word":"hall","probability":0.3991182148,"time_start":76.2200012207,"time_end":76.8199996948,"thumbnail":null},{"id":44186,"transcription_id":21,"word":"the","probability":0.1847935468,"time_start":79.0400009155,"time_end":79.8399963379,"thumbnail":null},{"id":44187,"transcription_id":21,"word":"scoreboard","probability":0.4914544225,"time_start":79.8399963379,"time_end":80.3799972534,"thumbnail":null},{"id":44188,"transcription_id":21,"word":"of","probability":0.8851847053,"time_start":80.3799972534,"time_end":80.7600021362,"thumbnail":null},{"id":44189,"transcription_id":21,"word":"the","probability":0.9884479642,"time_start":80.7600021362,"time_end":80.8799972534,"thumbnail":null},{"id":44190,"transcription_id":21,"word":"home","probability":0.6458619237,"time_start":80.8799972534,"time_end":81.0400009155,"thumbnail":null},{"id":44191,"transcription_id":21,"word":"wood","probability":0.2280238122,"time_start":81.0400009155,"time_end":81.2200012207,"thumbnail":null},{"id":44192,"transcription_id":21,"word":"field","probability":0.6416249275,"time_start":81.2200012207,"time_end":81.6600036621,"thumbnail":null},{"id":44193,"transcription_id":21,"word":"the","probability":0.9325071573,"time_start":82.0199966431,"time_end":83.4000015259,"thumbnail":null},{"id":44194,"transcription_id":21,"word":"distance","probability":0.987415731,"time_start":83.4000015259,"time_end":83.7200012207,"thumbnail":null},{"id":44195,"transcription_id":21,"word":"is","probability":0.5479132533,"time_start":83.7200012207,"time_end":84.0,"thumbnail":null},{"id":44196,"transcription_id":21,"word":"the","probability":0.9534766078,"time_start":84.0,"time_end":84.1999969482,"thumbnail":null},{"id":44197,"transcription_id":21,"word":"hotel","probability":0.9894852042,"time_start":84.1999969482,"time_end":84.6200027466,"thumbnail":null},{"id":44198,"transcription_id":21,"word":"the","probability":0.8544437289,"time_start":85.5599975586,"time_end":85.6800003052,"thumbnail":null},{"id":44199,"transcription_id":21,"word":"colon","probability":0.3718812764,"time_start":85.6800003052,"time_end":85.9199981689,"thumbnail":null},{"id":44200,"transcription_id":21,"word":"aid","probability":0.4155239761,"time_start":85.9199981689,"time_end":86.2399978638,"thumbnail":null},{"id":44201,"transcription_id":21,"word":"heres","probability":0.8644490242,"time_start":86.7200012207,"time_end":87.4800033569,"thumbnail":null},{"id":44202,"transcription_id":21,"word":"a","probability":0.3564882576,"time_start":87.4800033569,"time_end":87.5599975586,"thumbnail":null},{"id":44203,"transcription_id":21,"word":"sport","probability":0.5254337788,"time_start":87.5599975586,"time_end":87.8600006104,"thumbnail":null},{"id":44204,"transcription_id":21,"word":"field","probability":0.9857190251,"time_start":87.8600006104,"time_end":88.3199996948,"thumbnail":null},{"id":44205,"transcription_id":21,"word":"coming","probability":0.8726180196,"time_start":88.3199996948,"time_end":88.8000030518,"thumbnail":null},{"id":44206,"transcription_id":21,"word":"up","probability":0.9949365854,"time_start":88.8000030518,"time_end":89.0800018311,"thumbnail":null},{"id":44207,"transcription_id":21,"word":"across","probability":0.8055056334,"time_start":89.0800018311,"time_end":91.2799987793,"thumbnail":null},{"id":44208,"transcription_id":21,"word":"another","probability":0.8556680679,"time_start":91.2799987793,"time_end":91.7200012207,"thumbnail":null},{"id":44209,"transcription_id":21,"word":"sports","probability":0.2249169648,"time_start":91.7200012207,"time_end":92.3199996948,"thumbnail":null},{"id":44210,"transcription_id":21,"word":"theres","probability":0.3958275616,"time_start":99.7600021362,"time_end":100.2399978638,"thumbnail":null},{"id":44211,"transcription_id":21,"word":"some","probability":0.9285874963,"time_start":100.2399978638,"time_end":100.3799972534,"thumbnail":null},{"id":44212,"transcription_id":21,"word":"of","probability":0.4179817736,"time_start":100.3799972534,"time_end":100.5,"thumbnail":null},{"id":44213,"transcription_id":21,"word":"the","probability":0.8034539223,"time_start":100.5,"time_end":100.5199966431,"thumbnail":null},{"id":44214,"transcription_id":21,"word":"cross","probability":0.9442694187,"time_start":100.5199966431,"time_end":100.8000030518,"thumbnail":null},{"id":44215,"transcription_id":21,"word":"goals","probability":0.432275027,"time_start":100.8000030518,"time_end":101.1399993896,"thumbnail":null},{"id":44216,"transcription_id":21,"word":"coming","probability":0.9739020467,"time_start":101.1399993896,"time_end":101.4400024414,"thumbnail":null},{"id":44217,"transcription_id":21,"word":"up","probability":0.9800617099,"time_start":101.4400024414,"time_end":101.6600036621,"thumbnail":null},{"id":44218,"transcription_id":21,"word":"there","probability":0.9900610447,"time_start":101.6600036621,"time_end":101.9000015259,"thumbnail":null},{"id":44219,"transcription_id":21,"word":"this","probability":0.9618829489,"time_start":103.4599990845,"time_end":106.8000030518,"thumbnail":null},{"id":44220,"transcription_id":21,"word":"is","probability":0.9976199269,"time_start":106.8000030518,"time_end":106.9199981689,"thumbnail":null},{"id":44221,"transcription_id":21,"word":"the","probability":0.9356960058,"time_start":106.9199981689,"time_end":107.0800018311,"thumbnail":null},{"id":44222,"transcription_id":21,"word":"sports","probability":0.8634780645,"time_start":107.0800018311,"time_end":107.3799972534,"thumbnail":null},{"id":44223,"transcription_id":21,"word":"field","probability":0.9040809274,"time_start":107.3799972534,"time_end":107.6200027466,"thumbnail":null},{"id":44224,"transcription_id":21,"word":"of","probability":0.1807312518,"time_start":107.6200027466,"time_end":107.8000030518,"thumbnail":null},{"id":44225,"transcription_id":21,"word":"the","probability":0.9312338829,"time_start":107.8000030518,"time_end":107.9599990845,"thumbnail":null},{"id":44226,"transcription_id":21,"word":"whole","probability":0.8245623112,"time_start":107.9599990845,"time_end":108.1999969482,"thumbnail":null},{"id":44227,"transcription_id":21,"word":"the","probability":0.1569173932,"time_start":108.1999969482,"time_end":109.2600021362,"thumbnail":null},{"id":44228,"transcription_id":21,"word":"stands","probability":0.4797637165,"time_start":109.2600021362,"time_end":109.6800003052,"thumbnail":null},{"id":44229,"transcription_id":21,"word":"historical","probability":0.9408684373,"time_start":110.4599990845,"time_end":111.5599975586,"thumbnail":null},{"id":44230,"transcription_id":21,"word":"plates","probability":0.6171328425,"time_start":111.5599975586,"time_end":113.2799987793,"thumbnail":null},{"id":44231,"transcription_id":21,"word":"theres","probability":0.5656242371,"time_start":117.6399993896,"time_end":126.7399978638,"thumbnail":null},{"id":44232,"transcription_id":21,"word":"a","probability":0.9284085035,"time_start":126.7399978638,"time_end":126.8199996948,"thumbnail":null},{"id":44233,"transcription_id":21,"word":"church","probability":0.8785464764,"time_start":126.8199996948,"time_end":127.2399978638,"thumbnail":null},{"id":44234,"transcription_id":21,"word":"of","probability":0.9700716138,"time_start":127.2399978638,"time_end":127.7200012207,"thumbnail":null},{"id":44235,"transcription_id":21,"word":"christs","probability":0.9198122025,"time_start":127.7200012207,"time_end":128.4400024414,"thumbnail":null},{"id":44236,"transcription_id":21,"word":"scientist","probability":0.2967300713,"time_start":128.4400024414,"time_end":128.8800048828,"thumbnail":null},{"id":44237,"transcription_id":21,"word":"theres","probability":0.3068035543,"time_start":129.5599975586,"time_end":130.8600006104,"thumbnail":null},{"id":44238,"transcription_id":21,"word":"the","probability":0.9574961066,"time_start":130.8600006104,"time_end":131.0200042725,"thumbnail":null},{"id":44239,"transcription_id":21,"word":"imagine","probability":0.1560687423,"time_start":131.0200042725,"time_end":131.3399963379,"thumbnail":null},{"id":44240,"transcription_id":21,"word":"center","probability":0.5744033456,"time_start":131.3399963379,"time_end":131.9799957275,"thumbnail":null},{"id":44241,"transcription_id":21,"word":"of","probability":0.9618915319,"time_start":131.9799957275,"time_end":132.5,"thumbnail":null},{"id":44242,"transcription_id":21,"word":"the","probability":0.9793180227,"time_start":132.5,"time_end":132.6799926758,"thumbnail":null},{"id":44243,"transcription_id":21,"word":"university","probability":0.6930968761,"time_start":132.6799926758,"time_end":133.4600067139,"thumbnail":null},{"id":44244,"transcription_id":21,"word":"more","probability":0.9646613002,"time_start":134.0,"time_end":136.8999938965,"thumbnail":null},{"id":44245,"transcription_id":21,"word":"cars","probability":0.9847967625,"time_start":136.8999938965,"time_end":137.3000030518,"thumbnail":null},{"id":44246,"transcription_id":21,"word":"driving","probability":0.2981333733,"time_start":137.3000030518,"time_end":138.1000061035,"thumbnail":null},{"id":44247,"transcription_id":21,"word":"by","probability":0.9191663265,"time_start":138.1000061035,"time_end":138.7799987793,"thumbnail":null},{"id":44248,"transcription_id":21,"word":"the","probability":0.1296189725,"time_start":138.7799987793,"time_end":138.8600006104,"thumbnail":null},{"id":44249,"transcription_id":21,"word":"west","probability":0.3082456291,"time_start":138.8600006104,"time_end":140.3600006104,"thumbnail":null},{"id":44250,"transcription_id":21,"word":"university","probability":0.9863712192,"time_start":140.3600006104,"time_end":140.9799957275,"thumbnail":null},{"id":44251,"transcription_id":21,"word":"parkway","probability":0.9430019855,"time_start":140.9799957275,"time_end":141.6399993896,"thumbnail":null},{"id":44252,"transcription_id":21,"word":"light","probability":0.8874183893,"time_start":142.2400054932,"time_end":147.0800018311,"thumbnail":null},{"id":44253,"transcription_id":21,"word":"bulbs","probability":0.5215087533,"time_start":147.0800018311,"time_end":147.5399932861,"thumbnail":null},{"id":44254,"transcription_id":21,"word":"light","probability":0.9642794132,"time_start":148.2599945068,"time_end":149.7200012207,"thumbnail":null},{"id":44255,"transcription_id":21,"word":"bulbs","probability":0.130600363,"time_start":149.7200012207,"time_end":150.1199951172,"thumbnail":null},{"id":44256,"transcription_id":21,"word":"some","probability":0.9476944208,"time_start":150.8600006104,"time_end":152.8399963379,"thumbnail":null},{"id":44257,"transcription_id":21,"word":"ballards","probability":0.7413304448,"time_start":152.8399963379,"time_end":153.3399963379,"thumbnail":null},{"id":44258,"transcription_id":21,"word":"the","probability":0.0404568017,"time_start":156.2799987793,"time_end":157.7599945068,"thumbnail":null},{"id":44259,"transcription_id":21,"word":"stop","probability":0.8167712092,"time_start":157.7599945068,"time_end":158.8999938965,"thumbnail":null},{"id":44260,"transcription_id":21,"word":"sign","probability":0.980766058,"time_start":158.8999938965,"time_end":159.2400054932,"thumbnail":null},{"id":44261,"transcription_id":21,"word":"coming","probability":0.8520003557,"time_start":159.2400054932,"time_end":159.6000061035,"thumbnail":null},{"id":44262,"transcription_id":21,"word":"up","probability":0.996602416,"time_start":159.6000061035,"time_end":159.8200073242,"thumbnail":null},{"id":44263,"transcription_id":21,"word":"zip","probability":0.7918286324,"time_start":162.1799926758,"time_end":164.3200073242,"thumbnail":null},{"id":44264,"transcription_id":21,"word":"car","probability":0.5716818571,"time_start":164.3200073242,"time_end":164.5800018311,"thumbnail":null},{"id":44265,"transcription_id":21,"word":"parking","probability":0.9657856822,"time_start":164.5800018311,"time_end":165.3200073242,"thumbnail":null},{"id":44266,"transcription_id":21,"word":"lots","probability":0.8268131614,"time_start":165.3200073242,"time_end":165.6999969482,"thumbnail":null},{"id":44371,"transcription_id":23,"word":"okay","probability":0.4056580961,"time_start":2.0199999809,"time_end":2.8800001144,"thumbnail":null},{"id":44372,"transcription_id":23,"word":"is","probability":0.3317222595,"time_start":3.3199999332,"time_end":3.7400000095,"thumbnail":null},{"id":44373,"transcription_id":23,"word":"the","probability":0.3612309694,"time_start":3.7400000095,"time_end":3.8599998951,"thumbnail":null},{"id":44374,"transcription_id":23,"word":"person","probability":0.9949281216,"time_start":3.8599998951,"time_end":4.0999999046,"thumbnail":null},{"id":44375,"transcription_id":23,"word":"in","probability":0.9878126979,"time_start":4.0999999046,"time_end":4.2800002098,"thumbnail":null},{"id":44376,"transcription_id":23,"word":"the","probability":0.9751071334,"time_start":4.2800002098,"time_end":4.3800001144,"thumbnail":null},{"id":44377,"transcription_id":23,"word":"crosswalk","probability":0.9786487222,"time_start":4.3800001144,"time_end":4.9000000954,"thumbnail":null},{"id":44378,"transcription_id":23,"word":"all","probability":0.3710410595,"time_start":5.1799998283,"time_end":5.5199999809,"thumbnail":null},{"id":44379,"transcription_id":23,"word":"right","probability":0.9925506115,"time_start":5.5199999809,"time_end":9.1999998093,"thumbnail":null},{"id":44380,"transcription_id":23,"word":"lady","probability":0.7896086574,"time_start":9.8999996185,"time_end":12.720000267,"thumbnail":null},{"id":44381,"transcription_id":23,"word":"with","probability":0.9561152458,"time_start":12.720000267,"time_end":12.9600000381,"thumbnail":null},{"id":44382,"transcription_id":23,"word":"the","probability":0.6836673617,"time_start":12.9600000381,"time_end":13.1000003815,"thumbnail":null},{"id":44383,"transcription_id":23,"word":"backpack","probability":0.8270484209,"time_start":13.1000003815,"time_end":13.5399999619,"thumbnail":null},{"id":44384,"transcription_id":23,"word":"right","probability":0.7506697774,"time_start":13.5399999619,"time_end":13.9200000763,"thumbnail":null},{"id":44385,"transcription_id":23,"word":"over","probability":0.9954915643,"time_start":13.9200000763,"time_end":14.1800003052,"thumbnail":null},{"id":44386,"transcription_id":23,"word":"here","probability":0.9912697077,"time_start":14.1800003052,"time_end":14.6000003815,"thumbnail":null},{"id":44387,"transcription_id":23,"word":"okay","probability":0.5109426975,"time_start":15.1000003815,"time_end":18.8199996948,"thumbnail":null},{"id":44388,"transcription_id":23,"word":"following","probability":0.9745128751,"time_start":20.8799991608,"time_end":22.8199996948,"thumbnail":null},{"id":44389,"transcription_id":23,"word":"a","probability":0.9876791835,"time_start":22.8199996948,"time_end":23.2000007629,"thumbnail":null},{"id":44390,"transcription_id":23,"word":"four","probability":0.3416860998,"time_start":23.2000007629,"time_end":23.5400009155,"thumbnail":null},{"id":44391,"transcription_id":23,"word":"runner","probability":0.6863316298,"time_start":23.5400009155,"time_end":24.0,"thumbnail":null},{"id":44392,"transcription_id":23,"word":"here","probability":0.9883537292,"time_start":24.7999992371,"time_end":27.1399993896,"thumbnail":null},{"id":44393,"transcription_id":23,"word":"comes","probability":0.8965961337,"time_start":27.1399993896,"time_end":27.3799991608,"thumbnail":null},{"id":44394,"transcription_id":23,"word":"some","probability":0.9940956831,"time_start":27.3799991608,"time_end":27.7199993134,"thumbnail":null},{"id":44395,"transcription_id":23,"word":"pedestrians","probability":0.9302297235,"time_start":27.7199993134,"time_end":28.4200000763,"thumbnail":null},{"id":44396,"transcription_id":23,"word":"people","probability":0.0613324009,"time_start":30.5,"time_end":31.3199996948,"thumbnail":null},{"id":44397,"transcription_id":23,"word":"walking","probability":0.9739778042,"time_start":31.3199996948,"time_end":31.0200004578,"thumbnail":null},{"id":44398,"transcription_id":23,"word":"oh","probability":0.8769543767,"time_start":32.1399993896,"time_end":35.0600013733,"thumbnail":null},{"id":44399,"transcription_id":23,"word":"look","probability":0.7291004062,"time_start":35.0600013733,"time_end":35.3199996948,"thumbnail":null},{"id":44400,"transcription_id":23,"word":"these","probability":0.9896927476,"time_start":35.5200004578,"time_end":35.5999984741,"thumbnail":null},{"id":44401,"transcription_id":23,"word":"people","probability":0.9983791113,"time_start":35.5999984741,"time_end":35.8600006104,"thumbnail":null},{"id":44402,"transcription_id":23,"word":"are","probability":0.9982488155,"time_start":35.8600006104,"time_end":36.0,"thumbnail":null},{"id":44403,"transcription_id":23,"word":"holding","probability":0.9989936948,"time_start":36.0,"time_end":36.2599983215,"thumbnail":null},{"id":44404,"transcription_id":23,"word":"hands","probability":0.9766016603,"time_start":36.2599983215,"time_end":36.8199996948,"thumbnail":null},{"id":44405,"transcription_id":23,"word":"right","probability":0.6917957664,"time_start":37.7999992371,"time_end":38.0600013733,"thumbnail":null},{"id":44406,"transcription_id":23,"word":"there","probability":0.9888400435,"time_start":38.0600013733,"time_end":38.2599983215,"thumbnail":null},{"id":44407,"transcription_id":23,"word":"walking","probability":0.8362520337,"time_start":38.2599983215,"time_end":38.5999984741,"thumbnail":null},{"id":44408,"transcription_id":23,"word":"together","probability":0.9986536503,"time_start":38.5999984741,"time_end":39.2400016785,"thumbnail":null},{"id":44409,"transcription_id":23,"word":"here","probability":0.9723941684,"time_start":39.9799995422,"time_end":41.3600006104,"thumbnail":null},{"id":44410,"transcription_id":23,"word":"comes","probability":0.9934592247,"time_start":41.3600006104,"time_end":41.7999992371,"thumbnail":null},{"id":44411,"transcription_id":23,"word":"a","probability":0.6970852613,"time_start":41.7999992371,"time_end":42.3600006104,"thumbnail":null},{"id":44412,"transcription_id":23,"word":"lady","probability":0.9865013957,"time_start":42.3600006104,"time_end":42.9000015259,"thumbnail":null},{"id":44413,"transcription_id":23,"word":"looking","probability":0.981054306,"time_start":42.9000015259,"time_end":43.2799987793,"thumbnail":null},{"id":44414,"transcription_id":23,"word":"in","probability":0.8554593921,"time_start":43.2799987793,"time_end":43.4799995422,"thumbnail":null},{"id":44415,"transcription_id":23,"word":"her","probability":0.9906613231,"time_start":43.4799995422,"time_end":43.5999984741,"thumbnail":null},{"id":44416,"transcription_id":23,"word":"satchel","probability":0.844751358,"time_start":43.5999984741,"time_end":44.3600006104,"thumbnail":null},{"id":44417,"transcription_id":23,"word":"she","probability":0.1529297531,"time_start":44.8400001526,"time_end":45.0999984741,"thumbnail":null},{"id":44418,"transcription_id":23,"word":"wont","probability":0.7977695465,"time_start":45.0999984741,"time_end":45.2999992371,"thumbnail":null},{"id":44419,"transcription_id":23,"word":"cut","probability":0.3068801761,"time_start":45.2999992371,"time_end":45.3800010681,"thumbnail":null},{"id":44420,"transcription_id":23,"word":"me","probability":0.916867733,"time_start":45.3800010681,"time_end":45.5600013733,"thumbnail":null},{"id":44421,"transcription_id":23,"word":"well","probability":0.6127787232,"time_start":45.5600013733,"time_end":45.7799987793,"thumbnail":null},{"id":44422,"transcription_id":23,"word":"all","probability":0.3441607952,"time_start":46.4599990845,"time_end":46.6599998474,"thumbnail":null},{"id":44423,"transcription_id":23,"word":"right","probability":0.9964325428,"time_start":46.6599998474,"time_end":48.5999984741,"thumbnail":null},{"id":44424,"transcription_id":23,"word":"heres","probability":0.5965383649,"time_start":49.7000007629,"time_end":50.9799995422,"thumbnail":null},{"id":44425,"transcription_id":23,"word":"another","probability":0.9984425902,"time_start":50.9799995422,"time_end":51.2200012207,"thumbnail":null},{"id":44426,"transcription_id":23,"word":"person","probability":0.9983495474,"time_start":51.2200012207,"time_end":51.8400001526,"thumbnail":null},{"id":44427,"transcription_id":23,"word":"with","probability":0.9978752136,"time_start":51.8400001526,"time_end":52.1199989319,"thumbnail":null},{"id":44428,"transcription_id":23,"word":"the","probability":0.0865294188,"time_start":52.1199989319,"time_end":52.2799987793,"thumbnail":null},{"id":44429,"transcription_id":23,"word":"backpack","probability":0.9908954501,"time_start":52.2799987793,"time_end":52.8199996948,"thumbnail":null},{"id":44430,"transcription_id":23,"word":"lots","probability":0.4154408872,"time_start":54.9799995422,"time_end":55.7999992371,"thumbnail":null},{"id":44431,"transcription_id":23,"word":"of","probability":0.9966477752,"time_start":55.7999992371,"time_end":56.2400016785,"thumbnail":null},{"id":44432,"transcription_id":23,"word":"trees","probability":0.9975335598,"time_start":56.2400016785,"time_end":56.6199989319,"thumbnail":null},{"id":44433,"transcription_id":23,"word":"in","probability":0.9907258153,"time_start":56.6199989319,"time_end":56.9399986267,"thumbnail":null},{"id":44434,"transcription_id":23,"word":"this","probability":0.9985650182,"time_start":56.9399986267,"time_end":57.2000007629,"thumbnail":null},{"id":44435,"transcription_id":23,"word":"area","probability":0.9980995059,"time_start":57.2000007629,"time_end":58.0999984741,"thumbnail":null},{"id":44436,"transcription_id":23,"word":"theres","probability":0.5994411111,"time_start":58.0999984741,"time_end":61.8800010681,"thumbnail":null},{"id":44437,"transcription_id":23,"word":"a","probability":0.4208608568,"time_start":61.8800010681,"time_end":61.9199981689,"thumbnail":null},{"id":44438,"transcription_id":23,"word":"lamp","probability":0.2282235324,"time_start":61.9199981689,"time_end":62.2400016785,"thumbnail":null},{"id":44439,"transcription_id":23,"word":"post","probability":0.5156273842,"time_start":62.2400016785,"time_end":63.2200012207,"thumbnail":null},{"id":44440,"transcription_id":23,"word":"heres","probability":0.870930016,"time_start":64.3600006104,"time_end":65.3399963379,"thumbnail":null},{"id":44441,"transcription_id":23,"word":"another","probability":0.9942542911,"time_start":65.3399963379,"time_end":65.6200027466,"thumbnail":null},{"id":44442,"transcription_id":23,"word":"pedestrian","probability":0.9962873459,"time_start":65.6200027466,"time_end":66.1800003052,"thumbnail":null},{"id":44443,"transcription_id":23,"word":"wearing","probability":0.9674022198,"time_start":66.1800003052,"time_end":66.5,"thumbnail":null},{"id":44444,"transcription_id":23,"word":"all","probability":0.9721846581,"time_start":66.5,"time_end":66.7200012207,"thumbnail":null},{"id":44445,"transcription_id":23,"word":"black","probability":0.9823947549,"time_start":66.7200012207,"time_end":67.0800018311,"thumbnail":null},{"id":44446,"transcription_id":23,"word":"here","probability":0.3326025903,"time_start":68.0999984741,"time_end":72.3199996948,"thumbnail":null},{"id":44447,"transcription_id":23,"word":"were","probability":0.8962057233,"time_start":72.3199996948,"time_end":72.5400009155,"thumbnail":null},{"id":44448,"transcription_id":23,"word":"coming","probability":0.9881658554,"time_start":72.5400009155,"time_end":72.7600021362,"thumbnail":null},{"id":44449,"transcription_id":23,"word":"up","probability":0.9845167994,"time_start":72.7600021362,"time_end":72.9400024414,"thumbnail":null},{"id":44450,"transcription_id":23,"word":"to","probability":0.9971428514,"time_start":72.9400024414,"time_end":73.1200027466,"thumbnail":null},{"id":44451,"transcription_id":23,"word":"a","probability":0.9931587577,"time_start":73.1200027466,"time_end":73.2399978638,"thumbnail":null},{"id":44452,"transcription_id":23,"word":"traffic","probability":0.9750520587,"time_start":73.2399978638,"time_end":73.7200012207,"thumbnail":null},{"id":44453,"transcription_id":23,"word":"signal","probability":0.996471405,"time_start":73.7200012207,"time_end":74.3600006104,"thumbnail":null},{"id":44454,"transcription_id":23,"word":"turning","probability":0.6578923464,"time_start":75.9800033569,"time_end":77.5199966431,"thumbnail":null},{"id":44455,"transcription_id":23,"word":"left","probability":0.9965083003,"time_start":77.5199966431,"time_end":78.3799972534,"thumbnail":null},{"id":44456,"transcription_id":23,"word":"at","probability":0.9886232615,"time_start":78.3799972534,"time_end":78.5999984741,"thumbnail":null},{"id":44457,"transcription_id":23,"word":"the","probability":0.9935688972,"time_start":78.5999984741,"time_end":78.7200012207,"thumbnail":null},{"id":44458,"transcription_id":23,"word":"traffic","probability":0.9939121008,"time_start":78.7200012207,"time_end":79.0999984741,"thumbnail":null},{"id":44459,"transcription_id":23,"word":"signal","probability":0.9817626476,"time_start":79.0999984741,"time_end":79.7600021362,"thumbnail":null},{"id":44460,"transcription_id":23,"word":"here","probability":0.4281292558,"time_start":82.1200027466,"time_end":83.5999984741,"thumbnail":null},{"id":44461,"transcription_id":23,"word":"we","probability":0.8905873895,"time_start":83.5999984741,"time_end":84.6800003052,"thumbnail":null},{"id":44462,"transcription_id":23,"word":"go","probability":0.9882637262,"time_start":84.6800003052,"time_end":85.0800018311,"thumbnail":null},{"id":44463,"transcription_id":23,"word":"heres","probability":0.7824180126,"time_start":85.3600006104,"time_end":85.5800018311,"thumbnail":null},{"id":44464,"transcription_id":23,"word":"a","probability":0.8848230839,"time_start":85.5800018311,"time_end":85.6800003052,"thumbnail":null},{"id":44465,"transcription_id":23,"word":"bike","probability":0.9644798636,"time_start":85.6800003052,"time_end":85.9000015259,"thumbnail":null},{"id":44466,"transcription_id":23,"word":"sign","probability":0.9909681678,"time_start":85.9000015259,"time_end":86.4800033569,"thumbnail":null},{"id":44467,"transcription_id":23,"word":"and","probability":0.5127914548,"time_start":87.8000030518,"time_end":88.8600006104,"thumbnail":null},{"id":44468,"transcription_id":23,"word":"were","probability":0.9810364246,"time_start":88.8600006104,"time_end":89.6200027466,"thumbnail":null},{"id":44469,"transcription_id":23,"word":"coming","probability":0.8604404926,"time_start":89.6200027466,"time_end":89.8399963379,"thumbnail":null},{"id":44470,"transcription_id":23,"word":"up","probability":0.9900382757,"time_start":89.8399963379,"time_end":90.0999984741,"thumbnail":null},{"id":44471,"transcription_id":23,"word":"to","probability":0.9973783493,"time_start":90.0999984741,"time_end":90.3600006104,"thumbnail":null},{"id":44472,"transcription_id":23,"word":"a","probability":0.9929611087,"time_start":90.3600006104,"time_end":90.5999984741,"thumbnail":null},{"id":44473,"transcription_id":23,"word":"crosswalk","probability":0.9762961268,"time_start":90.5999984741,"time_end":91.3799972534,"thumbnail":null},{"id":44474,"transcription_id":23,"word":"here","probability":0.7692149282,"time_start":91.3799972534,"time_end":92.0999984741,"thumbnail":null},{"id":44475,"transcription_id":23,"word":"all","probability":0.1199808344,"time_start":93.1600036621,"time_end":93.1600036621,"thumbnail":null},{"id":44476,"transcription_id":23,"word":"right","probability":0.9968841672,"time_start":93.1600036621,"time_end":94.4800033569,"thumbnail":null},{"id":44477,"transcription_id":23,"word":"another","probability":0.9652140737,"time_start":95.6200027466,"time_end":97.7799987793,"thumbnail":null},{"id":44478,"transcription_id":23,"word":"traffic","probability":0.9878668785,"time_start":97.7799987793,"time_end":98.5800018311,"thumbnail":null},{"id":44479,"transcription_id":23,"word":"signal","probability":0.9955849648,"time_start":98.5800018311,"time_end":99.1600036621,"thumbnail":null},{"id":44480,"transcription_id":23,"word":"lots","probability":0.324618727,"time_start":105.9400024414,"time_end":106.7600021362,"thumbnail":null},{"id":44481,"transcription_id":23,"word":"of","probability":0.9957297444,"time_start":106.7600021362,"time_end":107.0999984741,"thumbnail":null},{"id":44482,"transcription_id":23,"word":"parked","probability":0.8519060612,"time_start":107.0999984741,"time_end":107.5199966431,"thumbnail":null},{"id":44483,"transcription_id":23,"word":"cars","probability":0.9921371341,"time_start":107.5199966431,"time_end":108.1399993896,"thumbnail":null},{"id":44484,"transcription_id":23,"word":"here","probability":0.851401329,"time_start":108.1399993896,"time_end":108.6600036621,"thumbnail":null},{"id":44485,"transcription_id":23,"word":"many","probability":0.9164395928,"time_start":109.5800018311,"time_end":110.1200027466,"thumbnail":null},{"id":44486,"transcription_id":23,"word":"many","probability":0.9957595468,"time_start":110.2399978638,"time_end":110.6399993896,"thumbnail":null},{"id":44487,"transcription_id":23,"word":"many","probability":0.9962187409,"time_start":110.7200012207,"time_end":111.1800003052,"thumbnail":null},{"id":44488,"transcription_id":23,"word":"many","probability":0.9900993705,"time_start":111.3199996948,"time_end":111.8600006104,"thumbnail":null},{"id":44489,"transcription_id":23,"word":"parked","probability":0.854418993,"time_start":111.8600006104,"time_end":112.2600021362,"thumbnail":null},{"id":44490,"transcription_id":23,"word":"cars","probability":0.9911159277,"time_start":112.2600021362,"time_end":113.0400009155,"thumbnail":null},{"id":44491,"transcription_id":23,"word":"so","probability":0.9118825197,"time_start":113.5599975586,"time_end":115.4599990845,"thumbnail":null},{"id":44492,"transcription_id":23,"word":"many","probability":0.9914549589,"time_start":115.4599990845,"time_end":115.6600036621,"thumbnail":null},{"id":44493,"transcription_id":23,"word":"parked","probability":0.9893231988,"time_start":115.6600036621,"time_end":116.0599975586,"thumbnail":null},{"id":44494,"transcription_id":23,"word":"cars","probability":0.9914801121,"time_start":116.0599975586,"time_end":116.4400024414,"thumbnail":null},{"id":44495,"transcription_id":23,"word":"all","probability":0.3460408151,"time_start":117.5999984741,"time_end":117.8600006104,"thumbnail":null},{"id":44496,"transcription_id":23,"word":"right","probability":0.9785516858,"time_start":117.8600006104,"time_end":118.0,"thumbnail":null},{"id":44497,"transcription_id":23,"word":"a","probability":0.6878592968,"time_start":118.0800018311,"time_end":118.1600036621,"thumbnail":null},{"id":44498,"transcription_id":23,"word":"speed","probability":0.969344914,"time_start":118.1600036621,"time_end":118.4199981689,"thumbnail":null},{"id":44499,"transcription_id":23,"word":"limit","probability":0.9586951137,"time_start":118.4199981689,"time_end":118.7200012207,"thumbnail":null},{"id":44500,"transcription_id":23,"word":"sign","probability":0.8694431186,"time_start":119.1600036621,"time_end":119.5999984741,"thumbnail":null},{"id":44501,"transcription_id":23,"word":"some","probability":0.0673642084,"time_start":121.6999969482,"time_end":122.6999969482,"thumbnail":null},{"id":44502,"transcription_id":23,"word":"no","probability":0.5818865299,"time_start":122.6999969482,"time_end":123.0800018311,"thumbnail":null},{"id":44503,"transcription_id":23,"word":"stopping","probability":0.4640462697,"time_start":123.0800018311,"time_end":123.6800003052,"thumbnail":null},{"id":44504,"transcription_id":23,"word":"signs","probability":0.9982008934,"time_start":123.6800003052,"time_end":124.3000030518,"thumbnail":null},{"id":44505,"transcription_id":23,"word":"over","probability":0.9798363447,"time_start":124.3000030518,"time_end":124.6200027466,"thumbnail":null},{"id":44506,"transcription_id":23,"word":"here","probability":0.9961781502,"time_start":124.6200027466,"time_end":125.2799987793,"thumbnail":null},{"id":44507,"transcription_id":23,"word":"more","probability":0.9228707552,"time_start":125.2799987793,"time_end":126.9000015259,"thumbnail":null},{"id":44508,"transcription_id":23,"word":"parked","probability":0.5361869335,"time_start":126.9000015259,"time_end":127.2600021362,"thumbnail":null},{"id":44509,"transcription_id":23,"word":"cars","probability":0.9968364239,"time_start":127.2600021362,"time_end":127.6800003052,"thumbnail":null},{"id":44510,"transcription_id":23,"word":"oh","probability":0.3648384809,"time_start":128.2400054932,"time_end":130.6000061035,"thumbnail":null},{"id":44511,"transcription_id":23,"word":"here","probability":0.246545583,"time_start":130.6199951172,"time_end":131.5200042725,"thumbnail":null},{"id":44512,"transcription_id":23,"word":"are","probability":0.6112979054,"time_start":131.5200042725,"time_end":132.6399993896,"thumbnail":null},{"id":44513,"transcription_id":23,"word":"some","probability":0.9832495451,"time_start":132.6399993896,"time_end":133.1399993896,"thumbnail":null},{"id":44514,"transcription_id":23,"word":"cars","probability":0.9275255799,"time_start":133.1399993896,"time_end":133.4400024414,"thumbnail":null},{"id":44515,"transcription_id":23,"word":"this","probability":0.9806283712,"time_start":133.6199951172,"time_end":133.7400054932,"thumbnail":null},{"id":44516,"transcription_id":23,"word":"is","probability":0.9861631989,"time_start":133.7400054932,"time_end":133.8999938965,"thumbnail":null},{"id":44517,"transcription_id":23,"word":"a","probability":0.938449204,"time_start":133.8999938965,"time_end":134.1199951172,"thumbnail":null},{"id":44518,"transcription_id":23,"word":"crb","probability":0.7023974061,"time_start":134.1199951172,"time_end":134.8999938965,"thumbnail":null},{"id":44519,"transcription_id":23,"word":"maryland","probability":0.7068493366,"time_start":135.8000030518,"time_end":137.3999938965,"thumbnail":null},{"id":44520,"transcription_id":23,"word":"license","probability":0.917594552,"time_start":137.3999938965,"time_end":137.8399963379,"thumbnail":null},{"id":44521,"transcription_id":23,"word":"plate","probability":0.4741558135,"time_start":137.8399963379,"time_end":138.2400054932,"thumbnail":null},{"id":44522,"transcription_id":23,"word":"protected","probability":0.1754848957,"time_start":139.0,"time_end":140.4199981689,"thumbnail":null},{"id":44523,"transcription_id":23,"word":"the","probability":0.1927641481,"time_start":140.4199981689,"time_end":140.4199981689,"thumbnail":null},{"id":44524,"transcription_id":23,"word":"traffic","probability":0.041139815,"time_start":140.4199981689,"time_end":140.6600036621,"thumbnail":null},{"id":44525,"transcription_id":23,"word":"i","probability":0.6574316025,"time_start":141.6600036621,"time_end":141.8200073242,"thumbnail":null},{"id":44526,"transcription_id":23,"word":"dont","probability":0.9836881757,"time_start":141.8200073242,"time_end":141.9199981689,"thumbnail":null},{"id":44527,"transcription_id":23,"word":"think","probability":0.9862332344,"time_start":141.9199981689,"time_end":142.1399993896,"thumbnail":null},{"id":44528,"transcription_id":23,"word":"your","probability":0.5132837296,"time_start":142.1399993896,"time_end":142.3000030518,"thumbnail":null},{"id":44529,"transcription_id":23,"word":"video","probability":0.9329594374,"time_start":142.3000030518,"time_end":142.6199951172,"thumbnail":null},{"id":44530,"transcription_id":23,"word":"was","probability":0.2870953083,"time_start":142.6199951172,"time_end":143.2200012207,"thumbnail":null},{"id":44531,"transcription_id":23,"word":"great","probability":0.6397321224,"time_start":143.2200012207,"time_end":144.0200042725,"thumbnail":null},{"id":44532,"transcription_id":23,"word":"im","probability":0.2231057733,"time_start":144.6999969482,"time_end":145.8399963379,"thumbnail":null},{"id":44533,"transcription_id":23,"word":"sorry","probability":0.0380234495,"time_start":145.8399963379,"time_end":145.8999938965,"thumbnail":null},{"id":44534,"transcription_id":23,"word":"but","probability":0.1066293418,"time_start":146.1399993896,"time_end":146.2799987793,"thumbnail":null},{"id":44535,"transcription_id":23,"word":"we","probability":0.2740229964,"time_start":146.2799987793,"time_end":146.6199951172,"thumbnail":null},{"id":44536,"transcription_id":23,"word":"found","probability":0.7833840251,"time_start":146.6199951172,"time_end":146.8800048828,"thumbnail":null},{"id":44537,"transcription_id":23,"word":"some","probability":0.6399146318,"time_start":146.8800048828,"time_end":147.3000030518,"thumbnail":null},{"id":44538,"transcription_id":23,"word":"more","probability":0.4638155401,"time_start":147.3000030518,"time_end":148.6999969482,"thumbnail":null},{"id":44539,"transcription_id":23,"word":"trees","probability":0.7349574566,"time_start":148.6999969482,"time_end":149.6199951172,"thumbnail":null},{"id":44540,"transcription_id":23,"word":"and","probability":0.4864278138,"time_start":151.0399932861,"time_end":152.8600006104,"thumbnail":null},{"id":44541,"transcription_id":23,"word":"parked","probability":0.1539433748,"time_start":152.8600006104,"time_end":153.4199981689,"thumbnail":null},{"id":44542,"transcription_id":23,"word":"cars","probability":0.9203871489,"time_start":153.4199981689,"time_end":153.9799957275,"thumbnail":null},{"id":44543,"transcription_id":23,"word":"theres","probability":0.599681139,"time_start":155.3999938965,"time_end":158.6000061035,"thumbnail":null},{"id":44544,"transcription_id":23,"word":"a","probability":0.7674360871,"time_start":158.6000061035,"time_end":158.6600036621,"thumbnail":null},{"id":44545,"transcription_id":23,"word":"yellow","probability":0.9708739519,"time_start":158.6600036621,"time_end":158.9799957275,"thumbnail":null},{"id":44546,"transcription_id":23,"word":"fire","probability":0.9590805769,"time_start":158.9799957275,"time_end":159.4400024414,"thumbnail":null},{"id":44547,"transcription_id":23,"word":"hydrant","probability":0.929992497,"time_start":159.4400024414,"time_end":160.1199951172,"thumbnail":null},{"id":44548,"transcription_id":23,"word":"theres","probability":0.8351916671,"time_start":163.9600067139,"time_end":168.1000061035,"thumbnail":null},{"id":44549,"transcription_id":23,"word":"more","probability":0.9896997809,"time_start":168.1000061035,"time_end":168.3399963379,"thumbnail":null},{"id":44550,"transcription_id":23,"word":"pedestrians","probability":0.4140591919,"time_start":168.3399963379,"time_end":168.9199981689,"thumbnail":null},{"id":44551,"transcription_id":23,"word":"a","probability":0.0104338638,"time_start":169.5800018311,"time_end":170.3000030518,"thumbnail":null},{"id":44552,"transcription_id":23,"word":"green","probability":0.6066679358,"time_start":170.3000030518,"time_end":170.8800048828,"thumbnail":null},{"id":44553,"transcription_id":23,"word":"shirt","probability":0.9946958423,"time_start":170.8800048828,"time_end":171.2799987793,"thumbnail":null},{"id":44554,"transcription_id":23,"word":"here","probability":0.4089252651,"time_start":172.1000061035,"time_end":173.8399963379,"thumbnail":null},{"id":44555,"transcription_id":23,"word":"were","probability":0.2624660432,"time_start":173.8399963379,"time_end":174.1799926758,"thumbnail":null},{"id":44556,"transcription_id":23,"word":"coming","probability":0.8189875484,"time_start":174.1799926758,"time_end":174.1799926758,"thumbnail":null},{"id":44557,"transcription_id":23,"word":"up","probability":0.9911086559,"time_start":174.1799926758,"time_end":174.3399963379,"thumbnail":null},{"id":44558,"transcription_id":23,"word":"to","probability":0.9880868196,"time_start":174.3399963379,"time_end":174.5200042725,"thumbnail":null},{"id":44559,"transcription_id":23,"word":"another","probability":0.9964627624,"time_start":174.5200042725,"time_end":174.8800048828,"thumbnail":null},{"id":44560,"transcription_id":23,"word":"traffic","probability":0.9662864208,"time_start":174.8800048828,"time_end":175.8999938965,"thumbnail":null},{"id":44561,"transcription_id":23,"word":"light","probability":0.9943521023,"time_start":175.8999938965,"time_end":176.3399963379,"thumbnail":null},{"id":44562,"transcription_id":23,"word":"lots","probability":0.8016519547,"time_start":176.9600067139,"time_end":177.1399993896,"thumbnail":null},{"id":44563,"transcription_id":23,"word":"of","probability":0.9964277148,"time_start":177.1399993896,"time_end":177.3399963379,"thumbnail":null},{"id":44564,"transcription_id":23,"word":"cars","probability":0.997330904,"time_start":177.3399963379,"time_end":177.6799926758,"thumbnail":null},{"id":44565,"transcription_id":23,"word":"this","probability":0.9717081785,"time_start":178.7599945068,"time_end":180.7599945068,"thumbnail":null},{"id":44566,"transcription_id":23,"word":"is","probability":0.9939690828,"time_start":180.7599945068,"time_end":180.9799957275,"thumbnail":null},{"id":44567,"transcription_id":23,"word":"a","probability":0.9803338647,"time_start":180.9799957275,"time_end":181.1600036621,"thumbnail":null},{"id":44568,"transcription_id":23,"word":"red","probability":0.986694932,"time_start":181.1600036621,"time_end":181.3600006104,"thumbnail":null},{"id":44569,"transcription_id":23,"word":"light","probability":0.9911873937,"time_start":181.3600006104,"time_end":181.8000030518,"thumbnail":null},{"id":44570,"transcription_id":23,"word":"thats","probability":0.5999427438,"time_start":183.0200042725,"time_end":183.8200073242,"thumbnail":null},{"id":44571,"transcription_id":23,"word":"right","probability":0.7754058242,"time_start":183.8200073242,"time_end":183.9400024414,"thumbnail":null},{"id":44572,"transcription_id":23,"word":"what","probability":0.5993646383,"time_start":184.4799957275,"time_end":186.4799957275,"thumbnail":null},{"id":44573,"transcription_id":23,"word":"if","probability":0.2455375344,"time_start":186.4799957275,"time_end":186.6600036621,"thumbnail":null},{"id":44574,"transcription_id":23,"word":"theres","probability":0.3535242379,"time_start":186.6600036621,"time_end":187.3000030518,"thumbnail":null},{"id":44575,"transcription_id":23,"word":"information","probability":0.1468016803,"time_start":187.3000030518,"time_end":187.4600067139,"thumbnail":null},{"id":44576,"transcription_id":23,"word":"to","probability":0.4242774248,"time_start":187.4600067139,"time_end":187.7400054932,"thumbnail":null},{"id":44577,"transcription_id":23,"word":"them","probability":0.0493926816,"time_start":187.7400054932,"time_end":188.0200042725,"thumbnail":null},{"id":44578,"transcription_id":23,"word":"no","probability":0.39609918,"time_start":188.4199981689,"time_end":188.6199951172,"thumbnail":null},{"id":44579,"transcription_id":23,"word":"this","probability":0.9812541008,"time_start":188.6999969482,"time_end":188.8000030518,"thumbnail":null},{"id":44580,"transcription_id":23,"word":"is","probability":0.8653982282,"time_start":188.8000030518,"time_end":188.9400024414,"thumbnail":null},{"id":44581,"transcription_id":23,"word":"good","probability":0.9951978326,"time_start":188.9400024414,"time_end":189.1399993896,"thumbnail":null},{"id":44582,"transcription_id":23,"word":"because","probability":0.0306783449,"time_start":190.8000030518,"time_end":191.1999969482,"thumbnail":null},{"id":44583,"transcription_id":23,"word":"this","probability":0.9691972733,"time_start":191.1999969482,"time_end":192.7599945068,"thumbnail":null},{"id":44584,"transcription_id":23,"word":"will","probability":0.9159399867,"time_start":192.7599945068,"time_end":192.8999938965,"thumbnail":null},{"id":44585,"transcription_id":23,"word":"be","probability":0.9956680536,"time_start":192.8999938965,"time_end":193.1199951172,"thumbnail":null},{"id":44586,"transcription_id":23,"word":"like","probability":0.8018542528,"time_start":193.1199951172,"time_end":193.5399932861,"thumbnail":null},{"id":44587,"transcription_id":23,"word":"my","probability":0.6189053059,"time_start":193.5399932861,"time_end":194.5599975586,"thumbnail":null},{"id":44588,"transcription_id":23,"word":"headlarks","probability":0.4188396037,"time_start":194.5599975586,"time_end":195.0800018311,"thumbnail":null},{"id":44589,"transcription_id":23,"word":"during","probability":0.7998852134,"time_start":195.0800018311,"time_end":195.3200073242,"thumbnail":null},{"id":44590,"transcription_id":23,"word":"the","probability":0.9819157124,"time_start":195.3200073242,"time_end":195.5399932861,"thumbnail":null},{"id":44591,"transcription_id":23,"word":"video","probability":0.9984764457,"time_start":195.5399932861,"time_end":195.8600006104,"thumbnail":null},{"id":44592,"transcription_id":23,"word":"so","probability":0.1139175147,"time_start":196.8000030518,"time_end":197.3999938965,"thumbnail":null},{"id":44593,"transcription_id":23,"word":"then","probability":0.8264402151,"time_start":197.3999938965,"time_end":197.8200073242,"thumbnail":null},{"id":44594,"transcription_id":23,"word":"we","probability":0.979571104,"time_start":197.8200073242,"time_end":198.0,"thumbnail":null},{"id":44595,"transcription_id":23,"word":"can","probability":0.9067794085,"time_start":198.0,"time_end":198.1199951172,"thumbnail":null},{"id":44596,"transcription_id":23,"word":"search","probability":0.9869365096,"time_start":198.1199951172,"time_end":198.3800048828,"thumbnail":null},{"id":44597,"transcription_id":23,"word":"and","probability":0.2989762723,"time_start":198.3800048828,"time_end":198.5399932861,"thumbnail":null},{"id":44598,"transcription_id":23,"word":"take","probability":0.288400352,"time_start":198.5399932861,"time_end":198.9199981689,"thumbnail":null},{"id":44599,"transcription_id":23,"word":"a","probability":0.2695129216,"time_start":198.9199981689,"time_end":199.0399932861,"thumbnail":null},{"id":44600,"transcription_id":23,"word":"car","probability":0.4076018035,"time_start":199.0399932861,"time_end":199.1199951172,"thumbnail":null},{"id":44601,"transcription_id":23,"word":"its","probability":0.7893666625,"time_start":199.1199951172,"time_end":199.3000030518,"thumbnail":null},{"id":44602,"transcription_id":23,"word":"a","probability":0.7722892165,"time_start":199.3000030518,"time_end":199.3000030518,"thumbnail":null},{"id":44603,"transcription_id":23,"word":"park","probability":0.5671539307,"time_start":199.3000030518,"time_end":199.3200073242,"thumbnail":null},{"id":44604,"transcription_id":23,"word":"thats","probability":0.9155172706,"time_start":199.3200073242,"time_end":199.6600036621,"thumbnail":null},{"id":44605,"transcription_id":23,"word":"trying","probability":0.9898604751,"time_start":199.6600036621,"time_end":199.8600006104,"thumbnail":null},{"id":44606,"transcription_id":23,"word":"to","probability":0.9980545044,"time_start":199.8600006104,"time_end":200.0,"thumbnail":null},{"id":44607,"transcription_id":23,"word":"park","probability":0.9968476892,"time_start":200.0,"time_end":200.5,"thumbnail":null},{"id":44608,"transcription_id":23,"word":"parallel","probability":0.5560716987,"time_start":200.8999938965,"time_end":201.9400024414,"thumbnail":null},{"id":44609,"transcription_id":23,"word":"park","probability":0.3471704423,"time_start":201.9400024414,"time_end":202.1999969482,"thumbnail":null},{"id":44610,"transcription_id":23,"word":"and","probability":0.6562133431,"time_start":202.1999969482,"time_end":202.4600067139,"thumbnail":null},{"id":44611,"transcription_id":23,"word":"doing","probability":0.981114924,"time_start":202.4600067139,"time_end":202.7799987793,"thumbnail":null},{"id":44612,"transcription_id":23,"word":"a","probability":0.9934501648,"time_start":202.7799987793,"time_end":202.9199981689,"thumbnail":null},{"id":44613,"transcription_id":23,"word":"great","probability":0.9961106181,"time_start":202.9199981689,"time_end":203.1600036621,"thumbnail":null},{"id":44614,"transcription_id":23,"word":"job","probability":0.9993439317,"time_start":203.1600036621,"time_end":203.6600036621,"thumbnail":null},{"id":44615,"transcription_id":23,"word":"oh","probability":0.6189787984,"time_start":204.4199981689,"time_end":205.4799957275,"thumbnail":null},{"id":44616,"transcription_id":23,"word":"here","probability":0.5280214548,"time_start":205.5200042725,"time_end":205.8399963379,"thumbnail":null},{"id":44617,"transcription_id":23,"word":"we","probability":0.99631989,"time_start":205.8399963379,"time_end":206.0,"thumbnail":null},{"id":44618,"transcription_id":23,"word":"go","probability":0.9960986376,"time_start":206.0,"time_end":206.2799987793,"thumbnail":null},{"id":44619,"transcription_id":23,"word":"no","probability":0.7912544012,"time_start":206.9400024414,"time_end":207.8600006104,"thumbnail":null},{"id":44620,"transcription_id":23,"word":"left","probability":0.9895520806,"time_start":207.8600006104,"time_end":208.2400054932,"thumbnail":null},{"id":44621,"transcription_id":23,"word":"turn","probability":0.8352272511,"time_start":208.2400054932,"time_end":208.5399932861,"thumbnail":null},{"id":44622,"transcription_id":23,"word":"sign","probability":0.9157357216,"time_start":208.5399932861,"time_end":209.0800018311,"thumbnail":null},{"id":44623,"transcription_id":23,"word":"thats","probability":0.7818214893,"time_start":212.5800018311,"time_end":218.2599945068,"thumbnail":null},{"id":44624,"transcription_id":23,"word":"it","probability":0.9788736105,"time_start":218.2599945068,"time_end":218.3399963379,"thumbnail":null},{"id":44625,"transcription_id":23,"word":"i","probability":0.3799633682,"time_start":218.5599975586,"time_end":218.6000061035,"thumbnail":null},{"id":44626,"transcription_id":23,"word":"mean","probability":0.9834299088,"time_start":218.6000061035,"time_end":218.7200012207,"thumbnail":null},{"id":44627,"transcription_id":23,"word":"we","probability":0.9493121505,"time_start":218.7200012207,"time_end":219.0200042725,"thumbnail":null},{"id":44628,"transcription_id":23,"word":"just","probability":0.9597814679,"time_start":219.0200042725,"time_end":219.1399993896,"thumbnail":null},{"id":44629,"transcription_id":23,"word":"keep","probability":0.9628224373,"time_start":219.1399993896,"time_end":219.3200073242,"thumbnail":null},{"id":44630,"transcription_id":23,"word":"this","probability":0.7732074261,"time_start":219.3200073242,"time_end":219.5399932861,"thumbnail":null},{"id":44631,"transcription_id":23,"word":"upright","probability":0.2804124653,"time_start":219.5399932861,"time_end":219.9199981689,"thumbnail":null},{"id":44632,"transcription_id":23,"word":"all","probability":0.5793229938,"time_start":220.4199981689,"time_end":220.5800018311,"thumbnail":null},{"id":44633,"transcription_id":23,"word":"right","probability":0.9963492155,"time_start":220.5800018311,"time_end":221.1399993896,"thumbnail":null},{"id":44634,"transcription_id":23,"word":"its","probability":0.9792152047,"time_start":221.5399932861,"time_end":222.1399993896,"thumbnail":null},{"id":44635,"transcription_id":23,"word":"mundane","probability":0.9930121303,"time_start":222.1399993896,"time_end":222.5,"thumbnail":null},{"id":44636,"transcription_id":23,"word":"but","probability":0.9966719151,"time_start":222.5,"time_end":222.8600006104,"thumbnail":null},{"id":44637,"transcription_id":23,"word":"this","probability":0.986141324,"time_start":222.8600006104,"time_end":223.0399932861,"thumbnail":null},{"id":44638,"transcription_id":23,"word":"is","probability":0.9931407571,"time_start":223.0399932861,"time_end":223.1999969482,"thumbnail":null},{"id":44639,"transcription_id":23,"word":"the","probability":0.9827401638,"time_start":223.1999969482,"time_end":223.3399963379,"thumbnail":null},{"id":44640,"transcription_id":23,"word":"problem","probability":0.7947108746,"time_start":223.3399963379,"time_end":223.6600036621,"thumbnail":null},{"id":44641,"transcription_id":23,"word":"okay","probability":0.5200766921,"time_start":223.7599945068,"time_end":224.3600006104,"thumbnail":null},{"id":44642,"transcription_id":23,"word":"here","probability":0.4463385046,"time_start":224.8399963379,"time_end":225.1799926758,"thumbnail":null},{"id":44643,"transcription_id":23,"word":"we","probability":0.9146700501,"time_start":225.1799926758,"time_end":225.4199981689,"thumbnail":null},{"id":44644,"transcription_id":23,"word":"come","probability":0.8329204321,"time_start":225.4199981689,"time_end":225.6600036621,"thumbnail":null},{"id":44645,"transcription_id":23,"word":"yes","probability":0.3886433542,"time_start":225.7799987793,"time_end":226.2200012207,"thumbnail":null},{"id":44646,"transcription_id":23,"word":"here","probability":0.8767703176,"time_start":226.6600036621,"time_end":227.0200042725,"thumbnail":null},{"id":44647,"transcription_id":23,"word":"we","probability":0.9630678296,"time_start":227.0200042725,"time_end":227.2200012207,"thumbnail":null},{"id":44648,"transcription_id":23,"word":"are","probability":0.9784707427,"time_start":227.2200012207,"time_end":227.4199981689,"thumbnail":null},{"id":44649,"transcription_id":23,"word":"coming","probability":0.4163455367,"time_start":227.4199981689,"time_end":228.1600036621,"thumbnail":null},{"id":44650,"transcription_id":23,"word":"up","probability":0.9942579269,"time_start":228.1600036621,"time_end":228.3399963379,"thumbnail":null},{"id":44651,"transcription_id":23,"word":"to","probability":0.9950384498,"time_start":228.3399963379,"time_end":228.5399932861,"thumbnail":null},{"id":44652,"transcription_id":23,"word":"another","probability":0.9980303645,"time_start":228.5399932861,"time_end":228.9199981689,"thumbnail":null},{"id":44653,"transcription_id":23,"word":"traffic","probability":0.9753180146,"time_start":228.9199981689,"time_end":229.4199981689,"thumbnail":null},{"id":44654,"transcription_id":23,"word":"light","probability":0.9854431152,"time_start":229.4199981689,"time_end":230.1199951172,"thumbnail":null},{"id":44655,"transcription_id":23,"word":"still","probability":0.8783633709,"time_start":230.6999969482,"time_end":233.4199981689,"thumbnail":null},{"id":44656,"transcription_id":23,"word":"following","probability":0.9541170001,"time_start":233.4199981689,"time_end":233.9400024414,"thumbnail":null},{"id":44657,"transcription_id":23,"word":"the","probability":0.5636697412,"time_start":233.9400024414,"time_end":234.1999969482,"thumbnail":null},{"id":44658,"transcription_id":23,"word":"crb","probability":0.7618433833,"time_start":234.1999969482,"time_end":234.9799957275,"thumbnail":null},{"id":44659,"transcription_id":23,"word":"is","probability":0.8756393194,"time_start":235.8000030518,"time_end":237.3800048828,"thumbnail":null},{"id":44660,"transcription_id":23,"word":"this","probability":0.9975857735,"time_start":237.3800048828,"time_end":237.5800018311,"thumbnail":null},{"id":44661,"transcription_id":23,"word":"okay","probability":0.4707950354,"time_start":237.5800018311,"time_end":239.2200012207,"thumbnail":null},{"id":44662,"transcription_id":23,"word":"yeah","probability":0.8134695888,"time_start":242.0,"time_end":242.7400054932,"thumbnail":null},{"id":44663,"transcription_id":23,"word":"thats","probability":0.996581912,"time_start":242.7599945068,"time_end":243.0,"thumbnail":null},{"id":44664,"transcription_id":23,"word":"right","probability":0.9951705337,"time_start":243.0,"time_end":243.1600036621,"thumbnail":null},{"id":44665,"transcription_id":23,"word":"no","probability":0.4458858669,"time_start":243.7799987793,"time_end":244.8999938965,"thumbnail":null},{"id":44666,"transcription_id":23,"word":"this","probability":0.9931086302,"time_start":246.3000030518,"time_end":246.9600067139,"thumbnail":null},{"id":44667,"transcription_id":23,"word":"is","probability":0.998257935,"time_start":246.9600067139,"time_end":247.1199951172,"thumbnail":null},{"id":44668,"transcription_id":23,"word":"good","probability":0.9956104159,"time_start":247.1199951172,"time_end":247.3800048828,"thumbnail":null},{"id":44669,"transcription_id":23,"word":"yeah","probability":0.7070975304,"time_start":247.7599945068,"time_end":247.8999938965,"thumbnail":null},{"id":44670,"transcription_id":23,"word":"as","probability":0.9917356372,"time_start":247.9600067139,"time_end":248.0399932861,"thumbnail":null},{"id":44671,"transcription_id":23,"word":"long","probability":0.9958868623,"time_start":248.0399932861,"time_end":248.1199951172,"thumbnail":null},{"id":44672,"transcription_id":23,"word":"as","probability":0.992652297,"time_start":248.1199951172,"time_end":248.2799987793,"thumbnail":null},{"id":44673,"transcription_id":23,"word":"you","probability":0.9973631501,"time_start":248.2799987793,"time_end":248.3200073242,"thumbnail":null},{"id":44674,"transcription_id":23,"word":"can","probability":0.995751977,"time_start":248.3200073242,"time_end":248.4400024414,"thumbnail":null},{"id":44675,"transcription_id":23,"word":"just","probability":0.9460404515,"time_start":248.4400024414,"time_end":248.6000061035,"thumbnail":null},{"id":44676,"transcription_id":23,"word":"see","probability":0.9987316728,"time_start":248.6000061035,"time_end":248.8200073242,"thumbnail":null},{"id":44677,"transcription_id":23,"word":"the","probability":0.9920882583,"time_start":248.8200073242,"time_end":248.9799957275,"thumbnail":null},{"id":44678,"transcription_id":23,"word":"things","probability":0.99685812,"time_start":248.9799957275,"time_end":249.2200012207,"thumbnail":null},{"id":44679,"transcription_id":23,"word":"that","probability":0.9603170753,"time_start":249.2200012207,"time_end":249.3600006104,"thumbnail":null},{"id":44680,"transcription_id":23,"word":"youre","probability":0.9893254638,"time_start":249.3600006104,"time_end":249.4600067139,"thumbnail":null},{"id":44681,"transcription_id":23,"word":"talking","probability":0.9992399216,"time_start":249.4600067139,"time_end":249.8200073242,"thumbnail":null},{"id":44682,"transcription_id":23,"word":"about","probability":0.9928026795,"time_start":249.8200073242,"time_end":250.1999969482,"thumbnail":null},{"id":44683,"transcription_id":23,"word":"heres","probability":0.573497653,"time_start":254.3200073242,"time_end":254.8600006104,"thumbnail":null},{"id":44684,"transcription_id":23,"word":"a","probability":0.8540424109,"time_start":254.8600006104,"time_end":255.1000061035,"thumbnail":null},{"id":44685,"transcription_id":23,"word":"gray","probability":0.3051680326,"time_start":255.1000061035,"time_end":256.2799987793,"thumbnail":null},{"id":44686,"transcription_id":23,"word":"sonata","probability":0.6876629591,"time_start":256.2799987793,"time_end":257.1000061035,"thumbnail":null},{"id":44687,"transcription_id":23,"word":"yeah","probability":0.1990463138,"time_start":257.7200012207,"time_end":257.8399963379,"thumbnail":null},{"id":44688,"transcription_id":23,"word":"we","probability":0.1491384059,"time_start":257.9400024414,"time_end":258.0599975586,"thumbnail":null},{"id":44689,"transcription_id":23,"word":"want","probability":0.5110552907,"time_start":258.0599975586,"time_end":258.0799865723,"thumbnail":null},{"id":44690,"transcription_id":23,"word":"to","probability":0.9846755862,"time_start":258.0799865723,"time_end":258.1600036621,"thumbnail":null},{"id":44691,"transcription_id":23,"word":"say","probability":0.8511600494,"time_start":258.1600036621,"time_end":258.299987793,"thumbnail":null},{"id":44692,"transcription_id":23,"word":"honda","probability":0.1606984138,"time_start":258.299987793,"time_end":258.6000061035,"thumbnail":null},{"id":44693,"transcription_id":23,"word":"as","probability":0.9204412699,"time_start":258.6000061035,"time_end":258.8999938965,"thumbnail":null},{"id":44694,"transcription_id":23,"word":"well","probability":0.993127346,"time_start":258.8999938965,"time_end":259.5799865723,"thumbnail":null},{"id":44695,"transcription_id":23,"word":"honda","probability":0.6403359175,"time_start":259.5799865723,"time_end":260.0799865723,"thumbnail":null},{"id":44696,"transcription_id":23,"word":"i","probability":0.2356221825,"time_start":260.3800048828,"time_end":260.4800109863,"thumbnail":null},{"id":44697,"transcription_id":23,"word":"dont","probability":0.6008026004,"time_start":260.4800109863,"time_end":260.8399963379,"thumbnail":null},{"id":44698,"transcription_id":23,"word":"know","probability":0.6871170998,"time_start":260.8399963379,"time_end":261.0400085449,"thumbnail":null},{"id":44699,"transcription_id":23,"word":"why","probability":0.4071462154,"time_start":261.1199951172,"time_end":261.2399902344,"thumbnail":null},{"id":44700,"transcription_id":23,"word":"is","probability":0.1873753518,"time_start":261.2399902344,"time_end":261.4400024414,"thumbnail":null},{"id":44701,"transcription_id":23,"word":"that","probability":0.5858181119,"time_start":261.4400024414,"time_end":261.5599975586,"thumbnail":null},{"id":44702,"transcription_id":23,"word":"oh","probability":0.2770895064,"time_start":261.7600097656,"time_end":262.0599975586,"thumbnail":null},{"id":44703,"transcription_id":23,"word":"yeah","probability":0.7798349857,"time_start":263.4400024414,"time_end":263.4400024414,"thumbnail":null},{"id":44704,"transcription_id":23,"word":"why","probability":0.7581374049,"time_start":263.8399963379,"time_end":264.3399963379,"thumbnail":null},{"id":44705,"transcription_id":23,"word":"is","probability":0.3721770048,"time_start":264.3399963379,"time_end":264.5799865723,"thumbnail":null},{"id":44706,"transcription_id":23,"word":"that","probability":0.5304625034,"time_start":264.5799865723,"time_end":264.700012207,"thumbnail":null},{"id":44707,"transcription_id":23,"word":"its","probability":0.5313903689,"time_start":264.7600097656,"time_end":264.8999938965,"thumbnail":null},{"id":44708,"transcription_id":23,"word":"okay","probability":0.0143703325,"time_start":264.8999938965,"time_end":265.1400146484,"thumbnail":null},{"id":44709,"transcription_id":23,"word":"is","probability":0.3969684541,"time_start":266.3800048828,"time_end":269.0599975586,"thumbnail":null},{"id":44710,"transcription_id":23,"word":"this","probability":0.973082304,"time_start":269.0599975586,"time_end":269.2799987793,"thumbnail":null},{"id":44711,"transcription_id":23,"word":"cool","probability":0.3247535527,"time_start":269.2799987793,"time_end":269.700012207,"thumbnail":null},{"id":44712,"transcription_id":23,"word":"zone","probability":0.896936655,"time_start":269.700012207,"time_end":270.0799865723,"thumbnail":null},{"id":44713,"transcription_id":23,"word":"sign","probability":0.2281935662,"time_start":270.0799865723,"time_end":270.5599975586,"thumbnail":null},{"id":44714,"transcription_id":23,"word":"yeah","probability":0.0076085632,"time_start":280.200012207,"time_end":280.7600097656,"thumbnail":null},{"id":44715,"transcription_id":23,"word":"i","probability":0.0937692896,"time_start":280.7600097656,"time_end":280.7799987793,"thumbnail":null},{"id":44716,"transcription_id":23,"word":"want","probability":0.0236025918,"time_start":280.7799987793,"time_end":282.2799987793,"thumbnail":null},{"id":44717,"transcription_id":23,"word":"all","probability":0.2683894336,"time_start":282.2799987793,"time_end":282.6799926758,"thumbnail":null},{"id":44718,"transcription_id":23,"word":"coming","probability":0.5816315413,"time_start":286.8399963379,"time_end":290.1799926758,"thumbnail":null},{"id":44719,"transcription_id":23,"word":"up","probability":0.9503823519,"time_start":290.1799926758,"time_end":290.4400024414,"thumbnail":null},{"id":44720,"transcription_id":23,"word":"to","probability":0.9572024345,"time_start":290.4400024414,"time_end":290.7799987793,"thumbnail":null},{"id":44721,"transcription_id":23,"word":"another","probability":0.9731566906,"time_start":290.7799987793,"time_end":291.7600097656,"thumbnail":null},{"id":44722,"transcription_id":23,"word":"traffic","probability":0.9654481411,"time_start":291.7600097656,"time_end":292.5,"thumbnail":null},{"id":44723,"transcription_id":23,"word":"signal","probability":0.9876394868,"time_start":292.5,"time_end":293.1799926758,"thumbnail":null},{"id":44724,"transcription_id":23,"word":"here","probability":0.4649174213,"time_start":293.1799926758,"time_end":294.1400146484,"thumbnail":null},{"id":44725,"transcription_id":23,"word":"in","probability":0.6251238585,"time_start":294.1400146484,"time_end":294.9599914551,"thumbnail":null},{"id":44726,"transcription_id":23,"word":"a","probability":0.8194921017,"time_start":294.9599914551,"time_end":295.1199951172,"thumbnail":null},{"id":44727,"transcription_id":23,"word":"dirage","probability":0.4347480834,"time_start":295.1199951172,"time_end":296.2600097656,"thumbnail":null},{"id":44728,"transcription_id":23,"word":"condominium","probability":0.9820250869,"time_start":296.2600097656,"time_end":298.0,"thumbnail":null},{"id":44729,"transcription_id":23,"word":"sign","probability":0.9255636334,"time_start":298.0,"time_end":298.5599975586,"thumbnail":null},{"id":44730,"transcription_id":23,"word":"you","probability":0.1268598437,"time_start":299.2600097656,"time_end":302.0,"thumbnail":null},{"id":44731,"transcription_id":23,"word":"can","probability":0.6074560881,"time_start":302.0,"time_end":302.1799926758,"thumbnail":null},{"id":44732,"transcription_id":23,"word":"see","probability":0.9336036444,"time_start":302.1799926758,"time_end":302.3999938965,"thumbnail":null},{"id":44733,"transcription_id":23,"word":"that","probability":0.9190252423,"time_start":302.3999938965,"time_end":302.6799926758,"thumbnail":null},{"id":44734,"transcription_id":23,"word":"dont","probability":0.6494085789,"time_start":303.3599853516,"time_end":304.2799987793,"thumbnail":null},{"id":44735,"transcription_id":23,"word":"worry","probability":0.9890035987,"time_start":304.2799987793,"time_end":304.4400024414,"thumbnail":null},{"id":44736,"transcription_id":23,"word":"about","probability":0.9926248193,"time_start":304.4400024414,"time_end":304.6799926758,"thumbnail":null},{"id":44737,"transcription_id":23,"word":"it","probability":0.9930554032,"time_start":304.6799926758,"time_end":304.8800048828,"thumbnail":null},{"id":44738,"transcription_id":23,"word":"its","probability":0.5231250525,"time_start":306.799987793,"time_end":307.2600097656,"thumbnail":null},{"id":44739,"transcription_id":23,"word":"not","probability":0.8728529215,"time_start":307.2600097656,"time_end":306.8399963379,"thumbnail":null},{"id":44740,"transcription_id":23,"word":"the","probability":0.9491971731,"time_start":306.8399963379,"time_end":307.7200012207,"thumbnail":null},{"id":44741,"transcription_id":23,"word":"end","probability":0.9983155727,"time_start":307.7200012207,"time_end":307.8399963379,"thumbnail":null},{"id":44742,"transcription_id":23,"word":"of","probability":0.9961595535,"time_start":307.8399963379,"time_end":307.9400024414,"thumbnail":null},{"id":44743,"transcription_id":23,"word":"the","probability":0.9989697933,"time_start":307.9400024414,"time_end":308.0199890137,"thumbnail":null},{"id":44744,"transcription_id":23,"word":"world","probability":0.9946671724,"time_start":308.0199890137,"time_end":308.2200012207,"thumbnail":null},{"id":44745,"transcription_id":23,"word":"if","probability":0.8687660694,"time_start":308.2200012207,"time_end":308.4599914551,"thumbnail":null},{"id":44746,"transcription_id":23,"word":"its","probability":0.9867717624,"time_start":308.4599914551,"time_end":308.799987793,"thumbnail":null},{"id":44747,"transcription_id":23,"word":"okay","probability":0.6714036465,"time_start":308.799987793,"time_end":309.8599853516,"thumbnail":null},{"id":44748,"transcription_id":23,"word":"we","probability":0.9872429371,"time_start":309.8999938965,"time_end":310.1199951172,"thumbnail":null},{"id":44749,"transcription_id":23,"word":"just","probability":0.5254549384,"time_start":310.1199951172,"time_end":310.2399902344,"thumbnail":null},{"id":44750,"transcription_id":23,"word":"want","probability":0.5760614872,"time_start":310.2399902344,"time_end":310.3800048828,"thumbnail":null},{"id":44751,"transcription_id":23,"word":"these","probability":0.8568476439,"time_start":310.3800048828,"time_end":310.5400085449,"thumbnail":null},{"id":44752,"transcription_id":23,"word":"like","probability":0.944773078,"time_start":310.5400085449,"time_end":310.7399902344,"thumbnail":null},{"id":44753,"transcription_id":23,"word":"when","probability":0.9716881514,"time_start":310.7799987793,"time_end":310.9400024414,"thumbnail":null},{"id":44754,"transcription_id":23,"word":"you","probability":0.9958338737,"time_start":310.9400024414,"time_end":311.0400085449,"thumbnail":null},{"id":44755,"transcription_id":23,"word":"say","probability":0.97488904,"time_start":311.0400085449,"time_end":311.1799926758,"thumbnail":null},{"id":44756,"transcription_id":23,"word":"these","probability":0.9927101135,"time_start":311.1799926758,"time_end":311.3399963379,"thumbnail":null},{"id":44757,"transcription_id":23,"word":"landmarks","probability":0.9921684265,"time_start":311.3399963379,"time_end":311.8800048828,"thumbnail":null},{"id":44758,"transcription_id":23,"word":"then","probability":0.8865351081,"time_start":311.8800048828,"time_end":312.0,"thumbnail":null},{"id":44759,"transcription_id":23,"word":"its","probability":0.9612444639,"time_start":312.0,"time_end":312.2399902344,"thumbnail":null},{"id":44760,"transcription_id":23,"word":"good","probability":0.9961262345,"time_start":312.2399902344,"time_end":312.3999938965,"thumbnail":null},{"id":44761,"transcription_id":23,"word":"these","probability":0.6733196378,"time_start":313.1000061035,"time_end":314.0199890137,"thumbnail":null},{"id":44762,"transcription_id":23,"word":"are","probability":0.9240874648,"time_start":314.0199890137,"time_end":314.0799865723,"thumbnail":null},{"id":44763,"transcription_id":23,"word":"good","probability":0.6282868981,"time_start":314.0799865723,"time_end":314.1799926758,"thumbnail":null},{"id":44764,"transcription_id":23,"word":"things","probability":0.9797703028,"time_start":314.1799926758,"time_end":314.3800048828,"thumbnail":null},{"id":44765,"transcription_id":23,"word":"that","probability":0.3866721392,"time_start":314.3800048828,"time_end":314.5799865723,"thumbnail":null},{"id":44766,"transcription_id":23,"word":"were","probability":0.5608674288,"time_start":314.5799865723,"time_end":314.9800109863,"thumbnail":null},{"id":44767,"transcription_id":23,"word":"searching","probability":0.5479464531,"time_start":314.9800109863,"time_end":315.1799926758,"thumbnail":null},{"id":44768,"transcription_id":23,"word":"for","probability":0.9990654588,"time_start":315.1799926758,"time_end":315.8399963379,"thumbnail":null},{"id":44769,"transcription_id":23,"word":"its","probability":0.6742541194,"time_start":316.2799987793,"time_end":317.0400085449,"thumbnail":null},{"id":44770,"transcription_id":23,"word":"like","probability":0.6618058085,"time_start":317.0400085449,"time_end":317.2399902344,"thumbnail":null},{"id":44771,"transcription_id":23,"word":"gas","probability":0.3700051308,"time_start":317.2399902344,"time_end":317.8999938965,"thumbnail":null},{"id":44772,"transcription_id":23,"word":"station","probability":0.9924231172,"time_start":317.8999938965,"time_end":318.5599975586,"thumbnail":null},{"id":44773,"transcription_id":23,"word":"over","probability":0.4848566055,"time_start":318.5599975586,"time_end":319.2600097656,"thumbnail":null},{"id":44774,"transcription_id":23,"word":"here","probability":0.8687791228,"time_start":319.2600097656,"time_end":319.5199890137,"thumbnail":null},{"id":44775,"transcription_id":23,"word":"on","probability":0.9458527565,"time_start":319.5199890137,"time_end":319.700012207,"thumbnail":null},{"id":44776,"transcription_id":23,"word":"the","probability":0.9929689765,"time_start":319.700012207,"time_end":319.8200073242,"thumbnail":null},{"id":44777,"transcription_id":23,"word":"left","probability":0.9981270432,"time_start":319.8200073242,"time_end":320.2799987793,"thumbnail":null},{"id":44778,"transcription_id":23,"word":"an","probability":0.3071890175,"time_start":321.0799865723,"time_end":321.5400085449,"thumbnail":null},{"id":44779,"transcription_id":23,"word":"exon","probability":0.5414979458,"time_start":321.5400085449,"time_end":322.0,"thumbnail":null},{"id":44780,"transcription_id":23,"word":"circle","probability":0.8672246933,"time_start":322.9800109863,"time_end":323.7200012207,"thumbnail":null},{"id":44781,"transcription_id":23,"word":"k","probability":0.9571683407,"time_start":323.7200012207,"time_end":324.0199890137,"thumbnail":null},{"id":44782,"transcription_id":23,"word":"all","probability":0.3006380498,"time_start":325.1400146484,"time_end":325.2200012207,"thumbnail":null},{"id":44783,"transcription_id":23,"word":"right","probability":0.9961299896,"time_start":325.2200012207,"time_end":326.4800109863,"thumbnail":null},{"id":44784,"transcription_id":23,"word":"heres","probability":0.9756688476,"time_start":326.700012207,"time_end":326.9599914551,"thumbnail":null},{"id":44785,"transcription_id":23,"word":"oh","probability":0.8478306532,"time_start":327.0199890137,"time_end":327.1400146484,"thumbnail":null},{"id":44786,"transcription_id":23,"word":"a","probability":0.9122396111,"time_start":327.299987793,"time_end":327.3200073242,"thumbnail":null},{"id":44787,"transcription_id":23,"word":"gas","probability":0.9964365959,"time_start":327.3200073242,"time_end":327.4599914551,"thumbnail":null},{"id":44788,"transcription_id":23,"word":"station","probability":0.9997676015,"time_start":327.4599914551,"time_end":327.8800048828,"thumbnail":null},{"id":44789,"transcription_id":23,"word":"on","probability":0.9685566425,"time_start":327.8800048828,"time_end":328.0799865723,"thumbnail":null},{"id":44790,"transcription_id":23,"word":"the","probability":0.9990436435,"time_start":328.0799865723,"time_end":328.2200012207,"thumbnail":null},{"id":44791,"transcription_id":23,"word":"right","probability":0.994838655,"time_start":328.2200012207,"time_end":328.5,"thumbnail":null},{"id":44792,"transcription_id":23,"word":"marathon","probability":0.8192506433,"time_start":328.799987793,"time_end":329.2600097656,"thumbnail":null},{"id":44793,"transcription_id":23,"word":"yeah","probability":0.0518042743,"time_start":331.2399902344,"time_end":332.0199890137,"thumbnail":null},{"id":44794,"transcription_id":23,"word":"yeah","probability":0.1187673584,"time_start":332.3399963379,"time_end":332.8200073242,"thumbnail":null},{"id":44795,"transcription_id":23,"word":"yeah","probability":0.1388518065,"time_start":333.3399963379,"time_end":334.1199951172,"thumbnail":null},{"id":44796,"transcription_id":23,"word":"yeah","probability":0.1582822949,"time_start":334.8800048828,"time_end":335.1400146484,"thumbnail":null},{"id":44797,"transcription_id":23,"word":"is","probability":0.092026338,"time_start":335.6600036621,"time_end":336.0,"thumbnail":null},{"id":44798,"transcription_id":23,"word":"that","probability":0.8906918764,"time_start":336.0,"time_end":336.2399902344,"thumbnail":null},{"id":44799,"transcription_id":23,"word":"yield","probability":0.1282486916,"time_start":336.2399902344,"time_end":337.8800048828,"thumbnail":null},{"id":44800,"transcription_id":23,"word":"sign","probability":0.2667132914,"time_start":337.8800048828,"time_end":338.7799987793,"thumbnail":null},{"id":44801,"transcription_id":23,"word":"oh","probability":0.2096961886,"time_start":342.6400146484,"time_end":346.3599853516,"thumbnail":null},{"id":44802,"transcription_id":23,"word":"its","probability":0.3652951121,"time_start":346.5799865723,"time_end":346.9800109863,"thumbnail":null},{"id":44803,"transcription_id":23,"word":"me","probability":0.7373908162,"time_start":346.9800109863,"time_end":347.1600036621,"thumbnail":null},{"id":44804,"transcription_id":23,"word":"what","probability":0.7668482065,"time_start":347.9800109863,"time_end":351.9400024414,"thumbnail":null},{"id":44805,"transcription_id":23,"word":"kind","probability":0.9795937538,"time_start":351.9400024414,"time_end":352.1799926758,"thumbnail":null},{"id":44806,"transcription_id":23,"word":"of","probability":0.9960359931,"time_start":352.1799926758,"time_end":352.3200073242,"thumbnail":null},{"id":44807,"transcription_id":23,"word":"parts","probability":0.5071972013,"time_start":352.3200073242,"time_end":352.4800109863,"thumbnail":null},{"id":44808,"transcription_id":23,"word":"is","probability":0.3661010265,"time_start":352.4800109863,"time_end":352.7600097656,"thumbnail":null},{"id":44809,"transcription_id":23,"word":"this","probability":0.2539045215,"time_start":352.7600097656,"time_end":352.8599853516,"thumbnail":null},{"id":44810,"transcription_id":23,"word":"in","probability":0.2022648305,"time_start":352.8599853516,"time_end":352.9599914551,"thumbnail":null},{"id":44811,"transcription_id":23,"word":"front","probability":0.6177688241,"time_start":352.9599914551,"time_end":353.2200012207,"thumbnail":null},{"id":44812,"transcription_id":23,"word":"honda","probability":0.0019321032,"time_start":353.9400024414,"time_end":354.3200073242,"thumbnail":null},{"id":44813,"transcription_id":23,"word":"i","probability":0.2435032725,"time_start":362.1400146484,"time_end":362.6600036621,"thumbnail":null},{"id":44814,"transcription_id":23,"word":"want","probability":0.6577894092,"time_start":362.6600036621,"time_end":362.8999938965,"thumbnail":null},{"id":44815,"transcription_id":23,"word":"to","probability":0.9797942042,"time_start":362.8999938965,"time_end":363.1799926758,"thumbnail":null},{"id":44816,"transcription_id":23,"word":"take","probability":0.9238495231,"time_start":363.1799926758,"time_end":363.4400024414,"thumbnail":null},{"id":44817,"transcription_id":23,"word":"a","probability":0.9509004354,"time_start":363.4400024414,"time_end":363.6600036621,"thumbnail":null},{"id":44818,"transcription_id":23,"word":"picture","probability":0.9961600304,"time_start":363.6600036621,"time_end":364.1199951172,"thumbnail":null},{"id":44819,"transcription_id":23,"word":"of","probability":0.9386049509,"time_start":364.1199951172,"time_end":364.5199890137,"thumbnail":null},{"id":44820,"transcription_id":23,"word":"something","probability":0.1512899399,"time_start":364.5199890137,"time_end":364.8599853516,"thumbnail":null},{"id":44821,"transcription_id":23,"word":"so","probability":0.2856155634,"time_start":365.6199951172,"time_end":365.8800048828,"thumbnail":null},{"id":44822,"transcription_id":23,"word":"i","probability":0.8670474887,"time_start":365.8800048828,"time_end":365.9599914551,"thumbnail":null},{"id":44823,"transcription_id":23,"word":"can","probability":0.620197475,"time_start":365.9599914551,"time_end":366.1600036621,"thumbnail":null},{"id":44824,"transcription_id":23,"word":"zoom","probability":0.9519551396,"time_start":366.1600036621,"time_end":366.6199951172,"thumbnail":null},{"id":44825,"transcription_id":23,"word":"in","probability":0.987370491,"time_start":366.6199951172,"time_end":366.8800048828,"thumbnail":null},{"id":44826,"transcription_id":23,"word":"now","probability":0.5713244677,"time_start":366.8800048828,"time_end":367.1799926758,"thumbnail":null},{"id":44827,"transcription_id":23,"word":"i","probability":0.4483689368,"time_start":367.8999938965,"time_end":368.0,"thumbnail":null},{"id":44828,"transcription_id":23,"word":"dont","probability":0.9346036315,"time_start":368.0,"time_end":368.2399902344,"thumbnail":null},{"id":44829,"transcription_id":23,"word":"know","probability":0.9924170971,"time_start":368.2399902344,"time_end":368.4200134277,"thumbnail":null},{"id":44830,"transcription_id":23,"word":"if","probability":0.2977994978,"time_start":368.4200134277,"time_end":368.700012207,"thumbnail":null},{"id":44831,"transcription_id":23,"word":"its","probability":0.8805088401,"time_start":368.700012207,"time_end":369.1199951172,"thumbnail":null},{"id":44832,"transcription_id":23,"word":"a","probability":0.75658077,"time_start":369.1199951172,"time_end":369.1199951172,"thumbnail":null},{"id":44833,"transcription_id":23,"word":"creature","probability":0.970333159,"time_start":369.1199951172,"time_end":370.0599975586,"thumbnail":null},{"id":44834,"transcription_id":23,"word":"or","probability":0.7852749228,"time_start":370.0599975586,"time_end":370.3800048828,"thumbnail":null},{"id":44835,"transcription_id":23,"word":"something","probability":0.9955282807,"time_start":370.3800048828,"time_end":370.6799926758,"thumbnail":null},{"id":44836,"transcription_id":23,"word":"right","probability":0.1814678758,"time_start":371.0400085449,"time_end":371.2600097656,"thumbnail":null},{"id":44837,"transcription_id":23,"word":"here","probability":0.9771562815,"time_start":371.2600097656,"time_end":371.5199890137,"thumbnail":null},{"id":44838,"transcription_id":23,"word":"over","probability":0.6973676085,"time_start":371.8999938965,"time_end":372.5599975586,"thumbnail":null},{"id":44839,"transcription_id":23,"word":"there","probability":0.5775145292,"time_start":372.5599975586,"time_end":372.8999938965,"thumbnail":null},{"id":44840,"transcription_id":23,"word":"that","probability":0.2722503543,"time_start":373.1799926758,"time_end":373.299987793,"thumbnail":null},{"id":44841,"transcription_id":23,"word":"bundle","probability":0.9322663546,"time_start":373.299987793,"time_end":373.6600036621,"thumbnail":null},{"id":44842,"transcription_id":23,"word":"yeah","probability":0.562526226,"time_start":374.299987793,"time_end":374.5400085449,"thumbnail":null},{"id":44843,"transcription_id":23,"word":"yeah","probability":0.1405567527,"time_start":375.1600036621,"time_end":375.9599914551,"thumbnail":null},{"id":44844,"transcription_id":23,"word":"six","probability":0.3089624643,"time_start":376.2399902344,"time_end":376.5199890137,"thumbnail":null},{"id":44845,"transcription_id":23,"word":"or","probability":0.3570830226,"time_start":376.5199890137,"time_end":377.0199890137,"thumbnail":null},{"id":44846,"transcription_id":23,"word":"six","probability":0.62088871,"time_start":377.0199890137,"time_end":377.1400146484,"thumbnail":null},{"id":44847,"transcription_id":23,"word":"yeah","probability":0.2174027115,"time_start":377.6000061035,"time_end":377.8200073242,"thumbnail":null},{"id":44848,"transcription_id":23,"word":"the","probability":0.1020035073,"time_start":378.0,"time_end":378.1199951172,"thumbnail":null},{"id":44849,"transcription_id":23,"word":"same","probability":0.8728188872,"time_start":378.1199951172,"time_end":378.1600036621,"thumbnail":null},{"id":44850,"transcription_id":23,"word":"with","probability":0.167873621,"time_start":378.1600036621,"time_end":378.3999938965,"thumbnail":null},{"id":44851,"transcription_id":23,"word":"the","probability":0.266957581,"time_start":378.3999938965,"time_end":378.5,"thumbnail":null},{"id":44852,"transcription_id":23,"word":"yard","probability":0.1112561077,"time_start":378.5,"time_end":378.6799926758,"thumbnail":null},{"id":44853,"transcription_id":23,"word":"for","probability":0.4162501991,"time_start":378.6799926758,"time_end":378.9200134277,"thumbnail":null},{"id":44854,"transcription_id":23,"word":"the","probability":0.666734457,"time_start":378.9200134277,"time_end":379.1400146484,"thumbnail":null},{"id":44855,"transcription_id":23,"word":"other","probability":0.2574824989,"time_start":379.1400146484,"time_end":379.299987793,"thumbnail":null},{"id":44856,"transcription_id":23,"word":"oh","probability":0.56092453,"time_start":379.5199890137,"time_end":379.700012207,"thumbnail":null},{"id":44857,"transcription_id":23,"word":"yeah","probability":0.8716918826,"time_start":379.7799987793,"time_end":379.8599853516,"thumbnail":null},{"id":44858,"transcription_id":23,"word":"theres","probability":0.7960364223,"time_start":379.8599853516,"time_end":380.1000061035,"thumbnail":null},{"id":44859,"transcription_id":23,"word":"a","probability":0.990590632,"time_start":380.1000061035,"time_end":380.1799926758,"thumbnail":null},{"id":44860,"transcription_id":23,"word":"scroll","probability":0.3813903928,"time_start":380.1799926758,"time_end":380.4400024414,"thumbnail":null},{"id":44861,"transcription_id":23,"word":"over","probability":0.1413319707,"time_start":380.4400024414,"time_end":380.6799926758,"thumbnail":null},{"id":44862,"transcription_id":23,"word":"there","probability":0.9808458686,"time_start":380.6799926758,"time_end":380.799987793,"thumbnail":null},{"id":44863,"transcription_id":23,"word":"its","probability":0.8093599677,"time_start":381.0599975586,"time_end":381.2200012207,"thumbnail":null},{"id":44864,"transcription_id":23,"word":"really","probability":0.9471408725,"time_start":381.2200012207,"time_end":381.3999938965,"thumbnail":null},{"id":44865,"transcription_id":23,"word":"cute","probability":0.7586978674,"time_start":381.3999938965,"time_end":381.6600036621,"thumbnail":null},{"id":44866,"transcription_id":23,"word":"the","probability":0.0326871425,"time_start":385.1199951172,"time_end":385.7200012207,"thumbnail":null},{"id":44867,"transcription_id":23,"word":"car","probability":0.0025344982,"time_start":385.7200012207,"time_end":385.9200134277,"thumbnail":null},{"id":44868,"transcription_id":23,"word":"is","probability":0.7313065529,"time_start":385.9200134277,"time_end":386.3200073242,"thumbnail":null},{"id":44869,"transcription_id":23,"word":"like","probability":0.2975207865,"time_start":386.3200073242,"time_end":386.5599975586,"thumbnail":null},{"id":44870,"transcription_id":23,"word":"a","probability":0.7111646533,"time_start":386.5599975586,"time_end":386.7600097656,"thumbnail":null},{"id":44871,"transcription_id":23,"word":"six","probability":0.2180946767,"time_start":386.7600097656,"time_end":386.9800109863,"thumbnail":null},{"id":44872,"transcription_id":23,"word":"story","probability":0.1961171329,"time_start":386.9800109863,"time_end":387.4400024414,"thumbnail":null},{"id":44873,"transcription_id":23,"word":"building","probability":0.1036757007,"time_start":387.4400024414,"time_end":388.2600097656,"thumbnail":null},{"id":44874,"transcription_id":23,"word":"mm","probability":0.2126361132,"time_start":388.8800048828,"time_end":389.1000061035,"thumbnail":null},{"id":44875,"transcription_id":23,"word":"hmm","probability":0.8618932366,"time_start":389.1000061035,"time_end":389.4800109863,"thumbnail":null},{"id":44876,"transcription_id":23,"word":"and","probability":0.3543471396,"time_start":390.299987793,"time_end":390.6400146484,"thumbnail":null},{"id":44877,"transcription_id":23,"word":"the","probability":0.1104243323,"time_start":390.6400146484,"time_end":390.8200073242,"thumbnail":null},{"id":44878,"transcription_id":23,"word":"left","probability":0.2983753681,"time_start":390.8200073242,"time_end":390.9599914551,"thumbnail":null},{"id":44879,"transcription_id":23,"word":"for","probability":0.2460098714,"time_start":390.9599914551,"time_end":391.1199951172,"thumbnail":null},{"id":44880,"transcription_id":23,"word":"all","probability":0.0884165689,"time_start":391.1199951172,"time_end":391.3800048828,"thumbnail":null},{"id":44881,"transcription_id":23,"word":"the","probability":0.8890433908,"time_start":391.3800048828,"time_end":391.4800109863,"thumbnail":null},{"id":44882,"transcription_id":23,"word":"green","probability":0.1084148884,"time_start":391.4800109863,"time_end":391.700012207,"thumbnail":null},{"id":44883,"transcription_id":23,"word":"and","probability":0.6038920879,"time_start":392.0,"time_end":392.1000061035,"thumbnail":null},{"id":44884,"transcription_id":23,"word":"the","probability":0.9746890664,"time_start":392.1000061035,"time_end":392.2200012207,"thumbnail":null},{"id":44885,"transcription_id":23,"word":"dog","probability":0.2558438182,"time_start":392.2200012207,"time_end":392.4200134277,"thumbnail":null},{"id":44886,"transcription_id":23,"word":"is","probability":0.3125094473,"time_start":392.4200134277,"time_end":392.7200012207,"thumbnail":null},{"id":44887,"transcription_id":23,"word":"a","probability":0.0747729763,"time_start":392.7200012207,"time_end":392.8999938965,"thumbnail":null},{"id":44888,"transcription_id":23,"word":"different","probability":0.0371509045,"time_start":392.8999938965,"time_end":392.9599914551,"thumbnail":null},{"id":44889,"transcription_id":23,"word":"oh","probability":0.2584047019,"time_start":393.2200012207,"time_end":393.4200134277,"thumbnail":null},{"id":44890,"transcription_id":23,"word":"thats","probability":0.6150534153,"time_start":393.7799987793,"time_end":394.5599975586,"thumbnail":null},{"id":44891,"transcription_id":23,"word":"a","probability":0.3307917416,"time_start":394.5599975586,"time_end":394.6400146484,"thumbnail":null},{"id":44892,"transcription_id":23,"word":"different","probability":0.7947639823,"time_start":394.6400146484,"time_end":394.8599853516,"thumbnail":null},{"id":44893,"transcription_id":23,"word":"one","probability":0.172288999,"time_start":394.8599853516,"time_end":395.0199890137,"thumbnail":null},{"id":44894,"transcription_id":23,"word":"theres","probability":0.7002956867,"time_start":395.5799865723,"time_end":396.200012207,"thumbnail":null},{"id":44895,"transcription_id":23,"word":"a","probability":0.3858645856,"time_start":396.200012207,"time_end":396.3200073242,"thumbnail":null},{"id":44896,"transcription_id":23,"word":"part","probability":0.2602469325,"time_start":396.3200073242,"time_end":396.6400146484,"thumbnail":null},{"id":44897,"transcription_id":23,"word":"over","probability":0.4401164055,"time_start":396.6400146484,"time_end":397.1000061035,"thumbnail":null},{"id":44898,"transcription_id":23,"word":"there","probability":0.5391762853,"time_start":397.1000061035,"time_end":397.7799987793,"thumbnail":null},{"id":44899,"transcription_id":23,"word":"its","probability":0.7422594428,"time_start":398.1799926758,"time_end":398.4599914551,"thumbnail":null},{"id":44900,"transcription_id":23,"word":"greener","probability":0.2334089726,"time_start":398.4599914551,"time_end":399.1400146484,"thumbnail":null},{"id":44901,"transcription_id":23,"word":"and","probability":0.3475980759,"time_start":400.6600036621,"time_end":401.4800109863,"thumbnail":null},{"id":44902,"transcription_id":23,"word":"the","probability":0.5008465052,"time_start":401.4800109863,"time_end":402.2600097656,"thumbnail":null},{"id":44903,"transcription_id":23,"word":"pedestrian","probability":0.56327492,"time_start":402.2600097656,"time_end":402.8200073242,"thumbnail":null},{"id":44904,"transcription_id":23,"word":"crossing","probability":0.8925856352,"time_start":402.8200073242,"time_end":403.4599914551,"thumbnail":null},{"id":44905,"transcription_id":23,"word":"inside","probability":0.1637332886,"time_start":403.4599914551,"time_end":404.0,"thumbnail":null},{"id":44906,"transcription_id":23,"word":"is","probability":0.5163370967,"time_start":404.0,"time_end":407.8399963379,"thumbnail":null},{"id":44907,"transcription_id":23,"word":"is","probability":0.0626406148,"time_start":407.8399963379,"time_end":410.0,"thumbnail":null},{"id":44908,"transcription_id":23,"word":"that","probability":0.6840603948,"time_start":410.0,"time_end":410.799987793,"thumbnail":null},{"id":44909,"transcription_id":23,"word":"what","probability":0.4557673633,"time_start":410.799987793,"time_end":411.3800048828,"thumbnail":null},{"id":44910,"transcription_id":23,"word":"do","probability":0.2598206401,"time_start":411.3800048828,"time_end":411.5799865723,"thumbnail":null},{"id":44911,"transcription_id":23,"word":"you","probability":0.8209851384,"time_start":411.5799865723,"time_end":411.6000061035,"thumbnail":null},{"id":44912,"transcription_id":23,"word":"have","probability":0.94272995,"time_start":411.6000061035,"time_end":411.7799987793,"thumbnail":null},{"id":44913,"transcription_id":23,"word":"i","probability":0.119367063,"time_start":412.5599975586,"time_end":412.5599975586,"thumbnail":null},{"id":44914,"transcription_id":23,"word":"dont","probability":0.5600680113,"time_start":412.5599975586,"time_end":412.7200012207,"thumbnail":null},{"id":44915,"transcription_id":23,"word":"know","probability":0.8863489628,"time_start":412.7200012207,"time_end":413.4599914551,"thumbnail":null},{"id":44916,"transcription_id":23,"word":"oh","probability":0.053700503,"time_start":414.1000061035,"time_end":414.7600097656,"thumbnail":null},{"id":44917,"transcription_id":23,"word":"three","probability":0.5752960443,"time_start":415.0199890137,"time_end":415.299987793,"thumbnail":null},{"id":44918,"transcription_id":23,"word":"way","probability":0.5341773033,"time_start":415.299987793,"time_end":415.4599914551,"thumbnail":null},{"id":44919,"transcription_id":23,"word":"signs","probability":0.9664262533,"time_start":415.4599914551,"time_end":415.8599853516,"thumbnail":null},{"id":44920,"transcription_id":23,"word":"im","probability":0.2496437579,"time_start":416.9599914551,"time_end":418.0599975586,"thumbnail":null},{"id":44921,"transcription_id":23,"word":"able","probability":0.1165130064,"time_start":418.0599975586,"time_end":418.0599975586,"thumbnail":null},{"id":44922,"transcription_id":23,"word":"to","probability":0.9949069619,"time_start":418.0599975586,"time_end":418.2799987793,"thumbnail":null},{"id":44923,"transcription_id":23,"word":"watch","probability":0.9544251561,"time_start":418.2799987793,"time_end":418.6600036621,"thumbnail":null},{"id":44924,"transcription_id":23,"word":"the","probability":0.61742419,"time_start":418.6600036621,"time_end":418.8999938965,"thumbnail":null},{"id":44925,"transcription_id":23,"word":"one","probability":0.1833827794,"time_start":418.8999938965,"time_end":419.1000061035,"thumbnail":null},{"id":44926,"transcription_id":23,"word":"mm","probability":0.0059859324,"time_start":420.1799926758,"time_end":420.3200073242,"thumbnail":null},{"id":44927,"transcription_id":23,"word":"thats","probability":0.2976059914,"time_start":421.0599975586,"time_end":421.2600097656,"thumbnail":null},{"id":44928,"transcription_id":23,"word":"interesting","probability":0.2093271464,"time_start":421.2600097656,"time_end":421.5199890137,"thumbnail":null},{"id":44929,"transcription_id":23,"word":"you","probability":0.1188658625,"time_start":422.0599975586,"time_end":422.2799987793,"thumbnail":null},{"id":44930,"transcription_id":23,"word":"guys","probability":0.8601261377,"time_start":422.2799987793,"time_end":422.4599914551,"thumbnail":null},{"id":44931,"transcription_id":23,"word":"were","probability":0.2162177563,"time_start":422.4599914551,"time_end":422.700012207,"thumbnail":null},{"id":44932,"transcription_id":23,"word":"looking","probability":0.0677002743,"time_start":422.700012207,"time_end":422.9800109863,"thumbnail":null},{"id":44933,"transcription_id":23,"word":"at","probability":0.2155999392,"time_start":422.9800109863,"time_end":423.3399963379,"thumbnail":null},{"id":44934,"transcription_id":23,"word":"the","probability":0.57113415,"time_start":423.3399963379,"time_end":424.1199951172,"thumbnail":null},{"id":44935,"transcription_id":23,"word":"side","probability":0.6313377023,"time_start":424.1199951172,"time_end":424.5400085449,"thumbnail":null},{"id":44936,"transcription_id":23,"word":"bars","probability":0.9338873029,"time_start":424.5400085449,"time_end":424.9200134277,"thumbnail":null},{"id":44937,"transcription_id":23,"word":"signed","probability":0.3315567672,"time_start":425.2799987793,"time_end":425.9200134277,"thumbnail":null},{"id":44938,"transcription_id":23,"word":"we","probability":0.268568188,"time_start":425.9400024414,"time_end":426.0400085449,"thumbnail":null},{"id":44939,"transcription_id":23,"word":"were","probability":0.673895061,"time_start":426.0400085449,"time_end":426.2399902344,"thumbnail":null},{"id":44940,"transcription_id":23,"word":"going","probability":0.9799382091,"time_start":426.2399902344,"time_end":426.3800048828,"thumbnail":null},{"id":44941,"transcription_id":23,"word":"to","probability":0.9535326362,"time_start":426.3800048828,"time_end":426.700012207,"thumbnail":null},{"id":44942,"transcription_id":23,"word":"wait","probability":0.174059689,"time_start":426.700012207,"time_end":426.8999938965,"thumbnail":null},{"id":44943,"transcription_id":23,"word":"for","probability":0.9634473324,"time_start":426.8999938965,"time_end":427.1000061035,"thumbnail":null},{"id":44944,"transcription_id":23,"word":"the","probability":0.4594278038,"time_start":427.1000061035,"time_end":427.299987793,"thumbnail":null},{"id":44945,"transcription_id":23,"word":"north","probability":0.7660033107,"time_start":428.7399902344,"time_end":429.2799987793,"thumbnail":null},{"id":44946,"transcription_id":23,"word":"in","probability":0.5463052392,"time_start":429.2799987793,"time_end":429.700012207,"thumbnail":null},{"id":44947,"transcription_id":23,"word":"south","probability":0.8306401372,"time_start":430.2200012207,"time_end":430.7600097656,"thumbnail":null},{"id":44948,"transcription_id":23,"word":"the","probability":0.1154986024,"time_start":431.200012207,"time_end":431.3599853516,"thumbnail":null},{"id":44949,"transcription_id":23,"word":"neighbor","probability":0.0675142556,"time_start":431.3599853516,"time_end":431.5799865723,"thumbnail":null},{"id":44950,"transcription_id":23,"word":"the","probability":0.2018229961,"time_start":431.9800109863,"time_end":432.2200012207,"thumbnail":null},{"id":44951,"transcription_id":23,"word":"honda","probability":0.0016219117,"time_start":432.2200012207,"time_end":432.5,"thumbnail":null},{"id":44952,"transcription_id":23,"word":"the","probability":0.3257810175,"time_start":432.7399902344,"time_end":432.9599914551,"thumbnail":null},{"id":44953,"transcription_id":23,"word":"neighbor","probability":0.6049091816,"time_start":432.9599914551,"time_end":433.1199951172,"thumbnail":null},{"id":44954,"transcription_id":23,"word":"was","probability":0.2451305836,"time_start":433.1199951172,"time_end":433.5,"thumbnail":null},{"id":44955,"transcription_id":23,"word":"going","probability":0.409181118,"time_start":433.5,"time_end":433.7600097656,"thumbnail":null},{"id":44956,"transcription_id":23,"word":"okay","probability":0.1151232198,"time_start":434.3999938965,"time_end":434.7200012207,"thumbnail":null},{"id":44957,"transcription_id":23,"word":"man","probability":0.5868214965,"time_start":434.8800048828,"time_end":434.9800109863,"thumbnail":null},{"id":44958,"transcription_id":23,"word":"its","probability":0.6448913813,"time_start":436.4599914551,"time_end":437.4599914551,"thumbnail":null},{"id":44959,"transcription_id":23,"word":"in","probability":0.2621262968,"time_start":437.4599914551,"time_end":437.5400085449,"thumbnail":null},{"id":44960,"transcription_id":23,"word":"the","probability":0.2178332508,"time_start":437.5400085449,"time_end":437.7799987793,"thumbnail":null},{"id":44961,"transcription_id":23,"word":"side","probability":0.1473472416,"time_start":437.7799987793,"time_end":438.0799865723,"thumbnail":null},{"id":44962,"transcription_id":23,"word":"of","probability":0.2226897031,"time_start":438.0799865723,"time_end":438.299987793,"thumbnail":null},{"id":44963,"transcription_id":23,"word":"the","probability":0.6903335452,"time_start":438.299987793,"time_end":438.6000061035,"thumbnail":null},{"id":44964,"transcription_id":23,"word":"green","probability":0.0076705557,"time_start":438.6000061035,"time_end":438.9599914551,"thumbnail":null},{"id":44965,"transcription_id":23,"word":"the","probability":0.0981503204,"time_start":438.9599914551,"time_end":439.3399963379,"thumbnail":null},{"id":44966,"transcription_id":23,"word":"field","probability":0.2420642823,"time_start":439.3399963379,"time_end":439.5799865723,"thumbnail":null},{"id":44967,"transcription_id":23,"word":"sign","probability":0.7842235565,"time_start":439.5799865723,"time_end":440.1400146484,"thumbnail":null},{"id":44968,"transcription_id":23,"word":"on","probability":0.7146828771,"time_start":440.2200012207,"time_end":440.3200073242,"thumbnail":null},{"id":44969,"transcription_id":23,"word":"the","probability":0.9961458445,"time_start":440.3200073242,"time_end":440.5,"thumbnail":null},{"id":44970,"transcription_id":23,"word":"ground","probability":0.967012167,"time_start":440.5,"time_end":440.7799987793,"thumbnail":null},{"id":44971,"transcription_id":23,"word":"it","probability":0.1137165278,"time_start":441.1199951172,"time_end":441.2200012207,"thumbnail":null},{"id":44972,"transcription_id":23,"word":"okay","probability":0.2130440176,"time_start":441.7600097656,"time_end":442.3800048828,"thumbnail":null},{"id":44973,"transcription_id":23,"word":"are","probability":0.1849109977,"time_start":443.0,"time_end":444.2600097656,"thumbnail":null},{"id":44974,"transcription_id":23,"word":"you","probability":0.9527779818,"time_start":444.2600097656,"time_end":444.4400024414,"thumbnail":null},{"id":44975,"transcription_id":23,"word":"going","probability":0.0349664427,"time_start":444.4400024414,"time_end":444.6799926758,"thumbnail":null},{"id":44976,"transcription_id":23,"word":"to","probability":0.9065899849,"time_start":444.6799926758,"time_end":444.8999938965,"thumbnail":null},{"id":44977,"transcription_id":23,"word":"stop","probability":0.9847248197,"time_start":444.8999938965,"time_end":445.0199890137,"thumbnail":null},{"id":44978,"transcription_id":23,"word":"it","probability":0.724496603,"time_start":445.0199890137,"time_end":445.1600036621,"thumbnail":null},{"id":44979,"transcription_id":23,"word":"i","probability":0.4094020426,"time_start":445.6799926758,"time_end":446.3599853516,"thumbnail":null},{"id":44980,"transcription_id":23,"word":"dont","probability":0.7465174794,"time_start":446.3599853516,"time_end":446.3999938965,"thumbnail":null},{"id":44981,"transcription_id":23,"word":"know","probability":0.7948579192,"time_start":446.3999938965,"time_end":446.5400085449,"thumbnail":null},{"id":44982,"transcription_id":23,"word":"i","probability":0.5829082131,"time_start":446.5400085449,"time_end":446.7799987793,"thumbnail":null},{"id":44983,"transcription_id":23,"word":"want","probability":0.5760114193,"time_start":446.7799987793,"time_end":446.8200073242,"thumbnail":null},{"id":44984,"transcription_id":23,"word":"to","probability":0.8833135366,"time_start":446.8200073242,"time_end":446.8999938965,"thumbnail":null},{"id":44985,"transcription_id":23,"word":"capture","probability":0.9502439499,"time_start":446.8999938965,"time_end":447.3599853516,"thumbnail":null},{"id":44986,"transcription_id":23,"word":"the","probability":0.9951636791,"time_start":447.3599853516,"time_end":447.6199951172,"thumbnail":null},{"id":44987,"transcription_id":23,"word":"freeway","probability":0.9794538617,"time_start":447.6199951172,"time_end":448.0199890137,"thumbnail":null},{"id":44988,"transcription_id":23,"word":"entrance","probability":0.9882448912,"time_start":448.0199890137,"time_end":448.3800048828,"thumbnail":null},{"id":44989,"transcription_id":23,"word":"its","probability":0.2851269543,"time_start":449.3599853516,"time_end":449.7600097656,"thumbnail":null},{"id":44990,"transcription_id":23,"word":"up","probability":0.1812659651,"time_start":449.7600097656,"time_end":449.7799987793,"thumbnail":null},{"id":44991,"transcription_id":23,"word":"to","probability":0.9483089447,"time_start":449.7799987793,"time_end":449.9400024414,"thumbnail":null},{"id":44992,"transcription_id":23,"word":"you","probability":0.9934990406,"time_start":449.9400024414,"time_end":450.1000061035,"thumbnail":null},{"id":44993,"transcription_id":23,"word":"we","probability":0.5083340406,"time_start":450.5,"time_end":451.9599914551,"thumbnail":null},{"id":44994,"transcription_id":23,"word":"can","probability":0.298451215,"time_start":451.9599914551,"time_end":452.0400085449,"thumbnail":null},{"id":44995,"transcription_id":23,"word":"stop","probability":0.8590672016,"time_start":452.0400085449,"time_end":452.299987793,"thumbnail":null},{"id":44996,"transcription_id":23,"word":"it","probability":0.9517086148,"time_start":452.299987793,"time_end":452.5599975586,"thumbnail":null},{"id":44997,"transcription_id":23,"word":"yeah","probability":0.4084045291,"time_start":453.4599914551,"time_end":453.6400146484,"thumbnail":null},{"id":44998,"transcription_id":23,"word":"this","probability":0.4657978117,"time_start":453.700012207,"time_end":453.8200073242,"thumbnail":null},{"id":44999,"transcription_id":23,"word":"one","probability":0.1956510097,"time_start":453.8200073242,"time_end":453.9400024414,"thumbnail":null},{"id":45000,"transcription_id":23,"word":"i","probability":0.8155462742,"time_start":454.0400085449,"time_end":454.1400146484,"thumbnail":null},{"id":45001,"transcription_id":23,"word":"cant","probability":0.7058247924,"time_start":454.1400146484,"time_end":454.299987793,"thumbnail":null},{"id":45002,"transcription_id":23,"word":"i","probability":0.3878030479,"time_start":454.299987793,"time_end":454.4200134277,"thumbnail":null},{"id":45003,"transcription_id":23,"word":"cant","probability":0.7023558617,"time_start":454.4200134277,"time_end":454.4200134277,"thumbnail":null},{"id":45004,"transcription_id":23,"word":"i","probability":0.3578133285,"time_start":454.4200134277,"time_end":454.5400085449,"thumbnail":null},{"id":45005,"transcription_id":23,"word":"cant","probability":0.814994216,"time_start":454.5400085449,"time_end":454.6000061035,"thumbnail":null},{"id":45006,"transcription_id":23,"word":"i","probability":0.1697223634,"time_start":455.3399963379,"time_end":455.3399963379,"thumbnail":null},{"id":45007,"transcription_id":23,"word":"cant","probability":0.7921673059,"time_start":455.3399963379,"time_end":456.5199890137,"thumbnail":null},{"id":45008,"transcription_id":23,"word":"i","probability":0.121739082,"time_start":456.5199890137,"time_end":457.2399902344,"thumbnail":null},{"id":45009,"transcription_id":23,"word":"cant","probability":0.7439101338,"time_start":457.2399902344,"time_end":458.2399902344,"thumbnail":null},{"id":45010,"transcription_id":23,"word":"check","probability":0.5413028002,"time_start":458.2399902344,"time_end":458.6000061035,"thumbnail":null},{"id":45011,"transcription_id":23,"word":"out","probability":0.418972671,"time_start":458.6000061035,"time_end":458.9599914551,"thumbnail":null},{"id":45012,"transcription_id":23,"word":"it","probability":0.3788081408,"time_start":458.9599914551,"time_end":459.1400146484,"thumbnail":null},{"id":45013,"transcription_id":23,"word":"oh","probability":0.4164632559,"time_start":459.6000061035,"time_end":461.2200012207,"thumbnail":null},{"id":45014,"transcription_id":23,"word":"where","probability":0.7976079583,"time_start":461.7600097656,"time_end":462.0599975586,"thumbnail":null},{"id":45015,"transcription_id":23,"word":"were","probability":0.5544633269,"time_start":462.0599975586,"time_end":462.4800109863,"thumbnail":null},{"id":45016,"transcription_id":23,"word":"going","probability":0.4944253862,"time_start":462.4800109863,"time_end":462.700012207,"thumbnail":null},{"id":45017,"transcription_id":23,"word":"again","probability":0.9324650764,"time_start":462.700012207,"time_end":462.9800109863,"thumbnail":null},{"id":45018,"transcription_id":23,"word":"its","probability":0.5487004519,"time_start":464.0799865723,"time_end":465.1199951172,"thumbnail":null},{"id":45019,"transcription_id":23,"word":"over","probability":0.1463564485,"time_start":465.1199951172,"time_end":465.2200012207,"thumbnail":null},{"id":45020,"transcription_id":23,"word":"its","probability":0.5998573899,"time_start":465.4800109863,"time_end":465.4800109863,"thumbnail":null},{"id":45021,"transcription_id":23,"word":"over","probability":0.7982450724,"time_start":465.4800109863,"time_end":465.5799865723,"thumbnail":null},{"id":45022,"transcription_id":23,"word":"i","probability":0.2319813967,"time_start":465.799987793,"time_end":466.1000061035,"thumbnail":null},{"id":45023,"transcription_id":23,"word":"cant","probability":0.7427505255,"time_start":466.1000061035,"time_end":466.3399963379,"thumbnail":null},{"id":45544,"transcription_id":29,"word":"carbidstruck","probability":0.6666554213,"time_start":7.0199999809,"time_end":8.220000267,"thumbnail":null},{"id":45545,"transcription_id":29,"word":"here","probability":0.1608713865,"time_start":8.220000267,"time_end":8.279999733,"thumbnail":null},{"id":45546,"transcription_id":29,"word":"comes","probability":0.9311726093,"time_start":8.279999733,"time_end":9.4200000763,"thumbnail":null},{"id":45547,"transcription_id":29,"word":"the","probability":0.6959140897,"time_start":9.4200000763,"time_end":9.6000003815,"thumbnail":null},{"id":45548,"transcription_id":29,"word":"bmw","probability":0.9951183796,"time_start":9.6000003815,"time_end":10.0,"thumbnail":null},{"id":45549,"transcription_id":29,"word":"driving","probability":0.9005463123,"time_start":10.0,"time_end":10.5399999619,"thumbnail":null},{"id":45550,"transcription_id":29,"word":"by","probability":0.7318367958,"time_start":10.5399999619,"time_end":11.1999998093,"thumbnail":null},{"id":45551,"transcription_id":29,"word":"that","probability":0.6310061812,"time_start":11.1999998093,"time_end":14.7399997711,"thumbnail":null},{"id":45552,"transcription_id":29,"word":"one","probability":0.7808421254,"time_start":14.7399997711,"time_end":14.8999996185,"thumbnail":null},{"id":45553,"transcription_id":29,"word":"i","probability":0.7048959732,"time_start":14.8999996185,"time_end":15.0200004578,"thumbnail":null},{"id":45554,"transcription_id":29,"word":"dont","probability":0.9814890623,"time_start":15.0200004578,"time_end":15.1400003433,"thumbnail":null},{"id":45555,"transcription_id":29,"word":"know","probability":0.998478353,"time_start":15.1400003433,"time_end":16.7600002289,"thumbnail":null},{"id":45556,"transcription_id":29,"word":"a","probability":0.4507110417,"time_start":26.8600006104,"time_end":27.8199996948,"thumbnail":null},{"id":45557,"transcription_id":29,"word":"dodge","probability":0.2836501002,"time_start":27.8199996948,"time_end":28.2399997711,"thumbnail":null},{"id":45558,"transcription_id":29,"word":"another","probability":0.0456955209,"time_start":28.2399997711,"time_end":31.7800006866,"thumbnail":null},{"id":45559,"transcription_id":29,"word":"toyota","probability":0.9149185419,"time_start":31.7800006866,"time_end":31.7800006866,"thumbnail":null},{"id":45560,"transcription_id":29,"word":"another","probability":0.0000901091,"time_start":31.7800006866,"time_end":35.5400009155,"thumbnail":null},{"id":45561,"transcription_id":29,"word":"toyota","probability":0.9868059158,"time_start":35.5400009155,"time_end":39.7799987793,"thumbnail":null},{"id":45562,"transcription_id":29,"word":"across","probability":0.3393396139,"time_start":39.7799987793,"time_end":40.2599983215,"thumbnail":null},{"id":45563,"transcription_id":29,"word":"the","probability":0.9917405844,"time_start":40.2599983215,"time_end":40.4799995422,"thumbnail":null},{"id":45564,"transcription_id":29,"word":"street","probability":0.9766652584,"time_start":40.4799995422,"time_end":40.8199996948,"thumbnail":null},{"id":45565,"transcription_id":29,"word":"theres","probability":0.7166048884,"time_start":40.8199996948,"time_end":43.2400016785,"thumbnail":null},{"id":45566,"transcription_id":29,"word":"a","probability":0.9351719022,"time_start":43.2400016785,"time_end":43.3600006104,"thumbnail":null},{"id":45567,"transcription_id":29,"word":"subaru","probability":0.3814371228,"time_start":43.3600006104,"time_end":43.7400016785,"thumbnail":null},{"id":45568,"transcription_id":29,"word":"first","probability":0.0629576221,"time_start":53.4000015259,"time_end":54.1599998474,"thumbnail":null},{"id":45569,"transcription_id":29,"word":"a","probability":0.1907964647,"time_start":54.1599998474,"time_end":54.3600006104,"thumbnail":null},{"id":45570,"transcription_id":29,"word":"sweet","probability":0.5798617005,"time_start":54.3600006104,"time_end":54.7400016785,"thumbnail":null},{"id":45571,"transcription_id":29,"word":"nissan","probability":0.0816910788,"time_start":54.7400016785,"time_end":55.2599983215,"thumbnail":null},{"id":45572,"transcription_id":29,"word":"altira","probability":0.4801424742,"time_start":55.2599983215,"time_end":55.9199981689,"thumbnail":null},{"id":45573,"transcription_id":29,"word":"pre","probability":0.172990948,"time_start":55.9199981689,"time_end":58.2200012207,"thumbnail":null},{"id":45574,"transcription_id":29,"word":"used","probability":0.2622750103,"time_start":58.2200012207,"time_end":58.4599990845,"thumbnail":null},{"id":45575,"transcription_id":29,"word":"with","probability":0.8474622965,"time_start":58.4599990845,"time_end":58.6599998474,"thumbnail":null},{"id":45576,"transcription_id":29,"word":"the","probability":0.6859664917,"time_start":58.6599998474,"time_end":58.7400016785,"thumbnail":null},{"id":45577,"transcription_id":29,"word":"damaged","probability":0.6036098599,"time_start":58.7400016785,"time_end":59.0400009155,"thumbnail":null},{"id":45578,"transcription_id":29,"word":"backside","probability":0.8984842896,"time_start":59.0400009155,"time_end":59.7400016785,"thumbnail":null},{"id":45579,"transcription_id":29,"word":"a","probability":0.0290624518,"time_start":63.4399986267,"time_end":66.1200027466,"thumbnail":null},{"id":45580,"transcription_id":29,"word":"audi","probability":0.0184689183,"time_start":66.1200027466,"time_end":66.3600006104,"thumbnail":null},{"id":45581,"transcription_id":29,"word":"heres","probability":0.4880731404,"time_start":66.3600006104,"time_end":78.8000030518,"thumbnail":null},{"id":45582,"transcription_id":29,"word":"another","probability":0.9636100531,"time_start":78.8000030518,"time_end":79.0,"thumbnail":null},{"id":45583,"transcription_id":29,"word":"toyota","probability":0.9977818131,"time_start":79.0,"time_end":79.6200027466,"thumbnail":null},{"id":45584,"transcription_id":29,"word":"another","probability":0.8526273966,"time_start":79.6200027466,"time_end":85.7200012207,"thumbnail":null},{"id":45585,"transcription_id":29,"word":"nissan","probability":0.9943903089,"time_start":85.7200012207,"time_end":86.1600036621,"thumbnail":null},{"id":45586,"transcription_id":29,"word":"centra","probability":0.4064854383,"time_start":86.1600036621,"time_end":88.2200012207,"thumbnail":null},{"id":45587,"transcription_id":29,"word":"the","probability":0.16277574,"time_start":91.7399978638,"time_end":93.5199966431,"thumbnail":null},{"id":45588,"transcription_id":29,"word":"mazda","probability":0.9471422434,"time_start":93.5199966431,"time_end":94.7600021362,"thumbnail":null},{"id":45589,"transcription_id":29,"word":"upcoming","probability":0.5412217975,"time_start":94.7600021362,"time_end":101.8000030518,"thumbnail":null},{"id":45590,"transcription_id":29,"word":"hyundai","probability":0.3314504027,"time_start":101.8000030518,"time_end":102.8600006104,"thumbnail":null},{"id":45591,"transcription_id":29,"word":"ionic","probability":0.4688867033,"time_start":102.8600006104,"time_end":103.5800018311,"thumbnail":null},{"id":45592,"transcription_id":29,"word":"in","probability":0.750811398,"time_start":103.5800018311,"time_end":106.7799987793,"thumbnail":null},{"id":45593,"transcription_id":29,"word":"front","probability":0.9648449421,"time_start":106.7799987793,"time_end":108.3600006104,"thumbnail":null},{"id":45594,"transcription_id":29,"word":"of","probability":0.997472465,"time_start":108.3600006104,"time_end":108.5999984741,"thumbnail":null},{"id":45595,"transcription_id":29,"word":"the","probability":0.9894021749,"time_start":108.5999984741,"time_end":108.6999969482,"thumbnail":null},{"id":45596,"transcription_id":29,"word":"ionic","probability":0.9352340698,"time_start":108.6999969482,"time_end":109.1399993896,"thumbnail":null},{"id":45597,"transcription_id":29,"word":"theres","probability":0.5178953409,"time_start":109.1399993896,"time_end":109.5999984741,"thumbnail":null},{"id":45598,"transcription_id":29,"word":"a","probability":0.9537980556,"time_start":109.5999984741,"time_end":109.7600021362,"thumbnail":null},{"id":45599,"transcription_id":29,"word":"volvo","probability":0.99413234,"time_start":109.7600021362,"time_end":110.0800018311,"thumbnail":null},{"id":45600,"transcription_id":29,"word":"s","probability":0.9428371787,"time_start":110.0800018311,"time_end":111.8000030518,"thumbnail":null},{"id":45601,"transcription_id":29,"word":"a","probability":0.0854512304,"time_start":113.5999984741,"time_end":114.0800018311,"thumbnail":null},{"id":45602,"transcription_id":29,"word":"ford","probability":0.0010084738,"time_start":114.0800018311,"time_end":114.1999969482,"thumbnail":null},{"id":45603,"transcription_id":29,"word":"of","probability":0.4626430273,"time_start":114.1999969482,"time_end":114.3799972534,"thumbnail":null},{"id":45604,"transcription_id":29,"word":"that","probability":0.9067549706,"time_start":114.3799972534,"time_end":114.5599975586,"thumbnail":null},{"id":45605,"transcription_id":29,"word":"a","probability":0.0455850996,"time_start":114.5599975586,"time_end":116.3199996948,"thumbnail":null},{"id":45606,"transcription_id":29,"word":"more","probability":0.3417660892,"time_start":116.3199996948,"time_end":116.5800018311,"thumbnail":null},{"id":45607,"transcription_id":29,"word":"as","probability":0.5589078665,"time_start":116.5800018311,"time_end":116.7600021362,"thumbnail":null},{"id":45608,"transcription_id":29,"word":"mini","probability":0.6214162707,"time_start":116.7600021362,"time_end":117.0400009155,"thumbnail":null},{"id":45609,"transcription_id":29,"word":"a","probability":0.3773587942,"time_start":117.0400009155,"time_end":120.1399993896,"thumbnail":null},{"id":45610,"transcription_id":29,"word":"toyota","probability":0.9996364117,"time_start":120.1399993896,"time_end":120.5400009155,"thumbnail":null},{"id":45611,"transcription_id":29,"word":"camry","probability":0.9348189235,"time_start":120.5400009155,"time_end":121.4199981689,"thumbnail":null},{"id":45612,"transcription_id":29,"word":"a","probability":0.9027773738,"time_start":121.4199981689,"time_end":122.8199996948,"thumbnail":null},{"id":45613,"transcription_id":29,"word":"car","probability":0.9614424109,"time_start":122.8199996948,"time_end":125.3600006104,"thumbnail":null},{"id":45614,"transcription_id":29,"word":"i","probability":0.4925997853,"time_start":125.3600006104,"time_end":126.5199966431,"thumbnail":null},{"id":45615,"transcription_id":29,"word":"do","probability":0.9644017816,"time_start":126.5199966431,"time_end":126.6800003052,"thumbnail":null},{"id":45616,"transcription_id":29,"word":"not","probability":0.9934706688,"time_start":126.6800003052,"time_end":126.8199996948,"thumbnail":null},{"id":45617,"transcription_id":29,"word":"know","probability":0.9948240519,"time_start":126.8199996948,"time_end":127.6200027466,"thumbnail":null},{"id":45618,"transcription_id":29,"word":"waiting","probability":0.7168313265,"time_start":127.6200027466,"time_end":130.6600036621,"thumbnail":null},{"id":45619,"transcription_id":29,"word":"in","probability":0.9287959337,"time_start":130.6600036621,"time_end":130.8600006104,"thumbnail":null},{"id":45620,"transcription_id":29,"word":"front","probability":0.9902887344,"time_start":130.8600006104,"time_end":131.0599975586,"thumbnail":null},{"id":45621,"transcription_id":29,"word":"of","probability":0.9950834513,"time_start":131.0599975586,"time_end":131.2799987793,"thumbnail":null},{"id":45622,"transcription_id":29,"word":"the","probability":0.9803940058,"time_start":131.2799987793,"time_end":131.3800048828,"thumbnail":null},{"id":45623,"transcription_id":29,"word":"traffic","probability":0.9470974803,"time_start":131.3800048828,"time_end":131.6199951172,"thumbnail":null},{"id":45624,"transcription_id":29,"word":"light","probability":0.9467471838,"time_start":131.6199951172,"time_end":132.5800018311,"thumbnail":null},{"id":45625,"transcription_id":29,"word":"looking","probability":0.9545134902,"time_start":132.5800018311,"time_end":135.4400024414,"thumbnail":null},{"id":45626,"transcription_id":29,"word":"at","probability":0.9946205616,"time_start":135.4400024414,"time_end":135.6399993896,"thumbnail":null},{"id":45627,"transcription_id":29,"word":"the","probability":0.9972189665,"time_start":135.6399993896,"time_end":135.7400054932,"thumbnail":null},{"id":45628,"transcription_id":29,"word":"back","probability":0.9893622994,"time_start":135.7400054932,"time_end":135.8999938965,"thumbnail":null},{"id":45629,"transcription_id":29,"word":"of","probability":0.9946574569,"time_start":135.8999938965,"time_end":136.0599975586,"thumbnail":null},{"id":45630,"transcription_id":29,"word":"a","probability":0.8924252391,"time_start":136.0599975586,"time_end":136.1399993896,"thumbnail":null},{"id":45631,"transcription_id":29,"word":"honda","probability":0.9810177088,"time_start":136.1399993896,"time_end":136.4799957275,"thumbnail":null},{"id":45632,"transcription_id":29,"word":"crossing","probability":0.1140824854,"time_start":137.3200073242,"time_end":138.4799957275,"thumbnail":null},{"id":45633,"transcription_id":29,"word":"the","probability":0.838922441,"time_start":138.4799957275,"time_end":139.1600036621,"thumbnail":null},{"id":45634,"transcription_id":29,"word":"zebra","probability":0.9258843064,"time_start":139.1600036621,"time_end":139.5,"thumbnail":null},{"id":45635,"transcription_id":29,"word":"crossing","probability":0.9822951555,"time_start":139.5,"time_end":139.9400024414,"thumbnail":null},{"id":45636,"transcription_id":29,"word":"now","probability":0.7435399294,"time_start":139.9400024414,"time_end":140.5200042725,"thumbnail":null},{"id":45637,"transcription_id":29,"word":"a","probability":0.0020408691,"time_start":162.0399932861,"time_end":165.2799987793,"thumbnail":null},{"id":45638,"transcription_id":29,"word":"ford","probability":0.0129871489,"time_start":165.2799987793,"time_end":165.6799926758,"thumbnail":null},{"id":45639,"transcription_id":29,"word":"the","probability":0.0256894957,"time_start":165.6799926758,"time_end":168.5200042725,"thumbnail":null},{"id":45640,"transcription_id":29,"word":"honda","probability":0.555434823,"time_start":168.5200042725,"time_end":168.8000030518,"thumbnail":null},{"id":45641,"transcription_id":29,"word":"driving","probability":0.370456636,"time_start":168.8000030518,"time_end":169.1999969482,"thumbnail":null},{"id":45642,"transcription_id":29,"word":"in","probability":0.9463240504,"time_start":169.1999969482,"time_end":169.5599975586,"thumbnail":null},{"id":45643,"transcription_id":29,"word":"a","probability":0.0011596024,"time_start":169.5599975586,"time_end":178.8600006104,"thumbnail":null},{"id":45644,"transcription_id":29,"word":"subaru","probability":0.2645172477,"time_start":178.8600006104,"time_end":187.3600006104,"thumbnail":null},{"id":45645,"transcription_id":29,"word":"forester","probability":0.9289082885,"time_start":187.3600006104,"time_end":188.1600036621,"thumbnail":null},{"id":45646,"transcription_id":29,"word":"thats","probability":0.6025037169,"time_start":188.1600036621,"time_end":192.8200073242,"thumbnail":null},{"id":45647,"transcription_id":29,"word":"it","probability":0.9958149791,"time_start":192.8200073242,"time_end":193.0399932861,"thumbnail":null}]') - self.gps = pandas.read_json('[{"id":2,"video_id":42,"location":"{\\"Time\\": 0.0, \\"UTC Time\\": 1688736616.0, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 1.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.3355598, \\"Longitude\\": -76.6201081, \\"Altitude (m)\\": 42.2, \\"Altitude (ft)\\": 139.0, \\"Speed (Km\\/h)\\": 0.0, \\"Heading\\": 0.0, \\"Accuracy (m)\\": 9.6, \\"Accel X\\": 0.02, \\"Accel Y\\": -0.02, \\"Accel Z\\": 0.11, \\"Brake (calculated)\\": 1.0, \\"Barometric Pressure (kPa)\\": 100.2, \\"Pressure Altitude (m)\\": 94.4}","timestamp":1688722216000,"latitude":39.3355598,"longitude":-76.6201081,"altitude":42.2},{"id":52,"video_id":42,"location":"{\\"Time\\": 2.503, \\"UTC Time\\": 1688736618.503, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.3355802, \\"Longitude\\": -76.6201194, \\"Altitude (m)\\": 43.6, \\"Altitude (ft)\\": 143.0, \\"Speed (Km\\/h)\\": 0.0, \\"Heading\\": 0.0, \\"Accuracy (m)\\": 4.3, \\"Accel X\\": 0.01, \\"Accel Y\\": -0.05, \\"Accel Z\\": 0.09, \\"Brake (calculated)\\": 1.0, \\"Barometric Pressure (kPa)\\": 100.19, \\"Pressure Altitude (m)\\": 94.5}","timestamp":1688722218503,"latitude":39.3355802,"longitude":-76.6201194,"altitude":43.6},{"id":102,"video_id":42,"location":"{\\"Time\\": 4.985, \\"UTC Time\\": 1688736620.985, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.3355761, \\"Longitude\\": -76.6201238, \\"Altitude (m)\\": 45.1, \\"Altitude (ft)\\": 148.0, \\"Speed (Km\\/h)\\": 0.0, \\"Heading\\": 0.0, \\"Accuracy (m)\\": 5.4, \\"Accel X\\": -0.12, \\"Accel Y\\": -0.03, \\"Accel Z\\": -0.02, \\"Brake (calculated)\\": 1.0, \\"Barometric Pressure (kPa)\\": 100.19, \\"Pressure Altitude (m)\\": 94.5}","timestamp":1688722220987,"latitude":39.3355761,"longitude":-76.6201238,"altitude":45.1},{"id":152,"video_id":42,"location":"{\\"Time\\": 7.447, \\"UTC Time\\": 1688736623.447, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 1.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.3355932, \\"Longitude\\": -76.6201228, \\"Altitude (m)\\": 45.5, \\"Altitude (ft)\\": 149.0, \\"Speed (Km\\/h)\\": 3.1, \\"Heading\\": 339.4, \\"Accuracy (m)\\": 6.4, \\"Accel X\\": -0.38, \\"Accel Y\\": -0.0, \\"Accel Z\\": -0.16, \\"Brake (calculated)\\": 0.0, \\"Barometric Pressure (kPa)\\": 100.19, \\"Pressure Altitude (m)\\": 94.5}","timestamp":1688722223447,"latitude":39.3355932,"longitude":-76.6201228,"altitude":45.5},{"id":202,"video_id":42,"location":"{\\"Time\\": 9.917, \\"UTC Time\\": 1688736625.917, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.3356048, \\"Longitude\\": -76.6201556, \\"Altitude (m)\\": 45.6, \\"Altitude (ft)\\": 150.0, \\"Speed (Km\\/h)\\": 5.7, \\"Heading\\": 281.6, \\"Accuracy (m)\\": 6.4, \\"Accel X\\": -0.39, \\"Accel Y\\": -0.01, \\"Accel Z\\": -0.22, \\"Brake (calculated)\\": 0.0, \\"Barometric Pressure (kPa)\\": 100.19, \\"Pressure Altitude (m)\\": 94.7}","timestamp":1688722225917,"latitude":39.3356048,"longitude":-76.6201556,"altitude":45.6},{"id":252,"video_id":42,"location":"{\\"Time\\": 12.394, \\"UTC Time\\": 1688736628.394, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.3356062, \\"Longitude\\": -76.6201958, \\"Altitude (m)\\": 45.5, \\"Altitude (ft)\\": 149.0, \\"Speed (Km\\/h)\\": 5.4, \\"Heading\\": 274.2, \\"Accuracy (m)\\": 7.5, \\"Accel X\\": -0.23, \\"Accel Y\\": -0.11, \\"Accel Z\\": -0.12, \\"Brake (calculated)\\": 0.0, \\"Barometric Pressure (kPa)\\": 100.19, \\"Pressure Altitude (m)\\": 94.8}","timestamp":1688722228393,"latitude":39.3356062,"longitude":-76.6201958,"altitude":45.5},{"id":302,"video_id":42,"location":"{\\"Time\\": 14.839, \\"UTC Time\\": 1688736630.839, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.3356054, \\"Longitude\\": -76.6202563, \\"Altitude (m)\\": 44.3, \\"Altitude (ft)\\": 145.0, \\"Speed (Km\\/h)\\": 7.1, \\"Heading\\": 270.8, \\"Accuracy (m)\\": 7.5, \\"Accel X\\": -0.26, \\"Accel Y\\": -0.12, \\"Accel Z\\": -0.23, \\"Brake (calculated)\\": 0.0, \\"Barometric Pressure (kPa)\\": 100.19, \\"Pressure Altitude (m)\\": 94.7}","timestamp":1688722230840,"latitude":39.3356054,"longitude":-76.6202563,"altitude":44.3},{"id":352,"video_id":42,"location":"{\\"Time\\": 17.347, \\"UTC Time\\": 1688736633.347, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.3356042, \\"Longitude\\": -76.6202945, \\"Altitude (m)\\": 43.7, \\"Altitude (ft)\\": 143.0, \\"Speed (Km\\/h)\\": 4.7, \\"Heading\\": 267.1, \\"Accuracy (m)\\": 7.5, \\"Accel X\\": -0.28, \\"Accel Y\\": -0.08, \\"Accel Z\\": -0.09, \\"Brake (calculated)\\": 0.0, \\"Barometric Pressure (kPa)\\": 100.19, \\"Pressure Altitude (m)\\": 94.7}","timestamp":1688722233347,"latitude":39.3356042,"longitude":-76.6202945,"altitude":43.7},{"id":402,"video_id":42,"location":"{\\"Time\\": 19.858, \\"UTC Time\\": 1688736635.858, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.335609, \\"Longitude\\": -76.6203274, \\"Altitude (m)\\": 44.0, \\"Altitude (ft)\\": 144.0, \\"Speed (Km\\/h)\\": 5.5, \\"Heading\\": 286.2, \\"Accuracy (m)\\": 5.4, \\"Accel X\\": -0.17, \\"Accel Y\\": -0.01, \\"Accel Z\\": 0.08, \\"Brake (calculated)\\": 0.0, \\"Barometric Pressure (kPa)\\": 100.19, \\"Pressure Altitude (m)\\": 94.6}","timestamp":1688722235857,"latitude":39.335609,"longitude":-76.6203274,"altitude":44.0},{"id":452,"video_id":42,"location":"{\\"Time\\": 22.355, \\"UTC Time\\": 1688736638.355, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.3356263, \\"Longitude\\": -76.6203607, \\"Altitude (m)\\": 45.3, \\"Altitude (ft)\\": 149.0, \\"Speed (Km\\/h)\\": 3.7, \\"Heading\\": 292.5, \\"Accuracy (m)\\": 5.4, \\"Accel X\\": -0.18, \\"Accel Y\\": -0.04, \\"Accel Z\\": 0.0, \\"Brake (calculated)\\": 0.0, \\"Barometric Pressure (kPa)\\": 100.19, \\"Pressure Altitude (m)\\": 94.5}","timestamp":1688722238357,"latitude":39.3356263,"longitude":-76.6203607,"altitude":45.3},{"id":502,"video_id":42,"location":"{\\"Time\\": 24.844, \\"UTC Time\\": 1688736640.844, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.3356166, \\"Longitude\\": -76.6203854, \\"Altitude (m)\\": 44.2, \\"Altitude (ft)\\": 145.0, \\"Speed (Km\\/h)\\": 5.0, \\"Heading\\": 230.8, \\"Accuracy (m)\\": 6.4, \\"Accel X\\": 0.11, \\"Accel Y\\": -0.57, \\"Accel Z\\": -0.35, \\"Brake (calculated)\\": 0.0, \\"Barometric Pressure (kPa)\\": 100.19, \\"Pressure Altitude (m)\\": 94.5}","timestamp":1688722240843,"latitude":39.3356166,"longitude":-76.6203854,"altitude":44.2},{"id":552,"video_id":42,"location":"{\\"Time\\": 27.786, \\"UTC Time\\": 1688736643.786, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.335582, \\"Longitude\\": -76.6203719, \\"Altitude (m)\\": 46.2, \\"Altitude (ft)\\": 151.0, \\"Speed (Km\\/h)\\": 3.8, \\"Heading\\": 152.4, \\"Accuracy (m)\\": 6.4, \\"Accel X\\": -0.05, \\"Accel Y\\": -0.59, \\"Accel Z\\": -0.34, \\"Brake (calculated)\\": 0.0, \\"Barometric Pressure (kPa)\\": 100.19, \\"Pressure Altitude (m)\\": 94.5}","timestamp":1688722243787,"latitude":39.335582,"longitude":-76.6203719,"altitude":46.2},{"id":602,"video_id":42,"location":"{\\"Time\\": 30.205, \\"UTC Time\\": 1688736646.205, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.3355596, \\"Longitude\\": -76.6203749, \\"Altitude (m)\\": 46.5, \\"Altitude (ft)\\": 152.0, \\"Speed (Km\\/h)\\": 4.1, \\"Heading\\": 201.2, \\"Accuracy (m)\\": 7.5, \\"Accel X\\": -0.04, \\"Accel Y\\": -0.62, \\"Accel Z\\": -0.44, \\"Brake (calculated)\\": 0.0, \\"Barometric Pressure (kPa)\\": 100.19, \\"Pressure Altitude (m)\\": 94.6}","timestamp":1688722246207,"latitude":39.3355596,"longitude":-76.6203749,"altitude":46.5},{"id":652,"video_id":42,"location":"{\\"Time\\": 32.715, \\"UTC Time\\": 1688736648.715, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.3355418, \\"Longitude\\": -76.6203786, \\"Altitude (m)\\": 50.1, \\"Altitude (ft)\\": 165.0, \\"Speed (Km\\/h)\\": 3.2, \\"Heading\\": 202.8, \\"Accuracy (m)\\": 6.4, \\"Accel X\\": 0.06, \\"Accel Y\\": -0.64, \\"Accel Z\\": -0.41, \\"Brake (calculated)\\": 0.0, \\"Barometric Pressure (kPa)\\": 100.19, \\"Pressure Altitude (m)\\": 94.7}","timestamp":1688722248717,"latitude":39.3355418,"longitude":-76.6203786,"altitude":50.1},{"id":702,"video_id":42,"location":"{\\"Time\\": 35.247, \\"UTC Time\\": 1688736651.247, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.3355271, \\"Longitude\\": -76.6203826, \\"Altitude (m)\\": 50.6, \\"Altitude (ft)\\": 166.0, \\"Speed (Km\\/h)\\": 3.3, \\"Heading\\": 203.0, \\"Accuracy (m)\\": 8.6, \\"Accel X\\": 0.04, \\"Accel Y\\": -0.65, \\"Accel Z\\": -0.34, \\"Brake (calculated)\\": 0.0, \\"Barometric Pressure (kPa)\\": 100.19, \\"Pressure Altitude (m)\\": 94.7}","timestamp":1688722251247,"latitude":39.3355271,"longitude":-76.6203826,"altitude":50.6},{"id":752,"video_id":42,"location":"{\\"Time\\": 37.709, \\"UTC Time\\": 1688736653.709, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.3355204, \\"Longitude\\": -76.6203957, \\"Altitude (m)\\": 54.2, \\"Altitude (ft)\\": 178.0, \\"Speed (Km\\/h)\\": 2.9, \\"Heading\\": 229.3, \\"Accuracy (m)\\": 9.6, \\"Accel X\\": 0.07, \\"Accel Y\\": -0.66, \\"Accel Z\\": -0.29, \\"Brake (calculated)\\": 0.0, \\"Barometric Pressure (kPa)\\": 100.19, \\"Pressure Altitude (m)\\": 94.8}","timestamp":1688722253710,"latitude":39.3355204,"longitude":-76.6203957,"altitude":54.2},{"id":802,"video_id":42,"location":"{\\"Time\\": 40.219, \\"UTC Time\\": 1688736656.219, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.3354925, \\"Longitude\\": -76.6203822, \\"Altitude (m)\\": 55.8, \\"Altitude (ft)\\": 183.0, \\"Speed (Km\\/h)\\": 1.2, \\"Heading\\": 171.2, \\"Accuracy (m)\\": 12.9, \\"Accel X\\": -0.06, \\"Accel Y\\": -0.68, \\"Accel Z\\": -0.47, \\"Brake (calculated)\\": 1.0, \\"Barometric Pressure (kPa)\\": 100.19, \\"Pressure Altitude (m)\\": 95.1}","timestamp":1688722256220,"latitude":39.3354925,"longitude":-76.6203822,"altitude":55.8},{"id":852,"video_id":42,"location":"{\\"Time\\": 43.163, \\"UTC Time\\": 1688736659.163, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.3354714, \\"Longitude\\": -76.6203643, \\"Altitude (m)\\": 58.3, \\"Altitude (ft)\\": 191.0, \\"Speed (Km\\/h)\\": 1.2, \\"Heading\\": 93.0, \\"Accuracy (m)\\": 13.9, \\"Accel X\\": -0.04, \\"Accel Y\\": -0.5, \\"Accel Z\\": -0.64, \\"Brake (calculated)\\": 1.0, \\"Barometric Pressure (kPa)\\": 100.19, \\"Pressure Altitude (m)\\": 95.3}","timestamp":1688722259163,"latitude":39.3354714,"longitude":-76.6203643,"altitude":58.3},{"id":902,"video_id":42,"location":"{\\"Time\\": 45.593, \\"UTC Time\\": 1688736661.593, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.335421, \\"Longitude\\": -76.620323, \\"Altitude (m)\\": 57.2, \\"Altitude (ft)\\": 188.0, \\"Speed (Km\\/h)\\": 7.6, \\"Heading\\": 145.3, \\"Accuracy (m)\\": 13.9, \\"Accel X\\": 0.03, \\"Accel Y\\": -0.53, \\"Accel Z\\": -0.51, \\"Brake (calculated)\\": 0.0, \\"Barometric Pressure (kPa)\\": 100.18, \\"Pressure Altitude (m)\\": 95.4}","timestamp":1688722261593,"latitude":39.335421,"longitude":-76.620323,"altitude":57.2},{"id":952,"video_id":42,"location":"{\\"Time\\": 48.083, \\"UTC Time\\": 1688736664.083, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.335372, \\"Longitude\\": -76.6203259, \\"Altitude (m)\\": 58.8, \\"Altitude (ft)\\": 193.0, \\"Speed (Km\\/h)\\": 6.9, \\"Heading\\": 172.6, \\"Accuracy (m)\\": 13.9, \\"Accel X\\": 0.1, \\"Accel Y\\": -0.52, \\"Accel Z\\": -0.47, \\"Brake (calculated)\\": 0.0, \\"Barometric Pressure (kPa)\\": 100.18, \\"Pressure Altitude (m)\\": 95.5}","timestamp":1688722264083,"latitude":39.335372,"longitude":-76.6203259,"altitude":58.8},{"id":1002,"video_id":42,"location":"{\\"Time\\": 50.559, \\"UTC Time\\": 1688736666.559, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.3353048, \\"Longitude\\": -76.6203498, \\"Altitude (m)\\": 60.0, \\"Altitude (ft)\\": 197.0, \\"Speed (Km\\/h)\\": 5.3, \\"Heading\\": 195.1, \\"Accuracy (m)\\": 15.0, \\"Accel X\\": 0.09, \\"Accel Y\\": -0.51, \\"Accel Z\\": -0.42, \\"Brake (calculated)\\": 0.0, \\"Barometric Pressure (kPa)\\": 100.18, \\"Pressure Altitude (m)\\": 95.5}","timestamp":1688722266560,"latitude":39.3353048,"longitude":-76.6203498,"altitude":60.0},{"id":1052,"video_id":42,"location":"{\\"Time\\": 53.049, \\"UTC Time\\": 1688736669.049, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.3352596, \\"Longitude\\": -76.6203657, \\"Altitude (m)\\": 61.4, \\"Altitude (ft)\\": 201.0, \\"Speed (Km\\/h)\\": 6.7, \\"Heading\\": 189.1, \\"Accuracy (m)\\": 18.2, \\"Accel X\\": 0.12, \\"Accel Y\\": -0.52, \\"Accel Z\\": -0.41, \\"Brake (calculated)\\": 0.0, \\"Barometric Pressure (kPa)\\": 100.18, \\"Pressure Altitude (m)\\": 95.6}","timestamp":1688722269050,"latitude":39.3352596,"longitude":-76.6203657,"altitude":61.4},{"id":1102,"video_id":42,"location":"{\\"Time\\": 55.483, \\"UTC Time\\": 1688736671.483, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.3352096, \\"Longitude\\": -76.6203795, \\"Altitude (m)\\": 61.7, \\"Altitude (ft)\\": 202.0, \\"Speed (Km\\/h)\\": 6.1, \\"Heading\\": 174.2, \\"Accuracy (m)\\": 13.9, \\"Accel X\\": -0.01, \\"Accel Y\\": -0.59, \\"Accel Z\\": -0.59, \\"Brake (calculated)\\": 0.0, \\"Barometric Pressure (kPa)\\": 100.18, \\"Pressure Altitude (m)\\": 95.6}","timestamp":1688722271483,"latitude":39.3352096,"longitude":-76.6203795,"altitude":61.7},{"id":1152,"video_id":42,"location":"{\\"Time\\": 57.994, \\"UTC Time\\": 1688736673.994, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.335187, \\"Longitude\\": -76.6203864, \\"Altitude (m)\\": 57.5, \\"Altitude (ft)\\": 189.0, \\"Speed (Km\\/h)\\": 3.4, \\"Heading\\": 166.5, \\"Accuracy (m)\\": 13.9, \\"Accel X\\": 0.01, \\"Accel Y\\": -0.65, \\"Accel Z\\": -0.47, \\"Brake (calculated)\\": 0.0, \\"Barometric Pressure (kPa)\\": 100.18, \\"Pressure Altitude (m)\\": 95.8}","timestamp":1688722273993,"latitude":39.335187,"longitude":-76.6203864,"altitude":57.5},{"id":1202,"video_id":42,"location":"{\\"Time\\": 62.007, \\"UTC Time\\": 1688736678.007, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.3351414, \\"Longitude\\": -76.6204043, \\"Altitude (m)\\": 61.1, \\"Altitude (ft)\\": 200.0, \\"Speed (Km\\/h)\\": 7.1, \\"Heading\\": 177.3, \\"Accuracy (m)\\": 15.0, \\"Accel X\\": -0.04, \\"Accel Y\\": -0.67, \\"Accel Z\\": -0.48, \\"Brake (calculated)\\": 0.0, \\"Barometric Pressure (kPa)\\": 100.17, \\"Pressure Altitude (m)\\": 96.2}","timestamp":1688722278007,"latitude":39.3351414,"longitude":-76.6204043,"altitude":61.1},{"id":1252,"video_id":42,"location":"{\\"Time\\": 64.453, \\"UTC Time\\": 1688736680.453, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.335106, \\"Longitude\\": -76.6204096, \\"Altitude (m)\\": 62.3, \\"Altitude (ft)\\": 204.0, \\"Speed (Km\\/h)\\": 4.9, \\"Heading\\": 179.6, \\"Accuracy (m)\\": 21.4, \\"Accel X\\": -0.06, \\"Accel Y\\": -0.62, \\"Accel Z\\": -0.41, \\"Brake (calculated)\\": 0.0, \\"Barometric Pressure (kPa)\\": 100.17, \\"Pressure Altitude (m)\\": 96.2}","timestamp":1688722280453,"latitude":39.335106,"longitude":-76.6204096,"altitude":62.3},{"id":1302,"video_id":42,"location":"{\\"Time\\": 66.866, \\"UTC Time\\": 1688736682.866, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.3350964, \\"Longitude\\": -76.6204433, \\"Altitude (m)\\": 58.4, \\"Altitude (ft)\\": 191.0, \\"Speed (Km\\/h)\\": 4.0, \\"Heading\\": 216.7, \\"Accuracy (m)\\": 15.0, \\"Accel X\\": 0.02, \\"Accel Y\\": -0.48, \\"Accel Z\\": -0.41, \\"Brake (calculated)\\": 0.0, \\"Barometric Pressure (kPa)\\": 100.17, \\"Pressure Altitude (m)\\": 96.3}","timestamp":1688722282867,"latitude":39.3350964,"longitude":-76.6204433,"altitude":58.4},{"id":1352,"video_id":42,"location":"{\\"Time\\": 69.306, \\"UTC Time\\": 1688736685.306, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.3350703, \\"Longitude\\": -76.620426, \\"Altitude (m)\\": 60.5, \\"Altitude (ft)\\": 198.0, \\"Speed (Km\\/h)\\": 2.3, \\"Heading\\": 146.2, \\"Accuracy (m)\\": 19.3, \\"Accel X\\": 0.06, \\"Accel Y\\": -0.5, \\"Accel Z\\": -0.38, \\"Brake (calculated)\\": 0.0, \\"Barometric Pressure (kPa)\\": 100.17, \\"Pressure Altitude (m)\\": 96.4}","timestamp":1688722285307,"latitude":39.3350703,"longitude":-76.620426,"altitude":60.5},{"id":1402,"video_id":42,"location":"{\\"Time\\": 71.847, \\"UTC Time\\": 1688736687.847, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.3350082, \\"Longitude\\": -76.6204103, \\"Altitude (m)\\": 58.7, \\"Altitude (ft)\\": 192.0, \\"Speed (Km\\/h)\\": 8.5, \\"Heading\\": 156.2, \\"Accuracy (m)\\": 17.2, \\"Accel X\\": 0.05, \\"Accel Y\\": -0.49, \\"Accel Z\\": -0.42, \\"Brake (calculated)\\": 0.0, \\"Barometric Pressure (kPa)\\": 100.17, \\"Pressure Altitude (m)\\": 96.6}","timestamp":1688722287847,"latitude":39.3350082,"longitude":-76.6204103,"altitude":58.7},{"id":1452,"video_id":42,"location":"{\\"Time\\": 74.787, \\"UTC Time\\": 1688736690.787, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.3349858, \\"Longitude\\": -76.6203352, \\"Altitude (m)\\": 55.0, \\"Altitude (ft)\\": 181.0, \\"Speed (Km\\/h)\\": 2.7, \\"Heading\\": 113.4, \\"Accuracy (m)\\": 15.0, \\"Accel X\\": -0.0, \\"Accel Y\\": -0.53, \\"Accel Z\\": -0.58, \\"Brake (calculated)\\": 0.0, \\"Barometric Pressure (kPa)\\": 100.17, \\"Pressure Altitude (m)\\": 96.6}","timestamp":1688722290787,"latitude":39.3349858,"longitude":-76.6203352,"altitude":55.0},{"id":1502,"video_id":42,"location":"{\\"Time\\": 77.318, \\"UTC Time\\": 1688736693.318, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.334973, \\"Longitude\\": -76.6203112, \\"Altitude (m)\\": 54.2, \\"Altitude (ft)\\": 178.0, \\"Speed (Km\\/h)\\": 1.9, \\"Heading\\": 150.1, \\"Accuracy (m)\\": 15.0, \\"Accel X\\": 0.05, \\"Accel Y\\": -0.56, \\"Accel Z\\": -0.48, \\"Brake (calculated)\\": 0.0, \\"Barometric Pressure (kPa)\\": 100.17, \\"Pressure Altitude (m)\\": 96.7}","timestamp":1688722293317,"latitude":39.334973,"longitude":-76.6203112,"altitude":54.2},{"id":1552,"video_id":42,"location":"{\\"Time\\": 79.79, \\"UTC Time\\": 1688736695.79, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.3349432, \\"Longitude\\": -76.6203006, \\"Altitude (m)\\": 53.7, \\"Altitude (ft)\\": 176.0, \\"Speed (Km\\/h)\\": 3.5, \\"Heading\\": 182.5, \\"Accuracy (m)\\": 15.0, \\"Accel X\\": 0.09, \\"Accel Y\\": -0.51, \\"Accel Z\\": -0.48, \\"Brake (calculated)\\": 0.0, \\"Barometric Pressure (kPa)\\": 100.17, \\"Pressure Altitude (m)\\": 97.0}","timestamp":1688722295790,"latitude":39.3349432,"longitude":-76.6203006,"altitude":53.7},{"id":1602,"video_id":42,"location":"{\\"Time\\": 82.289, \\"UTC Time\\": 1688736698.289, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.3349204, \\"Longitude\\": -76.6202894, \\"Altitude (m)\\": 55.8, \\"Altitude (ft)\\": 183.0, \\"Speed (Km\\/h)\\": 3.4, \\"Heading\\": 157.8, \\"Accuracy (m)\\": 15.0, \\"Accel X\\": 0.08, \\"Accel Y\\": -0.66, \\"Accel Z\\": -0.49, \\"Brake (calculated)\\": 0.0, \\"Barometric Pressure (kPa)\\": 100.16, \\"Pressure Altitude (m)\\": 97.0}","timestamp":1688722298290,"latitude":39.3349204,"longitude":-76.6202894,"altitude":55.8},{"id":1652,"video_id":42,"location":"{\\"Time\\": 84.77, \\"UTC Time\\": 1688736700.77, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.334912, \\"Longitude\\": -76.6202703, \\"Altitude (m)\\": 59.4, \\"Altitude (ft)\\": 195.0, \\"Speed (Km\\/h)\\": 1.2, \\"Heading\\": 75.9, \\"Accuracy (m)\\": 15.0, \\"Accel X\\": 0.03, \\"Accel Y\\": -0.57, \\"Accel Z\\": -0.45, \\"Brake (calculated)\\": 1.0, \\"Barometric Pressure (kPa)\\": 100.16, \\"Pressure Altitude (m)\\": 97.0}","timestamp":1688722300770,"latitude":39.334912,"longitude":-76.6202703,"altitude":59.4},{"id":1702,"video_id":42,"location":"{\\"Time\\": 87.242, \\"UTC Time\\": 1688736703.242, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.3349027, \\"Longitude\\": -76.6202758, \\"Altitude (m)\\": 60.4, \\"Altitude (ft)\\": 198.0, \\"Speed (Km\\/h)\\": 0.0, \\"Heading\\": 0.0, \\"Accuracy (m)\\": 13.9, \\"Accel X\\": 0.06, \\"Accel Y\\": -0.58, \\"Accel Z\\": -0.44, \\"Brake (calculated)\\": 1.0, \\"Barometric Pressure (kPa)\\": 100.16, \\"Pressure Altitude (m)\\": 97.0}","timestamp":1688722303243,"latitude":39.3349027,"longitude":-76.6202758,"altitude":60.4},{"id":1752,"video_id":42,"location":"{\\"Time\\": 89.771, \\"UTC Time\\": 1688736705.771, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.3348835, \\"Longitude\\": -76.6202895, \\"Altitude (m)\\": 59.3, \\"Altitude (ft)\\": 195.0, \\"Speed (Km\\/h)\\": 0.0, \\"Heading\\": 0.0, \\"Accuracy (m)\\": 13.9, \\"Accel X\\": 0.09, \\"Accel Y\\": -0.7, \\"Accel Z\\": -0.47, \\"Brake (calculated)\\": 1.0, \\"Barometric Pressure (kPa)\\": 100.16, \\"Pressure Altitude (m)\\": 97.1}","timestamp":1688722305770,"latitude":39.3348835,"longitude":-76.6202895,"altitude":59.3},{"id":1802,"video_id":42,"location":"{\\"Time\\": 92.227, \\"UTC Time\\": 1688736708.227, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.3348717, \\"Longitude\\": -76.6203048, \\"Altitude (m)\\": 57.7, \\"Altitude (ft)\\": 189.0, \\"Speed (Km\\/h)\\": 0.0, \\"Heading\\": 0.0, \\"Accuracy (m)\\": 12.9, \\"Accel X\\": 0.25, \\"Accel Y\\": -0.66, \\"Accel Z\\": -0.46, \\"Brake (calculated)\\": 1.0, \\"Barometric Pressure (kPa)\\": 100.16, \\"Pressure Altitude (m)\\": 97.0}","timestamp":1688722308227,"latitude":39.3348717,"longitude":-76.6203048,"altitude":57.7},{"id":1852,"video_id":42,"location":"{\\"Time\\": 94.709, \\"UTC Time\\": 1688736710.709, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.3348568, \\"Longitude\\": -76.6203108, \\"Altitude (m)\\": 58.4, \\"Altitude (ft)\\": 192.0, \\"Speed (Km\\/h)\\": 0.0, \\"Heading\\": 0.0, \\"Accuracy (m)\\": 13.9, \\"Accel X\\": 0.06, \\"Accel Y\\": -0.74, \\"Accel Z\\": -0.55, \\"Brake (calculated)\\": 1.0, \\"Barometric Pressure (kPa)\\": 100.16, \\"Pressure Altitude (m)\\": 97.1}","timestamp":1688722310710,"latitude":39.3348568,"longitude":-76.6203108,"altitude":58.4},{"id":1902,"video_id":42,"location":"{\\"Time\\": 97.209, \\"UTC Time\\": 1688736713.209, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.3348491, \\"Longitude\\": -76.6203112, \\"Altitude (m)\\": 57.9, \\"Altitude (ft)\\": 190.0, \\"Speed (Km\\/h)\\": 0.0, \\"Heading\\": 0.0, \\"Accuracy (m)\\": 17.2, \\"Accel X\\": 0.11, \\"Accel Y\\": -0.73, \\"Accel Z\\": -0.42, \\"Brake (calculated)\\": 1.0, \\"Barometric Pressure (kPa)\\": 100.16, \\"Pressure Altitude (m)\\": 97.2}","timestamp":1688722313210,"latitude":39.3348491,"longitude":-76.6203112,"altitude":57.9},{"id":1952,"video_id":42,"location":"{\\"Time\\": 99.635, \\"UTC Time\\": 1688736715.635, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.3348429, \\"Longitude\\": -76.6203096, \\"Altitude (m)\\": 58.2, \\"Altitude (ft)\\": 191.0, \\"Speed (Km\\/h)\\": 0.0, \\"Heading\\": 0.0, \\"Accuracy (m)\\": 15.0, \\"Accel X\\": 0.05, \\"Accel Y\\": -0.58, \\"Accel Z\\": -0.44, \\"Brake (calculated)\\": 1.0, \\"Barometric Pressure (kPa)\\": 100.16, \\"Pressure Altitude (m)\\": 97.6}","timestamp":1688722315637,"latitude":39.3348429,"longitude":-76.6203096,"altitude":58.2},{"id":2002,"video_id":42,"location":"{\\"Time\\": 102.105, \\"UTC Time\\": 1688736718.105, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.3348407, \\"Longitude\\": -76.6203115, \\"Altitude (m)\\": 58.2, \\"Altitude (ft)\\": 191.0, \\"Speed (Km\\/h)\\": 0.0, \\"Heading\\": 0.0, \\"Accuracy (m)\\": 12.9, \\"Accel X\\": 0.03, \\"Accel Y\\": -0.64, \\"Accel Z\\": -0.51, \\"Brake (calculated)\\": 1.0, \\"Barometric Pressure (kPa)\\": 100.16, \\"Pressure Altitude (m)\\": 97.8}","timestamp":1688722318107,"latitude":39.3348407,"longitude":-76.6203115,"altitude":58.2},{"id":2052,"video_id":42,"location":"{\\"Time\\": 104.563, \\"UTC Time\\": 1688736720.563, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.334838, \\"Longitude\\": -76.6203106, \\"Altitude (m)\\": 58.6, \\"Altitude (ft)\\": 192.0, \\"Speed (Km\\/h)\\": 0.0, \\"Heading\\": 0.0, \\"Accuracy (m)\\": 12.9, \\"Accel X\\": 0.03, \\"Accel Y\\": -0.64, \\"Accel Z\\": -0.51, \\"Brake (calculated)\\": 1.0, \\"Barometric Pressure (kPa)\\": 100.16, \\"Pressure Altitude (m)\\": 97.8}","timestamp":1688722320563,"latitude":39.334838,"longitude":-76.6203106,"altitude":58.6},{"id":2102,"video_id":42,"location":"{\\"Time\\": 107.072, \\"UTC Time\\": 1688736723.072, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.3348373, \\"Longitude\\": -76.6203097, \\"Altitude (m)\\": 58.7, \\"Altitude (ft)\\": 193.0, \\"Speed (Km\\/h)\\": 0.0, \\"Heading\\": 0.0, \\"Accuracy (m)\\": 12.9, \\"Accel X\\": 0.09, \\"Accel Y\\": -0.69, \\"Accel Z\\": -0.45, \\"Brake (calculated)\\": 1.0, \\"Barometric Pressure (kPa)\\": 100.15, \\"Pressure Altitude (m)\\": 97.8}","timestamp":1688722323073,"latitude":39.3348373,"longitude":-76.6203097,"altitude":58.7},{"id":2152,"video_id":42,"location":"{\\"Time\\": 109.997, \\"UTC Time\\": 1688736725.997, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.3348366, \\"Longitude\\": -76.6203084, \\"Altitude (m)\\": 58.7, \\"Altitude (ft)\\": 192.0, \\"Speed (Km\\/h)\\": 0.0, \\"Heading\\": 0.0, \\"Accuracy (m)\\": 12.9, \\"Accel X\\": 0.1, \\"Accel Y\\": -0.52, \\"Accel Z\\": -0.48, \\"Brake (calculated)\\": 1.0, \\"Barometric Pressure (kPa)\\": 100.15, \\"Pressure Altitude (m)\\": 98.1}","timestamp":1688722325997,"latitude":39.3348366,"longitude":-76.6203084,"altitude":58.7},{"id":2202,"video_id":42,"location":"{\\"Time\\": 112.538, \\"UTC Time\\": 1688736728.538, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.3348116, \\"Longitude\\": -76.6203222, \\"Altitude (m)\\": 57.6, \\"Altitude (ft)\\": 189.0, \\"Speed (Km\\/h)\\": 1.4, \\"Heading\\": 257.7, \\"Accuracy (m)\\": 11.8, \\"Accel X\\": 0.12, \\"Accel Y\\": -0.65, \\"Accel Z\\": -0.46, \\"Brake (calculated)\\": 1.0, \\"Barometric Pressure (kPa)\\": 100.15, \\"Pressure Altitude (m)\\": 98.1}","timestamp":1688722328537,"latitude":39.3348116,"longitude":-76.6203222,"altitude":57.6},{"id":2252,"video_id":42,"location":"{\\"Time\\": 115.043, \\"UTC Time\\": 1688736731.043, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.3347669, \\"Longitude\\": -76.6203146, \\"Altitude (m)\\": 59.3, \\"Altitude (ft)\\": 195.0, \\"Speed (Km\\/h)\\": 5.7, \\"Heading\\": 187.9, \\"Accuracy (m)\\": 12.9, \\"Accel X\\": 0.01, \\"Accel Y\\": -0.67, \\"Accel Z\\": -0.55, \\"Brake (calculated)\\": 0.0, \\"Barometric Pressure (kPa)\\": 100.15, \\"Pressure Altitude (m)\\": 98.1}","timestamp":1688722331043,"latitude":39.3347669,"longitude":-76.6203146,"altitude":59.3},{"id":2302,"video_id":42,"location":"{\\"Time\\": 117.546, \\"UTC Time\\": 1688736733.546, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.3346884, \\"Longitude\\": -76.620303, \\"Altitude (m)\\": 60.8, \\"Altitude (ft)\\": 200.0, \\"Speed (Km\\/h)\\": 3.3, \\"Heading\\": 214.2, \\"Accuracy (m)\\": 13.9, \\"Accel X\\": 0.05, \\"Accel Y\\": -0.69, \\"Accel Z\\": -0.5, \\"Brake (calculated)\\": 0.0, \\"Barometric Pressure (kPa)\\": 100.15, \\"Pressure Altitude (m)\\": 98.1}","timestamp":1688722333547,"latitude":39.3346884,"longitude":-76.620303,"altitude":60.8},{"id":2352,"video_id":42,"location":"{\\"Time\\": 120.058, \\"UTC Time\\": 1688736736.058, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.3346153, \\"Longitude\\": -76.6202652, \\"Altitude (m)\\": 54.9, \\"Altitude (ft)\\": 180.0, \\"Speed (Km\\/h)\\": 7.6, \\"Heading\\": 166.6, \\"Accuracy (m)\\": 13.9, \\"Accel X\\": 0.08, \\"Accel Y\\": -0.65, \\"Accel Z\\": -0.45, \\"Brake (calculated)\\": 0.0, \\"Barometric Pressure (kPa)\\": 100.15, \\"Pressure Altitude (m)\\": 97.9}","timestamp":1688722336057,"latitude":39.3346153,"longitude":-76.6202652,"altitude":54.9},{"id":2402,"video_id":42,"location":"{\\"Time\\": 123.005, \\"UTC Time\\": 1688736739.005, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.334522, \\"Longitude\\": -76.6202292, \\"Altitude (m)\\": 59.3, \\"Altitude (ft)\\": 195.0, \\"Speed (Km\\/h)\\": 4.4, \\"Heading\\": 181.5, \\"Accuracy (m)\\": 12.9, \\"Accel X\\": 0.07, \\"Accel Y\\": -0.71, \\"Accel Z\\": -0.5, \\"Brake (calculated)\\": 0.0, \\"Barometric Pressure (kPa)\\": 100.15, \\"Pressure Altitude (m)\\": 97.9}","timestamp":1688722339007,"latitude":39.334522,"longitude":-76.6202292,"altitude":59.3},{"id":2452,"video_id":42,"location":"{\\"Time\\": 125.44, \\"UTC Time\\": 1688736741.44, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 1.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.3344447, \\"Longitude\\": -76.6202573, \\"Altitude (m)\\": 58.7, \\"Altitude (ft)\\": 193.0, \\"Speed (Km\\/h)\\": 11.4, \\"Heading\\": 191.7, \\"Accuracy (m)\\": 12.9, \\"Accel X\\": 0.12, \\"Accel Y\\": -0.64, \\"Accel Z\\": -0.5, \\"Brake (calculated)\\": 0.0, \\"Barometric Pressure (kPa)\\": 100.15, \\"Pressure Altitude (m)\\": 97.8}","timestamp":1688722341440,"latitude":39.3344447,"longitude":-76.6202573,"altitude":58.7},{"id":2502,"video_id":42,"location":"{\\"Time\\": 127.938, \\"UTC Time\\": 1688736743.938, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.334414, \\"Longitude\\": -76.6202629, \\"Altitude (m)\\": 57.6, \\"Altitude (ft)\\": 189.0, \\"Speed (Km\\/h)\\": 2.6, \\"Heading\\": 182.0, \\"Accuracy (m)\\": 11.8, \\"Accel X\\": 0.09, \\"Accel Y\\": -0.72, \\"Accel Z\\": -0.52, \\"Brake (calculated)\\": 0.0, \\"Barometric Pressure (kPa)\\": 100.15, \\"Pressure Altitude (m)\\": 97.8}","timestamp":1688722343937,"latitude":39.334414,"longitude":-76.6202629,"altitude":57.6},{"id":2552,"video_id":42,"location":"{\\"Time\\": 130.437, \\"UTC Time\\": 1688736746.437, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.3343841, \\"Longitude\\": -76.6202706, \\"Altitude (m)\\": 51.8, \\"Altitude (ft)\\": 170.0, \\"Speed (Km\\/h)\\": 6.1, \\"Heading\\": 176.7, \\"Accuracy (m)\\": 11.8, \\"Accel X\\": 0.04, \\"Accel Y\\": -0.64, \\"Accel Z\\": -0.63, \\"Brake (calculated)\\": 0.0, \\"Barometric Pressure (kPa)\\": 100.16, \\"Pressure Altitude (m)\\": 97.6}","timestamp":1688722346437,"latitude":39.3343841,"longitude":-76.6202706,"altitude":51.8},{"id":2602,"video_id":42,"location":"{\\"Time\\": 132.912, \\"UTC Time\\": 1688736748.912, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.001, \\"Latitude\\": 39.3343502, \\"Longitude\\": -76.6203178, \\"Altitude (m)\\": 51.0, \\"Altitude (ft)\\": 167.0, \\"Speed (Km\\/h)\\": 3.6, \\"Heading\\": 215.1, \\"Accuracy (m)\\": 10.7, \\"Accel X\\": 0.15, \\"Accel Y\\": -0.69, \\"Accel Z\\": -0.45, \\"Brake (calculated)\\": 0.0, \\"Barometric Pressure (kPa)\\": 100.16, \\"Pressure Altitude (m)\\": 97.6}","timestamp":1688722348913,"latitude":39.3343502,"longitude":-76.6203178,"altitude":51.0},{"id":2652,"video_id":42,"location":"{\\"Time\\": 135.412, \\"UTC Time\\": 1688736751.412, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.3343435, \\"Longitude\\": -76.6203536, \\"Altitude (m)\\": 49.8, \\"Altitude (ft)\\": 163.0, \\"Speed (Km\\/h)\\": 5.0, \\"Heading\\": 193.4, \\"Accuracy (m)\\": 10.7, \\"Accel X\\": 0.04, \\"Accel Y\\": -0.63, \\"Accel Z\\": -0.51, \\"Brake (calculated)\\": 0.0, \\"Barometric Pressure (kPa)\\": 100.16, \\"Pressure Altitude (m)\\": 97.5}","timestamp":1688722351413,"latitude":39.3343435,"longitude":-76.6203536,"altitude":49.8},{"id":2702,"video_id":42,"location":"{\\"Time\\": 137.841, \\"UTC Time\\": 1688736753.841, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.3343397, \\"Longitude\\": -76.6204068, \\"Altitude (m)\\": 47.9, \\"Altitude (ft)\\": 157.0, \\"Speed (Km\\/h)\\": 1.9, \\"Heading\\": 193.5, \\"Accuracy (m)\\": 10.7, \\"Accel X\\": 0.03, \\"Accel Y\\": -0.59, \\"Accel Z\\": -0.56, \\"Brake (calculated)\\": 0.0, \\"Barometric Pressure (kPa)\\": 100.16, \\"Pressure Altitude (m)\\": 97.5}","timestamp":1688722353840,"latitude":39.3343397,"longitude":-76.6204068,"altitude":47.9},{"id":2752,"video_id":42,"location":"{\\"Time\\": 140.315, \\"UTC Time\\": 1688736756.315, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.3343473, \\"Longitude\\": -76.6204391, \\"Altitude (m)\\": 49.5, \\"Altitude (ft)\\": 162.0, \\"Speed (Km\\/h)\\": 1.9, \\"Heading\\": 193.8, \\"Accuracy (m)\\": 10.7, \\"Accel X\\": 0.06, \\"Accel Y\\": -0.49, \\"Accel Z\\": -0.49, \\"Brake (calculated)\\": 0.0, \\"Barometric Pressure (kPa)\\": 100.16, \\"Pressure Altitude (m)\\": 97.3}","timestamp":1688722356317,"latitude":39.3343473,"longitude":-76.6204391,"altitude":49.5},{"id":2802,"video_id":42,"location":"{\\"Time\\": 142.741, \\"UTC Time\\": 1688736758.741, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.3343398, \\"Longitude\\": -76.6204942, \\"Altitude (m)\\": 52.1, \\"Altitude (ft)\\": 171.0, \\"Speed (Km\\/h)\\": 5.0, \\"Heading\\": 210.4, \\"Accuracy (m)\\": 10.7, \\"Accel X\\": 0.04, \\"Accel Y\\": -0.46, \\"Accel Z\\": -0.5, \\"Brake (calculated)\\": 0.0, \\"Barometric Pressure (kPa)\\": 100.16, \\"Pressure Altitude (m)\\": 97.3}","timestamp":1688722358740,"latitude":39.3343398,"longitude":-76.6204942,"altitude":52.1},{"id":2852,"video_id":42,"location":"{\\"Time\\": 145.19, \\"UTC Time\\": 1688736761.19, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.3343172, \\"Longitude\\": -76.620525, \\"Altitude (m)\\": 50.0, \\"Altitude (ft)\\": 164.0, \\"Speed (Km\\/h)\\": 2.3, \\"Heading\\": 194.3, \\"Accuracy (m)\\": 10.7, \\"Accel X\\": 0.07, \\"Accel Y\\": -0.52, \\"Accel Z\\": -0.52, \\"Brake (calculated)\\": 0.0, \\"Barometric Pressure (kPa)\\": 100.16, \\"Pressure Altitude (m)\\": 97.3}","timestamp":1688722361190,"latitude":39.3343172,"longitude":-76.620525,"altitude":50.0},{"id":2902,"video_id":42,"location":"{\\"Time\\": 147.593, \\"UTC Time\\": 1688736763.593, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.3342891, \\"Longitude\\": -76.6205698, \\"Altitude (m)\\": 50.2, \\"Altitude (ft)\\": 165.0, \\"Speed (Km\\/h)\\": 3.3, \\"Heading\\": 194.5, \\"Accuracy (m)\\": 10.7, \\"Accel X\\": 0.1, \\"Accel Y\\": -0.49, \\"Accel Z\\": -0.47, \\"Brake (calculated)\\": 0.0, \\"Barometric Pressure (kPa)\\": 100.16, \\"Pressure Altitude (m)\\": 97.4}","timestamp":1688722363593,"latitude":39.3342891,"longitude":-76.6205698,"altitude":50.2},{"id":2952,"video_id":42,"location":"{\\"Time\\": 150.091, \\"UTC Time\\": 1688736766.091, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.3342692, \\"Longitude\\": -76.62058, \\"Altitude (m)\\": 50.6, \\"Altitude (ft)\\": 166.0, \\"Speed (Km\\/h)\\": 2.4, \\"Heading\\": 194.6, \\"Accuracy (m)\\": 11.8, \\"Accel X\\": 0.1, \\"Accel Y\\": -0.64, \\"Accel Z\\": -0.49, \\"Brake (calculated)\\": 0.0, \\"Barometric Pressure (kPa)\\": 100.16, \\"Pressure Altitude (m)\\": 97.5}","timestamp":1688722366090,"latitude":39.3342692,"longitude":-76.62058,"altitude":50.6},{"id":3002,"video_id":42,"location":"{\\"Time\\": 152.619, \\"UTC Time\\": 1688736768.619, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.3342641, \\"Longitude\\": -76.6206365, \\"Altitude (m)\\": 51.5, \\"Altitude (ft)\\": 169.0, \\"Speed (Km\\/h)\\": 5.0, \\"Heading\\": 284.4, \\"Accuracy (m)\\": 11.8, \\"Accel X\\": 0.14, \\"Accel Y\\": -0.72, \\"Accel Z\\": -0.44, \\"Brake (calculated)\\": 0.0, \\"Barometric Pressure (kPa)\\": 100.16, \\"Pressure Altitude (m)\\": 97.5}","timestamp":1688722368620,"latitude":39.3342641,"longitude":-76.6206365,"altitude":51.5},{"id":3052,"video_id":42,"location":"{\\"Time\\": 155.086, \\"UTC Time\\": 1688736771.086, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.3342553, \\"Longitude\\": -76.6206708, \\"Altitude (m)\\": 52.6, \\"Altitude (ft)\\": 173.0, \\"Speed (Km\\/h)\\": 4.6, \\"Heading\\": 253.6, \\"Accuracy (m)\\": 11.8, \\"Accel X\\": 0.18, \\"Accel Y\\": -0.69, \\"Accel Z\\": -0.35, \\"Brake (calculated)\\": 0.0, \\"Barometric Pressure (kPa)\\": 100.16, \\"Pressure Altitude (m)\\": 97.5}","timestamp":1688722371087,"latitude":39.3342553,"longitude":-76.6206708,"altitude":52.6},{"id":3102,"video_id":42,"location":"{\\"Time\\": 157.547, \\"UTC Time\\": 1688736773.547, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.3342572, \\"Longitude\\": -76.6207357, \\"Altitude (m)\\": 52.3, \\"Altitude (ft)\\": 172.0, \\"Speed (Km\\/h)\\": 5.9, \\"Heading\\": 279.0, \\"Accuracy (m)\\": 11.8, \\"Accel X\\": 0.05, \\"Accel Y\\": -0.54, \\"Accel Z\\": -0.54, \\"Brake (calculated)\\": 0.0, \\"Barometric Pressure (kPa)\\": 100.16, \\"Pressure Altitude (m)\\": 97.4}","timestamp":1688722373547,"latitude":39.3342572,"longitude":-76.6207357,"altitude":52.3},{"id":3152,"video_id":42,"location":"{\\"Time\\": 159.992, \\"UTC Time\\": 1688736775.992, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.3342633, \\"Longitude\\": -76.6207704, \\"Altitude (m)\\": 53.0, \\"Altitude (ft)\\": 174.0, \\"Speed (Km\\/h)\\": 4.0, \\"Heading\\": 282.0, \\"Accuracy (m)\\": 10.7, \\"Accel X\\": 0.09, \\"Accel Y\\": -0.52, \\"Accel Z\\": -0.5, \\"Brake (calculated)\\": 0.0, \\"Barometric Pressure (kPa)\\": 100.16, \\"Pressure Altitude (m)\\": 97.3}","timestamp":1688722375993,"latitude":39.3342633,"longitude":-76.6207704,"altitude":53.0},{"id":3202,"video_id":42,"location":"{\\"Time\\": 162.453, \\"UTC Time\\": 1688736778.453, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 1.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.3342661, \\"Longitude\\": -76.6208392, \\"Altitude (m)\\": 53.1, \\"Altitude (ft)\\": 174.0, \\"Speed (Km\\/h)\\": 5.0, \\"Heading\\": 258.9, \\"Accuracy (m)\\": 10.7, \\"Accel X\\": 0.06, \\"Accel Y\\": -0.52, \\"Accel Z\\": -0.48, \\"Brake (calculated)\\": 0.0, \\"Barometric Pressure (kPa)\\": 100.16, \\"Pressure Altitude (m)\\": 97.3}","timestamp":1688722378453,"latitude":39.3342661,"longitude":-76.6208392,"altitude":53.1},{"id":3252,"video_id":42,"location":"{\\"Time\\": 165.47, \\"UTC Time\\": 1688736781.47, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.3342844, \\"Longitude\\": -76.6208591, \\"Altitude (m)\\": 51.9, \\"Altitude (ft)\\": 170.0, \\"Speed (Km\\/h)\\": 4.8, \\"Heading\\": 259.2, \\"Accuracy (m)\\": 10.7, \\"Accel X\\": 0.08, \\"Accel Y\\": -0.51, \\"Accel Z\\": -0.44, \\"Brake (calculated)\\": 0.0, \\"Barometric Pressure (kPa)\\": 100.16, \\"Pressure Altitude (m)\\": 97.3}","timestamp":1688722381470,"latitude":39.3342844,"longitude":-76.6208591,"altitude":51.9},{"id":3302,"video_id":42,"location":"{\\"Time\\": 167.907, \\"UTC Time\\": 1688736783.907, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.3343136, \\"Longitude\\": -76.6208883, \\"Altitude (m)\\": 50.0, \\"Altitude (ft)\\": 164.0, \\"Speed (Km\\/h)\\": 4.9, \\"Heading\\": 303.4, \\"Accuracy (m)\\": 10.7, \\"Accel X\\": 0.06, \\"Accel Y\\": -0.51, \\"Accel Z\\": -0.49, \\"Brake (calculated)\\": 0.0, \\"Barometric Pressure (kPa)\\": 100.16, \\"Pressure Altitude (m)\\": 97.3}","timestamp":1688722383907,"latitude":39.3343136,"longitude":-76.6208883,"altitude":50.0},{"id":3352,"video_id":42,"location":"{\\"Time\\": 170.395, \\"UTC Time\\": 1688736786.395, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.3343324, \\"Longitude\\": -76.620906, \\"Altitude (m)\\": 50.1, \\"Altitude (ft)\\": 164.0, \\"Speed (Km\\/h)\\": 5.3, \\"Heading\\": 259.4, \\"Accuracy (m)\\": 10.7, \\"Accel X\\": 0.03, \\"Accel Y\\": -0.49, \\"Accel Z\\": -0.55, \\"Brake (calculated)\\": 0.0, \\"Barometric Pressure (kPa)\\": 100.16, \\"Pressure Altitude (m)\\": 97.4}","timestamp":1688722386397,"latitude":39.3343324,"longitude":-76.620906,"altitude":50.1},{"id":3402,"video_id":42,"location":"{\\"Time\\": 172.865, \\"UTC Time\\": 1688736788.865, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.3343427, \\"Longitude\\": -76.6209451, \\"Altitude (m)\\": 49.1, \\"Altitude (ft)\\": 161.0, \\"Speed (Km\\/h)\\": 4.2, \\"Heading\\": 274.2, \\"Accuracy (m)\\": 10.7, \\"Accel X\\": 0.06, \\"Accel Y\\": -0.45, \\"Accel Z\\": -0.54, \\"Brake (calculated)\\": 0.0, \\"Barometric Pressure (kPa)\\": 100.16, \\"Pressure Altitude (m)\\": 97.4}","timestamp":1688722388867,"latitude":39.3343427,"longitude":-76.6209451,"altitude":49.1},{"id":3452,"video_id":42,"location":"{\\"Time\\": 175.746, \\"UTC Time\\": 1688736791.746, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.3343497, \\"Longitude\\": -76.6209673, \\"Altitude (m)\\": 47.7, \\"Altitude (ft)\\": 157.0, \\"Speed (Km\\/h)\\": 0.0, \\"Heading\\": 0.0, \\"Accuracy (m)\\": 10.7, \\"Accel X\\": 0.08, \\"Accel Y\\": -0.59, \\"Accel Z\\": -0.46, \\"Brake (calculated)\\": 1.0, \\"Barometric Pressure (kPa)\\": 100.16, \\"Pressure Altitude (m)\\": 97.4}","timestamp":1688722391747,"latitude":39.3343497,"longitude":-76.6209673,"altitude":47.7},{"id":3502,"video_id":42,"location":"{\\"Time\\": 178.213, \\"UTC Time\\": 1688736794.213, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.3343538, \\"Longitude\\": -76.6209735, \\"Altitude (m)\\": 48.3, \\"Altitude (ft)\\": 159.0, \\"Speed (Km\\/h)\\": 0.0, \\"Heading\\": 0.0, \\"Accuracy (m)\\": 10.7, \\"Accel X\\": 0.04, \\"Accel Y\\": -0.57, \\"Accel Z\\": -0.5, \\"Brake (calculated)\\": 1.0, \\"Barometric Pressure (kPa)\\": 100.16, \\"Pressure Altitude (m)\\": 97.4}","timestamp":1688722394213,"latitude":39.3343538,"longitude":-76.6209735,"altitude":48.3},{"id":3552,"video_id":42,"location":"{\\"Time\\": 180.663, \\"UTC Time\\": 1688736796.663, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.3343471, \\"Longitude\\": -76.6210156, \\"Altitude (m)\\": 46.0, \\"Altitude (ft)\\": 151.0, \\"Speed (Km\\/h)\\": 5.1, \\"Heading\\": 258.3, \\"Accuracy (m)\\": 11.8, \\"Accel X\\": 0.06, \\"Accel Y\\": -0.56, \\"Accel Z\\": -0.53, \\"Brake (calculated)\\": 0.0, \\"Barometric Pressure (kPa)\\": 100.16, \\"Pressure Altitude (m)\\": 97.5}","timestamp":1688722396663,"latitude":39.3343471,"longitude":-76.6210156,"altitude":46.0},{"id":3602,"video_id":42,"location":"{\\"Time\\": 183.164, \\"UTC Time\\": 1688736799.164, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.33434, \\"Longitude\\": -76.621052, \\"Altitude (m)\\": 46.4, \\"Altitude (ft)\\": 152.0, \\"Speed (Km\\/h)\\": 5.1, \\"Heading\\": 259.5, \\"Accuracy (m)\\": 11.8, \\"Accel X\\": 0.05, \\"Accel Y\\": -0.49, \\"Accel Z\\": -0.5, \\"Brake (calculated)\\": 0.0, \\"Barometric Pressure (kPa)\\": 100.16, \\"Pressure Altitude (m)\\": 97.5}","timestamp":1688722399163,"latitude":39.33434,"longitude":-76.621052,"altitude":46.4},{"id":3652,"video_id":42,"location":"{\\"Time\\": 185.706, \\"UTC Time\\": 1688736801.706, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.3343023, \\"Longitude\\": -76.6211101, \\"Altitude (m)\\": 44.4, \\"Altitude (ft)\\": 146.0, \\"Speed (Km\\/h)\\": 5.3, \\"Heading\\": 228.9, \\"Accuracy (m)\\": 10.7, \\"Accel X\\": 0.01, \\"Accel Y\\": -0.66, \\"Accel Z\\": -0.53, \\"Brake (calculated)\\": 0.0, \\"Barometric Pressure (kPa)\\": 100.16, \\"Pressure Altitude (m)\\": 97.5}","timestamp":1688722401707,"latitude":39.3343023,"longitude":-76.6211101,"altitude":44.4},{"id":3702,"video_id":42,"location":"{\\"Time\\": 188.129, \\"UTC Time\\": 1688736804.129, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.3342758, \\"Longitude\\": -76.6211417, \\"Altitude (m)\\": 45.7, \\"Altitude (ft)\\": 150.0, \\"Speed (Km\\/h)\\": 4.4, \\"Heading\\": 226.7, \\"Accuracy (m)\\": 10.7, \\"Accel X\\": 0.0, \\"Accel Y\\": -0.66, \\"Accel Z\\": -0.59, \\"Brake (calculated)\\": 0.0, \\"Barometric Pressure (kPa)\\": 100.16, \\"Pressure Altitude (m)\\": 97.5}","timestamp":1688722404130,"latitude":39.3342758,"longitude":-76.6211417,"altitude":45.7},{"id":3752,"video_id":42,"location":"{\\"Time\\": 190.599, \\"UTC Time\\": 1688736806.599, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.007, \\"Latitude\\": 39.3342369, \\"Longitude\\": -76.6211908, \\"Altitude (m)\\": 44.6, \\"Altitude (ft)\\": 146.0, \\"Speed (Km\\/h)\\": 6.4, \\"Heading\\": 214.2, \\"Accuracy (m)\\": 10.7, \\"Accel X\\": 0.2, \\"Accel Y\\": -0.64, \\"Accel Z\\": -0.42, \\"Brake (calculated)\\": 1.0, \\"Barometric Pressure (kPa)\\": 100.16, \\"Pressure Altitude (m)\\": 97.4}","timestamp":1688722406600,"latitude":39.3342369,"longitude":-76.6211908,"altitude":44.6},{"id":3802,"video_id":42,"location":"{\\"Time\\": 193.117, \\"UTC Time\\": 1688736809.117, \\"Lap\\": 0.0, \\"Predicted Lap Time\\": 0.0, \\"Predicted vs Best Lap\\": 0.0, \\"GPS_Update\\": 0.0, \\"GPS_Delay\\": 0.0, \\"Latitude\\": 39.3342073, \\"Longitude\\": -76.6211933, \\"Altitude (m)\\": 45.3, \\"Altitude (ft)\\": 149.0, \\"Speed (Km\\/h)\\": 5.1, \\"Heading\\": 186.9, \\"Accuracy (m)\\": 10.7, \\"Accel X\\": -0.22, \\"Accel Y\\": -0.21, \\"Accel Z\\": -0.2, \\"Brake (calculated)\\": 0.0, \\"Barometric Pressure (kPa)\\": 100.16, \\"Pressure Altitude (m)\\": 97.5}","timestamp":1688722409117,"latitude":39.3342073,"longitude":-76.6211933,"altitude":45.3}]') - - def __create_engine(self): - return sqla.create_engine(f"mssql+pymssql://{self.AUTH['user']}:{self.AUTH['pwd']}@{self.SERVER}:1433/{self.DATABASE}?charset=utf8") - - def execute_query(self, sql): - # replace all and's with lower case and - sql = sql.replace(' AND ', ' and ') - sql = sql.replace(' and \'', ' &&& \'') # separates datetime strings, not conditions. - df = None - # calls without where - if 'where' not in sql: # "select * from {table}" - query_words = sql.split(' ') - db = query_words[3] - df = getattr(self, db) - - # calls with where - else: - table_query, conditions = sql.split(' where ') - db = table_query.split(' ')[3] - df = getattr(self, db) - - # delete rows that don't match conditions - for condition in re.split(' and ', conditions): - if condition == '1=0': - df = df[0:0] - break - if condition == '1=1': continue - - # parse conditions 1 by 1 - if '=' in condition: # "... video_id=1" - col_name, value = condition.split('=') - col_name, value = col_name.strip(), value.strip() - if value[0] == '\'': value = value[1:-1] - if value.isdigit() or '.' in value: value = int(float(value)) - df = df[df[col_name] == value] - elif ' in ' in condition: # "... video_id in (0, 1, 2)" - col_name, values = condition.split(' in ') - values = values[1:-1].split(', ') - values = [int(v) for v in values] - df = df[df[col_name].isin(values)] - elif 'JSON_VALUE' in condition: # "... JSON_VALUE(metadata, '$.{key}') like '%{val}%'" - left, right = condition.split(' like ') - last_key = left.split('.')[-1][:-2] - value = right[1:-1] - regex_value = ''.join(['.*' if c == '%' else c for c in value]) - df = df[df['metadata'].str.contains(f'"{last_key}": "{regex_value}"', flags=re.IGNORECASE, regex=True, na=False)] - elif 'between' in condition: # timestamp between '2023-07-07 09:30:00' AND '2023-07-07 09:31:30' - col_name, two_times = condition.split(' between ') - start, end = two_times.split(' &&& ') - start, end = start[1:-1], end[1:-1] - df = df[(df[col_name] >= start) & (df[col_name] <= end)] - else: # "... segment like '%[^a-zA-Z]en%'" - col_name, regex_condition = condition.split(' like ') - regex_condition = regex_condition[1:-1] - regex_condition = ''.join(['.*' if c == '%' else c for c in regex_condition]) - df = df[df[col_name].str.contains(regex_condition, flags=re.IGNORECASE, regex=True, na=False)] - return df - - - -# queries to support: -"select * from video where id in (1, 11)" -"select * from video where JSON_VALUE(metadata, '$.format.filename') like '%'" -"select * from text_segment where segment like '%[^a-zA-Z]en%'" diff --git a/repository.py b/repository.py new file mode 100644 index 0000000..27fb3f9 --- /dev/null +++ b/repository.py @@ -0,0 +1,198 @@ +# MIT License + +# Copyright (c) 2023 sciserver + +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: + +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. + +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +import json +import logging +from typing import Any, Dict, List, Optional, Union + +import pandas as pd +import sqlalchemy as sqla +import sqlalchemy.ext.automap as automap +import sqlalchemy.orm as orm + +import job_config as jc + + +class Repository: + def __init__( + self, + db_auth_path: Optional[str] = None, + db_auth: Optional[Dict[str, Union[str, int]]] = None, + DROP_AND_CREATE_DANGER: Optional[bool] = False, + ) -> "Repository": + if (db_auth_path is None and db_auth is None) or ( + db_auth_path is not None and db_auth is not None + ): + raise ValueError("Must provide either db_auth_path or db_auth.") + + if db_auth_path is not None: + with open(db_auth_path, "r") as f: + db_auth = json.load(f) + + self.auth = db_auth + self.engine = self.__create_engine() + + if DROP_AND_CREATE_DANGER: + self.drop_and_create(I_AM_SURE_I_WANT_TO_DO_THIS=True) + + self.base = automap.automap_base() + self.base.prepare(self.engine, reflect=True) + self._session = None + + self.Video = self.base.classes.video + self.Audio = self.base.classes.audio + self.Transcription = self.base.classes.transcription + self.TextSegment = self.base.classes.text_segment + self.WordSegment = self.base.classes.word_segment + self.GPS = self.base.classes.gps + + @property + def session(self): + if self._session is None: + self._session = orm.Session(self.engine) + return self._session + + def get_video( + self, + video_id: Optional[int] = None, + checksum: Optional[str] = None, + ) -> Union[Any, None]: + both_none = video_id is None and checksum is None + both_given = video_id is not None and checksum is not None + if both_given or both_none: + raise ValueError("Must specify `video_id` OR `checksum`") + + if video_id: + stmt = sqla.select(self.Video).where(self.Video.id == video_id) + + if checksum: + stmt = sqla.select(self.Video).where(self.Video.checksum == checksum) + + return self.session.scalars(stmt).one_or_none() + + def get_audio( + self, + audio_id: Optional[int] = None, + checksum: Optional[str] = None, + ) -> Union[Any, None]: + both_none = audio_id is None and checksum is None + both_given = audio_id is not None and checksum is not None + if both_given or both_none: + raise ValueError("Must specify `audio_id` OR `checksum`") + + if audio_id: + stmt = sqla.select(self.Audio).where(self.Audio.id == audio_id) + + if checksum: + stmt = sqla.select(self.Audio).where(self.Audio.checksum == checksum) + + return self.session.scalars(stmt).one_or_none() + + def save_data( + self, + video_kwargs: Dict[str, Any], + audio_kwargs: Dict[str, Any], + transcription_kwargs: Dict[str, Any], + text_segments_dicts: List[Dict[str, Any]], + gps_kwargs: List[Dict[str, Any]], + logger: Optional[logging.Logger] = logging.getLogger(__name__), + ) -> None: + if (video := self.get_video(checksum=video_kwargs["checksum"])) is None: + logger.info("Video doesn't exist in database") + video = self.Video(**video_kwargs) + else: + logger.info(f"Video exists in database id = {video.id}") + + if (audio := self.get_audio(checksum=audio_kwargs["checksum"])) is None: + logger.info("Audio doesn't exist in database") + audio = self.Audio(video=video, **audio_kwargs) + else: + logger.info(f"Audio exists in database id = {audio.id}") + + transcription = self.Transcription(audio=audio, **transcription_kwargs) + + text_segments = [] + word_segments = [] + for ts in text_segments_dicts: + text_segment = self.TextSegment( + transcription=transcription, + segment=ts["text"], + start_time=ts["start"], + end_time=ts["end"], + no_speech_prob=ts["no_speech_prob"], + thumbnail=ts["thumbnail"], + ) + + for word in ts["words"]: + word_segment = self.WordSegment( + text_segment=text_segment, + word=word["word"], + start_time=word["start"], + end_time=word["end"], + probability=word["probability"], + ) + word_segments.append(word_segment) + text_segments.append(text_segment) + + gps_coords = list( + map(lambda kwargs: self.GPS(video=video, **kwargs), gps_kwargs) + ) + + logger.info("Saving items to session") + for item in ( + [video, audio, transcription] + text_segments + word_segments + gps_coords + ): + self.session.add(item) + + logger.info("Committing") + self.session.commit() + logger.info("Completed") + + def drop_and_create(self, I_AM_SURE_I_WANT_TO_DO_THIS: bool = False) -> None: + if I_AM_SURE_I_WANT_TO_DO_THIS: + with open("sql/DDL.pysql", "r") as f: + sql = f.read().format(danger=1) + self.execute_update(sql) + + def execute_query(self, sql: str) -> pd.DataFrame: + if type(sql) == str: + sql = sqla.text(sql) + with self.engine.connect() as conn: + return pd.read_sql(sql, conn) + + def execute_update(self, statement: str) -> None: + if type(statement) == str: + statement = sqla.text(statement) + with self.engine.connect() as conn: + trans = conn.begin() + try: + result = conn.execute(statement) + trans.commit() + except: + trans.rollback() + raise + return result + + def __create_engine(self): + return sqla.create_engine( + f"mssql+pymssql://{self.auth['user']}:{self.auth['pwd']}@{self.auth['host']}:1433/{self.auth['database']}?charset=utf8" + ) diff --git a/sql/DDL.pysql b/sql/DDL.pysql new file mode 100644 index 0000000..8ac4ad2 --- /dev/null +++ b/sql/DDL.pysql @@ -0,0 +1,85 @@ +-- Creates the required tables for the algorithm +USE nist_ai; + +DECLARE @this_is_dangerous_i_am_sure_that_i_what_to_do_this BIT = {danger}; + +IF @this_is_dangerous_i_am_sure_that_i_what_to_do_this = 1 +BEGIN + PRINT 'Doing dangerous things!'; + + IF OBJECT_ID('dbo.video', 'U') IS NOT NULL + BEGIN + DROP TABLE dbo.gps; + DROP TABLE dbo.word_segment; + DROP TABLE dbo.text_segment; + DROP TABLE dbo.transcription; + DROP TABLE dbo.audio; + DROP TABLE dbo.video; + END + + CREATE TABLE dbo.video ( + id BIGINT IDENTITY(1,1) NOT NULL, + filename VARCHAR(1024) NOT NULL, + gps_filename VARCHAR(1024) NOT NULL, + checksum VARCHAR(64) NOT NULL, + metadata VARCHAR(MAX) NOT NULL, -- JSON + CONSTRAINT PK_video PRIMARY KEY(id) + ); + + CREATE TABLE dbo.audio ( + id BIGINT IDENTITY(1,1) NOT NULL, + video_id BIGINT NOT NULL, + filename VARCHAR(1024) NOT NULL, + checksum VARCHAR(64) NOT NULL, + CONSTRAINT PK_audio PRIMARY KEY(id), + CONSTRAINT FK_audio_video_id FOREIGN KEY (video_id) REFERENCES video(id) ON DELETE CASCADE + ); + + CREATE TABLE dbo.transcription ( + id BIGINT IDENTITY(1,1) NOT NULL, + audio_id BIGINT NOT NULL, + config VARCHAR(MAX) NOT NULL, -- JSON + CONSTRAINT PK_transcription PRIMARY KEY(id), + CONSTRAINT FK_transcription_audio_id FOREIGN KEY (audio_id) REFERENCES audio(id) ON DELETE CASCADE + ); + + CREATE TABLE dbo.text_segment ( + id BIGINT IDENTITY(1,1) NOT NULL, + transcription_id BIGINT NOT NULL, + segment VARCHAR(MAX) NOT NULL, + start_time REAL NOT NULL, + end_time REAL NOT NULL, + no_speech_prob REAL NOT NULL, + thumbnail VARBINARY(MAX) NOT NULL, + CONSTRAINT PK_text_segment PRIMARY KEY(id), + CONSTRAINT FK_text_segment_transcription_id FOREIGN KEY (transcription_id) REFERENCES transcription(id) ON DELETE CASCADE + ); + + CREATE TABLE dbo.word_segment ( + id BIGINT IDENTITY(1,1) NOT NULL, + text_segment_id BIGINT NOT NULL, + word VARCHAR(1024) NOT NULL, + start_time REAL NOT NULL, + end_time REAL NOT NULL, + probability REAL NOT NULL, + CONSTRAINT PK_word_segment PRIMARY KEY(id), + CONSTRAINT FK_word_segment_text_segment_id FOREIGN KEY (text_segment_id) REFERENCES text_segment(id) ON DELETE CASCADE + ); + + CREATE TABLE dbo.gps ( + id BIGINT IDENTITY(1,1) NOT NULL, + video_id BIGINT NOT NULL, + relative_time REAL NOT NULL, + utc_time REAL NOT NULL, + latitude REAL NOT NULL, + longitude REAL NOT NULL, + altitude_m FLOAT NOT NULL, + speed_kmh FLOAT NOT NULL, + CONSTRAINT PK_gps PRIMARY KEY(id), + CONSTRAINT FK_gps_video_id FOREIGN KEY (video_id) REFERENCES video(id) ON DELETE CASCADE + ) +END +ELSE +BEGIN + PRINT 'No danger here!' +END \ No newline at end of file diff --git a/utils.py b/utils.py new file mode 100644 index 0000000..a34407a --- /dev/null +++ b/utils.py @@ -0,0 +1,139 @@ +# MIT License + +# Copyright (c) 2023 sciserver + +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: + +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. + +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +"""This module contains helper functions and classes.""" + +import hashlib +import logging +import os +import time +from typing import Union + + +# https://stackoverflow.com/a/39215961/2691018 +class StreamToLogger: + """This class redirects write calss to a logger.""" + + def __init__( + self, logger: logging.Logger, level: Union[int, str] + ) -> "StreamToLogger": + self.logger = logger + self.level = level + self.linebuf = "" + + def write(self, buf: str) -> None: + for line in buf.rstrip().splitlines(): + self.logger.log(self.level, line.rstrip()) + + def flush(self) -> None: + pass + + +import sys + +# https://stackoverflow.com/a/54955536 +from contextlib import contextmanager + + +@contextmanager +def stdout_redirector(stdout: StreamToLogger, stderr: StreamToLogger): + """This function redirects stdout and stderr to a logger using""" + + old_stdout = sys.stdout + old_stderr = sys.stderr + sys.stdout = stdout + sys.stderr = stderr + try: + yield + finally: + sys.stdout = old_stdout + sys.stderr = old_stderr + + +class LogTime: + """A context manager class for logging code timings and errors. + + This class will log the time it takes to run some code along with any + exceptions that occur within in the context. Timings are logged at the INFO + level and errors are logged at the FATAL level. + + Example: + + >>> import logging + >>> logger = logging.getLogger("example") + >>> + >>> with LogTime(logger, "Calculating Sum"): + >>> a = 2 + 2 + + The log file will look something like (depending on your formatting): + + >>> Starting Calculating Sum + >>> Completed in 7.62939453125e-06 seconds + """ + + def __init__(self, logger: logging.Logger, task_str: str): + """A context manager class for logging code timings and errors. + + Args: + logger (logging.Logger): The logger instance to use for logging + task_str (str): The string describing the section of code being run + + """ + self.logger = logger + self.task_str = task_str + + def __enter__(self): + self.logger.info(f"Starting {self.task_str}") + self.start = time.time() + + def __exit__(self, exc_type, exc_value, traceback): + if exc_type is None: + self.logger.info(f"Completed in {time.time() - self.start} seconds") + else: + self.logger.fatal(f"{exc_type}\n{exc_value}\n{traceback}") + + +def get_checksum( + file_name: str, + logger: logging.Logger = logging.getLogger(__name__), +) -> str: + """Returns the checksum of a file. + + Args: + file_name (str): Path to the file. + logger (logging.Logger, optional): Logger object. Defaults to logging.getLogger(__name__). + + Returns: + str: Checksum of the file. + + Raises: + FileNotFoundError: If `file_name` does not exist. + """ + + if not os.path.exists(file_name): + msg = f"File not found at {file_name}" + logger.error(msg) + raise FileNotFoundError(msg) + + with open(file_name, "rb") as file_to_check: + data = file_to_check.read() + return hashlib.md5(data).hexdigest() diff --git a/video_processing.py b/video_processing.py new file mode 100644 index 0000000..d643e6d --- /dev/null +++ b/video_processing.py @@ -0,0 +1,131 @@ +# MIT License + +# Copyright (c) 2023 sciserver + +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: + +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. + +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +"""This module contains functions for processing videos.""" + +import logging +import os +import sys + +try: + import ffmpeg # ffmpeg-python +except ImportError: + raise ImportError( + "ffmpeg-python not installed. Please install it using `pip install ffmpeg-python`" + ) + +import utils + + +def extract_audio( + video_path: str, + audio_path: str, + logger: logging.Logger = logging.getLogger(__name__), + overwrite: bool = False, +) -> None: + """Extracts audio from a video at `video_path` and saves it to `audio_path`. + + Args: + video_path (str): Path to the video file. + audio_path (str): Path to save the audio file. + logger (logging.Logger, optional): Logger object. Defaults to logging.getLogger(__name__). + overwrite (bool, optional): Whether to overwrite the existing audio file. Defaults to False. + + Returns: + None + + Raises: + FileNotFoundError: If `video_path` does not exist. + """ + + if not os.path.exists(video_path): + msg = f"Video file not found at {video_path}" + logger.error(msg) + raise FileNotFoundError(msg) + + if os.path.exists(audio_path) and not overwrite: + logger.info(f"Audio file already exists at {audio_path}. Skipping...") + return + + logger.info(f"Extracting audio from {video_path} to {audio_path}...") + + stdout, stderr = ( + ffmpeg.input(video_path) + .output(audio_path) + .run(capture_stdout=True, capture_stderr=True) + ) + logger.info(f"ffmpeg stdout:" + stdout.decode()) + logger.error(f"ffmpeg stderr:" + stderr.decode()) + + return + + +def get_metadata( + video_path: str, + logger: logging.Logger = logging.getLogger(__name__), +) -> dict: + """Extracts metadata from a video at `video_path`. + + Args: + video_path (str): Path to the video file. + logger (logging.Logger, optional): Logger object. Defaults to logging.getLogger(__name__). + + Returns: + dict: Dictionary containing the metadata. + """ + + if not os.path.exists(video_path): + msg = f"Video file not found at {video_path}" + logger.error(msg) + raise FileNotFoundError(msg) + + logger.info(f"Extracting metadata from {video_path}...") + + return ffmpeg.probe(video_path) + + +def get_thumbnail( + video_path: str, + width: int, + time: float, +) -> bytes: + out, _ = ( + ffmpeg.input(video_path, ss=time) + .filter("scale", width, -1) + .output("pipe:", format="image2", vcodec="png", vframes=1) + .run(capture_stdout=True, capture_stderr=True) + ) + return out + + +if __name__ == "__main__": + logging.basicConfig( + filename="test.log", + filemode="a", + format="%(asctime)s,%(msecs)d %(name)s %(levelname)s %(message)s", + datefmt="%H:%M:%S", + level=logging.DEBUG, + ) + + logger = logging.getLogger("test") + + extract_audio("vid.mp4", "audio.mp3", logger) diff --git a/video_tools.py b/video_tools.py deleted file mode 100644 index f821d0a..0000000 --- a/video_tools.py +++ /dev/null @@ -1,39 +0,0 @@ -from moviepy.editor import VideoFileClip -import os -import ffmpeg -from pprint import pprint -import hashlib - -audio_exts = {'m4a'} - -# Converts video to audio using MoviePy library that uses `ffmpeg` under the hood -def generate_audio(video_file, output_ext="mp3"): - filename, ext = os.path.splitext(video_file) - - if os.path.exists(filename + '.wav'): return None - if ext in audio_exts: return None - - clip = VideoFileClip(video_file) - clip.audio.write_audiofile(f"{filename}.{output_ext}") - audio_file = video_file.replace(".mp4",".wav") - return audio_file - -def get_checksum(file_name): - with open(file_name, 'rb') as file_to_check: - data = file_to_check.read() - return hashlib.md5(data).hexdigest() - -def local_file_v(filename): - local_v = 'assets/test_data/' + filename.split('/')[-1] - if not os.path.exists(local_v): - pass - # local_v = 'assets/test_data/pod_clip_1.mp4' - return local_v - -# assuming input is gp pro video for now -def generate_gps(video_file, input_type="go-pro"): - filename, ext = os.path.splitext(video_file) - - if os.path.exists(filename + '.csv'): return None - if input_type != 'go-pro': return None - \ No newline at end of file