Antecedentes: estou trabalhando em um aplicativo para iPhone (mencionado em várias outras postagens ) que "ouve" roncar / respirar enquanto alguém está dormindo e determina se há sinais de apneia do sono (como uma pré-tela para "laboratório do sono" teste). O aplicativo emprega principalmente "diferença espectral" para detectar roncos / respirações e funciona muito bem (correlação de 0,85 a 0,90) quando testado em gravações do laboratório do sono (que na verdade são bastante barulhentas).
Problema: A maioria dos ruídos do "quarto" (ventiladores, etc.) posso filtrar através de várias técnicas e, freqüentemente, detectai de forma confiável a respiração nos níveis S / N, onde o ouvido humano não pode detectá-la. O problema é o ruído da voz. Não é incomum ter uma televisão ou rádio funcionando em segundo plano (ou simplesmente ter alguém falando à distância), e o ritmo da voz se aproxima da respiração / ronco. Na verdade, eu fiz uma gravação do falecido autor / contador de histórias Bill Holm através do aplicativo e era essencialmente indistinguível de roncar no ritmo, variabilidade de nível e várias outras medidas. (Embora eu possa dizer que aparentemente ele não teve apneia do sono, pelo menos não enquanto estava acordado.)
Portanto, este é um longo plano (e provavelmente uma série de regras do fórum), mas estou procurando algumas idéias sobre como distinguir a voz. Não precisamos filtrar os roncos de alguma forma (achei que seria legal), mas precisamos apenas de uma maneira de rejeitar o som "muito barulhento" que é excessivamente poluído com a voz.
Alguma ideia?
Arquivos publicados: coloquei alguns arquivos no dropbox.com:
O primeiro é uma peça de rock bastante aleatória (eu acho), e o segundo é uma gravação do falecido Bill Holm. Ambos (que eu uso como minhas amostras de "ruído" são diferenciados de ronco) foram misturados com ruído para ofuscar o sinal. (Isso torna a tarefa de identificá-los significativamente mais difícil.) O terceiro arquivo consiste em dez minutos de uma gravação sua, na qual o primeiro terço é principalmente a respiração, o terço do meio é misto de respiração / ronco e o terço final é o ronco bastante constante. (Você tosse por um bônus.)
Todos os três arquivos foram renomeados de ".wav" para "_wav.dat", pois muitos navegadores dificultam o download de arquivos wav. Apenas renomeie-os novamente para ".wav" após o download.
Atualização: Eu pensei que a entropia estava "fazendo o truque" para mim, mas acabou sendo principalmente peculiaridades dos casos de teste que eu estava usando, além de um algoritmo que não foi muito bem projetado. No caso geral, a entropia está fazendo muito pouco por mim.
Posteriormente, tentei uma técnica na qual calculei a FFT (usando várias funções diferentes da janela) da magnitude geral do sinal (tentei potência, fluxo espectral e várias outras medidas) amostradas cerca de 8 vezes por segundo (tomando as estatísticas do ciclo principal da FFT) (a cada 1024/8000 segundos). Com 1024 amostras, isso abrange um intervalo de tempo de cerca de dois minutos. Eu esperava poder ver padrões nisso devido ao ritmo lento do ronco / respiração versus voz / música (e que também poderia ser uma maneira melhor de resolver o problema da " variabilidade "), mas enquanto houver dicas de um padrão aqui e ali, não há nada em que realmente possa me agarrar.
( Informações adicionais: em alguns casos, a FFT de magnitude do sinal produz um padrão muito distinto, com um pico forte em cerca de 0.2Hz e harmônicos na escada. Mas o padrão não é tão distinto na maioria das vezes, e a voz e a música podem gerar menos distintas pode haver alguma maneira de calcular um valor de correlação para uma figura de mérito, mas parece que isso exigiria o ajuste de curva para um polinômio de quarta ordem, e fazer isso uma vez por segundo no telefone parece impraticável.)
Também tentei fazer o mesmo FFT de amplitude média para as 5 "bandas" individuais em que dividi o espectro. As bandas são 4000-2000, 2000-1000, 1000-500 e 500-0. O padrão para as 4 primeiras bandas era geralmente semelhante ao padrão geral (embora não houvesse uma banda real "destacada" e muitas vezes um sinal extremamente pequeno nas bandas de frequência mais alta), mas a banda 500-0 geralmente era apenas aleatória.
Recompensa: eu vou dar a recompensa a Nathan, mesmo que ele não tenha oferecido nada de novo, já que essa foi a sugestão mais produtiva até hoje. Ainda tenho alguns pontos que gostaria de premiar com outra pessoa, se eles tivessem boas idéias.
fonte
Respostas:
fundo
De acordo com os documentos abaixo, o ronco é caracterizado por um pico em cerca de 130Hz e está totalmente concentrado abaixo de 12kHz:
Vamos ver se podemos aproveitar isso.
Exemplo MATLAB
Temos um registro ruim de uma criança roncando ; um arquivo WAV mono de 10 minutos e 8 bits. A taxa de amostragem é de 8KHz, o que significa que a largura de banda do sinal de áudio é de 4KHz. O nível é muito baixo, então eu o companderei primeiro.
O eixo y é normalizado para a largura de banda, 4KHz, para que o entalhe que você vê em 0,1 corresponda a uma frequência de 400Hz. Há um pico correspondente a uma tosse a ~ 186s; ignore isso. Podemos ver vagamente os entalhes durante cada ronco. Não apenas isso, mas eles parecem concentrados abaixo de 0,2 x 4KHz = 800Hz. Vamos olhar mais de perto.
Desta vez, o eixo da frequência foi rotulado em Hertz. Agora os entalhes estão bem claros. Podemos até ver as conotações do ruído da linha de energia começando em 60Hz (180Hz, 300Hz, 420Hz). Agora vem a essência do algoritmo: vamos classificar o sinal com base na energia nesta sub-banda, com o ruído da linha removido.
Se queremos ser extravagantes, podemos descartar picos grandes demais:
O baixo SNR, manifestado na dificuldade em discernir o sinal no primeiro gráfico, significa que temos margem de manobra de apenas meio desvio padrão (cujo valor foi 4,1). As hastes marcam os roncos.
fonte
Apenas jogando isso aqui para cobrir todas as possibilidades, você pode usar a entropia, não sei qual é o nível de entropia do ronco x da fala, mas se for diferente o suficiente, pode funcionar. http://www.ee.columbia.edu/~dpwe/papers/ShenHL98-endpoint.pdf
fonte
Estatísticas do domínio do tempo, talvez? O ronco parece ter períodos relativamente longos de estado estacionário, enquanto a energia da fala muda bastante em curtos períodos de tempo. Isso poderia ser combinado com a análise espectral também. As vogais têm mais conteúdo de baixa frequência e consoantes mais altas. Durante a fala, o espectro pode saltar rapidamente entre esses estados, enquanto o armazenamento pode permanecer em um estado por períodos mais longos.
fonte
Complexidade espectral ao longo do tempo. Suponho que a fala humana provavelmente use mais fonemas e com muito mais complexidade estatística em seu seqüenciamento do que as seqüências de ronco do fonema.
Esse provavelmente é um problema muito mais fácil do que o reconhecimento contínuo de fala, pois você não precisará reconhecer corretamente nenhum fonema ou sentença em particular corretamente, apenas o número de segmentos espectrais que soam no fonema e alguma medida estatística da complexidade de suas sequências (uma entropia ou teste de compressibilidade pode funcionar). Então veja se você pode determinar um limite confiável para essas medidas.
fonte