Blame view
egs/wsj/s5/utils/data/perturb_data_dir_volume.sh
2.97 KB
8dcb6dfcb first commit |
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 |
#!/bin/bash # Copyright 2016 Johns Hopkins University (author: Daniel Povey) # Apache 2.0 # This script operates on a data directory, such as in data/train/, and modifies # the wav.scp to perturb the volume (typically useful for training data when # using systems that don't have cepstral mean normalization). reco2vol= # A file with the format <reco-id> <volume> that specifies the # factor by which the volume of the recording must be scaled. # If not provided, then the volume will be chosen randomly to # be between --scale-low and --scale-high. write_reco2vol= # File to write volume-scales applied to the recordings. # Can be passed to --reco2vol to use the same volumes for # another data directory. # e.g. the unperturbed data directory. scale_low=0.125 scale_high=2 . utils/parse_options.sh if [ $# != 1 ]; then echo "Usage: $0 <datadir>" echo "e.g.:" echo " $0 data/train" exit 1 fi export LC_ALL=C data=$1 if [ ! -f $data/wav.scp ]; then echo "$0: Expected $data/wav.scp to exist" exit 1 fi # Check if volume perturbation is already this. We assume that the volume # perturbation is done if it has a line 'sox --vol' applied on the whole # recording. # e.g. # foo-1 cat foo.wav | sox --vol 1.6 -t wav - -t wav - | # volume perturbation done # bar-1 sox --vol 1.2 bar.wav -t wav - | # volume perturbation done # foo-2 wav-reverberate --additive-signals="sox --vol=0.1 noise1.wav -t wav -|" foo.wav | # volume perturbation not done volume_perturb_done=`head -n100 $data/wav.scp | python -c " import sys, re for line in sys.stdin.readlines(): if len(line.strip()) == 0: continue # Handle three cases of rxfilenames appropriately; 'input piped command', 'file offset' and 'filename' parts = line.strip().split() if line.strip()[-1] == '|': if re.search('sox --vol', ' '.join(parts[-11:])): print('true') sys.exit(0) elif re.search(':[0-9]+$', line.strip()) is not None: continue else: if ' '.join(parts[1:3]) == 'sox --vol': print('true') sys.exit(0) print('false') "` || exit 1 if $volume_perturb_done; then echo "$0: It looks like the data was already volume perturbed. Not doing anything." exit 0 fi cat $data/wav.scp | utils/data/internal/perturb_volume.py \ --reco2vol=$reco2vol ${write_reco2vol:+--write-reco2vol=$write_reco2vol} \ --scale-low=$scale_low --scale-high=$scale_high > \ $data/wav.scp_scaled || exit 1; len1=$(cat $data/wav.scp | wc -l) len2=$(cat $data/wav.scp_scaled | wc -l) if [ "$len1" != "$len2" ]; then echo "$0: error detected: number of lines changed $len1 vs $len2"; exit 1 fi mv $data/wav.scp_scaled $data/wav.scp if [ -f $data/feats.scp ]; then echo "$0: $data/feats.scp exists; moving it to $data/.backup/ as it wouldn't be valid any more." mkdir -p $data/.backup/ mv $data/feats.scp $data/.backup/ fi echo "$0: added volume perturbation to the data in $data" exit 0 |