72 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
			
		
		
	
	
			72 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
#!/usr/bin/env bash
 | 
						|
 | 
						|
# Suggested models from aur
 | 
						|
# whisper.cpp-model-large-v3-turbo-q5_0 whisper.cpp-model-medium-q5_0 whisper.cpp-model-small.en-q5_1 whisper.cpp-model-tiny.en-q5_1
 | 
						|
 | 
						|
set -e
 | 
						|
 | 
						|
# Check dependencies
 | 
						|
command -v ffmpeg >/dev/null || { echo "ffmpeg not found"; exit 1; }
 | 
						|
command -v whisper-cli >/dev/null || { echo "whisper-cli not found"; exit 1; }
 | 
						|
 | 
						|
# Check input file
 | 
						|
if [[ $# -lt 1 ]]; then
 | 
						|
    echo "Usage: $0 <video_file.(mp4|mkv)>"
 | 
						|
    exit 1
 | 
						|
fi
 | 
						|
 | 
						|
# Get whisper installed models
 | 
						|
model_folders=$(find /usr/share/ -maxdepth 1 -type d -name "whisper.cpp-model-*")
 | 
						|
if [[ -z "$model_folders" ]]; then
 | 
						|
	echo "No whisper models found in /usr/share/"
 | 
						|
	exit 1
 | 
						|
fi
 | 
						|
# Find bin files in the model folders
 | 
						|
model_files=$(find $model_folders -maxdepth 1 -type f -name "*.bin")
 | 
						|
if [[ -z "$model_files" ]]; then
 | 
						|
	echo "No whisper model files found in /usr/share/"
 | 
						|
	exit 1
 | 
						|
fi
 | 
						|
 | 
						|
# If --list-models is passed, list available models
 | 
						|
if [[ "$1" == "--list-models" ]]; then
 | 
						|
	echo "Available whisper models:"
 | 
						|
	for model in $model_files; do
 | 
						|
		echo "$model"
 | 
						|
	done
 | 
						|
	exit 0
 | 
						|
fi
 | 
						|
 | 
						|
# One argument default
 | 
						|
INPUT="$1"
 | 
						|
 | 
						|
# If --model is passed, use the second argument as the model path,
 | 
						|
if [[ "$1" == "--model" && -n "$2" ]]; then
 | 
						|
	if [[ ! -f "$2" ]]; then
 | 
						|
		echo "Model file $2 does not exist."
 | 
						|
		exit 1
 | 
						|
	fi
 | 
						|
	MODEL_PATH="$2"
 | 
						|
	INPUT="$3"
 | 
						|
else
 | 
						|
	# Default to the last model found
 | 
						|
	MODEL_PATH=$(echo "$model_files" | head -n 1)
 | 
						|
fi
 | 
						|
 | 
						|
BASENAME=${INPUT%.*}
 | 
						|
TMP_WAV=$(mktemp --suffix=".wav")
 | 
						|
 | 
						|
# Extract and convert audio
 | 
						|
echo "Extracting and converting audio..."
 | 
						|
ffmpeg -y -i "$INPUT" -vn -acodec pcm_s16le -ar 16000 -ac 1 "$TMP_WAV" > /dev/null 2>&1
 | 
						|
 | 
						|
# Run whisper-cli
 | 
						|
echo "Transcribing with whisper-cli..."
 | 
						|
echo "Using model: $MODEL_PATH"
 | 
						|
# -pp to enable progress printing
 | 
						|
whisper-cli -sow -sns -pc -np --prompt "Please do not forget punctuation and capitalization, and keep the length of a line consistent!" -t "$(nproc)" -m "$MODEL_PATH" -f "$TMP_WAV" --output-srt -of "${BASENAME}"
 | 
						|
 | 
						|
# Cleanup
 | 
						|
rm -f "$TMP_WAV"
 | 
						|
echo "Done. Temporary file removed."
 |