O que e como é a codificação de um arquivo de áudio bruto (sem cabeçalho)?

8

Eu fiz isso:

me@riverbrain:~/sgf$ echo "test" | text2wave -otype raw -F 16000 >> test.raw

que produziu um arquivo de áudio sem cabeçalho. O maravilhoso desse arquivo é que ele pode ser concatenado (usando cat, como texto) com outro arquivo de áudio bruto.

Claro, eu tenho um problema. O problema é que ainda não consigo jogar.

me@riverbrain:~/sgf$ play test.raw 

play FAIL formats: bad input format for file `test.raw': sampling rate was not specified

e também, ao especificar a taxa de amostragem

me@riverbrain:~/sgf$ play -r 16000 test.raw 
play FAIL formats: bad input format for file `test.raw': data encoding was not specified

Quando procurei algumas informações em "codificação", tive a sensação de que tinha muito a ver com a arquitetura do processador, mas talvez eu esteja errado. De qualquer forma, não consigo encontrar nenhuma documentação sobre como 'perguntar' ao computador qual é a codificação de dados do arquivo de áudio bruto. E também sei qual é a taxa de amostragem, devido a defini-la, mas isso é o máximo que posso obter.

ixtmixilix
fonte
2
Não há formato bruto padrão. Você precisa descobrir quais parâmetros o aplicativo que o produziu usou. Infelizmente, isso nem sempre é bem documentado.
Gilles 'SO- stop be evil'

Respostas:

8

Pode variar - mas pelo menos para mim, o text2wave produz PCM inteiro assinado de 1 canal, 16 bits. Eles são razoavelmente normais - e ficará muito claro quando você os acertar (por exemplo, se você não assinou um número inteiro por engano, obterá um som extremamente distorcido)

Com o jogo, isso se parece com:

play -r 16000 -b 16 -c 1 -e signed-integer /tmp/foo.raw
play -r 16000 -2 -s -c 1 /tmp/foo.raw # obsolete way for older versions of Sox

Esses parâmetros estão configurados no Festival em algum lugar, eu suspeito. Alguns deles também podem ser codificados.

A única coisa dependente da arquitetura que você pode encontrar é grande versus pouco endian; na minha máquina little-endian, o Festival está escrevendo little-endian; se eu movesse esse arquivo para uma máquina big endian, provavelmente precisaria adicionar -L. Se text2wavfossem executados em uma máquina big endian, não tenho certeza se ele gravaria dados big ou little endian.

derobert
fonte
obrigado. todas essas respostas foram ótimas, mas essa é a solução que acabei usando.
Ixtmixilix 6/12/11
2

Você provavelmente pode criar seu próprio cabeçalho RIFF. Um pouco de bashing deve fazê-lo .. e apenas colocar o cabeçalho nas suas outras peças ...

Este link mostra o layout do cabeçalho: O formato de arquivo Canonical WAVE

Há também um link relacionado no SO: Converter dados de áudio RAW em WAV com script , mas as respostas mplayer / mencoder têm uma contagem de zero marcada. No entanto, parece que o SoX funciona.

O SoX é mencionado nos links acima e está disponível no repositório do Ubuntu; Suponho que também esteja nos outros.

PS ... Eu apenas tentei usar play(não sabia que existia) e descobri que é SoX! ... O link SO fornece um exemplo, copiado aqui:sox -r 44100 -e unsigned -b 8 -c 1 <RAW_FILE> <TARGET_FILE>

Se você não conseguir fazê-lo funcionar com o sox , talvez o mplayer / mencoder ou o cabeçalho RIFF o ajudem.

Peter.O
fonte
2

Use em aplayvez de playpara reproduzir um arquivo bruto, desta forma, você pode especificar que é um áudio cru pela opção -t:

aplay -q -c 2 -t raw -f s16 test.raw
neuron34
fonte