File size: 1,972 Bytes
3b92d66
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import argparse
import librosa
import numpy as np
import os
import scipy
import scipy.io.wavfile
import sys

from glob import glob
from tqdm import tqdm
from joblib import Parallel, delayed


def check_directories(dir_input, dir_output):
    if not os.path.exists(dir_input):
        sys.exit("Error: Input directory does not exist: {}".format(dir_input))
    if not os.path.exists(dir_output):
        sys.exit("Error: Output directory does not exist: {}".format(dir_output))
    abs_a = os.path.abspath(dir_input)
    abs_b = os.path.abspath(dir_output)
    if abs_a == abs_b:
        sys.exit("Error: Paths are the same: {}".format(abs_a))


def resample_file(input_filename, output_filename, sample_rate):
    mono = (
        True  # librosa converts signal to mono by default, so I'm just surfacing this
    )
    audio, existing_rate = librosa.load(input_filename, sr=sample_rate, mono=mono)
    audio /= 1.414  # Scale to [-1.0, 1.0]
    audio *= 32767  # Scale to int16
    audio = audio.astype(np.int16)
    scipy.io.wavfile.write(output_filename, sample_rate, audio)


def downsample_wav_files(input_dir, output_dir, output_sample_rate):
    check_directories(input_dir, output_dir)
    inp_wav_paths = glob(input_dir + "/*.wav")
    out_wav_paths = [
        os.path.join(output_dir, os.path.basename(p)) for p in inp_wav_paths
    ]
    _ = Parallel(n_jobs=-1)(
        delayed(resample_file)(i, o, output_sample_rate)
        for i, o in tqdm(zip(inp_wav_paths, out_wav_paths))
    )


def parse_args():
    parser = argparse.ArgumentParser()
    parser.add_argument("--input_dir", "-i", type=str, required=True)
    parser.add_argument("--output_dir", "-o", type=str, required=True)
    parser.add_argument("--output_sample_rate", "-s", type=int, required=True)
    return parser.parse_args()


if __name__ == "__main__":
    args = parse_args()
    downsample_wav_files(args.input_dir, args.output_dir, args.output_sample_rate)
    print(f"\n\tCompleted")