Determinando o quão alto um AudioClip é

10

Eu tenho algum código que usa GetSpectrumDatade um AudioSource tocando uma música para criar um layout de nível para o player tocar. Quero adicionar uma funcionalidade em que os jogadores possam fazer upload de suas próprias músicas e tocar os níveis criados com os dados dessas músicas. Infelizmente, ao comparar diferentes arquivos de áudio, encontrei o seguinte:

insira a descrição da imagem aqui

Como você pode ver, a amplitude difere drasticamente de clipe para clipe, criando subseqüentemente níveis que são triviais ou quase impossíveis. Eu quero encontrar uma maneira de determinar essa "sonoridade" para que eu possa diminuí-la ou amplificá-la com um multiplicador depois de obter os dados da música. Além disso, existe uma maneira de extrair esses dados sem tocar a música?

Jardineiro
fonte

Respostas:

9

Uma maneira manual de fazer isso é usar o AudioClip.GetData para obter os dados de amostra em uma matriz. Em seguida, faça um loop pelos dados e encontre o Root Mean Square para encontrar o "volume" do clipe de áudio.

Você também pode dimensionar toda a matriz para que o valor máximo seja 1.0f e gravá-lo novamente no clipe de áudio com AudioClip.SetData . Isso é chamado de áudio de normalização e faz com que as amostras tenham o ponto mais alto do volume máximo. Observe que isso não leva em consideração que, se os clipes de áudio tiverem volume muito baixo, mas apresentarem picos muito altos. Existem técnicas mais avançadas para isso (anotadas abaixo).

O Unity também está normalizando automaticamente por padrão. Portanto, se você não tocou nas configurações de importação, esta operação é feita automaticamente e você não precisa se preocupar com isso. Se você ainda tiver o problema, mesmo tendo certeza de que o áudio está normalizado, provavelmente precisará comprimir o áudio com compressão de faixa dinâmica (observação: algo muito diferente da compactação de dados, não tem nada a ver com tamanhos de arquivo ou uso de memória) para ajuste suas necessidades com software externo.

Lasse
fonte
Resposta impressionante, analisará tudo isso com mais detalhes. Obrigado!
Jardineiro
5
O valor máximo nem sempre é a melhor opção (como você disse). Picos altos muito curtos (que soam como cliques) não parecem tão altos quanto um som contínuo. Se você deseja a sonoridade percebida, precisa quadrar todos os valores, calcule a média disso e, em seguida, pegue a raiz quadrada. Fazer dessa maneira é o que a normalização faz; portanto, esperamos que haja uma Unidade incorporada a ela.
precisa saber é o seguinte
2
A sonoridade está relacionada à energia sonora, e a maneira de determinar isso é, como @Jezzamon sugere, calculando o quadrado médio da raiz (RMS). O que você precisa saber é que você pode usar o seguinte código
Zac Crites