#!/bin/sh
#
# RJP 21.9.2025 machine speaker 2
# simple version from machinespeaker
# default speed should be 130
# 22.9.2025 FreeBSD version
# packages yad and espeak-ng are required. Package sox is good to be installed
# 17.7.2026 Recording option not work yet, but it will work when FreeBSD gets pipewire working
# 18.7.2026 version where has funny recording option too
####################################################################################
########### INSTRUCTIONS ###########################################################
#### INSTALL PACKAGES ##############################################################
#### sudo pkg install pipewire wireplumber pipewire-spa-oss sox virtual_oss ffmpeg #
#### SET UP XDG_RUNTIME_DIR ########################################################
#### mkdir -p /tmp/runtime-$(whoami) ###############################################
#### export XDG_RUNTIME_DIR=/tmp/runtime-$(whoami) #################################
#### START DAEMONS #################################################################
#### pipewire & ####################################################################
#### pipewire-pulse & ##############################################################
#### wireplumber & #################################################################
#### TEST PIPEWIRE #################################################################
#### pw-play happy_birthday.wav ####################################################
####################################################################################
time=$(date "+%F-%H-%M-%S")

315=$({                                   
echo '#!/bin/sh
pw-record -P "'{ stream.capture.sink=true }'" /tmp/ms-audio.flac 
'
} > /tmp/record-ms-audio) 

316=$({  
echo '#!/bin/sh
time=$(date "+%F-%H-%M-%S")
pkill pw-record && ffmpeg -i /tmp/ms-audio.flac -ab 320k MACHINE-SPEAKER-audio-$time.mp3 & 
'
} > /tmp/stop-recording)

chmod +x /tmp/record-ms-audio
chmod +x /tmp/stop-recording

echo "
50

55

60

65

70

75

80

85

90

95
 
100

105

110

115

120

125

130

135 
 
140

145

150

155

160

165

170

175

180

185

190

195

200   

" > /tmp/options.txt

SPEAK="$(yad --center --entry --width=700 --height=100 --text-align=center --button=OK:0 --title="Write or paste here" --
text="WRITE OR PASTE TEXT INTO BOX" --entry --entry-label=BOX --entry-text="")"
echo "$SPEAK" > /tmp/input.txt

choose=$(cat /tmp/options.txt | \
yad --list --title="select words per minute speed" --text="select words per minute speed" --button=OK:0 --center --radiolist \
  --width=500 --height=2000 \
  --height=300 \
  --column=Select \
  --column=words
) 
cat "$choose" 2> /tmp/tone.txt

cat /tmp/tone.txt | awk '{print $2}' > /tmp/tone2.txt
cat /tmp/tone2.txt | sed 's/^.//' > /tmp/tone3.txt
sed -i 's/TRUE|//g' /tmp/tone3.txt 
tr -dc '0-9' < /tmp/tone3.txt > /tmp/tone4.txt

locale=$(
yad --list --title="select locale" --text="select locale" --button=OK:0 --center --radiolist \
  --width=250 --height=500 \
  --column=fi \
  --column=en \
true fi false af false an false bg false bn false bs false ca false cs false cy false da false de false el false en false en-gb false en-sc false en-uk false en-uk-rp false en-uk-wmids false en-us false en-wi false eo false es false es-la false et false eu false fa false fa false fa-pin false fr-be false fr-fr false ga false grc false gu false hi false hr false hu false hy false hy-west false ia false id false is false it false jbo false ka false kn false ku false la false lfn false lt false lv false mk false ml false ms false ne false nl false no false pa false pl false pt-br false pt-pt false ro false ru false sk false sq false sr false sv false sw false ta false te false tr false vi false vi-hue false vi-sgn false zh false zh-yue
) 

cat "$locale" 2> /tmp/locale.txt
cat /tmp/locale.txt | awk '{print $2}' > /tmp/locale2.txt
cat /tmp/locale2.txt | sed 's/^.//' > /tmp/locale3.txt
sed -i -e 's/RUE|//g' /tmp/locale3.txt 
sed -i -e 's/.$//' /tmp/locale3.txt 
sed -i -e 's/.$//' /tmp/locale3.txt 
 

gender=$(
yad --list --title="select gender" --text="select gender" --button=OK:0 --center --radiolist \
  --width=300 --height=200 \
  --column="man is m5" \
  --column="woman is f5"\
  true m5 false f5
) 

cat "$gender" 2> /tmp/gender.txt
cat /tmp/gender.txt | awk '{print $2}' > /tmp/gender2.txt
cat /tmp/gender2.txt | sed 's/^.//' > /tmp/gender3.txt
sed -i -e 's/TRUE|//g' /tmp/gender3.txt 
sed -i -e 's/RUE|//g' /tmp/gender3.txt 
sed -i -e 's/.$//' /tmp/gender3.txt 
sed -i -e 's/.$//' /tmp/gender3.txt 


yad --form --center --columns=2 --rows=10 --width=500 --height=150 --title="MACHINE SPEAKER 2 PLUS" --text="MACHINE SPEAKER 2 PLUS" \
\
--field="Speak text":fbtn "sh -c 'cat /tmp/input.txt | espeak-ng -v  $(cat /tmp/locale3.txt)+$(cat /tmp/gender3.txt) -s $(cat /tmp/tone4.txt) ; exec sh' & " \
--field="Stop speaking":fbtn "sh -c 'killall espeak-ng; exec sh' & " \
--field="See mic devices":fbtn "xterm -e sh -c 'mixer -a | grep ^pcm  ; exec sh' & " \
--field="See mic level":fbtn "xterm -e sh -c 'mixer mic ; exec sh' & " \
--field="Set mic level to 70":fbtn "xterm -e sh -c 'mixer mic.volume=0.70 ; exec sh' & " \
--field="Load virtual_oss for recording":fbtn "xterm -e sh -c 'sudo virtual_oss -Q 0 -C 2 -c 2 -r 48000 -b 16 -s 1024 -P /dev/dsp0 -R /dev/null -w vdsp.wav -l dsp  ; exec sh' & " \
--field="Test virtual oss":fbtn "xterm -e sh -c 'espeak-ng 'virtual oss is loaded succeesfully, you can start recording' ; exec sh' & " \
--field="Record audio with ffmpeg":fbtn "xterm -e sh -c ' ffmpeg -f oss -i /dev/dsp -f mp3 Recording-$time.mp3; exec sh' & " \
--field="Stop ffmpeg recording":fbtn "xterm -e sh -c ' pkill ffmpeg; exec sh' & " \
--field="Record audio with sox":fbtn "xterm -e sh -c ' sox -r 48k -b 16 -v 0.99 -t oss /dev/dsp -t wav Recording-$time.wav; exec sh' & " \
--field="Stop sox recording":fbtn "xterm -e sh -c ' pkill sox; exec sh' & " \
--field="Record monitor audio with Pipewire (not working yet)":fbtn "/tmp/./record-ms-audio " \
--field="Stop Pipewire recording audio":fbtn "/tmp/./stop-recording " \
--field="Unload virtual_oss":fbtn "xterm -e sh -c 'sudo killall virtual_oss ; exec sh' & " \
--button=Exit:1

cd /tmp && rm gender3.txt locale3.txt tone3.txt gender.txt locale.txt tone.txt input.txt gender2.txt locale2.txt options.txt tone2.txt tone4.txt record-ms-audio stop-recording


