Olá Minha primeira série de artigos terá como objetivo estudar métodos de compactação e armazenamento de imagens / som, como JPEG (imagem) e WAVE (som), e também incluirão exemplos de programas que utilizam esses formatos (.jpg, .wav) na prática. Nesta parte, consideraremos o WAVE.
A história
WAVE (Waveform Audio File Format) é um formato de arquivo contêiner para armazenar gravações de fluxo de áudio. Esse contêiner é normalmente usado para armazenar som não compactado na modulação do código de pulso. (Adaptado da Wikipedia)
Foi inventado e publicado em 1991 junto com o RIFF pela Microsoft e IBM (empresas líderes de TI da época).
Estrutura de arquivo
O arquivo tem uma parte do cabeçalho, os dados em si, mas não há rodapé. O cabeçalho pesa um total de 44 bytes.
O cabeçalho contém configurações para o número de bits na amostra, a frequência de descritização, a profundidade do som, etc. informações necessárias para uma placa de som. (Todos os valores numéricos da tabela devem ser escritos em ordem Little-Endian)
Exemplo WAVE
A tabela anterior pode ser facilmente traduzida em uma estrutura C, mas hoje nossa linguagem é Python. A coisa mais fácil de fazer usando a onda é um gerador de ruído. Para esta tarefa, não precisamos de alta byteRate e compactação.
Para começar, importamos os módulos necessários:
Em seguida, precisamos criar todas as variáveis necessárias da tabela de acordo com seus tamanhos. Os valores variáveis dependem aqui apenas de numSamples (o número de amostras). Quanto mais houver, mais longo será o ruído.
numSamples = int(argv[1]) output_path = argv[2] chunkId = b'RIFF' Format = b'WAVE' subchunk1ID = b'fmt ' subchunk1Size = b'\x10\x00\x00\x00'
Resta apenas escrevê-los na sequência necessária (como na tabela):
with open(output_path, 'wb') as fh: fh.write(chunkId + chunkSize + Format + subchunk1ID + subchunk1Size + audioFormat + numChannels + sampleRate + byteRate + blockAlign + bitsPerSample + subchunk2ID + subchunk2Size + data)
E então, pronto. Para usar o script, precisamos adicionar os argumentos de linha de comando necessários:
python3 WAV.py [num of samples] [output]
número de amostras - contagem amostras
output - caminho para o arquivo de saída
Aqui está um link para um arquivo de áudio de teste com ruído, mas para economizar memória, reduzi o BPS para 1b / s e reduzi o número de canais para 1 (com fluxo de áudio estéreo não compactado de 32k a 64kbs, resultou 80M de um arquivo .wav limpo e apenas 10): https: / /instaud.io/3Dcy
O código inteiro (WAV.py) (o código possui muitos valores duplicados de variáveis, isso é apenas um esboço):
from struct import pack
Sumário
Então você aprendeu um pouco mais sobre o som digital e como ele é armazenado. Neste post, não usamos compactação (audioFormat), mas para revisar cada um dos artigos populares, você precisará dos artigos 10. Espero que você tenha aprendido algo novo e que isso o ajude em desenvolvimentos futuros.
Obrigada
Fontes
Estrutura de arquivos WAV
WAV - Wikipedia