mirror of
https://github.com/storytold/storyteller-ml.git
synced 2026-10-15 00:03:06 +00:00
125 lines
4.2 KiB
Bash
125 lines
4.2 KiB
Bash
#!/bin/bash
|
|
|
|
# default values for optional arguments
|
|
MIN_SCORE=-5
|
|
CUT_PREFIX=0
|
|
SCRIPTS_DIR="scripts"
|
|
OFFSET=0
|
|
LANGUAGE='eng' # 'eng', 'ru', 'other'
|
|
MIN_SEGMENT_LEN=20
|
|
MAX_SEGMENT_LEN=100
|
|
ADDITIONAL_SPLIT_SYMBOLS=''
|
|
AUDIO_FORMAT='.mp3'
|
|
USE_NEMO_NORMALIZATION='True'
|
|
|
|
for ARG in "$@"
|
|
do
|
|
key=$(echo $ARG | cut -f1 -d=)
|
|
value=$(echo $ARG | cut -f2 -d=)
|
|
|
|
if [[ $key == *"--"* ]]; then
|
|
v="${key/--/}"
|
|
declare $v="${value}"
|
|
fi
|
|
done
|
|
|
|
echo "MODEL_NAME_OR_PATH = $MODEL_NAME_OR_PATH"
|
|
echo "DATA_DIR = $DATA_DIR"
|
|
echo "OUTPUT_DIR = $OUTPUT_DIR"
|
|
echo "MIN_SCORE = $MIN_SCORE"
|
|
echo "CUT_PREFIX = $CUT_PREFIX"
|
|
echo "SCRIPTS_DIR = $SCRIPTS_DIR"
|
|
echo "OFFSET = $OFFSET"
|
|
echo "LANGUAGE = $LANGUAGE"
|
|
echo "MIN_SEGMENT_LEN = $MIN_SEGMENT_LEN"
|
|
echo "MAX_SEGMENT_LEN = $MAX_SEGMENT_LEN"
|
|
echo "ADDITIONAL_SPLIT_SYMBOLS = $ADDITIONAL_SPLIT_SYMBOLS"
|
|
echo "AUDIO_FORMAT = $AUDIO_FORMAT"
|
|
echo "USE_NEMO_NORMALIZATION = $USE_NEMO_NORMALIZATION"
|
|
|
|
if [[ -z $MODEL_NAME_OR_PATH ]] || [[ -z $DATA_DIR ]] || [[ -z $OUTPUT_DIR ]]; then
|
|
echo "Usage: $(basename "$0")
|
|
--MODEL_NAME_OR_PATH=[model_name_or_path]
|
|
--DATA_DIR=[data_dir]
|
|
--OUTPUT_DIR=[output_dir]
|
|
--LANGUAGE=[language (Optional)]
|
|
--OFFSET=[offset value (Optional)]
|
|
--CUT_PREFIX=[cut prefix in sec (Optional)]
|
|
--SCRIPTS_DIR=[scripts_dir_path (Optional)]
|
|
--MIN_SEGMENT_LEN=[min number of characters of the text segment for alignment (Optional)]
|
|
--MAX_SEGMENT_LEN=[max number of characters of the text segment for alignment (Optional)]
|
|
--ADDITIONAL_SPLIT_SYMBOLS=[Additional symbols to use for
|
|
sentence split if eos sentence split resulted in sequence longer than --max_length.
|
|
Use '|' as a separator between symbols, for example: ';|:|' (Optional)]
|
|
--AUDIO_FORMAT=[choose from ['.mp3', '.wav'], input audio files format
|
|
--USE_NEMO_NORMALIZATION Set to 'True' to use NeMo Normalization tool to convert
|
|
numbers from written to spoken format. By default num2words package will be used. (Optional)"
|
|
exit 1
|
|
fi
|
|
|
|
NEMO_NORMALIZATION=""
|
|
if [[ ${USE_NEMO_NORMALIZATION,,} == "true" ]]; then
|
|
NEMO_NORMALIZATION="--use_nemo_normalization "
|
|
fi
|
|
|
|
# STEP #1
|
|
# Prepare text and audio data for segmentation
|
|
python $SCRIPTS_DIR/prepare_data.py \
|
|
--in_text=$DATA_DIR/text \
|
|
--audio_dir=$DATA_DIR/audio \
|
|
--audio_format=$AUDIO_FORMAT \
|
|
--output_dir=$OUTPUT_DIR/processed/ \
|
|
--language=$LANGUAGE \
|
|
--cut_prefix=$CUT_PREFIX \
|
|
--model=$MODEL_NAME_OR_PATH \
|
|
--min_length=$MIN_SEGMENT_LEN \
|
|
--max_length=$MAX_SEGMENT_LEN \
|
|
--additional_split_symbols=$ADDITIONAL_SPLIT_SYMBOLS $NEMO_NORMALIZATION || exit
|
|
|
|
# STEP #2
|
|
# Run CTC-segmenatation
|
|
# one might want to perform alignment with various window sizes
|
|
# note if the alignment with the initial window size isn't found, the window size will be double to re-attempt
|
|
# alignment
|
|
for WINDOW in 8000 12000
|
|
do
|
|
python $SCRIPTS_DIR/run_ctc_segmentation.py \
|
|
--output_dir=$OUTPUT_DIR \
|
|
--data=$OUTPUT_DIR/processed/ \
|
|
--model=$MODEL_NAME_OR_PATH \
|
|
--window_len $WINDOW || exit
|
|
done
|
|
|
|
# STEP #3 (Optional)
|
|
# Verify aligned segments only if multiple WINDOWs used in the Step #2)
|
|
python $SCRIPTS_DIR/verify_segments.py \
|
|
--base_dir=$OUTPUT_DIR || exit
|
|
|
|
# STEP #4
|
|
# Cut the original audio files based on the alignments
|
|
# (use --alignment=$OUTPUT_DIR/segments if only 1 WINDOW size was used in the Step #2)
|
|
# Three manifests and corresponding clips folders will be created:
|
|
# - high scored clips
|
|
# - low scored clips
|
|
# - deleted segments
|
|
python $SCRIPTS_DIR/cut_audio.py \
|
|
--output_dir=$OUTPUT_DIR \
|
|
--model=$MODEL_NAME_OR_PATH \
|
|
--alignment=$OUTPUT_DIR/verified_segments \
|
|
--threshold=$MIN_SCORE \
|
|
--offset=$OFFSET || exit
|
|
|
|
# STEP #5 (Optional)
|
|
# If multiple audio files were segmented in the step #2, this step will aggregate manifests with high scored segments
|
|
# for all audio files into all_manifest.json
|
|
# Also a separate manifest with samples from across all high scored segments will be credated if --num_samples > 0
|
|
# --num_samples samples will be taken from the beginning, end and the middle of the each audio file high score manifest
|
|
# and will be stored at sample_manifest.json
|
|
python $SCRIPTS_DIR/process_manifests.py \
|
|
--output_dir=$OUTPUT_DIR \
|
|
--manifests_dir=$OUTPUT_DIR/manifests/ \
|
|
--num_samples 0
|
|
|
|
exit
|
|
|