Desacelere a reprodução de música enquanto mantém a frequência

10

Tocar um pedaço de áudio da música em uma velocidade mais lenta diminuiria seu tom (frequência). Existe uma ferramenta e uma teoria para diminuir a velocidade da música enquanto mantém a frequência igual? Suponho que se pode fazer transformada de Fourier com janela ou transformação de wavelet. Parece que é preciso pré-selecionar o tamanho da janela ou escolher dinamicamente a base da wavelet. Existe alguma teoria e aplicação específica e detalhada para fazer isso?

Hans
fonte
11
Além da resposta fornecida abaixo, consulte este link para obter mais informações.
A_A 01/07

Respostas:

5

Sim, alguns de nós podem fazê-lo, você pode acelerar ou diminuir a velocidade sem afetar o tom, alguns caras chamam isso de Time Stretch, existem diferentes maneiras de fazer isso, você pode fazer no domínio da frequência ou no domínio do tempo, precisará escolher o que é melhor para você, você encontrará algumas vantagens e desvantagens de cada uma.

Domínio do tempo:

No Time Domain, você pode tentar algumas técnicas como:

  • TDHS (Sacalização Harmônica no domínio do tempo)
  • SOLA (adição de sobreposição síncrona)
  • PSOLA (adição de sobreposição síncrona de pitch)
  • WSOLA (adição de sobreposição de similaridade de forma de onda)

Prós: É rápido, alguns algoritmos são fáceis de entender, boa qualidade em sons monofônicos.

Contras: Geralmente, você precisará de uma trilha de arremesso muito boa para emendar na posição correta, é difícil de fazer :-(, por isso, se sua trilha de arremesso falhar ou não funcionar com sons polifônicos, esses algoritmos fornecerão muitas falhas / artefatos no som de saída.

Domínio de frequência:

Todo o tempo que eu conheço no domínio da frequência é baseado em técnicas de fase de vocoder .

Prós: Funciona com sons polifônicos ou monofônicos.

Contras: Pode ser doloroso entender toda a matemática, a implementação é um pouco difícil, não é tão rápida como os códigos do domínio do tempo, para voz, eu prefiro resultados no domínio do tempo, alguns truques para melhorar o resultado do vocoder da fase padrão não são compartilhados.

Posso dizer que a janela e o tamanho do lúpulo são uma das chaves para a qualidade do vocoder de fase, geralmente escolhemos 4xsobrepor à ressíntese, uma única janela de tamanho 4096é suficiente para meus ouvidos (é claro, se você tem poder de processamento para esses tamanhos) , o vocoder de fase padrão pode adicionar alguns efeitos reverberantes. Para evitar esse tipo de problema, talvez seja necessário bloquear a fase.

Para datailed dar uma olhada no Miller Puckette e Portnoff papel

Ederwander
fonte
Obrigado pela sua resposta. Qual é o problema da abordagem mais ingênua: expanda o sinal de tempo como um todo, em função de todo o intervalo de tempo sem se infiltrar na série Fourier e multiplique todas as frequências por uma constante. Entendo que qualquer erro local no domínio do tempo afetaria todos os coeficientes de Fourier. Além disso, quais são as armadilhas dessa abordagem ingênua e não localizada?
Hans
Eu nunca tentei algo assim, pode funcionar, o problema óbvio é que isso pode ser bastante caro. Certamente não é uma maneira eficiente, imagine que você tenha um pedaço de áudio (1 minuto) amostrado a 44100Hz, agora para fazer o que você está propondo que você terá que aplicar Fourier em 44100 * 60 = 2646000pontos de uma vez e processo, então esqueça a qualquer tentativa de processamento em tempo real, tais este ,
ederwander
11
Eu não acho que o que sugeri antes funcionaria no sentido matemático puro (desconsiderando a sensibilidade do custo e do erro).
Hans
3

A ferramenta / teoria que você descreve é ​​realmente uma grande área de pesquisa em tecnologia musical, amplamente chamada de modificação da escala de tempo do áudio. Um grande componente desse campo é como você pode impedir alterações audíveis na frequência após o alongamento do tempo. Isso pode ser abordado com métodos no domínio da frequência e do tempo, dependendo das restrições ou dos objetivos do seu aplicativo. A entrada da Wikipedia para modificação de escala de tempo / afinação de áudio é um bom ponto de partida.

Se você deseja seguir uma abordagem usando frequência / wavelet, o tamanho da janela e a escolha da base afetarão a capacidade de localizar o sinal. Para usar o STFT como exemplo, uma janela longa funcionará bem para sinusóides estacionários, mas destruirá seus transitórios. Uma janela mais curta fornecerá uma resposta transitória preferível ao custo da localização no domínio da frequência. O desempenho de outras bases de wavelets dependerá da natureza da projeção do seu sinal na base.

Veloz
fonte
Muito obrigado pela resposta. Você tem alguma referência sobre a aplicação da wavelet nesse problema?
Hans
Por favor, veja meu comentário abaixo da resposta de ederwander também. Obrigado.
Hans
2

Abaixo está um link para uma função tutorial simples e valiosa em C ++ (smbPitchShift.cpp) de Stephan M. Bernsee, que pode desacelerar ou acelerar a música sem alterar seu tom.

Ele lançou esse código sob a The Wide Open License (WOL). Dentro do meu aplicativo, eu pude adaptar sua função para diminuir a velocidade da música em tempo real - ou seja, ao reproduzir um arquivo mp3 e, adicionalmente, fazer a detecção de afinação no sinal mp3 ao mesmo tempo.

Também incluí um link para o site de Bernsee, que contém suas descrições detalhadas sobre o alongamento do tempo e a mudança de pitch de sinais de áudio, como música.

https://github.com/AndyA/BatPhone/blob/master/pitchshift.c

http://blogs.zynaptiq.com/bernsee/time-pitch-overview/

James Paul Millard
fonte
O código original não se aplica time stretch, o código original se aplica Pitch Shift. Nesse caso, para aplicar a modificação da escala de tempo, você precisará combinar Pitch Shifit + Resample (interpolation). O código do Bernsee funciona bem usando uma janela de tamanho, que 4096você poderá alterar em uma oitava (acima ou abaixo) , significa que, portanto, você só poderá fazer escala de tempo com boa qualidade usando fatores entre 2.0x-0.5x, um vocoder de fase bem construído pode obter melhores resultados usando o mesmo tamanho de janela e poderá extrapolar esses fatores com melhor qualidade
ederwander
Opa, agora lembrando que eu tinha que aplicar a Re-Amostragem para concluir o período de tempo, para que o tom original não fosse alterado. Parece que Bernsee criou algumas alterações em seu código desde a versão vinculada no GitHub. Seu código mais recente está disponível para download em seu site - pode aumentar o alcance da mudança de sua especificação original. Ajustei o código original para poder aumentar o turno em 8x.
James Paul Millard
não há diferenças entre o seu código e a página de Bernsee, a matemática principal ainda é a mesma. A forte diferença que vejo é o tamanho da janela = 8192nos códigos da página de download, então você precisa fazer mais quatro pontos no processamento , Volto a dizer que, com metade do tamanho da janela, 8192/2=4096você pode fazer o mesmo usando alguns segredos do codificador de fase, o ponto aqui é que você pode manter a qualidade com muito menos processamento.
Ederwander 6/07/16
Embora eu tenha fornecido o link do GitHub para o BatPhone, NÃO é o meu código. Acabei de retirá-lo de uma pesquisa na Internet para exibir o smbPitchShift (). Meu código é muito modificada da versão de Bernsee, e residiu neste arquivo: github.com/CreativeDetectors/PitchScope_Player/blob/master/Src/...
James Paul Millard
Sim, agora eu posso ver, é realmente uma nova amostra, você pode estar interessado em ver / ouvir meu vocoder de fase em ação.
Ederwander 6/07