File size: 2,904 Bytes
8235b4f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
# The following piece of code was adapted from https://github.com/kaituoxu/Conv-TasNet
# released under the MIT License.
# Author: Kaituo XU
# Created on 2018/12

# Revised by: Eliya Nachmani (enk100), Yossi Adi (adiyoss), Lior Wolf

import argparse
import json
import os

import librosa
from tqdm import tqdm


def preprocess_one_dir(in_dir, out_dir, out_filename, sample_rate=8000):
    file_infos = []
    in_dir = os.path.abspath(in_dir)
    wav_list = os.listdir(in_dir)
    for wav_file in tqdm(wav_list):
        if not wav_file.endswith('.wav'):
            continue
        wav_path = os.path.join(in_dir, wav_file)
        samples, _ = librosa.load(wav_path, sr=sample_rate)
        file_infos.append((wav_path, len(samples)))
    if not os.path.exists(out_dir):
        os.makedirs(out_dir)
    with open(os.path.join(out_dir, out_filename + '.json'), 'w') as f:
        json.dump(file_infos, f, indent=4)


def preprocess(args):
    for data_type in ['tr', 'cv', 'tt']:
        for signal in ['noisy', 'clean']:
            preprocess_one_dir(os.path.join(args.in_dir, data_type, signal),
                               os.path.join(args.out_dir, data_type),
                               signal,
                               sample_rate=args.sample_rate)


def preprocess_alldirs(args):
    for d in os.listdir(args.in_dir):
        local_dir = os.path.join(args.in_dir, d)
        if os.path.isdir(local_dir):
            preprocess_one_dir(os.path.join(args.in_dir, local_dir),
                               os.path.join(args.out_dir),
                               d,
                               sample_rate=args.sample_rate)


if __name__ == "__main__":
    parser = argparse.ArgumentParser("WSJ0 data preprocessing")
    parser.add_argument('--in_dir', type=str, default=None,
                        help='Directory path of wsj0 including tr, cv and tt')
    parser.add_argument('--out_dir', type=str, default=None,
                        help='Directory path to put output files')
    parser.add_argument('--sample_rate', type=int, default=16000,
                        help='Sample rate of audio file')
    parser.add_argument("--one_dir", action="store_true",
                        help="Generate json files from specific directory")
    parser.add_argument("--all_dirs", action="store_true",
                        help="Generate json files from all dirs in specific directory")
    parser.add_argument('--json_name', type=str, default=None,
                        help='The name of the json to be generated. '
                             'To be used only with one-dir option.')
    args = parser.parse_args()
    print(args)
    if args.all_dirs:
        preprocess_alldirs(args)
    elif args.one_dir:
        preprocess_one_dir(args.in_dir, args.out_dir,
                           args.json_name, sample_rate=args.sample_rate)
    else:
        preprocess(args)