159 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
		
		
			
		
	
	
			159 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
|  | #!/bin/sh
 | ||
|  | 
 | ||
|  | trim_silence=0 | ||
|  | endian="" | ||
|  | encoding="-s2 -traw" | ||
|  | target_rate=8000 | ||
|  | silence_level=45 | ||
|  | effect="" | ||
|  | 
 | ||
|  | convert() | ||
|  | { | ||
|  |   if [ -r "$1.wav" ]; then | ||
|  |     sox "$1.wav" -r$target_rate -s2 -traw - | ||
|  |   elif [ -r "$1.raw" ]; then | ||
|  |     if [ $target_rate != 8000 ]; then | ||
|  |       sox -r 8000 -s2 "$1.raw" -r$target_rate -s2 -traw - | ||
|  |     else | ||
|  |       cat "$1.raw" | ||
|  |     fi | ||
|  |   fi | ||
|  | } | ||
|  | 
 | ||
|  | 
 | ||
|  | process() | ||
|  | { | ||
|  |   # The format of the audio stream | ||
|  |   format="-traw -r${target_rate} -s2"; | ||
|  |    | ||
|  |   # The filter to apply before all other operations | ||
|  |   #filter="highpass 300 highpass 300 highpass 300" | ||
|  |   #filter="highpass 300" | ||
|  |   #filter="" | ||
|  |    | ||
|  |   # Front and back levels for silence trimming | ||
|  |   silence_front_level="-${silence_level}d" | ||
|  |   silence_back_level="-${silence_level}d" | ||
|  |    | ||
|  |   # Calculate maximum gain without clipping. Leave headroom of about 3dB. | ||
|  |   #gain=$(sox -traw -r${target_rate} -s2 $1 -traw /dev/null stat -v 2>&1) | ||
|  |   #gain=$(echo "$gain * 0.7" | bc) | ||
|  |   #echo $gain 1>&2 | ||
|  |    | ||
|  |   if [ $trim_silence -gt 0 ]; then | ||
|  |     sox $format $1 $format - \
 | ||
|  |         silence 1 0:0:0.01 $silence_front_level reverse \
 | ||
|  | 	silence 1 0:0:0.01 $silence_back_level reverse \
 | ||
|  | 	$effect \
 | ||
|  | 	norm -3 | ||
|  |   else | ||
|  |     sox $format $1 $format - $effect norm -3 | ||
|  |   fi | ||
|  | } | ||
|  | 
 | ||
|  | 
 | ||
|  | spell() | ||
|  | { | ||
|  |   tmp=$(mktemp /tmp/svxlink-XXXXXX) | ||
|  |   ( for letter in $*; do | ||
|  |     process phonetic_$letter | ||
|  |   done ) > $tmp | ||
|  |   play -r${target_rate} -s2 -traw $tmp | ||
|  |   rm -f $tmp | ||
|  | } | ||
|  | 
 | ||
|  | 
 | ||
|  | endian_conv() | ||
|  | { | ||
|  |   if [ -n "$endian" ]; then | ||
|  |     sox -r${target_rate} -s2 -traw - -r${target_rate} -s2 -traw $endian - | ||
|  |   else | ||
|  |     cat | ||
|  |   fi | ||
|  | } | ||
|  | 
 | ||
|  | 
 | ||
|  | encode() | ||
|  | { | ||
|  |   if [ "$encoding" != "-s2 -traw" ]; then | ||
|  |     sox -r${target_rate} -s2 -traw - $encoding - | ||
|  |   else | ||
|  |     cat | ||
|  |   fi | ||
|  | } | ||
|  | 
 | ||
|  | while getopts spfctBLgr:l:e: opt; do | ||
|  |   case $opt in | ||
|  |     s) | ||
|  |       operation=spell | ||
|  |       ;; | ||
|  |        | ||
|  |     p) | ||
|  |       operation=play | ||
|  |       ;; | ||
|  |      | ||
|  |     f) | ||
|  |       operation=filter | ||
|  |       ;; | ||
|  |        | ||
|  |     c) | ||
|  |       operation=convert | ||
|  |       ;; | ||
|  |      | ||
|  |     t) | ||
|  |       trim_silence=1 | ||
|  |       ;; | ||
|  | 
 | ||
|  |     B) | ||
|  |       endian="-B" | ||
|  |       ;; | ||
|  |        | ||
|  |     L) | ||
|  |       endian="-L" | ||
|  |       ;; | ||
|  | 
 | ||
|  |     g) | ||
|  |       encoding="-tgsm" | ||
|  |       ;; | ||
|  | 
 | ||
|  |     r) | ||
|  |       target_rate=$OPTARG | ||
|  |       ;; | ||
|  |       | ||
|  |     l) | ||
|  |       silence_level=$OPTARG | ||
|  |       ;; | ||
|  |        | ||
|  |     e) | ||
|  |       effect=$OPTARG | ||
|  |       ;; | ||
|  |        | ||
|  |   esac | ||
|  | done | ||
|  | shift $((OPTIND-1)) | ||
|  | 
 | ||
|  | case $operation in | ||
|  |   spell) | ||
|  |     spell $* | ||
|  |     ;; | ||
|  |    | ||
|  |   play) | ||
|  |     tmp=$(mktemp /tmp/svxlink-XXXXXX) | ||
|  |     convert "$1" > $tmp | ||
|  |     process $tmp | encode | play -r${target_rate} $encoding - | ||
|  |     rm -f $tmp | ||
|  |     ;; | ||
|  |    | ||
|  |   convert) | ||
|  |     convert "$1" | endian_conv | encode | ||
|  |     ;; | ||
|  |      | ||
|  |   filter) | ||
|  |     tmp=$(mktemp /tmp/svxlink-XXXXXX) | ||
|  |     convert "$1" > $tmp | ||
|  |     process $tmp | endian_conv | encode | ||
|  |     rm -f $tmp | ||
|  |     ;; | ||
|  | esac | ||
|  | 
 |