私は、SiriやAmazon Echoに似た小さな音声認識プログラムを開発しています。私の家の周りの小さな仕事を簡単にすることができます。私はbashに非常に新しくなっているので、Google Speech To Textサーバーへのデータフローを継続する必要性を減らすための支援をしたいと思います。現在、私は新しいオーディオファイルを3秒ごとに録音し、それを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に送信するために音声を録音し始めます。このサウンドトリガーの作成方法や、一般的にこれらのサーバーへの要求量を単純に削減する方法について、誰でも提案することができれば非常に役に立ちます。
さらに、現在の方法では、スピーカーが始まる前に録音が開始される可能性があるため、一部のオーディオが2つ以上のファイルに分割されます。音を聞いて録音をトリガーすると、この問題も解決されます。
私のコードに関するすべての提案は大歓迎です。さらに詳しい情報が必要な場合は、コメントでリクエストしてください。私はあなたが知る必要のあるものをお届けします。私の質問に何か問題がある場合は、コメントを残して、将来間違いをしないようにしてください。 bashスクリプトを以下に示します。
注:このスクリプトの目的は「SpeechLog.txt」
speech-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 "[email protected]"
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
事故:最初の行は '#!/ bin // bash'('# 'がありません)でなければなりません。そうでなければ、それはシバン行として認識されません。実行可能なスクリプトに '* .sh'という名前をつけないでください。誤ってPOSIX準拠のスクリプトを示唆しています。一般的にサフィックスを使用する必要はありません。シバンの行だけでスクリプトの実行方法を決めることができます後で別の言語でスクリプトを実装することができます)。 '[...] 'を使ってPOSIXに準拠したままにする必要がなければ、Bash構文(' == ')とPOSIX構文(' [...] ')を混在させています。 – mklement0
さらに根本的に、あなたの質問は「騒々しい」、幅広く、焦点が欠けています。簡潔で具体的で集中的な質問をすると、助けを得るチャンスが増えます。 – mklement0
Pythonスクリプトは本当に 'sudo'で実行する必要がありますか?これはセキュリティ上の問題のようです。 – tripleee