nix-configs

Personal NixOS and home-manager configuration files
Log | Files | Refs

pbx.nix (2082B)


      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 }