summaryrefslogtreecommitdiff
path: root/voice_changer.sh
diff options
context:
space:
mode:
Diffstat (limited to 'voice_changer.sh')
-rwxr-xr-xvoice_changer.sh119
1 files changed, 119 insertions, 0 deletions
diff --git a/voice_changer.sh b/voice_changer.sh
new file mode 100755
index 0000000..b381dc5
--- /dev/null
+++ b/voice_changer.sh
@@ -0,0 +1,119 @@
+#!/bin/bash
+
+set -e
+
+MIC_NAME=""
+MIC_SOURCE=""
+SINK_SOURCE=""
+SWAP_FLAG=0
+
+function load_sinks ()
+{
+ if [[ -z "$(pactl list short modules | grep "VoiceChangerSink")" ]]; then
+ pactl load-module module-null-sink sink_name=VoiceChangerSink
+ else
+ echo -e "\nSinks already loaded."
+ fi
+}
+
+function configure_mic ()
+{
+ MIC_NAME=$( pactl list source-outputs | grep -B 17 "WEBRTC VoiceEngine" | grep "Source Output \#" | sed -r "s|^.*\#||g" )
+ MIC_SOURCE=$( pactl list source-outputs | grep -B 17 "WEBRTC VoiceEngine" | grep "Source\:" | sed -r "s|^.*\:\ ||g" )
+ SINK_SOURCE=$( pactl list sources | grep -B 3 "VoiceChangerSink.monitor" | grep "Source \#" | sed -r "s|^.*\#||g" )
+ MIC_DEFAULT=$( pactl list sources | grep -B 3 "alsa_input.usb-C-Media_Electronics_Inc._YMC_1040-00.mono-fallback" | grep "Source \#" | sed -r "s|^.*\#||g" )
+}
+
+function toggle ()
+{
+ if [[ "$MIC_SOURCE" -ne "$SINK_SOURCE" ]]; then
+ pactl move-source-output "$MIC_NAME" "VoiceChangerSink.monitor" && $HOME/stuf/scripts/notification_wrapper.sh "\nMICROPHONE\nHAS BEEN MOVED TO SINK\n$SINK_SOURCE" "VOICHANG"
+ else
+ pactl move-source-output "$MIC_NAME" "$MIC_DEFAULT" && $HOME/stuf/scripts/notification_wrapper.sh "\nMICROPHONE\nHAS BEEN MOVED TO SINK\n$MIC_DEFAULT" "VOICHANG"
+ fi
+}
+
+function normal ()
+{
+ sox -t pulseaudio default -t pulseaudio VoiceChangerSink
+}
+
+function bladewolf ()
+{
+ if [[ $SWAP_FLAG -eq 1 || -z $( pgrep -f "sox" ) ]]; then
+ pgrep -f "sox" >/dev/null 2>&1 && pkill -f "sox"
+ while [[ -n $(pgrep -f "sox") ]]; do
+ :
+ done
+ nohup sh -c "sox -t pulseaudio default -p pitch -225 | sox - -m -t pulseaudio default -t pulseaudio VoiceChangerSink pitch +75 echo 0.4 0.8 40 0.8 gain +7.5 bass +25" >/dev/null 2>&1 &
+ else
+ echo -e "\nOne voice is already loaded and a swap wasn't explicitly requested."
+ fi
+}
+
+function demonbot ()
+{
+ if [[ $SWAP_FLAG -eq 1 || -z $( pgrep -f "sox" ) ]]; then
+ pgrep -f "sox" >/dev/null 2>&1 && pkill -f "sox"
+ while [[ -n $(pgrep -f "sox") ]]; do
+ :
+ done
+ nohup sh -c "sox -t pulseaudio default -p pitch -225 | sox - -m -t pulseaudio default -t pulseaudio VoiceChangerSink pitch -75 echo 0.4 0.8 40 0.8 gain +7.5 bass +25" >/dev/null 2>&1 &
+ else
+ echo -e "\nOne voice is already loaded and a swap wasn't explicitly requested."
+ fi
+}
+
+function looper ()
+{
+ # gain +7.5
+ if [[ $SWAP_FLAG -eq 1 || -z $( pgrep -f "sox" ) ]]; then
+ pgrep -f "sox" >/dev/null 2>&1 && pkill -f "sox"
+ while [[ -n $(pgrep -f "sox") ]]; do
+ :
+ done
+ nohup sh -c "sox -t pulseaudio default -p pitch +15 | sox - -m -t pulseaudio default -t pulseaudio VoiceChangerSink pitch -15 echo 0.4 0.8 30 0.75 bass +25 treble +12" >/dev/null 2>&1 &
+ else
+ echo -e "\nOne voice is already loaded and a swap wasn't explicitly requested."
+ fi
+}
+
+function unload_sinks ()
+{
+ read -r -p "Are you sure? [y/N] " response
+ response=${response,,} # tolower
+ if [[ "$response" =~ ^(yes|y)$ ]]; then
+ pactl move-source-output "$MIC_NAME" "$MIC_DEFAULT" && $HOME/stuf/scripts/notification_wrapper.sh "\nMICROPHONE\nHAS BEEN MOVED TO SINK\n$MIC_DEFAULT" "VOICHANG"
+ pgrep -f "sox" >/dev/null 2>&1 && pkill -f "sox"
+ while [[ -n $(pgrep -f "sox") ]]; do
+ :
+ done
+ pactl list short modules | grep "VoiceChangerSink" | cut -f1 | xargs -L1 pactl unload-module
+ echo -e "\nSinks unloaded."
+ else
+ echo -e "\nSink unloading aborted."
+ fi
+}
+
+[[ -z $( grep -E "^alsa_output.pci-0000_03_04.0.analog-stereo$" $HOME/.config/pulse/* ) || -z $( grep -E "^alsa_input.pci-0000_03_04.0.iec958-stereo$" $HOME/.config/pulse/* ) ]] \
+&& $HOME/stuf/scripts/notification_wrapper.sh "\nSYSTEM CHANGE DETECTED, TERMINATING PROGRAM" "VOICHANG" && exit
+
+load_sinks
+looper
+configure_mic
+
+while getopts "hlunrt" opt; do
+ case $opt in
+ h) echo -e "usage: $0 [-h help] [-n notify-send sinks] [-l load sinks] [-u unload sinks] [-r reset sinks]\n\nSuggested Keyboard Shortcuts:\n"; printf '%s\n' "${SHORTCUTS[@]}"; exit ;; # PRINT HELP IN TERMINAL
+ l) load_sinks; exit ;; # LOAD ALL SINKS
+ u) unload_sinks; exit ;; # UNLOAD ALL SINKS
+ # n) notify_sinks; exit ;; # LIST ALL SINKS VIA WRAPPER
+ # r) reset_sinks; exit ;; # RESET ALL SINKS
+ t) toggle; exit;;
+ ?) echo "error: option -$OPTARG is not implemented"; exit ;;
+ esac
+done
+
+
+#trap 'echo "penis"' SIGINFO
+#trap cleanup EXIT