Initial commit with two utilities: reducepdf and whisper

main
borja 5 months ago
commit 541f20eb6e

1
.gitignore vendored

@ -0,0 +1 @@
markitdown

@ -0,0 +1,6 @@
# My ./local/bin collection of scripts for my convenience
Currently done from my work computer, I have the following utilities:
- `reducepdf.sh`: Reduce a PDF file size by reducing the ppi of the images.
- `whisper.sh`: Transcribe audio and video files directly in the directory they're on.

@ -0,0 +1,83 @@
#!/bin/bash
# Function to display usage information and exit
usage() {
echo "Usage: $0 input.pdf output.pdf [-r resolution] [-h]"
echo ""
echo "Options:"
echo "-r Set the image resolution (default is 150ppi)"
echo "-h Display this help message"
exit 1
}
# Default settings
RESOLUTION=150
# Parse command-line options
while getopts ":r:h" opt; do
case ${opt} in
r)
RESOLUTION=$OPTARG
;;
h)
usage
;;
\?)
echo "Invalid option: -$OPTARG" >&2
exit 1
;;
:)
echo "Option -$OPTARG requires an argument." >&2
exit 1
;;
esac
done
shift $((OPTIND - 1))
# Check if the correct number of arguments are provided after parsing options
if [ "$#" -ne 2 ]; then
usage
fi
INPUT_FILE="$1"
OUTPUT_FILE="$2"
# Check if input file exists
if [ ! -f "$INPUT_FILE" ]; then
echo "Input file '$INPUT_FILE' does not exist."
exit 1
fi
# Extract directory and base name from output file path
OUTPUT_DIR=$(dirname "$OUTPUT_FILE")
OUTPUT_BASENAME=$(basename "$OUTPUT_FILE")
# Create the output directory if it doesn't already exist
mkdir -p "$OUTPUT_DIR"
# Run Ghostscript command with specified resolution
gs \
-sDEVICE=pdfwrite \
-dCompatibilityLevel=1.7 \
-dPDFSETTINGS=/prepress \
-dDownsampleMonoImages=false \
-dDownsampleColorImages=true \
-dColorImageResolution=$RESOLUTION \
-dGrayImageResolution=$RESOLUTION \
-dMonoImageResolution=$RESOLUTION \
-dPreserveOPIRequests=false \
-dSubsetFonts=true \
-dEmbedAllFonts=true \
-sProcessColorModel=DeviceRGB \
-dQUIET -dBATCH -dNOPAUSE \
-sOutputFile="$OUTPUT_FILE" "$INPUT_FILE"
# Check if Ghostscript command was successful
if [ $? -ne 0 ]; then
echo "Error: Ghostscript failed to process the file '$INPUT_FILE'."
exit 1
fi
echo "Successfully converted '$INPUT_FILE' to '$OUTPUT_BASENAME'"

@ -0,0 +1,130 @@
#!/bin/bash
# Script that uses `whispercpp` to tranascribe audio and video files automatically and outputs the results in the same directory
# Configuración
REPO_DIR=~/code/whisper.cpp
WHISPER_CLI="$REPO_DIR/build/bin/whisper-cli"
TEMP_DIR=$(mktemp -d)
LANGUAGE="en"
OUTPUT_FORMAT="txt"
# Rutas de los modelos
MODEL_LARGE="/Users/borjarobert/code/whisper.cpp/models/ggml-large-v3-turbo.bin"
MODEL_MEDIUM="/Users/borjarobert/code/whisper.cpp/models/ggml-medium.bin"
MODEL_SMALL="/Users/borjarobert/code/whisper.cpp/models/ggml-base.bin"
MODEL_PATH="$MODEL_LARGE" # Valor por defecto
# Función para mostrar uso
usage() {
echo "Uso: whisper [-u] [-t archivo] [-m modelo] [-l idioma] [-f formato]"
echo "Opciones:"
echo " -u Actualiza y recompila whispercpp"
echo " -t archivo Transcribe el archivo de video"
echo " -m modelo Especifica el modelo (large, medium, small)"
echo " -l idioma Especifica el idioma (por defecto: en)"
echo " -f formato Especifica el formato de salida (txt, srt, json, vtt, lrc, csv)"
exit 1
}
# Manejo de argumentos
while getopts ":ut:m:l:f:" opt; do
case $opt in
u)
echo "Actualizando whispercpp..."
cd "$REPO_DIR" || exit
git pull
make
echo "Actualización completa."
exit 0
;;
t)
FILE="$OPTARG"
;;
m)
case $OPTARG in
large)
MODEL_PATH="$MODEL_LARGE"
;;
medium)
MODEL_PATH="$MODEL_MEDIUM"
;;
small)
MODEL_PATH="$MODEL_SMALL"
;;
*)
echo "Modelo no válido: $OPTARG. Usando el modelo por defecto (large)."
;;
esac
;;
l)
LANGUAGE="$OPTARG"
;;
f)
OUTPUT_FORMAT="$OPTARG"
;;
\?)
echo "Opción inválida: -$OPTARG" >&2
usage
;;
:)
echo "La opción -$OPTARG requiere un argumento." >&2
usage
;;
esac
done
# Verificar si se proporcionó un archivo para transcribir
if [ -z "$FILE" ]; then
usage
fi
# Verificar si whisper-cli está disponible
if ! command -v "$WHISPER_CLI" &>/dev/null; then
echo "Error: whisper-cli no se encuentra en $WHISPER_CLI"
exit 1
fi
# Convertir archivo a WAV
WAV_FILE="$TEMP_DIR/$(basename "$FILE" .mp4).wav"
ffmpeg -i "$FILE" -acodec pcm_s16le -ac 1 -ar 16000 "$WAV_FILE" -y || {
echo "Error al convertir a WAV"
rm -rf "$TEMP_DIR"
exit 1
}
# Preparar nombres de salida
OUTPUT_BASE="$(basename "$FILE" .mp4)_${LANGUAGE}"
OUTPUT_DIR="$(pwd)" # Directorio actual
OUTPUT_FILE="$OUTPUT_DIR/$OUTPUT_BASE"
# Transcribir
case "$OUTPUT_FORMAT" in
txt)
$WHISPER_CLI -m "$MODEL_PATH" -l "$LANGUAGE" -otxt -of "$OUTPUT_FILE" "$WAV_FILE" | tee "$OUTPUT_FILE"_timestamped.txt
;;
srt)
$WHISPER_CLI -m "$MODEL_PATH" -l "$LANGUAGE" -osrt -of "$OUTPUT_FILE" "$WAV_FILE" | tee "$OUTPUT_FILE"_timestamped.txt
;;
json)
$WHISPER_CLI -m "$MODEL_PATH" -l "$LANGUAGE" -oj -of "$OUTPUT_FILE" "$WAV_FILE" | tee "$OUTPUT_FILE"_timestamped.txt
;;
vtt)
$WHISPER_CLI -m "$MODEL_PATH" -l "$LANGUAGE" -ovtt -of "$OUTPUT_FILE" "$WAV_FILE" | tee "$OUTPUT_FILE"_timestamped.txt
;;
lrc)
$WHISPER_CLI -m "$MODEL_PATH" -l "$LANGUAGE" -olrc -of "$OUTPUT_FILE" "$WAV_FILE" | tee "$OUTPUT_FILE"_timestamped.txt
;;
csv)
$WHISPER_CLI -m "$MODEL_PATH" -l "$LANGUAGE" -ocsv -of "$OUTPUT_FILE" "$WAV_FILE" | tee "$OUTPUT_FILE"_timestamped.txt
;;
*)
echo "Formato de salida no soportado: $OUTPUT_FORMAT"
rm -rf "$TEMP_DIR"
exit 1
;;
esac
# Limpiar archivos temporales
rm -rf "$TEMP_DIR"
echo "Transcripción completada. Archivos generados: ${OUTPUT_FILE}_timestamped.txt y ${OUTPUT_FILE}.${OUTPUT_FORMAT}."
Loading…
Cancel
Save