ホンクは、キーワードスポッティングのためのGoogleのTensorflow畳み込みニューラルネットワークのPytorch再実装であり、Speech Commands Datasetの最近のリリースに伴うものです。詳細については、記事を参照してください。
ホンクは、インタラクティブなインテリジェントエージェントのデバイス上の音声認識能力を構築するのに役立ちます。コードを使用して、単純なコマンド(「停止」や「GO」など)を識別し、カスタム「コマンドトリガー」(「Hey Siri!」)を検出するために適合させることができます。
このビデオをチェックして、Demo of Honk in Action!
以下の手順を使用して、デモアプリケーション(上記のビデオに表示)を自分で実行してください!
現在、PytorchはLinuxとOS Xのみを公式にサポートしています。したがって、Windowsユーザーはこのデモを簡単に実行できません。
デモを展開するには、次のコマンドを実行します。
pip install -r requirements.txt
apt-get install freeglut3-dev
など)./fetch_data.sh
python .
python utils/speech_demo.py
CUDAの電源を切るなど、オプションを調整する必要がある場合は、 config.json
編集してください。
Mac OS Xの追加メモ:
python .
オーディオにコマンドワードが含まれているかどうかを識別するためのWebサービスを展開します。デフォルトでは、 config.json
構成に使用されますが、 --config=<file_name>
で変更できます。サーバーがファイアウォールの背後にある場合、1つのワークフローは、SSHトンネルを作成し、構成で指定されたポートでポート転送を使用することです(デフォルト16888)。
Honk-Modelsリポジトリには、Caffe2(ONNX)とPytorchの事前に訓練されたモデルがいくつかあります。 fetch_data.sh
スクリプトは、これらのモデルを取得し、 model
ディレクトリに抽出します。構成ファイルのmodel_path
とbackend
でそれぞれ使用するモデルとバックエンドをそれぞれ指定できます。具体的には、 backend
、 model_path
のフォーマットに応じて、 caffe2
またはpytorch
のいずれかにすることができます。ONNXモデルを実行するには、Packages onnx
とonnx_caffe2
システムに存在する必要があることに注意してください。これらはcompoisment.txtにありません。
残念ながら、ライブラリをRPI、特にLibrosaで作業させることは、いくつかのコマンドを実行するほど簡単ではありません。私たちはあなたのために働くかもしれないし、そうでないかもしれないプロセスを概説します。
sudo apt-get install -y protobuf-compiler libprotoc-dev python-numpy python-pyaudio python-scipy python-sklearn
pip install protobuf
pip install --no-deps onnx
PYTHONPATH
環境変数にcaffe2
モジュールパスを追加する必要がある場合があります。私たちにとって、これはexport PYTHONPATH=$PYTHONPATH:/home/pi/caffe2/build
によって達成されましたpip install onnx-caffe2
pip install -r requirements_rpi.txt
pip install --no-deps resampy librosa
python -c "import librosa"
。 NumbAに関するエラーがインストールされていないため、エラーが発生するはずです。@numba.jit
/home/pi/.local/lib/python2.7/site-packages/resampy/interpn.py
から削除する必要がありました./fetch_data.sh
config.json
では、 caffe2
にbackend
変更し、 model_path
にmodel/google-speech-dataset-full.onnx
に変更します。python .
エラーがない場合は、デフォルトでポート16888を介してアクセス可能なモデルを正常に展開しました。python utils/speech_demo.py
。作業するマイクとスピーカーが必要です。 RPIとリモートでやり取りしている場合は、スピーチデモをローカルで実行し、リモートエンドポイント--server-endpoint=http://[RPi IP address]:16888
を指定できます。 残念ながら、QAクライアントはカスタムQAサービスが必要なため、一般の人々にはまだサポートがありません。ただし、コマンドキーワードをリターゲットするために使用できます。
python client.py
QAクライアントを実行します。 python client.py --mode=retarget
実行して、キーワードをリッカーゲットできます。 Linuxディストリビューションでは、テキストからスピーチがうまく機能しない場合があることに注意してください。この場合、IBM Watsonの資格情報を--watson-username
および--watson--password
を介して提供してください。 python client.py -h
実行して、すべてのオプションを表示できます。
CNNモデル。 python -m utils.train --type [train|eval]
モデルをトレーニングまたは評価します。すべてのトレーニングの例は、音声コマンドデータセットの形式と同じ形式に従うことが期待されます。データセットにはすでに多くの有用なオーディオサンプルとバックグラウンドノイズが含まれているため、推奨されるワークフローはデータセットをダウンロードしてカスタムキーワードを追加することです。
残差モデル。 Speech Commands Datasetでres{8,15,26}[-narrow]
モデルのいずれかをトレーニングするために、次のハイパーパラメーターをお勧めします。
python -m utils.train --wanted_words yes no up down left right on off stop go --dev_every 1 --n_labels 12 --n_epochs 26 --weight_decay 0.00001 --lr 0.1 0.01 0.001 --schedule 3000 6000 --model res{8,15,26}[-narrow]
深い残留モデルの詳細については、私たちの論文を参照してください。
利用可能なコマンドオプションがあります:
オプション | 入力形式 | デフォルト | 説明 |
---|---|---|---|
--audio_preprocess_type | {mfccs、pcen} | MFCCS | 使用するオーディオプリプロースの種類 |
--batch_size | [1、n) | 100 | 使用するミニバッチサイズ |
--cache_size | [0、inf) | 32768 | オーディオキャッシュのアイテムの数は、約32 kb * nを消費します |
--conv1_pool | [1、inf)[1、inf) | 2 2 | プールフィルターの幅と高さ |
--conv1_size | [1、inf)[1、inf) | 10 4 | コンビフィルターの幅と高さ |
--conv1_stride | [1、inf)[1、inf) | 1 1 | ストライドの幅と長さ |
--conv2_pool | [1、inf)[1、inf) | 1 1 | プールフィルターの幅と高さ |
--conv2_size | [1、inf)[1、inf) | 10 4 | コンビフィルターの幅と高さ |
--conv2_stride | [1、inf)[1、inf) | 1 1 | ストライドの幅と長さ |
--data_folder | 弦 | /data/speech_dataset | データへのパス |
--dev_every | [1、inf) | 10 | エポックの観点からの開発間隔 |
--dev_pct | [0、100] | 10 | DEVに使用する合計設定の割合 |
--dropout_prob | [0.0、1.0) | 0.5 | 使用するドロップアウト率 |
--gpu_no | [-1、n] | 1 | 使用するGPU |
--group_speakers_by_id | {true、false} | 真実 | 列車/開発/テスト間でスピーカーをグループ化するかどうか |
--input_file | 弦 | ロードするモデルへのパス | |
--input_length | [1、inf) | 16000 | オーディオの長さ |
--lr | (0.0、inf) | {0.1、0.001} | 使用する学習率 |
--type | {列車、評価} | 電車 | 使用するモード |
--model | 弦 | CNN-trad-pool2 | cnn-trad-pool2 の1つ、 cnn-tstride-{2,4,8} 、 cnn-tpool{2,3} 、 cnn-one-fpool3 、 cnn-one-fstride{4,8} 、 res{8,15,26}[-narrow] 、 cnn-trad-fpool3 、 cnn-one-stride1 |
--momentum | [0.0、1.0) | 0.9 | SGDに使用する勢い |
--n_dct_filters | [1、inf) | 40 | 使用するDCTベースの数 |
--n_epochs | [0、inf) | 500 | 時代の数 |
--n_feature_maps | [1、inf) | {19、45} | 残留アーキテクチャに使用する機能マップの数 |
--n_feature_maps1 | [1、inf) | 64 | Conv Net 1の機能マップの数 |
--n_feature_maps2 | [1、inf) | 64 | Conv Net 2の機能マップの数 |
--n_labels | [1、n) | 4 | 使用するラベルの数 |
--n_layers | [1、inf) | {6、13、24} | 残留アーキテクチャの畳み込み層の数 |
--n_mels | [1、inf) | 40 | 使用するMELフィルターの数 |
--no_cuda | スイッチ | 間違い | CUDAを使用するかどうか |
--noise_prob | [0.0、1.0] | 0.8 | ノイズと混合する確率 |
--output_file | 弦 | Model/Google-Speech-Dataset.pt | モデルを保存するファイル |
--seed | (inf、inf) | 0 | 使用する種 |
--silence_prob | [0.0、1.0] | 0.1 | 沈黙を選ぶ確率 |
--test_pct | [0、100] | 10 | テストに使用する合計設定の割合 |
--timeshift_ms | [0、inf) | 100 | オーディオをランダムにシフトするためのミリ秒単位での時間 |
--train_pct | [0、100] | 80 | トレーニングに使用する合計セットの割合 |
--unknown_prob | [0.0、1.0] | 0.1 | 未知の単語を選ぶ確率 |
--wanted_words | string1 string2 ... stringn | コマンドランダム | 望ましいターゲットワード |
Honklingは、HONKのJavaScriptの実装です。ホンクリングでは、ブラウザ内のキーワードスポッティング機能を備えたさまざまなWebアプリケーションを実装することができます。
HonkとHonklingの柔軟性を向上させるために、YouTubeビデオからデータセットを構築するプログラムを提供します。詳細は、 keyword_spotting_data_generator
フォルダーにあります
次のことを行い、シーケンシャルオーディオを記録し、Speechコマンドデータセットと同じ形式に保存できます。
python -m utils.record
レコードに戻り、矢印を上げて元に戻し、「Q」を終了します。 1秒の沈黙の後、録音は自動的に停止します。
いくつかのオプションが利用可能です:
--output-begin-index: Starting sequence number
--output-prefix: Prefix of the output audio sequence
--post-process: How the audio samples should be post-processed. One or more of "trim" and "discard_true".
後処理は、「役に立たない」オーディオのトリミングまたは破棄で構成されています。トリミングは自明です。オーディオ録音は、 --cutoff-ms
で指定されたxミリ秒の最も大きなウィンドウにトリミングされます。 「役に立たない」オーディオ( discard_true
)の破棄は、事前に訓練されたモデルを使用して、どのサンプルが混乱しているかを判断し、正しくラベル付けされたサンプルを破棄します。事前に訓練されたモデルと正しいラベルは、それぞれ--config
と--correct-label
によって定義されます。
たとえば、 python -m utils.record --post-process trim discard_true --correct-label no --config config.json
検討してください。この場合、ユーティリティは一連の音声スニペットを記録し、それらを1秒にトリミングし、最後にconfig.json
のモデルによって「いいえ」とラベル付けされていないものを破棄します。
python manage_audio.py listen
これは、記録用の--min-sound-lvl
の正気の値を設定するのに役立ちます。
python manage_audio.py generate-contrastive --directory [directory]
音声セグメンテーションを使用して[directory]
のすべての.wavファイルから対照的な例を生成します。
Speech Command Datasetには、1秒間のオーディオスニペットが含まれています。
python manage_audio.py trim --directory [directory]
[directory]
のすべての.wavファイルで最も大きな1秒にトリムをトリミングします。慎重なユーザーは、Audacityなどのオーディオエディターを使用して、すべてのオーディオサンプルを手動でチェックする必要があります。