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. A coisa maravilhosa sobre esse arquivo é que ele pode ser concatenado (usando cat , como texto) com outro arquivo de áudio bruto.

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

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 pesquisei algumas informações 'codificadas', tive a sensação de que isso tinha muito a ver com a arquitetura do seu 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 eu também sei qual é a taxa de amostragem, devido a configuração por mim mesmo, mas isso é o máximo que eu posso conseguir.

    
por ixtmixilix 01.12.2011 / 14:52

3 respostas

8

Ele pode variar, mas, pelo menos para mim, o text2wave produz um PCM inteiro assinado de 1 canal e 16 bits. Isso é bastante normal - e ficará bem claro quando você os acertar (por exemplo, se você não assinou inteiro por engano, você obterá um som extremamente distorcido)

Com a reprodução, parece que:

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 são configurados no Festival em algum lugar, suspeito. Alguns deles podem ser codificados também.

A única coisa dependente de arquitetura que você pode encontrar é grande contra little 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 text2wav fosse executado em uma máquina big-endian, não tenho certeza se gravaria dados big-little-endian.

    
por 01.12.2011 / 19:09
2

Você provavelmente pode criar seu próprio cabeçalho RIFF. Um pouco de contusão deve fazê-lo .. e apenas cat o cabeçalho para o seu outro pedaço (s) ...

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

Há também um link relacionado em SO: Convertendo dados de áudio RAW para WAV com scripting , mas as respostas do mplayer / mencoder têm uma contagem zero-marcada. No entanto, sems que SoX funciona.

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

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

Se você não conseguir trabalhar com sox , talvez o mplayer / mencoder ou o cabeçalho RIFF funcionem para você.

    
por 01.12.2011 / 15:34
1

Use aplay em vez de play para reproduzir um arquivo bruto, assim você pode especificar que é um áudio bruto pela opção -t:

aplay -q -c 2 -t raw -f s16 test.raw
    
por 02.12.2011 / 11:06

Tags