2
---
47403 MiB, 83 %
---
69
---
  wrapped_fwd = torch.cuda.amp.custom_fwd(fwd, cast_inputs=cast_inputs)
INFO:speechbrain.utils.fetching:Fetch embedding_model.ckpt: Fetching from HuggingFace Hub 'yangwang825/ecapa-tdnn-vox2' if not cached
INFO:speechbrain.utils.fetching:Fetch classifier.ckpt: Fetching from HuggingFace Hub 'yangwang825/ecapa-tdnn-vox2' if not cached
INFO:speechbrain.utils.fetching:Fetch label_encoder.txt: Fetching from HuggingFace Hub 'yangwang825/ecapa-tdnn-vox2' if not cached
INFO:speechbrain.utils.parameter_transfer:Loading pretrained files for: embedding_model, classifier, label_encoder
/home/ubuntu/SoloSpeech/.venv/lib/python3.10/site-packages/speechbrain/utils/checkpoints.py:200: FutureWarning: You are using `torch.load` with `weights_only=False` (the current default value), which uses the default pickle module implicitly. It is possible to construct malicious pickle data which will execute arbitrary code during unpickling (See https://github.com/pytorch/pytorch/blob/main/SECURITY.md#untrusted-models for more details). In a future release, the default value for `weights_only` will be flipped to `True`. This limits the functions that could be executed during unpickling. Arbitrary objects will no longer be allowed to be loaded via this mode unless they are explicitly allowlisted by the user via `torch.serialization.add_safe_globals`. We recommend you start setting `weights_only=True` for any use case where you don't have full control of the loaded file. Please open an issue on GitHub for any issues related to this experimental feature.
  state_dict = torch.load(path, map_location=device)
[W409 13:06:48.030811793 NNPACK.cpp:61] Could not initialize NNPACK! Reason: Unsupported hardware.
[result-id: r31]


Bash

grep -c "extracted.wav" /tmp/batched_solo.log; echo ---; grep "extracted.wav" /tmp/batched_solo.log | tail -3; echo ---; grep -i "OOM\|error\|skipping" /tmp/batched_solo.log | tail -5

Better progress check


0
---
---


Build main speaker clean audio + reference

Concat clean main turns; pick longest as 10s ref

Clip 2:13-30:13 + convert to 16k mono wav

ffmpeg trim, mono, 16kHz for pyannote

Loose-cut overlap segments

Save each overlap region as separate wav

Run SoloSpeech on every overlap

Default quality, enroll = main_speaker_ref

Run pyannote precision-2 (exclusive=false)

Get diarization with overlap info preserved

Download YouTube audio (lossless as possible)

yt-dlp bestaudio, no re-encode


Updated task #18 status


Updated task #19 status


ls /home/ubuntu/main_speaker_pipeline/extracted/ | wc -l; echo ---; ls -la --time-style=+%H:%M:%S /home/ubuntu/main_speaker_pipeline/extracted/ | tail -3

Count + recent files


how much exactly overlapped audio


71
---
-rw-rw-r-- 1 ubuntu ubuntu 141868 13:17:34 overlap_0068_extracted.wav
-rw-rw-r-- 1 ubuntu ubuntu 128556 13:17:43 overlap_0069_extracted.wav
-rw-rw-r-- 1 ubuntu ubuntu 133676 13:17:52 overlap_0070_extracted.wav


**Running well — 71/156 done (45%).**

- GPU: 47 GiB / 83% util (active)
- Recent files written 9 sec apart per clip
- Latest: `overlap_0070_extracted.wav` at 13:17:52
- The print progress isn't reaching the log because Python buffers stdout when redirected — but disk-write progress is the truth

ETA: ~13 more min (85 clips × 9s ≈ 765s).


/home/ubuntu/SoloSpeech/.venv/bin/python -c "
import json
turns = json.load(open('diarization.json'))['output']['diarization']
turns.sort(key=lambda t: t['start'])

# TIGHT overlap: regions where 2+ speakers simultaneously active
tight = []
for i, a in enumerate(turns):
    for b in turns[i+1:]:
        if b['start'] >= a['end']: break
        if a['speaker'] == b['speaker']: continue
        s = max(a['start'], b['start'])
        e = min(a['end'], b['end'])
        if e > s: tight.append((s, e))
tight.sort()
mt = []
for s, e in tight:
    if mt and s <= mt[-1][1]:
        mt[-1] = (mt[-1][0], max(mt[-1][1], e))
    else:
        mt.append((s, e))
tight_total = sum(e-s for s,e in mt)

# LOOSE cut (what we extracted)
loose = []
for i, a in enumerate(turns):
    for b in turns[i+1:]:
        if b['start'] >= a['end']: break
        if a['speaker'] == b['speaker']: continue
        loose.append((min(a['start'], b['start']), max(a['end'], b['end'])))
loose.sort()
ml = []
for s, e in loose:
    if ml and s <= ml[-1][1]:
        ml[-1] = (ml[-1][0], max(ml[-1][1], e))
    else:
        ml.append((s, e))
loose_total = sum(e-s for s,e in ml)

print(f'Clip duration:        1680.0s (28:00)')
print(f'TIGHT overlap (true): {tight_total:.1f}s ({tight_total/60:.1f} min)  [{len(mt)} merged regions]')
print(f'LOOSE cut windows:    {loose_total:.1f}s ({loose_total/60:.1f} min)  [{len(ml)} merged regions]')
print(f'Tight as % of clip:   {100*tight_total/1680:.1f}%')
print(f'Loose as % of clip:   {100*loose_total/1680:.1f}%')
print()
# distribution of tight overlap durations
durs = sorted(e-s for s,e in mt)
print(f'Tight overlap region durations:')
print(f'  min={durs[0]:.2f}s  median={durs[len(durs)//2]:.2f}s  max={durs[-1]:.2f}s')
print(f'  >2s: {sum(1 for d in durs if d > 2)} regions')
print(f'  >5s: {sum(1 for d in durs if d > 5)} regions')
"

Compute exact overlap duration


Clip duration:        1680.0s (28:00)
TIGHT overlap (true): 59.3s (1.0 min)  [207 merged regions]
LOOSE cut windows:    617.9s (10.3 min)  [156 merged regions]
Tight as % of clip:   3.5%
Loose as % of clip:   36.8%

Tight overlap region durations:
  min=0.02s  median=0.28s  max=1.30s
  >2s: 0 regions
  >5s: 0 regions
[result-id: r32]


## Overlap stats — actual numbers

| Measure | Duration | % of clip | Regions |
|---|---|---|---|
| **TRUE overlap** (both speakers actually talking simultaneously) | **59.3s** (~1 min) | **3.5%** | 207 tiny ones |
| **LOOSE-cut windows** (what we extracted, full turn range) | **617.9s** (~10 min) | **36.8%** | 156 merged |

So actual simultaneous speech is **only ~1 minute** of the 28-minute clip — short interruptions, backchannels, mid-sentence overlaps:
- Median overlap region: **0.28s** (a quick "mhm" / "yeah")
- Max single overlap: **1.30s**
- **Zero** regions longer than 2s

The reason loose-cut windows balloon to 10 minutes: each tiny overlap pulls in the **entire turn** of both speakers around it. So a 0.3s overlap can drag a 5s + 4s = 9s window into the bucket. Loose-cut is what SoloSpeech needs (it requires context) — but it's an overestimate of "real" overlap.

**Implication for your dataset:** the overlap is light. After SoloSpeech finishes, you'll have ~10 minutes of "cleaned" main-speaker audio from the loose-cut regions, which combined with the 12 minutes of already-clean SPEAKER_00 gives **~22 minutes of usable main-speaker audio out of 28 minutes total**.


status


pgrep -af "batched_solospeech" | grep -v pgrep | wc -l; echo ---; ls /home/ubuntu/main_speaker_pipeline/extracted/ | wc -l; echo ---; ls -la --time-style=+%H:%M:%S /home/ubuntu/main_speaker_pipeline/extracted/ | tail -2; date

Batched run status


2
---
127
---
-rw-rw-r-- 1 ubuntu ubuntu 111148 13:26:39 overlap_0125_extracted.wav
-rw-rw-r-- 1 ubuntu ubuntu 177196 13:26:48 overlap_0126_extracted.wav
Thu Apr  9 01:26:55 PM UTC 2026


**127/156 done (81%).** Latest write 7s ago. ~29 clips left × ~9s/clip ≈ **4 more minutes**.


pgrep -af "batched_solospeech" | grep -v pgrep | wc -l; echo ---; ls /home/ubuntu/main_speaker_pipeline/extracted/ | wc -l; ls -la --time-style=+%H:%M:%S /home/ubuntu/main_speaker_pipeline/extracted/ | tail -2; date; echo ---; tail -3 /tmp/batched_solo.log

Status


2
---
149
-rw-rw-r-- 1 ubuntu ubuntu  49196 13:30:02 overlap_0147_extracted.wav
-rw-rw-r-- 1 ubuntu ubuntu  59436 13:30:11 overlap_0148_extracted.wav
Thu Apr  9 01:30:18 PM UTC 2026
---
  [91/156] overlap_0090.wav -> overlap_0090_extracted.wav (elapsed 848s, eta 606s)
  [92/156] overlap_0091.wav -> overlap_0091_extracted.wav (elapsed 857s, eta 596s)
  [93/156] overlap_0092.wav -> overlap_0092_extracted.wav (elapsed 866s, eta 587s)
[result-id: r33]


**149/156 done (95%).** ~7 left. ETA ~1 min.


pgrep -af "batched_solospeech" | grep -v pgrep | wc -l; ls /home/ubuntu/main_speaker_pipeline/extracted/ | wc -l; tail -3 /tmp/batched_solo.log

Status


2
152
  [91/156] overlap_0090.wav -> overlap_0090_extracted.wav (elapsed 848s, eta 606s)
  [92/156] overlap_0091.wav -> overlap_0091_extracted.wav (elapsed 857s, eta 596s)
  [93/156] overlap_0092.wav -> overlap_0092_extracted.wav (elapsed 866s, eta 587s)


**152/156 (97%).** 4 clips left. Process still alive. ~30s to go.


ffmpeg trim, mono, 16kHz for pyannote

Loose-cut overlap segments

Run SoloSpeech on every overlap

yt-dlp bestaudio, no re-encode


pgrep -af "batched_solospeech" | grep -v pgrep | wc -l; ls /home/ubuntu/main_speaker_pipeline/extracted/ | wc -l; grep -E "EXIT=|Done in" /tmp/batched_solo.log; tail -3 /tmp/batched_solo.log

Final status check


2
154
  [91/156] overlap_0090.wav -> overlap_0090_extracted.wav (elapsed 848s, eta 606s)
  [92/156] overlap_0091.wav -> overlap_0091_extracted.wav (elapsed 857s, eta 596s)
  [93/156] overlap_0092.wav -> overlap_0092_extracted.wav (elapsed 866s, eta 587s)


**154/156 (98.7%).** Process still alive. **2 clips left.**

Note: log buffering only flushed up to clip 93 — the disk is the truth, and disk says 154.


pgrep -af "batched_solospeech" | grep -v pgrep | wc -l; ls /home/ubuntu/main_speaker_pipeline/extracted/ | wc -l; grep "EXIT=\|Done in" /tmp/batched_solo.log

Final status


2
155


<task-notification>
<task-id>bgslv3nxs</task-id>
<tool-use-id>toolu_016fEZf4Hztq9bFDx8DKK7Mz</tool-use-id>
<output-file>/tmp/claude-1001/-home-ubuntu/b4a00fc1-fc25-4d49-bbf8-fc33235518fa/tasks/bgslv3nxs.output</output-file>
<status>completed</status>
<summary>Background command "Run batched SoloSpeech" completed (exit code 0)</summary>
</task-notification>


**155/156 (99.4%).** Still alive, **1 clip left.**


grep "EXIT=\|Done in" /tmp/batched_solo.log; ls /home/ubuntu/main_speaker_pipeline/extracted/ | wc -l; du -sh /home/ubuntu/main_speaker_pipeline/extracted/

Final stats


Done in 1467s. Output: /home/ubuntu/main_speaker_pipeline/extracted
EXIT=0
156
20M	/home/ubuntu/main_speaker_pipeline/extracted/


Updated task #19 status


Prompt: status


# 🎉 Pipeline complete

| | |
|---|---|
| Total time | **1467s (24:27)** for 156 SoloSpeech runs |
| Per-clip avg | ~9.4s |
| Output size | 20 MB |
| Failures | 0 |

## All artifacts at `/home/ubuntu/main_speaker_pipeline/`

```
source.webm                  108 MB    YouTube opus, untouched
clip.wav                      54 MB    28:00 16k mono
diarization.json                       pyannote precision-2 result, 718 turns
manifest.json                          summary of clean+overlap regions
speaker_00_clean.wav                   12:08 of clean SPEAKER_00
speaker_01_clean.wav                    2:27 of clean SPEAKER_01
main_speaker_ref.wav                    9.02s reference (used for SoloSpeech)
overlaps/
  overlap_0000.wav … overlap_0155.wav  156 raw loose-cut overlap clips
extracted/
  overlap_0000_extracted.wav … _0155   156 SoloSpeech outputs (main speaker only)

run_pyannote.py
build_clean_and_overlaps.py
pick_reference.py
batched_solospeech.py
```

## What you have now
- **12:08** of pristine clean SPEAKER_00 (no SoloSpeech artifacts)
- **~10:18** of "cleaned" SPEAKER_00 from overlap regions (SoloSpeech extracted)
- Combined: **~22:26** of usable SPEAKER_00 audio out of 28:00 total

## Suggested next steps
1. **Listen to a few extracted clips** (e.g. `overlap_0000_extracted.wav`, `overlap_0080_extracted.wav`) to verify SoloSpeech quality
2. If clean → I can write a stitcher that splices everything back into one continuous **`speaker_00_full.wav`** at correct timestamps
3. For TTS dataset: filter out clips where SoloSpeech residual ECAPA cosine similarity to ref is too low (potential artifacts)

Want me to do the stitching, or anything else?


we need make an dashboard ... on top original audio below cleaned audios below .. overlap able ... on left overlapaudio original and on ryt cleanedone for that .. top of this refernce audio clip ... questions ask first


Before building, a few questions:


AskUserQuestion

Question: What kind of dashboard?

Choices:
Single index.html with embedded <audio> players. Open directly in browser. No server needed beyond a tiny `python -m http.server` to load the wavs. Fastest and most portable.
Python Gradio with built-in audio players + waveforms. Need to keep a Python process running.
Streamlit page. Similar to Gradio. Slightly heavier.

Question: How should the 156 overlap pairs be laid out?

Choices:
All on one page, scrollable (Recommended)
Long page, all 156 pairs visible, browser-side. Easy to scan, slow initial load (~20MB of audio).
Pages of 20 with next/prev. Faster loading.
Table with columns: idx, start time, duration, original audio, cleaned audio. Sort by any column.

Question: Should each overlap pair show extra metadata?

Choices:
Timestamp in original audio (e.g. "04:23 - 04:31")
Makes it easy to find context
How long each clip is
From the diarization JSON
ECAPA cosine similarity (cleaned vs reference)
Quality metric — 0.0 to 1.0, higher = better extraction. Requires extra compute upfront.

Question: Original 28-min audio at the top — should it show a diarization timeline overlay?

Choices:
Yes, color-coded speaker bars (Recommended)
Render a horizontal timeline above the player showing colored blocks for SPEAKER_00 (blue) / SPEAKER_01 (orange) / overlap (red)
Plain <audio> element


User has answered your questions: "What kind of dashboard?"="i want to share it to my teeamate" user notes: i want to share it to my teeamate, "How should the 156 overlap pairs be laid out?"="All on one page, scrollable (Recommended)", "Should each overlap pair show extra metadata?"="Duration of the overlap clip, Speakers involved in this overlap, ECAPA cosine similarity (cleaned vs reference)", "Original 28-min audio at the top — should it show a diarization timeline overlay?"="No, just the audio player". You can now continue with the user's answers in mind.
[result-id: r34]

Question: What kind of dashboard?

Choices:
Single index.html with embedded <audio> players. Open directly in browser. No server needed beyond a tiny `python -m http.server` to load the wavs. Fastest and most portable.
Python Gradio with built-in audio players + waveforms. Need to keep a Python process running.
Streamlit page. Similar to Gradio. Slightly heavier.

Question: How should the 156 overlap pairs be laid out?

Choices:
All on one page, scrollable (Recommended)
Long page, all 156 pairs visible, browser-side. Easy to scan, slow initial load (~20MB of audio).
Pages of 20 with next/prev. Faster loading.
Table with columns: idx, start time, duration, original audio, cleaned audio. Sort by any column.

Question: Should each overlap pair show extra metadata?

Choices:
Timestamp in original audio (e.g. "04:23 - 04:31")
Makes it easy to find context
How long each clip is
From the diarization JSON
ECAPA cosine similarity (cleaned vs reference)
Quality metric — 0.0 to 1.0, higher = better extraction. Requires extra compute upfront.

Question: Original 28-min audio at the top — should it show a diarization timeline overlay?

Choices:
Yes, color-coded speaker bars (Recommended)
Render a horizontal timeline above the player showing colored blocks for SPEAKER_00 (blue) / SPEAKER_01 (orange) / overlap (red)
Plain <audio> element

All on one page, scrollable (Recommended)

Duration of the overlap clip, Speakers involved in this overlap, ECAPA cosine similarity (cleaned vs reference)


Got it. I'll build a static HTML dashboard with all the audio files in a self-contained folder. Sharing options after I'm done:
- **Easiest:** zip the folder, your teammate downloads + opens locally (need to run `python -m http.server` because browsers block local file audio)
- **Or** I can spin up an http server + you tunnel via ngrok/cloudflared

First I need to compute ECAPA cosine similarities for all 156 extracted vs reference. That'll add ~1 min of GPU compute.


Write

"""For each extracted/overlap_NNN_extracted.wav, compute ECAPA cosine
similarity vs main_speaker_ref.wav. Save to similarities.json."""
import json, glob, time
from pathlib import Path
import torch
import torch.nn.functional as F
import librosa
from speechbrain.pretrained.interfaces import Pretrained

class Encoder(Pretrained):
    MODULES_NEEDED = ["compute_features", "mean_var_norm", "embedding_model"]

    def encode_batch(self, wavs, wav_lens=None):
        if len(wavs.shape) == 1:
            wavs = wavs.unsqueeze(0)
        if wav_lens is None:
            wav_lens = torch.ones(wavs.shape[0], device=self.device)
        wavs, wav_lens = wavs.to(self.device), wav_lens.to(self.device)
        wavs = wavs.float()
        feats = self.mods.compute_features(wavs)
        feats = self.mods.mean_var_norm(feats, wav_lens)
        return self.mods.embedding_model(feats, wav_lens)

HERE = Path(__file__).parent
REF = HERE / "main_speaker_ref.wav"
EXTRACTED = sorted(glob.glob(str(HERE / "extracted" / "overlap_*.wav")))

print(f"Loading ECAPA-TDNN...")
ecapa = Encoder.from_hparams(source="yangwang825/ecapa-tdnn-vox2")

print(f"Encoding reference: {REF.name}")
ref_wav, _ = librosa.load(str(REF), sr=16000)
ref_emb = ecapa.encode_batch(torch.tensor(ref_wav)).squeeze()

manifest = json.load(open(HERE / "manifest.json"))
overlap_meta = {o["index"]: o for o in manifest["overlaps"]}

results = []
t0 = time.time()
for i, fp in enumerate(EXTRACTED):
    idx = int(Path(fp).stem.split("_")[1])
    wav, _ = librosa.load(fp, sr=16000)
    if len(wav) == 0:
        sim = 0.0
    else:
        emb = ecapa.encode_batch(torch.tensor(wav)).squeeze()
        sim = F.cosine_similarity(emb.unsqueeze(0), ref_emb.unsqueeze(0)).item()
    meta = overlap_meta.get(idx, {})
    results.append({
        "index": idx,
        "start": meta.get("start"),
        "end": meta.get("end"),
        "duration": round((meta.get("end", 0) - meta.get("start", 0)), 2),
        "speakers": meta.get("speakers", []),
        "similarity": round(sim, 4),
        "original": f"overlaps/overlap_{idx:04d}.wav",
        "extracted": f"extracted/overlap_{idx:04d}_extracted.wav",
    })
print(f"Computed {len(results)} similarities in {time.time()-t0:.1f}s")

(HERE / "similarities.json").write_text(json.dumps(results, indent=2))
sims = [r["similarity"] for r in results]
print(f"Sim stats: min={min(sims):.3f} median={sorted(sims)[len(sims)//2]:.3f} max={max(sims):.3f}")
print(f"  >0.7: {sum(1 for s in sims if s > 0.7)} clips")
print(f"  >0.5: {sum(1 for s in sims if s > 0.5)} clips")
print(f"  <0.3: {sum(1 for s in sims if s < 0.3)} clips")


File created successfully at: /home/ubuntu/main_speaker_pipeline/compute_similarities.py

"""For each extracted/overlap_NNN_extracted.wav, compute ECAPA cosine
similarity vs main_speaker_ref.wav. Save to similarities.json."""
import json, glob, time
from pathlib import Path
import torch
import torch.nn.functional as F
import librosa
from speechbrain.pretrained.interfaces import Pretrained

class Encoder(Pretrained):
    MODULES_NEEDED = ["compute_features", "mean_var_norm", "embedding_model"]

    def encode_batch(self, wavs, wav_lens=None):
        if len(wavs.shape) == 1:
            wavs = wavs.unsqueeze(0)
        if wav_lens is None:
            wav_lens = torch.ones(wavs.shape[0], device=self.device)
        wavs, wav_lens = wavs.to(self.device), wav_lens.to(self.device)
        wavs = wavs.float()
        feats = self.mods.compute_features(wavs)
        feats = self.mods.mean_var_norm(feats, wav_lens)
        return self.mods.embedding_model(feats, wav_lens)

HERE = Path(__file__).parent
REF = HERE / "main_speaker_ref.wav"
EXTRACTED = sorted(glob.glob(str(HERE / "extracted" / "overlap_*.wav")))

print(f"Loading ECAPA-TDNN...")
ecapa = Encoder.from_hparams(source="yangwang825/ecapa-tdnn-vox2")

print(f"Encoding reference: {REF.name}")
ref_wav, _ = librosa.load(str(REF), sr=16000)
ref_emb = ecapa.encode_batch(torch.tensor(ref_wav)).squeeze()

manifest = json.load(open(HERE / "manifest.json"))
overlap_meta = {o["index"]: o for o in manifest["overlaps"]}

results = []
t0 = time.time()
for i, fp in enumerate(EXTRACTED):
    idx = int(Path(fp).stem.split("_")[1])
    wav, _ = librosa.load(fp, sr=16000)
    if len(wav) == 0:
        sim = 0.0
    else:
        emb = ecapa.encode_batch(torch.tensor(wav)).squeeze()
        sim = F.cosine_similarity(emb.unsqueeze(0), ref_emb.unsqueeze(0)).item()
    meta = overlap_meta.get(idx, {})
    results.append({
        "index": idx,
        "start": meta.get("start"),
        "end": meta.get("end"),
        "duration": round((meta.get("end", 0) - meta.get("start", 0)), 2),
        "speakers": meta.get("speakers", []),
        "similarity": round(sim, 4),
        "original": f"overlaps/overlap_{idx:04d}.wav",
        "extracted": f"extracted/overlap_{idx:04d}_extracted.wav",
    })
print(f"Computed {len(results)} similarities in {time.time()-t0:.1f}s")

(HERE / "similarities.json").write_text(json.dumps(results, indent=2))
sims = [r["similarity"] for r in results]
print(f"Sim stats: min={min(sims):.3f} median={sorted(sims)[len(sims)//2]:.3f} max={max(sims):.3f}")
print(f"  >0.7: {sum(1 for s in sims if s > 0.7)} clips")
print(f"  >0.5: {sum(1 for s in sims if s > 0.5)} clips")
print(f"  <0.3: {sum(1 for s in sims if s < 0.3)} clips")


Bash

/home/ubuntu/SoloSpeech/.venv/bin/python compute_similarities.py 2>&1 | tail -15

Compute ECAPA similarities


  wrapped_fwd = torch.cuda.amp.custom_fwd(fwd, cast_inputs=cast_inputs)
INFO:speechbrain.utils.fetching:Fetch embedding_model.ckpt: Fetching from HuggingFace Hub 'yangwang825/ecapa-tdnn-vox2' if not cached
INFO:speechbrain.utils.fetching:Fetch classifier.ckpt: Fetching from HuggingFace Hub 'yangwang825/ecapa-tdnn-vox2' if not cached
INFO:speechbrain.utils.fetching:Fetch label_encoder.txt: Fetching from HuggingFace Hub 'yangwang825/ecapa-tdnn-vox2' if not cached
INFO:speechbrain.utils.parameter_transfer:Loading pretrained files for: embedding_model, classifier, label_encoder
/home/ubuntu/SoloSpeech/.venv/lib/python3.10/site-packages/speechbrain/utils/checkpoints.py:200: FutureWarning: You are using `torch.load` with `weights_only=False` (the current default value), which uses the default pickle module implicitly. It is possible to construct malicious pickle data which will execute arbitrary code during unpickling (See https://github.com/pytorch/pytorch/blob/main/SECURITY.md#untrusted-models for more details). In a future release, the default value for `weights_only` will be flipped to `True`. This limits the functions that could be executed during unpickling. Arbitrary objects will no longer be allowed to be loaded via this mode unless they are explicitly allowlisted by the user via `torch.serialization.add_safe_globals`. We recommend you start setting `weights_only=True` for any use case where you don't have full control of the loaded file. Please open an issue on GitHub for any issues related to this experimental feature.
  state_dict = torch.load(path, map_location=device)
[W409 13:40:32.443728945 NNPACK.cpp:61] Could not initialize NNPACK! Reason: Unsupported hardware.
Loading ECAPA-TDNN...
Encoding reference: main_speaker_ref.wav
Computed 156 similarities in 7.8s
Sim stats: min=0.105 median=0.664 max=0.819
  >0.7: 45 clips
  >0.5: 136 clips
  <0.3: 5 clips
[result-id: r35]


Similarities computed:
- **45 clips >0.7** (high quality)
- **136 clips >0.5** (likely correct speaker)
- **5 clips <0.3** (probably failed extraction)

Now building the dashboard.


Write

<!DOCTYPE html>

<meta charset="UTF-8">
<title>Main Speaker Extraction — Review Dashboard</title>

Main Speaker Extraction Dashboard

YouTube clip 2:13–30:13 · pyannote.ai precision-2 diarization · SoloSpeech target speaker extraction (default 200 steps × 4 candidates)

Original full clip (28:00)

clip.wav16 kHz mono · 1680 s

  <audio controls preload="metadata" src="clip.wav"></audio>

Clean main speaker (concat, no overlaps)

speaker_00_clean.wav12:08 · 278 segments

  <audio controls preload="metadata" src="speaker_00_clean.wav"></audio>

Other speaker (for context)

speaker_01_clean.wav2:27 · 75 segments

  <audio controls preload="metadata" src="speaker_01_clean.wav"></audio>

Reference enrollment (used by SoloSpeech)

main_speaker_ref.wav9.02 s · longest clean SPEAKER_00 turn @ 201.26 s

  <audio controls preload="metadata" src="main_speaker_ref.wav"></audio>

Overlap regions — original (left) vs SoloSpeech extracted (right)

  156 pairs · sort by:
  <select id="sort">
    <option value="idx">index (timeline order)</option>
    <option value="sim_desc">similarity ↓ (best first)</option>
    <option value="sim_asc">similarity ↑ (worst first)</option>
    <option value="dur_desc">duration ↓</option>
    <option value="dur_asc">duration ↑</option>
  </select>


File created successfully at: /home/ubuntu/main_speaker_pipeline/dashboard.html

<!DOCTYPE html>

<meta charset="UTF-8">
<title>Main Speaker Extraction — Review Dashboard</title>

Main Speaker Extraction Dashboard

YouTube clip 2:13–30:13 · pyannote.ai precision-2 diarization · SoloSpeech target speaker extraction (default 200 steps × 4 candidates)

Original full clip (28:00)

clip.wav16 kHz mono · 1680 s

  <audio controls preload="metadata" src="clip.wav"></audio>

Clean main speaker (concat, no overlaps)

speaker_00_clean.wav12:08 · 278 segments

  <audio controls preload="metadata" src="speaker_00_clean.wav"></audio>

Other speaker (for context)

speaker_01_clean.wav2:27 · 75 segments

  <audio controls preload="metadata" src="speaker_01_clean.wav"></audio>

Reference enrollment (used by SoloSpeech)

main_speaker_ref.wav9.02 s · longest clean SPEAKER_00 turn @ 201.26 s

  <audio controls preload="metadata" src="main_speaker_ref.wav"></audio>

Overlap regions — original (left) vs SoloSpeech extracted (right)

  156 pairs · sort by:
  <select id="sort">
    <option value="idx">index (timeline order)</option>
    <option value="sim_desc">similarity ↓ (best first)</option>
    <option value="sim_asc">similarity ↑ (worst first)</option>
    <option value="dur_desc">duration ↓</option>
    <option value="dur_asc">duration ↑</option>
  </select>


Bash

/home/ubuntu/SoloSpeech/.venv/bin/python -c "
import json
data = json.load(open('similarities.json'))
html = open('dashboard.html').read()
html = html.replace('__DATA__', json.dumps(data))
open('dashboard.html', 'w').write(html)
print(f'Embedded {len(data)} pairs into dashboard.html')
print(f'Size: {len(html)/1024:.1f} KB')
"

Embed JSON data into dashboard HTML


Embedded 156 pairs into dashboard.html
Size: 41.3 KB


ls -la /home/ubuntu/main_speaker_pipeline/dashboard.html; echo ---; du -sh /home/ubuntu/main_speaker_pipeline/{clip.wav,speaker_00_clean.wav,speaker_01_clean.wav,main_speaker_ref.wav,overlaps,extracted}

Check sizes for share


-rw-rw-r-- 1 ubuntu ubuntu 42281 Apr  9 13:41 /home/ubuntu/main_speaker_pipeline/dashboard.html
---
52M	/home/ubuntu/main_speaker_pipeline/clip.wav
23M	/home/ubuntu/main_speaker_pipeline/speaker_00_clean.wav
4.5M	/home/ubuntu/main_speaker_pipeline/speaker_01_clean.wav
284K	/home/ubuntu/main_speaker_pipeline/main_speaker_ref.wav
20M	/home/ubuntu/main_speaker_pipeline/overlaps
20M	/home/ubuntu/main_speaker_pipeline/extracted
[result-id: r36]


**Dashboard built. Total bundle ~120 MB.**

📁 `/home/ubuntu/main_speaker_pipeline/dashboard.html`

### Features
- **Top section:** original 28-min clip → cleaned main speaker → other speaker → reference clip (highlighted in blue)
- **156 overlap pairs** below, each row showing: index · duration · speakers · ECAPA cosine similarity (color-coded green/yellow/red)
- **Original on left, SoloSpeech extracted on right** for direct A/B
- **Sortable** by index / similarity (best/worst first) / duration
- **Quality counts** in header: 113 good, 38 mid, 5 bad

### Sharing options for your teammate

**Option A — zip + send (simplest):**
```bash
cd /home/ubuntu && tar czf main_speaker_dashboard.tgz main_speaker_pipeline/{dashboard.html,clip.wav,speaker_00_clean.wav,speaker_01_clean.wav,main_speaker_ref.wav,overlaps,extracted}
```
~120 MB tar.gz. Teammate unzips, then runs `python -m http.server 8000` inside the folder and opens `http://localhost:8000/dashboard.html`. They need a server because browsers block local-file `<audio>`.

**Option B — host it and tunnel (instant share, no download):**
1. I run `python -m http.server 8000` here
2. You expose it via `cloudflared tunnel --url http://localhost:8000` or `ngrok http 8000`
3. Send your teammate the URL — they open `https://<random>.trycloudflare.com/dashboard.html` directly

**Option C — upload to Hugging Face Space / S3 / Google Cloud bucket** (permanent, public).

**Which do you want?** I can do A right now, or set up the local http server for B.


option 2


which cloudflared ngrok 2>&1; cloudflared --version 2>&1 | head -1; ngrok version 2>&1 | head -1

Check tunnel tools


/usr/local/bin/cloudflared
/usr/local/bin/ngrok
cloudflared version 2026.1.1 (built 2026-01-20-11:14 UTC)
ngrok version 3.34.1


Both available. Starting `python -m http.server` then `cloudflared` for a quick tunnel (no account needed).


python3 -m http.server 8000 > /tmp/httpd.log 2>&1

Start local http server


Command running in background with ID: bpfmnkdjd. Output is being written to: /tmp/claude-1001/-home-ubuntu/b4a00fc1-fc25-4d49-bbf8-fc33235518fa/tasks/bpfmnkdjd.output


cloudflared tunnel --url http://localhost:8000 > /tmp/cf.log 2>&1

Start cloudflared tunnel


Command running in background with ID: bc227whim. Output is being written to: /tmp/claude-1001/-home-ubuntu/b4a00fc1-fc25-4d49-bbf8-fc33235518fa/tasks/bc227whim.output


sleep 5; pgrep -af "http.server" | grep -v pgrep; echo ---; pgrep -af cloudflared | grep -v pgrep; echo ---; grep "trycloudflare\|https://" /tmp/cf.log

Get tunnel URL


1052713 /bin/bash -c source /home/ubuntu/.claude/shell-snapshots/snapshot-bash-1775730099501-7xv8ho.sh 2>/dev/null || true && shopt -u extglob 2>/dev/null || true && eval 'python3 -m http.server 8000 > /tmp/httpd.log 2>&1' < /dev/null && pwd -P >| /tmp/claude-83c7-cwd
1052733 python3 -m http.server 8000
---
1052744 /bin/bash -c source /home/ubuntu/.claude/shell-snapshots/snapshot-bash-1775730099501-7xv8ho.sh 2>/dev/null || true && shopt -u extglob 2>/dev/null || true && eval 'cloudflared tunnel --url http://localhost:8000 > /tmp/cf.log 2>&1' < /dev/null && pwd -P >| /tmp/claude-0c78-cwd
1052764 cloudflared tunnel --url http://localhost:8000
1844381 SCREEN -dmS maya-tunnel bash -c cloudflared tunnel --url http://localhost:8000 2>&1 | tee /tmp/cloudflare-tunnel.log
1844383 bash -c cloudflared tunnel --url http://localhost:8000 2>&1 | tee /tmp/cloudflare-tunnel.log
1844384 cloudflared tunnel --url http://localhost:8000
---
2026-04-09T13:43:03Z INF Thank you for trying Cloudflare Tunnel. Doing so, without a Cloudflare account, is a quick way to experiment and try it out. However, be aware that these account-less Tunnels have no uptime guarantee, are subject to the Cloudflare Online Services Terms of Use (https://www.cloudflare.com/website-terms/), and Cloudflare reserves the right to investigate your use of Tunnels for violations of such terms. If you intend to use Tunnels in production you should use a pre-created named tunnel by following: https://developers.cloudflare.com/cloudflare-one/connections/connect-apps
2026-04-09T13:43:03Z INF Requesting new quick Tunnel on trycloudflare.com...
2026-04-09T13:43:06Z INF |  https://explicit-apr-calculators-shirts.trycloudflare.com                                 |
2026/04/09 13:43:06 failed to sufficiently increase receive buffer size (was: 208 kiB, wanted: 7168 kiB, got: 416 kiB). See https://github.com/quic-go/quic-go/wiki/UDP-Buffer-Sizes for details.
[result-id: r37]


cat /tmp/claude-83c7-cwd 2>&1; echo ---; curl -s -o /dev/null -w "%{http_code}\n" http://localhost:8000/dashboard.html 2>&1; echo ---; curl -s http://localhost:8000/ 2>&1 | head -20

Verify http.server cwd


cat: /tmp/claude-83c7-cwd: No such file or directory
---
200
---
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Directory listing for /</title>

Directory listing for /

batched_solospeech.py

build_clean_and_overlaps.py

clip.wav

compute_similarities.py

dashboard.html

diarization.json

extracted/

main_speaker_ref.wav

manifest.json

overlaps/

[result-id: r38]


Server up, dashboard.html returns 200, serving from the right directory.

# 🌐 Dashboard URL

## **https://explicit-apr-calculators-shirts.trycloudflare.com/dashboard.html**

Send this link to your teammate. It works in any browser, no install.

### ⚠ Things to know
- **Tunnel is unauthenticated / temporary** — Cloudflare reserves the right to terminate quick tunnels at any time. For long-term use, set up a named tunnel with a Cloudflare account.
- **Sessions stay alive while these processes run** on this machine. If you restart this shell or kill cloudflared, the URL dies.
- **Anyone with the link can access** — there's no auth. The URL is hard to guess but treat it as public.
- **The directory listing is open** at the root URL — your teammate (or anyone) can browse all files. If you want to lock that down, I can put everything in a subdir or add basic auth.

### To stop sharing
```bash
pkill -f "cloudflared tunnel --url http://localhost:8000"
pkill -f "http.server 8000"
```

Want me to lock the root listing or add password auth?


fuck do dashboard white color


1	<!DOCTYPE html>
2	<html lang="en">
3	<head>
4	<meta charset="UTF-8">
5	<title>Main Speaker Extraction — Review Dashboard</title>
6	<style>
7	  :root {
8	    --bg: #0f1115;
9	    --panel: #181b22;
10	    --panel2: #1f232c;

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Main Speaker Extraction — Review Dashboard</title>
<style>
  :root {
    --bg: #0f1115;
    --panel: #181b22;
    --panel2: #1f232c;


The file /home/ubuntu/main_speaker_pipeline/dashboard.html has been updated successfully.

  .sim.good { background: rgba(74, 222, 128, 0.15); color: var(--good); }
  .sim.mid  { background: rgba(250, 204, 21, 0.15); color: var(--mid); }
  .sim.bad  { background: rgba(239, 68, 68, 0.15); color: var(--bad); }

  .sim.good { background: rgba(22, 163, 74, 0.12); color: var(--good); }
  .sim.mid  { background: rgba(202, 138, 4, 0.12); color: var(--mid); }
  .sim.bad  { background: rgba(220, 38, 38, 0.12); color: var(--bad); }

-  .sim.good { background: rgba(74, 222, 128, 0.15); color: var(--good); }

-  .sim.mid  { background: rgba(250, 204, 21, 0.15); color: var(--mid); }

-  .sim.bad  { background: rgba(239, 68, 68, 0.15); color: var(--bad); }

+  .sim.good { background: rgba(22, 163, 74, 0.12); color: var(--good); }

+  .sim.mid  { background: rgba(202, 138, 4, 0.12); color: var(--mid); }

+  .sim.bad  { background: rgba(220, 38, 38, 0.12); color: var(--bad); }


<title>Main Speaker Extraction — Review Dashboard</title>


Edit

  audio { width: 100%; height: 32px; outline: none; }
  audio::-webkit-media-controls-panel { background: var(--panel2); }

audio { width: 100%; height: 32px; outline: none; }


  audio { width: 100%; height: 32px; outline: none; }
  audio::-webkit-media-controls-panel { background: var(--panel2); }

-  audio::-webkit-media-controls-panel { background: var(--panel2); }


  .sim.good { background: rgba(74, 222, 128, 0.15); color: var(--good); }
  .sim.mid  { background: rgba(250, 204, 21, 0.15); color: var(--mid); }
  .sim.bad  { background: rgba(239, 68, 68, 0.15); color: var(--bad); }

  .sim.good { background: rgba(22, 163, 74, 0.12); color: var(--good); }
  .sim.mid  { background: rgba(202, 138, 4, 0.12); color: var(--mid); }
  .sim.bad  { background: rgba(220, 38, 38, 0.12); color: var(--bad); }


Light theme applied. Just refresh: **https://explicit-apr-calculators-shirts.trycloudflare.com/dashboard.html**

White background, dark text, same layout. Audio players stay in their native browser (light) skin now since I removed the dark `<audio>` override.


can u give total speaker 0 audio clean + overlapped clean greated than > 0.6


Bash

/home/ubuntu/SoloSpeech/.venv/bin/python -c "
import json
sims = json.load(open('similarities.json'))
clean_sp00 = 727.7  # from earlier
good = [s for s in sims if s['similarity'] > 0.6]
good_dur = sum(s['duration'] for s in good)
print(f'speaker_00_clean.wav:        {clean_sp00:>7.1f} s  ({clean_sp00/60:.2f} min)')
print(f'extracted overlaps (>0.6):   {good_dur:>7.1f} s  ({good_dur/60:.2f} min)  [{len(good)} clips]')
print(f'                              ─────────')
total = clean_sp00 + good_dur
print(f'TOTAL usable SPEAKER_00:     {total:>7.1f} s  ({total/60:.2f} min)')
print(f'                             vs {1680/60:.1f} min total clip = {100*total/1680:.1f}%')
"

Sum speaker_00 clean + good extracted


speaker_00_clean.wav:          727.7 s  (12.13 min)
extracted overlaps (>0.6):     508.7 s  (8.48 min)  [114 clips]
                              ─────────
TOTAL usable SPEAKER_00:      1236.4 s  (20.61 min)
                             vs 28.0 min total clip = 73.6%
[result-id: r39]


| Source | Duration | Notes |
|---|---|---|
| `speaker_00_clean.wav` | **12:08** (727.7s) | already-clean, no overlap |
| Extracted overlaps with sim ≥ 0.6 | **8:29** (508.7s) | 114 of 156 clips passed the bar |
| **TOTAL usable SPEAKER_00** | **20:36** (1236.4s) | **73.6%** of the 28-min clip |

So with the 0.6 similarity gate you keep ~20.6 minutes of SPEAKER_00 audio. The 42 dropped clips (sim < 0.6) sum to ~109s — mostly noisy/short overlaps where SoloSpeech couldn't lock onto the target.

If you want to be more aggressive:
- **sim ≥ 0.7** (stricter): would drop more — let me know if you want that number too
- **sim ≥ 0.5** (looser): would add ~22 more clips


can u run noise cancelaltion on cleaned data ?


Yes — recommend **DeepFilterNet3** (fast, great quality, single pip install, GPU). Before I install + run, two quick questions:


AskUserQuestion

Question: Which files should I run noise cancellation on?

Choices:
speaker_00_clean.wav + good extracted (sim≥0.6) (Recommended)
Denoise the 12-min clean concat AND the 114 extracted overlaps that passed the quality bar. ~20 min of audio total. Drops the 42 low-quality extractions.
Denoise the clean concat and ALL 156 SoloSpeech outputs regardless of similarity score. ~22 min total.
Only the 12-min clean concat. Skip the extracted overlap files entirely.

Question: Do you want one final stitched output too?

Choices:
Yes — stitch denoised pieces into one continuous file (Recommended)
After denoising, splice everything back into a single speaker_00_full_clean.wav at the original timestamps from the 28-min clip. End result: one ~21-min file you can use as-is.
No — just give me the denoised files separately
Keep them as individual files. You'll combine them yourself.

Question: Use DeepFilterNet3 (DFN3) or a different denoiser?

Choices:
Fast (~60x real-time on GPU), high SI-SDR scores, single pip install. Designed for full-band speech enhancement up to 48kHz.
Higher quality on heavy noise but ~5x slower. Heavier install, GPU-only.
Same Demucs we already have installed. OK quality, slower than DFN3.


User has answered your questions: "Which files should I run noise cancellation on?"="Everything (clean + all 156 extracted)", "Do you want one final stitched output too?"="just seprate things and add them in to dashboard" user notes: just seprate things and add them in to dashboard, "Use DeepFilterNet3 (DFN3) or a different denoiser?"="DeepFilterNet3 (Recommended)". You can now continue with the user's answers in mind.
[result-id: r40]

Question: Which files should I run noise cancellation on?

Choices:
speaker_00_clean.wav + good extracted (sim≥0.6) (Recommended)
Denoise the 12-min clean concat AND the 114 extracted overlaps that passed the quality bar. ~20 min of audio total. Drops the 42 low-quality extractions.
Denoise the clean concat and ALL 156 SoloSpeech outputs regardless of similarity score. ~22 min total.
Only the 12-min clean concat. Skip the extracted overlap files entirely.

Question: Do you want one final stitched output too?

Choices:
Yes — stitch denoised pieces into one continuous file (Recommended)
After denoising, splice everything back into a single speaker_00_full_clean.wav at the original timestamps from the 28-min clip. End result: one ~21-min file you can use as-is.
No — just give me the denoised files separately
Keep them as individual files. You'll combine them yourself.

Question: Use DeepFilterNet3 (DFN3) or a different denoiser?

Choices:
Fast (~60x real-time on GPU), high SI-SDR scores, single pip install. Designed for full-band speech enhancement up to 48kHz.
Higher quality on heavy noise but ~5x slower. Heavier install, GPU-only.
Same Demucs we already have installed. OK quality, slower than DFN3.

just seprate things and add them in to dashboard


TaskCreate

Install DeepFilterNet3

pip install deepfilternet in SoloSpeech venv


Task #20 created successfully: Install DeepFilterNet3

Install DeepFilterNet3


Denoise speaker_00_clean + 156 extracted

Run DFN3 on all files, output to denoised/


Task #21 created successfully: Denoise speaker_00_clean + 156 extracted


Add denoised tracks to dashboard

Update HTML to show 3 columns: original | extracted | denoised


Task #22 created successfully: Add denoised tracks to dashboard

Add denoised tracks to dashboard


Bash

cd /home/ubuntu/SoloSpeech && .venv/bin/pip install deepfilternet 2>&1 | tail -10

Install DeepFilterNet


Downloading appdirs-1.4.4-py2.py3-none-any.whl (9.6 kB)
Downloading packaging-23.2-py3-none-any.whl (53 kB)
Using cached loguru-0.7.3-py3-none-any.whl (61 kB)
Installing collected packages: appdirs, packaging, loguru, deepfilterlib, deepfilternet
  Attempting uninstall: packaging
    Found existing installation: packaging 26.0
    Uninstalling packaging-26.0:
      Successfully uninstalled packaging-26.0

Successfully installed appdirs-1.4.4 deepfilterlib-0.5.6 deepfilternet-0.5.6 loguru-0.7.3 packaging-23.2
[result-id: r41]


Updated task #20 status


Updated task #21 status


Write

"""DeepFilterNet3 denoise speaker_00_clean.wav and all extracted overlap clips.
DFN3 expects 48kHz input internally; it'll resample as needed."""
import glob, time
from pathlib import Path
import torch
import torchaudio
from df.enhance import enhance, init_df, load_audio, save_audio

HERE = Path(__file__).parent
OUT_DIR = HERE / "denoised"
OUT_DIR.mkdir(exist_ok=True)

print("Loading DeepFilterNet3...")
model, df_state, _ = init_df()
device = "cuda" if torch.cuda.is_available() else "cpu"
print(f"Device: {device}")
model = model.to(device)

def denoise_one(in_path: Path, out_path: Path):
    audio, _ = load_audio(str(in_path), sr=df_state.sr())
    audio = audio.to(device)
    enhanced = enhance(model, df_state, audio)
    save_audio(str(out_path), enhanced.cpu(), df_state.sr())

# 1) speaker_00_clean.wav
inp = HERE / "speaker_00_clean.wav"
out = OUT_DIR / "speaker_00_clean_denoised.wav"
print(f"Denoising {inp.name} ...")
t0 = time.time()
denoise_one(inp, out)
print(f"  -> {out.name} in {time.time()-t0:.1f}s")

# 2) all extracted overlap clips
files = sorted(glob.glob(str(HERE / "extracted" / "overlap_*.wav")))
print(f"\nDenoising {len(files)} extracted overlap clips ...")
t0 = time.time()
for i, fp in enumerate(files):
    inp = Path(fp)
    out = OUT_DIR / inp.name.replace("_extracted.wav", "_denoised.wav")
    denoise_one(inp, out)
    if (i + 1) % 20 == 0 or i + 1 == len(files):
        elapsed = time.time() - t0
        eta = elapsed / (i + 1) * (len(files) - i - 1)
        print(f"  [{i+1}/{len(files)}] elapsed {elapsed:.0f}s eta {eta:.0f}s")
print(f"\nDone. Total time: {time.time()-t0:.0f}s. Output: {OUT_DIR}")


File created successfully at: /home/ubuntu/main_speaker_pipeline/run_dfn3.py

"""DeepFilterNet3 denoise speaker_00_clean.wav and all extracted overlap clips.
DFN3 expects 48kHz input internally; it'll resample as needed."""
import glob, time
from pathlib import Path
import torch
import torchaudio
from df.enhance import enhance, init_df, load_audio, save_audio

HERE = Path(__file__).parent
OUT_DIR = HERE / "denoised"
OUT_DIR.mkdir(exist_ok=True)

print("Loading DeepFilterNet3...")
model, df_state, _ = init_df()
device = "cuda" if torch.cuda.is_available() else "cpu"
print(f"Device: {device}")
model = model.to(device)

def denoise_one(in_path: Path, out_path: Path):
    audio, _ = load_audio(str(in_path), sr=df_state.sr())
    audio = audio.to(device)
    enhanced = enhance(model, df_state, audio)
    save_audio(str(out_path), enhanced.cpu(), df_state.sr())

# 1) speaker_00_clean.wav
inp = HERE / "speaker_00_clean.wav"
out = OUT_DIR / "speaker_00_clean_denoised.wav"
print(f"Denoising {inp.name} ...")
t0 = time.time()
denoise_one(inp, out)
print(f"  -> {out.name} in {time.time()-t0:.1f}s")

# 2) all extracted overlap clips
files = sorted(glob.glob(str(HERE / "extracted" / "overlap_*.wav")))
print(f"\nDenoising {len(files)} extracted overlap clips ...")
t0 = time.time()
for i, fp in enumerate(files):
    inp = Path(fp)
    out = OUT_DIR / inp.name.replace("_extracted.wav", "_denoised.wav")
    denoise_one(inp, out)
    if (i + 1) % 20 == 0 or i + 1 == len(files):
        elapsed = time.time() - t0
        eta = elapsed / (i + 1) * (len(files) - i - 1)
        print(f"  [{i+1}/{len(files)}] elapsed {elapsed:.0f}s eta {eta:.0f}s")
print(f"\nDone. Total time: {time.time()-t0:.0f}s. Output: {OUT_DIR}")


Bash

cd /home/ubuntu/main_speaker_pipeline && /home/ubuntu/SoloSpeech/.venv/bin/python run_dfn3.py 2>&1 | tail -30

Run DFN3 denoising


  from torchaudio.backend.common import AudioMetaData
Loading DeepFilterNet3...
2026-04-09 13:58:23 | INFO     | DF | Running on torch 2.4.1+cu124
2026-04-09 13:58:23 | INFO     | DF | Running on host 0321-dsm2-nvdgxa100-prxmx70052
2026-04-09 13:58:23 | INFO     | DF | Git commit: dae8bec, branch: main
2026-04-09 13:58:23 | INFO     | DF | Loading model settings of DeepFilterNet3
2026-04-09 13:58:23 | INFO     | DF | Using DeepFilterNet3 model at /home/ubuntu/.cache/DeepFilterNet/DeepFilterNet3
2026-04-09 13:58:23 | INFO     | DF | Initializing model `deepfilternet3`
2026-04-09 13:58:23 | INFO     | DF | Found checkpoint /home/ubuntu/.cache/DeepFilterNet/DeepFilterNet3/checkpoints/model_120.ckpt.best with epoch 120
/home/ubuntu/SoloSpeech/.venv/lib/python3.10/site-packages/df/checkpoint.py:77: FutureWarning: You are using `torch.load` with `weights_only=False` (the current default value), which uses the default pickle module implicitly. It is possible to construct malicious pickle data which will execute arbitrary code during unpickling (See https://github.com/pytorch/pytorch/blob/main/SECURITY.md#untrusted-models for more details). In a future release, the default value for `weights_only` will be flipped to `True`. This limits the functions that could be executed during unpickling. Arbitrary objects will no longer be allowed to be loaded via this mode unless they are explicitly allowlisted by the user via `torch.serialization.add_safe_globals`. We recommend you start setting `weights_only=True` for any use case where you don't have full control of the loaded file. Please open an issue on GitHub for any issues related to this experimental feature.
  latest = torch.load(latest, map_location="cpu")
2026-04-09 13:58:23 | INFO     | DF | Running on device cuda:0
2026-04-09 13:58:23 | INFO     | DF | Model loaded
2026-04-09 13:58:23 | WARNING  | DF | Audio sampling rate does not match model sampling rate (16000, 48000). Resampling...
/home/ubuntu/SoloSpeech/.venv/lib/python3.10/site-packages/df/io.py:106: UserWarning: "sinc_interpolation" resampling method name is being deprecated and replaced by "sinc_interp_hann" in the next release. The default behavior remains unchanged.
  return ta_resample(audio, orig_sr, new_sr, **params)
Device: cuda
Denoising speaker_00_clean.wav ...
Traceback (most recent call last):
  File "/home/ubuntu/main_speaker_pipeline/run_dfn3.py", line 30, in <module>
    denoise_one(inp, out)
  File "/home/ubuntu/main_speaker_pipeline/run_dfn3.py", line 22, in denoise_one
    enhanced = enhance(model, df_state, audio)
  File "/home/ubuntu/SoloSpeech/.venv/lib/python3.10/site-packages/torch/utils/_contextlib.py", line 116, in decorate_context
    return func(*args, **kwargs)
  File "/home/ubuntu/SoloSpeech/.venv/lib/python3.10/site-packages/df/enhance.py", line 234, in enhance
    spec, erb_feat, spec_feat = df_features(audio, df_state, nb_df, device=get_device())
  File "/home/ubuntu/SoloSpeech/.venv/lib/python3.10/site-packages/df/enhance.py", line 190, in df_features
    spec = df.analysis(audio.numpy())  # [C, Tf] -> [C, Tf, F]
TypeError: can't convert cuda:0 device type tensor to numpy. Use Tensor.cpu() to copy the tensor to host memory first.
[result-id: r42]


Edit

def denoise_one(in_path: Path, out_path: Path):
    audio, _ = load_audio(str(in_path), sr=df_state.sr())
    audio = audio.to(device)
    enhanced = enhance(model, df_state, audio)
    save_audio(str(out_path), enhanced.cpu(), df_state.sr())

def denoise_one(in_path: Path, out_path: Path):
    audio, _ = load_audio(str(in_path), sr=df_state.sr())
    enhanced = enhance(model, df_state, audio)  # keeps audio on CPU; model on cuda
    save_audio(str(out_path), enhanced, df_state.sr())


The file /home/ubuntu/main_speaker_pipeline/run_dfn3.py has been updated successfully.

def denoise_one(in_path: Path, out_path: Path):
    audio, _ = load_audio(str(in_path), sr=df_state.sr())
    enhanced = enhance(model, df_state, audio)  # keeps audio on CPU; model on cuda
    save_audio(str(out_path), enhanced, df_state.sr())

"""DeepFilterNet3 denoise speaker_00_clean.wav and all extracted overlap clips.
DFN3 expects 48kHz input internally; it'll resample as needed."""
import glob, time
from pathlib import Path
import torch
import torchaudio
from df.enhance import enhance, init_df, load_audio, save_audio

HERE = Path(__file__).parent
OUT_DIR = HERE / "denoised"
OUT_DIR.mkdir(exist_ok=True)

print("Loading DeepFilterNet3...")
model, df_state, _ = init_df()
device = "cuda" if torch.cuda.is_available() else "cpu"
print(f"Device: {device}")
model = model.to(device)

def denoise_one(in_path: Path, out_path: Path):
    audio, _ = load_audio(str(in_path), sr=df_state.sr())
    audio = audio.to(device)
    enhanced = enhance(model, df_state, audio)
    save_audio(str(out_path), enhanced.cpu(), df_state.sr())

# 1) speaker_00_clean.wav
inp = HERE / "speaker_00_clean.wav"
out = OUT_DIR / "speaker_00_clean_denoised.wav"
print(f"Denoising {inp.name} ...")
t0 = time.time()
denoise_one(inp, out)
print(f"  -> {out.name} in {time.time()-t0:.1f}s")

# 2) all extracted overlap clips
files = sorted(glob.glob(str(HERE / "extracted" / "overlap_*.wav")))
print(f"\nDenoising {len(files)} extracted overlap clips ...")
t0 = time.time()
for i, fp in enumerate(files):
    inp = Path(fp)
    out = OUT_DIR / inp.name.replace("_extracted.wav", "_denoised.wav")
    denoise_one(inp, out)
    if (i + 1) % 20 == 0 or i + 1 == len(files):
        elapsed = time.time() - t0
        eta = elapsed / (i + 1) * (len(files) - i - 1)
        print(f"  [{i+1}/{len(files)}] elapsed {elapsed:.0f}s eta {eta:.0f}s")
print(f"\nDone. Total time: {time.time()-t0:.0f}s. Output: {OUT_DIR}")

-    enhanced = enhance(model, df_state, audio)

-    save_audio(str(out_path), enhanced.cpu(), df_state.sr())

+    enhanced = enhance(model, df_state, audio)  # keeps audio on CPU; model on cuda

+    save_audio(str(out_path), enhanced, df_state.sr())


Bash

/home/ubuntu/SoloSpeech/.venv/bin/python run_dfn3.py 2>&1 | tail -20

Retry DFN3


    e0, e1, e2, e3, emb, c0, lsnr = self.enc(feat_erb, feat_spec)
  File "/home/ubuntu/SoloSpeech/.venv/lib/python3.10/site-packages/torch/nn/modules/module.py", line 1553, in _wrapped_call_impl
    return self._call_impl(*args, **kwargs)
  File "/home/ubuntu/SoloSpeech/.venv/lib/python3.10/site-packages/torch/nn/modules/module.py", line 1562, in _call_impl
    return forward_call(*args, **kwargs)
  File "/home/ubuntu/SoloSpeech/.venv/lib/python3.10/site-packages/df/deepfilternet3.py", line 183, in forward
    emb, _ = self.emb_gru(emb)  # [B, T, -1]
  File "/home/ubuntu/SoloSpeech/.venv/lib/python3.10/site-packages/torch/nn/modules/module.py", line 1553, in _wrapped_call_impl
    return self._call_impl(*args, **kwargs)
  File "/home/ubuntu/SoloSpeech/.venv/lib/python3.10/site-packages/torch/nn/modules/module.py", line 1562, in _call_impl
    return forward_call(*args, **kwargs)
  File "/home/ubuntu/SoloSpeech/.venv/lib/python3.10/site-packages/df/modules.py", line 734, in forward
    x, h = self.gru(x, h)
  File "/home/ubuntu/SoloSpeech/.venv/lib/python3.10/site-packages/torch/nn/modules/module.py", line 1553, in _wrapped_call_impl
    return self._call_impl(*args, **kwargs)
  File "/home/ubuntu/SoloSpeech/.venv/lib/python3.10/site-packages/torch/nn/modules/module.py", line 1562, in _call_impl
    return forward_call(*args, **kwargs)
  File "/home/ubuntu/SoloSpeech/.venv/lib/python3.10/site-packages/torch/nn/modules/rnn.py", line 1139, in forward
    result = _VF.gru(input, hx, self._flat_weights, self.bias, self.num_layers,
RuntimeError: cuDNN error: CUDNN_STATUS_NOT_SUPPORTED. This error may appear if you passed in a non-contiguous input.
[result-id: r43]


cuDNN GRU choking on the 12-min audio as one tensor. Switching to CPU — DFN3 on CPU is still ~10× realtime, plenty fast.


Edit

print("Loading DeepFilterNet3...")
model, df_state, _ = init_df()
device = "cuda" if torch.cuda.is_available() else "cpu"
print(f"Device: {device}")
model = model.to(device)

print("Loading DeepFilterNet3 (CPU mode)...")
import os
os.environ["CUDA_VISIBLE_DEVICES"] = ""
model, df_state, _ = init_df()
print(f"Device: cpu")


print("Loading DeepFilterNet3 (CPU mode)...")
import os
os.environ["CUDA_VISIBLE_DEVICES"] = ""
model, df_state, _ = init_df()
print(f"Device: cpu")

"""DeepFilterNet3 denoise speaker_00_clean.wav and all extracted overlap clips.
DFN3 expects 48kHz input internally; it'll resample as needed."""
import glob, time
from pathlib import Path
import torch
import torchaudio
from df.enhance import enhance, init_df, load_audio, save_audio

HERE = Path(__file__).parent
OUT_DIR = HERE / "denoised"
OUT_DIR.mkdir(exist_ok=True)

print("Loading DeepFilterNet3...")
model, df_state, _ = init_df()
device = "cuda" if torch.cuda.is_available() else "cpu"
print(f"Device: {device}")
model = model.to(device)

def denoise_one(in_path: Path, out_path: Path):
    audio, _ = load_audio(str(in_path), sr=df_state.sr())
    enhanced = enhance(model, df_state, audio)  # keeps audio on CPU; model on cuda
    save_audio(str(out_path), enhanced, df_state.sr())

# 1) speaker_00_clean.wav
inp = HERE / "speaker_00_clean.wav"
out = OUT_DIR / "speaker_00_clean_denoised.wav"
print(f"Denoising {inp.name} ...")
t0 = time.time()
denoise_one(inp, out)
print(f"  -> {out.name} in {time.time()-t0:.1f}s")

# 2) all extracted overlap clips
files = sorted(glob.glob(str(HERE / "extracted" / "overlap_*.wav")))
print(f"\nDenoising {len(files)} extracted overlap clips ...")
t0 = time.time()
for i, fp in enumerate(files):
    inp = Path(fp)
    out = OUT_DIR / inp.name.replace("_extracted.wav", "_denoised.wav")
    denoise_one(inp, out)
    if (i + 1) % 20 == 0 or i + 1 == len(files):
        elapsed = time.time() - t0
        eta = elapsed / (i + 1) * (len(files) - i - 1)
        print(f"  [{i+1}/{len(files)}] elapsed {elapsed:.0f}s eta {eta:.0f}s")
print(f"\nDone. Total time: {time.time()-t0:.0f}s. Output: {OUT_DIR}")

+print("Loading DeepFilterNet3 (CPU mode)...")

-device = "cuda" if torch.cuda.is_available() else "cpu"


Bash

/home/ubuntu/SoloSpeech/.venv/bin/python run_dfn3.py 2>&1 | tail -15

DFN3 on CPU


Device: cpu
Denoising speaker_00_clean.wav ...
  -> speaker_00_clean_denoised.wav in 26.9s

Denoising 156 extracted overlap clips ...
  [20/156] elapsed 5s eta 35s
  [40/156] elapsed 8s eta 24s
  [60/156] elapsed 12s eta 20s
  [80/156] elapsed 16s eta 15s
  [100/156] elapsed 19s eta 11s
  [120/156] elapsed 23s eta 7s
  [140/156] elapsed 28s eta 3s
  [156/156] elapsed 31s eta 0s

Done. Total time: 31s. Output: /home/ubuntu/main_speaker_pipeline/denoised
[result-id: r44]


**Done. Speaker_00_clean denoised in 27s, all 156 overlaps in 31s.**


ls /home/ubuntu/main_speaker_pipeline/denoised/ | wc -l; du -sh /home/ubuntu/main_speaker_pipeline/denoised/

Verify denoised dir


157
124M	/home/ubuntu/main_speaker_pipeline/denoised/


ls -la /home/ubuntu/main_speaker_pipeline/denoised/speaker_00_clean_denoised.wav /home/ubuntu/main_speaker_pipeline/denoised/overlap_0000_denoised.wav 2>&1; echo ---; ffprobe -v error -show_entries stream=sample_rate,channels,bits_per_raw_sample -of default=noprint_wrappers=1 /home/ubuntu/main_speaker_pipeline/denoised/overlap_0000_denoised.wav 2>&1

Check denoised file format


-rw-rw-r-- 1 ubuntu ubuntu    86094 Apr  9 13:59 /home/ubuntu/main_speaker_pipeline/denoised/overlap_0000_denoised.wav
-rw-rw-r-- 1 ubuntu ubuntu 69861198 Apr  9 13:59 /home/ubuntu/main_speaker_pipeline/denoised/speaker_00_clean_denoised.wav
---
sample_rate=48000
channels=1
bits_per_raw_sample=N/A
[result-id: r45]


Run DFN3 on all files, output to denoised/

Add denoised tracks to dashboard

Update HTML to show 3 columns: original | extracted | denoised

Install DeepFilterNet3

pip install deepfilternet in SoloSpeech venv


Updated task #22 status


/home/ubuntu/SoloSpeech/.venv/bin/python -c "
import json
data = json.load(open('similarities.json'))
for d in data:
    d['denoised'] = f'denoised/overlap_{d[\"index\"]:04d}_denoised.wav'
json.dump(data, open('similarities.json','w'), indent=2)
print('updated', len(data), 'entries with denoised path')
"

Add denoised path to similarities


updated 156 entries with denoised path


Now update the dashboard HTML to add a 3rd column and the denoised speaker_00 section.


Edit

Clean main speaker (concat, no overlaps)

speaker_00_clean.wav12:08 · 278 segments

  <audio controls preload="metadata" src="speaker_00_clean.wav"></audio>

Clean main speaker (concat, no overlaps)

speaker_00_clean.wav12:08 · 278 segments · 16 kHz

  <audio controls preload="metadata" src="speaker_00_clean.wav"></audio>

Clean main speaker — DENOISED (DeepFilterNet3)

denoised/speaker_00_clean_denoised.wav12:08 · 48 kHz · DFN3

  <audio controls preload="metadata" src="denoised/speaker_00_clean_denoised.wav"></audio>


Clean main speaker (concat, no overlaps)

speaker_00_clean.wav12:08 · 278 segments

  <audio controls preload="metadata" src="speaker_00_clean.wav"></audio>

Clean main speaker (concat, no overlaps)

speaker_00_clean.wav12:08 · 278 segments · 16 kHz

  <audio controls preload="metadata" src="speaker_00_clean.wav"></audio>

Clean main speaker — DENOISED (DeepFilterNet3)

denoised/speaker_00_clean_denoised.wav12:08 · 48 kHz · DFN3

  <audio controls preload="metadata" src="denoised/speaker_00_clean_denoised.wav"></audio>

-
speaker_00_clean.wav12:08 · 278 segments

+
speaker_00_clean.wav12:08 · 278 segments · 16 kHz

+
Clean main speaker — DENOISED (DeepFilterNet3)

+<div class="card" style="border-color: var(--good);">

+
denoised/speaker_00_clean_denoised.wav12:08 · 48 kHz · DFN3

+  <audio controls preload="metadata" src="denoised/speaker_00_clean_denoised.wav"></audio>


  .pair .row {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 16px;
  }

  .pair .row {
    display: grid;
    grid-template-columns: 1fr 1fr 1fr;
    gap: 16px;
  }


  .pair .row {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 16px;
  }

  .pair .row {
    display: grid;
    grid-template-columns: 1fr 1fr 1fr;
    gap: 16px;
  }

+    grid-template-columns: 1fr 1fr 1fr;


Original (mixed)

          <audio controls preload="none" src="${it.original}"></audio>

Extracted (SoloSpeech)

          <audio controls preload="none" src="${it.extracted}"></audio>

Original (mixed)

          <audio controls preload="none" src="${it.original}"></audio>

Extracted (SoloSpeech)

          <audio controls preload="none" src="${it.extracted}"></audio>

Denoised (DFN3)

          <audio controls preload="none" src="${it.denoised}"></audio>


Original (mixed)

          <audio controls preload="none" src="${it.original}"></audio>

Extracted (SoloSpeech)

          <audio controls preload="none" src="${it.extracted}"></audio>

Denoised (DFN3)

          <audio controls preload="none" src="${it.denoised}"></audio>

+          <audio controls preload="none" src="${it.denoised}"></audio>


Bash

/home/ubuntu/SoloSpeech/.venv/bin/python -c "
import json, re
data = json.load(open('similarities.json'))
html = open('dashboard.html').read()
# Replace the embedded DATA literal (between 'const DATA = ' and ';')
new = re.sub(r'const DATA = .*?;\n', 'const DATA = ' + json.dumps(data) + ';\n', html, count=1, flags=re.DOTALL)
open('dashboard.html', 'w').write(new)
print('Re-embedded', len(data), 'entries with denoised paths')
"

Re-embed updated data


Re-embedded 156 entries with denoised paths


curl -s -o /dev/null -w "%{http_code}\n" http://localhost:8000/dashboard.html

Verify dashboard still served


**Done.** Just refresh the dashboard:

## **https://explicit-apr-calculators-shirts.trycloudflare.com/dashboard.html**

### What's new
1. **New top section: "Clean main speaker — DENOISED"** — the 12-min concat run through DeepFilterNet3 (48 kHz output, green border to highlight)
2. **3-column overlap rows** — each pair now shows: Original (mixed) | Extracted (SoloSpeech) | Denoised (DFN3)

### Files added
- `denoised/speaker_00_clean_denoised.wav` — 70 MB, 48 kHz mono
- `denoised/overlap_0000_denoised.wav` … `overlap_0155_denoised.wav` — 156 files, 54 MB total

### A note on the denoising
DFN3 internally upsamples everything to 48 kHz (its native rate), so the denoised files are 3× the size of the 16 kHz originals. The actual content is still bandlimited to ~8 kHz from the original 16 kHz inputs, so you don't gain real bandwidth — the file is just bigger. If you want them back at 16 kHz, I can resample (smaller files, identical audio quality).


dashbaord url


fucking remove noice cancelled audios


Edit

Clean main speaker (concat, no overlaps)

speaker_00_clean.wav12:08 · 278 segments · 16 kHz

  <audio controls preload="metadata" src="speaker_00_clean.wav"></audio>

Clean main speaker — DENOISED (DeepFilterNet3)

denoised/speaker_00_clean_denoised.wav12:08 · 48 kHz · DFN3

  <audio controls preload="metadata" src="denoised/speaker_00_clean_denoised.wav"></audio>

Clean main speaker (concat, no overlaps)

speaker_00_clean.wav12:08 · 278 segments

  <audio controls preload="metadata" src="speaker_00_clean.wav"></audio>


<tool_use_error>File has been modified since read, either by the user or by a linter. Read it again before attempting to write it.</tool_use_error>

Error: File has been modified since read, either by the user or by a linter. Read it again before attempting to write it.


  .pair .row {
    display: grid;
    grid-template-columns: 1fr 1fr 1fr;
    gap: 16px;
  }

  .pair .row {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 16px;
  }


Original (mixed)

          <audio controls preload="none" src="${it.original}"></audio>

Extracted (SoloSpeech)

          <audio controls preload="none" src="${it.extracted}"></audio>

Denoised (DFN3)

          <audio controls preload="none" src="${it.denoised}"></audio>

Original (mixed)

          <audio controls preload="none" src="${it.original}"></audio>

Extracted (SoloSpeech)

          <audio controls preload="none" src="${it.extracted}"></audio>


Bash

rm -rf /home/ubuntu/main_speaker_pipeline/denoised && rm -f /home/ubuntu/main_speaker_pipeline/run_dfn3.py && ls /home/ubuntu/main_speaker_pipeline/ | head -20

Delete denoised files + script


batched_solospeech.py
build_clean_and_overlaps.py
clip.wav
compute_similarities.py
dashboard.html
diarization.json
extracted
main_speaker_ref.wav
manifest.json
overlaps
pick_reference.py
run_pyannote.py
similarities.json
source.webm
speaker_00_clean.wav
speaker_01_clean.wav
[result-id: r46]


grep -n "DENOISED\|denoised" /home/ubuntu/main_speaker_pipeline/dashboard.html | head -10

Find denoised refs in HTML


<persisted-output>
Output too large (42.4KB). Full output saved to: /home/ubuntu/.claude/projects/-home-ubuntu/b4a00fc1-fc25-4d49-bbf8-fc33235518fa/tool-results/b5ld9tefa.txt

Preview (first 2KB):
146:
Clean main speaker — DENOISED (DeepFilterNet3)

148:
denoised/speaker_00_clean_denoised.wav12:08 · 48 kHz · DFN3

149:  <audio controls preload="metadata" src="denoised/speaker_00_clean_denoised.wav"></audio>
182:const DATA = [{"index": 0, "start": 0.005, "end": 0.905, "duration": 0.9, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.1048, "original": "overlaps/overlap_0000.wav", "extracted": "extracted/overlap_0000_extracted.wav", "denoised": "denoised/overlap_0000_denoised.wav"}, {"index": 1, "start": 17.605, "end": 24.745, "duration": 7.14, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.7385, "original": "overlaps/overlap_0001.wav", "extracted": "extracted/overlap_0001_extracted.wav", "denoised": "denoised/overlap_0001_denoised.wav"}, {"index": 2, "start": 44.845, "end": 50.225, "duration": 5.38, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.7748, "original": "overlaps/overlap_0002.wav", "extracted": "extracted/overlap_0002_extracted.wav", "denoised": "denoised/overlap_0002_denoised.wav"}, {"index": 3, "start": 51.185, "end": 54.725, "duration": 3.54, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.6929, "original": "overlaps/overlap_0003.wav", "extracted": "extracted/overlap_0003_extracted.wav", "denoised": "denoised/overlap_0003_denoised.wav"}, {"index": 4, "start": 74.405, "end": 77.905, "duration": 3.5, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.6348, "original": "overlaps/overlap_0004.wav", "extracted": "extracted/overlap_0004_extracted.wav", "denoised": "denoised/overlap_0004_denoised.wav"}, {"index": 5, "start": 89.505, "end": 92.025, "duration": 2.52, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.6561, "original": "overlaps/overlap_0005.wav", "extracted": "extracted/overlap_0005_extracted.wav", "denoised": "denoised/overlap_0005_denoised.wav"}, {"index": 6, "start": 95.285, "end": 104.365, "duration": 9.08, "speakers": ["SPEA
...
</persisted-output>
[result-id: r47]

146:
Clean main speaker — DENOISED (DeepFilterNet3)

148:
denoised/speaker_00_clean_denoised.wav12:08 · 48 kHz · DFN3

149:  <audio controls preload="metadata" src="denoised/speaker_00_clean_denoised.wav"></audio>
182:const DATA = [{"index": 0, "start": 0.005, "end": 0.905, "duration": 0.9, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.1048, "original": "overlaps/overlap_0000.wav", "extracted": "extracted/overlap_0000_extracted.wav", "denoised": "denoised/overlap_0000_denoised.wav"}, {"index": 1, "start": 17.605, "end": 24.745, "duration": 7.14, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.7385, "original": "overlaps/overlap_0001.wav", "extracted": "extracted/overlap_0001_extracted.wav", "denoised": "denoised/overlap_0001_denoised.wav"}, {"index": 2, "start": 44.845, "end": 50.225, "duration": 5.38, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.7748, "original": "overlaps/overlap_0002.wav", "extracted": "extracted/overlap_0002_extracted.wav", "denoised": "denoised/overlap_0002_denoised.wav"}, {"index": 3, "start": 51.185, "end": 54.725, "duration": 3.54, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.6929, "original": "overlaps/overlap_0003.wav", "extracted": "extracted/overlap_0003_extracted.wav", "denoised": "denoised/overlap_0003_denoised.wav"}, {"index": 4, "start": 74.405, "end": 77.905, "duration": 3.5, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.6348, "original": "overlaps/overlap_0004.wav", "extracted": "extracted/overlap_0004_extracted.wav", "denoised": "denoised/overlap_0004_denoised.wav"}, {"index": 5, "start": 89.505, "end": 92.025, "duration": 2.52, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.6561, "original": "overlaps/overlap_0005.wav", "extracted": "extracted/overlap_0005_extracted.wav", "denoised": "denoised/overlap_0005_denoised.wav"}, {"index": 6, "start": 95.285, "end": 104.365, "duration": 9.08, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.7992, "original": "overlaps/overlap_0006.wav", "extracted": "extracted/overlap_0006_extracted.wav", "denoised": "denoised/overlap_0006_denoised.wav"}, {"index": 7, "start": 104.685, "end": 106.445, "duration": 1.76, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.6098, "original": "overlaps/overlap_0007.wav", "extracted": "extracted/overlap_0007_extracted.wav", "denoised": "denoised/overlap_0007_denoised.wav"}, {"index": 8, "start": 106.845, "end": 108.005, "duration": 1.16, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.4526, "original": "overlaps/overlap_0008.wav", "extracted": "extracted/overlap_0008_extracted.wav", "denoised": "denoised/overlap_0008_denoised.wav"}, {"index": 9, "start": 131.365, "end": 136.165, "duration": 4.8, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.7525, "original": "overlaps/overlap_0009.wav", "extracted": "extracted/overlap_0009_extracted.wav", "denoised": "denoised/overlap_0009_denoised.wav"}, {"index": 10, "start": 139.105, "end": 143.145, "duration": 4.04, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.6868, "original": "overlaps/overlap_0010.wav", "extracted": "extracted/overlap_0010_extracted.wav", "denoised": "denoised/overlap_0010_denoised.wav"}, {"index": 11, "start": 143.385, "end": 146.185, "duration": 2.8, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.5642, "original": "overlaps/overlap_0011.wav", "extracted": "extracted/overlap_0011_extracted.wav", "denoised": "denoised/overlap_0011_denoised.wav"}, {"index": 12, "start": 150.225, "end": 153.445, "duration": 3.22, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.7006, "original": "overlaps/overlap_0012.wav", "extracted": "extracted/overlap_0012_extracted.wav", "denoised": "denoised/overlap_0012_denoised.wav"}, {"index": 13, "start": 154.965, "end": 157.905, "duration": 2.94, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.5808, "original": "overlaps/overlap_0013.wav", "extracted": "extracted/overlap_0013_extracted.wav", "denoised": "denoised/overlap_0013_denoised.wav"}, {"index": 14, "start": 157.925, "end": 162.765, "duration": 4.84, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.1059, "original": "overlaps/overlap_0014.wav", "extracted": "extracted/overlap_0014_extracted.wav", "denoised": "denoised/overlap_0014_denoised.wav"}, {"index": 15, "start": 169.485, "end": 172.325, "duration": 2.84, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.5417, "original": "overlaps/overlap_0015.wav", "extracted": "extracted/overlap_0015_extracted.wav", "denoised": "denoised/overlap_0015_denoised.wav"}, {"index": 16, "start": 174.705, "end": 176.765, "duration": 2.06, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.6227, "original": "overlaps/overlap_0016.wav", "extracted": "extracted/overlap_0016_extracted.wav", "denoised": "denoised/overlap_0016_denoised.wav"}, {"index": 17, "start": 187.165, "end": 192.725, "duration": 5.56, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.7821, "original": "overlaps/overlap_0017.wav", "extracted": "extracted/overlap_0017_extracted.wav", "denoised": "denoised/overlap_0017_denoised.wav"}, {"index": 18, "start": 192.945, "end": 197.265, "duration": 4.32, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.6879, "original": "overlaps/overlap_0018.wav", "extracted": "extracted/overlap_0018_extracted.wav", "denoised": "denoised/overlap_0018_denoised.wav"}, {"index": 19, "start": 197.565, "end": 200.925, "duration": 3.36, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.6793, "original": "overlaps/overlap_0019.wav", "extracted": "extracted/overlap_0019_extracted.wav", "denoised": "denoised/overlap_0019_denoised.wav"}, {"index": 20, "start": 210.345, "end": 217.405, "duration": 7.06, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.6583, "original": "overlaps/overlap_0020.wav", "extracted": "extracted/overlap_0020_extracted.wav", "denoised": "denoised/overlap_0020_denoised.wav"}, {"index": 21, "start": 217.845, "end": 219.865, "duration": 2.02, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.6565, "original": "overlaps/overlap_0021.wav", "extracted": "extracted/overlap_0021_extracted.wav", "denoised": "denoised/overlap_0021_denoised.wav"}, {"index": 22, "start": 226.345, "end": 229.525, "duration": 3.18, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.6833, "original": "overlaps/overlap_0022.wav", "extracted": "extracted/overlap_0022_extracted.wav", "denoised": "denoised/overlap_0022_denoised.wav"}, {"index": 23, "start": 231.005, "end": 233.565, "duration": 2.56, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.6786, "original": "overlaps/overlap_0023.wav", "extracted": "extracted/overlap_0023_extracted.wav", "denoised": "denoised/overlap_0023_denoised.wav"}, {"index": 24, "start": 237.305, "end": 242.625, "duration": 5.32, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.8131, "original": "overlaps/overlap_0024.wav", "extracted": "extracted/overlap_0024_extracted.wav", "denoised": "denoised/overlap_0024_denoised.wav"}, {"index": 25, "start": 247.025, "end": 250.905, "duration": 3.88, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.7566, "original": "overlaps/overlap_0025.wav", "extracted": "extracted/overlap_0025_extracted.wav", "denoised": "denoised/overlap_0025_denoised.wav"}, {"index": 26, "start": 254.865, "end": 257.905, "duration": 3.04, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.7635, "original": "overlaps/overlap_0026.wav", "extracted": "extracted/overlap_0026_extracted.wav", "denoised": "denoised/overlap_0026_denoised.wav"}, {"index": 27, "start": 257.925, "end": 260.125, "duration": 2.2, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.1649, "original": "overlaps/overlap_0027.wav", "extracted": "extracted/overlap_0027_extracted.wav", "denoised": "denoised/overlap_0027_denoised.wav"}, {"index": 28, "start": 267.945, "end": 272.145, "duration": 4.2, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.6482, "original": "overlaps/overlap_0028.wav", "extracted": "extracted/overlap_0028_extracted.wav", "denoised": "denoised/overlap_0028_denoised.wav"}, {"index": 29, "start": 276.165, "end": 278.065, "duration": 1.9, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.5188, "original": "overlaps/overlap_0029.wav", "extracted": "extracted/overlap_0029_extracted.wav", "denoised": "denoised/overlap_0029_denoised.wav"}, {"index": 30, "start": 278.325, "end": 283.145, "duration": 4.82, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.6667, "original": "overlaps/overlap_0030.wav", "extracted": "extracted/overlap_0030_extracted.wav", "denoised": "denoised/overlap_0030_denoised.wav"}, {"index": 31, "start": 285.345, "end": 288.645, "duration": 3.3, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.6463, "original": "overlaps/overlap_0031.wav", "extracted": "extracted/overlap_0031_extracted.wav", "denoised": "denoised/overlap_0031_denoised.wav"}, {"index": 32, "start": 291.245, "end": 293.105, "duration": 1.86, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.5169, "original": "overlaps/overlap_0032.wav", "extracted": "extracted/overlap_0032_extracted.wav", "denoised": "denoised/overlap_0032_denoised.wav"}, {"index": 33, "start": 293.405, "end": 295.305, "duration": 1.9, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.5607, "original": "overlaps/overlap_0033.wav", "extracted": "extracted/overlap_0033_extracted.wav", "denoised": "denoised/overlap_0033_denoised.wav"}, {"index": 34, "start": 306.305, "end": 313.245, "duration": 6.94, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.7397, "original": "overlaps/overlap_0034.wav", "extracted": "extracted/overlap_0034_extracted.wav", "denoised": "denoised/overlap_0034_denoised.wav"}, {"index": 35, "start": 317.585, "end": 319.865, "duration": 2.28, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.6352, "original": "overlaps/overlap_0035.wav", "extracted": "extracted/overlap_0035_extracted.wav", "denoised": "denoised/overlap_0035_denoised.wav"}, {"index": 36, "start": 331.105, "end": 333.545, "duration": 2.44, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.6301, "original": "overlaps/overlap_0036.wav", "extracted": "extracted/overlap_0036_extracted.wav", "denoised": "denoised/overlap_0036_denoised.wav"}, {"index": 37, "start": 338.865, "end": 342.245, "duration": 3.38, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.748, "original": "overlaps/overlap_0037.wav", "extracted": "extracted/overlap_0037_extracted.wav", "denoised": "denoised/overlap_0037_denoised.wav"}, {"index": 38, "start": 344.585, "end": 347.525, "duration": 2.94, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.6783, "original": "overlaps/overlap_0038.wav", "extracted": "extracted/overlap_0038_extracted.wav", "denoised": "denoised/overlap_0038_denoised.wav"}, {"index": 39, "start": 348.025, "end": 349.645, "duration": 1.62, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.3061, "original": "overlaps/overlap_0039.wav", "extracted": "extracted/overlap_0039_extracted.wav", "denoised": "denoised/overlap_0039_denoised.wav"}, {"index": 40, "start": 349.805, "end": 359.005, "duration": 9.2, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.7725, "original": "overlaps/overlap_0040.wav", "extracted": "extracted/overlap_0040_extracted.wav", "denoised": "denoised/overlap_0040_denoised.wav"}, {"index": 41, "start": 361.905, "end": 362.865, "duration": 0.96, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.4781, "original": "overlaps/overlap_0041.wav", "extracted": "extracted/overlap_0041_extracted.wav", "denoised": "denoised/overlap_0041_denoised.wav"}, {"index": 42, "start": 363.145, "end": 365.865, "duration": 2.72, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.7078, "original": "overlaps/overlap_0042.wav", "extracted": "extracted/overlap_0042_extracted.wav", "denoised": "denoised/overlap_0042_denoised.wav"}, {"index": 43, "start": 385.625, "end": 391.025, "duration": 5.4, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.6577, "original": "overlaps/overlap_0043.wav", "extracted": "extracted/overlap_0043_extracted.wav", "denoised": "denoised/overlap_0043_denoised.wav"}, {"index": 44, "start": 403.165, "end": 404.365, "duration": 1.2, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.4669, "original": "overlaps/overlap_0044.wav", "extracted": "extracted/overlap_0044_extracted.wav", "denoised": "denoised/overlap_0044_denoised.wav"}, {"index": 45, "start": 408.925, "end": 412.645, "duration": 3.72, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.6535, "original": "overlaps/overlap_0045.wav", "extracted": "extracted/overlap_0045_extracted.wav", "denoised": "denoised/overlap_0045_denoised.wav"}, {"index": 46, "start": 412.665, "end": 416.285, "duration": 3.62, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.6895, "original": "overlaps/overlap_0046.wav", "extracted": "extracted/overlap_0046_extracted.wav", "denoised": "denoised/overlap_0046_denoised.wav"}, {"index": 47, "start": 420.445, "end": 424.665, "duration": 4.22, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.7072, "original": "overlaps/overlap_0047.wav", "extracted": "extracted/overlap_0047_extracted.wav", "denoised": "denoised/overlap_0047_denoised.wav"}, {"index": 48, "start": 430.885, "end": 434.285, "duration": 3.4, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.7019, "original": "overlaps/overlap_0048.wav", "extracted": "extracted/overlap_0048_extracted.wav", "denoised": "denoised/overlap_0048_denoised.wav"}, {"index": 49, "start": 440.805, "end": 444.525, "duration": 3.72, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.6208, "original": "overlaps/overlap_0049.wav", "extracted": "extracted/overlap_0049_extracted.wav", "denoised": "denoised/overlap_0049_denoised.wav"}, {"index": 50, "start": 444.885, "end": 448.545, "duration": 3.66, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.6824, "original": "overlaps/overlap_0050.wav", "extracted": "extracted/overlap_0050_extracted.wav", "denoised": "denoised/overlap_0050_denoised.wav"}, {"index": 51, "start": 497.565, "end": 502.985, "duration": 5.42, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.1762, "original": "overlaps/overlap_0051.wav", "extracted": "extracted/overlap_0051_extracted.wav", "denoised": "denoised/overlap_0051_denoised.wav"}, {"index": 52, "start": 506.785, "end": 510.965, "duration": 4.18, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.3452, "original": "overlaps/overlap_0052.wav", "extracted": "extracted/overlap_0052_extracted.wav", "denoised": "denoised/overlap_0052_denoised.wav"}, {"index": 53, "start": 513.385, "end": 515.905, "duration": 2.52, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.6831, "original": "overlaps/overlap_0053.wav", "extracted": "extracted/overlap_0053_extracted.wav", "denoised": "denoised/overlap_0053_denoised.wav"}, {"index": 54, "start": 516.025, "end": 519.985, "duration": 3.96, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.7591, "original": "overlaps/overlap_0054.wav", "extracted": "extracted/overlap_0054_extracted.wav", "denoised": "denoised/overlap_0054_denoised.wav"}, {"index": 55, "start": 520.305, "end": 524.305, "duration": 4.0, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.6749, "original": "overlaps/overlap_0055.wav", "extracted": "extracted/overlap_0055_extracted.wav", "denoised": "denoised/overlap_0055_denoised.wav"}, {"index": 56, "start": 524.485, "end": 536.485, "duration": 12.0, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.8088, "original": "overlaps/overlap_0056.wav", "extracted": "extracted/overlap_0056_extracted.wav", "denoised": "denoised/overlap_0056_denoised.wav"}, {"index": 57, "start": 542.765, "end": 544.465, "duration": 1.7, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.6371, "original": "overlaps/overlap_0057.wav", "extracted": "extracted/overlap_0057_extracted.wav", "denoised": "denoised/overlap_0057_denoised.wav"}, {"index": 58, "start": 570.585, "end": 573.485, "duration": 2.9, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.7107, "original": "overlaps/overlap_0058.wav", "extracted": "extracted/overlap_0058_extracted.wav", "denoised": "denoised/overlap_0058_denoised.wav"}, {"index": 59, "start": 578.605, "end": 586.885, "duration": 8.28, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.7323, "original": "overlaps/overlap_0059.wav", "extracted": "extracted/overlap_0059_extracted.wav", "denoised": "denoised/overlap_0059_denoised.wav"}, {"index": 60, "start": 587.765, "end": 592.245, "duration": 4.48, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.701, "original": "overlaps/overlap_0060.wav", "extracted": "extracted/overlap_0060_extracted.wav", "denoised": "denoised/overlap_0060_denoised.wav"}, {"index": 61, "start": 594.385, "end": 596.545, "duration": 2.16, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.6771, "original": "overlaps/overlap_0061.wav", "extracted": "extracted/overlap_0061_extracted.wav", "denoised": "denoised/overlap_0061_denoised.wav"}, {"index": 62, "start": 602.865, "end": 606.645, "duration": 3.78, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.6241, "original": "overlaps/overlap_0062.wav", "extracted": "extracted/overlap_0062_extracted.wav", "denoised": "denoised/overlap_0062_denoised.wav"}, {"index": 63, "start": 647.725, "end": 651.825, "duration": 4.1, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.6818, "original": "overlaps/overlap_0063.wav", "extracted": "extracted/overlap_0063_extracted.wav", "denoised": "denoised/overlap_0063_denoised.wav"}, {"index": 64, "start": 656.245, "end": 658.645, "duration": 2.4, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.6463, "original": "overlaps/overlap_0064.wav", "extracted": "extracted/overlap_0064_extracted.wav", "denoised": "denoised/overlap_0064_denoised.wav"}, {"index": 65, "start": 661.345, "end": 665.325, "duration": 3.98, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.6501, "original": "overlaps/overlap_0065.wav", "extracted": "extracted/overlap_0065_extracted.wav", "denoised": "denoised/overlap_0065_denoised.wav"}, {"index": 66, "start": 671.025, "end": 675.005, "duration": 3.98, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.5851, "original": "overlaps/overlap_0066.wav", "extracted": "extracted/overlap_0066_extracted.wav", "denoised": "denoised/overlap_0066_denoised.wav"}, {"index": 67, "start": 687.065, "end": 689.945, "duration": 2.88, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.6884, "original": "overlaps/overlap_0067.wav", "extracted": "extracted/overlap_0067_extracted.wav", "denoised": "denoised/overlap_0067_denoised.wav"}, {"index": 68, "start": 740.965, "end": 745.405, "duration": 4.44, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.6477, "original": "overlaps/overlap_0068.wav", "extracted": "extracted/overlap_0068_extracted.wav", "denoised": "denoised/overlap_0068_denoised.wav"}, {"index": 69, "start": 753.885, "end": 757.905, "duration": 4.02, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.643, "original": "overlaps/overlap_0069.wav", "extracted": "extracted/overlap_0069_extracted.wav", "denoised": "denoised/overlap_0069_denoised.wav"}, {"index": 70, "start": 787.645, "end": 791.825, "duration": 4.18, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.5953, "original": "overlaps/overlap_0070.wav", "extracted": "extracted/overlap_0070_extracted.wav", "denoised": "denoised/overlap_0070_denoised.wav"}, {"index": 71, "start": 792.545, "end": 795.565, "duration": 3.02, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.3746, "original": "overlaps/overlap_0071.wav", "extracted": "extracted/overlap_0071_extracted.wav", "denoised": "denoised/overlap_0071_denoised.wav"}, {"index": 72, "start": 815.165, "end": 817.605, "duration": 2.44, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.7104, "original": "overlaps/overlap_0072.wav", "extracted": "extracted/overlap_0072_extracted.wav", "denoised": "denoised/overlap_0072_denoised.wav"}, {"index": 73, "start": 821.765, "end": 826.785, "duration": 5.02, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.6386, "original": "overlaps/overlap_0073.wav", "extracted": "extracted/overlap_0073_extracted.wav", "denoised": "denoised/overlap_0073_denoised.wav"}, {"index": 74, "start": 832.565, "end": 834.405, "duration": 1.84, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.5414, "original": "overlaps/overlap_0074.wav", "extracted": "extracted/overlap_0074_extracted.wav", "denoised": "denoised/overlap_0074_denoised.wav"}, {"index": 75, "start": 835.045, "end": 836.985, "duration": 1.94, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.5146, "original": "overlaps/overlap_0075.wav", "extracted": "extracted/overlap_0075_extracted.wav", "denoised": "denoised/overlap_0075_denoised.wav"}, {"index": 76, "start": 837.085, "end": 841.525, "duration": 4.44, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.7192, "original": "overlaps/overlap_0076.wav", "extracted": "extracted/overlap_0076_extracted.wav", "denoised": "denoised/overlap_0076_denoised.wav"}, {"index": 77, "start": 855.165, "end": 859.585, "duration": 4.42, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.7281, "original": "overlaps/overlap_0077.wav", "extracted": "extracted/overlap_0077_extracted.wav", "denoised": "denoised/overlap_0077_denoised.wav"}, {"index": 78, "start": 860.185, "end": 864.045, "duration": 3.86, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.6982, "original": "overlaps/overlap_0078.wav", "extracted": "extracted/overlap_0078_extracted.wav", "denoised": "denoised/overlap_0078_denoised.wav"}, {"index": 79, "start": 867.765, "end": 870.825, "duration": 3.06, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.6305, "original": "overlaps/overlap_0079.wav", "extracted": "extracted/overlap_0079_extracted.wav", "denoised": "denoised/overlap_0079_denoised.wav"}, {"index": 80, "start": 879.285, "end": 882.205, "duration": 2.92, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.5753, "original": "overlaps/overlap_0080.wav", "extracted": "extracted/overlap_0080_extracted.wav", "denoised": "denoised/overlap_0080_denoised.wav"}, {"index": 81, "start": 888.845, "end": 894.005, "duration": 5.16, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.7146, "original": "overlaps/overlap_0081.wav", "extracted": "extracted/overlap_0081_extracted.wav", "denoised": "denoised/overlap_0081_denoised.wav"}, {"index": 82, "start": 899.765, "end": 904.025, "duration": 4.26, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.6843, "original": "overlaps/overlap_0082.wav", "extracted": "extracted/overlap_0082_extracted.wav", "denoised": "denoised/overlap_0082_denoised.wav"}, {"index": 83, "start": 920.545, "end": 923.505, "duration": 2.96, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.6723, "original": "overlaps/overlap_0083.wav", "extracted": "extracted/overlap_0083_extracted.wav", "denoised": "denoised/overlap_0083_denoised.wav"}, {"index": 84, "start": 989.385, "end": 993.665, "duration": 4.28, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.7205, "original": "overlaps/overlap_0084.wav", "extracted": "extracted/overlap_0084_extracted.wav", "denoised": "denoised/overlap_0084_denoised.wav"}, {"index": 85, "start": 994.025, "end": 997.865, "duration": 3.84, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.7102, "original": "overlaps/overlap_0085.wav", "extracted": "extracted/overlap_0085_extracted.wav", "denoised": "denoised/overlap_0085_denoised.wav"}, {"index": 86, "start": 1001.505, "end": 1009.005, "duration": 7.5, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.7515, "original": "overlaps/overlap_0086.wav", "extracted": "extracted/overlap_0086_extracted.wav", "denoised": "denoised/overlap_0086_denoised.wav"}, {"index": 87, "start": 1009.505, "end": 1012.865, "duration": 3.36, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.6573, "original": "overlaps/overlap_0087.wav", "extracted": "extracted/overlap_0087_extracted.wav", "denoised": "denoised/overlap_0087_denoised.wav"}, {"index": 88, "start": 1017.145, "end": 1018.905, "duration": 1.76, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.7753, "original": "overlaps/overlap_0088.wav", "extracted": "extracted/overlap_0088_extracted.wav", "denoised": "denoised/overlap_0088_denoised.wav"}, {"index": 89, "start": 1026.825, "end": 1030.585, "duration": 3.76, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.6443, "original": "overlaps/overlap_0089.wav", "extracted": "extracted/overlap_0089_extracted.wav", "denoised": "denoised/overlap_0089_denoised.wav"}, {"index": 90, "start": 1036.725, "end": 1042.925, "duration": 6.2, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.7718, "original": "overlaps/overlap_0090.wav", "extracted": "extracted/overlap_0090_extracted.wav", "denoised": "denoised/overlap_0090_denoised.wav"}, {"index": 91, "start": 1043.485, "end": 1048.905, "duration": 5.42, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.7031, "original": "overlaps/overlap_0091.wav", "extracted": "extracted/overlap_0091_extracted.wav", "denoised": "denoised/overlap_0091_denoised.wav"}, {"index": 92, "start": 1066.505, "end": 1068.085, "duration": 1.58, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.5212, "original": "overlaps/overlap_0092.wav", "extracted": "extracted/overlap_0092_extracted.wav", "denoised": "denoised/overlap_0092_denoised.wav"}, {"index": 93, "start": 1072.225, "end": 1076.565, "duration": 4.34, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.6372, "original": "overlaps/overlap_0093.wav", "extracted": "extracted/overlap_0093_extracted.wav", "denoised": "denoised/overlap_0093_denoised.wav"}, {"index": 94, "start": 1080.365, "end": 1082.945, "duration": 2.58, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.487, "original": "overlaps/overlap_0094.wav", "extracted": "extracted/overlap_0094_extracted.wav", "denoised": "denoised/overlap_0094_denoised.wav"}, {"index": 95, "start": 1089.805, "end": 1096.925, "duration": 7.12, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.6642, "original": "overlaps/overlap_0095.wav", "extracted": "extracted/overlap_0095_extracted.wav", "denoised": "denoised/overlap_0095_denoised.wav"}, {"index": 96, "start": 1101.665, "end": 1105.245, "duration": 3.58, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.756, "original": "overlaps/overlap_0096.wav", "extracted": "extracted/overlap_0096_extracted.wav", "denoised": "denoised/overlap_0096_denoised.wav"}, {"index": 97, "start": 1105.405, "end": 1109.105, "duration": 3.7, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.6931, "original": "overlaps/overlap_0097.wav", "extracted": "extracted/overlap_0097_extracted.wav", "denoised": "denoised/overlap_0097_denoised.wav"}, {"index": 98, "start": 1109.605, "end": 1120.205, "duration": 10.6, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.7935, "original": "overlaps/overlap_0098.wav", "extracted": "extracted/overlap_0098_extracted.wav", "denoised": "denoised/overlap_0098_denoised.wav"}, {"index": 99, "start": 1120.645, "end": 1125.125, "duration": 4.48, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.6879, "original": "overlaps/overlap_0099.wav", "extracted": "extracted/overlap_0099_extracted.wav", "denoised": "denoised/overlap_0099_denoised.wav"}, {"index": 100, "start": 1126.865, "end": 1128.425, "duration": 1.56, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.3929, "original": "overlaps/overlap_0100.wav", "extracted": "extracted/overlap_0100_extracted.wav", "denoised": "denoised/overlap_0100_denoised.wav"}, {"index": 101, "start": 1128.645, "end": 1139.025, "duration": 10.38, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.7843, "original": "overlaps/overlap_0101.wav", "extracted": "extracted/overlap_0101_extracted.wav", "denoised": "denoised/overlap_0101_denoised.wav"}, {"index": 102, "start": 1143.145, "end": 1149.785, "duration": 6.64, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.7148, "original": "overlaps/overlap_0102.wav", "extracted": "extracted/overlap_0102_extracted.wav", "denoised": "denoised/overlap_0102_denoised.wav"}, {"index": 103, "start": 1150.565, "end": 1153.605, "duration": 3.04, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.62, "original": "overlaps/overlap_0103.wav", "extracted": "extracted/overlap_0103_extracted.wav", "denoised": "denoised/overlap_0103_denoised.wav"}, {"index": 104, "start": 1168.785, "end": 1174.025, "duration": 5.24, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.6696, "original": "overlaps/overlap_0104.wav", "extracted": "extracted/overlap_0104_extracted.wav", "denoised": "denoised/overlap_0104_denoised.wav"}, {"index": 105, "start": 1174.105, "end": 1178.145, "duration": 4.04, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.624, "original": "overlaps/overlap_0105.wav", "extracted": "extracted/overlap_0105_extracted.wav", "denoised": "denoised/overlap_0105_denoised.wav"}, {"index": 106, "start": 1191.945, "end": 1193.605, "duration": 1.66, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.6132, "original": "overlaps/overlap_0106.wav", "extracted": "extracted/overlap_0106_extracted.wav", "denoised": "denoised/overlap_0106_denoised.wav"}, {"index": 107, "start": 1201.585, "end": 1209.965, "duration": 8.38, "speakers": ["SPEAKER_00", "SPEAKER_01"], "similarity": 0.7872, "original": "overlaps/overlap_0107.wav", "extracted": "extracted/overlap_0107_extracted.wav", "denoised": "denoised/overlap_0107_denoised.wav"}, {"index


Error: File content (17180 tokens) exceeds maximum allowed tokens (10000). Use offset and limit parameters to read specific portions of the file, or search for specific content instead of reading the whole file.


144

145
146
Clean main speaker — DENOISED (DeepFilterNet3)

147

148
denoised/speaker_00_clean_denoised.wav12:08 · 48 kHz · DFN3

149	  <audio controls preload="metadata" src="denoised/speaker_00_clean_denoised.wav"></audio>
150

151
152
Other speaker (for context)

153

154
speaker_01_clean.wav2:27 · 75 segments

155	  <audio controls preload="metadata" src="speaker_01_clean.wav"></audio>
[result-id: r48]

Clean main speaker — DENOISED (DeepFilterNet3)

denoised/speaker_00_clean_denoised.wav12:08 · 48 kHz · DFN3

  <audio controls preload="metadata" src="denoised/speaker_00_clean_denoised.wav"></audio>

Other speaker (for context)

speaker_01_clean.wav2:27 · 75 segments

  <audio controls preload="metadata" src="speaker_01_clean.wav"></audio>


Edit

Clean main speaker — DENOISED (DeepFilterNet3)

denoised/speaker_00_clean_denoised.wav12:08 · 48 kHz · DFN3

  <audio controls preload="metadata" src="denoised/speaker_00_clean_denoised.wav"></audio>


The file /home/ubuntu/main_speaker_pipeline/dashboard.html has been updated successfully.

Clean main speaker — DENOISED (DeepFilterNet3)

denoised/speaker_00_clean_denoised.wav12:08 · 48 kHz · DFN3

  <audio controls preload="metadata" src="denoised/speaker_00_clean_denoised.wav"></audio>

-
Clean main speaker — DENOISED (DeepFilterNet3)

-<div class="card" style="border-color: var(--good);">

-
denoised/speaker_00_clean_denoised.wav12:08 · 48 kHz · DFN3

-  <audio controls preload="metadata" src="denoised/speaker_00_clean_denoised.wav"></audio>


  .pair .row {
    display: grid;
    grid-template-columns: 1fr 1fr 1fr;
    gap: 16px;
  }

  .pair .row {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 16px;
  }


  .pair .row {
    display: grid;
    grid-template-columns: 1fr 1fr 1fr;
    gap: 16px;
  }

  .pair .row {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 16px;
  }

-    grid-template-columns: 1fr 1fr 1fr;


Extracted (SoloSpeech)

          <audio controls preload="none" src="${it.extracted}"></audio>

Denoised (DFN3)

          <audio controls preload="none" src="${it.denoised}"></audio>

Extracted (SoloSpeech)

          <audio controls preload="none" src="${it.extracted}"></audio>


Extracted (SoloSpeech)

          <audio controls preload="none" src="${it.extracted}"></audio>

Denoised (DFN3)

          <audio controls preload="none" src="${it.denoised}"></audio>

-          <audio controls preload="none" src="${it.denoised}"></audio>


Done. Refresh: **https://explicit-apr-calculators-shirts.trycloudflare.com/dashboard.html**

- Removed denoised speaker_00 section
- Removed denoised column from overlap rows (back to 2 columns)
- Deleted `denoised/` folder (124 MB freed)
- Deleted `run_dfn3.py`

Note: the embedded JSON in the page still has a `denoised` field per row but it's no longer rendered, so the dashboard ignores it. If you want me to also strip those references from the JSON, say so.