Um dos meus projetos de fim de semana me levou às águas profundas do processamento de sinais. Como em todos os meus projetos de código que exigem alguma matemática pesada, estou mais do que feliz em tentar encontrar uma solução, apesar da falta de fundamentação teórica, mas, neste caso, não tenho nenhuma e gostaria de alguns conselhos sobre o meu problema. , a saber: estou tentando descobrir exatamente quando a audiência ao vivo ri durante um programa de TV.
Passei bastante tempo lendo abordagens de aprendizado de máquina para detectar risos, mas percebi que isso tem mais a ver com a detecção de risos individuais. Duzentas pessoas rindo ao mesmo tempo terão propriedades acústicas muito diferentes, e minha intuição é que elas sejam distinguíveis através de técnicas muito mais cruéis do que uma rede neural. Eu posso estar completamente errado! Apreciaria pensamentos sobre o assunto.
Aqui está o que eu tentei até agora: cortei um trecho de cinco minutos de um episódio recente do Saturday Night Live em dois segundos. Eu então rotulei essas "risadas" ou "sem risadas". Usando o extrator de recursos MFCC da Librosa, executei um cluster K-Means nos dados e obtive bons resultados - os dois clusters mapearam muito bem meus rótulos. Mas quando eu tentei percorrer o arquivo mais longo, as previsões não ficaram vazias.
O que vou tentar agora: vou ser mais preciso sobre a criação desses clipes de riso. Em vez de fazer uma divisão e classificação às cegas, vou extraí-las manualmente, para que nenhum diálogo polua o sinal. Depois, dividirei-os em clipes de quarto de segundo, calcularei o MFCC deles e os utilizarei para treinar um SVM.
Minhas perguntas neste momento:
Isso faz sentido?
As estatísticas podem ajudar aqui? Andei rolando pelo modo de visualização em espectrograma do Audacity e posso ver claramente onde as risadas ocorrem. Em um espectrograma de potência de log, a fala tem uma aparência muito distinta e "sulcada". Em contraste, o riso cobre um amplo espectro de frequência de maneira bastante uniforme, quase como uma distribuição normal. É até possível distinguir visualmente aplausos de risos pelo conjunto mais limitado de frequências representadas em aplausos. Isso me faz pensar em desvios padrão. Vejo que há algo chamado teste de Kolmogorov – Smirnov, isso pode ser útil aqui? (Você pode ver a risada na imagem acima como uma parede de laranja atingindo 45% do caminho.)
O espectrograma linear parece mostrar que o riso é mais enérgico nas frequências mais baixas e desaparece em direção às frequências mais altas - isso significa que se qualifica como ruído rosa? Em caso afirmativo, isso poderia ser uma base para o problema?
Peço desculpas se eu usei mal algum jargão, estive bastante na Wikipedia por este e não ficaria surpreso se eu me confundisse.
fonte
Respostas:
Com base na sua observação, que o espectro do sinal é suficientemente distinguível, você pode usá-lo como um recurso para classificar o riso da fala.
Existem várias maneiras de analisar o problema.
Abordagem # 1
Em um caso, você pode apenas olhar o vetor do MFCC. e aplique isso a qualquer classificador. Como você tem muitos coeficientes no domínio da frequência, convém observar a estrutura dos Cascade Classifiers com algoritmos de otimização como o Adaboost, com base nisso, você pode comparar entre a classe de fala e a classe de risada.
Abordagem # 2
Você percebe que sua fala é essencialmente um sinal variável no tempo. Portanto, uma das maneiras eficazes de fazer isso é observar a variação de tempo do próprio sinal. Para isso, você pode dividir sinais em lotes de amostras e observar o espectro durante esse tempo. Agora, você pode perceber que o riso pode ter um padrão mais repetitivo por um período estipulado, onde a fala possui inerentemente mais informações e, portanto, a variação do espectro seria bastante maior. Você pode aplicar isso ao modelo do tipo HMM para verificar se permanece consistentemente no mesmo estado para algum espectro de frequência ou se continua mudando continuamente. Aqui, mesmo que ocasionalmente o espectro da fala se assemelhe ao riso, será mais demorado.
Abordagem # 3
Force a aplicação do tipo de codificação LPC / CELP no sinal e observe o resíduo. A codificação CELP cria um modelo muito preciso de produção de fala.
A partir da referência aqui: TEORIA DO CELP CODING
Simplificando, depois que toda a fala prevista do analisador é removida - o que resta é o resíduo que é transmitido para recriar a forma de onda exata.
Como isso ajuda no seu problema? Basicamente, se você aplicar a codificação CELP, a fala no sinal será removida principalmente, o que resta é resíduo. Em caso de riso, a maioria do sinal pode ser retida porque o CELP falhará em prever esse sinal com a modelagem do trato vocal, onde a fala individual terá muito pouco resíduo. Você também pode analisar esse resíduo no domínio da frequência, para ver se é riso ou fala.
fonte
A maioria dos reconhecedores de fala usa não apenas os coeficientes do MFCC, mas também a primeira e a segunda derivadas dos níveis do MFCC. Eu estou supondo que os onset seriam muito úteis nesse caso e ajudariam você a distinguir uma risada versus outros sons.
fonte