Índice:

Identificador de som de cozinha personalizado: 4 etapas
Identificador de som de cozinha personalizado: 4 etapas

Vídeo: Identificador de som de cozinha personalizado: 4 etapas

Vídeo: Identificador de som de cozinha personalizado: 4 etapas
Vídeo: MUITO CUIDADOS POIS ELES IMITAM TUDO 2024, Novembro
Anonim
Image
Image
Identificador de som de cozinha personalizado
Identificador de som de cozinha personalizado

Para o nosso projeto final em um curso de sistemas interativos nesta primavera, criamos um sistema em tempo real para identificar e visualizar sons comuns na cozinha usando a classificação Support-Vector Machine. O sistema é composto por um laptop para amostragem / classificação de áudio e um display Arduino / matricial para visualização. A seguir, um guia para criar sua própria versão deste sistema para sons de sua própria cozinha.

Nosso caso de uso original era como um dispositivo para a cozinha de um indivíduo surdo e com deficiência auditiva, mas esse sistema poderia, teoricamente, ser adaptado para identificar um conjunto de sons em uma variedade de contextos. A cozinha era um lugar ideal para começar, pois tende a ser relativamente silenciosa e contém uma quantidade razoável de sons simples e distintos.

Um repositório GitHub para este projeto pode ser encontrado aqui.

Suprimentos

  • Microcontrolador Arduino Leonardo com cabeçalhos
  • KEYESTUDIO 16x16 Dot Matrix LED Display para Arduino
  • Jumper de placa de ensaio
  • Cabo micro USB para USB 2.0
  • Um laptop com Jupyter Notebook (instalação Anaconda)

    Um guia para iniciantes do Jupyter Notebook pode ser encontrado aqui

  • Uma quantidade substancial de peças de LEGO incompatíveis para a caixa do sistema

    (Mas realmente você pode substituí-los por qualquer material de construção DIY que você gostaria!)

Etapa 1: coleta de amostras de sons de cozinha

Coletando Amostras de Som de Cozinha
Coletando Amostras de Som de Cozinha

Figura acima: dados de áudio obtidos da gravação de um garfo e uma faca tilintando juntos usando este processo de coleta

Para identificar sons em tempo real, precisamos fornecer ao nosso modelo de aprendizado de máquina exemplos de qualidade para comparação. Criamos um notebook Jupyter para este processo, que pode ser acessado aqui ou por meio do repositório GitHub de nosso projeto. O repositório também contém coleções de amostras de duas cozinhas diferentes para fins de teste.

Etapa 1.1: Copie o bloco de notas CollectSamples.ipynb para o diretório de trabalho do Bloco de notas Jupyter e abra-o.

Etapa 1.2: execute cada célula uma por uma, prestando atenção às notas que fornecemos nos cabeçalhos. Pare quando chegar a um intitulado "Gravação de amostra".

NOTA: Várias bibliotecas Python são usadas neste bloco de notas e cada uma requer instalação antes de ser importada com êxito para o projeto. Você pode fazer isso manualmente, embora um guia para instalação de biblioteca no Jupyter Notebook possa ser encontrado aqui.

Etapa 1.3: Crie um diretório vazio para armazenar suas amostras dentro de seu diretório de trabalho para este projeto.

Etapa 1.4: Edite a variável SAMPLES_LOCATION na célula "Sample Recording" para corresponder à localização do diretório vazio.

Etapa 1.5: Adicione ou remova quantos sons desejar à variável SOUND_LABELS.

Para que o código de gravação de amostra funcione, cada linha desta variável deve ser separada por uma vírgula e da seguinte forma:

'ts': som ("TargetedSound", "ts")

Passo 1.6: Quando todas as etiquetas tiverem sido adicionadas, avaliando a célula "Gravação da Amostra" inicia o processo de coleta da amostra. Na saída da célula, você será solicitado a inserir o código de acesso associado a cada som nos rótulos (ou seja, "ts" para TargetedSound). Não faça isso ainda.

Etapa 1.7: Leve seu laptop para a cozinha e coloque-o na área em que você provavelmente colocaria o sistema pronto. Este local deve ser central para uma boa coleta de áudio e seco e longe de possíveis respingos para proteger seus componentes eletrônicos.

Etapa 1.8: Prepare seu primeiro som direcionado. Se este for um bipe do cronômetro do forno, você pode definir o cronômetro para um minuto e aguardar a contagem regressiva de 20 segundos ou mais antes de prosseguir para a próxima etapa.

Etapa 1.9: digite o código do rótulo no prompt (ou seja, "ts") e pressione Enter / Return.

O sistema começará a escutar um evento de som distinto do ruído ambiente da sala. Ao detectar esse evento de som, ele começará a gravar até que o som da sala tenha retornado aos níveis ambientais. Em seguida, ele salvará o áudio como um arquivo WAV de 16 bits no diretório identificado em SAMPLES_LOCATION no formato:

TargetedSound _ # _ capture.wav

A parte # deste nome de arquivo corresponde ao número de amostras do som-alvo que você coletou. Depois que o arquivo WAV for salvo, o prompt se repetirá, permitindo que você colete várias amostras do mesmo som em uma única execução da célula.

NÃO mude este nome de arquivo. É importante para a próxima etapa.

Etapa 1.10: Repita as etapas 1.8 e 1.9 até coletar 5-10 amostras de cada som.

Passo 1.11: Insira "x" quando terminar para sair da execução.

AVISO: Não sair da célula desta forma pode causar o travamento do Notebook. Nesse caso, o kernel do Notebook deve ser reiniciado e cada célula executada novamente a partir do topo.

Etapa 1.11 (Opcional): Verifique os dados WAV de arquivos individuais na célula "Quick Sound Visualization" para certificar-se de que capturou todas as informações desejadas.

Algumas dicas:

  • Grave quando sua cozinha estiver silenciosa.
  • Grave apenas um som de uma vez. O sistema não consegue distinguir sobreposição de sons.
  • Tente fazer com que cada teste de som seja o mais consistente possível. Isso ajudará na precisão da identificação.
  • A reavaliação da célula de Gravação redefinirá o valor # no nome do arquivo e substituirá quaisquer arquivos existentes que correspondam a esse #. Achamos mais fácil gravar todas as amostras de um som de uma vez e, em seguida, parar a célula de Gravação.
  • Se o sistema não estiver captando o som desejado, tente diminuir o valor de THRESHOLD (definido como 30 para iniciar) e reavalie a célula.
  • Se a gravação for acionada por outros sons fora do alvo, tente aumentar o valor de THRESHOLD (definido como 30 para iniciar) e reavalie a célula.

Etapa 2: Preparando o Arduino / Matrix Display

Preparando o Arduino / Matrix Display
Preparando o Arduino / Matrix Display
Preparando o Arduino / Matrix Display
Preparando o Arduino / Matrix Display
Preparando o Arduino / Matrix Display
Preparando o Arduino / Matrix Display

A seguir, vamos configurar o sistema de visualização usando um Arduino Leonardo e um display de matriz de pontos LED 16x16 KEYESTUDIO. Isso serve para gerar a previsão do modelo de classificação dos sons detectados. Como antes, fornecemos todos os arquivos necessários aqui e no repositório GitHub do projeto.

Etapa 2.1: Conecte o Arduino e a matriz de LED de acordo com o diagrama acima. KEYESTUDIO inclui fios para conectar à matriz de pontos, mas serão necessários fios de jumper da placa de ensaio para conectar esses fios ao Arduino

Etapa 2.2: Abra "arduino_listener.ino" usando o IDE Ardunio e carregue-o no Leonardo. Se a fiação estiver correta, você deverá ver o ícone "ouvindo" (semelhante a Wi-Fi), conforme mostrado na imagem acima.

Etapa 2.3: Prepare os ícones que deseja exibir para cada um dos sons-alvo. Para saber quais LEDs acender, o ícone deve ser enviado do Arduino para a matriz como um array de bytes. Por exemplo, nosso ícone de xícara de café (na imagem acima) é enviado para a matriz neste formato:

{

0xff, 0xff, 0xff, 0xff, 0xfc, 0xfb, 0xbb, 0x5b, 0xeb, 0xfb, 0xfb, 0xfc, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xf7, 0xfb, 0xfb, 0xfb, 0xfb, 0xf7, 0x0f, 0xdf, 0x1f, 0xff, 0xff};

Desenhamos nossos ícones usando a ferramenta online Dot2Pic, com 16 colunas, 16 linhas e "monocromático, 8 pixels por byte, configuração vertical" selecionado no menu suspenso. O nosso pode ser encontrado no array "sample_icon_bytes.txt".

NOTA: Também pode haver ferramentas online que podem fazer isso automaticamente com arquivos carregados.

Etapa 2.4: Desenhe cada ícone. Quando terminar de desenhar, selecione "Converter para a matriz".

Etapa 2.5: Substitua os ícones desnecessários definidos na parte superior do código "arduino_listening.ino" conforme desejado. Certifique-se de adicionar um comentário descrevendo o ícone para que você se lembre qual é qual!

Etapa 2.6: Faça upload do novo código para o Arduino. Não feche o arquivo ainda, vamos precisar dele para a próxima etapa.

Etapa 3: executando o classificador e identificando os sons

Executando o Classificador e Identificando Sons
Executando o Classificador e Identificando Sons
Executando o Classificador e Identificando Sons
Executando o Classificador e Identificando Sons

Agora é hora de montar o sistema. O pipeline de classificação, a comunicação do Arduino e a captura de áudio ao vivo são todos feitos por meio de um único notebook Arduino, que foi fornecido aqui ou pode ser acessado por meio do repositório GitHub do nosso projeto.

Etapa 3.1: Copie o bloco de notas FullPipeline.ipynb para o diretório de trabalho do Bloco de notas Jupyter e abra-o.

Etapa 3.2: Execute cada célula uma por uma, prestando atenção às notas que fornecemos nos cabeçalhos. Nenhuma saída é esperada. Pare quando chegar à célula intitulada "Carregar os dados de treinamento".

Etapa 3.3: Edite a variável SAMPLES_LOCATION_ROOT na célula "Carregar os dados de treinamento" para o diretório pai do local do diretório de amostra anterior. Em seguida, altere a variável SAMPLES_DIR_NAME para o nome do seu diretório. Portanto, se você definiu o local em CollectSamples.ipynb para:

SAMPLES_LOCATION = "/ Users / xxxx / Documents / KitchenSoundClassifier / MySamples / NewDir"

Você agora definiria essas variáveis para:

SAMPLES_LOCATION_ROOT = "/ Users / xxxx / Documents / KitchenSoundClassifier / MySamples /" SAMPLES_DIR_NAME = "NewDir"

Fizemos isso para permitir mudanças rápidas no classificador em casos de imprecisão. Você pode alternar entre diferentes coleções de amostra para ajustar seus dados.

Etapa 3.4: Avalie a célula. Você deve ver cada coleção carregada com sucesso.

Etapa 3.5: Continue a executar cada célula uma por uma, prestando atenção às notas que fornecemos nos cabeçalhos.

Etapa 3.6: Pare quando chegar à célula "Messaging Arduino". Defina a porta serial que seu computador usará para comunicação com o Arduino na variável PORT_DEF. Isso pode ser encontrado no IDE do Arduino e em Ferramentas> Porta.

Mais informações podem ser encontradas aqui.

Etapa 3.8: Reabra seu IDE Arduino. Nos locais onde você fez alterações nos ícones, anote a letra ao lado do valor da matriz, mas NÃO a altere. No exemplo abaixo, é "g".

// garbage alienconst unsigned char g [1] [32] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xf7, 0xf7, 0xfb, 0xff, 0xfe, 0xfd, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2f, 0x27, 0xc3, 0x03, 0xc3, 0x27, 0x2f, 0xff, 0xef, 0xdf, 0xbf, 0xff, 0xff,};

Etapa 3.7: (Retornando à célula "Messaging Arduino" do Notebook) Altere os rótulos no dicionário self.sounds para corresponder aos rótulos que você usou na gravação de suas amostras, certificando-se de que cada rótulo corresponde à única letra que você anotou no anterior Passo. "Gravação" e "Escuta" fazem parte da funcionalidade central do sistema e não devem ser alteradas. NÃO mude a segunda letra, a menos que você se sinta confiante em fazer algumas alterações extras no código do Arduino também, pois de outra forma isso atrapalharia a comunicação com o Arduino / matriz.

Etapa 3.8: Execute a função principal! O código pegará os dados de treinamento, extrairá seus principais recursos, os alimentará no pipeline, construirá um modelo de classificação e começará a escutar eventos de som. Quando detectar um, você verá a mudança da matriz para um símbolo de gravação (quadrado com um círculo dentro) e irá segmentar esses dados e alimentá-los no modelo. O que quer que o modelo preveja, aparecerá alguns segundos depois no display de matriz.

Você pode acompanhar a produção da célula abaixo. Veja o quão preciso você pode obtê-lo!

Etapa 4: criando uma caixa de LEGO

Criação de uma caixa LEGO
Criação de uma caixa LEGO
Criação de uma caixa LEGO
Criação de uma caixa LEGO
Criação de uma caixa LEGO
Criação de uma caixa LEGO

Essa é a parte divertida! Você realizou todas as etapas importantes de aprendizado de máquina e colocou todo o sistema de ponta a ponta em funcionamento e agora pode jogar com LEGOs como recompensa. Não há muito processo para detalhar aqui. Nós apenas adicionamos blocos de que gostamos aqui e ali, sem nos preocupar muito com o design geral, e acabamos felizes com o resultado.

Permita que nossas fotos sirvam de inspiração para sua própria caixa criativa, exclusiva para sua cozinha. Colocamos o Arduino e a maior parte da fiação em uma caixa oca e, em seguida, fixamos a tela de matriz acima com saliências. Adicionamos um pouco de papel sobre a tela para difundir um pouco a luz, o que sentimos que deixou os ícones mais nítidos.

Recomendado: