触发高麦克风输入 Bash
High Microphone Input Triggered Bash
我一直致力于开发一个类似于 Siri 或 Amazon Echo 的小型语音识别程序,它可以让我简化家里的一些小任务。我对 bash 非常陌生,因此我需要一些帮助来减少持续数据流到 Google Speech To Text 服务器的必要性。目前,我每三秒钟录制一个新的音频文件并将其发送到 Google 服务器进行翻译。这种方法看起来效率很低。这部分代码如下所示。
while :
do
trap CTRLc INT
echo "[speech-recog]: Recording"
(arecord -D $hardware -q -f S16_LE -d $duration -r 16000 | flac - -f --best --sample-rate 16000 -o /dev/shm/out.flac 1>/dev/shm/voice.log 2>/dev/shm/voice.log; curl -s -X POST$
sleep $sleepduration
echo "[speech-recog]: Recording"
(arecord -D $hardware -q -f S16_LE -d $duration -r 16000 | flac - -f --best --sample-rate 16000 -o /dev/shm/out.flac 1>/dev/shm/voice.log 2>/dev/shm/voice.log; curl -s -X POST$
sleep $sleepduration
done
相反,我假设让这个脚本语音触发会大大减少我网络上的互联网流量。通过语音触发,我的意思是它开始录制音频以在听到特定音量或更高音量的声音后发送到 Google。如果有人可以就我应该如何创建此声音触发器或简单地减少对这些服务器的请求量提供任何建议,那将非常有帮助。
此外,当前的方法会导致某些音频被拆分为两个或多个文件,因为录音可能会在演讲者开始之前的任何时间开始。在听到声音时触发录音也可以解决这个问题。
欢迎与我的代码相关的任何和所有建议。如果需要任何进一步的信息,请在评论中提出要求,我很乐意为您提供任何您需要了解的信息。如果您对我的问题有任何疑问,请发表评论,这样我就知道以后不会犯这样的错误。 bash 脚本如下所示。
注意:此脚本的 objective 是将来自 Google Speech to Text 服务器的响应写入名为 "SpeechLog.txt"
的文件
语音-recog.sh
#!/bin/bash
hardware="plughw:1,0"
duration="3"
sleepduration="3.05"
lang="en"
hw_bool=0
dur_bool=0
lang_bool=0
CTRLc() {
echo "[speech-recog]: Terminating Faide master script. Are you sure (yes/no)?"
read ShouldQuit
if [ ${ShouldQuit^^} = "YES" ]
then
echo "[speech-recog]: Confirmation accepted, terminating script"
sudo python3 Cleanup.py
kill $$
else
echo "[speech-recog]: Denial accepted. Exiting confirmation request"
clear
echo "[speech-recog]: Listening..."
fi
}
for var in "$@"
do
if [ "$var" == "-D" ] ; then
hw_bool=1
elif [ "$var" == "-d" ] ; then
dur_bool=1
elif [ "$var" == "-l" ] ; then
lang_bool=1
elif [ $hw_bool == 1 ] ; then
hw_bool=0
hardware="$var"
elif [ $dur_bool == 1 ] ; then
dur_bool=0
duration="$var"
elif [ $lang_bool == 1 ] ; then
lang_bool=0
lang="$var"
else
echo "[speech-recog]: Invalid option, valid options are -D for hardware and -d for duration"
fi
done
CheckFile() {
LineCount=`cat SpeechLog.txt | wc -l`
if [ $LineCount -gt 1 ]
then
sudo rm /dev/shm/out.flac
sudo python3 VoiceMain.py
fi
}
clear
echo "[speech-recog]: Speech recognition initialized"
echo "[speech-recog]: Listening..."
while :
do
trap CTRLc INT
echo "[speech-recog]: Recording"
(arecord -D $hardware -q -f S16_LE -d $duration -r 16000 | flac - -f --best --sample-rate 16000 -o /dev/shm/out.flac 1>/dev/shm/voice.log 2>/dev/shm/voice.log; curl -s -X POST$
sleep $sleepduration
echo "[speech-recog]: Recording"
(arecord -D $hardware -q -f S16_LE -d $duration -r 16000 | flac - -f --best --sample-rate 16000 -o /dev/shm/out.flac 1>/dev/shm/voice.log 2>/dev/shm/voice.log; curl -s -X POST$
sleep $sleepduration
done
这是一个宽泛的问题,所以我只会提出一个策略而不去实施它。
首先,您需要连续录音,以免遗漏任何音频。你可以用
完成这个
nohup arecord --max-file-time 1 out.wav &
这应该连续记录,创建许多 1 秒的 wav 文件,命名为 out-01.wav
、out-02.wav
等...(我想知道 out-99.wav
之后会发生什么?)1 秒似乎尽可能小。 nohup ... &
导致它 运行 永远在后台。
接下来,您需要一个脚本来按顺序连续检查是否有任何新的完整 wav 文件。例如,每次存在下一个wav文件时,必须执行当前文件,因此处理当前文件。
安装sox
并使用
sox out-01.wav -n stats 2>&1 | grep 'RMS lev dB\|RMS Pk dB' | awk '{print }'
获取当前wav的平均音量和峰值音量。如果 peak < -15 dB 且 lev < -15 dB,则可能没有语音,因此删除 wav 并移至下一个。 (测试您的麦克风设置以选择特定的峰值和电平阈值。)
如果音量超过阈值,则不要删除此 wav。相反,将其重命名为 maybespeech.wav
,然后转到下一个。
如果你在一行中找到两个高于阈值的 wav(即,当 maybespeech.wav
已经存在时你发现一个高于阈值的 wav),使用 sox
将它们合并为一个新的 wav 并且用合并的 wav 替换 maybespeech.wav
。然后移动到下一个。
如果在 maybespeech.wav
存在时发现低于阈值的 wav,那么您就可以进行一些语音识别了。将其重命名为 maybespeech.done.wav
、flac
、删除它,并将 curl
flac 更改为 google speech api。也许给 flac 命名并在后台做卷曲,这样就不会阻止处理下一个 wav。
祝你好运!
我一直致力于开发一个类似于 Siri 或 Amazon Echo 的小型语音识别程序,它可以让我简化家里的一些小任务。我对 bash 非常陌生,因此我需要一些帮助来减少持续数据流到 Google Speech To Text 服务器的必要性。目前,我每三秒钟录制一个新的音频文件并将其发送到 Google 服务器进行翻译。这种方法看起来效率很低。这部分代码如下所示。
while :
do
trap CTRLc INT
echo "[speech-recog]: Recording"
(arecord -D $hardware -q -f S16_LE -d $duration -r 16000 | flac - -f --best --sample-rate 16000 -o /dev/shm/out.flac 1>/dev/shm/voice.log 2>/dev/shm/voice.log; curl -s -X POST$
sleep $sleepduration
echo "[speech-recog]: Recording"
(arecord -D $hardware -q -f S16_LE -d $duration -r 16000 | flac - -f --best --sample-rate 16000 -o /dev/shm/out.flac 1>/dev/shm/voice.log 2>/dev/shm/voice.log; curl -s -X POST$
sleep $sleepduration
done
相反,我假设让这个脚本语音触发会大大减少我网络上的互联网流量。通过语音触发,我的意思是它开始录制音频以在听到特定音量或更高音量的声音后发送到 Google。如果有人可以就我应该如何创建此声音触发器或简单地减少对这些服务器的请求量提供任何建议,那将非常有帮助。
此外,当前的方法会导致某些音频被拆分为两个或多个文件,因为录音可能会在演讲者开始之前的任何时间开始。在听到声音时触发录音也可以解决这个问题。
欢迎与我的代码相关的任何和所有建议。如果需要任何进一步的信息,请在评论中提出要求,我很乐意为您提供任何您需要了解的信息。如果您对我的问题有任何疑问,请发表评论,这样我就知道以后不会犯这样的错误。 bash 脚本如下所示。
注意:此脚本的 objective 是将来自 Google Speech to Text 服务器的响应写入名为 "SpeechLog.txt"
的文件语音-recog.sh
#!/bin/bash
hardware="plughw:1,0"
duration="3"
sleepduration="3.05"
lang="en"
hw_bool=0
dur_bool=0
lang_bool=0
CTRLc() {
echo "[speech-recog]: Terminating Faide master script. Are you sure (yes/no)?"
read ShouldQuit
if [ ${ShouldQuit^^} = "YES" ]
then
echo "[speech-recog]: Confirmation accepted, terminating script"
sudo python3 Cleanup.py
kill $$
else
echo "[speech-recog]: Denial accepted. Exiting confirmation request"
clear
echo "[speech-recog]: Listening..."
fi
}
for var in "$@"
do
if [ "$var" == "-D" ] ; then
hw_bool=1
elif [ "$var" == "-d" ] ; then
dur_bool=1
elif [ "$var" == "-l" ] ; then
lang_bool=1
elif [ $hw_bool == 1 ] ; then
hw_bool=0
hardware="$var"
elif [ $dur_bool == 1 ] ; then
dur_bool=0
duration="$var"
elif [ $lang_bool == 1 ] ; then
lang_bool=0
lang="$var"
else
echo "[speech-recog]: Invalid option, valid options are -D for hardware and -d for duration"
fi
done
CheckFile() {
LineCount=`cat SpeechLog.txt | wc -l`
if [ $LineCount -gt 1 ]
then
sudo rm /dev/shm/out.flac
sudo python3 VoiceMain.py
fi
}
clear
echo "[speech-recog]: Speech recognition initialized"
echo "[speech-recog]: Listening..."
while :
do
trap CTRLc INT
echo "[speech-recog]: Recording"
(arecord -D $hardware -q -f S16_LE -d $duration -r 16000 | flac - -f --best --sample-rate 16000 -o /dev/shm/out.flac 1>/dev/shm/voice.log 2>/dev/shm/voice.log; curl -s -X POST$
sleep $sleepduration
echo "[speech-recog]: Recording"
(arecord -D $hardware -q -f S16_LE -d $duration -r 16000 | flac - -f --best --sample-rate 16000 -o /dev/shm/out.flac 1>/dev/shm/voice.log 2>/dev/shm/voice.log; curl -s -X POST$
sleep $sleepduration
done
这是一个宽泛的问题,所以我只会提出一个策略而不去实施它。
首先,您需要连续录音,以免遗漏任何音频。你可以用
完成这个nohup arecord --max-file-time 1 out.wav &
这应该连续记录,创建许多 1 秒的 wav 文件,命名为 out-01.wav
、out-02.wav
等...(我想知道 out-99.wav
之后会发生什么?)1 秒似乎尽可能小。 nohup ... &
导致它 运行 永远在后台。
接下来,您需要一个脚本来按顺序连续检查是否有任何新的完整 wav 文件。例如,每次存在下一个wav文件时,必须执行当前文件,因此处理当前文件。
安装sox
并使用
sox out-01.wav -n stats 2>&1 | grep 'RMS lev dB\|RMS Pk dB' | awk '{print }'
获取当前wav的平均音量和峰值音量。如果 peak < -15 dB 且 lev < -15 dB,则可能没有语音,因此删除 wav 并移至下一个。 (测试您的麦克风设置以选择特定的峰值和电平阈值。)
如果音量超过阈值,则不要删除此 wav。相反,将其重命名为 maybespeech.wav
,然后转到下一个。
如果你在一行中找到两个高于阈值的 wav(即,当 maybespeech.wav
已经存在时你发现一个高于阈值的 wav),使用 sox
将它们合并为一个新的 wav 并且用合并的 wav 替换 maybespeech.wav
。然后移动到下一个。
如果在 maybespeech.wav
存在时发现低于阈值的 wav,那么您就可以进行一些语音识别了。将其重命名为 maybespeech.done.wav
、flac
、删除它,并将 curl
flac 更改为 google speech api。也许给 flac 命名并在后台做卷曲,这样就不会阻止处理下一个 wav。
祝你好运!