Для активации домашним помощникам требуются специальные фразы, называемые горячими словами (например, «ОК, Google»). EfficientWord-Net — это механизм обнаружения горячих слов, основанный на многократном обучении, который позволяет разработчикам добавлять собственные горячие слова в свои программы без дополнительной оплаты. Библиотека написана исключительно на Python и использует реализацию Google TFLite для более быстрого вывода в реальном времени. Он основан на сиамской сетевой архитектуре FaceNet и работает лучше всего, когда 3-4 образца горячих слов собираются непосредственно у пользователя.
Файл обучения для доступа к файлу обучения.
Вот ссылки:
Исследовательская статья, чтобы получить доступ к исследовательской работе.
Эта библиотека работает с версиями Python от 3.6 до 3.9.
Прежде чем запускать команду установки pip для библиотеки, необходимо вручную установить несколько зависимостей:
Пользователям Mac OS M* и Raspberry Pi, возможно, придется скомпилировать эти зависимости.
Пакет tflite не может быть указан в файле require.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 уникальных вариантов произношения данного слова. Поместите их в отдельную папку, которая больше ничего не содержит.
Альтернативно, используйте следующую команду для создания аудиофайлов для данного слова (использует демонстрационный API IBM нейронной TTS). Пожалуйста, не злоупотребляйте этим ради нас:
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.
Параметр Relax_time используется для определения минимального времени между любыми двумя триггерами. Любые потенциальные триггеры до времени релаксации будут отменены. Детектор работает по принципу скользящего окна, что приводит к множеству триггеров для одного произнесения горячего слова. Параметр Relax_time можно использовать для управления несколькими триггерами; в большинстве случаев достаточно 0,8 секунды (по умолчанию).
В библиотеке имеются предопределенные встраивания, доступные для некоторых Wakewords, таких как 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