Blame view

egs/wsj/s5/utils/data/perturb_data_dir_volume.sh 2.97 KB
8dcb6dfcb   Yannick Estève   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