Como extrair parte vocal do sinal de áudio estéreo?

15

Agora estou processando um arquivo MP3 e encontro esse problema. Meu MP3 é codificado em estéreo. O que eu quero fazer é extrair a parte vocal para processamento adicional (qualquer que seja o modo dos sinais de saída, mono ou estéreo, ambos estão OK).

Até onde eu sei, o áudio é codificado em diferentes bandas de sub-frequências dissociadas em MP3. Eu acho que posso limitar os sinais à faixa vocal através do filtro passa-alto / passa-baixo com a frequência de corte definida corretamente. No entanto, o resultado deve conter partes do sinal de música pura nesse caso. Ou, depois de pesquisar no Google, acho que posso calcular os sinais de fundo primeiro (invertendo um canal que é adicionado aos sinais do outro canal, assumindo que a parte vocal está centralizada no áudio estéreo chamado cancelamento de fase). Após essa transformação, o sinal é mono. Então, eu devo mesclar o estéreo original em mono, a partir do qual extrair o sinal de fundo.

Dada a eficácia, qual é a preferida (ou qualquer outra solução :)? Se o segundo, deixe dois canais A e B, serão usados ​​(BA) ou (AB) ao calcular o fundo? Assim como na fusão de dois canais, a aritmética significa precisa o suficiente? Ou posso reduzir a amostragem de cada canal por um fator de dois e intercalar os sinais de redução da amostragem como resultado mono?

Obrigado e cumprimentos.

Summer_More_More_Tea
fonte

Respostas:

21

Primeiro de tudo, como os dados são codificados em um arquivo mp3 é irrelevante para a pergunta, a menos que você pretenda executar o processamento de domínio compactado (o que seria bastante tolo). Portanto, você pode assumir que seu algoritmo funcionará com dados descomprimidos no domínio do tempo.

A soma / diferença é um truque muito, muito básico para supressão vocal (não extração). É baseado no pressuposto de que os vocais são misturados no centro do campo estéreo, enquanto outros instrumentos são panorâmicos lateralmente. Isso raramente é verdade. LR e RL terão o mesmo som (o ouvido humano é insensível a uma mudança de fase global) e proporcionará uma mixagem mono sem os instrumentos misturados no centro. O problema é que, depois de recuperar o plano de fundo, o que você fará com isso? Tente suprimi-lo do sinal central (médio)? Isso não vai funcionar, você estará fazendo (L + R) / 2 - (L - R), isso não é muito interessante ... Você pode tentar qualquer combinação linear dessas (média e "centro removido"), nada vai sair disso!

Com relação às abordagens de filtragem: o f0 da voz raramente excede 1000 Hz, mas seus harmônicos podem ultrapassar isso. A remoção da frequência mais alta tornará as consoantes (especialmente sss, chhh) desagradáveis. Algumas vozes masculinas ficam abaixo de 100 Hz. Você pode cortar com segurança o que estiver abaixo de 50 ou 60 Hz (baixo, chute), embora

Vale a pena explorar alguns desenvolvimentos recentes na separação de vozes:

  • Modelo de filtro NMF + harmônico comb> filtro de Jean Louis Durrieu . Código Python aqui .
  • Abordagem de extração de fundo de Rafii . Simples de codificar e funciona bem em músicas produzidas por computador com padrões muito repetitivos como Electro, Hip-hop ...
  • Os HSU foram abordados com base na detecção, rastreamento e mascaramento de f0. "Um algoritmo em tandem para extração de pitch de canto e separação de voz do acompanhamento de música" (não é possível encontrar PDF acessível).
pichenettes
fonte
4

Obrigado pela referência! Você esqueceu de mencionar seu trabalho sobre aprimoramento de bateria , o que também pode ser interessante para a aplicação de Summer_More_More_Tea. Bem, isso tudo realmente depende do que você quer fazer com isso. Você tem uma "aplicação final" específica em mente?

Concordo plenamente com as afirmações acima de pichenettes. Para ser completo, devo dizer que o aprimoramento vocal que você mencionou também foi usado em alguns trabalhos de Matti Ryynänen, na geração de faixas de karaokê, para aprimorar os resultados.

Para responder suas perguntas:

Dada a eficácia, qual é a preferida (ou qualquer outra solução :)?

Como as pichenettes disseram, nenhuma delas parece atender à sua necessidade: a filtragem passa-baixo / passa-alto provavelmente falhará devido à estrutura harmônica da voz humana (e mais geralmente a qualquer som "interessante" - ou seja, qualquer coisa além dos sinusóides ... )

Se o segundo, deixe dois canais A e B, serão usados ​​(BA) ou (AB) ao calcular o fundo? Assim como na fusão de dois canais, a aritmética significa precisa o suficiente?

Novamente, o segundo método mencionado não serve, porque você pode remover apenas o sinal que está no centro e não recuperá-lo. Em outras palavras, mesmo os vocais estão no "centro", não há matemática simples para obter um sinal apenas dos vocais.

Ou posso reduzir a amostragem de cada canal por um fator de dois e intercalar os sinais de redução da amostragem como resultado mono?

er ... calcular a média dos canais para obter um sinal monocanal, como sugerido acima, faz sentido e não interromperá as características espectrais do seu sinal (supondo que o sinal estéreo não seja degenerado). Então você obtém um sinal mono no qual possui basicamente o mesmo conteúdo musical de antes.

Reduzir a amostragem corretamente de cada canal significa que você primeiro aplica um filtro passa-baixo (com frequência de corte de sampling_rate / 4 no seu caso) e, em seguida, pode colher com segurança a cada 2 amostras. Entretanto, não há muito a dizer sobre a intercalação dos canais assim reduzidos: na maioria dos casos gerais, isso está quebrando as características espectrais do seu sinal. Você provavelmente não quer isso.

De fato, a operação de filtragem passa-baixo seguida de definir 0 a cada 2 amostras e manter esses zeros no domínio de Fourier, para "espelhar" os componentes de baixa frequência que foram mantidos nos de alta frequência. Lembre-se de que você ensina lições de processamento de teoria de amostragem: multiplicar por uma sequência de impulsos (ou diracs) resulta em uma convolução com outra sequência de diracs no domínio Fourier, ou seja, nesse caso, o espectro de frequências do sinal é repetido (periodizado) ao longo do eixo da frequência, com um período igual à taxa de amostragem.

Normalmente, ao reduzir a amostragem, você remove os 0s (porque assume uma nova taxa de amostragem). Mas aqui, mantê-los resulta em componentes adicionais de alta frequência muito irritantes. A intercalação desses sinais não vai corrigir isso.

Bem, apesar de tudo, a resposta curta: não faça isso . :-)

Por fim, também posso sugerir que você use a GUI que desenvolvi para a conferência LVAICA 2012: existe um repositório Git para isso. Ainda estou depurando e melhorando, então os comentários são bem-vindos: D

Espero que ajude!

Jean-louis Durrieu
fonte