From e9ac6075005608e7de88b25dc941bf6966028bb2 Mon Sep 17 00:00:00 2001 From: Mike Swanson Date: Mon, 27 Apr 2026 14:41:04 -0700 Subject: [PATCH] radio show: co-host voice profile, Q&A extraction fixes, archive index - Build Tom (co-host) voice profile (44 embeddings, 0.698 similarity to Mike) - diarizer.py: add CO-HOST speaker label for cohost-role profiles - voice_profiler.py: emit "Cohost: " label for cohost role - qa_extractor.py: overlap resolution at load time (midpoint boundary split), 4s CALLER-preference threshold, turn-based caller-intro lookback (2 HOST turns), _preceded_by_caller_intro() helper, _PHONE_GREETING pattern, 751-1041 + "we'll get your problem solved" promo signatures - benchmark.py: use src.transcriber.transcribe with batch_size=16 - add index_test_episodes.py and build_cohost_profile.py scripts - add .gitignore (exclude episodes, transcripts, *.db, .venv) - session log: 2026-04-27-qa-extraction-cohost-indexing.md Result: 2016-s8e43 drops from 12 false-positive Q&A pairs to 2 real caller pairs. archive.db: 6 episodes, 762 segments, 10 Q&A pairs, FTS5 search verified. Co-Authored-By: Claude Sonnet 4.6 --- .../radio-show/audio-processor/.gitignore | 25 ++ .../radio-show/audio-processor/benchmark.py | 31 +-- .../audio-processor/build_cohost_profile.py | 115 ++++++++ .../audio-processor/index_test_episodes.py | 102 +++++++ .../audio-processor/src/diarizer.py | 2 + .../audio-processor/src/qa_extractor.py | 71 ++++- .../audio-processor/src/transcriber.py | 89 +++---- .../audio-processor/src/voice_profiler.py | 5 +- .../voice-profiles/profiles.json | 58 ++-- .../voice-profiles/tom/composite.npy | Bin 0 -> 2176 bytes .../voice-profiles/tom/embedding_0000.npy | Bin 0 -> 2176 bytes .../voice-profiles/tom/embedding_0001.npy | Bin 0 -> 2176 bytes .../voice-profiles/tom/embedding_0002.npy | Bin 0 -> 2176 bytes .../voice-profiles/tom/embedding_0003.npy | Bin 0 -> 2176 bytes .../voice-profiles/tom/embedding_0004.npy | Bin 0 -> 2176 bytes .../voice-profiles/tom/embedding_0005.npy | Bin 0 -> 2176 bytes .../voice-profiles/tom/embedding_0006.npy | Bin 0 -> 2176 bytes .../voice-profiles/tom/embedding_0007.npy | Bin 0 -> 2176 bytes .../voice-profiles/tom/embedding_0008.npy | Bin 0 -> 2176 bytes .../voice-profiles/tom/embedding_0009.npy | Bin 0 -> 2176 bytes .../voice-profiles/tom/embedding_0010.npy | Bin 0 -> 2176 bytes .../voice-profiles/tom/embedding_0011.npy | Bin 0 -> 2176 bytes .../voice-profiles/tom/embedding_0012.npy | Bin 0 -> 2176 bytes .../voice-profiles/tom/embedding_0013.npy | Bin 0 -> 2176 bytes .../voice-profiles/tom/embedding_0014.npy | Bin 0 -> 2176 bytes .../voice-profiles/tom/embedding_0015.npy | Bin 0 -> 2176 bytes .../voice-profiles/tom/embedding_0016.npy | Bin 0 -> 2176 bytes .../voice-profiles/tom/embedding_0017.npy | Bin 0 -> 2176 bytes .../voice-profiles/tom/embedding_0018.npy | Bin 0 -> 2176 bytes .../voice-profiles/tom/embedding_0019.npy | Bin 0 -> 2176 bytes .../voice-profiles/tom/embedding_0020.npy | Bin 0 -> 2176 bytes .../voice-profiles/tom/embedding_0021.npy | Bin 0 -> 2176 bytes .../voice-profiles/tom/embedding_0022.npy | Bin 0 -> 2176 bytes .../voice-profiles/tom/embedding_0023.npy | Bin 0 -> 2176 bytes .../voice-profiles/tom/embedding_0024.npy | Bin 0 -> 2176 bytes .../voice-profiles/tom/embedding_0025.npy | Bin 0 -> 2176 bytes .../voice-profiles/tom/embedding_0026.npy | Bin 0 -> 2176 bytes .../voice-profiles/tom/embedding_0027.npy | Bin 0 -> 2176 bytes .../voice-profiles/tom/embedding_0028.npy | Bin 0 -> 2176 bytes .../voice-profiles/tom/embedding_0029.npy | Bin 0 -> 2176 bytes .../voice-profiles/tom/embedding_0030.npy | Bin 0 -> 2176 bytes .../voice-profiles/tom/embedding_0031.npy | Bin 0 -> 2176 bytes .../voice-profiles/tom/embedding_0032.npy | Bin 0 -> 2176 bytes .../voice-profiles/tom/embedding_0033.npy | Bin 0 -> 2176 bytes .../voice-profiles/tom/embedding_0034.npy | Bin 0 -> 2176 bytes .../voice-profiles/tom/embedding_0035.npy | Bin 0 -> 2176 bytes .../voice-profiles/tom/embedding_0036.npy | Bin 0 -> 2176 bytes .../voice-profiles/tom/embedding_0037.npy | Bin 0 -> 2176 bytes .../voice-profiles/tom/embedding_0038.npy | Bin 0 -> 2176 bytes .../voice-profiles/tom/embedding_0039.npy | Bin 0 -> 2176 bytes .../voice-profiles/tom/embedding_0040.npy | Bin 0 -> 2176 bytes .../voice-profiles/tom/embedding_0041.npy | Bin 0 -> 2176 bytes .../voice-profiles/tom/embedding_0042.npy | Bin 0 -> 2176 bytes .../voice-profiles/tom/embedding_0043.npy | Bin 0 -> 2176 bytes ...026-04-27-qa-extraction-cohost-indexing.md | 251 ++++++++++++++++++ 55 files changed, 649 insertions(+), 100 deletions(-) create mode 100644 projects/radio-show/audio-processor/.gitignore create mode 100644 projects/radio-show/audio-processor/build_cohost_profile.py create mode 100644 projects/radio-show/audio-processor/index_test_episodes.py create mode 100644 projects/radio-show/audio-processor/voice-profiles/tom/composite.npy create mode 100644 projects/radio-show/audio-processor/voice-profiles/tom/embedding_0000.npy create mode 100644 projects/radio-show/audio-processor/voice-profiles/tom/embedding_0001.npy create mode 100644 projects/radio-show/audio-processor/voice-profiles/tom/embedding_0002.npy create mode 100644 projects/radio-show/audio-processor/voice-profiles/tom/embedding_0003.npy create mode 100644 projects/radio-show/audio-processor/voice-profiles/tom/embedding_0004.npy create mode 100644 projects/radio-show/audio-processor/voice-profiles/tom/embedding_0005.npy create mode 100644 projects/radio-show/audio-processor/voice-profiles/tom/embedding_0006.npy create mode 100644 projects/radio-show/audio-processor/voice-profiles/tom/embedding_0007.npy create mode 100644 projects/radio-show/audio-processor/voice-profiles/tom/embedding_0008.npy create mode 100644 projects/radio-show/audio-processor/voice-profiles/tom/embedding_0009.npy create mode 100644 projects/radio-show/audio-processor/voice-profiles/tom/embedding_0010.npy create mode 100644 projects/radio-show/audio-processor/voice-profiles/tom/embedding_0011.npy create mode 100644 projects/radio-show/audio-processor/voice-profiles/tom/embedding_0012.npy create mode 100644 projects/radio-show/audio-processor/voice-profiles/tom/embedding_0013.npy create mode 100644 projects/radio-show/audio-processor/voice-profiles/tom/embedding_0014.npy create mode 100644 projects/radio-show/audio-processor/voice-profiles/tom/embedding_0015.npy create mode 100644 projects/radio-show/audio-processor/voice-profiles/tom/embedding_0016.npy create mode 100644 projects/radio-show/audio-processor/voice-profiles/tom/embedding_0017.npy create mode 100644 projects/radio-show/audio-processor/voice-profiles/tom/embedding_0018.npy create mode 100644 projects/radio-show/audio-processor/voice-profiles/tom/embedding_0019.npy create mode 100644 projects/radio-show/audio-processor/voice-profiles/tom/embedding_0020.npy create mode 100644 projects/radio-show/audio-processor/voice-profiles/tom/embedding_0021.npy create mode 100644 projects/radio-show/audio-processor/voice-profiles/tom/embedding_0022.npy create mode 100644 projects/radio-show/audio-processor/voice-profiles/tom/embedding_0023.npy create mode 100644 projects/radio-show/audio-processor/voice-profiles/tom/embedding_0024.npy create mode 100644 projects/radio-show/audio-processor/voice-profiles/tom/embedding_0025.npy create mode 100644 projects/radio-show/audio-processor/voice-profiles/tom/embedding_0026.npy create mode 100644 projects/radio-show/audio-processor/voice-profiles/tom/embedding_0027.npy create mode 100644 projects/radio-show/audio-processor/voice-profiles/tom/embedding_0028.npy create mode 100644 projects/radio-show/audio-processor/voice-profiles/tom/embedding_0029.npy create mode 100644 projects/radio-show/audio-processor/voice-profiles/tom/embedding_0030.npy create mode 100644 projects/radio-show/audio-processor/voice-profiles/tom/embedding_0031.npy create mode 100644 projects/radio-show/audio-processor/voice-profiles/tom/embedding_0032.npy create mode 100644 projects/radio-show/audio-processor/voice-profiles/tom/embedding_0033.npy create mode 100644 projects/radio-show/audio-processor/voice-profiles/tom/embedding_0034.npy create mode 100644 projects/radio-show/audio-processor/voice-profiles/tom/embedding_0035.npy create mode 100644 projects/radio-show/audio-processor/voice-profiles/tom/embedding_0036.npy create mode 100644 projects/radio-show/audio-processor/voice-profiles/tom/embedding_0037.npy create mode 100644 projects/radio-show/audio-processor/voice-profiles/tom/embedding_0038.npy create mode 100644 projects/radio-show/audio-processor/voice-profiles/tom/embedding_0039.npy create mode 100644 projects/radio-show/audio-processor/voice-profiles/tom/embedding_0040.npy create mode 100644 projects/radio-show/audio-processor/voice-profiles/tom/embedding_0041.npy create mode 100644 projects/radio-show/audio-processor/voice-profiles/tom/embedding_0042.npy create mode 100644 projects/radio-show/audio-processor/voice-profiles/tom/embedding_0043.npy create mode 100644 projects/radio-show/session-logs/2026-04-27-qa-extraction-cohost-indexing.md diff --git a/projects/radio-show/audio-processor/.gitignore b/projects/radio-show/audio-processor/.gitignore new file mode 100644 index 0000000..029d309 --- /dev/null +++ b/projects/radio-show/audio-processor/.gitignore @@ -0,0 +1,25 @@ +# Python +__pycache__/ +*.pyc +*.pyo +.venv/ +*.egg-info/ + +# Large data files +test-data/episodes/ +test-data/transcripts/ +episodes/ +processed/ + +# Databases (regenerable) +*.db +*.sqlite + +# Model cache +.cache/ +*.pt +*.bin + +# OS +.DS_Store +Thumbs.db diff --git a/projects/radio-show/audio-processor/benchmark.py b/projects/radio-show/audio-processor/benchmark.py index 000470d..650af31 100644 --- a/projects/radio-show/audio-processor/benchmark.py +++ b/projects/radio-show/audio-processor/benchmark.py @@ -57,13 +57,15 @@ trans_results = [] trans_total_audio = 0.0 trans_total_wall = 0.0 +import json +from src.transcriber import transcribe as _transcribe + for ep in EPISODES: trans_ep_dir = TRANS_DIR / ep.stem trans_ep_dir.mkdir(parents=True, exist_ok=True) transcript_path = trans_ep_dir / "transcript.json" if transcript_path.exists(): - import json with open(transcript_path) as f: td = json.load(f) dur = td.get("duration", 0) @@ -74,30 +76,15 @@ for ep in EPISODES: console.print(f" Transcribing {ep.name}...") t0 = time.monotonic() - from faster_whisper import WhisperModel - if not hasattr(sys, "_whisper_model"): - console.print(" [dim]Loading Whisper large-v3...[/dim]") - sys._whisper_model = WhisperModel("large-v3", device=device, compute_type="float16") - - model = sys._whisper_model - segments_iter, info = model.transcribe(str(ep), language="en", beam_size=5) - - import json - segs = [] - for seg in segments_iter: - segs.append({"id": seg.id, "start": seg.start, "end": seg.end, "text": seg.text}) - - duration = info.duration + transcript = _transcribe(ep, model_size="large-v3", device=device, batch_size=16) wall = time.monotonic() - t0 - rtf = duration / wall + rtf = transcript.duration / wall - result = {"duration": duration, "language": "en", "segments": segs} - with open(transcript_path, "w") as f: - json.dump(result, f) + transcript.save(trans_ep_dir) - console.print(f" [green]{ep.stem}: {duration:.0f}s audio in {wall:.1f}s = {rtf:.1f}x realtime[/green]") - trans_results.append((ep, transcript_path, duration, wall)) - trans_total_audio += duration + console.print(f" [green]{ep.stem}: {transcript.duration:.0f}s audio in {wall:.1f}s = {rtf:.1f}x realtime[/green]") + trans_results.append((ep, transcript_path, transcript.duration, wall)) + trans_total_audio += transcript.duration trans_total_wall += wall if trans_total_wall > 0: diff --git a/projects/radio-show/audio-processor/build_cohost_profile.py b/projects/radio-show/audio-processor/build_cohost_profile.py new file mode 100644 index 0000000..50c2d2b --- /dev/null +++ b/projects/radio-show/audio-processor/build_cohost_profile.py @@ -0,0 +1,115 @@ +""" +Build voice profile for Tom (co-host) from known co-host speech windows. + +Uses CALLER-labeled windows from the first 60 min of co-host-era episodes, +before any real callers would have called in. +""" +import os, sys +os.environ["PYTHONIOENCODING"] = "utf-8" +os.environ["TRANSFORMERS_OFFLINE"] = "1" +if hasattr(sys.stdout, "reconfigure"): + sys.stdout.reconfigure(encoding="utf-8") + +from pathlib import Path +import json +import numpy as np +from src.gpu import ensure_cuda_libs +ensure_cuda_libs() + +import torch +from src.voice_profiler import VoiceProfiler, SpeakerProfile +from rich.console import Console + +console = Console() + +BASE = Path(__file__).parent +PROFILES_DIR = BASE / "voice-profiles" +EPISODES_DIR = BASE / "test-data" / "episodes" +TRANS_DIR = BASE / "test-data" / "transcripts" + +device = "cuda" if torch.cuda.is_available() else "cpu" +console.print(f"Device: {device}") + +profiler = VoiceProfiler(PROFILES_DIR, device=device) + +# Tom's known speech windows per episode +# CALLER turns from diarization that are in the first 60 min (before real callers) +# Windows at 0-40s excluded (promo/jingle, not Tom's voice) +TOM_WINDOWS = { + "2014-s6e19.mp3": [ + (195, 260), + (320, 425), + (600, 650), + (675, 710), + ], + "2016-s8e43.mp3": [ + (100, 115), + (135, 160), + (270, 295), + (575, 605), + (1185, 1235), + (1790, 1870), + (2020, 2055), + ], +} + +COHOST_NAME = "Tom" + +if COHOST_NAME not in profiler.profiles: + profiler.profiles[COHOST_NAME] = SpeakerProfile( + name=COHOST_NAME, + role="cohost", + embeddings=[], + source_episodes=[], + ) + +profile = profiler.profiles[COHOST_NAME] +console.print(f"\n[bold]Building co-host profile for: {COHOST_NAME}[/bold]") + +for ep_name, windows in TOM_WINDOWS.items(): + ep_path = EPISODES_DIR / ep_name + if not ep_path.exists(): + console.print(f"[yellow] Skipping {ep_name} — not found[/yellow]") + continue + + console.print(f"\n Loading {ep_name}...") + audio = profiler._load_full_audio(ep_path) + profiler._get_model() + + SAMPLE_RATE = 16000 + chunk_s = 10.0 + chunk_samples = int(chunk_s * SAMPLE_RATE) + + for win_start, win_end in windows: + for chunk_start in range(win_start, win_end - int(chunk_s), int(chunk_s)): + chunk_end = chunk_start + int(chunk_s) + s = int(chunk_start * SAMPLE_RATE) + e = s + chunk_samples + if e > len(audio): + break + try: + emb = profiler._embed_audio_np(audio[s:e]) + profile.embeddings.append(emb) + console.print(f" [dim]+1 embedding @ {chunk_start}s[/dim]") + except Exception as ex: + console.print(f" [red]Failed @ {chunk_start}s: {ex}[/red]") + + profile.source_episodes.append(ep_name) + +if not profile.embeddings: + console.print("[red]No embeddings collected — check episode paths[/red]") + sys.exit(1) + +profile.compute_composite() +console.print(f"\n[green]Tom profile built: {profile.num_samples} embeddings " + f"from {len(profile.source_episodes)} episodes[/green]") + +# Verify: check cosine similarity vs Mike to ensure separation +mike = profiler.profiles.get("Mike Swanson") +if mike and mike.composite_embedding is not None and profile.composite_embedding is not None: + sim = float(np.dot(mike.composite_embedding, profile.composite_embedding) / + (np.linalg.norm(mike.composite_embedding) * np.linalg.norm(profile.composite_embedding) + 1e-8)) + console.print(f"Tom vs Mike similarity: {sim:.3f} (lower is better separation)") + +profiler.save_profiles() +console.print("[bold green]Profile saved.[/bold green]") diff --git a/projects/radio-show/audio-processor/index_test_episodes.py b/projects/radio-show/audio-processor/index_test_episodes.py new file mode 100644 index 0000000..6e96441 --- /dev/null +++ b/projects/radio-show/audio-processor/index_test_episodes.py @@ -0,0 +1,102 @@ +""" +Index the 6 test episodes into archive.db. +Reads pre-computed transcripts + diarization from test-data/transcripts/. +""" +import os, sys, re +os.environ["PYTHONIOENCODING"] = "utf-8" +os.environ["TRANSFORMERS_OFFLINE"] = "1" +if hasattr(sys.stdout, "reconfigure"): + sys.stdout.reconfigure(encoding="utf-8") + +from pathlib import Path +from src.indexer import ArchiveIndex +from src.qa_extractor import load_diarized_transcript, extract_qa_pairs +from rich.console import Console +from rich.table import Table + +console = Console() + +BASE = Path(__file__).parent +TRANS_DIR = BASE / "test-data" / "transcripts" +EP_DIR = BASE / "test-data" / "episodes" +DB_PATH = BASE / "archive.db" + +_DATE_RE = re.compile(r"^(\d{4}-\d{2}-\d{2})") + + +def parse_episode_meta(ep_id: str) -> tuple[str, int | None]: + """Return (date_str_or_year, hr) from episode directory name.""" + m = _DATE_RE.match(ep_id) + if m: + date = m.group(1) + hr = int(ep_id[-1]) if ep_id.endswith(("-hr1", "-hr2")) else None + return date, hr + # season/episode format e.g. 2016-s8e43 — use year only + year = ep_id[:4] + return year, None + + +console.print(f"\n[bold]Indexing test episodes into {DB_PATH.name}[/bold]") + +with ArchiveIndex(DB_PATH) as idx: + rows = [] + + for ep_dir in sorted(TRANS_DIR.iterdir()): + t_path = ep_dir / "transcript.json" + d_path = ep_dir / "diarization.json" + if not t_path.exists(): + continue + + ep_id = ep_dir.name + date, hr = parse_episode_meta(ep_id) + audio_path = EP_DIR / f"{ep_id}.mp3" + + # Episode duration from transcript + import json + with open(t_path) as f: + td = json.load(f) + duration = td.get("duration", 0) + + # Register episode + idx.add_episode( + episode_id=ep_id, + audio_path=audio_path, + date=date, + duration=duration, + hr=hr, + ) + + # Load diarized segments and index + segs = load_diarized_transcript(t_path, d_path if d_path.exists() else None) + idx.add_segments(ep_id, segs) + + # Extract and index Q&A pairs + pairs = extract_qa_pairs(segs) + for p in pairs: + idx.add_qa_pair( + episode_id=ep_id, + q_start=p.question_start, q_end=p.question_end, + a_start=p.answer_start, a_end=p.answer_end, + question=p.question_text, answer=p.answer_text, + topic=p.topic, tags=p.topic_tags, + ) + + rows.append((ep_id, date, f"{duration:.0f}s", len(segs), len(pairs))) + console.print(f" [green]{ep_id}[/green]: {len(segs)} segs, {len(pairs)} Q&A pairs") + + stats = idx.stats() + +table = Table(title="Index Summary") +table.add_column("Episode") +table.add_column("Date") +table.add_column("Duration") +table.add_column("Segments") +table.add_column("Q&A") +for ep_id, date, dur, segs, qa in rows: + table.add_row(ep_id, date, dur, str(segs), str(qa)) + +console.print() +console.print(table) +console.print(f"\n[bold]DB totals:[/bold] {stats['episodes']} episodes, " + f"{stats['segments']} segments, {stats['qa_pairs']} Q&A pairs") +console.print(f"[dim]DB path: {DB_PATH}[/dim]") diff --git a/projects/radio-show/audio-processor/src/diarizer.py b/projects/radio-show/audio-processor/src/diarizer.py index 7c5a98a..340ea4d 100644 --- a/projects/radio-show/audio-processor/src/diarizer.py +++ b/projects/radio-show/audio-processor/src/diarizer.py @@ -202,6 +202,8 @@ def diarize(audio_path: str | Path, label = seg.speaker_label.split(" (")[0] # strip confidence score if label.startswith("Host:") or label.startswith("Host "): speaker = "HOST" + elif label.startswith("Cohost:"): + speaker = "CO-HOST" elif label == "[error]": speaker = "UNKNOWN" else: diff --git a/projects/radio-show/audio-processor/src/qa_extractor.py b/projects/radio-show/audio-processor/src/qa_extractor.py index 8f307a2..06eb3d9 100644 --- a/projects/radio-show/audio-processor/src/qa_extractor.py +++ b/projects/radio-show/audio-processor/src/qa_extractor.py @@ -53,10 +53,12 @@ _PROMO_SIGS: list[tuple[re.Pattern, int]] = [ (re.compile(r"\bcomputer running slow\b", re.I), 1), (re.compile(r"\bafter these messages\b", re.I), 1), (re.compile(r"\b790.?2040\b", re.I), 1), + (re.compile(r"\b751.?1041\b", re.I), 1), (re.compile(r"\bgurushow\.com\b", re.I), 1), (re.compile(r"\bcall in now\b", re.I), 1), (re.compile(r"\bcomputer troubles\?", re.I), 1), (re.compile(r"\bhardware installation\b", re.I), 1), + (re.compile(r"we.?ll get your problem solved", re.I), 1), ] @@ -127,10 +129,19 @@ def extract_qa_pairs(diarized_segments: list[dict]) -> list[QAPair]: if _is_promo_or_bumper(turn["text"]): i += 1 continue + # Skip the opening 90s — real callers never call before the show starts + if turn["start"] < 90: + i += 1 + continue q_duration = turn["end"] - turn["start"] if q_duration < MIN_QUESTION_DURATION: i += 1 continue + # Require caller-intro context: host must have introduced the call, OR + # the caller opens with a phone greeting ("hello", "hi", "hey") + if not _preceded_by_caller_intro(turns, i) and not _PHONE_GREETING.match(turn["text"].strip()): + i += 1 + continue # Look ahead for HOST answer turn(s) j = i + 1 @@ -329,25 +340,71 @@ def load_diarized_transcript(transcript_path: Path, with open(diarization_path) as f: diarization = json.load(f) - turns = diarization.get("turns", []) + raw_turns = diarization.get("turns", []) - def speaker_at(t: float) -> str: - """Find which diarization turn covers time t.""" + # Resolve overlapping boundaries left by the sliding-window diarizer: + # place each transition at the midpoint of the overlap region. + resolved: list[dict] = [] + for turn in sorted(raw_turns, key=lambda t: t["start"]): + if not resolved: + resolved.append(dict(turn)) + continue + prev = resolved[-1] + if turn["start"] < prev["end"]: + mid = (turn["start"] + prev["end"]) / 2 + prev["end"] = mid + resolved.append({**turn, "start": mid}) + else: + resolved.append(dict(turn)) + turns = resolved + + # Minimum CALLER coverage to label a transcript segment as CALLER. + # Batch transcription produces ~25s segments; caller windows are 10s. + # Require 4s of CALLER overlap so brief HOST-edge segments aren't over-claimed. + _CALLER_MIN_S = 4.0 + + def speaker_for_segment(seg_start: float, seg_end: float) -> str: + caller_cov = 0.0 + coverage: dict[str, float] = {} for turn in turns: - if turn["start"] <= t <= turn["end"]: - return turn["speaker"] - return "UNKNOWN" + overlap = min(seg_end, turn["end"]) - max(seg_start, turn["start"]) + if overlap <= 0: + continue + coverage[turn["speaker"]] = coverage.get(turn["speaker"], 0) + overlap + if turn["speaker"] == "CALLER": + caller_cov += overlap + if not coverage: + return "UNKNOWN" + if caller_cov >= _CALLER_MIN_S: + return "CALLER" + return max(coverage, key=coverage.__getitem__) return [ {"start": s["start"], "end": s["end"], "text": s["text"], - "speaker": speaker_at((s["start"] + s["end"]) / 2)} + "speaker": speaker_for_segment(s["start"], s["end"])} for s in segments ] # ── Helpers ──────────────────────────────────────────────────────────────── +_PHONE_GREETING = re.compile(r"^(hello|hi|hey|good (morning|afternoon|evening))\b", re.IGNORECASE) + + +def _preceded_by_caller_intro(turns: list[dict], idx: int, max_host_turns: int = 2) -> bool: + """Return True if a preceding HOST turn (within max_host_turns HOST turns) contains a caller-intro phrase.""" + host_count = 0 + for j in range(idx - 1, -1, -1): + if turns[j]["speaker"] == "HOST": + if _CALLER_INTRO.search(turns[j]["text"]): + return True + host_count += 1 + if host_count >= max_host_turns: + break + return False + + def _looks_like_question(text: str) -> bool: return bool(QUESTION_PATTERN.search(text)) diff --git a/projects/radio-show/audio-processor/src/transcriber.py b/projects/radio-show/audio-processor/src/transcriber.py index 6a9b026..df3410b 100644 --- a/projects/radio-show/audio-processor/src/transcriber.py +++ b/projects/radio-show/audio-processor/src/transcriber.py @@ -113,61 +113,60 @@ def _format_srt_time(seconds: float) -> str: def transcribe(audio_path: str | Path, model_size: str = "large-v3", - language: str = "en", device: str = "cuda") -> Transcript: - """Transcribe an audio file using faster-whisper.""" - from faster_whisper import WhisperModel + language: str = "en", device: str = "cuda", + batch_size: int = 16) -> Transcript: + """Transcribe an audio file using faster-whisper. + + Uses BatchedInferencePipeline + int8_float16 + VAD for archive/batch work. + Word timestamps are skipped in batch mode (not needed for segment-level search). + Pass batch_size=0 to fall back to sequential WhisperModel with word timestamps. + """ + from faster_whisper import WhisperModel, BatchedInferencePipeline audio_path = Path(audio_path) + use_batched = batch_size > 0 + console.print(f"[bold]Transcribing:[/bold] {audio_path.name}") - console.print(f"[dim]Model: {model_size}, Device: {device}[/dim]") - - model = WhisperModel(model_size, device=device, compute_type="float16") - - segments_raw, info = model.transcribe( - str(audio_path), - language=language, - word_timestamps=True, - vad_filter=True, - vad_parameters=dict( - min_silence_duration_ms=500, - speech_pad_ms=200, - ), + console.print( + f"[dim]Model: {model_size} | " + f"{'batched x' + str(batch_size) + ' int8_float16' if use_batched else 'sequential float16'} | " + f"Device: {device}[/dim]" ) - console.print(f"[dim]Detected language: {info.language} " - f"(probability: {info.language_probability:.2f})[/dim]") - console.print(f"[dim]Duration: {info.duration:.1f}s " - f"({info.duration / 60:.1f} min)[/dim]") + if use_batched: + base_model = WhisperModel(model_size, device=device, compute_type="int8_float16") + model = BatchedInferencePipeline(model=base_model) + segments_raw, info = model.transcribe( + str(audio_path), + language=language, + batch_size=batch_size, + ) + else: + model = WhisperModel(model_size, device=device, compute_type="float16") + segments_raw, info = model.transcribe( + str(audio_path), + language=language, + word_timestamps=True, + vad_filter=True, + vad_parameters=dict(min_silence_duration_ms=500, speech_pad_ms=200), + ) + + console.print(f"[dim]Duration: {info.duration:.1f}s ({info.duration / 60:.1f} min)[/dim]") segments = [] - with Progress( - SpinnerColumn(), - TextColumn("[progress.description]{task.description}"), - BarColumn(), - TextColumn("{task.completed} segments"), - TimeElapsedColumn(), - console=console, - ) as progress: - task = progress.add_task("Transcribing...", total=None) - - for i, seg in enumerate(segments_raw): + for i, seg in enumerate(segments_raw): + words = [] + if not use_batched: words = [ - TranscriptWord( - word=w.word, - start=w.start, - end=w.end, - probability=w.probability, - ) + TranscriptWord(word=w.word, start=w.start, + end=w.end, probability=w.probability) for w in (seg.words or []) ] - segments.append(TranscriptSegment( - id=i, - text=seg.text, - start=seg.start, - end=seg.end, - words=words, - )) - progress.update(task, completed=i + 1) + segments.append(TranscriptSegment( + id=i, text=seg.text, start=seg.start, end=seg.end, words=words, + )) + if i % 50 == 0: + console.print(f"[dim] {i} segments... ({seg.end:.0f}s)[/dim]") console.print(f"[green]Transcription complete: {len(segments)} segments[/green]") diff --git a/projects/radio-show/audio-processor/src/voice_profiler.py b/projects/radio-show/audio-processor/src/voice_profiler.py index 27b1d4a..7fe327a 100644 --- a/projects/radio-show/audio-processor/src/voice_profiler.py +++ b/projects/radio-show/audio-processor/src/voice_profiler.py @@ -319,8 +319,11 @@ class VoiceProfiler: best_match = name if best_score >= threshold: - if best_match and self.profiles[best_match].role == "host": + role = self.profiles[best_match].role if best_match else "unknown" + if role == "host": label = f"Host: {best_match}" + elif role == "cohost": + label = f"Cohost: {best_match}" else: label = best_match else: diff --git a/projects/radio-show/audio-processor/voice-profiles/profiles.json b/projects/radio-show/audio-processor/voice-profiles/profiles.json index 005007d..0dbf829 100644 --- a/projects/radio-show/audio-processor/voice-profiles/profiles.json +++ b/projects/radio-show/audio-processor/voice-profiles/profiles.json @@ -1,26 +1,34 @@ -{ - "Mike Swanson": { - "role": "host", - "num_samples": 180, - "source_episodes": [ - "2010-10-02-hr1.mp3", - "2011-06-04-hr1.mp3", - "2011-09-10-hr1.mp3", - "2014-s6e05.mp3", - "2015-s7e30.mp3", - "2016-s8e42.mp3", - "2017-s9e26.mp3", - "2018-s10e17.mp3", - "2018-s10e21.mp3", - "2010-10-02-hr1.mp3", - "2011-06-04-hr1.mp3", - "2011-09-10-hr1.mp3", - "2014-s6e05.mp3", - "2015-s7e30.mp3", - "2016-s8e42.mp3", - "2017-s9e26.mp3", - "2018-s10e17.mp3", - "2018-s10e21.mp3" - ] - } +{ + "Mike Swanson": { + "role": "host", + "num_samples": 180, + "source_episodes": [ + "2010-10-02-hr1.mp3", + "2011-06-04-hr1.mp3", + "2011-09-10-hr1.mp3", + "2014-s6e05.mp3", + "2015-s7e30.mp3", + "2016-s8e42.mp3", + "2017-s9e26.mp3", + "2018-s10e17.mp3", + "2018-s10e21.mp3", + "2010-10-02-hr1.mp3", + "2011-06-04-hr1.mp3", + "2011-09-10-hr1.mp3", + "2014-s6e05.mp3", + "2015-s7e30.mp3", + "2016-s8e42.mp3", + "2017-s9e26.mp3", + "2018-s10e17.mp3", + "2018-s10e21.mp3" + ] + }, + "Tom": { + "role": "cohost", + "num_samples": 44, + "source_episodes": [ + "2014-s6e19.mp3", + "2016-s8e43.mp3" + ] + } } \ No newline at end of file diff --git a/projects/radio-show/audio-processor/voice-profiles/tom/composite.npy b/projects/radio-show/audio-processor/voice-profiles/tom/composite.npy new file mode 100644 index 0000000000000000000000000000000000000000..861ee4b00169df980c973fa7caa476957206db53 GIT binary patch literal 2176 zcmbW2`9IY81II@>%0|dhTD!8j+KCRbd_Fo*?R-U1>D)32BS)?k-Nv}aIpmm$l`+^+ zCX*w~>pf|e>bpg!`x>-qcZ@yzwy?y+T;3L}Pb%<`arlwYK! zlc^;gU}woRwG22M86C+E+kZInp#T5;26jl4{}&&{VTb#F*;e+;S1_%arYB7QZ#2JE zFTsjKk@(xW2G19~r7XrEdj>GB?7X z;YZfHSK?J&8dMilVrpLzE_|rM6%AeGoznz;XD-70g`1OZ>>5nyOR<(0k5z{Y(N?wz zLrXiz!4M|6YZPcYmq8NehC(sP$4~Ry$x^2t>>Mz0{-C);sSy%{Ps<*_m*V5BI2Up& zA++aa;Ea6^>O6LnO?6T_|3MyB8sA56bTT` zKA{lq&4PLjaPw6q<+Eo8&AD8TKP4Pw%sP(l8x^GQ$|hv`>66~EdOGxO0#0+{QO;We zV{2gqw(X?YHG$%0rX0eVPm%rjSL=A3&XI2wE<=YN{lNqlvM+U#3;>6 zd2})j;Ti%IZ?}WW!aJm>(Euj-pI{;7Bbap?6V7tzKAcaY$Ca>)h=rrec@$W?QbHd! zrO%^Pu$PvRMT#Um*`5eHyZ7K9|B6uk-_cDrai~r#M#@|{E}i$ot=2?zMUv% zT`j&px)`bY8DM$H;455<@gFL%M*Pa}(8ESA;0f&@&&7k=k`?*cPBf ztKM^r>#>nN(od8%G9(H`ki7m2O(tmsZ9Ejr z!6sp2Cd!2x6AJw`A@K2ZBljg6QT(g{{y~JWMTKP5kt=vmQixNW--+$e8K}STK;2jk z%nTJsV&_4-j-t1|HX^a>S}~WK3+<5*7?yrUTYUhoWN`77pqB2E{6$8>!T-nlYpH{)&ahf)%pnFcO%w70k)?XnvHAlq<&(+u@@; z(HVn}h7S>Q;S-z{LGVlOz-O^1!o1Ft7KZ@RyCH;_gd8RfHqYp($Z`k@b(BUb|KK|h zKF}_Nq|6oTtTIu(GMv0oWPq0whS=#K@a>qi-nD*gh;KmLa5_wiyYTAqY$9{|2D3BD zAyaKdm8pSqaG4Z34IeQwZ0_WGPKs#jG7PKQ;$esyI_wisBNSk^Sf32eQ=w{MgY^3)MS+2_cpV>kxR zN)VhDg?*e*GFV@ZW6A5VaVu?qY7<%9>JA@CGcgTm0$(#59crPFi{hcN-Tz4CST<~cQ#ahH(-R38CACO4k;10Bg!pe0qa`mLCx=gy zI_3*xa{R%ewxN%C5ff1?__t)@K#sODw?&BMCSUrYa{}x|`B-6c7S#m~F#e<@9`8yp zRPZa3SPuAp+zkC{$MA}C6N-23NX^nA^WIg$N92f|Hyp7*o`T`GmaxA-QFy$E^cm(L zaCx4>rBi@@F99@J4fvOBmlJE541#B7bbzNd_T7p@F|Qnz!y*Jl`@lRR2m7j6k;CPf|9?rmye6@IB|J^ZM~T=Q(M%4mRv#G?`$TF#0J^?#Vzp zLyb;(8Pj#u=wAMT=L6l(y7>p5^86pSazDfMT;N=9_W;j@tYue{RGtp8S&$qy|-+f9mAr~ro9>{dh#6|gJScMK_`tW^9?#Ve~Wd9yQ zlYG=|Qb63IgXpU7qY}UD1alx6KiTd_NZ@rGE}g(F6QJvu4V=Ql;AUKcvkJ~wlprGN z{B-yx#Nw}1DRi5jnyJx8(*%>^?XQ*Ap`r zCUUy#p)IrO5~H>9J5`u7J0>Oh<>9&etnjYn(zbg(z3?MFZ{1WV|?Qj8T*eE zoS_Q*x_BqbuQY%iss{5ULrf|aqan0kqW_|UvTjo*ZQFXtkpLb!-Zu`4mk84xYgkUc z$#@Yh#c+cRUisBgE^Sq~6V#2FULH(@i9|8o6^_EyM89Xwl%Wuh#m*<-Q@ayRo~n?$ zxE~db&(R&uLswS`MdUea~KSxM}E*ISusZlIRMyrbbgF=uS^(S$0rHoLVWkergF8-Ed=pE& zR_gl0j+AGSfy!38X#2wt@UR3;W8el!N^ZW>b2KpYv9 zX`yzRzeUw>75Yt!pe~z+{H|Q683@3j%^}gF7H#du5U#93WQHGJc@yy>eh==IzGTL( zPs7-;N@y-J!|&oObUC}BAVr;-^1v2@%Udu^vmtEf4vZ=#fi~5O!6$*hpAr~e(_n4p zYT@0TXhbZVMYWlLEOX9){)JK~r|(7aehCVjy%4bL0jBKhh=FPc)%=$=zRTlc*ON4S zpt3MAXozOzY?zD+z|$Q-rf?qorF5`+IzbMsBrdrM(%Ps@2!x85ps!+vpSXkWUov62 zLWrbw`RLVODz%@VBTo+WLnhFgO7QG}&&Nn=Hqwk5|1?5o-Ya5yum;w9K0}k?1CF?X zD0vm4vZxfRjF%9T*h(_0)eLU25BLvtsrGF=xM-duX_h50D7payA0J}*PM=J>`${_) zvQ&Y+FT#FPCx3KV;ERkH{ik=5q=m@{^?Jb@xQ3>T8>B}m2dzK410GGFi&`+cIt72T z_JGA*OPqQT+Wbgnic;mHP=5X-&M$lx?Wzyr$3zG<5RrnR65Ouq#aBCJa;Dr2j$KLQVs;pI)9Z29 z&I=xY#FI?fTafiN#P$4vg)W|w)nSUn-_aHRo65+;@kX%eSCFND0_~wOnB7r9+Vf+e zVNUR`i#gU9grGF*o8<1i2ual@MDlGtZ2Mv%;4LPpZ(Q)bYYHX*i6#y1@W=IxgK%^7 zgVkw8sp$^_e6ef7(aA$#YY)MQr3xLFW>g=E!kDc(W4q)wCaru(^3T;M)5}Ifd=>ep zuOGQK0cf4!U^^optY8ad?@fXR^^BO=XW;F#C_LdrKutax0UvU}lj`AU?{hNCDMip& z6B_;ZKzaW+)J&d5sKY%RHyOb6aDK_29IY@C$W#PA~_vNz;lB_+m+?8ihoH~~70 zB5bVl#@DxTSYOx-QIG*8T-J%M2yN=?Zga#fc*m&L5@-xsU3=!|QA#^srt-bG{El#raSU+KtGx0&Ew?+&rQB5iiS~v+uB_T_7en%>zV@pU#_I1SJUe%{ z^F1`BX&uHeB{D^bqMB%$Tiu!Nzi^*-&*#PG#V6m|!Rm+;Lo8A(hVAVm@Csw^Ww9w= zJ+>x`?Hdvn9_A73782&|^FMybBS_%$l?(hm_=hQ5xj=2lHs9P9s{w2N{+gnP}Q znN^G7XPc85X7~Ho& zZ?sdzXhb2krB4@5z87(*#tJ4i(OBsI1+-i%Y8H+`c0~}TE?vOSA_I8ld6ImkQY_aB zLT+3IYQ7Xf!TTcYKEEQZhS$+GQ;w2E2`aFNi{O{J7=C;b*XvTD5w3>}1wzDHwBe?3 z4Q9M7GNon(x8x}7eZ5E)-WhdWz2V1Q6{#SK?Xy91Zzgus_`%yD3WH_Y7;{L%hT>Gr z3gk&Iy@KntIur3qcTvPlAzSB)k-Jm{a`tTO*q4qkV$EoA?1i@FcOWx^WXU}t5;~G` z-&Y@toASW7W+A3t9yz=H(Vh2#_C6xTos5wn&6C~aJclOos!WnFZjTaIF-p289zp*9 zLjLA>%DrlmI@MeWzXu~Qd+v`J^+vM4jsu-GZE|t5IoIAi7Qd?aK~+W-mlpq`=S+@Z zRA-bUFhf-w1siK4fjc)f=L{b>ts1=M2Gfl|?^VmMdmD!~UO`>Q7Sirffg&RhMEDD#yZH@O7&<_b1A-|b zi%d4ZeX&>J^B`xbLT7>K~wLfAD5&{x7DN8~iQ z-#?PYyU(_0?>b17m8C`gTBp&pwH3~4`sjRh8FdU7xaHL0(Bu#B@t*wsxEpSv_quq$wt!tyNO^Cspbr0ji&*ZsPXBvZCAJwp z0&B_$R;jB*RCzUKO-hl@e~bI02_&_B5TOY^@Q|D381M1IZwwPSu(A<;Cle}jF+^!A zk6iUQAX-+bfQN22=*T!o2Fz5UTiJ~0h;lNz;s_~MXoJ=9Gz=?(uvw>(@v|*HF{+_$ z)dacO6qqGHrWDf@NL80E-ZQh%_qvvI|KuC=8CWAY`zR(q)>GOi#zV@P2ows*oy$p(P@bb-sb9cg zTt3!XR-lugjNKzR>3o{e7FGlEJbfu~AKXnP)RtqZ?jqz&cG#(%fwuu&^ zTSudyZ*vcV>1i-B9gt#k6HX<&pwTZRdJ!4KVbX&*K0HGz`RZJLSuSikcZ*h?T*UAD zlJV@11bnujpta5i6L+^0flf3IcJ9Tl^X^E0=t?o9x^QQS5D}Y$q5kYPWb((cf9HF8 zj#-WBoizRE$Nk*APo_1yF!+C zcw$~qhW2h}$YDR}aH+zLwk>G-+Vil)ZDJ{#Oya(nLQS)U9PO>g5Z4kXS{=}^!XCf% z^T_AA6!7olpnXIh*2|nA>o!euFI-2z^c*$|mbISQdet^=iN2WVFwYBB zGZyeWX^LIhf07Wne_D{-h64?Kg#0z&xE*aA0q(ff^)xnCJ~(PwZ;0QkR~WkpzY`-k9oATHhVO^!Pcn qNSDH^D;I-8V~*>yJe0;PMV)W}Z9_dUF28{PZry-U!Pn+NQTPYhT4R*} literal 0 HcmV?d00001 diff --git a/projects/radio-show/audio-processor/voice-profiles/tom/embedding_0002.npy b/projects/radio-show/audio-processor/voice-profiles/tom/embedding_0002.npy new file mode 100644 index 0000000000000000000000000000000000000000..a61f97aefa5cabb2890a621afd00a1fc4015fef5 GIT binary patch literal 2176 zcmbVM`#aQm1MQ+hTWzgdQqjBZ;MIks@Ex_=8%0=B5<@bSD2#Hyg*0xpW5zUYjnSZ7 zw-L$rd?qTg)GC=RC8aHGl1p?|dA+88I+$X!$_Cm7sNTr@jl`e#9{mXPq+3C4E3GTLl1ff`%ZEF^~NSf21dHEy8ky+ zJMzkrs<{W(4D(>v(?`8ja+JFqcEHH7a*PB8!P}!5l_?o850A&Uy=8bckVJ__tx4{> z7U;_apiGrvP(2?St#g0U$qPqU92X1amIzDW z5v!U4{O-ett)~QW>$9MgasiDqXUk(sW#~1`hv*AMH!NL_$oc2c?e!n*&`ZH>m33(L z{74q)8{;Lf0!GTIq}0k8rqlM}mTNn)o1F!&JA>Kcq%P-%{fx0JC4687A;UffV;#xR zE=k0oXCjh)O-bV$KPq!p5-zS)K1sS|}#AF+?GC5x|L#_ofbkaW3H zKWsY=4UbYdZn;Ls9aUjAPKXh;{RJWy`647ci8xREiZz0DL@Hd$+&&o!=}-VX+Ds7o z=`*eW-WxYH)Gc;gT?aj(UBkumIq>?*#pAdi@rT$8g7;>S%8YTtwjM{~Me@1*`7qMA zkzd>xgh5UU4i{)3U$2=AJ!_+#Yrmp5Aq1`--Kg&<#8{Iinb}c_Hev&TmIypn6}4%* zf(UJ9!Eh{_aA)`4=~z5rn*WFq^V58lQ~z zO$PG9&J)Chn@qJAJVDdR(|FCv!79&4$c^(+$2^XH6>FjzS^`;)7WRHGMBd;|T-!QH zdz;D7zj=aAQa_BRvvctLsUfbgMYvPD3HD4KJo(d*cG#E+<0I2Zpyws9dO48omV)&$ z0IRRIW6oktre~xXqOBt!9b}P;ZBNOUcU<(S(ij%npx~_p2N>qqnOqK!ky4`c`6iVy zY)BG5#Ne^zesu8?;kJ7NBt?OEP5Z*}_z}pwCZXoqV!6ZmHm!MQE*Z}6B0grBu)6z} zb_{E#EUhx3Mo;atXj=G|sn421oLUFGIi}iA`wL1ah znL?5p=T1i0hVskHZ7g0+?gpRw*?+GU*NFV8Gl?$gp&Oi%K64$B#`4m zK0SCq#AggJeJ=-rwpk6s(qzbjtH@X<8-aEUsVuua&=vF{_<0OQ!>&N4e2K{SAA#!l zD19tP2yMqAd^0G;WLGMXC8ib8W*E@FhaOfcwyf@=Exi}uLUkk=?=iql9aGeK9Yp@* zE*S6ek?-6UiWTm+kigu9n1x%Q_Lacx<|^d<0+Q98O1AYykh%KhkmhMHJKp_<>Ju9B z)x(dGqaKFw04~lXn!~+18ttx35`RZ{^)u#m2YSZNvX-e=ebv*+-gkRRm}f!NtxfJiF|FDqQY z(Fj55tg|FJC2^{YLIm~dVEqPXDAZ;laE=rgKSYD|n=#5(ZN$5u1`zVu3A{2bO5(CY ze!cM!oc*0Jre*@Z=Ky(eo{j#9Y^bi(B$aQ^VOTIqSGIVYU(QWNn|Dsb>n~#L{h^Nh z$j*RiNeqf3waJTr-vi@kH#lE+o7zt?UP(6Md4B{{X3vt}@=J$7ZFjemw7kwl)wlqU9hTy4%m|!aIH)rQF8$ewmCp(g>zV_`a!WjF*8%-qA}Y&@ z=>3v3I{i^OiCU3~@v;I7D>@2yLgMi1mIx&?&d}Y*L@3kSO0f?zP#^7$@***!Kc2?P zmd*I~cNA)`I})4tSkx&Uz<8)H4C~^+D$2xIMFaxb0&H00iWkqFP#v=!)v|0HaFfBu z={DIhcoz2}D_~(eA1AZYab*o3nx#6-WbIV6t!<->tYsKB{Rd*U7WmpUqN@ z6DM$b@qW4A<#dcl%n3ta54*|DRG7yZ%YpXey4sVnpS3FA-MQ2Bbbjb literal 0 HcmV?d00001 diff --git a/projects/radio-show/audio-processor/voice-profiles/tom/embedding_0003.npy b/projects/radio-show/audio-processor/voice-profiles/tom/embedding_0003.npy new file mode 100644 index 0000000000000000000000000000000000000000..fc027ede277dcd7a2353af264ddede30e3fc501c GIT binary patch literal 2176 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 literal 0 HcmV?d00001 diff --git a/projects/radio-show/audio-processor/voice-profiles/tom/embedding_0004.npy b/projects/radio-show/audio-processor/voice-profiles/tom/embedding_0004.npy new file mode 100644 index 0000000000000000000000000000000000000000..4fe25c4e3c962bb5abf289d2eb074ed433df8ca5 GIT binary patch literal 2176 zcmbW1`9IYA0>*QcLyPuOA}47i$og^V-$rcqw$i58Oi!)|qUm9ajwn9Zti$kvO z^Z7<8t*E4KQqrbVuUk?=$#wsQ`~3F2e|%oA=Pj~zwy}4Unie%Jp5^Tmae&7%QejcP z8(EqvEZOwG zHp|6OrDk)!H@h+ibF%3dD_!uQ+8@>Lj)51Ohg0#<7}Jr$#ZecIY(fMP540gSF9$E> zM`-mo3!%+4Qz01}QQcXHXMgLV-8BRAo4dhEJ`dJu3wTuQfksz4raM|7Fu|Yr@5)D) zek5K!7NgNY49EK=_*^c{lzP=-w6FkgK3GzlR;pn~ejzH&eK9a656368KplKSSnD-V zzvB|Ta`;5{t39;td*ERF6XN{3rTMF#5BJl4MW+2POE@k52-D1b z9|^5VWAbQNn!7bK75Trqph)|Xq1$;-OIE|&(M|ZztQ4@#D)F|g4F(0F@K1a}7Ihb6 zLsb;`GgxqtD?qEW7RuEXu%j*-`@h_vX`O}KqD#|>$FK85s_qPN59oo$4|nKamFIQ{ zQ&4uR9ut{os7Q;OR1B*WqV;Jg?Fz)x{dL5-ZwmsY&544U8ux@P5B-xnFlf01;TDs0 zX^$mXt2$_@U>)o_*g~yXmx0!fI3yITMP&FvYR%us=&i7$@W&RMpPDJ6NNj+{2l|oZ~9(gV)Ml-C@cC7@90~@KPH}6PB zpAmf(^~Ct(UMN&VK+v$9NDnxXD6M7O(&|ur85hE4{z=IBJL3lX2&6287Ql6}2p%QjP(MvE zH6IR>C3Zil5uf|GDon@H1t*X;@h6JNF+9B>M91VBlDDN0ZT0iP4y#6#!)`naOTzG) zVpKKmgi5e4Oa~?Cy|V_Y0lBC*u}9%;LU+riQ)_-^pt#$U6tUKj^{Lmqs>eX-P~ zk~SC|q9R&VP-z%|-eCbzx;aStOOnvJ`2tKGbzrsjG(Phk5$IZqn8s-gIYU#v59Ep8 zP%LyJToDwpAA6rPb85QcvB4`6pGKa+=E!rHm^2!7+UOeErBA@ot%0~A3$=+q=!;AC zQI7BPaX@qwpE3mqv^$Cdl`kYtFo)T*stw;-2aW6|&mrf=g66remvFb*jgikr{q(YB z<#0-WgpMEju;R)xpVbR6LggT|vdrBV&{qw-ZRoE_p3Jl239>vm!#n~aZ#hUrZD{0x7os=H3nnGe-Nh;J|6GAKIIZsa?N`o#x*m@ zjiLb9+7?4$$QkBj7y0R30*1Q|A*@CeRreD0p)k_nVg@&_>tvl=6)GNvLXhDPPFyfX z7qQ93;3$ZDBw#5kVuPzQTHne+qpuv=)^{-5T?TW9?4jiQ8nUC#uxgyf{r*CYi8pdW zn2{Y0-(};W-UxX=(*a7?%b|VoWg>!tGNVhZVu_RYdblhZEp4P1J)|i_qv3gkM4t^as*#{MULM`5uG# zS~*f38--#~82StC(K;Rqx!w7=wj}`x#%B13Z-w2@y`h|9gHm25%=^>m)R42}@n8z_ zYyXAUObBGvQjua|3xED5uEvIV*v)IEyx6CqZ>L0lbx+U@E|;Ov;sn{qKaty+ig_!x zGjYR_n6%zWULWT`mA#Gf{HKC5X|0T10lHWqks`Y9d#PoN7xD9+0U0TI>YJh-gcBin rI3o{5++!H8PcgLTitzoyEHoHDL}kw{2;9U7%U40&Z#nRJmX7}dWl(m8 literal 0 HcmV?d00001 diff --git a/projects/radio-show/audio-processor/voice-profiles/tom/embedding_0005.npy b/projects/radio-show/audio-processor/voice-profiles/tom/embedding_0005.npy new file mode 100644 index 0000000000000000000000000000000000000000..50a9af4f322f1f1d980fb80282a701d71a52b447 GIT binary patch literal 2176 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 literal 0 HcmV?d00001 diff --git a/projects/radio-show/audio-processor/voice-profiles/tom/embedding_0007.npy b/projects/radio-show/audio-processor/voice-profiles/tom/embedding_0007.npy new file mode 100644 index 0000000000000000000000000000000000000000..e1d262896f4a07e9f5c1cda8f8ce38e87fd97025 GIT binary patch literal 2176 zcmbV|`9IY81IMi-x)jOxkz+*}i4}`5pQ+?nl`czEj$AWDh9Sq7Feu}0qLGOWlPIBx z=<|9{C?(sCHgqhTBdTwyrA_he`!9T-zdfHnKJ#|CZr`={2bn0DIEH^fgddM#t<9j= zW(-4Z2Aj)^qtwe8u3o1@+g-=30{OZh6o3xJb;>CDg z#>eLB0)#i6z|whzc$1?lb)Rrf-MRK(yERYwHh3i0HQ zKm072m>d?u=XX=|KU9Ji(;Irs3EHm7lZu@$LrTpb5H1}<)^Zk*TN)cNG4Pd69^r%c zz8rGTe_)38J*JjU=HmlBM(e%bg9m@r5hD#N6c&Ag^(seJwT1`M-^8JJ*)r_DtB8f^ zcJTWAADSC#fV$9^^rUPSRD|(}Ffj&7*SF2F+_Cw#3vjq6Pk=0VeU#Q)DW z`l5On`DfEEM1Enz!*vM}*lZ>`X@677mz=RuEeq#k@?kB%1q;UmacLxl)OEZhms(FD zIno6d#$s^HvN58rOtSyZ#A9s%x;*%(epyT^UyssblmY&Fk_X)91D8^8)PxJ?G85_A z+MT3nScUbzDIcv<@epW=5FZ)`-*FK(X{905UXcX9JqbMfLYK*(ggXjp3H={OnCpAjKRw- zWTa1%)b{F1KQ}j6HyYZ2Z|F&ij16$Gw;b;zZA5b{hw%K*BGe!W5#kcEXCM`F4VF;a znTfOFQcN69gRLJ;z1laQuv=SUpPdT&;x3%S1hfi`!SnS;o}`gtx8EVpW{t^)E3(q( zdA88V^1v;_9(wyCFEH$D$g{pk@GR<>;rsW2XVZzsVL$BPoPktwp14Z=u~Z# zk~)FKCraUHmxf1{xzyD#8w`BAhhmRJSQ>ZJy>}FtGB?=7zrYNtj=I3gc&I0B!?=~Z z^h)d@1eZ2rj{Ga!b9ce-RZZBas*j$YMsmf_n;ZzuBn!g*NXoY_RQ`1lRF|tsQ(b#8 zv*;kgqf(KdrHl5ZJh(&~66fX=j0ZSkCesc4uG`eOQzNEz&!ee75G|9yW`-v5+NOZ^ z2U*CC2mmLY%}N)F@vXTJ%4!9avw1F5^Rn?dcm)D-J808Ae6$vYW4cI-bPEMkyz?Qv z2>uNP*IIFAyNp!F$_YCbnPJ8>4T;Cy(I9?}M|>T!UvdmT>eu1t;pODO>>6}i)Dqn) z8$^7|hMV)RI4o~Z-j*N7hXHM@&uzd==MYiqNgyr`#-JG`#Ez2#H13B=?ly4m1Ys`M zj_8V_!H~0cIObie^_YgMr>sTj>0W^qkJ6)9IXK%h2&xh`%a%;+6K%5HUO+xI{3NW%u|EOfai!I-O$u&5g1 zx-tj7G9pa%C_?io7gOULI8Q6di`Z6A>S%dZwpgt)T;zk## zmHk2NGfyD9Mr`rVCK*bixtsRyXCSeUiSQ~@a(vrWe*pr1d657B literal 0 HcmV?d00001 diff --git a/projects/radio-show/audio-processor/voice-profiles/tom/embedding_0008.npy b/projects/radio-show/audio-processor/voice-profiles/tom/embedding_0008.npy new file mode 100644 index 0000000000000000000000000000000000000000..5fd19132dd8762b37d0b3ff735706359bc730d1e GIT binary patch literal 2176 zcmbW1`9IY81ILTntzBt%r7djJH=%KCsU?}uAUVH|T;*J{3_|WBiOk5+U`!_G@I~cX zNvm>wUhfGNqtelUp6+&SruN39jsG`a zN!OHOwt6Rm)XU+=?xYNETT0eEi^h!d06H>`!C}P+1hHxOdFmkeN>#|}eMXD!mXP_0 z7U;Y^4)?$tbR^?z#HhHPcr|$nPXo5yoH``=Q3y8Nx??IyE}eUzStC&I!`LR&0Gx1tTSMMpt(CJ+u8 zC&jL$#^ZOG4@7|0If-kfp|G0dW7}i~hA#g=hK5BLh78`M7a=Ib3!AhT z@b5b%F#qI-?wAyK_ZK4mk`@f^39-w;6z4}%F`hEVG9EgPPoA12yP^_Lq#VSVl|c~i zg&*E>@%I}mc2~S6ieA`YRv18T7Q7>h9Xu3-RADqu9RZ8Q2+p&FjFlK_X%9%YWEuNv zp986S8;itEPG}qs0rSKt3*sciZMMg$O&;jed;%5SDpuc&GG!%|C4=V)3EZ84qNqu_ zK1ED1m?>x@kyz{q!EW1AuvC~JuMAd8wrrOmIAYi^KU@qHU1vQ%(@gdMXPhKO_tAH2 ziy->57s*L%+`T`4Zw(NqN>YdNukAc{x3DqMNq%bZJjtU>> z3@rhEk(9wYzZ9C?8Msv0z|xP{jXT#L!qe**qWqn|cW=XO&Un+e5}>h2(y0IXP;#jg<3b+03zQ9675d zdF(k3uR$JWZY4oZ`6swuj0Q`=l4!jS$BexZoc7ruYo8ru`=k|Z|2PY#yC)v~NMp?P zd-7Ou8O#TTcsjWO{z^XV(3S%9Ub&6(PCu%*qZnrSIY{hOhWfD!wBwmzybAP&u;CaO z!KKvPniS|Ol)}SAioB9u;xg?8?xHz%H>W^Q=MA3|XYtD0l(4gpqienm9>w1fxsv7B zT9ZZ`y`8YDF%O%VcBq#PC&rGs(B~;4g7GWjPLGi14H=~Cygm*s)DW{vRalvugaPBd zXt(!3hnzK0iA%*HQj8e3Dn8YjfM5HO-Vs~|OBHwUP1l0asD`Z{A0c}mfJaov0>z%vpvc7L-pc4dQAdyeEy zWWstO8fSjfCM|+yaEEl^veOc2doO_5DUTy5p@>hGlPp0VRs?hKBE|v9pIbaqm=4uq zMLg3xPrg(+3W0YnR-ax8gQg55xcb2Tbu+RJ>QT695b~4=uchkHb7n%;^9bs7ifE-W zp`nWP2~t%Z37zK$+u05&Sl)XSxnp9~&hqGn(i{|Y+f(uk&qt$-yREW>3_nrC<+xNT(#a4_ tZ+YO$Wuamq2T9(mSVo*wEU}oRSM7NKwhq86;KMXT3+mr+p}Qs>{{=J5d>8-# literal 0 HcmV?d00001 diff --git a/projects/radio-show/audio-processor/voice-profiles/tom/embedding_0009.npy b/projects/radio-show/audio-processor/voice-profiles/tom/embedding_0009.npy new file mode 100644 index 0000000000000000000000000000000000000000..2759f07f884de6bbfbe171d25cbf930c6d979fe8 GIT binary patch literal 2176 zcmbW2`8U-2AIGiPX*stprSFiwLsz;AG4mOdwh>pQTe755w23Ssq>MGh43lM$y;R5+ z*Z4f&6E_h@>7=62Vk>Q2?WKI(f8qQ3?fE$8`OEV>&+{ePyu)Fui>yqrOgPiiD{y}R zlf__C2h5np4CaAj0mlP8eD@p+@bvnZZ}d1C=rzLw4|(``&1ge&)0M_X#*7HY|9z?& z@3T-tML~Y39@Xt?oR%I-X;hOs_N2YWt&Pc;r;&|jnIiNI#2}h0Pxj}Ypj7ws$ybGY zn8g&suSE{Nb=r_*)KDCQEwJjyN65oJu!}wpAG1;P^CXzI;Nj`Zc<4{(;E*v3{e4~} z|K24GKg>jD=M{)Z8S<2?(5$8+-BSA(Z2!(jd+TzlTFGXH*FqBI14V~(_)=kuD%k;& z9A}8pb; z{X78-F8+rIo%<=N={fkn>BquK5s}$<6^W}X@pu^<3a(J{~HKPsw>V z30h1Nu_9t8BJ0Ya_}mU7K32H+B>?f`^02--#?HOFkc>&RSW*(2s_M)eFzoIta=E`AixPu5MVMUx8$sx9pEe_lb^{ z3Z;M9i`d7;VS_~&igbE0yRQyjdJ0sX%wB{H=A(+yfFEf*92?n-O)XhO9N0xZ_*EdX z%#pU{)?mq*B5(^N7+GA29K$^1dxY^C?yox^;5+h#xv zK8#YnP7cU>;R)Yp77_bTl4WvP5D!X_aP3lpwzBOKE13ZKWj5l`gNQR3A#ZY zc02>OLILcgAxLf&qS9!JP(wF~wB|9MJRv9!szlA{Ay!x2ZOZ%3Ba$uulYZG&4Nv|M zRKxAj^G!=?mQjYof&v(xeTf$>7Q`yB4)SBCkYqAiYKEL9fD$yZR%Nx?^M9O0Rn z5jj^=>5t|}l*R_2Z8DnNus6k9voctWTqEZ5lF73lK#;Z&3MUds=6wOemU^Hky8_p$ z>hZ4T92|qDDGjwHq_fkQw)`a@U$qTjr2PZxN1frmH3p$6ZzxIkJ<@W(o2b5%lX_j* ziYGRaNZqDK_oqc;j<19$Yze^^opZEW(=I%S7(qpk2xqO@(fuZyP?KR87@dc(_ZP6K z_7XzJuOZeT9xs$dw0ia?1SyO|B{2b}fuHI6-|gtnyfos|y9)FZS6I&#fYIfHVN*}( zuFrh@dg>uQb}b@;UKgahbfBr#3=;KJvV4t@JTfUI%X_uSwp+6~j(S<374)Q)u@i`% zOu^IoT<9yTgWLN!OacZ0&X=FMI{ijjiHo&pMI|rftHCVv>86YxZDNy_?=`l zHCN&I`$t%*|BxJ-S`St3K{%L+@qJ?i*b8DY@vAmNuh%~OoD2Nb5S!+zDj}JO&6%0;KS+n zJ*0jx9!+!}l6XsT)N(r{0)1TDQI4nS(`dNCfkmV}%(Y}lVTBuvy@gchYZIyMX{p1Cou!D9Z9vyFi+X0OiG9LQgjrvPq@(~UuUz2tDH$vO z(I*Ta5%LcD;G|nPROZH`zF{Uuw{+<8+z~b5iW>qCY;ANvpK%q|-elnVw|gX#TY`Pk z8iXarNv;;9W1u+Hq)$ literal 0 HcmV?d00001 diff --git a/projects/radio-show/audio-processor/voice-profiles/tom/embedding_0010.npy b/projects/radio-show/audio-processor/voice-profiles/tom/embedding_0010.npy new file mode 100644 index 0000000000000000000000000000000000000000..ca3086ee2f5463c13ffb9f57dc9a0d095f25a7eb GIT binary patch literal 2176 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 literal 0 HcmV?d00001 diff --git a/projects/radio-show/audio-processor/voice-profiles/tom/embedding_0014.npy b/projects/radio-show/audio-processor/voice-profiles/tom/embedding_0014.npy new file mode 100644 index 0000000000000000000000000000000000000000..046eb8ff531e42f56a2907dfff7ddacc921a1e82 GIT binary patch literal 2176 zcmbW0`y-V30>%>|YLQhg711`iWO9qltFRJBRBlPRo5DH~4l5k_5=IylWt9<< zdA@JgBji%LEN!9IR%)y5Cedm;|H65Gdp^H@o~O{w%XP^ch49$j90;j zH6Phfkh^>>M=h#=kxzd1u%YD|{R%k;ISdHX?FldKWpxws~8i7sZV~#0Q z=q^x2LZZiwL48mmym-@O{`3Gmu)@YyQ;F`G48?zMe1^u?OdK>VK(1*H^4JBKFU7&e z?q%dIKZi1WQ;U4reoVgeB#+c;Fu&Foa_fCCv5nK0jNZ|-^ z?Sdn2TZz!~SRV^DEm0ny1HOwqQtV8q+50Nw{pwaSBAZ40S4b1Fb1=eqVoHrCK!j#H zbZ?GItapj1=(Ji$jZUJYAswD;GKtL!H(c3oMk+J%ss3Od&dNq(HNy;rr`Dpt&;gda zG_lZe8<=k!sBm5}RBz*_&oHsj(KMkfBF zWsAu0CQ|)s877X+z-mVUo_JlycW=bds*5HH>=rZ%kHBL?6V`3YrVKKlku0BNcy|a1 zbB2#0&jh&GZ6~d0M)E@imV#{(bkmEWXMGY|jr?%CrvxDdWh5)DmyA;lFxw=Catndl zKqIC{EyUj%72t2lg_3p^oHa|3sboN6|i46j8h9_Smk74cQc%pr{mDZR&XArfYJH|qCLtsXX0$I z=}9;Yx$8*ob&$7q$H1!-BkAsTnCpqLt8G8bJg3kr$neW1edVQtTfpkyxBQmd3>W0wZQHHaZUIr$^1+Z-82CcVIZpQ z|02w?GkDP;!0*@CzA>39&FiJj7ax$B_0D2A5dePTTh zMv0Kn>?rXz3dh;kAJ92egTI)nm?|7&85)I<@m&s}S2^RhfQ!J%Skx5w(v~tmLx zz>Vs3EQ#Ms!pu2n<|RVmPCP0CmQqKh?qg1;12!GWm{oX&@!D>vhpm8^RfEdh9_yoC z-`fl(G~k`!Gve*vbasWe!MnEsD}^?gxwi!B!c6pAWkV{h3SZ{sjEn!#cE8}m6B9V8 z?C8DZ{o+a}2Q$&j>_e&kO|pjaBbG(mky?I}*jLa9EzHL0>L`fExoG}$fXMFPBck)$ zzF!)HCl`pN$7dz#g<>%NxPq$-zK3#m;J05)W9^T@5T%0ZKedP+)$_yQ6F%@+<%>Gj zV*2bn9$wmCfT@-SIiev)?0SrF{>eJrisj&|NgfP>nh@EYM*Q|yG00P+%GRAn#f~YKPCNrTU75()Uk62}6X1tBV4r(2%DsHa?+!d9nk3<3 zMk0K3IM59&gyeiah6~E^N$iiCThlPDAA!DCwV=LoaqM0z$?B@aiR;~%NE?yJovOx? z7YR^|Orjpf9Yx>JJZknSjZw&xg!DDo7T68l7g z_6Y0sGbYvEV~zVI4zTrL5q5eTC058K=0W;Mxavg}Y3)Vl^&$vjY7r|hgpbt?$=SM- dXk@8EhW`}v2X3MLK>@tg*CW2Z3PF#K;~%MxX}JIZ literal 0 HcmV?d00001 diff --git a/projects/radio-show/audio-processor/voice-profiles/tom/embedding_0015.npy b/projects/radio-show/audio-processor/voice-profiles/tom/embedding_0015.npy new file mode 100644 index 0000000000000000000000000000000000000000..da02cc0f5eed03638af0b72a95992c392641ee48 GIT binary patch literal 2176 zcmbW1`9GC;1BN9s25nQRl)dbeqilK3qzGBEr9+Ob93o2`sSnA%=cpsumkh;NLb5&g z_he6dvZqb+mTF3AT4>SR`!BrLZ};{4eP!)-vaxenAQUbXsp8Gy9tc(0Dz8HMY*Epa zSMdoB4GZ-O@(2#~=KRl_c?EDeKRx%L*I~}jt*Xn=(NxovkCOkt`Bm>?CTKN#^t?`VJhS?bo5IQiGAgXk$lkxe_QFtXSTtKP~p)#j5iZdeZ9 zy?n|`v)f3CU5eqBO2pT@LL{@5I6vJ9>1V!#)X6XdH?g7cizg~9R={&s1OaneC=gFG zTJe4(-e&*8Y&{l&&OM9V&KbawkzNB0>w#HQwglsTB80lA6B-aluPL=(#ul7k9XC? z@O2PI8a&|n{5)iiSd#O_FR497?pV;Ah%FyZVQZ8fa^kqKV*Ewyk57}7(oC37NDys@ zLWFuIVkIR@lI`NqIg$=m#9?GVJV{pWUx<*6Do~NmKyFR~j>euuY;H27{R{=(RjK4! zaTJwU{sm?($FcfD4!qd$_|lY&nVb_a%nc->0zRVtvmW6M1xUVWg*!J_q2^XL4()1% zPO}?!EYE|~h#~SmX5y9VCY-vSg9X7dl+;QdzO>g811bk@=0TVZ$;8C=Ah>DsknyRJ z@_oR7R>wYce?3HMvR{(17e}GaDuD)-{Jl&pH!EnK=1Txnq90&Iol_| zFen%dy+{O~<-ycRNYLXdD#)5?!+2c|D$DC&@W<}<$LUJU+cVFJ-v!VaoDx_h4dFV+ z1S-+9#HY6agG*v?-sTC4znvy0(tXjVxF1|MW22gtEZhroMZjb}X1Ax{*+>l$cc)00 z%OZj0hV{@5{sRWqE~Gw48NyEsajxht+2LA5+Pv%VyG}BK$|lKVzaMm(%rGTd1Toi2 zOtqw-=$Isv9V1E_Jcgmh4??L{BsQ|H|NPJ)_$c^D~Hy z&IYGE9yK~QjK;OMp;&klWf4iZR&5Sh}-{C^^QHt{6Tk&rTqp8+4dj-AQ11eInf20o+@B7^`f# z_)UX>0d_Dn83v?_7Y92VQ*=!`LDSuZGGzR0-@`v~FoOd#iz{fU*CEnE!ic%TgL{b$ zzB~wEvd*TVVDBJWlq9LlQ9ds1=3}r_5jLYebYt8;2r9$C@m@;QrKXIim;Sgqbq4e5 zohUnVozR80s}tGXAz$LC^k zk1_T=GnZguuJT6J#2uE;bI6S0%{XZ|R1CDTZ4 z*wKI>Ns)4mMK>pqdq6EAf!T>0}__ zTMnc=*TMUMD6VVmhjViaoS@t2GR+T^n^@Hr8-Lvmmw#b7|NlswvV z2oCxI=t{Lj+@k=*uj50vHyY038E{y%6}87aa4pIPiD5j*`IaCfzLLy;%mUND1|u^E zpf{X?b$%b|9lFmc#g;JaUVV(3*<1?VEpu|KR|qk_ZD1aCK+n(#SeK=tD07#9eK`_J zl1}8Qj1C+bl1%^pAfsn%*C1>e6Zexfh{#t7W{Jc$B75pLn2(+}y84F+E{F#sFF6VP n>C@OD=1X;bPefP#JiXZICN8(PW7lW|9^1-7EGZF<-%{~kdUtZ9 literal 0 HcmV?d00001 diff --git a/projects/radio-show/audio-processor/voice-profiles/tom/embedding_0016.npy b/projects/radio-show/audio-processor/voice-profiles/tom/embedding_0016.npy new file mode 100644 index 0000000000000000000000000000000000000000..e8bec0ff7b1946164cc69472bfadb81f4ad58bd5 GIT binary patch literal 2176 zcmbV~`9IY81IHyP9TRGkd}F@R43P+{H6PVCv89l+P>w>%G47IU%`l=NVlc^lhFuYb zdA-Nz(CDI2R7=Ws_;y)Gs@;d}`!9T-zdfHnKeKI}ZT7j&lZldvVfy%n9|>cc(V3K= zF;kDu^kaubgn0*hvcr6Q|JSX&1H*m4_i%sj5Z~{vZDP1tPe+d)NB_TBY_v&;nbkqC zUQ-UYpH)RCk8Kwh^)-S1pqX0P!Nb986)f?(95_tz;IU1X7~ES!{p_1Z{-(Xef%Y>Yvfv;?GUFSZOu!QHR`_U_D}Wv+42I^xvDFa@b2UW$77M>J zT5!utKxB;_@t{+P5FJHvvUw6*Zqm%1Mpld8)E~t;%Wg=YM`P>1GT`tu1DeUHNYO}v zZpeI6nfj434bOsUYZofct|yIU0x)S7sL?Y9ck5Z?kJKagvlMqDgWN8IJtlGh3Ote~1$+;9rU2)iC5fj-Fa7l1}3kksC8QgXQzi>ek9 zB}psf!+t}rXQ$cL!Zh5j;Um{65zaj(Bu`TXhpt+qDg7e+LXvT_I3I3~Ibb-NidB|# z$=c%|DTTR(*sfNN4+ZH^=JF7ypAUvs7#wV^pgnsY8X_8$+AhGE?vIIeH$*Lyb?B2W zWO)_wkjc)&ezk2Vh|576or1@fLD5$g9csk>5*Dxx$mgpBt^Hg`RyIJ96NCP5$+$DH z)_m6zIzl`{A$PD2Y(WF*%ICr5uO>KY?L=p33%b|aVl-NU-4XSqNO7L|)G8((ICEij z_yn%rO-Gboce}m}AO6*WU^o%17@kBOFT`wiNeaw%)5wEsqomhHfJy5aQEjj-W&64V zLmK(;`68!JXq!tl3QFZcJc#+xOqYo=~ZIN0FiM0n*6=Xft#1?GBG*xE7M; zXb172B)%>2iz`fYXJKQ!9hKu9*sw5${M770-rw$mTXhbYtFDns{WPdO_kd(w8wNyT zl%-|BBHBQdG@?QhHJ6FJjMH#Fbf~?Ura-jkT(C4b5WFdU^Dig+$=(B-h)(%EvR1;x z>r))OY&k`_)u!MtVGp@x8G^D<0n5zn7woYb!AgD{3TGc;S9=vnS#<#n$+&2zd@kM_ z6=T*u2kij@*cBMV;wMHgmMxIoHZt!UmPKwtBuT+w`HQB<=^6(Ym10_ zXEI*(2=OV8f%}Jfh;+#!CGH$}_<3Pue*nH3EoDXP4dGE^BSi8iVd6K4bb&nKyUAc| zt`wUNSVB4=XU^eP!mDZqx*AoY9)o7AGATh?p9u^%&BK>Nsd&p2;!RL2_6_S$kK+>% zE>n+7d!&ed{haKi@lkMY2Z9e~pcch zj7iIIW+o7sH!X=~QZcUfP>6`Ui+9>hWF%gfgq-(;(z05z;8Qy|;z*Ph1zBmJz7zs}lPreLwqTeTkkb3O5b$0Wqu0t5>e4gVQY$BRNX~@XR}NzJ!k}Vv8g8C>P_HY~cF!&hSSb-q^Iac|4fW}_I3gk19+rfrF`62|CRk--01-J!Sa4s?- z5q23!@b!V}=zg?Y#^ORo7L?zdMwFT#EBLh?e1>AM_>(v8@2G_D3m=5P$|G$yLR=IR z80~0l3xAvqtq37b*j7`22PUC*>2=CqMTAmY8KSaL1@r0G@htN=df%TxP+4f|oRcfl5Pf7055cR|gkDJP1&u*l+UL|Cgh7J^i?J1=pb8zib;J_*S n{$38`nJk1_)xlC@A=I6p!~b13CJVE1%w;{yB1(|EhKGLuw;Xf+ literal 0 HcmV?d00001 diff --git a/projects/radio-show/audio-processor/voice-profiles/tom/embedding_0017.npy b/projects/radio-show/audio-processor/voice-profiles/tom/embedding_0017.npy new file mode 100644 index 0000000000000000000000000000000000000000..e331f676784f5c24ebec9c9a78f7d35e3448672c GIT binary patch literal 2176 zcmbW1`9IZp1I0C2iWW&dqD6~tBH1GMex(|FqUzs4J+Tq|Kmjz;>Vi7Da?_f_Ji>=I} zd~{jr$}FEi-YK3(fO{a%%lm)1smF<6@A*9VxJQupyx+DKh8c3Q%h&&4f;rA=xY&gB}S~s=o^Q*Iq^>I|_BLk}%y$!Pa7uoU~kr zQ_@vn`|KsfZ>-Rw6@ax7AX*C-(@Xu#4XXloGQ;aFAP8Vke&Z~biSuD+kc`>15Nr#I z#pNy~vZ88++Ij2@j9)Sso-HCBQyJK^XBWiSYS_)^gHFE%uecVtiicw7!(QU=d==U= z;TXSa3QIo`oSk)`S@Rq9jc)1C}7gC7Y zVuE+~N;wtFHPEbnr~WBPgX`9C#18L7lff}`M4I5lgB{==D1&QnCgY;{6!*HUm@UE4 z=rIu@>$4gnCHqLdWDhO>% z6wOXZCD#VRuv+AU(<*aV$dxB83Y8Rp`B4a_Q&6998GFSokuCCtdQB|R9Umr3JxgJ? z%Nccjxj1Z@1v3Y6lHYX^r|+IeP@ON<-OM2|Uu6**uZ?O!KHgOd!9q43J`uuGUxU$o zA4>*yw^QzZZ?G>R6@xa#(Bnp<=6WVnJ|%(6-%NhLRE&F^by%&Ni(ia9F=5h3XYz`$ zFXt}W@_bRMpAYt}?YQVsfW~%RIF4<=zq8F7^x4@k*HI(-<`r;}2!y;r5vHGnV&$A7 zS#_F6UFooZ@vlB8Q{a=%h8YrKl>~#4N_dX$g<(xG>__!bE>#5fjr+vPc!XMKev+h~ z^uzUWclftQpk47MJ^q~l<$p!u+rSLnXfH<8LW3x&hjLVmo;3M-JdZSpokz~Z2yOjO zF||N820ys*u_#jj!K4V1`@ay$#qS8atq~u(Y>-}kA%$TqTxXzero%Oz)=q};Szv;b{Ossc~MccHPY@o;vDjI^$G_ket+3MTuG|B>t=?eP7~8h*vF4xN+E%9!Ip{19C zBZ*nad0C81;{-T~)M?JK?U+^UgYgbNR8%Huj#LvJ&v+1Pffl;sG!fhpi!1&XP;>KU zgmR8};oA)9BWsE4Gi{79t(aP=kH3D%AuGb-$?%#?(zafe#Jo~9q)W1Jw?K)RsThLE zgJAp-H2-@WjNs`L2&2mN*l-p6Kp-3v7t7OANdZ=D>_9>J0;ZE^iw0K-Ag9~;aL~=d#~L|&EjIy^w+0$hg)lO`fLWWB$oP%I4)GC4Y&V5buNgIzs>6Ic z;Erfr_j%Uqp{4bO$UpFbl0+dsQBK5n`W!wuis4+@0_x{nA@tkx(Abd&W`7}Ry(U6c z-bqaA@W|$hKJ=;_g~4G1^sAI$f2aEV9-|;Ov4n9;=OfoT8chFTG)u<8y(JZ|r)4oV z)ict)!N2 z@gyQkK88NzH`pe`L+)8LR7&UnrGJ!)hC16HJ12$#txEK9ib3YfRQjKv_(82j|%g_ zbGr%EwgkFuEC#n(8IYTjF8Dy}U4+!MpeRy9R;#wmoP pW}m+v8>1LgWDi48iHk^*=6t5B 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 literal 0 HcmV?d00001 diff --git a/projects/radio-show/audio-processor/voice-profiles/tom/embedding_0020.npy b/projects/radio-show/audio-processor/voice-profiles/tom/embedding_0020.npy new file mode 100644 index 0000000000000000000000000000000000000000..aaa8245eee78ccb4d2ca35897d3d23b023ef2b0c GIT binary patch literal 2176 zcmbW0`9Ic)9>r5xE`=;vLMB2*QfSKaXc_cUmMKwYEXk5dvQC=pW6hF1JjGL5Y}rDV z=X}0oixM*SL_3vB$}L?}jr%X$^V>PUo%ea2Gz)9->7{geewdb_rACG8jlrz*xs66c~2$HioWe2YI(rp3Vf$Ddiyg zsSYL3Pp}`rK>^DZB zBn((~oTRtR1=J*$W9F|3>OYWAR_i;kv0@D)@b(;DEz_cNvs@fj$VV!R3!{tIpkok+ zV*`KEbbvW4zds)w>25@DRLIA_5Ow1F5gTs~U!hCb@SyMP&J>z&t{~Mx1ojyj2vb~35Bj3$*7tJIjt~PYy*SLvO0cHhry_sz zL)58mfb1Jb7+))fvy~(X#l^#XdWfXEHPHTD0OKpA>C?~ANPKI9<&i&N#fSy2Y9GVW zfNwZGr-GarX?AZ-I&8BpgFEaBk4X;x_Bapa*&wJWj3QDwfUyqAq$USrrZhMaF$2Zm z1Z{yzKpz!VsX_1^A7zN8Ve~^QR=!-^N85)?jt-+Yj|+=`GfIz+Sl&}vwK5uOwBzGp%rJDGNkpCImF1-fMwN$rRG z5PFmj#nueyjdCF~nS)muI*@;%0%%zMz|-El#*dF_am}m#d*zM5~Ojm7H57Rr=;umAk~uwGmX0t7fVFj^_6UA&Tdvy zrxwo2M?&f8I4Tqe=-E0B9A_%9>yRTdS$9yD9*5?^VTAv(nKZ5lvSS;D>U#<XkAJ!j9`5>tv=n^O?URK)TcK?+NXz$e2ayci7`5^Alcj=mh6GEuP5c8s&boxXgyRH`#Q=h>W3&X)s zFEY<8f?|3$qB{5}Uu%{w)VG3T77q>ott?NMB)D|Vz_P0hK1?1Oy{=GT)Eycu{tu}d zSEEiX4z0eTG*x^Q2maLo%SR66J^G65pZDOoeH0`Qz9E^wYB=0?fy%8O#Ctr%#QP## zOisjf8$YpoS@iX685n&<+R-IUHO~IXejf!@?KHMj+B4cEl|nZZT1fwaF$%&jK_;?< zm7f?7u`NoBmCxdjWyTD~V=cjiO`}gB5x;*Q!T#M%H2ty$1GK>FwyVOMs$9fWw1D5? z3YJp{t1%z}VO&AVD+kQg*kC5FpvbL^);{_LL9Bf!*5P1_doEIZ{h0-w?O>WdAuG@q zj*p`-;V^^;VgU#&dqz{+lkibig4#=rXcI$SM^8-;5oP@c zckNK98HW3UF<7Y-4pa7C$~LT`sU8mOB3?quZ8O=37-N-o4IPb%!%xk{sP76x$m*B0 zspTqWhYny`a}0-r&rv5^1iVk~ur=dQ|9Bl_eyxC8t_O@?r^0kNg_Hy@<8HtJ_=EH@ zEEA1>nORXk-9vDk>T?vj_V3j!#77rJx*ecB}g(}@}8I$(S}KaJw96SGhsKA z5q)kP86Fy>Z?lx4Nyd0Ik3x>R*J*|=>#5r#zKhs(`e5pdEcRYP=2i|-7fKj)E z1_}{pd;({O5^-t07&9uj*i+y zuggxtd9o8%_diCg@N?v94r0xbgGhd|5h?@8sQE5RQhS}CBNR_U{aG*_eQJ;(kq+t5 zi^%O}kjs%{C$=_VATij030w=kj%+Ao=AmBs21LJ@Bdh8Lnj_DX?buxuOgq5dH3ug0 z=C~_oY5e z%b7Kt83XZD@f{j`!{Bd?rZy3M6qb&{`b0I($R(m=z5#Y4l8nsTY&>q>2{%C}1V-Fp zS>?ZG?flIOeT+K>`rjLPiK*kDgFcnq-i%{L?RCo(jqouo6>Dx+;_zG{G9T?G$B07Q c?@)!@p=TJJ_<*jDnV7j?jpXATWHxc}57Fm^fB*mh literal 0 HcmV?d00001 diff --git a/projects/radio-show/audio-processor/voice-profiles/tom/embedding_0021.npy b/projects/radio-show/audio-processor/voice-profiles/tom/embedding_0021.npy new file mode 100644 index 0000000000000000000000000000000000000000..297d6c1e84e2aec96b1d1843ff9673ad10152d08 GIT binary patch literal 2176 zcmbW1`#;qA0*7hZb=pmw(v8Ay?%fb#=8IG!RLZEsQYa&Gov|bprHo6I!5CvS#wCRq zQUBR54Y-75< zF~zbnUZQWzieksI10#1tv3CXk&#wy%=LCQEoZW%Z!QZ!uwT0yp(Lyxo^Lq8fT=5QME?Cv>i`Wi1^!=dAI^l7ZmEW+=!Of)C_hOWrl z@pX#? zcUES?cUdV09`cCg9wW*}k&5YAZLs6jkj-UhaU;kJRq6V85PJ;nCUvm+b`CpeabOyz zkd(%1EWa$o;W1O}kKjSrVUDvsi%^i72|ejT7$htv!emX-#NJQTws@1X+q3Y_feGiq zUBuQT2ZGKzG$y{GJOVwz3@E^I|2*o>v`EbF1d;7vLTLCN?)s{ff8Rlbh8=;)VLd3y zS7Vmc4&MxnQJP^3%>gNnOal!l3^pBKNd!h6u#sfrO=|?+{On7vvh5%mF+%su)5vG=U>9{3?MYe4e!WBy zG3h`Y^3PK_>Jk(!6yQgZ7#qej5K^3v8XGRm3#>?hPBqfQOfaC5gS2`lXuIo!W?GL3 z+d?o`aKV)~;gj4Jk*_3JwR0{$oQ$L%HN$dtJAI+zUpE00o}7$r@znJ{hd!Iqdu z_)vQQizhNk&5bHdK0b(9X%CQADxgHc?5#$S?mZG;0W$LDBCJM)Sel`#7^ir+o@EUeegRac z$WW$z2A-D=QYR+V2}6@jL{E=GZ+{!4?5F7dg$0cRX?SZCK-DUxWa*a(@}cM&X=o2d zSWY^WUU%jDVv}J$cbq8OxoDX6p24e)g01!+aEgq_zEc&LJ9e0q8XUr^0SmNBN)WOw z9sA6y@b8vnFbin*zjQA}9&aY8ERZ4JJsSA29@R)?>M~fDdtC0lI{<(Pn7|4UJ^PzU3nDVXiiv%=~^7@rez^_JPvWWnZ##M1kYqH?wa*sQEVF)=F;&})Iffvha*oe zMyc!&`oATU^<9P7SGyH-_q#arYb&{5r$>4p8{zlArNk+;9s%|OxZd7_-G)in!b^nz zXdaxGRfDd%058t@L%qlxMtV}bdyx)qIfZ5U8_+#v403J+{AgiN(_W+Sw(x{(V<2dw zn{i)$lEe&hv5{Mc`3EY9D1J35XUxNOLE5FN5f1wNoXPF{QV3l6r1#H4?468<`Xd)& znypUSeLYZKN}=z=N#qGRQ2BTq@!eXAi0cBR))t~ljSG#BdD!eE#?94k(6`}{1V28k zTZL#gw!uWnUknr7c+|DrLRIB;j4-OmuzD%})GKN5u}i;GeGt^ohFKY(7V9K7?O6D_&m zdw({7kr;}v$t?6HrJ#-x4KMmpGVZzw;SpR&p8W>D%jdCV!8d3pX(@7KZ5Ymz!EJUB z6_I-aPo&d8Hxwi01s^L5&4|{F3!pWvC0qv@YIR<kV# z#C4-LPR;m2g-$(AB}OiVu5vfRYdFNrYaUYXNr>KN3)Ix7QOT(ukSNnoYgB=bmSQ;M h6rjzs7%T%F45TYjr`CpAb}1aiYfz(Gh_L&m_y>b6g!2FZ literal 0 HcmV?d00001 diff --git a/projects/radio-show/audio-processor/voice-profiles/tom/embedding_0022.npy b/projects/radio-show/audio-processor/voice-profiles/tom/embedding_0022.npy new file mode 100644 index 0000000000000000000000000000000000000000..8392437433b75136e010903958ec4f8c110b7fe0 GIT binary patch literal 2176 zcmbW1`#;qA0>&jFB-ggKR#c2@QQ3;`B)ue;sEFKVLqxITGEPYdF@rTU#<;||HAP`G zA+32nlf0bVYIm(9y6VbqhuDgAaXSCPd47A|Kfa&W>*2e5x$W~^Aa`8u6fGo_bvTx0 zqfeubY^Is((~d;N#>ECP4@Jd>g#M2^21T+$zj0Q0P;}_GZftF}(cHvbKS}@pj!NoQ z9(?0GP~>$Pj>Sn(jMyb>8reh5`WE8E{%FK(nZ=w-5!$1s}rf21y}_?ZwPr0gz}Vqu0I#6P21^#3>W+ z!g~1M<>1`;9P}!1K=RIk_x1II1CMOV0WOI)LLdju~V78?68yU@XtvI>JcHZgNu}})v%M6BXO?) zuYV9Awat}STm49{uTI4FU@54+PQpFd2zQz>I74O_^gIh^ekH=H2+|jEacswJvhQIt z4r>;|&|V+YAFJ{3t1E71(9vltz@-sG;5kQ{-~SF#bRof91v%C%PyVisgyXt!a%6&! z?5EceCS8oINGbInQ4z*^KGid5_$TYbE&A1l!MW95p(0AaGOkoc3cz*y)#NatrLSa z`vuoHV*KIDMnmv<2pUB=`)4);wSIWTE+b5_C9GRFA@Y>~8~6ekNOGYtQVKE4LDoGP zK)N=)poSbaBmP(xes>VU)Fc-c@jMvp%Y;@EjXY!2;dbeI1Sd6PYR(hFH!5_FR}ES( zuRwk%8^uf8uy@i1mMg>V=)_*leyGFJ2n#Ag|<}MC7fL<0_$QGnX1br zyFyDzG^-E>DSjyJ(IJdmc32W~6YcCP#JYGVVNQuL6IBWwK`*)QQ3?*%3~8-RNLFlw zMsFGRMM!Kum@gp`U1xGgP=Lm{&s2l+Ul>%0$B{+JNT{o{ae7}x!UKH?YvE(!<=}#) z-*(wU8Q3@(pTM?Q71{a0NIXyY$!6@;DYTpz!IOw=1n;gv@Ad{V8W({)n+;eZR|>aR zWl*86;U_kYvsJvsCp0S-(zC+QI~NaUuOnz@2Fk3R z4j{d`3#ncb>4ZB2$~f9C&cSj|^`=NoLvYRMf31Wc_o2&|9a`7kma% zwK}{_aDlgLDF(uqlVS}P=6_3opq>HetRF$?-Gos^16F;=#r^&L@an|YWOXaB^o1Cm zS`DMEtLVCVLM)7Xi<_ghHpwmd;C6~&pKOe`PnD6~#s;;f0A+77h>PAb+}n}^*ZFG9 zPYhrpLrJ#%r3-k+6Or*K6YDfXaA?ImayvfSnrffMP{Vz+=+0oJh8?~SeMkH)0x;$w z0F~v1_XlRslT!|s%|=Xnbfa~!fn3?y439A*l*ly_rD`eq#!JCp$HeSdIkp zdOIXw+*L)q@==tz86a`69r+nXQVnNSGzR&ge@>bBU^h^xM?EXBlF{b&fc;ZCc2vip zUr9vN?nUF?msW&5NhiKqTZm}2HguSIsCu1>>_9HL!4*SJtALyq3viN?ges|sgx^_2 zRxA17?%j=GONH1K=?2}+T(t9*WO;r$FgcV1{=$>^Xq^j}V|f@YvBzy@Bbf@W!Fb7K z6c{-`DU3&bPRoL4nG8;%8wk6+7pnOe;CE~pUaa2;b<0!OHf(_D$u6qfAQQ`n3h^?w zfm$h7iL`wFH%IM=*H5FA2C9)0oJwi9>ms2w9*_G95OqBV^(i3`Zq3J>wkEOfO@r8z z0f(|6c)P_Rt1J^KJpq`0Vnj;#2cf<-0N%4su#CS3omJr&>eZArpD0JDUM<$f4cRgm zmqJnX5lEK;_2|!ZMEGn#v>YE5-Z5~`GeFeJR(uLgL(uUoJe#kBe#d^{)X*;EgV@brd11}rqlwcSE2R;eW~MwcTpsgZJC%z(&{g@_Cx4xTH-y21O> g{yQz;GM6D-=OOa=zrkWh366ia8wqO#Xp$7;zd+Z1l>h($ literal 0 HcmV?d00001 diff --git a/projects/radio-show/audio-processor/voice-profiles/tom/embedding_0023.npy b/projects/radio-show/audio-processor/voice-profiles/tom/embedding_0023.npy new file mode 100644 index 0000000000000000000000000000000000000000..83b2fa8dbe1f615114066bae86d433477f6f04d4 GIT binary patch literal 2176 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 literal 0 HcmV?d00001 diff --git a/projects/radio-show/audio-processor/voice-profiles/tom/embedding_0028.npy b/projects/radio-show/audio-processor/voice-profiles/tom/embedding_0028.npy new file mode 100644 index 0000000000000000000000000000000000000000..84f81f0b189a8f05f5420b80922251fd869a3c6f GIT binary patch literal 2176 zcmbW0`9IY81IHc7vFiw3I$X<`D2;o^XYlparUN;bQph+;u`z?K2rS1DKe4oF)p1-~x&y(JPUfV(x6%HyKqOqe=B9m!M zBN`QLN3$}bMJFbwCP(ZGOH5`*{m*|Bu{R~^vrmbQNQ(NrE$kUKR&*<)ETjJ$jcfb) zXgCssS5MD@*YiN;J7q4vJRd^w1CGj^%-N_2v?OkRMK}@=gMW?Qpt{;>o&9XC5Mgu& zc4r=jw(c9*YYl6}*@~$Dwge)$pb4utg`z2PAL@tOkd@T~rO+gte6bt4d%nln^5t;j z^&{H)EbLU%5r12V8BspmyqXcLZZ6+e_Z=4f)_?}baOM=>3C%iXFqq9nCBFo$PcGOR zHbNG8>cDjW6$~7s6WbR)&}IsuZFr7MpB~5J9V#q-yRY1*-5;z44^ZkTMC!Z{)t-B z>r;y!cQG7PJi%$_CFWBHouQ_V=yvHL^1yT6-0g_*5gKvWZFyniK zY*fuf>FtY{>7Ar36VE#@Q5NH={!&(4Kpd{x4v>R+%OP$O!beX^DfDIF<0%o?%`35W zttF(r9`I7LKuy?Etb9YkVr4$6IBb*#xMO~rkAB-Y6h!-@s;eCd?FDkf!dx;(^OhIV zaxrl$2b&COXwQ2_+`F}r**yZyq$v0tZ^b)a69PN*&{Exwpo3iKXV&7QK?~N@8OoKE z&%ilCNXF8Rf+NVm;qBj0-mF$|H*2u^eD)&JuN=SHpTNS#1Tc2QVpNz+Hb_gdJ?;o(LsDH73{_YYvfn1x#G?p(!baGL9i=oFVs~ zwjl?47qFh%X3Io5d^E2w1<#w0<@SYWa>zoFs1VUVE4HTD2FeKK(vjiS>fO%auo?nDmUqU$17r|9K3i|2-_$|yu)|3d0 z5C!x9M8tU zye1C8BmR)yZlsK9V%&IdwOe z^iL#`I-L+0*@fT<+mtw`ZN{p{m+)osV`5ZTOh)hhfL9-c_)pi*Bqgg1B-{eCH>;4I zSp(@@J@igDQyU#Lh~yoQ+$hSy?0AMVT`+?cwZV9}JQ31_0ji|Ak9_Fi5zqBAgnwlR zs^kJ3cx45oW#Q&SUAZSG6+7)(WJA^4QJnS&8_M`FQz?W+SP}VhR~n)hsKENS3T)lQ z$JCupOmhUdzS@qZZtM&82L+uw~|E6RUt)IKvbj3i6re9)nRrKL+n0c@bNEINcW_yKd7{~g@dl%U&1fF5ZtCYt1kF*ZYyp#)zE z@8jl#6N|1^4ztPMG2c=}&3PANz`q2y+g9MQ#X=a(@Nhp^jPWa#Bz7!Ywq&UYMng>y zEE`0z-6FY`vKic+Lg4X%hc=%`)NJ%8KX;BxMSe**_4Y0b=Etz6as^uAuM)qvff)R? z1TU}qLbHDtq0d*t&#s?M{}uXyU}1Ov3JO#IVU3>^&cZ_zii`oaNx4 zPBkodR$C}SG3I{~*Rw6W+JFLe~Q1nt;xoiApWSX&H z>g5W3(@LT`nT_~}R@lc&NK;A<7+ShGqfsFHB_|!v2PmR#)r9uuMp6}=kHy6~Shm50 z3^@G_?yg|8shNWJz6q0`HbK9$7-4Qk@{-HNcqTlCho_IgJ*Wur9tCjqV!&m~9%69# zB-#fnP%m(Rn&EZleG8+pyR#d0ioHnws6*C`N^r}?5?lF9)Feb=LAn;`)6c2u9orz5 zWngalE0%FlH7xA&aaXScwj-CQ4(b#xJlalmc|4J+f9|yQa4y!~;zFrp8}=)fvhAnXOyo#8Z3+Oggk$*C4h1=&p zs($2CHhMz%J=ekO>KW%0i2ypkPeC>094_~c;f3BZ++W-b&ME;u$vI$T)MHJjrTozP z3_OqJkQk9K=(Q#+U8hva(ZT`SwcPP;$4)Y8e;$lKWMqWA!6EaoC2rUd^0ccfg} literal 0 HcmV?d00001 diff --git a/projects/radio-show/audio-processor/voice-profiles/tom/embedding_0029.npy b/projects/radio-show/audio-processor/voice-profiles/tom/embedding_0029.npy new file mode 100644 index 0000000000000000000000000000000000000000..b92b838af44f13650c5db609c01182572c1570a8 GIT binary patch literal 2176 zcmbW0`#;qA0>&v`ZY8U-k~HZUm+Wb2v@KskZ8t-#%aSB==^~t&64ouZaUTq3Dm3G= zp(giS=J|X}wv>`=ijqoOZS8T}5{FtH=U+I_Z_oSndjIsi9)Xj)qqCR1T!h@uh5>=x zLmWd(h9MQiGBjlv28D4>aQs4j!#Dwf|KmISLb!nooO{?WJaC~KS(urd8k;g=8UJ@w zFUJ+Y^A;CosrA@kJlHCoGp4mBUs9jb-$PzA1}@@@gmp}SbuFP#k@u#il&z57j5fnA#kBj3~HDkqSfFVwW&yk`qNQj~)DTejfM@~~sgIV?I_ zjY&N|UQdg`{JMnD=7CnXeY4=ahenNl17ZD3iUVsMFlWa^)ao2?M`}<#R}Y)acx-p} zAtBy1h=~wk_Z=3BSBhX6WRLr=7&yVpz^JZ148AcUqBSby^(2QRc&Cv!zi7jyG7vPo zfTZMQK!3az?qlbv-49Z&c)miM-?yH+6BmqAO4o?tQ+GUO-;{B07g0r?DY(bX0GO-M z(_o8L*S?3rj3WA0Q}~I+AgWp^a83?|tbqmD@7V}TjECGO7c4exhSd=l+Oa%|^v+Q9 z(|HLtYGuPX)&PBGGo-fB9LiIVFcuVxFHY^?-mSu;`DU5V&6^;c2(+?GuxikR2(X0y z_I5euzo*Gx+XS$j&Ik8H57o_4Ci;>#%1%BM>$BS6`M4fKxxx6-=mGbOMr344k(RKE z@pi>$@D*#(q;vqDBP)sI*)8OaX5jg3817F5k&7QU;kzmWsLx5@aO@2D&woLpZ!X@s z8PjH+Ye-YY7wYC632qz~BO_1@DL)xLDneXG7IwL9B`1?=aVTLWg5(OZVUr__ynd6N z(rJKDJry6t$*?tOMRyJh7Q^M}ch`Y-Qw^nAv4cR8ii68QjC0y>rZfZP3b{}+rEZalwGu1tj^L0z0A%AG``khxQ@LPY_Lx z9t?&yBOJ2HG?>~eSUV`l zl$i>^WGBH%P>T4KqS_bZjJu*d;!PI(=3}q$5GERp|UlWRl``@6yZo$1=f$0uDN$`(>laDr3b&IiBjR*hh zQrPLGAykWLEmAgt?y2RZ#6J&uj$3gy-2`o0wvy+4K^U{yhS}>p1V4+y7qLJ6bIx%% z2X~=i`6P<={{(l1+h}e+h`Yh1+$05HuNbJK;=J$BuJ8psg7s_%2S~`tC>&v) z1AAXAJ|B%BAJ}39FLFmf!9Do!2S}3FEDW9Xz-CsEu8KO0zZF1N9Ehf*P<-ebl70P$ z2rbew+&{uVpRFg1DI<(VUqY2q9@s1fT=%&{?$s>ZZpGrF9S`Q_c66h|UerW*A$!jO zEO9I%uR<379aD{DlWfxBSAc)L(7#vhGAfSFPXhi4y`M3VEA{;>@B?d1?7 zodO&a+u?+pHx$Yp@ac3s`r3}co9#~A{461KOn{!$0sQ1T6eeom#0Py^wdDr($z6ih z^HUU~E)(hxhGnwhbI@?lMgGJ;NT3Jsm$EVWE?fz_h!~YT5!4v@=npu9^@mw>rgbc& z_V(mnsyBLuFHlGFU8o1rji}LbL4f~{Wa>aAIwR|eUlI!?8+xg(VG8!)DNy8B!t03y kYc=J_?ulZUp68q+a@^~%d%wc0W3!@|zJ8%T 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 literal 0 HcmV?d00001 diff --git a/projects/radio-show/audio-processor/voice-profiles/tom/embedding_0032.npy b/projects/radio-show/audio-processor/voice-profiles/tom/embedding_0032.npy new file mode 100644 index 0000000000000000000000000000000000000000..52d0853826a94915c90f489cc6693a973f8f0788 GIT binary patch literal 2176 zcmbVN`9IY817@Y7mQ`bmYD1VDB}XYfu433WDzOSBGAfyzZPLh$ag>{3Op{`WMvjT7 zG|zjKq*c}tsa-|KcIZ&HS0by{_h0xvzdg?{&-2UkJbVvt_bodV6@F7VN)Kj6?}?(@ z=+LPUE4rx;JtRCTCMxh?KzLLz^M5)cFf5umtw-+*j9^al<*UstOpQ!+;&uLSsQ#;8 zfE7+0%#6E$HVZD*ecwZF>1a&tUbYdm)O1WO+)7G52(kD<0h;@?QSo~rr4m*}go@9h z8G9N*TH0_abA@l`7!~j2iPbAh@md;)8lDK6hJ%>7l;Gq*C_<7Gap{=^nRGk&3ilAb zAI`&-nFhD5r7-_mfbY9XQ0F*K#K-O0o6FU}9K`#N<=( z(Laf&X;nnqd%r9}r5@aoHqaH8kWMo(+Ml~1DR49P%-~~gS~VUmyn~M1LO3mIArI(R z(DAnjVFEo^%`S$AksTV&*rLE&04p_P^gmyXI43>wgR_(rFGwZzy{pLMOg1!fhT&hE z1V^8%m|!zx)*sv{GnER6cb>r;y+owfrjg=@YthSz1}#`ZjqW>)p6`+|>!3cg5?!%M z-2tjq?_}Xyt>AGo%a%EohF9H5c&)Jp?L#TJC_jwL6Rq= zi16hjF8o(0%)3H3mikz2KZ%FNg)kccdJ8MC*F%wLFS~{}d2D>^uES{85#)TDB=QMY znQiZDV)7^ju{#ow+g6YEOf^zT1;8RC7{{*WLl|=zlb$RzZ_0qncqr-f{X+5*ig32C z6(6Hokn}PM?oa0tH-lRE1?S+2@=gpdnNJKZ(eP9phQ1AFV9gT3@?9l*1^IaYSx5fY zO=sfxdW6!QBepSoD#oyL4Lbf6z;G8Iy*|aL^>QUMC3QF#LxW&u3Ho|iXw)*s`Kt|x zxJ9$s&?-a@zY5*C_9*MDK!UCtG-o`rRcWG=q2zje9=%91yKW)XVfW!wp~=E_($T{-%3JbxX9Q>#}jsj zEpK)ehNk_uJ&|BxeF-?*6y@z_XUi?B+aWr4S{5793E{~W2zBLDudtcy7SiAu*bV;V zW0~HJMN|1E$o5S4 zMyUxAmKm_}WKi_@xx{(O37zVENUHJ>e`6M@oCpK+Xet!O{-TaXOUaJNPY5XdM1(87 zP_!->qQYp*3&_IwwMQh1ip23xN>ujP5#;~<9v0Ib9$h3u!dngr<`$z!Sp#|rVknsl z!FtpJcSad#+uA8qZbfyo+n-)bU;uPkM2A(UfEf%26EeQ?ZeB{>b zNCYwOLfGbw$A3m(LV6npQQKe*KFRXYBdkGdlKRJSlF2Nfa`Nio#9t`y*PKCq=A^>I zzZ%;2{Snuhk2wDta!)%46&|PEA64^E_&2auF=)Ww^D`0$#%Ja9=$G_cTu+R2K#LHXG>tB zUyB=zE?C_hC0#F=uxaOlH=RY|!@>jqBgA!c43Vd%Vg9T>*d5m;k&|YaI#)(qvi+dw zbrx^OLm|ECNVtY&xTCclT1yA8pD{!(&;N-msC57lW)P?TPMF-!$2)cuxVv~b-Q+^l zL?}Wi>ox3jHc3fB`~qyzYo%VPtcUYs9x_B1 o;Qg=)oH%tdY*vQh-+zMU^qvHL>4NEq07IEx$YB=anXdr<0ac`U_5c6? literal 0 HcmV?d00001 diff --git a/projects/radio-show/audio-processor/voice-profiles/tom/embedding_0033.npy b/projects/radio-show/audio-processor/voice-profiles/tom/embedding_0033.npy new file mode 100644 index 0000000000000000000000000000000000000000..e8045bee33d65967d0b4a69daa41c6f02c46eb63 GIT binary patch literal 2176 zcmbW1`9Bqi9)?Ne)=+8HVyPr;LI?+$ilPnGT$&My{`Ne-KA+EVoGPr~i3V2RARL@7~MB!Nci0Z_?J#+^V)!DNyPE-u$PUA<)@( z9rZz-c;NO{-`Pr0knGyR7#`k1uj9fn)cKBD6>DKHpAL1tkWsZ(lN`NRlxX-ArL(C> zoRq@NtOz_WwB7uVGP7A6~SZpfZFE6toCU zEr~cy1z4ec7yt3E!xE;JAj-T4Rz*)BVn!h$C>rw=*pRWifp;2Z$X5x4_)s%R7nwme zfRCl_dr0wBGDf@DnE5k;j0ZQtKQxiS4X_r7t#O0A!!k0>&V$Z{QuJS|g{NCKRGfHF z=K9g@h=&Z%xpg@AxCyzjj|i4?N5N&u!zRhS(xp9 z28~{hL5IFFJlyW1Fa8mu(JmM>JT}?bOQT!+3rxS1@wo-5;KkP=&CdaDX69)6(*#y; zo#8##4*T|}Q;S75u0|F@w(?hGwqHZIOb$dEmvC=c4_>c6DzNZXpo_2O3M9_og75oW zyqOmO*@dn2)z1R0#$q(1l!^>9F^W*D#jiXCMo*FmOM1hxXXX~vrv><+rzJ4f3xh(= zEzCx75gpAz-^xLQ`Hzn=Hf+sBEblUyRRid~0c4y=MA=Ce*6oj?*_cLRwDI6}sm zbr(WoiojpXr7`9QSl%yy%idtr&Xb}5BRPEJg~3;gkL@T&)8}GzTNi@ezgVzRvI*yS zlaO84!KgFJMtDv=lvK)KcpwAvHe9Hi1Y^ODerS&G!AuG;)R+b%$6Q>$`3NkD8Yt(c z!6ba`}}W4@s;1O49j;hA<+VAEU;*4r9f@5sS(oni{UCB*6#`e@ebfrb1d%yLTM zxI@CAZ$OupZd*%IPKmI35f8BjS&HACfas}m3~bm)b`?aNInh*dKtvlvX;AS^N0>jG zKIyV>JgSeBb7GK^m5vD)CgwJ(SHThT6&vWm6(0zju<^7bSk9ar5ztR`$lN9#)!d*BYF62Rg3=~6Qfrp zb(DKM6j#HOV6B~osA?uA%-zWSsx}-}X27SU2?@V^#Ru8Tm@PX*Pu_<>GJ}Q9>|g}9 z1yF=cJ2Y1LfxWRG8ecPs9Ue&wBDbP4;3VZIj-h1oA#Ce^#<3-NXnFY>9qvhx@)RPy z*dE@Z5S$jb!Oc@WV7U*WvE3ejXD2~%bOBuqNJiFmr z-;o0IuhX!;;z~a>?lCT)(i5~vH$y%! z7|hrS{%`A(P!%|ZuKArXl`Ep6kw0K^-4~zF2I1>;0`Azh@{OiW80rPhH!7R}Z)v47GJ>#Hz1snX^1j|qH;DiHCIv4S5 zc^>qq^w9tPyAPhYfQe7LC|W!cYC>ypXMHg?@CGyPPIz*uoI2OmVt;%+KHqD_0eiwB z2{K6eU5ko;YDA*FJ9)HnF|934tEOGRtZc-zLn3s_*Ex{A%Q1rQDt;UCk$vIPJD literal 0 HcmV?d00001 diff --git a/projects/radio-show/audio-processor/voice-profiles/tom/embedding_0034.npy b/projects/radio-show/audio-processor/voice-profiles/tom/embedding_0034.npy new file mode 100644 index 0000000000000000000000000000000000000000..503e9b2f047563e8c7a7181a5d0900a5296eea9f GIT binary patch literal 2176 zcmbV~`9IY81IJlfDaS*S(pF;3B&=52Fdux;NsU6|TBOzyBbBS79AiY(kQq0*awJ!c z9P@flZNxV`97#gQY_@C5V@m1JvETMz_`ZI7K7V@t@XBWG*}2P8UM^ZLmhpQ)#Qq}; zD_sT^XwER!Wdw#Fi9F(e&@cSR?*ae%E&iN{fbTvc*#A(#cV4sM7c*l+W8D+F|MwPX z`G^p|H5OOjH-dF;5Iw%W5?-k?Rs4t!?->D#U#gQ;k8%;|CP1LGFLmo5JF0AL0+G&6 zp#MTScI^HvRvvSLYOjDgZfb|(Kg(fq-W`6!nb0{PgWS=Z_-1z)&p#)^$*2PL_I9AE zIK=v0BiaU%FkRP*lrtr0lQqLbjUkzCyagBi4#4iV*v8)&OOhJ!%XKdHt;<7Y%~o)Q z9c1#M1q4rS;-~dI($JFxr2|6fDT#<>jyky;F+o-AHIbBAa53lj2DVSmVO~}ddb>)& zT~>gOzH~f_4L1r%gj{P9+_HLy5XVl52t$Z?lgGbbt=n%DyE)a}4 zbr>xyK#k5-grq(YPpg(uTF%voPJ0ISr!*|Mc8dHN;(LEEXx*Jm^ekzh7qgL**@&RoB2=v}#jNlwE|*b~ zw_gvF4*`W#q+&n9u3f53n}D1rDz8S#|XLij2c`)EyI?MX+N z-f28=|Cu^jYzO^gX~?nU5nJnLgn1_q9>)pT2c4lPX-Ba$2L+?uaHzaWzWNMO7P3Z2 z$IsvzClw>%XTcx8BA!1l8#42=2zi@}PD51^Y-~a$uq9TTv$aTD6Cp|?HR!8R2Nk@5 zx!OvE^)Y;KC(97rP>sb_?}*g)2g!2I7}$H3GDo{cp=Ym-E>DS-vivmRgli(Px*K=< zq;MP#gu{VWvVq?Olffd~J^Bw?#Ia=a`SVDeiNcc=brj2x2OC>1EGjNRqpKWW-&7H; zE76lOcjHRhA2qfI#NlnuW!cWC>{k^B15sCdrDcKz*CrNJw*`n>~Do$Miu zKsN5|je((T9;G>#j;AN2`zaG2~z0f+?+|x$G zvx|_+e}*e7o>DTKX6Owo5)Mm)nlWs_q~--MR$Ako86B>LNhmkZ#fxQCK!!b&Ir9Ct zNtd8HHI90HMM;Pt8AZGkh-YMAS#ty)WXX{oUf-K*D{*zf9fYSClHPPS9zO3U`@I98 zF<*pODF;$IkEE*A;>K^=kfl2czfU71b~BrNyXk}WT{no$HVGbFDF)5d13RZu;M0{s zn7u+srB_gQ%m8YiBhlfy9G`v$WG%p~k};NEK8*N=FG$gfMx(|t>W>|U5}WOZv9I$8 zG{ziZl+j6MBhKJPbt|Uy*yQ^5h2)1?6%0r1Lb}%}$g~+mzOM;Wp?QQ&YXFT^io$#G zL~r>wMCt}(c$fv^Q3K8Ej<5_8k02t{jmm7U0xPkk#oe zII;FJ{%d3p>UIW7?UKN18N{}RaV!ngBXXM>VXC+h;jUKLV#u5~5`4qZg^${dQ8C&CAnGHPhV0_OR#P+n98!}}HZQE?v%gYxjBkt%t7 zD+30s7|dBGqKI=6JgoxI-MCnG`5ofeVW1U8L9}N-ymhP4V-^nCxQGm=7NGuK7rw4Z z#jpD-k-1n2T;tPJrdtMPcq=F++BMwRphIRSX}CGR8zm~~7*I&VL`g1Iukn(6;qh@Q z*p&pH3Pq^qPG+3)L#m%<28S(ysCGGs%ufxJZh9gyaWui^fEZ>_jVBc7$!L9h5eliL k817R*kzO;L{nui*&ufGPjU#9-4~JFOVOe1|4D`$KKP-iLPXGV_ literal 0 HcmV?d00001 diff --git a/projects/radio-show/audio-processor/voice-profiles/tom/embedding_0035.npy b/projects/radio-show/audio-processor/voice-profiles/tom/embedding_0035.npy new file mode 100644 index 0000000000000000000000000000000000000000..371a3545a5ccec6b63fd617bfadb8843dffae1e4 GIT binary patch literal 2176 zcmbW2`#;oq1I4GPG_|r_B)hq#RHi&8k(sX$E2-3mtjJ(Yi9+KtxlED!Xk5o_a!Eak znx3c#b3W6JHe2MjU63c+MHgzasid-=f8ja5o%b*2bzZOYdYxQnx2@YfrqCj3F-HEp zFfQMSrDsI#F*9Q58SM$-hx2`dIU#(1-v79R@BT2}Bo7Pl4dqSx$$q2B*3 zdYLjGk#-x=KeYt>ifH*n)>=hXjfBPI{M6_;^8mb{LHw3ypkF^2Nm>ci(ht8--I2wF z_q7pIRtR9=`9`kYFb{o_Dk^{aTI^FE#Zo>K=YHTL#o!K9AD+bm2^U#bdvWcS7_2;F z6q?T^ZYzu}GyH*S8i>wyqCYs=6m}d9n|;&J~p>6(oJxztFwUpENs*DDLTls2awL}*Lr0ma$Sl+) zG?k5tQDq2vz6PQ~T@!5Er(|KaD#}NDaCcf12Ikkm`oE>H;i(hzX%%Sv{Woxeqv5?-X=|Sd;6k$0*J%J1C43!3>c?VgD-(f_bo~@`=@0 zD`}P%fxke6woRq@xhfliK67FpEyA3MWUTx(5M#HB31^NPq+`ZdQIQQ+Z9GcvC1Hdd zLboGZand(|ocX(+igKPw3`gTpMoYu8yaWs`O~)=-Jm!YF5bHJxd^)sY>LtU=m(E~# z-Iph^a=|(MTHZyEz~QgOn94Fn(v@sz&(_2H;ni~6lc|(jz!B_oze(P?OVNGU3r}2f z@b0re(tESzMyl(mcfQ6bpWH*COia9K9|?Cn4*l#Rw12Y1hE^H4atpW|tbkC^Ph37X zQhXB!a$&I$*J?d*#KINbf%hmw{aEm*Bt)AxfoAy%1D*j59Tgr_hst~OKS?0=ehKip z{!l)bA!B`-A;M6d2gYl?aKb^1@Odrde7>q8;+PB@>ayXKRENJ}d5v3VzMupmB?+og z$|d!c_+#a5Y^$|LWy@od^CAm-xUu-Rv0bTn9c2-p*^N9!^Vn-@Bltyk`SxXM49!AQL2{i6@AV9`|o%(JRey^auFmDrY ztzleEdq7P5t+8h`0Eaq5sZ+B9Ag_B(vP`*HSM!1$sOo?ls`qg9d<5Lrp1~rYO43r` z54y?|`OH=^0_aDf8Z9b%6q+s$z~ zE&*B#eQ?@;v!Z!$CzP!h(QUba*nHc8p1)=Acx8k)kECRDIDwS4$B~1tGKpF<-Kz0* zK5X1*3dfbL=yuoxz1k3{xEmmlwI9DVFD6xnLS%PrL7cr6tga_ge%sDM*F45c_}zUttxKZ(^2BiW5ToamHrngX%4OZ#;WQDC zHGP4EmS#-VEE1xiyZ}G?5D@tXqB+X~TWhT`ML!<%?s-7ecmdK?z2H{Fp}nmhj73W9 z95P2|bv0@G%0ttaVq9sl!kDWM`A=FV-fGT9!_R>0@fM=xlt@aet-(xgBo8$6aH%97 z7DgUObK8we1yQ7_ph+KBC*KluU1DBB6R|nsX6PU}$#`(RP*rvAzP65$4 z;MpK=&Ge-{p9&%K4Sb<(StIYA{4M&qSS<570j1}BYJFlMAZw?dWT_!$kOfE0R2WD`Vx+p0t4mBEuRD5tYro3Sit8X(=y{ir%EZney zDZs7pR5Vy_Q_%TBjMSG9-DnD*BU>ri)eY3c>Yu=Z6RMboB>m%MYObXdF&t3C?8p+T wTE`MzN&$Mr8HiF9qr@qiJ(rb%LG~PUd3V88-hkC*DTpyxhVvGQNZ{n)AB!DvbN~PV literal 0 HcmV?d00001 diff --git a/projects/radio-show/audio-processor/voice-profiles/tom/embedding_0036.npy b/projects/radio-show/audio-processor/voice-profiles/tom/embedding_0036.npy new file mode 100644 index 0000000000000000000000000000000000000000..e24e45c608d52c372d6c243df34e114dc7c4e29e GIT binary patch literal 2176 zcmbVN`8(D78r>+7lOaX3DR#*vGPU=2Cqi*Dr&NYyh>Eav=pe&IHf_q#CPTJahEv>* zve#$ps5D4rx-v_3I>n(;DZ_F9h5P>YuIE|LdfsQPXT2G=&NlW3MQFd!BIw>eY_AYH zLzzzb>eIE9>At5zLPIH=%fiiwXsFp_F#BgkS@!%yLi^AP zzvdKlIlK^ftyF_9=Oq=%+YX~QVfavQ0_L`OOgcRWBknrB4|w6agBz;HFC(C0Eha6^ ziO$u0FjP2r-Jc8D&MdS{@-Z*AQaE8$jVpQCI53n?t-qp;vxj+Le*Xn~*Qep(ePa}8 zOpxXk(#Su46XF_@r0maKC{aC*y0j)zZ1o;_>s(muts26{LN^S)(<7}e|HdgNE)KiK zpt~- z^lx%&aS1q?<-K(MK_KbvL`bKEAjuUI42oi!OAiHqSA-(|HchtZzA&{6kS3<4#7~D0JQQ8(q zwW~-AMJ)=@o_C%|y=9}XE(+ykD+pd+hnxe0+DJQqYxS{+NGpI&*IvBn@`cNlO7g?? zA!!=RN88b7ut+F@!Tt+qn~){y;pwQnpMe>sCshA9LHhi@3V2i7&{|f2bI$`&i)3WG z$Kupmec_#nR1!Yl!t~vnjhCTk(O^)5e*Ji?mdHk#AQrwhCWIbT45OQdD5X{6rzb98 zz?Si7Zy~%}vQQ%%g*7sHP_I$MvL{7w_uaCPOLMGZv{On{A}VHTh~vi^xOGS1)98YR zW)NnKPcSWGrkQK2Hb6Dq3kg=y1O?sX$6PAR%qo#wwF9w%*P#D_iTV|_7#k@jPrpr3 zBlBvcZ1yyQrM(dz%ElpQE+cMj8mfbXu%*F5-LEp?r7kP)W-nt%_$$T_kAgLOj?{fjgmtzHTwZol*2R8MFCG=tCg;QF zOe&^3YRRN)I_bGOOln=~nTGZDNLG#~L5A9}7^nqvew^6Kg%IbqM&!s}z~klBWaMuS zl(sQ3-C7B8`6}H0Pa0UGvaGrCWyFSg3#VH+u!Ws~yK@MVb9*pX;*HGJ52?g6?Ib2D zg1DM|%MY`Dm*L>DV=n?Hm8gFAT(FiGL8*QfX6!o!=5i+yo5?{$ zh&++D5@+7v#9>3gRSZy%V3V;(n5*aj!Ee?u^f-?-pN}H(UMaKLX(`D)k%s>+YQVSK zQiK&`2uW@{QIm4O_KGZIta5>dvn|P~NyUh+JSI(r;Ae^mhn@ux*UN^esT(2ZKGwo) z$$6|aKL$6E6hz)jBa&gsxIMr}v4;#Y?>NKjKy`==^E2_Qng03N4@-ZvhSKGWae0AcOD0u;(ll>T9OMrYQ)Mi!EVA zk3-enbVy1mptqx&q}N@7_f8(5Xp9XmP6$f~g%hn2^!qJ9&yb+LD;I0>R1vz5!r+f2 z)a7l4+?*6E>1`rO{woUWx~34R9D>JIaq!q(2AXKBz?5AGN<@L8YbfLBs{MGUnG0*n z4Cp8rLMJW_W=TVES{w>Znl;Aij=|O_7Nyf%M4sc~d&3)u7Mfw7_%Q^RIw3mX3f{%a zkY2}9vbZA;b`qsf-900?&E&##sslzN+N?;m05tDtpbBkEpfkLYjODGyu8|uE4s}EJ z%_z`*=Rq&aUHEb#_aW;d$$;5rbeb(?*}pEMwBprZD`$ld;aY@~wuV)!okGfwY=Bw| z8xG?~@ayvksBGe)(jpxVqt;aY5guq*hP*=~(ED-^MLMxKeRngGRFWX!n1z1;QKD@f literal 0 HcmV?d00001 diff --git a/projects/radio-show/audio-processor/voice-profiles/tom/embedding_0037.npy b/projects/radio-show/audio-processor/voice-profiles/tom/embedding_0037.npy new file mode 100644 index 0000000000000000000000000000000000000000..a464bf76e3ddf2a2d6b0dfb9c79f8451ae39bdb0 GIT binary patch literal 2176 zcmbV~`#;qA0*AAtrU+ZH-IdF@mfN&#^PMGhv5I6vCOK{yms~~>shLU`!??y2Np;2y zCkm1JzCW{iMRMDeElEZ9Q%RA?YTNDn3+MUm{rvWRy`Frx?OV3)P?;7#?Eo`4Brb^0 zT&vHdcH1#6^qIS(`Fr^RQU1~V;E@0M4FQpHA>Vu)FCZr5+csfY+gO-d=pWSoznQi3 zeGwQdTrtv64z|sKd6T0Xn81&|2?}fJM%zzvfIHWVsR7eqD~1P+iF_Tm?_H9_WSb$H3ieJg!NB zOKdnEu#ZE%KA9voby9(@3HV{xJ@{u=klH*sB0TkwQR#-vXDLv(l3}xYC%*GY!ujAv zQtDld{tf{iyJ#T3Lw#1_KbO;*vMHkO zvyh0lR1?jG+raoqfR{QfXeaby=teI)H|$?v>SRI9@B(U+O>uU_0YwjM$lJo(Bx0%* zZEpI6zqbsov-jbJV+heyE5?Ni3F2uUT&JHQ8aB7+PpVufnhPM}C~sl(R8ELhGdhCz)9gzw96)9eIEqcW*JM=^2U zz6WYeaqu?gBBJe2+Nmc8j*?Jx?^uN>6?Jl8o+hn1@`;Lx|BhHobIDrEOmr?%gVsnC z)#D;WpI$i3n<5Zoat;OOrYS{x#)yE?4(o}TuyRnKtMw($mJ{mIS{3Cir%8HSb2-AU zcfd1#GfvbDlDkF4=*~*RO6_}y$X`a}FP7m}btrPDE>it7;t@ML42@5!@bmU8IJRXG zhtfPUU;7q0^Q9KOyS*?zOG5VTH$?JO5r$b0$zfSNG0s=u*3}dgeqT*K@-rZH_yGq8 zWMG^<1x8B>K8%i1Po}F7mBxNJ=w#r|8xhpny6}SQf`W)-WM!pNpBoBE#aljM>a~#h zy>3`A7KsJ)8u*qbgFB!k^jjC`x<^qjlk9Lf@gBOD@o95fn9;e(85u}t-?CocPb~dDGmnRjbITT2+vs?pfGb) z>Z(Rz^!XL+eqD#u0t!dpH9@7o4P`Oq#5sXS1WOK+wGk^xy+B6Ao<0THANAx$;vG~C z*+aN73kOd7;_|svkT*SONK3)@x4p1`$Qy!*M(U)j1y7lcaJ~_bR(2NzL+uFVF2!m~ zF%CUrVNTGmoaaHOvHtQs^q`McYfneerBh&;S)r_ZlCF#lM%3N}xNB&V&X!EJq(y{_ zu?6Vlw4;6LE3$sE8}66*z{Y$(R$bVE|C-9#f+w$VaouqYKWxEYH#d@@&w5}6q!5c< ze=O+|<9B8hGG-@`O@1M0Sy1;?AoM6O7jet z6mUf_JD5YaB_DyEY6jMPtwK{#A0&r_pqE~t;tuIRRkRHuJp~w5mq65Kf>PguU=|)B z`?u_Xy+I6AGh#6$kAZ@j59_x)@Qt<-?%&Q>`jP|VIi4ux%3=QV5VTVJh}E+KEV8M> z+nI}@l6V3GtQdM+uF5%}NXNTl22|$OO8liTB(b4J=xM$JjeW;4nV$-~X(Ftf5vT0z z6Jpfdhs5Wy;o=HPr$KpDM~i~b8FyH^+F^vgLbX|KBi_gQ=n}hjr2V}aLAG(In#@Gq nigTFHe@cIKN{9OA6_}B68>YE8AS_8kG0PlUR+0EKAP@fl7)5Sx literal 0 HcmV?d00001 diff --git a/projects/radio-show/audio-processor/voice-profiles/tom/embedding_0038.npy b/projects/radio-show/audio-processor/voice-profiles/tom/embedding_0038.npy new file mode 100644 index 0000000000000000000000000000000000000000..c490a174874aed7c3129820a6422b916f4085520 GIT binary patch literal 2176 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 literal 0 HcmV?d00001 diff --git a/projects/radio-show/audio-processor/voice-profiles/tom/embedding_0043.npy b/projects/radio-show/audio-processor/voice-profiles/tom/embedding_0043.npy new file mode 100644 index 0000000000000000000000000000000000000000..534662fa50f7bbcfedce91690b03704b6c6b39ce GIT binary patch literal 2176 zcmbW2`#;oq1H~!1MRa+3)riHqM5R(x=8GiP#ZVNR(hySam$67$c4l&$W`-GtP;v=P zDkYionW9`)r7gP1W0Rh&)XGK|UG`bezwn&j&iVD6^LiI}`FVN=C@QcN(o7G8CWOSB z+UT27VH-_X>zjtf#3#lxql04N4}|_NcV_ zw2LrV6^iVpas($Gpl8%>mQU!IP|ivbU??S_M|mZox;dCxk%M0FaaFAmW7qAG_h|s3 z-c>k#<`+!%7a{X(E)JzjFn{JddBfEPm`0q%*6#~tZ9#@mj;_G;8aBcNBIvE4VDjz~ zq1R8!GT&T;on--033fxCtpH)n`{dS8EQVDyZOt{DI%49IV6qq+CktSSs~ORfHy^m6X+k7=+zxCPu02aOQ?y>pGogs=sY6BNAz$s@83`jh=O}U3zm;dv69_@^d32sGgwG}T8*~#1$eki zTmE7T7cu@-giTL{SwJSbls01*)0jNf8KA;@6Y-&?6c_&}L7OWR(j5m8)U=b_FnCSU zc2|INv>x7$wMh7zi!NOnne;k~Q4=;=zcJypE1Os!F+}~R)u8RK!n3J-6gL)wX2{3e zulDj~91o)S2cJ@-E`X88Mg&y`ntwKy{w0Kfl?}!x2jV+^8hb`m5t>+qYJD%z!-{2T z3u^FiuuI0a;2>_F6qWz7hMJ%j-Mdyn?fLiA!Qfw8qwOW&Xf%@(l`YWxjf0|7eCWxK zV%riLx!V~m`?59=o-!5!a_oudie!{BHj+%A`6sj$7D$+ z?MU77I~K6~Fn@fAr0gxj6oU&^`AckE~(W-{6rx_ zA9oQ8fhEzoH9{^I1ftW!6+zPuS2RnZq zp3EtMp_3Gz+NF?|WXqyun#A|K2Wc5Qj{c#P)`5)Y;J^1m1~(F7i6*swy_i(+6v=hB zak7TV#Ezi|EGm?dj@)JeCZ-83dsfocwm(c(rl^`(NdL+^PS))VM4a<36j)}%z%dF2 zn*-&^Vg8V1x8srY8GN$#;Bfja>{D>hd>T z)99af1kqcBP%m`G@azWdV!1?jG9B-@Kj8;oPXvEg}If5t&NiaTH;^)P-a~2sN78S|fVa6TSV>$gD~iKnO>0tl$=c@3ixeCP?1kAeP4ZQ24U5Q| zv#J$Z9($Om7d*u?`=ZlcICIV%z zQ}LfY8Bo|LK!@9DnD3_RY!iz z;eiDAQF+e9$GElNYLsGc;wG5sodDIVDF5iiL8U(rU8jG-(BeGgl<~09 zb3N9o)DU$^*(^6Ch#NEp#6o)eq1leoTd+f~8GRy6;?pwwiCz`4MtGcnC#;Njx~==X?)K*~XsGy;1={=!#BC+I#6hDM(^7ArMlt4B350_V!R zxtFoRR|@sCCYeQZHnzAg#iaHxTarTZFu_X3;DU0{?#=S<^Fm1G)56+}5@O6`q5;83OzR*UDv0 literal 0 HcmV?d00001 diff --git a/projects/radio-show/session-logs/2026-04-27-qa-extraction-cohost-indexing.md b/projects/radio-show/session-logs/2026-04-27-qa-extraction-cohost-indexing.md new file mode 100644 index 0000000..69d0d00 --- /dev/null +++ b/projects/radio-show/session-logs/2026-04-27-qa-extraction-cohost-indexing.md @@ -0,0 +1,251 @@ +# Session Log: Q&A Extraction — Co-Host Profile + Archive Indexing +**Date:** 2026-04-27 +**Project:** Radio Show Archive Mining — Computer Guru Show + +--- + +## User +- **User:** Mike Swanson (mike) +- **Machine:** DESKTOP-0O8A1RL +- **Role:** admin + +--- + +## Session Summary + +The session began with resuming work following a benchmark run that demonstrated a significant performance improvement in Whisper transcription, achieving 63.8x real-time speed with batched inference and int8_float16 settings. Next, the focus shifted to evaluating the quality of Q&A extraction across six test episodes, revealing a critical issue with false positives due to co-host Tom being mislabeled as CALLER based on a voice similarity threshold. + +A co-host voice profile for Tom was constructed using 44 embeddings from two specific episodes (2014-s6e19 and 2016-s8e43), producing a cosine similarity of 0.698 against Mike — well below Mike's 0.85 threshold, giving clean separation. Code was updated in `voice_profiler.py` and `diarizer.py` to correctly emit "Cohost: Tom" labels and map them to a new "CO-HOST" speaker tag. Re-diarizing the two co-host-era episodes dramatically cleaned up Q&A results: 2016 went from 12 false positives to 2 real WiFi caller pairs. + +Several bugs in `qa_extractor.py` were fixed: overlap resolution for sliding-window diarization boundaries, CALLER-preference threshold for long batch transcript segments, and a turn-based caller-intro lookback to replace an ineffective 120s time window. Phone-greeting detection and new promo signatures were added. The final Q&A count landed at 10 pairs across 6 episodes, with 2014 correctly yielding 0 (gaming co-host episode with no actual callers). + +`archive.db` was created with the ArchiveIndex schema (episodes, segments, segments_fts, qa_pairs, qa_fts). All 6 test episodes were indexed: 762 segments, 10 Q&A pairs. FTS5 search verified working for "router", "Windows 10", "Internet Explorer", "antivirus", and "connect" queries. + +--- + +## Key Decisions + +- **Co-host threshold uses same 0.85 bar as host**: Tom scores 0.698 vs Mike. Any voice >= 0.85 against Tom's composite gets labeled CO-HOST. Keeps the same single threshold for all profiles rather than per-profile thresholds. +- **Turn-based lookback for caller-intro (2 HOST turns, not 120s)**: Long HOST monologue blocks (8-10 min) in big show segments meant time-based lookback missed the caller introduction. Previous 2 HOST turns always catches it regardless of block length. +- **CALLER-preference at 4s minimum overlap**: Batch transcription produces ~26s segments; diarization CALLER windows are ~10s. Pure majority-vote always gave HOST. 4s minimum CALLER coverage labels the segment CALLER without being overly aggressive for co-host episodes. +- **Midpoint boundary resolution at load time**: Rather than re-diarizing everything, the sliding-window overlap is resolved in `load_diarized_transcript()` so it applies retroactively to all saved diarization files without touching the JSON. +- **751-1041 added as promo signal**: Earlier Tucson show number (vs 790-2040 in later seasons). Weighted 1 (needs a second semi-generic signal to filter). +- **Tom's windows sourced from first 60 min of co-host episodes**: Real callers don't call in during the first hour of a 2-hour show (only exceptions: very end of show). First-hour CALLER windows are safely all Tom. + +--- + +## Problems Encountered + +- **2016-s8e43 had 12 Q&A pairs, 11 false positives**: Root cause was Tom (co-host) labeled CALLER throughout. Fixed by building Tom's voice profile and re-diarizing. +- **2014-s6e19 had 2 Q&A pairs from gaming discussion**: Same co-host issue. After re-diarization: 0 pairs (correct — no actual callers in that gaming special). +- **2012-03-10 yielded 0 segments labeled CALLER**: Midpoint assignment hit HOST turns (HOST 0-20s and CALLER 15-30s — midpoint 15.1s falls in HOST). Fixed by overlap-preference assignment with 4s CALLER minimum. +- **Real WiFi caller (2016, ~4794s) was missing after first fix attempt**: Aggressive time-based lookback (120s) combined with short CALLER turns from sliding-window diarization caused the caller question to land in a HOST segment. Fixed by turn-based lookback + co-host profile (eliminated Tom noise, letting real caller windows survive). +- **2012-Jun pair at 1325s was a promo**: "The Computer Guru. We'll get your problem solved. Call 751-1041 today" passed promo filter. Fixed by adding 751-1041 and "we'll get your problem solved" as promo signatures. + +--- + +## Files Created / Modified + +### New files +``` +projects/radio-show/audio-processor/build_cohost_profile.py +projects/radio-show/audio-processor/index_test_episodes.py +projects/radio-show/audio-processor/archive.db +projects/radio-show/audio-processor/voice-profiles/tom/ +projects/radio-show/audio-processor/voice-profiles/profiles.json (updated: Tom added) +projects/radio-show/session-logs/2026-04-27-qa-extraction-cohost-indexing.md (this file) +``` + +### Modified +``` +src/voice_profiler.py — emit "Cohost: " label for cohost role +src/diarizer.py — map "Cohost:" prefix to "CO-HOST" speaker +src/qa_extractor.py — overlap resolution, CALLER-preference, turn-based + caller-intro lookback, _preceded_by_caller_intro(), + _PHONE_GREETING, 751-1041 + promo sig additions +test-data/transcripts/2014-s6e19/diarization.json (re-diarized with Tom profile) +test-data/transcripts/2016-s8e43/diarization.json (re-diarized with Tom profile) +``` + +--- + +## Benchmark Results (from previous run — baseline for BEAST comparison) + +**Machine:** DESKTOP-0O8A1RL — NVIDIA GeForce RTX 5070 Ti Laptop GPU + +| Episode | Audio | Wall (diarize) | RTF | +|---------|-------|----------------|-----| +| 2011-03-12-hr1 | 2509s | 15.1s | 166.1x | +| 2012-03-10-hr1 | 2634s | 12.2s | 215.5x | +| 2012-06-09-hr1 | 2648s | 12.2s | 216.8x | +| 2014-s6e19 | 2914s | 13.4s | 216.9x | +| 2016-s8e43 | 5326s | 24.2s | 219.6x | +| 2017-s9e30 | 5343s | 24.7s | 216.4x | +| **TOTAL** | **21374s** | **101.9s** | **209.7x** | + +Transcription (batched Whisper large-v3): 63.8x realtime +Diarization: 209.7x realtime +vs DESKTOP-0O8A1RL baseline (149.5x): **+60.2x (+40.3%)** + +--- + +## Archive DB State + +**Path:** `projects/radio-show/audio-processor/archive.db` + +``` +Episodes : 6 +Segments : 762 +Q&A pairs: 10 +``` + +**Q&A pairs by episode:** +| Episode | Pairs | Notes | +|---------|-------|-------| +| 2011-03-12-hr1 | 3 | IE lockout call, cloud computing, ghost hunting caller | +| 2012-03-10-hr1 | 1 | iPad 3 discussion | +| 2012-06-09-hr1 | 1 | Windows repair feature call | +| 2014-s6e19 | 0 | Gaming co-host special — no actual callers | +| 2016-s8e43 | 2 | WiFi connectivity caller (2 turns of same call) | +| 2017-s9e30 | 3 | Software control, Cat5 cabling (Charlie), WiFi ports | + +--- + +## Voice Profiles State + +**Path:** `projects/radio-show/audio-processor/voice-profiles/` + +| Name | Role | Embeddings | Source Episodes | +|------|------|-----------|-----------------| +| Mike Swanson | host | 180 | 9 episodes (2010-2018) | +| Tom | cohost | 44 | 2014-s6e19, 2016-s8e43 | + +Tom vs Mike cosine similarity: **0.698** (well-separated at 0.85 threshold) + +**Tom's source windows used:** +- 2014-s6e19: 195-260s, 320-425s, 600-650s, 675-710s +- 2016-s8e43: 100-115s, 135-160s, 270-295s, 575-605s, 1185-1235s, 1790-1870s, 2020-2055s + +--- + +## Co-Host Era Notes + +Tom was the regular in-studio co-host/board-op roughly 2013-2016. His voice is in episodes from at least 2014 through 2016 (confirmed from test set). The 2011 and 2012 episodes are pure call-in format with no co-host. + +If there are occasional guest co-hosts or fill-in hosts in other years, they would still be labeled CALLER until profiled. These would be rare and would likely not form question patterns that survive the caller-intro gate. + +--- + +## Pending Tasks for BEAST (GURU-BEAST-ROG) + +### 1. Run benchmark.py to establish RTX 4090 baseline + +```bash +cd D:/claudetools/projects/radio-show/audio-processor +.venv/Scripts/python benchmark.py 2>&1 | tee bench-4090.txt +``` + +BENCH_SETUP.md has all setup steps. The voice profiles are in `voice-profiles/` (already copied or available via Tailscale/robocopy from DESKTOP-0O8A1RL). Test episodes go in `test-data/episodes/`. + +Expected: diarization RTF should be ~250-300x on RTX 4090 (vs 209.7x on laptop 5070 Ti). Transcription should be ~70-80x. + +Update `benchmark.py` line 27 after measuring: +```python +BASELINE_RTF = 209.7 # current laptop 5070 Ti baseline +``` + +### 2. Download full archive from IX server (172.16.3.10) + +Use paramiko (SSH with key agent disabled): +```python +import paramiko +ssh = paramiko.SSHClient() +ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) +ssh.connect("172.16.3.10", username="gurushow", password="", + look_for_keys=False, allow_agent=False) +``` + +Archive path: `/home/gurushow/public_html/archive/Radio/` +Episode count: 579 MP3s across 2010-2018 (no 2013 season) +Approximate total size: ~30-40 GB + +Download script skeleton in prior session log: `2026-04-27-diarization-pipeline.md` + +**Tailscale required** — IX server is at 172.16.3.10, requires VPN. + +### 3. Full archive processing + +Once episodes are downloaded: + +```bash +# Transcribe + diarize all episodes +cd D:/claudetools/projects/radio-show/audio-processor +.venv/Scripts/python diarize_training.py # or a new batch_process_all.py + +# Index everything into archive.db +.venv/Scripts/python index_test_episodes.py # modify to point at full episodes dir +``` + +The pipeline is idempotent — `add_segments()` skips episodes already indexed. + +### 4. Verify co-host era episodes + +2013-2016 era episodes should now correctly separate Tom (CO-HOST) from actual callers. Spot-check a few 2015 episodes after processing to confirm Tom's profile generalizes well. + +If any 2015/2016 episodes show too many CALLER turns that are clearly Tom (voice changed slightly over years), re-run `build_cohost_profile.py` with windows from that episode added to TOM_WINDOWS dict. + +--- + +## Technical Reference + +### Key thresholds + +```python +host_match_threshold = 0.85 # WavLM cosine similarity — applied to ALL profiles +CALLER_MIN_S = 4.0 # min CALLER coverage in transcript segment to label CALLER +PROMO_SCORE_THRESHOLD = 2 # weighted promo signature score +MIN_QUESTION_DURATION = 5.0 # seconds +MIN_ANSWER_DURATION = 15.0 # seconds +MAX_GAP_BETWEEN_QA = 30.0 # seconds +``` + +### Diarization sliding window + +```python +window_s = 10.0 # 10s embedding windows +hop_s = 5.0 # 5s hop → overlapping boundaries (resolved at load time) +``` + +### Transcription (batch mode) + +```python +model_size = "large-v3" +compute_type = "int8_float16" +batch_size = 16 +# No word timestamps in batch mode (not needed for search/diarization) +``` + +### DB search examples + +```python +from src.indexer import ArchiveIndex +from pathlib import Path + +with ArchiveIndex(Path("archive.db")) as idx: + # Segment search + results = idx.search("router", limit=20) + results = idx.search("Windows 10", speaker_filter="HOST", limit=10) + + # Q&A search + qa = idx.search_qa("antivirus", limit=10) + qa = idx.search_qa("wifi connect", limit=10) +``` + +### Archive server + +``` +Host: 172.16.3.10 (requires Tailscale) +User: gurushow +Archive root: /home/gurushow/public_html/archive/Radio/ +SSH: paramiko with look_for_keys=False, allow_agent=False +```