From f8d1c79fe355efb18ae49e4363307dfec3ab89ce Mon Sep 17 00:00:00 2001
From: 雾聪 <wucong.lyb@alibaba-inc.com>
Date: 星期一, 07 八月 2023 16:14:11 +0800
Subject: [PATCH] Merge branch 'main' of https://github.com/alibaba-damo-academy/FunASR into main

---
 egs/callhome/eend_ola/local/random_mixture.py |  145 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 145 insertions(+), 0 deletions(-)

diff --git a/egs/callhome/eend_ola/local/random_mixture.py b/egs/callhome/eend_ola/local/random_mixture.py
new file mode 100755
index 0000000..05d7828
--- /dev/null
+++ b/egs/callhome/eend_ola/local/random_mixture.py
@@ -0,0 +1,145 @@
+#!/usr/bin/env python3
+
+# Copyright 2019 Hitachi, Ltd. (author: Yusuke Fujita)
+# Licensed under the MIT license.
+
+"""
+This script generates random multi-talker mixtures for diarization.
+It generates a scp-like outputs: lines of "[recid] [json]".
+    recid: recording id of mixture
+        serial numbers like mix_0000001, mix_0000002, ...
+    json: mixture configuration formatted in "one-line"
+The json format is as following:
+{
+ 'speakers':[                    # list of speakers
+    {
+     'spkid': 'Name',             # speaker id
+     'rir': '/rirdir/rir.wav',    # wav_rxfilename of room impulse response
+     'utts': [                    # list of wav_rxfilenames of utterances
+        '/wavdir/utt1.wav',
+        '/wavdir/utt2.wav',...],
+     'intervals': [1.2, 3.4, ...] # list of silence durations before utterances
+    }, ... ],
+ 'noise': '/noisedir/noise.wav'   # wav_rxfilename of background noise
+ 'snr': 15.0,                     # SNR for mixing background noise
+ 'recid': 'mix_000001'            # recording id of the mixture
+}
+
+Usage:
+    common/random_mixture.py \
+        --n_mixtures=10000 \      # number of mixtures
+        data/voxceleb1_train \    # kaldi-style data dir of utterances
+        data/musan_noise_bg \     # background noises
+        data/simu_rirs \          # room impulse responses
+        > mixture.scp             # output scp-like file
+
+The actual data dir and wav files are generated using make_mixture.py:
+    common/make_mixture.py \
+        mixture.scp \             # scp-like file for mixture
+        data/mixture \            # output data dir
+        wav/mixture               # output wav dir
+"""
+
+import argparse
+import os
+from funasr.modules.eend_ola.utils import kaldi_data
+import random
+import numpy as np
+import json
+import itertools
+
+parser = argparse.ArgumentParser()
+parser.add_argument('data_dir',
+                    help='data dir of single-speaker recordings')
+parser.add_argument('noise_dir',
+                    help='data dir of background noise recordings')
+parser.add_argument('rir_dir',
+                    help='data dir of room impulse responses')
+parser.add_argument('--n_mixtures', type=int, default=10,
+                    help='number of mixture recordings')
+parser.add_argument('--n_speakers', type=int, default=4,
+                    help='number of speakers in a mixture')
+parser.add_argument('--min_utts', type=int, default=10,
+                    help='minimum number of uttenraces per speaker')
+parser.add_argument('--max_utts', type=int, default=20,
+                    help='maximum number of utterances per speaker')
+parser.add_argument('--sil_scale', type=float, default=10.0,
+                    help='average silence time')
+parser.add_argument('--noise_snrs', default="10:15:20",
+                    help='colon-delimited SNRs for background noises')
+parser.add_argument('--random_seed', type=int, default=777,
+                    help='random seed')
+parser.add_argument('--speech_rvb_probability', type=float, default=1,
+                    help='reverb probability')
+args = parser.parse_args()
+
+random.seed(args.random_seed)
+np.random.seed(args.random_seed)
+
+# load list of wav files from kaldi-style data dirs
+wavs = kaldi_data.load_wav_scp(
+        os.path.join(args.data_dir, 'wav.scp'))
+noises = kaldi_data.load_wav_scp(
+        os.path.join(args.noise_dir, 'wav.scp'))
+rirs = kaldi_data.load_wav_scp(
+        os.path.join(args.rir_dir, 'wav.scp'))
+
+# spk2utt is used for counting number of utterances per speaker
+spk2utt = kaldi_data.load_spk2utt(
+        os.path.join(args.data_dir, 'spk2utt'))
+
+segments = kaldi_data.load_segments_hash(
+        os.path.join(args.data_dir, 'segments'))
+
+# choice lists for random sampling
+all_speakers = list(spk2utt.keys())
+all_noises = list(noises.keys())
+all_rirs = list(rirs.keys())
+noise_snrs = [float(x) for x in args.noise_snrs.split(':')]
+
+mixtures = []
+for it in range(args.n_mixtures):
+    # recording ids are mix_0000001, mix_0000002, ...
+    recid = 'mix_{:07d}'.format(it + 1)
+    # randomly select speakers, a background noise and a SNR
+    speakers = random.sample(all_speakers, args.n_speakers)
+    noise = random.choice(all_noises)
+    noise_snr = random.choice(noise_snrs)
+    mixture = {'speakers': []}
+    for speaker in speakers:
+        # randomly select the number of utterances
+        n_utts = np.random.randint(args.min_utts, args.max_utts + 1)
+        # utts = spk2utt[speaker][:n_utts]
+        cycle_utts = itertools.cycle(spk2utt[speaker])
+        # random start utterance
+        roll = np.random.randint(0, len(spk2utt[speaker]))
+        for i in range(roll):
+            next(cycle_utts)
+        utts = [next(cycle_utts) for i in range(n_utts)]
+        # randomly select wait time before appending utterance
+        intervals = np.random.exponential(args.sil_scale, size=n_utts)
+        # randomly select a room impulse response
+        if random.random() < args.speech_rvb_probability:
+            rir = rirs[random.choice(all_rirs)]
+        else:
+            rir = None
+        if segments is not None:
+            utts = [segments[utt] for utt in utts]
+            utts = [(wavs[rec], st, et) for (rec, st, et) in utts]
+            mixture['speakers'].append({
+                'spkid': speaker,
+                'rir': rir,
+                'utts': utts,
+                'intervals': intervals.tolist()
+                })
+        else:
+            mixture['speakers'].append({
+                'spkid': speaker,
+                'rir': rir,
+                'utts': [wavs[utt] for utt in utts],
+                'intervals': intervals.tolist()
+                })
+    mixture['noise'] = noises[noise]
+    mixture['snr'] = noise_snr
+    mixture['recid'] = recid
+    print(recid, json.dumps(mixture))

--
Gitblit v1.9.1