9

I have done this:

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

which produced a headerless audio file. The wonderful thing about this file is that it can be concatenated (using cat, like text) with another raw audio file.

Of course, I've got a problem. The problem is that I can't play it yet.

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

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

and also, when specifying sample rate

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

When I looked up some information 'encoding' I got the feeling that it had a lot to do with your processor architecture, but maybe I'm wrong. Anyway, I can't find any documentation about how to 'ask' the computer what the data encoding of the raw audio file is. And I also I know what the sample rate is, due to setting it myself, but that's as far as I'm able to get.

Gilles 'SO- stop being evil'
  • 807,993
  • 194
  • 1,674
  • 2,175
ixtmixilix
  • 13,040
  • 27
  • 82
  • 118

3 Answers3

8

It can vary—but at least for me, text2wave produces 1-channel, 16-bit, signed integer PCM. These are fairly normal—and it'll be very clear when you have them right (e.g., if you unsigned-integer by mistake, you'd get extremely distorted sound)

With play, that looks like:

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

These parameters are configured in Festival somewhere, I suspect. Some of them may be hardcoded as well.

The only architecture-dependent thing you may encounter is big vs. little endian; on my little-endian machine Festival is writing little-endian; if I moved that file to a big-endian machine I'd likely need to add -L. If text2wav were run on a big-endian machine, I'm not sure if it'd write big- or little- endian data.

derobert
  • 107,579
  • 20
  • 231
  • 279
3

Use aplay instead of play to play a raw file, this way you can specify that it's a raw audio by the -t switch:

aplay -q -c 2 -t raw -f s16 test.raw
neuron34
  • 1,256
  • 8
  • 5
2

You can probably create your own RIFF header. A bit of bashing should do it.. and just cat the header to your other piece(s)...

This link shows the header layout: The Canonical WAVE file format

There is also a related link on SO: Converting RAW audio data to WAV with scripting, but the mplayer/mencoder answers have a zero marked-up count. However, it sems that SoX works.

SoX gets a mention in both the above links, and is available in Ubuntu's repo; I suppose it is in others also.

PS... I just tried using play (didn't know it existed) and discovered it is SoX! ...The SO link gives an example, copied here: sox -r 44100 -e unsigned -b 8 -c 1 <RAW_FILE> <TARGET_FILE>

If you can't get it working with sox, maybe mplayer/mencoder or the RIFF header will get it going for you.

Peter.O
  • 32,426
  • 28
  • 115
  • 163