Como faço para detectar apitos, pops e outros sons na entrada de áudio ao vivo?

9

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:

gráfico único de encaixe dos dedos e interruptor de luz on / off

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? -

  1. Obter dados de áudio de entrada

  2. Espectograma de plotagem

  3. Obtenha gráfico do espectrograma para o som que você deseja detectar em um ambiente silencioso

  4. Estude esse gráfico - desenhe características únicas desse som

  5. 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)

  6. Se uma correspondência for encontrada, bem - o trabalho está feito.

  7. Polir o algoritmo para eliminar falsos negativos.

UMABXZ

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.

bad_keypoints
fonte
11
Por curiosidade, esse espectrograma é feito em um telefone ou tablet? Nesse caso, você pode dizer o nome do aplicativo. Parece muito legal. Com relação à sua pergunta, acho que seu aplicativo é semelhante ao tópico / tarefa de reconhecimento de palavras isolado. Você provavelmente pode ter muitas idéias e inspiração pesquisando isso no Google. A parte difícil é não reconhecer os gestos em um conjunto relativamente pequeno de gestos, a parte difícil é filtrar as coisas que não são gestos.
Niaren 31/05
Este é o aplicativo: play.google.com/store/apps/… E obrigado por seus pontos de vista. Mas quero que você me diga como detectar não palavras, mas sons (pelo menos por enquanto), como assobios, pop, palmas etc. Estou trabalhando em Python.
211313 bad_keypoints
11
Infelizmente, esse tipo de coisa ainda é uma área de pesquisa. Não conheço ninguém que resolva esse problema específico.
Bjorn Roche

Respostas:

2

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:

  • taxa de cruzamento zero
  • centróide de frequência
  • envelope (este é realmente um conjunto de parâmetros, incluindo, por exemplo, tempo de ataque)
  • envelope espectral
  • equilíbrio harmônico par / ímpar
  • voz
  • passo fundamental

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.

Bjorn Roche
fonte
Sua resposta é boa, mas eu estou basicamente pedindo para combinar os sons do usuário com os sons que ele faz mais tarde para usar o meu software. Tipo coisas de similaridade. Digamos que um usuário emita diferentes tipos de sons A, B e C. E as características desses sons são armazenadas como C_A, C_B e C_C, respectivamente.
21413 bad_keypoints
A técnica ainda é a mesma: 1. descubra quais parâmetros você vai medir, 2. meça, 3. use estatísticas para aprender o que faz cada som parecer diferente, 4. use esses dados para categorizar.
Bjorn Roche
então foi basicamente o que pensei. mas acho que vou ter que ver com quais parâmetros da boa lista longa que você forneceu eu precisaria marcar sons distintos.
Bad_keypoints
11
Para ser sincero, sou muito pessimista em ser capaz de distinguir coisas como um estalo de dedo e um interruptor de luz em uma variedade de ambientes, sem muitos dados de amostra e talvez mais parâmetros do que dei, mas espero estar errado. Por favor, reporte seus resultados mesmo que demore um pouco.
Bjorn Roche
Além disso, algumas pessoas na lista de discussão music-dsp ( music.columbia.edu/cmc/music-dsp ) podem ter outras sugestões.
Bjorn Roche
0

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.

Nathan Day
fonte
0

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

  • Determinar os recursos apropriados (por exemplo, taxa de cruzamento zero, centróide espectral, MFCC)
  • Detectar um início
  • Calcule esses recursos na entrada de áudio (suas gravações por gesto)
  • Mantenha um banco de dados de cálculos de recursos. Você precisará determinar se esta é uma situação de treinamento supervisionado ou não supervisionado. Por exemplo, os usuários especificam antecipadamente que um snap é "som 1" e um aplauso é "som 2" ou seu sistema tenta agrupá-los após o treinamento.

Classificação

  • Detecte um início em tempo real e calcule recursos no áudio recebido
  • Use uma métrica de distância (distância euclidiana ou outra distância Lp) para fazer uma classificação de vizinho mais próximo ou vizinho mais próximo K para determinar o som "mais próximo" do seu banco de dados

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.

greatscott
fonte
Eu detectaria o início detectando mudanças repentinas nos dados de áudio recebidos. Isso deve funcionar. Estou detectando o início e o fim dos gestos a serem armazenados.
bad_keypoints
Sim, isso deve funcionar principalmente. A única razão pela qual sugeri o Spectral Flux, é porque você vai usar um STFT de qualquer maneira. Se você espera um ambiente bastante silencioso, um limiar básico de amplitude deve funcionar bem o suficiente.
greatscott