Os assistentes domésticos exigem frases especiais chamadas hotwords para serem ativados (por exemplo, "OK Google"). EfficientWord-Net é um mecanismo de detecção de hotwords baseado em aprendizado rápido que permite aos desenvolvedores adicionar hotwords personalizadas a seus programas sem custos adicionais. A biblioteca é escrita exclusivamente em Python e usa a implementação TFLite do Google para inferência mais rápida em tempo real. Ele é inspirado na arquitetura de rede siamesa da FaceNet e tem melhor desempenho quando 3 a 4 amostras de hotword são coletadas diretamente do usuário.
Arquivo de treinamento para acessar o arquivo de treinamento.
Aqui estão os links:
Artigo de pesquisa para acessar o artigo de pesquisa.
Esta biblioteca funciona com Python versões 3.6 a 3.9.
Antes de executar o comando de instalação pip para a biblioteca, algumas dependências precisam ser instaladas manualmente:
Os usuários do Mac OS M* e Raspberry Pi podem precisar compilar essas dependências.
O pacote tflite não pode ser listado em requisitos.txt, portanto será instalado automaticamente quando o pacote for inicializado no sistema.
O pacote librosa não é necessário para casos apenas de inferência. Entretanto, quando generate_reference
for chamado, ele será instalado automaticamente.
Execute o seguinte comando pip:
pip install EfficientWord-Net
Para importar o pacote:
import eff_word_net
Depois de instalar os pacotes, você pode executar o script de demonstração integrado à biblioteca (certifique-se de ter um microfone funcionando).
Acesse a documentação em: https://ant-brain.github.io/EfficientWord-Net/
Comando para executar a demonstração:
python -m eff_word_net.engine
Para qualquer nova hotword, a biblioteca precisa de informações sobre a hotword. Esta informação é obtida de um arquivo chamado {wakeword}_ref.json
. Por exemplo, para a wakeword 'alexa', a biblioteca precisaria do arquivo chamado alexa_ref.json
.
Esses arquivos podem ser gerados com o seguinte procedimento:
Colete de 4 a 10 pronúncias com sons exclusivos de uma determinada palavra de ativação. Coloque-os em uma pasta separada que não contenha mais nada.
Como alternativa, use o comando a seguir para gerar arquivos de áudio para uma determinada palavra (usa a API de demonstração IBM neural TTS). Por favor, não abuse por nossa causa:
python -m eff_word_net.ibm_generate
python -m eff_word_net.generate_reference
O nome do caminho do wakeword gerado precisa ser passado para a instância 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
)
A variável do modelo pode receber uma instância de Resnet_50_Arc_loss ou First_Iteration_Siamese.
O parâmetro relax_time é usado para determinar o tempo mínimo entre quaisquer dois gatilhos. Quaisquer possíveis gatilhos antes do relax_time serão cancelados. O detector opera em uma abordagem de janela deslizante, resultando em múltiplos gatilhos para uma única expressão de uma hotword. O parâmetro relax_time pode ser usado para controlar vários gatilhos; na maioria dos casos, 0,8 segundos (padrão) serão suficientes.
A biblioteca possui embeddings predefinidos prontamente disponíveis para alguns wakewords, como Mycroft , Google , Firefox , Alexa , Mobile e Siri . Seus caminhos estão prontamente disponíveis no diretório de instalação da biblioteca.
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" ])
A biblioteca fornece uma maneira amigável de computação para detectar múltiplas hotwords de um determinado fluxo, em vez de executar scoreFrame()
de cada wakeword individualmente
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 } " )
Acesse a documentação da biblioteca aqui: https://ant-brain.github.io/EfficientWord-Net/
Aqui está a versão corrigida do arquivo README.md com gramática e formatação aprimoradas:
O desempenho do nosso detector de hotword é notavelmente inferior em comparação com o Porcupine. Pensamos em melhores arquiteturas NN para o motor e esperamos superar o Porcupine. Este tem sido o nosso projeto de graduação, portanto seu apoio e incentivo nos motivarão a desenvolver ainda mais o motor. Se você adora este projeto, recomende-o aos seus colegas, dê-nos um ? no GitHub e aplausos? no Médio.
Atualização: Suas estrelas nos encorajaram a criar um novo modelo que é muito melhor. Vamos fazer essa comunidade crescer!
Licença Apache 2.0