Qu'est-ce que et comment est l'encodage d'un fichier audio brut (sans en-tête)?

8

Je l'ai fait:

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

qui a produit un fichier audio sans en-tête. La chose merveilleuse à propos de ce fichier est qu'il peut être concaténé (en utilisant cat, comme du texte) avec un autre fichier audio brut.

Bien sûr, j'ai un problème. Le problème est que je ne peux pas encore y jouer.

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

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

et aussi, lors de la spécification de la fréquence d'échantillonnage

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

Lorsque j'ai recherché des informations sur l'encodage, j'ai eu l'impression que cela avait beaucoup à voir avec l'architecture de votre processeur, mais je me trompe peut-être. Quoi qu'il en soit, je ne trouve aucune documentation sur la façon de «demander» à l'ordinateur quel est l'encodage des données du fichier audio brut. Et je sais aussi quel est le taux d'échantillonnage, en raison du réglage moi-même, mais c'est aussi loin que je peux obtenir.

ixtmixilix
la source
2
Il n'y a pas de format brut standard. Vous devez connaître les paramètres utilisés par l'application qui les a produits. Malheureusement, ce n'est pas toujours bien documenté.
Gilles 'SO- arrête d'être méchant'

Réponses:

8

Cela peut varier, mais au moins pour moi, text2wave produit un PCM entier signé à 1 canal, 16 bits. Ce sont assez normaux - et ce sera très clair lorsque vous les aurez correctement (par exemple, si vous ne signez pas un entier par erreur, vous obtiendrez un son extrêmement déformé)

Avec le jeu, cela ressemble à:

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

Je suppose que ces paramètres sont configurés dans Festival quelque part. Certains d'entre eux peuvent également être codés en dur.

La seule chose dépendante de l'architecture que vous pouvez rencontrer est gros vs petit endian; sur ma machine Little Endian, le Festival écrit Little Endian; si je déplaçais ce fichier vers une machine big-endian, j'aurais probablement besoin d'ajouter -L. Si elles text2wavétaient exécutées sur une machine big-endian, je ne sais pas si elle écrirait des données big-end ou little-endian.

derobert
la source
Merci. toutes ces réponses étaient excellentes, mais c'est la solution que j'ai finalement utilisée.
ixtmixilix
2

Vous pouvez probablement créer votre propre en-tête RIFF. Un peu de dénigrement devrait le faire .. et cat juste l'en-tête à votre autre pièce (s) ...

Ce lien montre la disposition de l'en-tête: le format de fichier Canonical WAVE

Il existe également un lien connexe sur SO: Conversion des données audio RAW en WAV avec des scripts , mais les réponses mplayer / mencoder ont un nombre de marqueurs nul. Cependant, il semble que SoX fonctionne.

SoX obtient une mention dans les deux liens ci-dessus et est disponible dans le référentiel d'Ubuntu; Je suppose que c'est aussi dans d'autres.

PS ... J'ai juste essayé d'utiliser play(je ne savais pas qu'il existait) et j'ai découvert que c'était SoX! ... Le lien SO donne un exemple, copié ici:sox -r 44100 -e unsigned -b 8 -c 1 <RAW_FILE> <TARGET_FILE>

Si vous ne pouvez pas le faire fonctionner avec sox , peut-être que mplayer / mencoder ou l'en-tête RIFF le feront fonctionner pour vous.

Peter.O
la source
2

Utilisez aplayau lieu de playpour lire un fichier brut, de cette façon, vous pouvez spécifier qu'il s'agit d'un audio brut par le commutateur -t:

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