# --- args --- if [[ $# -lt 1 ]]; then echo "Usage: $0 [--language ] [--model ]" >&2 exit 1 fi INPUT="$1"; shift LANGUAGE="en" MODEL="medium" # Parse flags while [[ $# -gt 0 ]]; do case "$1" in --language) LANGUAGE="$2"; shift 2 ;; --model) MODEL="$2"; shift 2 ;; *) echo "Unknown option: $1" >&2; exit 1 ;; esac done # --- helpers --- lower_ext() { local f="$1" local p="${f%%\?*}" # strip query params if any p="${p%%\#*}" # strip fragments local e="${p##*.}" # extension printf '%s' "${e,,}" # lowercase } is_url() { [[ "$1" =~ ^https?:// ]] } # --- temp workspace & cleanup --- WORKDIR="$(mktemp -d)" trap 'rm -rf "$WORKDIR"' EXIT SOURCE_PATH="" # where the audio/video comes from (local file after download if URL) MP3_PATH="" # final mp3 we'll feed to whisper # --- stage input (download if URL) --- if is_url "$INPUT"; then # Decide ext from URL (we only promise mp3/mp4 support as requested) ext="$(lower_ext "$INPUT")" case "$ext" in mp3|mp4) : ;; *) # default to mp3 if no/unknown extension (keeps your original intent) ext="mp3" ;; esac SOURCE_PATH="$WORKDIR/input.$ext" echo "Downloading: $INPUT" wget -q --show-progress -O "$SOURCE_PATH" "$INPUT" else # Local file if [[ ! -f "$INPUT" ]]; then echo "Error: file not found: $INPUT" >&2 exit 1 fi SOURCE_PATH="$INPUT" ext="$(lower_ext "$SOURCE_PATH")" fi # --- transcode if needed --- case "$ext" in mp3) MP3_PATH="$SOURCE_PATH" ;; mp4) MP3_PATH="$WORKDIR/audio.mp3" echo "Transcoding MP4 → MP3 with ffmpeg..." # -vn: drop video; -q:a 2 ~ VBR high quality (use -b:a 128k if you prefer CBR) ffmpeg -y -i "$SOURCE_PATH" -vn -acodec libmp3lame -q:a 2 "$MP3_PATH" >/dev/null 2>&1 ;; *) echo "Error: unsupported extension '$ext'. Only .mp3 or .mp4 are handled." >&2 exit 1 ;; esac # --- run whisper --- echo "Running whisper on: $MP3_PATH" "$WHISPER_EXEC" "$MP3_PATH" --model "$MODEL" --device cuda --language "$LANGUAGE"