Sincronizando duas faixas de áudio

9

Eu gostaria de implementar um algoritmo que sincronize duas faixas de áudio.

As duas faixas são muito parecidas; você pode imaginar que são duas gravações de som (não necessariamente música) de dois microfones na mesma sala. Isso significa que eles aparecem como um sinal que passou por dois canais (lineares) diferentes, com ruídos aditivos diferentes.

Entendo que a primeira idéia pode ser procurar o pico de sua correlação cruzada, mas sou particularmente interessante em encontrar literatura sobre o assunto, mas todos os trabalhos que pude encontrar estão sincronizando duas faixas musicais (usando recursos de áudio baseados em croma ) ou sincronizar o áudio com uma pontuação. Eles também assumem que pode haver distorção do tempo, o que é uma suposição desnecessária no meu caso.

Sinan Taifour
fonte

Respostas:

4

As abordagens baseadas em croma são usadas quando as faixas para alinhar são duas performances do mesmo material com instrumentações amplamente diferentes - nesse caso, você precisa encontrar o "menor denominador comum" que é harmonia, melodia, progressão de acordes etc. O croma é bom para isso - eles abstraem timbre totalmente, técnicas de gravação. Mas você não precisa disso no seu caso.

Como você adivinhou, a correlação cruzada do áudio bruto seria 1 / não muito robusta ao ruído, 2 / não muito robusta às diferenças nos transdutores (os dois microfones podem ter respostas muito diferentes) 3 / muito dispendiosa se você tiver minutos de áudio.

Eu sugiro que você:

  • Extraia uma sequência de vetores MFCC de ambos os sinais. Dessa forma, você terá algo de menor dimensionalidade e um pouco mais robusto ao ruído e às diferenças nos transdutores.
  • Opcionalmente, normalize o MFCC (o coeficiente "por design" 0 tem mais variação do que o coeficiente 1 e assim por diante ...) ... Idealmente, você deseja que cada linha da matriz MFCC tenha variação 1.
  • Calcule a correlação cruzada de duas matrizes que você obtém, ao longo do eixo do tempo (isto é, calcule a correlação cruzada 2D e apenas mantenha os dados para o eixo do tempo).
pichenettes
fonte
Abordagem interessante. Que tipo de resolução de tempo você pode obter de uma análise da MFCC? Isso é limitado pela resolução espectral?
Hilmar
Poster não disse que resolução ele esperava. Essa abordagem é limitada à resolução da análise do MFCC, normalmente feita de 50 a 100 quadros por segundo. Isso é suficiente para aplicativos que envolvem fala e "áudio cotidiano" (por exemplo, alinhamento de tomadas de várias câmeras não TCed na edição de vídeo); provavelmente não é música. Para obter mais resolução, sugiro fazer um alinhamento "de granulação grossa" usando o MFCC para obter um alinhamento em +/- 10ms (duração de um quadro FFT); depois, pegue alguns trechos de 100ms de áudio a cada 10s, aproximadamente, das duas fontes; e fazer uma correspondência exaustiva usando esses.
Pichenettes
2
Na verdade, o método de correlação cruzada geralmente é bastante insensível ao ruído. A correlação cruzada da parte sem ruído do som criará um pico na correlação cruzada. Por outro lado, como o ruído é aleatório, é improvável que o ruído em uma gravação se correlacione de alguma maneira específica com qualquer coisa na outra gravação e, portanto, apenas gerará mais ruído na correlação cruzada. Esse ruído é muito fraco em comparação com o pico, e, portanto, a precisão ao localizar o pico quase não será afetada.
HelloGoodbye
Sou cético quanto à possibilidade de respostas ligeiramente diferentes desempenharem um papel tão grande, nesse sentido; você ainda obteria um pico na correlação cruzada, embora talvez seja traduzido muito levemente, o que seria causado por um atraso em um dos transdutores. No entanto, se você tiver esse atraso, não vejo como o MFCC melhoraria isso.
HelloGoodbye
Finalmente, mesmo se você tiver minutos de áudio, a correlação cruzada pode ser calculada com muita eficiência usando a FFT. Eu suspeito que extrair uma sequência de vetores MFCC de ambos os sinais levaria um tempo significativamente mais longo.
HelloGoodbye