Eu li muitas perguntas sobre o SO e, francamente, cada uma delas não está descrevendo nenhuma maneira específica de fazer isso. Alguns dizem "faça FFT" e outros dizem "cruzamento zero" etc. Mas eu apenas cheguei ao entendimento de que a entrada de áudio digital consiste em uma série de amplitudes para uma frequência específica e bem. Não sei muito além disso.
Agora eu conheço o teorema de Nyquist, frequência, amplitude, séries de Fourier, etc, e isso foi de 2 a 3 anos atrás quando eu fiz isso no meu programa universitário em algum semestre. Mas naquela época realmente não aprendíamos muito o uso real de Fourier no mundo real, e eu não me preocupei em descobrir mais sobre o assunto além de aprender apenas o suficiente para passar no assunto. Mas agora vou ter que usar todas essas coisas.
Aqui está um instantâneo dos sons que estou tentando detectar:
Claramente, os sons têm gráficos únicos. Eu só quero entender como extrair suas características únicas específicas para suas linhas pontiagudas únicas no gráfico. Como que amplitude, frequência, etc. E por quanto tempo - embora isso seja trivial, eu acho.
Quero uma lista simples e passo a passo de instruções não vagas - posso pesquisar no Google a terminologia que não entendo.
Como talvez isso? -
Obter dados de áudio de entrada
Espectograma de plotagem
Obtenha gráfico do espectrograma para o som que você deseja detectar em um ambiente silencioso
Estude esse gráfico - desenhe características únicas desse som
Crie algum tipo de função que possa detectar essas características em particular na alimentação de áudio ao vivo, usando as características do som encontrado em (4)
Se uma correspondência for encontrada, bem - o trabalho está feito.
Polir o algoritmo para eliminar falsos negativos.
Eu estava pensando em fazer o usuário gravar o som que deseja armazenar como um gesto em um ambiente tranquilo. E o usuário emitia o som apenas entre o tempo silencioso ; 3 segundos no início e no final da gravação.
Por exemplo, durante os primeiros 3 segundos, meu sistema estabeleceria que a entrada atual é o som de fundo silencioso normal. E então uma mudança repentina no gráfico seria o início da entrada de som. E quando isso para, a gravação continua por mais 3 segundos, o tempo silencioso à direita . Isso seria feito manualmente pelo usuário. Ele armazenaria automaticamente as características apenas daquela parte durante a qual durou a mudança repentina no gráfico - em algum momento entre os tempos de preenchimento.
E, portanto, as características dessa parte seriam salvas como dados de gesto do som, que seriam usados para detectar esse som específico no feed de áudio ao vivo posteriormente.
O problema é que estou pensando tudo isso em inglês simples. Eu preciso pensar em matemática e física, para poder implementá-lo eficientemente no meu código. Eu sou tão ignorante sobre o que escrever e onde escrever no meu código - mesmo com tantas bibliotecas e perguntas sobre SO à minha disposição.
E desculpe se isso foi longo.
fonte
Respostas:
Embora eu concorde com um dos comentários de que o uso de técnicas de reconhecimento de fala pode ser um bom começo, esses sons são diferentes e não estou ciente de que alguém tenha feito alguma pesquisa para categorizá-los (o artigo citado por Nathan parece apenas distinguir entre fala) e ruído), portanto, a menos que alguém apresente algo para contradizer isso, você terá que inventar sua própria técnica, e isso exigirá muito aprendizado e muito trabalho. O melhor que posso fazer é começar.
Primeiro, não espere que alguém seja capaz de produzir alguma fórmula mágica. Não há equação para passar do som para o que é o som. Os seres humanos e os computadores precisam aprender incorporando dados para fazer palpites sobre o que são sons. O motivo pelo qual as pessoas dizem em suas respostas "usar FFT" ou "usar cruzamento zero" é porque esses são alguns dos componentes básicos do DSP usados no reconhecimento de fala e algoritmos relacionados. Mas a FFT e a taxa de cruzamento zero geralmente são apenas os primeiros passos para criar um conjunto de parâmetros que descrevem o som. Esses parâmetros são então analisados estatisticamente (não através de alguma função mágica) para determinar a qual categoria eles provavelmente pertencem. Note que eu disse "provavelmente": até a melhor detecção de fala (e o cérebro humano!
Portanto, alguns parâmetros que você pode procurar incluem:
Depois de ter um conjunto de parâmetros que, em sua opinião, permitirão distinguir seus sons, você precisará usar algum método estatístico para categorizá-los. O modelo Markov oculto é frequentemente usado em fala. Você também pode analisar a regressão logística, K-means, e tenho certeza de que há outras opções, mas acho que o HMM é experimentado e verdadeiro.
fonte
Eu usei este artigo sobre apontar com base em entropia quando estava tentando ignorar esses tipos de sons em telefonemas, usados para reconhecimento de fala por computador, se os sons que você está tentando capturar são fala, então a entropia pode funcionar muito bem, pois a música pode não ser útil.
fonte
Acho que as recomendações de Bjorn são muito boas, mas quero fornecer algumas informações adicionais. Na sua descrição, isso parece muito com um problema de identificação de timbres. Há alguma pesquisa nessa área em contextos de música de computador (identificar diferentes instrumentos é uma coisa útil a ser capaz de fazer e dizer a diferença entre um estalar e um estrondo é por causa do timbre do som). William Brentfez uma pesquisa nesta área (procure timbreID em sua página) e criou algum software para usar no Pure Data. Em cada uma das situações que você procura eventos específicos, fazer uma segmentação automática por detecção de início seria uma boa ideia. Como você já está tomando um STFT, determinar um início não exigiria muito trabalho adicional (consulte a detecção de início do Spectral Flux). Um resumo do sistema pode ser o seguinte:
Treinamento
Classificação
Este artigo sobre identificação de timbre percussivo pode ser útil. Ele descreve definições de recursos potenciais para calcular o som recebido e o método de classificação do autor. Isso funcionará razoavelmente bem para sons percussivos, mas pode não funcionar tão bem para algo como fala (várias sílabas); nesse caso, um método HMM seria mais adequado. Da mesma forma, a precisão da detecção do início variará dependendo dos tipos de sons que você está procurando.
Se você está particularmente preocupado com pressões versus interruptores de luz, dedique algum tempo para descobrir quais recursos podem discriminar com precisão os dois sons.
fonte