游雁
2023-09-13 33d3d2084403fd34b79c835d2f2fe04f6cd8f738
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#!/usr/bin/env python3
# Copyright 2015   David Snyder
#           2018   Ewald Enzinger
# Apache 2.0.
#
# Modified version of egs/sre16/v1/local/make_musan.py (commit e3fb7c4a0da4167f8c94b80f4d3cc5ab4d0e22e8).
# This version uses the raw MUSAN audio files (16 kHz) and does not use sox to resample at 8 kHz.
#
# This file is meant to be invoked by make_musan.sh.
 
import os, sys
 
def process_music_annotations(path):
  utt2spk = {}
  utt2vocals = {}
  lines = open(path, 'r').readlines()
  for line in lines:
    utt, genres, vocals, musician = line.rstrip().split()[:4]
    # For this application, the musican ID isn't important
    utt2spk[utt] = utt
    utt2vocals[utt] = vocals == "Y"
  return utt2spk, utt2vocals
 
def prepare_music(root_dir, use_vocals):
  utt2vocals = {}
  utt2spk = {}
  utt2wav = {}
  num_good_files = 0
  num_bad_files = 0
  music_dir = os.path.join(root_dir, "music")
  for root, dirs, files in os.walk(music_dir):
    for file in files:
      file_path = os.path.join(root, file)
      if file.endswith(".wav"):
        utt = str(file).replace(".wav", "")
        utt2wav[utt] = file_path
      elif str(file) == "ANNOTATIONS":
        utt2spk_part, utt2vocals_part = process_music_annotations(file_path)
        utt2spk.update(utt2spk_part)
        utt2vocals.update(utt2vocals_part)
  utt2spk_str = ""
  utt2wav_str = ""
  for utt in utt2vocals:
    if utt in utt2wav:
      if use_vocals or not utt2vocals[utt]:
        utt2spk_str = utt2spk_str + utt + " " + utt2spk[utt] + "\n"
        utt2wav_str = utt2wav_str + utt + " " + utt2wav[utt] + "\n"
      num_good_files += 1
    else:
      print("Missing file {}".format(utt))
      num_bad_files += 1
  print("In music directory, processed {} files: {} had missing wav data".format(num_good_files, num_bad_files))
  return utt2spk_str, utt2wav_str
 
def prepare_speech(root_dir):
  utt2spk = {}
  utt2wav = {}
  num_good_files = 0
  num_bad_files = 0
  speech_dir = os.path.join(root_dir, "speech")
  for root, dirs, files in os.walk(speech_dir):
    for file in files:
      file_path = os.path.join(root, file)
      if file.endswith(".wav"):
        utt = str(file).replace(".wav", "")
        utt2wav[utt] = file_path
        utt2spk[utt] = utt
  utt2spk_str = ""
  utt2wav_str = ""
  for utt in utt2spk:
    if utt in utt2wav:
      utt2spk_str = utt2spk_str + utt + " " + utt2spk[utt] + "\n"
      utt2wav_str = utt2wav_str + utt + " " + utt2wav[utt] + "\n"
      num_good_files += 1
    else:
      print("Missing file {}".format(utt))
      num_bad_files += 1
  print("In speech directory, processed {} files: {} had missing wav data".format(num_good_files, num_bad_files))
  return utt2spk_str, utt2wav_str
 
def prepare_noise(root_dir):
  utt2spk = {}
  utt2wav = {}
  num_good_files = 0
  num_bad_files = 0
  noise_dir = os.path.join(root_dir, "noise")
  for root, dirs, files in os.walk(noise_dir):
    for file in files:
      file_path = os.path.join(root, file)
      if file.endswith(".wav"):
        utt = str(file).replace(".wav", "")
        utt2wav[utt] = file_path
        utt2spk[utt] = utt
  utt2spk_str = ""
  utt2wav_str = ""
  for utt in utt2spk:
    if utt in utt2wav:
      utt2spk_str = utt2spk_str + utt + " " + utt2spk[utt] + "\n"
      utt2wav_str = utt2wav_str + utt + " " + utt2wav[utt] + "\n"
      num_good_files += 1
    else:
      print("Missing file {}".format(utt))
      num_bad_files += 1
  print("In noise directory, processed {} files: {} had missing wav data".format(num_good_files, num_bad_files))
  return utt2spk_str, utt2wav_str
 
def main():
  in_dir = sys.argv[1]
  out_dir = sys.argv[2]
  use_vocals = sys.argv[3] == "Y"
  utt2spk_music, utt2wav_music = prepare_music(in_dir, use_vocals)
  utt2spk_speech, utt2wav_speech = prepare_speech(in_dir)
  utt2spk_noise, utt2wav_noise = prepare_noise(in_dir)
  utt2spk = utt2spk_speech + utt2spk_music + utt2spk_noise
  utt2wav = utt2wav_speech + utt2wav_music + utt2wav_noise
  wav_fi = open(os.path.join(out_dir, "wav.scp"), 'w')
  wav_fi.write(utt2wav)
  utt2spk_fi = open(os.path.join(out_dir, "utt2spk"), 'w')
  utt2spk_fi.write(utt2spk)
 
 
if __name__=="__main__":
  main()