File size: 2,689 Bytes
f831146
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import os
from pathlib import Path
import argparse
import numpy as np
from data_utils import get_fbanks , train_test_split
np.random.seed(42)

def check_test_size(value):

    
    if not 0 < float(value) < 0.31:
        raise argparse.ArgumentTypeError("Test size must be a float between 0 and 0.3 .")
    return float(value)

def assert_out_dir_exists(output_path, index):
    dir_ = os.path.join(output_path, str(index))

    if not os.path.exists(dir_):
        os.makedirs(dir_)
        print('Created directory {}'.format(dir_))
    else:
        print('Directory {} already exists'.format(dir_))

    return dir_

def main(base_path, output_path, test_size):
    speaker_dirs = [f for f in Path(base_path).iterdir() if f.is_dir()]

    for id , speaker_dir in enumerate(speaker_dirs):
        speaker_id = speaker_dir.name
        print(f'Processing speaker ID: {speaker_id}')

        index_target_dir = assert_out_dir_exists(output_path, id)

        sample_counter = 0
        files_ = list(speaker_dir.glob('**/*.flac'))

        for f in files_:
            fbanks = get_fbanks(str(f))
            if fbanks is None:
                continue
            num_frames = fbanks.shape[0]

            # Sample sets of 64 frames each
            file_sample_counter = 0
            start = 0
            while start < num_frames + 64:
                slice_ = fbanks[start:start + 64]
                if slice_ is not None and slice_.shape[0] == 64:
                    assert slice_.shape[0] == 64
                    assert slice_.shape[1] == 64
                    assert slice_.shape[2] == 1
                    np.save(os.path.join(index_target_dir, f'{sample_counter}.npy'), slice_)

                    file_sample_counter += 1
                    sample_counter += 1

                start = start + 64

            print(f'Done for speaker ID: {speaker_id}, Samples from this file: {file_sample_counter}')

        print(f'Done for speaker ID: {speaker_id}, total number of samples for this ID: {sample_counter}')
        print('')

    print('All done, YAY! Look at the files')
    train_test_split(output_path, test_size)

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description="Extract filter banks from audio files.")
    parser.add_argument('--input', default = "./LibriSpeech/train-clean-100", type=str, help='Input folder containing the audio files.')
    parser.add_argument('--out', default = "./fbannks", type=str, help='Output folder to save the extracted features.')
    parser.add_argument('--test_size', default =0.05, type=check_test_size, help='Test size.')
    args = parser.parse_args()

    main(args.input, args.out, args.test_size)