홈 어시스턴트를 활성화하려면 핫워드라는 특수 문구(예: "OK Google")가 필요합니다. EfficientWord-Net은 개발자가 추가 비용 없이 프로그램에 사용자 정의 핫워드를 추가할 수 있도록 하는 퓨샷 학습을 기반으로 하는 핫워드 감지 엔진입니다. 라이브러리는 순수하게 Python으로 작성되었으며 더 빠른 실시간 추론을 위해 Google의 TFLite 구현을 사용합니다. 이는 FaceNet의 Siamese Network Architecture에서 영감을 얻었으며 사용자로부터 직접 3~4개의 핫워드 샘플을 수집할 때 최고의 성능을 발휘합니다.
교육 파일에 액세스하려면 교육 파일을 사용하세요.
링크는 다음과 같습니다.
연구 논문에 액세스하려면 연구 논문을 클릭하세요.
이 라이브러리는 Python 버전 3.6~3.9에서 작동합니다.
라이브러리에 대해 pip 설치 명령을 실행하기 전에 몇 가지 종속성을 수동으로 설치해야 합니다.
Mac OS M* 및 Raspberry Pi 사용자는 이러한 종속성을 컴파일해야 할 수도 있습니다.
tflite 패키지는 요구사항.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 매개변수는 두 트리거 사이의 최소 시간을 결정하는 데 사용됩니다. Relaxation_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에 비해 현저히 낮습니다. 우리는 엔진을 위한 더 나은 NN 아키텍처에 대해 생각해 왔으며 Porcupine보다 더 나은 성능을 발휘할 수 있기를 희망합니다. 이것은 우리의 학부 프로젝트이므로 귀하의 지원과 격려는 우리가 엔진을 더욱 발전시키는 데 동기를 부여할 것입니다. 이 프로젝트가 마음에 든다면 동료에게 추천하고 ? GitHub에서 박수를 치나요? 매체에.
업데이트: 여러분의 스타들은 우리가 훨씬 더 나은 새로운 모델을 만들도록 격려했습니다. 이 커뮤니티를 성장시키자!
아파치 라이센스 2.0