-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 スクリプトを以下に示します。

注: このスクリプトの目的は、Google Speech to Text サーバーからの応答を「SpeechLog.txt」というファイルに書き込むことです。

音声認識.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
4

1 に答える 1

1

これは幅広い質問なので、戦略を実行せずに提案するだけです。

まず、音声が失われないように継続的に録音する必要があります。あなたはこれを達成することができます

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

out-01.wavこれは継続的に記録され、 、 などの名前の 1 秒の 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 $4}'

現在のwavの平均音量とピーク音量を取得します。ピークが -15 dB 未満で、レベルが -15 dB 未満の場合は、おそらく音声がないため、wav を削除して次のページに移動します。(マイクのセットアップでテストして、ピークとレベルの特定のしきい値を選択してください。)

音量がしきい値を超えている場合は、この wav を削除しないでください。代わりに、名前を に変更してmaybespeech.wavから、次のものに進みます。

しきい値を超える wav が 2 つ続けて見つかった場合 (つまり、しきい値を超えた wav がmaybespeech.wav既に存在する場合)、 を使用soxしてそれらを新しい wav にマージし、マージされた wav に置き換えmaybespeech.wavます。次に移動します。

しきい値未満の wav がmaybespeech.wav存在する場合は、音声認識を実行する準備ができています。名前を に変更しmaybespeech.done.wavflacそれを削除しcurl、flac を google speech api に変更します。flac に一意の名前を付け、バックグラウンドで curl を実行して、次の wav の処理を​​ブロックしないようにすることもできます。

頑張ってください!

于 2016-06-29T08:56:10.593 に答える