Try wget https://bash.commongrounds.cc/uploads/1744743048_transgram.sh
from the console
#!/bin/bash # Transgram v1.0 by Page Telegram Volunteer Services, 2025 # Function to display usage usage() { echo "Transgram v1.0 by Page Telegram Volunteer Services, 2025 w/ Multithreaded Support:" echo "Usage: $0 <input_file_or_url> $1 <#threads>" echo "Input can be a local A/V file or a URL (https://)" echo "Threads is an optional number of CPU threads (default: 1)" exit 1 } # Check if at least one argument is provided if [ $# -lt 1 ]; then usage fi INPUT="$1" THREADS=1 # Default to 1 thread OUTPUT_DIR="transgram_output" TIMESTAMP=$(date +%Y%m%d_%H%M%S) TEMP_DIR="/tmp/transgram_$TIMESTAMP" WHISPER_MODEL="base" # Default Whisper model, can be changed (e.g., small, medium, large) # Validate threads if provided if [ $# -eq 2 ]; then if [[ "$2" =~ ^[1-9][0-9]*$ ]]; then THREADS="$2" else echo "Error: Threads must be a positive integer." usage fi fi # Function to detect package manager detect_package_manager() { if command -v apt-get >/dev/null 2>&1; then echo "apt" elif command -v dnf >/dev/null 2>&1; then echo "dnf" elif command -v yum >/dev/null 2>&1; then echo "yum" elif command -v pacman >/dev/null 2>&1; then echo "pacman" elif command -v zypper >/dev/null 2>&1; then echo "zypper" else echo "unknown" fi } # Function to install dependencies install_dependencies() { local pm="$1" echo "Installing dependencies using $pm..." case "$pm" in apt) sudo apt-get update sudo apt-get install -y ffmpeg python3 python3-pip pipx ;; dnf|yum) sudo $pm install -y ffmpeg python3 python3-pip pipx ;; pacman) sudo pacman -Syu --noconfirm ffmpeg python python-pip python-pipx ;; zypper) sudo zypper install -y ffmpeg python3 python3-pip python3-pipx ;; *) echo "Error: Unsupported package manager. Please install ffmpeg, python3, and pipx manually." exit 1 ;; esac # Ensure pipx is in PATH pipx ensurepath >/dev/null 2>&1 # Install Python packages using pipx pipx install openai-whisper pipx install yt-dlp } # Function to check and install dependencies check_dependencies() { local pm=$(detect_package_manager) local missing_deps=() # Check for ffmpeg if ! command -v ffmpeg >/dev/null 2>&1; then missing_deps+=("ffmpeg") fi # Check for python3 if ! command -v python3 >/dev/null 2>&1; then missing_deps+=("python3") fi # Check for pipx if ! command -v pipx >/dev/null 2>&1; then missing_deps+=("pipx") fi # Check for yt-dlp if ! command -v yt-dlp >/dev/null 2>&1; then missing_deps+=("yt-dlp") fi # Check for openai-whisper if ! command -v whisper >/dev/null 2>&1; then missing_deps+=("openai-whisper") fi if [ ${#missing_deps[@]} -gt 0 ]; then echo "Missing dependencies: ${missing_deps[*]}" if [ "$pm" = "unknown" ]; then echo "Unknown package manager. Please install ${missing_deps[*]} manually." exit 1 else read -p "Install missing dependencies? (y/n): " answer if [ "$answer" = "y" ] || [ "$answer" = "Y" ]; then install_dependencies "$pm" else echo "Dependencies not installed. Exiting." exit 1 fi fi fi } # Function to clean up temporary files cleanup() { if [ -d "$TEMP_DIR" ]; then rm -rf "$TEMP_DIR" echo "Cleaned up temporary directory: $TEMP_DIR" fi } # Trap to ensure cleanup on exit trap cleanup EXIT # Create output and temp directories mkdir -p "$OUTPUT_DIR" "$TEMP_DIR" # Check dependencies check_dependencies # Function to process local file process_local_file() { local input_file="$1" local base_name=$(basename "$input_file" | sed 's/\.[^.]*$//') local temp_audio="$TEMP_DIR/${base_name}.wav" # Convert to WAV using ffmpeg echo "Converting $input_file to WAV..." ffmpeg -i "$input_file" -ar 16000 -ac 1 -c:a pcm_s16le "$temp_audio" -y >/dev/null 2>&1 if [ $? -ne 0 ]; then echo "Error: Failed to convert $input_file to WAV." exit 1 fi # Run openai-whisper transcription using CLI for all formats echo "Transcribing audio to all formats (txt, vtt, srt, tsv, json) using $THREADS thread(s)..." whisper --model "$WHISPER_MODEL" --task transcribe --output_format all --output_dir "$TEMP_DIR" --threads "$THREADS" "$temp_audio" >/dev/null 2>&1 if [ $? -ne 0 ]; then echo "Error: Transcription failed." exit 1 fi # Move all transcription files to output directory for format in txt vtt srt tsv json; do local temp_output="$TEMP_DIR/${base_name}.${format}" local final_output="$OUTPUT_DIR/${base_name}_transcription.${format}" if [ -f "$temp_output" ]; then mv "$temp_output" "$final_output" if [ $? -ne 0 ]; then echo "Error: Failed to save $format transcription." exit 1 fi echo "Transcription saved to $final_output" else echo "Warning: $format output not generated." fi done } # Function to process URL process_url() { local url="$1" local base_name="youtube_$TIMESTAMP" local temp_video="$TEMP_DIR/${base_name}.mp4" local temp_audio="$TEMP_DIR/${base_name}.wav" # Download video using yt-dlp echo "Downloading video from $url..." yt-dlp -o "$temp_video" "$url" >/dev/null 2>&1 if [ $? -ne 0 ]; then echo "Error: Failed to download video from $url." exit 1 fi # Convert to WAV using ffmpeg echo "Converting downloaded video to WAV..." ffmpeg -i "$temp_video" -ar 16000 -ac 1 -c:a pcm_s16le "$temp_audio" -y >/dev/null 2>&1 if [ $? -ne 0 ]; then echo "Error: Failed to convert video to WAV." exit 1 fi # Run openai-whisper transcription using CLI for all formats echo "Transcribing audio to all formats (txt, vtt, srt, tsv, json) using $THREADS thread(s)..." whisper --model "$WHISPER_MODEL" --task transcribe --output_format all --output_dir "$TEMP_DIR" --threads "$THREADS" "$temp_audio" >/dev/null 2>&1 if [ $? -ne 0 ]; then echo "Error: Transcription failed." exit 1 fi # Move all transcription files to output directory for format in txt vtt srt tsv json; do local temp_output="$TEMP_DIR/${base_name}.${format}" local final_output="$OUTPUT_DIR/${base_name}_transcription.${format}" if [ -f "$temp_output" ]; then mv "$temp_output" "$final_output" if [ $? -ne 0 ]; then echo "Error: Failed to save $format transcription." exit 1 fi echo "Transcription saved to $final_output" else echo "Warning: $format output not generated." fi done } # Main logic if [[ "$INPUT" == https://* ]]; then process_url "$INPUT" elif [ -f "$INPUT" ]; then process_local_file "$INPUT" else echo "Error: Input file does not exist or is not a valid URL." usage fi exit 0BASH to Home