家庭助理需要稱為熱詞的特殊短語才能啟動(例如“OK Google”)。 EfficientWord-Net 是一種基於小樣本學習的熱詞檢測引擎,允許開發人員將自訂熱詞添加到他們的程式中,而無需額外付費。該函式庫純粹以 Python 編寫,並使用 Google 的 TFLite 實作來實現更快的即時推理。它受到 FaceNet 的 Siamese 網路架構的啟發,在直接從用戶收集 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 參數用於確定任兩個觸發器之間的最短時間。 Relax_time 之前的任何潛在觸發器都將被取消。此檢測器採用滑動視窗方法運行,從而導致單一熱詞的多次觸發。 relaxation_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 相比,我們的熱詞偵測器的表現明顯較低。我們已經為引擎考慮了更好的神經網路架構,並希望能夠超越 Porcupine。這是我們的本科項目,因此您的支持和鼓勵將激勵我們進一步開發引擎。如果您喜歡這個項目,請將其推薦給您的同行,給我們一個?在 GitHub 上,鼓掌?在媒體上。
更新:你們的星星鼓勵我們創造一個更好的新模型。讓我們讓這個社區成長!
阿帕契許可證 2.0