-2

私は、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 
+0

事故:最初の行は '#!/ bin // bash'('# 'がありません)でなければなりません。そうでなければ、それはシバン行として認識されません。実行可能なスクリプトに '* .sh'という名前をつけないでください。誤ってPOSIX準拠のスクリプトを示唆しています。一般的にサフィックスを使用する必要はありません。シバンの行だけでスクリプトの実行方法を決めることができます後で別の言語でスクリプトを実装することができます)。 '[...] 'を使ってPOSIXに準拠したままにする必要がなければ、Bash構文(' == ')とPOSIX構文(' [...] ')を混在させています。 – mklement0

+0

さらに根本的に、あなたの質問は「騒々しい」、幅広く、焦点が欠けています。簡潔で具体的で集中的な質問をすると、助けを得るチャンスが増えます。 – mklement0

+2

Pythonスクリプトは本当に 'sudo'で実行する必要がありますか?これはセキュリティ上の問題のようです。 – tripleee

答えて

0

と呼ばれるファイルにサーバーをテキストにGoogleの音声からの応答を書くことですこれは広い質問ですので、私はそれを実装せずに戦略を提案します。

まず、音声を逃さないように、連続して録音する必要があります。あなたは

nohup arecord --max-file-time 1 out.wav & 

でこれを達成することができ、この(私はout-99.wav後に何が起こるかな?)... out-01.wavout-02.wav、などのような名前の多くの1秒wavファイルを作成し、継続的に記録する必要があり、1秒は、可能な限り最小であるように思わ。 nohup ... &は、バックグラウンドで永久に実行されます。

次に、新しい完全WAVファイルを順番に確認するためのスクリプトが必要です。たとえば、次のwavファイルが存在するたびに、現在のファイルが処理されなければならないので、現在のファイルを処理します。

soxをインストールして、現在のwavファイルの平均とピークボリュームを取得するために

sox out-01.wav -n stats 2>&1 | grep 'RMS lev dB\|RMS Pk dB' | awk '{print $4}' 

使用しています。 < -15 dBとlev < -15 dBの場合、おそらく音声はないので、wavを削除して次の音声に移動します。 (あなたのマイク設定でピークとレベルの特定のスレッショルドを選択してテストしてください)

ボリュームがスレッショルドを超える場合は、このwavを削除しないでください。代わりにmaybespeech.wavに名前を変更し、次のものに移動します。

あなたは(maybespeech.wavがすでに存在する場合、すなわち、あなたが上記閾値wavファイルを見つける。)行の2以上のしきい値WAVファイルを見つけた場合、新しいwavファイルにマージし、マージされたwavファイルをmaybespeech.wavを置き換えるためにsoxを使用しています。次のものに移動します。

maybespeech.wavが存在する場合、しきい値未満のWAVが見つかった場合は、音声認識を行う準備が整いました。名前をmaybespeech.done.wavflacに変更して削除し、curl flac to google speech api。おそらくflacに一意の名前をつけ、バックグラウンドでカールして、次のwavの処理をブロックしないようにしてください。

最高の運勢!

+0

これは私が探しているものです。 soxコマンドが優れていました。しかし、私はarecordコマンドで受け取っている出力を理解していません。それは私に "nohup.out"という名前のファイルを提供しています。私の研究から、これは期待されています。しかし、私は出力wavファイルを受信して​​いません。 "nohup.out"ファイルの中に "arecord:main:722:audio open error:そのようなファイルやディレクトリはありません"と書かれています。私が間違っていることはありますか? – supermitchell2

関連する問題