我在 Ubuntu 22.04 平台上。我用 c 语言创建了一个简单的按钮 GUI,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
什么都没改变。
编辑:
我注意到它与 shell 内部相关。
- 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 Shell 在 GUI 之后终止t2s
。我通过在块内进行聊天SIGINT
和SIGTERM
信号处理解决了该问题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