原始(无头)音频文件的编码是什么以及如何编码?


8

我已经做到了:

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

产生了无头音频文件。关于此文件的妙处在于它可以被串联(使用cat与另一个原始音频文件,如文本)。

当然,我有问题。问题是我还不能玩。

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

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

而且,当指定采样率时

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

当我查找一些信息“编码”时,我感觉到它与您的处理器体系结构有很大关系,但也许我错了。无论如何,我找不到任何有关如何向计算机“询问”原始音频文件的数据编码是什么的文档。而且我也知道采样率是多少,这取决于我自己设置,但这是我所能达到的。


2
没有标准的原始格式。您需要找出产生它的应用程序使用了哪些参数。不幸的是,这并不总是有据可查的。
吉尔(Gilles)“所以,别再邪恶了”,

Answers:


8

它可以变化,但是至少对我而言,text2wave产生1通道,16位,带符号整数PCM。这些是很正常的,当您正确使用它们时会非常清楚(例如,如果您错误地对整数进行了无符号签名,则声音会变得极度失真)

通过播放,看起来像:

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

我怀疑这些参数是在Festival中某个地方配置的。其中一些可能也被硬编码。

您可能会遇到的唯一与体系结构相关的事物是大字节序与小字节序。在我的Little-endian机器节上,我正在写作Little-Endian。如果我将该文件移动到big-endian机器上,则可能需要添加-L。如果text2wav是在高字节序的计算机上运行,​​我不确定它是否会写入高字节序或低字节序的数据。


谢谢。所有这些响应都很棒,但这是我最终使用的解决方案。
ixtmixilix 2011年

2

您可能可以创建自己的RIFF标头。一点点的打击应该做到这一点..只是把标题连接到您的其他一块...

此链接显示标题布局:Canonical WAVE文件格式

SO上还有一个相关链接:使用脚本将RAW音频数据转换为WAV,但mplayer / mencoder的答案标记为零。但是,它认为SoX可以工作。

SoX在以上两个链接中都被提及,并且可以在Ubuntu的仓库中找到。我想其他人也一样。

PS ...我只是尝试使用play(不知道它存在)而发现它是SoX!... SO链接给出了一个示例,复制到此处:sox -r 44100 -e unsigned -b 8 -c 1 <RAW_FILE> <TARGET_FILE>

如果您无法通过sox使用它,则可能是mplayer / mencoder或RIFF标头可以帮助您。


2

使用aplay而不是play播放原始文件,可以通过-t开关将其指定为原始音频:

aplay -q -c 2 -t raw -f s16 test.raw
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.