2 pontos por GN⁺ 2024-11-11 | 1 comentários | Compartilhar no WhatsApp
  • Audio Decomposition é um programa open source que busca dividir o áudio em suas notas e instrumentos componentes para transcrever música em partitura
  • As amostras de instrumentos vêm do University of Iowa Electronic Music Studios instrument database; para cada forma de onda, a transformada de Fourier e o envelope são armazenados e usados como base de comparação
  • O arquivo de música é analisado em intervalos de 0,1 segundo para criar um espectrograma, e combinações das transformadas de Fourier armazenadas por instrumento são usadas para estimar a intensidade de cada instrumento naquele trecho
  • A análise de envelope separa os trechos de attack·sustain·release e a atenuação estática/dinâmica, depois calcula o custo por instrumento na faixa filtrada da nota
  • O resultado opta por exibir algo parecido com uma partitura usando um gráfico de dispersão do matplotlib, em vez de recriar o áudio, facilitando a solução do problema e a visualização de dados esparsos

Decomposição de áudio para conversão em partitura

Transformada de Fourier em intervalos de 0,1 segundo

  • Partindo da ideia de que sons de instrumentos podem ser caracterizados principalmente pela transformada de Fourier e pelo envelope, essas duas informações são usadas para estimar qual instrumento toca qual nota
  • O arquivo de música passa por uma transformada de Fourier a cada 0,1 segundo e é processado como um espectrograma
  • Para reproduzir a transformada de Fourier de cada trecho de 0,1 segundo, somam-se as transformadas de Fourier armazenadas por instrumento
  • A intensidade de cada instrumento é calculada resolvendo uma matriz obtida das derivadas parciais por frequência de uma função de custo MSE
    • Cada linha da matriz corresponde à derivada parcial de cada instrumento, como cello, piano etc.
    • O exemplo é o cálculo de custo para valores por frequência, como o valor da transformada de Fourier em 5 Hz

Envelope e separação dos trechos da nota

  • O envelope é o limite superior da forma de onda; como funções existentes podem não funcionar bem com ruído ou certas formas de onda, é usado um método próprio
  • O processo de cálculo divide a forma de onda em chunks e pega o valor máximo de cada chunk
  • Depois, o resultado é refinado encontrando pontos em que o envelope fica abaixo da forma de onda original e adicionando novos pontos
  • O envelope é dividido em attack, sustain e release
    • attack: som inicial da nota
    • sustain: trecho em que a nota é mantida
    • release: trecho em que a nota cessa
  • Nas amostras de instrumentos, o primeiro valor diferente de zero é usado como ponto inicial do attack
  • A fronteira entre attack e sustain é definida como o primeiro ponto em que a função se torna côncava para baixo ou começa a diminuir
  • A fronteira entre sustain e release é definida olhando a partir do fim e escolhendo o primeiro ponto em que a função aumenta ou fica côncava para baixo
  • O fim do release é encontrado olhando a partir do fim e procurando o primeiro ponto diferente de zero

Tipos de atenuação e correspondência de instrumentos

  • Para distinguir a forma principal da onda, são consideradas atenuação estática e atenuação dinâmica
  • Alguns instrumentos, como piano, em geral têm atenuação estáática, que segue uma forma de decaimento exponencial
  • Alguns instrumentos, como violin, podem aumentar ou diminuir o volume mesmo durante o sustain
  • Entre as amostras de instrumentos, há arquivos mantidos até o som desaparecer naturalmente e arquivos em que o release ocorre cedo
  • Se a atenuação é estática ou dinâmica é determinado verificando se o coeficiente de atenuação é maior que 1 ou se há desvio excessivo da curva de atenuação
  • Se o envelope tem release, ou seja, se é AS ou ASR, é determinado comparando a taxa média de variação do sustain e do release
    • Se a taxa de variação do release for menor, considera-se que não há release
  • No processamento do arquivo de música, aplica-se um filtro passa-faixa para cada frequência de nota
  • Para a forma de onda filtrada, percorre-se cada instrumento e calcula-se a correlação cruzada do attack e do release normalizados para encontrar o início e o fim da nota
  • Em seguida, calcula-se o MSE entre a forma de onda do instrumento e o áudio filtrado, usando-o como custo do instrumento naquele momento
  • A intensidade final é calculada multiplicando a intensidade da etapa da transformada de Fourier pelo 1 / custo da etapa de envelope

Exibição do resultado baseada em gráfico de dispersão

  • O resultado é exibido como uma partitura usando um scatter plot do matplotlib com pontos em formato de -
  • A ideia original era recriar o áudio a partir das intensidades calculadas, mas isso gerou muitos problemas, consumiu tempo e dificultou a depuração
  • O imshow do matplotlib também foi testado, mas era muito ineficiente quando a maioria dos valores era 0
    • Isso porque, ao mover a tela ou dar zoom, todos os pontos precisavam ser redesenhados, estivessem visíveis na tela ou não
  • Como resultado, ele pode ser usado para melhorar a reprodução de partituras, especialmente quando é difícil encontrar o pitch ou os acordes corretos
  • Como exemplo, foi usado para reproduzir uma partitura no Noteflight com base em um vídeo do YouTube
  • O tempo de execução também não chega a ser longo demais

1 comentários

 
GN⁺ 2024-11-11
Comentários do Hacker News
  • O título é um pouco confuso. Se escrever open-source separation, isso pode ser lido como separação de fontes (source separation), mas na prática não é isso, e sim um algoritmo de detecção de pitch que depois classifica de qual instrumento veio o pitch detectado
    É bem legal, mas, se você precisar de um resultado realmente preciso, parece que corrigir a saída pode acabar levando mais tempo do que fazer manualmente

    • Para ser justo com o autor, ele ainda está no ensino médio: https://matthew-bird.com/about.html
      Para algo feito nessa idade, é impressionante
    • Fico na dúvida se source separation normalmente é mais chamado de stem separation, ou se são conceitos diferentes
      Quando músicos tentam restaurar, a partir de um único arquivo de áudio, algo próximo das faixas originais antes da mixagem — isto é, os stems —, parece que ouço mais o segundo termo
    • Acho que o hífen elimina completamente esse tipo de ambiguidade
  • Não vi isso ser mencionado diretamente no post, mas, para quem se interessa, transcrição automática de música, ou seja, converter áudio em MIDI, é uma subárea bem grande de deep learning e recuperação de informação musical
    Também houve vários modelos bem-sucedidos em transcrição musical multifaixa, e existe o projeto MT3 do Google: https://research.google/pubs/mt3-multi-task-multitrack-music...
    No caso de transcrição de piano, a precisão já está chegando perto de ser quase perfeita, mesmo com áudio de qualidade muito baixa: https://github.com/EleutherAI/aria-amt
    Aliás, sou o autor do repositório acima

    • Aqui eles também estão tentando resolver outro problema, que também é bem difícil. O problema de derivar uma partitura precisa a partir de dados MIDI é daquele tipo que “parece fácil, mas não é”
      Transcritores de áudio para MIDI acertam bem o pitch e o instante de início, mas duração e intensidade são bem menos estáveis
    • Sei que as métricas reportadas do MT3 são muito boas, mas tenho curiosidade se, ao usar na prática, ele também foi bem-sucedido: https://replicate.com/turian/multi-task-music-transcription
      Portei o Colab deles para rodar mais facilmente como runtime, mas a saída MIDI ficou bem estranha
      Mesmo colocando stems simples, em algumas faixas a saída MIDI não batia bem com o áudio e tinha problemas de timing a ponto de ficar inutilizável, embora com outros áudios funcionasse razoavelmente bem
    • Fico curioso sobre como esse problema se simplifica quando você o restringe ao piano
  • Se você se interessa por separação de áudio ou separação de stems, vale dar uma olhada no RipX: https://hitnmix.com/ripx-daw-pro/
    Ele também pode exportar as faixas separadas como arquivos MIDI. Ainda tem alguns problemas, mas funciona bem
    A separação de stems está virando um recurso padrão em software musical, e quase toda DAW já oferece isso

    • O RipX faz separação de stems e permite reajustar a afinação dentro da mix, então, se esse é o objetivo, ele é excelente
      Para o que eu faço, o moises foi mais fácil de usar: https://moises.ai/
      Ele oferece suporte a transposição da música inteira ou time-stretching, além de uma interface simples para separação de stems e controle de mute/volume por faixa. Detecta automaticamente o tempo e os acordes
      Não tenho qualquer relação com a empresa; sou apenas um usuário satisfeito que usa quase todos os dias para aprender e praticar músicas. Normalmente aumento a parte do baixo e abaixo o resto para menos de 10% do volume, para ouvir o baixo com clareza, o que mostra bem com que frequência as partituras online — inclusive as pagas — estão erradas. Depois de aprender a parte, eu silencio o baixo e toco junto com a música original como se fosse o baixista
    • O Stemroller[0] também existe há algum tempo, é grátis e baseado em modelos da Meta
      0: https://www.stemroller.com/
    • Em vez de “quase toda DAW já oferece”, eu diria que é um recurso emergente que quase toda DAW deveria ter, mas a maioria ainda não tem
      Ableton Live - não
      Bitwig - não
      Cubase - não
      FL - sim
      Logic - sim
      Pro Tools - não
      Reason - não
      Reaper - não
      Studio One - sim
    • Parece relacionado ao Polymath: https://github.com/samim23/polymath
      O Polymath é eficaz para separar e extrair faixas de instrumentos individuais de MP3 e funciona muito bem
  • Isso é realmente muito legal, mas há física real de instrumentos que um simples template de transformada de Fourier não capta. Por exemplo, um trompete pode ter um espectro harmônico muito diferente ao tocar fraco ou forte, mesmo na mesma nota
    O trompete produz uma série harmônica rica, com harmônicos fortes, então a transformada de Fourier mostra picos marcantes em múltiplos inteiros da frequência fundamental. Instrumentos como a flauta produzem um timbre mais puro, mas metais em geral tendem a ter harmônicos mais altos mais fortes, o que tornaria mais complexas também as derivadas parciais da equação matricial mencionada no texto
    Este script identifica o timing das notas usando filtragem passa-banda e correlação cruzada dos envelopes de ataque e release. Como instrumentos de metal podem exibir comportamento não linear, com a composição harmônica variando bastante conforme a intensidade da execução, não sei bem como esse algoritmo lidaria com casos em que o brilho muda entre pp e ff. Para melhorar a precisão, eu consideraria adicionar templates de Fourier dependentes da intensidade para cada instrumento

    • Como alguém que usa separação de fontes duas vezes por semana para mixagem, há muitos instrumentos capazes de produzir um timbre como “vocal”
      Quando os instrumentos não soam de forma típica, ou quando uma banda não é tocada/mixada para maximizar a separação entre os instrumentos, todos esses modelos deixam de funcionar bem. Por exemplo, uma guitarra elétrica com harmônicos distorcidos pode tocar as mesmas notas que o vocal, o baterista pode estar produzindo apenas ruído agudo nos pratos, e o baixista pode imitar sons percussivos parecidos com bumbo no instrumento
      Nesse tipo de música experimental, os resultados da separação de fontes se tornam completamente imprevisíveis, podendo ou não servir para rebalanceamento musical
  • Parece ser um trabalho feito pelo irmão do Joshua Bird. O Joshua Bird também já fez alguns projetos impressionantes que apareceram no HN antes: https://www.youtube.com/@joshuabird333

    • Isso mesmo, Matt é o irmão do Josh. Surpreendente e muito legal que você tenha percebido isso
  • Isso me lembrou de quando eu jogava Audiosurf há uns 15 anos. Como o tempo voa
    https://en.wikipedia.org/wiki/Audiosurf

  • Posso ter entendido errado, mas não parece que nenhum dos demos no YouTube esteja mostrando separação de fontes
    Só para acrescentar, em pesquisa de áudio, separação de fontes significa separar o áudio em clipes distintos

    • Acho que decomposição é a palavra mais adequada aqui. Neste caso, source separation parece estar sendo usado no sentido de que os sons decompostos podem ser divididos em diferentes origens, mas a expressão induz ao erro
    • Aqui, “source” parece estar ligado ao source de “open source”
  • Sou fã de longa data do Ultrastar Deluxe. É um clone open source do Singstar, um jogo de karaokê em que as pessoas cantam acompanhando músicas e competem entre si
    Ele reconhece as notas cantadas e as compara com um arquivo de mapeamento de timing vocal da música; quanto mais perto você canta da melodia, maior a pontuação. Acertar exatamente a letra não importa
    Existem muitas bibliotecas de músicas mapeadas feitas por fãs, mas nunca são suficientes, e há pouquíssimas músicas mapeadas em idiomas que não sejam inglês e espanhol. Mapear tudo manualmente leva muito tempo, e eu mesmo sou quase sem afinação, então fica ainda mais difícil
    Há muito tempo eu me pergunto que tipo de software poderia automatizar esse processo com mais facilidade, e esta ferramenta parece muito boa para capturar o timing vocal e as notas da gravação original
    Um item da minha lista de desejos é um dia montar uma playlist estilo Singstar na minha língua nativa e fazer uma festa de karaokê com os amigos. Se alguém tiver recomendações de ferramentas parecidas, tenho interesse

  • Pelo que vejo, alguns vídeos parecem estar sem áudio

    • O motivo está escrito no link do YouTube. Diz “sem áudio por copyright”, e também há um link de áudio para reproduzir junto