diff --git a/.gitignore b/.gitignore
index a76077f..2fa6681 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,3 @@
-*.mp3
*~
# python stuff
__pycache__/
diff --git a/mixcloud/.gitignore b/mixcloud/.gitignore
new file mode 100644
index 0000000..847b15c
--- /dev/null
+++ b/mixcloud/.gitignore
@@ -0,0 +1,2 @@
+*.mp3
+*.wav
diff --git a/mixcloud/fun_with_subtitles_02.sh.txt b/mixcloud/fun_with_subtitles_02.sh.txt
index fcd9349..e4e53a0 100644
--- a/mixcloud/fun_with_subtitles_02.sh.txt
+++ b/mixcloud/fun_with_subtitles_02.sh.txt
@@ -1,6 +1,9 @@
+#!/bin/bash
+#
# vosk can also output JSON that includes the timing of each individual
# detected WORD!
# NOTE: I had an error when I did this and needed to PATCH some PYTHON code in VOSK
# see VOSKPATCH.TXT
-vosk-transcriber -l en-us -i worm25_mia_60.wav -t json -o worm25_mia_60.json
+
+vosk-transcriber -l en-us -i w25mia60.wav -t json -o w25mia60.json
diff --git a/mixcloud/scripts/srt2vtt.py b/mixcloud/scripts/srt2vtt.py
old mode 100644
new mode 100755
diff --git a/mixcloud/scripts/timecode.py b/mixcloud/scripts/timecode.py
new file mode 100755
index 0000000..c6e5696
--- /dev/null
+++ b/mixcloud/scripts/timecode.py
@@ -0,0 +1,96 @@
+# This file is part of Active Archives.
+# Copyright 2006-2016 the Active Archives contributors (see AUTHORS)
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+# Also add information on how to contact you by electronic and paper mail.
+
+from __future__ import print_function
+import math
+import re
+
+# timecode_pat = re.compile(r"(\d+):(\d+):(\d+)(?:[.,](\d+))?")
+timecode_pat = re.compile(r"(?:(\d+):)?(\d+):(\d+)(?:[.,](\d+))?")
+
+
+def timecode_fromsecs(rawsecs, fract=True, alwaysfract=False, fractdelim=',', alwayshours=False):
+ # returns a string in HH:MM:SS[.xxx] notation
+ # if fract is True, uses .xxx if either necessary (non-zero)
+ # OR alwaysfract is True
+ hours = math.floor(rawsecs / 3600)
+ rawsecs -= hours * 3600
+ mins = math.floor(rawsecs / 60)
+ rawsecs -= mins * 60
+ if fract:
+ secs = math.floor(rawsecs)
+ rawsecs -= secs
+ if (rawsecs > 0 or alwaysfract):
+ fract = "%.03f" % rawsecs
+ if hours or alwayshours:
+ return "%02d:%02d:%02d%s%s" % (hours, mins, secs, fractdelim, \
+ fract[2:])
+ else:
+ return "%02d:%02d%s%s" % (mins, secs, fractdelim, fract[2:])
+ else:
+ if hours or alwayshours:
+ return "%02d:%02d:%02d" % (hours, mins, secs)
+ else:
+ return "%02d:%02d" % (mins, secs)
+
+ else:
+ secs = round(rawsecs)
+ if hours or alwayshours:
+ return "%02d:%02d:%02d" % (hours, mins, secs)
+ else:
+ return "%02d:%02d" % (mins, secs)
+
+
+def timecode_tosecs(tcstr):
+ r = timecode_pat.search(tcstr)
+ if r:
+ ret = 0
+ if r.group(1):
+ ret += 3600 * int(r.group(1))
+ ret += 60 * int(r.group(2))
+ ret += int(r.group(3))
+ if (r.group(4)):
+ ret = float(str(ret) + "." + r.group(4))
+ return ret
+ else:
+ return None
+
+
+def parse2secs(val):
+ try:
+ return float(val)
+ except ValueError:
+ return timecode_tosecs(val)
+## to accept None
+# except TypeError:
+# return
+
+if __name__ == "__main__":
+ def t(x):
+ # with fraction
+ s = timecode_fromsecs(x, True, False)
+ print (x, "=>", s, "=>", timecode_tosecs(s))
+ # without fraction
+ s = timecode_fromsecs(x, False)
+ print (x, "=>", s, "=>", timecode_tosecs(s))
+
+ t(0)
+ t(59.666666666666666)
+ t(60)
+ t(60.0)
+ t(1235 / 3.0)
+ t(10000.5)
diff --git a/mixcloud/scripts/voskjson2vtt.py b/mixcloud/scripts/voskjson2vtt.py
new file mode 100755
index 0000000..68a3520
--- /dev/null
+++ b/mixcloud/scripts/voskjson2vtt.py
@@ -0,0 +1,30 @@
+#!/usr/bin/env python
+import json
+import argparse
+import sys
+
+# requires: timecode.py
+# some functions to help working with (srt/vtt) timecodes
+from timecode import timecode_fromsecs
+
+ap = argparse.ArgumentParser("convert VOSK json output into a special vtt with timed json per word")
+ap.add_argument('infile', nargs='?', type=argparse.FileType('r'), default=sys.stdin)
+ap.add_argument('outfile', nargs='?', type=argparse.FileType('w'), default=sys.stdout)
+args = ap.parse_args()
+
+
+data = json.load(args.infile)
+
+def tc(s):
+ return timecode_fromsecs(s, alwaysfract=True, fractdelim=".")
+
+print ("WEBVTT", file=args.outfile)
+print (file=args.outfile)
+for m in data['monologues']:
+ for term in m['terms']:
+ if term['type'] == "WORD":
+ print (f"{tc(term['start'])} --> {tc(term['end'])}", file=args.outfile)
+ # print (f"{term['text']}")
+ tterm = {'text': term['text'], 'confidence': term['confidence']}
+ print (json.dumps(tterm), file=args.outfile)
+ print (file=args.outfile)
diff --git a/mixcloud/vtt_words.html b/mixcloud/vtt_words.html
new file mode 100644
index 0000000..cad1b01
--- /dev/null
+++ b/mixcloud/vtt_words.html
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/mixcloud/w25mia60.json b/mixcloud/w25mia60.json
new file mode 100644
index 0000000..8ff1c9e
--- /dev/null
+++ b/mixcloud/w25mia60.json
@@ -0,0 +1 @@
+{"schemaVersion": "2.0", "monologues": [{"speaker": {"id": "unknown", "name": null}, "start": 0.07581, "end": 10.71, "terms": [{"confidence": 1.0, "start": 0.07581, "end": 0.27, "text": "have", "type": "WORD"}, {"confidence": 1.0, "start": 0.27, "end": 0.33, "text": "a", "type": "WORD"}, {"confidence": 1.0, "start": 0.33, "end": 0.87, "text": "particular", "type": "WORD"}, {"confidence": 1.0, "start": 0.87, "end": 1.56, "text": "connection", "type": "WORD"}, {"confidence": 1.0, "start": 1.65, "end": 1.8, "text": "to", "type": "WORD"}, {"confidence": 1.0, "start": 1.8, "end": 2.19, "text": "worms", "type": "WORD"}, {"confidence": 1.0, "start": 2.25, "end": 2.61, "text": "inner", "type": "WORD"}, {"confidence": 1.0, "start": 2.61, "end": 2.94, "text": "and", "type": "WORD"}, {"confidence": 1.0, "start": 2.97, "end": 3.33, "text": "outer", "type": "WORD"}, {"confidence": 1.0, "start": 3.39, "end": 4.14, "text": "workings", "type": "WORD"}, {"confidence": 1.0, "start": 4.98, "end": 5.07, "text": "i", "type": "WORD"}, {"confidence": 1.0, "start": 5.07, "end": 5.34, "text": "wanted", "type": "WORD"}, {"confidence": 1.0, "start": 5.34, "end": 5.7, "text": "to", "type": "WORD"}, {"confidence": 1.0, "start": 5.73, "end": 5.97, "text": "make", "type": "WORD"}, {"confidence": 1.0, "start": 5.97, "end": 6.06, "text": "the", "type": "WORD"}, {"confidence": 1.0, "start": 6.06, "end": 6.6, "text": "series", "type": "WORD"}, {"confidence": 1.0, "start": 6.6, "end": 7.11, "text": "because", "type": "WORD"}, {"confidence": 0.715959, "start": 7.14, "end": 7.44, "text": "one", "type": "WORD"}, {"confidence": 1.0, "start": 7.44, "end": 7.59, "text": "has", "type": "WORD"}, {"confidence": 1.0, "start": 7.59, "end": 8.19, "text": "become", "type": "WORD"}, {"confidence": 1.0, "start": 8.28, "end": 8.64, "text": "over", "type": "WORD"}, {"confidence": 1.0, "start": 8.64, "end": 8.94, "text": "twenty", "type": "WORD"}, {"confidence": 1.0, "start": 8.94, "end": 9.21, "text": "five", "type": "WORD"}, {"confidence": 1.0, "start": 9.21, "end": 9.69, "text": "years", "type": "WORD"}, {"confidence": 0.868049, "start": 9.69, "end": 9.87, "text": "and", "type": "WORD"}, {"confidence": 1.0, "start": 9.87, "end": 10.71, "text": "institution", "type": "WORD"}]}, {"speaker": {"id": "unknown", "name": null}, "start": 11.46, "end": 29.88, "terms": [{"confidence": 1.0, "start": 11.46, "end": 11.61, "text": "but", "type": "WORD"}, {"confidence": 1.0, "start": 11.61, "end": 11.7, "text": "an", "type": "WORD"}, {"confidence": 1.0, "start": 11.7, "end": 12.36, "text": "institution", "type": "WORD"}, {"confidence": 1.0, "start": 12.36, "end": 12.75, "text": "built", "type": "WORD"}, {"confidence": 1.0, "start": 13.14, "end": 13.494532, "text": "with", "type": "WORD"}, {"confidence": 0.908873, "start": 13.5, "end": 13.62, "text": "and", "type": "WORD"}, {"confidence": 0.664659, "start": 13.62, "end": 14.13, "text": "for", "type": "WORD"}, {"confidence": 1.0, "start": 14.13, "end": 14.28, "text": "and", "type": "WORD"}, {"confidence": 1.0, "start": 14.28, "end": 14.85, "text": "from", "type": "WORD"}, {"confidence": 1.0, "start": 14.88, "end": 14.97, "text": "a", "type": "WORD"}, {"confidence": 1.0, "start": 14.97, "end": 15.12, "text": "d", "type": "WORD"}, {"confidence": 1.0, "start": 15.12, "end": 15.24, "text": "i", "type": "WORD"}, {"confidence": 1.0, "start": 15.24, "end": 15.48, "text": "y", "type": "WORD"}, {"confidence": 1.0, "start": 15.48, "end": 16.11, "text": "spirits", "type": "WORD"}, {"confidence": 0.821086, "start": 16.59, "end": 16.74, "text": "and", "type": "WORD"}, {"confidence": 1.0, "start": 16.74, "end": 17.16, "text": "something", "type": "WORD"}, {"confidence": 1.0, "start": 17.22, "end": 17.4, "text": "that", "type": "WORD"}, {"confidence": 1.0, "start": 17.4, "end": 17.46, "text": "it", "type": "WORD"}, {"confidence": 1.0, "start": 17.46, "end": 17.67, "text": "still", "type": "WORD"}, {"confidence": 1.0, "start": 17.67, "end": 18.39, "text": "retains", "type": "WORD"}, {"confidence": 1.0, "start": 18.9, "end": 19.08, "text": "it's", "type": "WORD"}, {"confidence": 1.0, "start": 19.08, "end": 19.17, "text": "the", "type": "WORD"}, {"confidence": 1.0, "start": 19.17, "end": 19.47, "text": "nature", "type": "WORD"}, {"confidence": 1.0, "start": 19.47, "end": 19.56, "text": "of", "type": "WORD"}, {"confidence": 1.0, "start": 19.56, "end": 19.71, "text": "do", "type": "WORD"}, {"confidence": 1.0, "start": 19.71, "end": 19.8, "text": "i", "type": "WORD"}, {"confidence": 1.0, "start": 19.8, "end": 20.017606, "text": "was", "type": "WORD"}, {"confidence": 0.697723, "start": 20.017606, "end": 20.49, "text": "spaces", "type": "WORD"}, {"confidence": 1.0, "start": 20.49, "end": 20.64, "text": "of", "type": "WORD"}, {"confidence": 1.0, "start": 20.64, "end": 21.06, "text": "course", "type": "WORD"}, {"confidence": 1.0, "start": 21.06, "end": 21.24, "text": "and", "type": "WORD"}, {"confidence": 1.0, "start": 21.24, "end": 21.42, "text": "any", "type": "WORD"}, {"confidence": 1.0, "start": 21.42, "end": 21.81, "text": "cultural", "type": "WORD"}, {"confidence": 1.0, "start": 21.81, "end": 22.41, "text": "spaces", "type": "WORD"}, {"confidence": 1.0, "start": 22.47, "end": 22.71, "text": "that", "type": "WORD"}, {"confidence": 1.0, "start": 22.71, "end": 23.04, "text": "people", "type": "WORD"}, {"confidence": 1.0, "start": 23.04, "end": 23.19, "text": "who", "type": "WORD"}, {"confidence": 1.0, "start": 23.19, "end": 23.49, "text": "make", "type": "WORD"}, {"confidence": 1.0, "start": 23.49, "end": 23.61, "text": "it", "type": "WORD"}, {"confidence": 1.0, "start": 23.61, "end": 23.88, "text": "come", "type": "WORD"}, {"confidence": 1.0, "start": 23.88, "end": 23.97, "text": "and", "type": "WORD"}, {"confidence": 1.0, "start": 23.97, "end": 24.39, "text": "go", "type": "WORD"}, {"confidence": 1.0, "start": 24.57, "end": 24.69, "text": "the", "type": "WORD"}, {"confidence": 1.0, "start": 24.69, "end": 24.9, "text": "name", "type": "WORD"}, {"confidence": 1.0, "start": 24.9, "end": 25.02, "text": "on", "type": "WORD"}, {"confidence": 1.0, "start": 25.02, "end": 25.08, "text": "the", "type": "WORD"}, {"confidence": 1.0, "start": 25.08, "end": 25.41, "text": "building", "type": "WORD"}, {"confidence": 1.0, "start": 25.41, "end": 25.74, "text": "stays", "type": "WORD"}, {"confidence": 1.0, "start": 25.74, "end": 25.83, "text": "the", "type": "WORD"}, {"confidence": 1.0, "start": 25.83, "end": 26.16, "text": "same", "type": "WORD"}, {"confidence": 1.0, "start": 26.16, "end": 26.37, "text": "but", "type": "WORD"}, {"confidence": 1.0, "start": 26.37, "end": 26.46, "text": "the", "type": "WORD"}, {"confidence": 1.0, "start": 26.46, "end": 26.88, "text": "vibe", "type": "WORD"}, {"confidence": 1.0, "start": 26.97, "end": 27.63, "text": "changes", "type": "WORD"}, {"confidence": 1.0, "start": 28.02, "end": 28.2, "text": "and", "type": "WORD"}, {"confidence": 1.0, "start": 28.2, "end": 28.26, "text": "the", "type": "WORD"}, {"confidence": 1.0, "start": 28.26, "end": 28.56, "text": "sense", "type": "WORD"}, {"confidence": 1.0, "start": 28.56, "end": 28.68, "text": "of", "type": "WORD"}, {"confidence": 1.0, "start": 28.68, "end": 29.19, "text": "identity", "type": "WORD"}, {"confidence": 1.0, "start": 29.19, "end": 29.88, "text": "shifts", "type": "WORD"}]}, {"speaker": {"id": "unknown", "name": null}, "start": 31.02, "end": 39.87, "terms": [{"confidence": 1.0, "start": 31.02, "end": 31.44, "text": "worm", "type": "WORD"}, {"confidence": 1.0, "start": 31.47, "end": 31.71, "text": "is", "type": "WORD"}, {"confidence": 1.0, "start": 31.71, "end": 31.77, "text": "a", "type": "WORD"}, {"confidence": 1.0, "start": 31.77, "end": 32.07, "text": "place", "type": "WORD"}, {"confidence": 1.0, "start": 32.07, "end": 32.19, "text": "of", "type": "WORD"}, {"confidence": 1.0, "start": 32.19, "end": 32.85, "text": "invention", "type": "WORD"}, {"confidence": 1.0, "start": 32.85, "end": 33.0, "text": "and", "type": "WORD"}, {"confidence": 1.0, "start": 33.0, "end": 33.81, "text": "reinvention", "type": "WORD"}, {"confidence": 1.0, "start": 33.81, "end": 34.17, "text": "and", "type": "WORD"}, {"confidence": 0.722413, "start": 34.23, "end": 34.41, "text": "with", "type": "WORD"}, {"confidence": 1.0, "start": 34.41, "end": 34.5, "text": "the", "type": "WORD"}, {"confidence": 1.0, "start": 34.5, "end": 34.92, "text": "constant", "type": "WORD"}, {"confidence": 1.0, "start": 34.92, "end": 35.46, "text": "motion", "type": "WORD"}, {"confidence": 1.0, "start": 35.52, "end": 35.88, "text": "certain", "type": "WORD"}, {"confidence": 1.0, "start": 35.88, "end": 36.39, "text": "stories", "type": "WORD"}, {"confidence": 1.0, "start": 36.39, "end": 36.51, "text": "and", "type": "WORD"}, {"confidence": 1.0, "start": 36.51, "end": 37.05, "text": "memories", "type": "WORD"}, {"confidence": 0.854091, "start": 37.08, "end": 37.38, "text": "do", "type": "WORD"}, {"confidence": 1.0, "start": 37.41, "end": 37.68, "text": "fade", "type": "WORD"}, {"confidence": 1.0, "start": 37.68, "end": 38.07, "text": "away", "type": "WORD"}, {"confidence": 1.0, "start": 38.64, "end": 39.12, "text": "sometimes", "type": "WORD"}, {"confidence": 1.0, "start": 39.12, "end": 39.33, "text": "quite", "type": "WORD"}, {"confidence": 1.0, "start": 39.33, "end": 39.87, "text": "quickly", "type": "WORD"}]}, {"speaker": {"id": "unknown", "name": null}, "start": 40.77, "end": 52.68, "terms": [{"confidence": 1.0, "start": 40.77, "end": 40.89, "text": "the", "type": "WORD"}, {"confidence": 1.0, "start": 40.89, "end": 41.16, "text": "idea", "type": "WORD"}, {"confidence": 1.0, "start": 41.16, "end": 41.31, "text": "of", "type": "WORD"}, {"confidence": 1.0, "start": 41.34, "end": 41.73, "text": "this", "type": "WORD"}, {"confidence": 1.0, "start": 41.79, "end": 42.24, "text": "history", "type": "WORD"}, {"confidence": 1.0, "start": 42.24, "end": 42.362058, "text": "of", "type": "WORD"}, {"confidence": 0.478323, "start": 42.362058, "end": 42.563606, "text": "why", "type": "WORD"}, {"confidence": 1.0, "start": 42.563606, "end": 42.78, "text": "i'm", "type": "WORD"}, {"confidence": 1.0, "start": 42.87, "end": 43.08, "text": "not", "type": "WORD"}, {"confidence": 1.0, "start": 43.08, "end": 43.2, "text": "the", "type": "WORD"}, {"confidence": 1.0, "start": 43.26, "end": 43.62, "text": "only", "type": "WORD"}, {"confidence": 1.0, "start": 43.65, "end": 44.13, "text": "possible", "type": "WORD"}, {"confidence": 1.0, "start": 44.16, "end": 44.64, "text": "history", "type": "WORD"}, {"confidence": 1.0, "start": 44.67, "end": 44.79, "text": "of", "type": "WORD"}, {"confidence": 1.0, "start": 44.79, "end": 45.27, "text": "course", "type": "WORD"}, {"confidence": 1.0, "start": 45.33, "end": 45.51, "text": "is", "type": "WORD"}, {"confidence": 1.0, "start": 45.51, "end": 45.63, "text": "to", "type": "WORD"}, {"confidence": 1.0, "start": 45.63, "end": 45.93, "text": "try", "type": "WORD"}, {"confidence": 1.0, "start": 45.93, "end": 46.08, "text": "and", "type": "WORD"}, {"confidence": 1.0, "start": 46.08, "end": 46.65, "text": "capture", "type": "WORD"}, {"confidence": 1.0, "start": 47.04, "end": 47.16, "text": "a", "type": "WORD"}, {"confidence": 1.0, "start": 47.16, "end": 47.37, "text": "few", "type": "WORD"}, {"confidence": 1.0, "start": 47.37, "end": 47.46, "text": "of", "type": "WORD"}, {"confidence": 1.0, "start": 47.46, "end": 47.7, "text": "those", "type": "WORD"}, {"confidence": 1.0, "start": 47.7, "end": 48.21, "text": "stories", "type": "WORD"}, {"confidence": 1.0, "start": 48.24, "end": 48.36, "text": "with", "type": "WORD"}, {"confidence": 1.0, "start": 48.36, "end": 48.42, "text": "the", "type": "WORD"}, {"confidence": 1.0, "start": 48.42, "end": 48.75, "text": "people", "type": "WORD"}, {"confidence": 1.0, "start": 48.75, "end": 48.9, "text": "that", "type": "WORD"}, {"confidence": 1.0, "start": 48.93, "end": 49.08, "text": "i've", "type": "WORD"}, {"confidence": 1.0, "start": 49.08, "end": 49.53, "text": "met", "type": "WORD"}, {"confidence": 1.0, "start": 49.95, "end": 50.121068, "text": "and", "type": "WORD"}, {"confidence": 1.0, "start": 50.138932, "end": 50.370344, "text": "people", "type": "WORD"}, {"confidence": 0.966533, "start": 50.370344, "end": 50.49, "text": "that", "type": "WORD"}, {"confidence": 0.314138, "start": 50.49, "end": 50.748351, "text": "maria", "type": "WORD"}, {"confidence": 0.542389, "start": 50.748351, "end": 50.91, "text": "it", "type": "WORD"}, {"confidence": 1.0, "start": 50.934155, "end": 51.12, "text": "has", "type": "WORD"}, {"confidence": 0.49303, "start": 51.12, "end": 51.57, "text": "known", "type": "WORD"}, {"confidence": 1.0, "start": 51.96, "end": 52.23, "text": "along", "type": "WORD"}, {"confidence": 1.0, "start": 52.23, "end": 52.32, "text": "the", "type": "WORD"}, {"confidence": 1.0, "start": 52.32, "end": 52.68, "text": "way", "type": "WORD"}]}, {"speaker": {"id": "unknown", "name": null}, "start": 53.79, "end": 59.97, "terms": [{"confidence": 1.0, "start": 53.79, "end": 53.94, "text": "but", "type": "WORD"}, {"confidence": 1.0, "start": 53.94, "end": 54.0, "text": "i'm", "type": "WORD"}, {"confidence": 1.0, "start": 54.0, "end": 54.09, "text": "not", "type": "WORD"}, {"confidence": 1.0, "start": 54.09, "end": 54.21, "text": "going", "type": "WORD"}, {"confidence": 1.0, "start": 54.21, "end": 54.27, "text": "to", "type": "WORD"}, {"confidence": 1.0, "start": 54.27, "end": 54.63, "text": "begin", "type": "WORD"}, {"confidence": 1.0, "start": 54.66, "end": 54.78, "text": "at", "type": "WORD"}, {"confidence": 1.0, "start": 54.78, "end": 54.84, "text": "the", "type": "WORD"}, {"confidence": 1.0, "start": 54.84, "end": 55.38, "text": "beginning", "type": "WORD"}, {"confidence": 1.0, "start": 55.92, "end": 56.13, "text": "that", "type": "WORD"}, {"confidence": 1.0, "start": 56.13, "end": 56.25, "text": "would", "type": "WORD"}, {"confidence": 1.0, "start": 56.25, "end": 56.34, "text": "be", "type": "WORD"}, {"confidence": 1.0, "start": 56.34, "end": 56.73, "text": "logical", "type": "WORD"}, {"confidence": 1.0, "start": 56.73, "end": 56.88, "text": "but", "type": "WORD"}, {"confidence": 1.0, "start": 56.88, "end": 57.21, "text": "actually", "type": "WORD"}, {"confidence": 1.0, "start": 57.21, "end": 57.3, "text": "have", "type": "WORD"}, {"confidence": 1.0, "start": 57.3, "end": 57.54, "text": "already", "type": "WORD"}, {"confidence": 1.0, "start": 57.54, "end": 58.02, "text": "begun", "type": "WORD"}, {"confidence": 1.0, "start": 58.05, "end": 58.68, "text": "obviously", "type": "WORD"}, {"confidence": 1.0, "start": 58.68, "end": 58.86, "text": "and", "type": "WORD"}, {"confidence": 1.0, "start": 58.86, "end": 59.37, "text": "today's", "type": "WORD"}, {"confidence": 1.0, "start": 59.37, "end": 59.97, "text": "episode", "type": "WORD"}]}], "text": []}
\ No newline at end of file
diff --git a/mixcloud/w25mia60_words.vtt b/mixcloud/w25mia60_words.vtt
new file mode 100644
index 0000000..11f67d1
--- /dev/null
+++ b/mixcloud/w25mia60_words.vtt
@@ -0,0 +1,518 @@
+WEBVTT
+
+00:00.076 --> 00:00.270
+{"text": "have", "confidence": 1.0}
+
+00:00.270 --> 00:00.330
+{"text": "a", "confidence": 1.0}
+
+00:00.330 --> 00:00.870
+{"text": "particular", "confidence": 1.0}
+
+00:00.870 --> 00:01.560
+{"text": "connection", "confidence": 1.0}
+
+00:01.650 --> 00:01.800
+{"text": "to", "confidence": 1.0}
+
+00:01.800 --> 00:02.190
+{"text": "worms", "confidence": 1.0}
+
+00:02.250 --> 00:02.610
+{"text": "inner", "confidence": 1.0}
+
+00:02.610 --> 00:02.940
+{"text": "and", "confidence": 1.0}
+
+00:02.970 --> 00:03.330
+{"text": "outer", "confidence": 1.0}
+
+00:03.390 --> 00:04.140
+{"text": "workings", "confidence": 1.0}
+
+00:04.980 --> 00:05.070
+{"text": "i", "confidence": 1.0}
+
+00:05.070 --> 00:05.340
+{"text": "wanted", "confidence": 1.0}
+
+00:05.340 --> 00:05.700
+{"text": "to", "confidence": 1.0}
+
+00:05.730 --> 00:05.970
+{"text": "make", "confidence": 1.0}
+
+00:05.970 --> 00:06.060
+{"text": "the", "confidence": 1.0}
+
+00:06.060 --> 00:06.600
+{"text": "series", "confidence": 1.0}
+
+00:06.600 --> 00:07.110
+{"text": "because", "confidence": 1.0}
+
+00:07.140 --> 00:07.440
+{"text": "one", "confidence": 0.715959}
+
+00:07.440 --> 00:07.590
+{"text": "has", "confidence": 1.0}
+
+00:07.590 --> 00:08.190
+{"text": "become", "confidence": 1.0}
+
+00:08.280 --> 00:08.640
+{"text": "over", "confidence": 1.0}
+
+00:08.640 --> 00:08.940
+{"text": "twenty", "confidence": 1.0}
+
+00:08.940 --> 00:09.210
+{"text": "five", "confidence": 1.0}
+
+00:09.210 --> 00:09.690
+{"text": "years", "confidence": 1.0}
+
+00:09.690 --> 00:09.870
+{"text": "and", "confidence": 0.868049}
+
+00:09.870 --> 00:10.710
+{"text": "institution", "confidence": 1.0}
+
+00:11.460 --> 00:11.610
+{"text": "but", "confidence": 1.0}
+
+00:11.610 --> 00:11.700
+{"text": "an", "confidence": 1.0}
+
+00:11.700 --> 00:12.360
+{"text": "institution", "confidence": 1.0}
+
+00:12.360 --> 00:12.750
+{"text": "built", "confidence": 1.0}
+
+00:13.140 --> 00:13.495
+{"text": "with", "confidence": 1.0}
+
+00:13.500 --> 00:13.620
+{"text": "and", "confidence": 0.908873}
+
+00:13.620 --> 00:14.130
+{"text": "for", "confidence": 0.664659}
+
+00:14.130 --> 00:14.280
+{"text": "and", "confidence": 1.0}
+
+00:14.280 --> 00:14.850
+{"text": "from", "confidence": 1.0}
+
+00:14.880 --> 00:14.970
+{"text": "a", "confidence": 1.0}
+
+00:14.970 --> 00:15.120
+{"text": "d", "confidence": 1.0}
+
+00:15.120 --> 00:15.240
+{"text": "i", "confidence": 1.0}
+
+00:15.240 --> 00:15.480
+{"text": "y", "confidence": 1.0}
+
+00:15.480 --> 00:16.110
+{"text": "spirits", "confidence": 1.0}
+
+00:16.590 --> 00:16.740
+{"text": "and", "confidence": 0.821086}
+
+00:16.740 --> 00:17.160
+{"text": "something", "confidence": 1.0}
+
+00:17.220 --> 00:17.400
+{"text": "that", "confidence": 1.0}
+
+00:17.400 --> 00:17.460
+{"text": "it", "confidence": 1.0}
+
+00:17.460 --> 00:17.670
+{"text": "still", "confidence": 1.0}
+
+00:17.670 --> 00:18.390
+{"text": "retains", "confidence": 1.0}
+
+00:18.900 --> 00:19.080
+{"text": "it's", "confidence": 1.0}
+
+00:19.080 --> 00:19.170
+{"text": "the", "confidence": 1.0}
+
+00:19.170 --> 00:19.470
+{"text": "nature", "confidence": 1.0}
+
+00:19.470 --> 00:19.560
+{"text": "of", "confidence": 1.0}
+
+00:19.560 --> 00:19.710
+{"text": "do", "confidence": 1.0}
+
+00:19.710 --> 00:19.800
+{"text": "i", "confidence": 1.0}
+
+00:19.800 --> 00:20.018
+{"text": "was", "confidence": 1.0}
+
+00:20.018 --> 00:20.490
+{"text": "spaces", "confidence": 0.697723}
+
+00:20.490 --> 00:20.640
+{"text": "of", "confidence": 1.0}
+
+00:20.640 --> 00:21.060
+{"text": "course", "confidence": 1.0}
+
+00:21.060 --> 00:21.240
+{"text": "and", "confidence": 1.0}
+
+00:21.240 --> 00:21.420
+{"text": "any", "confidence": 1.0}
+
+00:21.420 --> 00:21.810
+{"text": "cultural", "confidence": 1.0}
+
+00:21.810 --> 00:22.410
+{"text": "spaces", "confidence": 1.0}
+
+00:22.470 --> 00:22.710
+{"text": "that", "confidence": 1.0}
+
+00:22.710 --> 00:23.040
+{"text": "people", "confidence": 1.0}
+
+00:23.040 --> 00:23.190
+{"text": "who", "confidence": 1.0}
+
+00:23.190 --> 00:23.490
+{"text": "make", "confidence": 1.0}
+
+00:23.490 --> 00:23.610
+{"text": "it", "confidence": 1.0}
+
+00:23.610 --> 00:23.880
+{"text": "come", "confidence": 1.0}
+
+00:23.880 --> 00:23.970
+{"text": "and", "confidence": 1.0}
+
+00:23.970 --> 00:24.390
+{"text": "go", "confidence": 1.0}
+
+00:24.570 --> 00:24.690
+{"text": "the", "confidence": 1.0}
+
+00:24.690 --> 00:24.900
+{"text": "name", "confidence": 1.0}
+
+00:24.900 --> 00:25.020
+{"text": "on", "confidence": 1.0}
+
+00:25.020 --> 00:25.080
+{"text": "the", "confidence": 1.0}
+
+00:25.080 --> 00:25.410
+{"text": "building", "confidence": 1.0}
+
+00:25.410 --> 00:25.740
+{"text": "stays", "confidence": 1.0}
+
+00:25.740 --> 00:25.830
+{"text": "the", "confidence": 1.0}
+
+00:25.830 --> 00:26.160
+{"text": "same", "confidence": 1.0}
+
+00:26.160 --> 00:26.370
+{"text": "but", "confidence": 1.0}
+
+00:26.370 --> 00:26.460
+{"text": "the", "confidence": 1.0}
+
+00:26.460 --> 00:26.880
+{"text": "vibe", "confidence": 1.0}
+
+00:26.970 --> 00:27.630
+{"text": "changes", "confidence": 1.0}
+
+00:28.020 --> 00:28.200
+{"text": "and", "confidence": 1.0}
+
+00:28.200 --> 00:28.260
+{"text": "the", "confidence": 1.0}
+
+00:28.260 --> 00:28.560
+{"text": "sense", "confidence": 1.0}
+
+00:28.560 --> 00:28.680
+{"text": "of", "confidence": 1.0}
+
+00:28.680 --> 00:29.190
+{"text": "identity", "confidence": 1.0}
+
+00:29.190 --> 00:29.880
+{"text": "shifts", "confidence": 1.0}
+
+00:31.020 --> 00:31.440
+{"text": "worm", "confidence": 1.0}
+
+00:31.470 --> 00:31.710
+{"text": "is", "confidence": 1.0}
+
+00:31.710 --> 00:31.770
+{"text": "a", "confidence": 1.0}
+
+00:31.770 --> 00:32.070
+{"text": "place", "confidence": 1.0}
+
+00:32.070 --> 00:32.190
+{"text": "of", "confidence": 1.0}
+
+00:32.190 --> 00:32.850
+{"text": "invention", "confidence": 1.0}
+
+00:32.850 --> 00:33.000
+{"text": "and", "confidence": 1.0}
+
+00:33.000 --> 00:33.810
+{"text": "reinvention", "confidence": 1.0}
+
+00:33.810 --> 00:34.170
+{"text": "and", "confidence": 1.0}
+
+00:34.230 --> 00:34.410
+{"text": "with", "confidence": 0.722413}
+
+00:34.410 --> 00:34.500
+{"text": "the", "confidence": 1.0}
+
+00:34.500 --> 00:34.920
+{"text": "constant", "confidence": 1.0}
+
+00:34.920 --> 00:35.460
+{"text": "motion", "confidence": 1.0}
+
+00:35.520 --> 00:35.880
+{"text": "certain", "confidence": 1.0}
+
+00:35.880 --> 00:36.390
+{"text": "stories", "confidence": 1.0}
+
+00:36.390 --> 00:36.510
+{"text": "and", "confidence": 1.0}
+
+00:36.510 --> 00:37.050
+{"text": "memories", "confidence": 1.0}
+
+00:37.080 --> 00:37.380
+{"text": "do", "confidence": 0.854091}
+
+00:37.410 --> 00:37.680
+{"text": "fade", "confidence": 1.0}
+
+00:37.680 --> 00:38.070
+{"text": "away", "confidence": 1.0}
+
+00:38.640 --> 00:39.120
+{"text": "sometimes", "confidence": 1.0}
+
+00:39.120 --> 00:39.330
+{"text": "quite", "confidence": 1.0}
+
+00:39.330 --> 00:39.870
+{"text": "quickly", "confidence": 1.0}
+
+00:40.770 --> 00:40.890
+{"text": "the", "confidence": 1.0}
+
+00:40.890 --> 00:41.160
+{"text": "idea", "confidence": 1.0}
+
+00:41.160 --> 00:41.310
+{"text": "of", "confidence": 1.0}
+
+00:41.340 --> 00:41.730
+{"text": "this", "confidence": 1.0}
+
+00:41.790 --> 00:42.240
+{"text": "history", "confidence": 1.0}
+
+00:42.240 --> 00:42.362
+{"text": "of", "confidence": 1.0}
+
+00:42.362 --> 00:42.564
+{"text": "why", "confidence": 0.478323}
+
+00:42.564 --> 00:42.780
+{"text": "i'm", "confidence": 1.0}
+
+00:42.870 --> 00:43.080
+{"text": "not", "confidence": 1.0}
+
+00:43.080 --> 00:43.200
+{"text": "the", "confidence": 1.0}
+
+00:43.260 --> 00:43.620
+{"text": "only", "confidence": 1.0}
+
+00:43.650 --> 00:44.130
+{"text": "possible", "confidence": 1.0}
+
+00:44.160 --> 00:44.640
+{"text": "history", "confidence": 1.0}
+
+00:44.670 --> 00:44.790
+{"text": "of", "confidence": 1.0}
+
+00:44.790 --> 00:45.270
+{"text": "course", "confidence": 1.0}
+
+00:45.330 --> 00:45.510
+{"text": "is", "confidence": 1.0}
+
+00:45.510 --> 00:45.630
+{"text": "to", "confidence": 1.0}
+
+00:45.630 --> 00:45.930
+{"text": "try", "confidence": 1.0}
+
+00:45.930 --> 00:46.080
+{"text": "and", "confidence": 1.0}
+
+00:46.080 --> 00:46.650
+{"text": "capture", "confidence": 1.0}
+
+00:47.040 --> 00:47.160
+{"text": "a", "confidence": 1.0}
+
+00:47.160 --> 00:47.370
+{"text": "few", "confidence": 1.0}
+
+00:47.370 --> 00:47.460
+{"text": "of", "confidence": 1.0}
+
+00:47.460 --> 00:47.700
+{"text": "those", "confidence": 1.0}
+
+00:47.700 --> 00:48.210
+{"text": "stories", "confidence": 1.0}
+
+00:48.240 --> 00:48.360
+{"text": "with", "confidence": 1.0}
+
+00:48.360 --> 00:48.420
+{"text": "the", "confidence": 1.0}
+
+00:48.420 --> 00:48.750
+{"text": "people", "confidence": 1.0}
+
+00:48.750 --> 00:48.900
+{"text": "that", "confidence": 1.0}
+
+00:48.930 --> 00:49.080
+{"text": "i've", "confidence": 1.0}
+
+00:49.080 --> 00:49.530
+{"text": "met", "confidence": 1.0}
+
+00:49.950 --> 00:50.121
+{"text": "and", "confidence": 1.0}
+
+00:50.139 --> 00:50.370
+{"text": "people", "confidence": 1.0}
+
+00:50.370 --> 00:50.490
+{"text": "that", "confidence": 0.966533}
+
+00:50.490 --> 00:50.748
+{"text": "maria", "confidence": 0.314138}
+
+00:50.748 --> 00:50.910
+{"text": "it", "confidence": 0.542389}
+
+00:50.934 --> 00:51.120
+{"text": "has", "confidence": 1.0}
+
+00:51.120 --> 00:51.570
+{"text": "known", "confidence": 0.49303}
+
+00:51.960 --> 00:52.230
+{"text": "along", "confidence": 1.0}
+
+00:52.230 --> 00:52.320
+{"text": "the", "confidence": 1.0}
+
+00:52.320 --> 00:52.680
+{"text": "way", "confidence": 1.0}
+
+00:53.790 --> 00:53.940
+{"text": "but", "confidence": 1.0}
+
+00:53.940 --> 00:54.000
+{"text": "i'm", "confidence": 1.0}
+
+00:54.000 --> 00:54.090
+{"text": "not", "confidence": 1.0}
+
+00:54.090 --> 00:54.210
+{"text": "going", "confidence": 1.0}
+
+00:54.210 --> 00:54.270
+{"text": "to", "confidence": 1.0}
+
+00:54.270 --> 00:54.630
+{"text": "begin", "confidence": 1.0}
+
+00:54.660 --> 00:54.780
+{"text": "at", "confidence": 1.0}
+
+00:54.780 --> 00:54.840
+{"text": "the", "confidence": 1.0}
+
+00:54.840 --> 00:55.380
+{"text": "beginning", "confidence": 1.0}
+
+00:55.920 --> 00:56.130
+{"text": "that", "confidence": 1.0}
+
+00:56.130 --> 00:56.250
+{"text": "would", "confidence": 1.0}
+
+00:56.250 --> 00:56.340
+{"text": "be", "confidence": 1.0}
+
+00:56.340 --> 00:56.730
+{"text": "logical", "confidence": 1.0}
+
+00:56.730 --> 00:56.880
+{"text": "but", "confidence": 1.0}
+
+00:56.880 --> 00:57.210
+{"text": "actually", "confidence": 1.0}
+
+00:57.210 --> 00:57.300
+{"text": "have", "confidence": 1.0}
+
+00:57.300 --> 00:57.540
+{"text": "already", "confidence": 1.0}
+
+00:57.540 --> 00:58.020
+{"text": "begun", "confidence": 1.0}
+
+00:58.050 --> 00:58.680
+{"text": "obviously", "confidence": 1.0}
+
+00:58.680 --> 00:58.860
+{"text": "and", "confidence": 1.0}
+
+00:58.860 --> 00:59.370
+{"text": "today's", "confidence": 1.0}
+
+00:59.370 --> 00:59.970
+{"text": "episode", "confidence": 1.0}
+