ホーム アシスタントを有効にするには、ホットワードと呼ばれる特別なフレーズが必要です (「OK Google」など)。 EfficientWord-Net は、開発者が追加料金なしでカスタム ホットワードをプログラムに追加できる、少数ショット学習に基づくホットワード検出エンジンです。このライブラリは純粋に Python で書かれており、リアルタイム推論を高速化するために Google の TFLite 実装を使用しています。これは、FaceNet のシャム ネットワーク アーキテクチャからインスピレーションを得ており、3 ~ 4 個のホットワード サンプルがユーザーから直接収集された場合に最高のパフォーマンスを発揮します。
トレーニング ファイル: トレーニング ファイルにアクセスします。
リンクは次のとおりです。
研究論文にアクセスするには、「研究論文」を選択します。
このライブラリは、Python バージョン 3.6 ~ 3.9 で動作します。
ライブラリの pip インストール コマンドを実行する前に、いくつかの依存関係を手動でインストールする必要があります。
Mac OS M* および Raspberry Pi のユーザーは、これらの依存関係をコンパイルする必要がある場合があります。
tfliteパッケージはrequirements.txtにリストすることができないため、システムでパッケージが初期化されるときに自動的にインストールされます。
librosaパッケージは、推論のみの場合には必要ありません。ただし、 generate_reference
が呼び出されると、自動的にインストールされます。
次の pip コマンドを実行します。
pip install EfficientWord-Net
パッケージをインポートするには:
import eff_word_net
パッケージをインストールした後、ライブラリに組み込まれているデモ スクリプトを実行できます (マイクが動作していることを確認してください)。
https://ant-brain.github.io/EfficientWord-Net/ からドキュメントにアクセスします。
デモを実行するコマンド:
python -m eff_word_net.engine
新しいホットワードの場合、ライブラリにはホットワードに関する情報が必要です。この情報は{wakeword}_ref.json
というファイルから取得されます。たとえば、ウェイクワード「alexa」の場合、ライブラリにはalexa_ref.json
というファイルが必要です。
これらのファイルは次の手順で生成できます。
特定のウェイクワードの独特に聞こえる発音を 4 ~ 10 個収集します。他に何も含まれない別のフォルダーにそれらを置きます。
あるいは、次のコマンドを使用して、特定の単語の音声ファイルを生成します (IBM ニューラル TTS デモ API を使用します)。私たちのためにそれを使いすぎないでください。
python -m eff_word_net.ibm_generate
python -m eff_word_net.generate_reference
生成されたウェイクワードのパス名を HotwordDetector インスタンスに渡す必要があります。
HotwordDetector (
hotword = "hello" ,
model = Resnet_50_Arc_loss (),
reference_file = "/full/path/name/of/hello_ref.json" ,
threshold = 0.9 , # min confidence required to consider a trigger
relaxation_time = 0.8 # default value, in seconds
)
モデル変数は、Resnet_50_Arc_loss または First_Iteration_Siamese のインスタンスを受け取ることができます。
Relaxation_time パラメーターは、2 つのトリガー間の最小時間を決定するために使用されます。 Relax_time より前の潜在的なトリガーはすべてキャンセルされます。検出器はスライディング ウィンドウ アプローチで動作し、ホットワードの 1 つの発話に対して複数のトリガーが発生します。 Relax_time パラメータを使用して複数のトリガーを制御できます。ほとんどの場合、0.8 秒 (デフォルト) で十分です。
このライブラリには、 Mycroft 、 Google 、 Firefox 、 Alexa 、 Mobile 、 Siriなどのいくつかのウェイクワードですぐに利用できる事前定義された埋め込みが含まれています。これらのパスは、ライブラリのインストール ディレクトリですぐに入手できます。
from eff_word_net import samples_loc
import os
from eff_word_net . streams import SimpleMicStream
from eff_word_net . engine import HotwordDetector
from eff_word_net . audio_processing import Resnet50_Arc_loss
from eff_word_net import samples_loc
base_model = Resnet50_Arc_loss ()
mycroft_hw = HotwordDetector (
hotword = "mycroft" ,
model = base_model ,
reference_file = os . path . join ( samples_loc , "mycroft_ref.json" ),
threshold = 0.7 ,
relaxation_time = 2
)
mic_stream = SimpleMicStream (
window_length_secs = 1.5 ,
sliding_window_secs = 0.75 ,
)
mic_stream . start_stream ()
print ( "Say Mycroft " )
while True :
frame = mic_stream . getFrame ()
result = mycroft_hw . scoreFrame ( frame )
if result == None :
#no voice activity
continue
if ( result [ "match" ]):
print ( "Wakeword uttered" , result [ "confidence" ])
このライブラリは、各ウェイクワードのscoreFrame()
個別に実行するのではなく、特定のストリームから複数のホットワードを検出する計算に優しい方法を提供します。
import os
from eff_word_net . streams import SimpleMicStream
from eff_word_net import samples_loc
print ( samples_loc )
base_model = Resnet50_Arc_loss ()
mycroft_hw = HotwordDetector (
hotword = "mycroft" ,
model = base_model ,
reference_file = os . path . join ( samples_loc , "mycroft_ref.json" ),
threshold = 0.7 ,
relaxation_time = 2
)
alexa_hw = HotwordDetector (
hotword = "alexa" ,
model = base_model ,
reference_file = os . path . join ( samples_loc , "alexa_ref.json" ),
threshold = 0.7 ,
relaxation_time = 2 ,
#verbose=True
)
computer_hw = HotwordDetector (
hotword = "computer" ,
model = base_model ,
reference_file = os . path . join ( samples_loc , "computer_ref.json" ),
threshold = 0.7 ,
relaxation_time = 2 ,
#verbose=True
)
multi_hotword_detector = MultiHotwordDetector (
[ mycroft_hw , alexa_hw , computer_hw ],
model = base_model ,
continuous = True ,
)
mic_stream = SimpleMicStream ( window_length_secs = 1.5 , sliding_window_secs = 0.75 )
mic_stream . start_stream ()
print ( "Say " , " / " . join ([ x . hotword for x in multi_hotword_detector . detector_collection ]))
while True :
frame = mic_stream . getFrame ()
result = multi_hotword_detector . findBestMatch ( frame )
if ( None not in result ):
print ( result [ 0 ], f",Confidence { result [ 1 ]:0.4f } " )
ここからライブラリのドキュメントにアクセスします: https://ant-brain.github.io/EfficientWord-Net/
以下は、文法と書式が改善された README.md ファイルの修正バージョンです。
当社のホットワード検出器のパフォーマンスは、Porcupine と比較して著しく低いです。私たちはエンジンのより優れた NN アーキテクチャを検討し、Porcupine を上回るパフォーマンスを実現したいと考えています。これは私たちの学部生のプロジェクトであるため、皆様のご支援と励ましがエンジンのさらなる開発の原動力となります。このプロジェクトが気に入ったら、同僚に勧めてください。「?」を付けてください。 GitHub で、そして拍手?ミディアムで。
アップデート: あなたのスターのおかげで、はるかに優れた新しいモデルを作成するよう励まされました。このコミュニティを成長させていきましょう!
Apache ライセンス 2.0