Jan 25
2007

Audio Dateien mit sox konvertieren

Eines der System welche ich geschäftlich betreue ist ein Call Center. Zur Zeit gibt es immer mehr Hotlines die mit diesem System arbeiten. Das hat zur Folge das wir auch immer mehr mit den Begrüssungs- und Ansagetexten der verschiedenen Hotlines zu tun haben. Über die Jahre gibt es mittlerweile an die tausend Textbausteine mit denen die Texte zusammen gestellt werden. Jede Gruppe hat verschiedene eigene Texte, welche natürlich auch in den drei grossen Landessprachen der Schweiz und in Englisch zu Verfügung stehen müssen.

Bislang wurden neue Texte beim Hersteller in einem Studio mit einer professionellen Sprecherin jedes Mal neu produziert. Dies ist natürlich kostenintensiv, macht uns aber auch von externen Schnittstellen abhängig und dauert zu dem länger. Also machte ich mir einige Gedanken wie ich diese Situation verbessern könnte.

Das erste Problem bestand darin das ich die Texte im vorhandenen Format nicht oder nur schwer abhören konnte. Wollte ich also wissen was für eine Ansage in einer Audiodatei war, war ich gezwungen diese einer Testgruppe zuzuweisen und sie dann per Telefon abhören. Pro Text dauert dies an die 2-5 Minuten. Wenn ich also hunderte von Texte in ein Inventar aufnehmen wollte, war das keine praktikable Lösung.

Also installierte ich mir erstmal Audacity und versuchte damit die Audiodateien zu öffnen. Leider stellte sich heraus dass das Format ein Rohdatenformat ohne jegliche Headerinformationen war. Nach einigen Recherchen und viel Knobeln fand ich nun zumindest das richtige Format. Es handelt sich um ein in der Telefon- und Vermittlungs Anlagen verbreitetes RAW Format. (MU-LAW, unsigned bit, 8000Hz, Mono)

Nun war ich in der Lage die Dateien in Audacity über den Rohdatenimport einzulesen, abzuhören und natürlich auch in andere Formate umzuwandeln. Eigentlich ein grosser Fortschritt da ich nun wenigstens die wichtigsten Texte in WAV oder MP3 Dateien umwandeln konnte und sie auf jedem Rechner mit den üblichen Mediaplayern abspielen konnte.

Für die grosse Anzahl der Dateien leider noch immer kein praktibler Weg. Auf der Suche nach einem brauchbaren Freeware oder OSS Programm, das auch für Windows zur Verfügung steht, suchte ich mir erfolglos die Finger wund. Leider bin ich gezwungen ein Lösung zu finden, die auch auf den Standard-Desktops meines Arbeitgebers, also auf Windows XP, funktioniert. Da die Zeit aber langsam knapp wurde, entschied ich mich zu meinem Kubuntu-Linux Laptop zu greifen und es damit anzugehen.

Nach einem Tipp aus dem IRC Kanal der LUG Schweiz wurde ich auf das Konsolenprogramm sox aufmerksam. Konsole war insofern schon mal sehr gut, da ich mittels eine Skript eine Konvertierung schnell und trotz meinem meinen rudimentären Konsolen-Kenntnissen programmieren konnte. Nach einigem Suchen im Internet, dem Lesen des englischen Handbuches und ein wenig Knobeln, hatte ich die benötigten Attribute zusammen.

Befehl mit Attributen die ich benötigte für die Konvertierung von RAW zu WAV:

sox -r 8000 -U -b -c 1 -t raw RAWDATEI WAVEDATEI.wav

Befehl mit Attributen die ich benötigte für die Konvertierung von WAV zu RAW:

sox -t wav WAVEDATEI -t .ul -U -s -b -c 1 -r 8000 RAWDATEI.raw

Da ich den Befehl aber nicht für hunderte von Dateien anpassen wollte, musste ich den Befehl nun mit einem Skript in eine Schleife packen. Ich erstelle also die Datei raw2wav und schrieb darin folgende Zeilen:

#!/bin/bash
for f in $* ;do
g=$f
sox -r 8000 -U -b -c 1 -t raw $f $g.wav
echo $f to $g converted
done
echo done

Die Datei muss natürlich noch ausführbar gemacht werden:

chmod +x raw2wav

Denn ich das Skript nun starte mit

./raw2wav *.raw

so werden sämtliche Dateien in diesem Ordner mit der Endung .raw konvertiert und als Kopie mit der Endung .wav abgespeichert.

Bei mir hatte ich zusätzlich das Problem, dass die Dateiendungen nicht .raw sind, sondern eine Bezeichnung welche kennzeichnet, zu welcher Callcenter Gruppe sie gehören. Natürlich kann das Skript mit entsprechend anderen Paramatern wie

./raw2wav .*

aufrufen, dann werden alle Dateien mit einem Punkt in Namen konvertiert. Das wirkliche Problem besteht aber darin, dass beim Speichern der Kopie ja die neuen Dateien alle die Endung .wav erhalten. Somit überschreibt das Skript jeweils die bereits erstellten Datein. Hier ein Beispiel:

  1. Begrüssungstext der Gruppe 1 (begr.001) wird als begr.wav gespeichert.
  2. Begrüssungstext der Gruppe 2 (begr.002) wird als begr.wav gespeichert, womit die WAV-Datei der Gruppe 1 überschrieben wird.

Also musste ich den Dateinamen beim Speichern insofern verändern, dass er einmalig und aussagekräftig ist. Ich suchte also nach einer Möglichkeit die Gruppennummer in den Dateinamen einfliessen zu lassen. Wie bereits erwähnt sind meine Skript-Kenntnisse nur grundlegend und mit Variablenmanipulationen mit regulären Ausdrücken bin ich eher schwach. Zum Glück gibt es im IRC Kanal der LUG Schweiz Leute die davon eine Menge Ahnung haben. Recherche im Internet und selbständiges Pröbeln war wegen Termindruck damals leider keine Option, obwohl es gut wäre wenn ich mich endlich etwas tiefer mit regulären Ausdrücken auseinander setzen würde.

Das Ziel war es den Dateinamen wie folgt zu manipulieren:

begr.001 > begr001.wav
begr.002 > begr002.wav

begr.00n > begr00n.wav

Erreicht habe ich das schluss endlich mit folgendem Befehl, welche den Befehl auf Zeile 3 des Skripts ersetzt:

g=`echo $f | sed „s,..,,g“`

Noch ein kleiner Tipp falls ihr mit den Attributen von sox spielen wollt, um die korrekten Einstellungen zu erhalten. Baut einfach am Ende der Schlaufe nach Zeile 6 einen Befehl ein welcher euch das konvertierte gleich abspielt. Alternativ kann man auch die Zeile 4 mit diesem Befehl ersetzen, dann wandelt man die Dateien nicht in WAV um sondern hört sie bloss ab.

sox -r 8000 -A -b -s -c 1 -t .ul $g.raw -t ossdsp /dev/dsp

Eigentlich sind wir hiermit schon am Ende. Da ich aber die Dateien nicht nur abhören wollte, sondern auch mit Audacity anpassen (z.B. Ansagen kürzen) wollte, musste ich mir auch ein Skript erstellen, dass den Vorgang wieder umkehrt. Also ein Skript das aus einer WAV-Datei wieder eine RAW-Datei mit denselben Eigenschaften erstellt. Mit Sox ist das natürlich kein Problem, man braucht lediglich die Attribute zu vertauschen. Hier das vollständige Skript welches ich analog zu raw2wav, wav2raw genannt habe:

#!/bin/bash
for f in $
* ;do
g=`echo $f | sed „s,..*,,g“`
sox -t wav $f -t .ul -U -s -b -c 1 -r 8000 $g.raw
echo $f converted
#sox -r 8000 -A -b -s -c 1 -t .ul $g.raw -t ossdsp /dev/dsp
done
echo done

Falls die konvertierte Datei nach dem Umwandeln gleich abgehört werden möchte, muss man einfach die Zeile 6 auskommentieren.

Nun ich hoffe dass es da draussen Jemand gibt dem meine Erläuterungen etwas bringen, ansonsten habe ich das wenigstens für mich dokumentiert und weiss wo ich nachsehen muss, falls ich es wieder einmal brauchen werde.

Hier noch zwei Links die eventuell von Nutzen sein können:

This entry was posted in GNU/Linux. Bookmark the permalink.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Unable to load the Are You a Human PlayThru™. Please contact the site owner to report the problem.