pbx.nix (1840B)
1 {pkgs, ...}: 2 3 let 4 pbx = pkgs.writeShellScriptBin "pbx" '' 5 6 set -euo pipefail 7 8 usage() { 9 local prog=''${0##*/} 10 cat <<EOF 11 Usage: 12 $prog <model> <input> [output] [--volume N] 13 14 Examples: 15 $prog samsung greeting.mp3 16 $prog samsung greeting.mp3 output.wav 17 $prog gamma prompt.flac --volume 0.8 18 $prog webex prompt.wav output.wav --volume 0.75 19 EOF 20 exit 1 21 } 22 23 VOLUME="" 24 POSITIONAL=() 25 26 while [[ $# -gt 0 ]]; do 27 case "$1" in 28 --volume) 29 [[ $# -ge 2 ]] || { 30 echo "--volume requires a value" 31 exit 1 32 } 33 VOLUME="$2" 34 shift 2 35 ;; 36 -h|--help) 37 usage 38 ;; 39 *) 40 POSITIONAL+=("$1") 41 shift 42 ;; 43 esac 44 done 45 46 set -- "''${POSITIONAL[@]}" 47 48 [[ $# -ge 2 && $# -le 3 ]] || usage 49 50 MODEL=$(tr '[:upper:]' '[:lower:]' <<<"$1") 51 INPUT="$2" 52 53 if [[ $# -eq 3 ]]; then 54 OUTPUT="''${3%.*}.wav" 55 else 56 OUTPUT="''${INPUT%.*}.wav" 57 fi 58 59 [[ -f "$INPUT" ]] || { 60 echo "Input file not found." 61 exit 1 62 } 63 64 case "$MODEL" in 65 samsung|3cx|webex) CODEC_ARGS=(-codec:a pcm_s16le -ab 128k) ;; 66 lg-emg|lg-ucp|panasonic|gamma) CODEC_ARGS=(-codec:a pcm_mulaw -ab 64k) ;; 67 lg-hosted) CODEC_ARGS=(-codec:a pcm_s16le -ab 64k) ;; 68 *) echo "Unknown model '$MODEL'" && exit 1 ;; 69 esac 70 71 FFMPEG_ARGS=() 72 73 if [[ -n "$VOLUME" ]]; then 74 FFMPEG_ARGS+=(-af "volume=$VOLUME") 75 fi 76 77 # Avoid overwriting the input if converting an existing WAV. 78 if [[ "$(realpath "$INPUT")" == "$(realpath -m "$OUTPUT")" ]]; then 79 BACKUP="''${INPUT%.wav}.original.wav" 80 81 if [[ -e "$BACKUP" ]]; then 82 i=1 83 while [[ -e "''${INPUT%.wav}.original.''${i}.wav" ]]; do 84 ((i++)) 85 done 86 BACKUP="''${INPUT%.wav}.original.''${i}.wav" 87 fi 88 89 mv "$INPUT" "$BACKUP" 90 INPUT="$BACKUP" 91 92 echo "Original renamed to $BACKUP" 93 fi 94 95 ${pkgs.ffmpeg}/bin/ffmpeg -i "$INPUT" -ar 8000 -ac 1 "''${CODEC_ARGS[@]}" "''${FFMPEG_ARGS[@]}" "$OUTPUT" 96 97 echo "Created $OUTPUT" 98 99 ''; 100 in { 101 environment.systemPackages = [pbx]; 102 }