Was und wie ist die Codierung einer rohen (headerlosen) Audiodatei?

8

Ich hab's gemacht:

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

die eine Headerless-Audiodatei erzeugt. Das Wunderbare an dieser Datei ist, dass sie (unter Verwendung von catText) mit einer anderen rohen Audiodatei verkettet werden kann.

Natürlich habe ich ein Problem. Das Problem ist, dass ich es noch nicht spielen kann.

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

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

und auch bei der Angabe der Abtastrate

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

Als ich einige Informationen nachschlüsselte, hatte ich das Gefühl, dass dies viel mit Ihrer Prozessorarchitektur zu tun hat, aber vielleicht irre ich mich. Wie auch immer, ich kann keine Dokumentation darüber finden, wie man den Computer nach der Datencodierung der Roh-Audiodatei fragt. Und ich weiß auch, wie hoch die Abtastrate ist, weil ich sie selbst eingestellt habe, aber so weit kann ich kommen.

ixtmixilix
quelle
2
Es gibt kein Standard-Rohformat. Sie müssen herausfinden, welche Parameter die Anwendung verwendet hat, die sie erstellt hat. Leider ist das nicht immer gut dokumentiert.
Gilles 'SO - hör auf böse zu sein'

Antworten:

8

Es kann variieren - aber zumindest für mich erzeugt text2wave 1-Kanal-16-Bit-Ganzzahl-PCM mit Vorzeichen. Diese sind ziemlich normal - und es wird sehr klar sein, wenn Sie sie richtig haben (z. B. wenn Sie versehentlich eine Ganzzahl ohne Vorzeichen haben, erhalten Sie einen extrem verzerrten Klang).

Mit dem Spiel sieht das so aus:

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

Ich vermute, diese Parameter sind irgendwo im Festival konfiguriert. Einige von ihnen sind möglicherweise auch fest codiert.

Die einzige architekturabhängige Sache, der Sie begegnen können, ist Big vs. Little Endian. auf meiner Little-Endian-Maschine schreibt Festival Little-Endian; Wenn ich diese Datei auf einen Big-Endian-Computer verschieben würde, müsste ich sie wahrscheinlich hinzufügen -L. Wenn text2waves auf einem Big-Endian-Computer ausgeführt würde, bin ich mir nicht sicher, ob es Big- oder Little-Endian-Daten schreiben würde.

derobert
quelle
Vielen Dank. Alle diese Antworten waren großartig, aber dies ist die Lösung, die ich letztendlich verwendet habe.
Ixtmixilix
2

Sie können wahrscheinlich Ihren eigenen RIFF-Header erstellen. Ein bisschen Bashing sollte es tun ... und einfach den Header auf deine anderen Teile setzen ...

Dieser Link zeigt das Header-Layout: Das Canonical WAVE-Dateiformat

Es gibt auch einen verwandten Link zu SO: Konvertieren von RAW-Audiodaten in WAV mit Skripten, aber die Antworten von mplayer / mencoder haben eine markierte Anzahl von Null. Es scheint jedoch, dass SoX funktioniert.

SoX wird in beiden oben genannten Links erwähnt und ist in Ubuntus Repo verfügbar. Ich nehme an, es ist auch in anderen.

PS ... Ich habe es gerade versucht play(wusste nicht, dass es existiert) und festgestellt, dass es SoX ist! ... Der SO-Link gibt ein Beispiel, das hier kopiert wurde:sox -r 44100 -e unsigned -b 8 -c 1 <RAW_FILE> <TARGET_FILE>

Wenn Sie es mit Sox nicht zum Laufen bringen können , wird es vielleicht von mplayer / mencoder oder dem RIFF-Header für Sie in Gang gebracht.

Peter.O
quelle
2

Verwenden Sie aplaystatt play, um eine Rohdatei abzuspielen. Auf diese Weise können Sie mit der Option -t festlegen, dass es sich um ein Roh-Audio handelt:

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