A Honk é uma reimplementação de Pytorch das redes neurais convolucionais do TensorFlow do Google para o Spotting de palavras -chave, que acompanha o recente lançamento do conjunto de dados de seus comandos de fala. Para mais detalhes, consulte nossa redação:
A Honk é útil para criar recursos de reconhecimento de fala no dispositivo para agentes inteligentes interativos. Nosso código pode ser usado para identificar comandos simples (por exemplo, "Stop" e "Go") e ser adaptado para detectar "gatilhos de comando personalizados" (por exemplo, "hey siri!").
Confira este vídeo para uma demonstração de buzina em ação!
Use as instruções abaixo para executar o aplicativo de demonstração (mostrado no vídeo acima)!
Atualmente, o Pytorch possui suporte oficial apenas para Linux e OS X. Assim, os usuários do Windows não poderão executar essa demonstração com facilidade.
Para implantar a demonstração, execute os seguintes comandos:
pip install -r requirements.txt
apt-get install freeglut3-dev
)./fetch_data.sh
python .
python utils/speech_demo.py
Se você precisar ajustar as opções, como desligar o CUDA, edite config.json
.
Notas adicionais para Mac OS X:
python .
implanta o serviço da web para identificar se o áudio contém a palavra de comando. Por padrão, config.json
é usado para configuração, mas isso pode ser alterado com --config=<file_name>
. Se o servidor estiver atrás de um firewall, um fluxo de trabalho será criar um túnel SSH e usar o encaminhamento da porta com a porta especificada na configuração (padrão 16888).
Em nosso repositório de modelos de Honk, existem vários modelos pré-treinados para Caffe2 (ONNX) e Pytorch. O script fetch_data.sh
busca esses modelos e os extrai para o diretório model
. Você pode especificar qual modelo e back -end para usar no arquivo de configuração model_path
e backend
, respectivamente. Especificamente, backend
pode ser caffe2
ou pytorch
, dependendo do que o format model_path
está. Observe que, para executar nossos modelos ONNX, os pacotes onnx
e onnx_caffe2
devem estar presentes em seu sistema; estes estão ausentes nos requisitos.txt.
Infelizmente, fazer com que as bibliotecas funcionem no RPI, especialmente o Librosa, não é tão simples quanto executar alguns comandos. Descrevemos nosso processo, que pode ou não funcionar para você.
sudo apt-get install -y protobuf-compiler libprotoc-dev python-numpy python-pyaudio python-scipy python-sklearn
pip install protobuf
pip install --no-deps onnx
caffe2
à variável de ambiente PYTHONPATH
. Para nós, isso foi realizado por export PYTHONPATH=$PYTHONPATH:/home/pi/caffe2/build
pip install onnx-caffe2
pip install -r requirements_rpi.txt
pip install --no-deps resampy librosa
python -c "import librosa"
. Ele deve causar um erro em relação ao NUMBA, pois não o instalamos.@numba.jit
de /home/pi/.local/lib/python2.7/site-packages/resampy/interpn.py
./fetch_data.sh
config.json
, altere backend
para caffe2
e model_path
para model/google-speech-dataset-full.onnx
.python .
Se não houver erros, você implantou com sucesso o modelo, acessível pela porta 16888 por padrão.python utils/speech_demo.py
. Você precisará de um microfone e alto -falantes funcionais. Se você estiver interagindo com o seu RPI remotamente, poderá executar a demonstração da fala localmente e especificar o endpoint remoto --server-endpoint=http://[RPi IP address]:16888
. Infelizmente, o cliente de controle de qualidade ainda não tem suporte ao público em geral, pois requer um serviço de controle de qualidade personalizado. No entanto, ele ainda pode ser usado para redirecionar a palavra -chave de comando.
python client.py
executa o cliente de controle de qualidade. Você pode redirecionar uma palavra -chave fazendo python client.py --mode=retarget
. Observe que o texto em fala pode não funcionar bem nas distritos Linux; Nesse caso, forneça credenciais do IBM Watson via --watson-username
e --watson--password
. Você pode visualizar todas as opções fazendo python client.py -h
.
Modelos CNN . python -m utils.train --type [train|eval]
treina ou avalia o modelo. Ele espera que todos os exemplos de treinamento sigam o mesmo formato do conjunto de dados de comandos de fala. O fluxo de trabalho recomendado é baixar o conjunto de dados e adicionar palavras -chave personalizadas, pois o conjunto de dados já contém muitas amostras úteis de áudio e ruído de fundo.
Modelos residuais . Recomendamos os seguintes hiperparâmetros para treinar qualquer um dos nossos modelos res{8,15,26}[-narrow]
no conjunto de dados de comandos de fala:
python -m utils.train --wanted_words yes no up down left right on off stop go --dev_every 1 --n_labels 12 --n_epochs 26 --weight_decay 0.00001 --lr 0.1 0.01 0.001 --schedule 3000 6000 --model res{8,15,26}[-narrow]
Para obter mais informações sobre nossos modelos residuais profundos, consulte nosso artigo:
Existem opções de comando disponíveis:
opção | formato de entrada | padrão | descrição |
---|---|---|---|
--audio_preprocess_type | {Mfccs, pcen} | MFCCS | tipo de pré -processamento de áudio para usar |
--batch_size | [1, n) | 100 | o tamanho do mini-lote para usar |
--cache_size | [0, inf) | 32768 | Número de itens em cache de áudio, consome cerca de 32 kb * n |
--conv1_pool | [1, inf) [1, inf) | 2 2 | a largura e a altura do filtro da piscina |
--conv1_size | [1, inf) [1, inf) | 10 4 | a largura e a altura do filtro de convivência |
--conv1_stride | [1, inf) [1, inf) | 1 1 | a largura e o comprimento do passo |
--conv2_pool | [1, inf) [1, inf) | 1 1 | a largura e a altura do filtro da piscina |
--conv2_size | [1, inf) [1, inf) | 10 4 | a largura e a altura do filtro de convivência |
--conv2_stride | [1, inf) [1, inf) | 1 1 | a largura e o comprimento do passo |
--data_folder | corda | /data/discurso_dataset | caminho para dados |
--dev_every | [1, inf) | 10 | intervalo de desenvolvimento em termos de épocas |
--dev_pct | [0, 100] | 10 | porcentagem do conjunto total para usar para o Dev |
--dropout_prob | [0,0, 1,0) | 0,5 | a taxa de abandono para usar |
--gpu_no | [-1, n] | 1 | a GPU para usar |
--group_speakers_by_id | {true, false} | verdadeiro | se deve agrupar os falantes em todo o trem/dev/teste |
--input_file | corda | o caminho para o modelo para carregar | |
--input_length | [1, inf) | 16000 | a duração do áudio |
--lr | (0,0, inf) | {0,1, 0,001} | a taxa de aprendizado para usar |
--type | {Train, Eval} | trem | o modo para usar |
--model | corda | CNN-TRAD-POOL2 | um dos cnn-trad-pool2 , cnn-tstride-{2,4,8} , cnn-tpool{2,3} , cnn-one-fpool3 , cnn-one-fstride{4,8} , res{8,15,26}[-narrow] , cnn-trad-fpool3 , cnn-one-stride1 |
--momentum | [0,0, 1,0) | 0,9 | o momento de usar para SGD |
--n_dct_filters | [1, inf) | 40 | o número de bases de DCT para usar |
--n_epochs | [0, inf) | 500 | Número de épocas |
--n_feature_maps | [1, inf) | {19, 45} | O número de mapas de recursos para usar para a arquitetura residual |
--n_feature_maps1 | [1, inf) | 64 | o número de mapas de recursos para convic 1 |
--n_feature_maps2 | [1, inf) | 64 | O número de mapas de recursos para convicções 2 |
--n_labels | [1, n) | 4 | o número de rótulos para usar |
--n_layers | [1, inf) | {6, 13, 24} | O número de camadas de convolução para a arquitetura residual |
--n_mels | [1, inf) | 40 | o número de filtros MEL para usar |
--no_cuda | trocar | falso | Se deve usar o CUDA |
--noise_prob | [0,0, 1,0] | 0,8 | a probabilidade de misturar com ruído |
--output_file | corda | Modelo/Google-Speol-DataSet.pt | o arquivo para salvar o modelo para |
--seed | (INF, INF) | 0 | a semente para usar |
--silence_prob | [0,0, 1,0] | 0.1 | a probabilidade de escolher o silêncio |
--test_pct | [0, 100] | 10 | porcentagem do conjunto total a ser usado para testar |
--timeshift_ms | [0, inf) | 100 | tempo em milissegundos para mudar o áudio aleatoriamente |
--train_pct | [0, 100] | 80 | porcentagem do conjunto total para usar para treinamento |
--unknown_prob | [0,0, 1,0] | 0.1 | a probabilidade de escolher uma palavra desconhecida |
--wanted_words | String1 String2 ... Stringn | comando aleatório | as palavras -alvo desejadas |
Honkling é uma implementação de JavaScript da Honk. Com o Honkling, é possível implementar vários aplicativos da Web com a funcionalidade de Spotting de palavras-chave no navegador.
Para melhorar a flexibilidade de buzina e buzina, fornecemos um programa que constrói um conjunto de dados a partir de vídeos do YouTube. Os detalhes podem ser encontrados na pasta keyword_spotting_data_generator
Você pode fazer o seguinte para gravar áudio seqüencial e salvar no mesmo formato do conjunto de dados de comando de fala:
python -m utils.record
Retorno de entrada ao registro, suba seta para desfazer e "q" para terminar. Após um segundo de silêncio, a gravação é interrompida automaticamente.
Várias opções estão disponíveis:
--output-begin-index: Starting sequence number
--output-prefix: Prefix of the output audio sequence
--post-process: How the audio samples should be post-processed. One or more of "trim" and "discard_true".
O pós-processamento consiste em aparar ou descartar áudio "inútil". O corte é auto-explicativo: as gravações de áudio são aparadas na janela mais alta de X milissegundos, especificados por --cutoff-ms
. Descartar o áudio "inútil" ( discard_true
) usa um modelo pré-treinado para determinar quais amostras são confusas, descartando as marcadas corretamente. O modelo pré-treinado e o rótulo correto são definidos por --config
e --correct-label
, respectivamente.
Por exemplo, considere python -m utils.record --post-process trim discard_true --correct-label no --config config.json
. Nesse caso, a concessionária registra uma sequência de trechos de fala, os aparece em um segundo e, finalmente, descarta aqueles que não são rotulados como "não" pelo modelo em config.json
.
python manage_audio.py listen
Isso ajuda a definir valores sãos para --min-sound-lvl
para gravação.
python manage_audio.py generate-contrastive --directory [directory]
gera exemplos contrastantes de todos os arquivos .WAV no [directory]
usando a segmentação fonética.
O conjunto de dados de comando de fala contém trechos de áudio de um segundo de um segundo.
python manage_audio.py trim --directory [directory]
apara para o mais alto um segundo para todos os arquivos .wav no [directory]
. O usuário cuidadoso deve verificar manualmente todas as amostras de áudio usando um editor de áudio como o Audacity.