filtro de ruído de fala humana

17

Alguém sabe de um filtro para atenuar a não fala? Estou escrevendo um software de reconhecimento de fala e gostaria de filtrar tudo, exceto a fala humana. Isso inclui ruído de fundo, ruído produzido por um microfone ruim ou até música de fundo. Eu já implementei um filtro de primeira ordem que compensa o roll-off de 6 dB do espectro de potência, mas ainda estou ouvindo ruído (embora a fala pareça muito mais clara). Eu pensei em usar um filtro passa-baixo, mas sou duvidoso em fazer isso por dois motivos:

  1. Não sei se um pré-filtro passa-baixo interfere no restante do processamento da fala. Mesmo que o ouvido humano possa detectar sons abaixo de 20 kHz, não quero arriscar a eliminação de harmônicos de ordem superior que possam ser necessários para processar a fala (embora não saiba se esse é o caso ou não. Eu não quero correr nenhum risco).

  2. Entendo que a excitação de certas consoantes (como f, he es) são quase inteiramente ruído branco. Não quero implementar um filtro de ruído que elimine um bom ruído, por assim dizer.

Idealmente, gostaria de ficar apenas com o discurso da pessoa falando no microfone. Se você tem alguma idéia ou se está faltando alguma coisa, entre em contato. Muito apreciado!

Zetta Suro
fonte
Eu suponho. Vou deixar em aberto, simplesmente porque vi perguntas semelhantes (filtros e processamento acústico) aqui que foram bem respondidas.
Zetta Suro
Regra geral: se você deseja saber como implementar um determinado algoritmo DSP, por exemplo, em um idioma específico ou em uma plataforma específica, o tópico é SO. Se for uma pergunta sobre algoritmos / técnicas DSP sem nenhum ângulo de programação específico, ela certamente pertence ao DSP.SE (onde também tenderá a obter respostas de melhor qualidade).
Paul R
Peguei vocês. Você migrou para cá? Se sim, obrigado. Eu não conseguia descobrir como migrá-lo, então acabei pedindo novamente aqui.
Zetta Suro
Não eu - sinalizei e perguntei se um moderador poderia movê-lo, então acho que um dos TPTB o fez (graças a quem quer que fosse!).
Paul R

Respostas:

8

Um canal de comunicação de fala usado na telefonia normalmente tem uma resposta de frequência de 300 Hz a 3 kHz. Embora isso rejeite muita energia na fala normal, a inteligibilidade ainda é muito boa - o principal problema parece ser que certas consoantes plosivas , por exemplo, "p" e "t", podem ser um pouco difíceis de discriminar sem os componentes de alta frequência .

Portanto, você provavelmente está procurando um "ponto ideal" em algum lugar entre o uso da largura de banda completa de 20 Hz a 20 kHz normalmente encontrada no áudio do consumidor e a filtragem mais agressiva usada para comunicações de voz (veja acima). Eu sugeriria começar com um filtro passa-banda de 50 Hz a 8 kHz. Provavelmente, apenas melhorará o SNR em alguns dB, na melhor das hipóteses, mas poderá ajudar, principalmente se você tiver muito ruído de fundo de alta frequência.

Paul R
fonte
Obrigado! Um amigo meu sugeriu o canal de voz, mas suspeitei que isso atenuasse muita energia em algumas consoantes. Vou tentar de 50 Hz a 8 kHz e ver como isso funciona!
Zetta Suro
2
Escolhendo esta resposta simplesmente porque é a solução "rápida" que eu estava procurando. O restante das respostas exigirá muito mais pesquisas que eu definitivamente analisarei, pois elas serão úteis a longo prazo, mas esta é uma solução de filtro simples que eu estava procurando originalmente.
Zetta Suro
5

Usar um filtro de banda passante que corresponda à largura de banda da fala ajudará.

Se você possui vários microfones (como é o caso agora em celulares), existem vários métodos semelhantes à ICA que podem tirar proveito disso - mas sua pergunta sugere que você tem apenas uma entrada.

O que você quer fazer é "separação da fonte com um microfone" (nome tirado do papel inovador da Roweis), também chamado de "sensor único". Aviso: isso está longe de ser um problema resolvido, e todas as pesquisas nesse campo são muito recentes, sem algoritmos ou abordagens que sejam "vencedores claros" (ao contrário dos modelos gaussianos de mistura + FST foram para reconhecimento de fala).

Uma boa estrutura para fazer isso é através da filtragem Wiener. Veja Benaroya et al. "Separação de fonte de sensor único com base na filtragem Wiener e STFT de janela múltipla" (Leia as seções 1 e 2, não se preocupe com o problema da multirresolução, a menos que você realmente precise). Em resumo, você calcula o STFT do seu sinal e, para cada quadro STFT, tenta obter estimativas do espectro de voz e do espectro de ruído e usa a filtragem Wiener para recuperar a melhor estimativa do espectro de voz ( é semelhante a "mascarar suavemente" o espectro).

Seu problema agora é o seguinte: dado um quadro STFT, estime o componente de fala e ruído a partir dele. A abordagem mais simples descrita no artigo de Benaroya é através da quantização vetorial - leve várias horas de fala por muitos oradores, calcule o STFT, execute LBG nele para encontrar um livro de códigos de 512 ou 1024 quadros de fala típicos; faça a mesma coisa com barulho. Agora, dado um quadro do seu sinal de entrada, projete-o de forma não negativa (um procedimento de atualização multiplicativa de gradiente é descrito no artigo) nas bases de fala e ruído e você obtém suas estimativas de fala e ruído. Se você não quiser lidar com a coisa de projeção não negativa, use o vizinho mais próximo. Essa é realmente a coisa mais simples que poderia funcionar no departamento de "separação de fonte de sensor único".

Observe que um sistema de reconhecimento de fala pode realmente fornecer alguma entrada para um sistema de separação. Faça uma primeira passagem de decodificação usando seu sistema de reconhecimento de fala. Para cada quadro, pegue o vetor MFCC médio do gaussiano que obteve a melhor pontuação. Inverta isso de volta para um espectro. Boom, você tem uma máscara fornecendo a localização espectral mais provável dos bits semelhantes à fala e pode usá-la como uma entrada para a filtragem Wiener. Isso soa um pouco como acenar com a mão, mas o geist é que, para separar uma fonte, você precisa de um bom modelo para isso, e um sistema de reconhecimento de fala retrocedido é um ótimo modelo generativo para sinais de fala.

pichenettes
fonte
1

Provavelmente, você deve analisar a ICA (Independent Component Analysis), pois seu problema é muito semelhante ao problema de "coquetel", geralmente usado para descrever a ICA. Em suma, a ICA encontra os componentes do seu sinal que são independentes um do outro. Isso pressupõe que outro ruído no ambiente (lava-louças, ruído branco, zumbido do ventilador) seja independente da fonte de sinal da voz e possa ser separado.

O ICA é semelhante ao PCA (análise de componentes principais), mas, em vez de maximizar a variação nos eixos principais, maximiza a independência. Existem muitas implementações do ICA que devem ser conectadas ao ambiente de codificação que você estiver usando.

galamina
fonte
4
O ICA requer tantos sinais de entrada quanto fontes para separar. No denoising da fala, ficamos com apenas um sinal e a ACI não ajuda em nada.
Pichenettes #