aboutsummaryrefslogtreecommitdiff
path: root/script/subsetvq.sh
diff options
context:
space:
mode:
authorAuthor Name <[email protected]>2023-07-07 12:20:59 +0930
committerDavid Rowe <[email protected]>2023-07-07 12:29:06 +0930
commitac7c48b4dee99d4c772f133d70d8d1b38262fcd2 (patch)
treea2d0ace57a9c0e2e5b611c4987f6fed1b38b81e7 /script/subsetvq.sh
shallow zip-file copy from codec2 e9d726bf20
Diffstat (limited to 'script/subsetvq.sh')
-rwxr-xr-xscript/subsetvq.sh148
1 files changed, 148 insertions, 0 deletions
diff --git a/script/subsetvq.sh b/script/subsetvq.sh
new file mode 100755
index 0000000..562a4e8
--- /dev/null
+++ b/script/subsetvq.sh
@@ -0,0 +1,148 @@
+#!/bin/bash
+# subsetvq.sh
+# David Rowe August 2021
+#
+# Script to support:
+# 1. Subset VQ training and listening
+# 1. Training Trellis Vector Quantiser for Codec 2 newamp1, supports octave/trellis.m
+# 2. VQ sorting/optimisation experiments, octave/vq_compare.m
+
+TRAIN=~/Downloads/all_speech_8k.sw
+CODEC2_PATH=$HOME/codec2
+PATH=$PATH:$CODEC2_PATH/build_linux/src:$CODEC2_PATH/build_linux/misc
+K=20
+Kst=2
+Ken=16
+
+# train a new VQ and generate quantised training material
+function train() {
+ fullfile=$TRAIN
+ filename=$(basename -- "$fullfile")
+ extension="${filename##*.}"
+ filename="${filename%.*}"
+
+ c2sim $fullfile --rateK --rateKout ${filename}.f32
+ echo "ratek=load_f32('../build_linux/${filename}.f32',20); vq_700c_eq; ratek_lim=limit_vec(ratek, 0, 40); save_f32('../build_linux/${filename}_lim.f32', ratek_lim); quit" | \
+ octave -p ${CODEC2_PATH}/octave -qf
+ vqtrain ${filename}_lim.f32 $K 4096 vq_stage1.f32 -s 1e-3 --st $Kst --en $Ken
+
+ # VQ the training file
+ cat ${filename}_lim.f32 | vq_mbest --st $Kst --en $Ken -k $K -q vq_stage1.f32 > ${filename}_test.f32
+}
+
+function listen_vq() {
+ vq_fn=$1
+ dec=$2
+ EbNodB=$3
+ fullfile=$4
+ filename=$(basename -- "$fullfile")
+ extension="${filename##*.}"
+ filename="${filename%.*}"
+
+ fullfile_out=$5
+ do_trellis=$6
+ sox_options='-t raw -e signed-integer -b 16'
+ sox $fullfile $sox_options - | c2sim - --rateK --rateKout ${filename}.f32
+
+ echo "ratek=load_f32('../build_linux/${filename}.f32',20); vq_700c_eq; ratek_lim=limit_vec(ratek, 0, 40); save_f32('../build_linux/${filename}_lim.f32', ratek_lim); quit" | \
+ octave -p ${CODEC2_PATH}/octave -qf
+
+ if [ "$do_trellis" -eq 0 ]; then
+ echo "pkg load statistics; vq_compare(action='vq_file', '${vq_fn}', ${dec}, ${EbNodB}, '${filename}_lim.f32', '${filename}_test.f32'); quit" \ |
+ octave -p ${CODEC2_PATH}/octave -qf
+ else
+ echo "pkg load statistics; trellis; vq_file('${vq_fn}', ${dec}, ${EbNodB}, '${filename}_lim.f32', '${filename}_test.f32'); quit" \ |
+ octave -p ${CODEC2_PATH}/octave -qf
+ fi
+
+ if [ "$fullfile_out" = "aplay" ]; then
+ sox $fullfile $sox_options - | c2sim - --rateK --rateKin ${filename}_test.f32 -o - | aplay -f S16_LE
+ else
+ sox $fullfile $sox_options - | c2sim - --rateK --rateKin ${filename}_test.f32 -o - | sox -t .s16 -r 8000 -c 1 - ${fullfile_out}
+ fi
+
+}
+
+function print_help {
+ echo
+ echo "Trellis/VQ optimisation support script"
+ echo
+ echo " usage ./train_trellis.sh [-x] [-t] [-v vq.f32 in.wav out.wav] [-e EbNodB] [-d dec]"
+ echo
+ echo " -x debug mode; trace script execution"
+ echo " -t train VQ and generate a fully quantised version of training vectors"
+ echo " -v vq.f32 in.wav out.wav synthesise an output file out.wav from in.raw, using the VQ vq.f32"
+ echo " -v vq.f32 in.wav aplay synthesise output, play immediately using aplay, using the VQ vq.f32"
+ echo " -e EbNodB Eb/No in dB for AWGn channel simulation (error insertion)"
+ echo " -d dec decimation/interpolation rate"
+ echo " -r use trellis decoder"
+ echo
+ exit
+}
+
+# command line arguments to select function
+
+if [ $# -lt 1 ]; then
+ print_help
+fi
+
+do_train=0
+do_vq=0
+do_trellis=0
+EbNodB=100
+dec=1
+POSITIONAL=()
+while [[ $# -gt 0 ]]
+do
+key="$1"
+case $key in
+ -x)
+ set -x
+ shift
+ ;;
+ -t)
+ do_train=1
+ shift
+ ;;
+ -v)
+ do_vq=1
+ vq_fn="$2"
+ in_wav="$3"
+ out_wav="$4"
+ shift
+ shift
+ shift
+ shift
+ ;;
+ -r)
+ do_trellis=1
+ shift
+ ;;
+ -d)
+ dec="$2"
+ shift
+ shift
+ ;;
+ -e)
+ EbNodB="$2"
+ shift
+ shift
+ ;;
+ -h)
+ print_help
+ ;;
+ *)
+ POSITIONAL+=("$1") # save it in an array for later
+ shift
+ ;;
+esac
+done
+set -- "${POSITIONAL[@]}" # restore positional parameters
+
+if [ $do_train -eq 1 ]; then
+ train
+fi
+
+if [ $do_vq -eq 1 ]; then
+ listen_vq ${vq_fn} ${dec} ${EbNodB} ${in_wav} ${out_wav} ${do_trellis}
+fi