
Я работаю на платформе Ubuntu 22.04. Я сделал простую кнопку GUI в c named t2s
и поместил ее в ~/.local/bin
чей путь добавлен в PATH
переменную окружения. Пока я нажимаю кнопку, она записывает голос с микрофона во временный файл. Когда я отпускаю кнопку, GUI закрывается. Я запускаю следующую строку, которая хорошо работает в терминале:
t2s && notify-send -u normal -t 10000 "$( whispercpp -m /home/****/Desktop/2022-10/whisper.cpp/models/ggml-small.bin -nt -l tr -f /dev/shm/mic.wav )"
Голос отправляется в whispercpp
движок преобразования речи в текст и транскрибируется. Результат отображается в уведомлении на экране.
Но когда я помещаю эту строку в файл и запускаю его, например:
#!/bin/bash
t2s && notify-send -u normal -t 10000 "$( whispercpp -m /home/****/Desktop/2022-10/whisper.cpp/models/ggml-small.bin -nt -l tr -f /dev/shm/mic.wav )"
exit 0
он выполняет только кнопку GUI, когда GUI выходит после отпускания кнопки, он не выполняется
notify-send -u normal -t 10000 "$( whispercpp -m /home/****/Desktop/2022-10/whisper.cpp/models/ggml-small.bin -nt -l tr -f /dev/shm/mic.wav )"
часть
Что я делаю не так?
РЕДАКТИРОВАТЬ:
Я также попробовал сделать это так:
#!/bin/bash
t2s
TEXT=$( whispercpp -m /home/****/Desktop/2022-10/whisper.cpp/models/ggml-small.bin -nt -l tr -f /dev/shm/mic.wav )"
notify-send -u normal -t 10000 $TEXT
Ничего не изменилось.
РЕДАКТИРОВАТЬ:
Я заметил, что это связано с внутренним устройством оболочки.
- https://stackoverflow.com/questions/81520/how-to-suppress-terminated-message-after-killing-in-bash
- https://stackoverflow.com/questions/32551713/how-can-i-silence-the-terminated-message-when-my-command-is-killed-by-timeout
- https://unix.stackexchange.com/questions/65902/why-does-bash-show-terminated-after-killing-a-process
Я до сих пор не знаю, как это преодолеть.
решение1
Прочитав следующие ссылки:
Я понял, что завершение ffmpeg
строки, которая была выполнена внутри, GUI button
приводит к завершению оболочки bash после t2s
GUI. Я обошел эту проблему, связав chat up SIGINT
и SIGTERM
signals внутри trap
блока, а затем поместил в него остальные команды после t2s
:
#!/bin/bash
trap_with_arg() { # from https://stackoverflow.com/a/2183063/804678
local func="$1"; shift
for sig in "$@"; do
trap "$func $sig" "$sig"
done
}
stop() {
trap - SIGINT EXIT
printf '\n%s\n' "received $1, killing child processes"
notify-send -u normal -t 10000 "$(whispercpp -m /home/**/Desktop/2022-10/whisper.cpp/models/ggml-small.bin -nt -l tr -f /dev/shm/mic.wav )"
kill -s SIGINT 0
}
trap_with_arg 'stop' EXIT SIGINT SIGTERM SIGHUP
t2s
exit 0