Der Sound-Exchanger SoX

Prof. Jürgen Plate

Der Sound-Exchanger SoX

Sicher nicht allen bekannt ist das Programm, das ich Ihnen hier vorstellen möchte. Dabei hat es Einiges zu bieten: Es liest, schreibt und konvertiert faktisch alle existierenden Audioformate, seien sie auch noch so exotisch. Außer der bloßen Konvertierung inklusive Anpassung der Sampling-Rate und Quadro-, Mono- oder Stereoumwandlung kann SoX den Dateien auch noch jeweils Effekte hinzurechnen.

In der Basisversion handelt es sich beim Sound-exchanger SoX, um ein reines Kommandozeilen-Utility, das vom Benutzer den exzessiven Einsatz von Kommandozeilenparametern fordert. Deshalb wird dieser Artikel nur ganz leicht an der Oberfläche kratzen. Er soll Ihnen einfach Appetit auf eigene Experimente machen.

SoX ist bei vielen Distributionen in den Paketlisten enthalten, wird aber nicht automatisch installiert. Bei Debian reicht das Kommando apt-get install sox, um das Tool auf die Platte zu bekommen. Das Programm kann bei Bedarf aber auch aus dem Quellcode selbst erstellt werden -- das ist beispielsweise dann nötig, wenn das Binary im Paket ohne MP3-Unterstützung kompiliert wurde. Da SoX auf der Kommandozeile arbeitet, ist es extrem flexibel im Skripten einsetzbar, aber manchmal auch unkomfortabel. Die allgemeine Syntax von SoX ist recht komplex, weshalb ich die Kommandozeile mehrfach umbrochen habe (Linux-Anfänger beachten bitte, dass hinter dem abschließenden "\" sofort das Zeilenende (Newline) kommen muss - keine Leerzeichen oder dergleichen). Der Backslash hebt die Sonderbedeutung das nachfolgenden Newline (Kommandoende) auf und erlaubt das Weitertippen in der folgenden Zeile).

sox <Allgemeine Optionen> \
    <Format-Optionen> <Eingabedatei(-Liste)> \
    <Format-Optionen> <Ausgabe-Datei> \
    [<Effekt>] [<Effekt-Optionen>] 
Die Formatoptionen für die Ein- bzw. Ausgabedatei müssen jeweils vor dem zugehörigen Dateinamen angegeben werden. Was auf den ersten Blick über-sophisticated erscheint, reduziert sich aber für die simple Aufgabe der Audiokonvertierung auf:
sox <Eingabedatei> <Ausgabedatei> 
Dabei erkennt SoX auch gleich noch das Format der Sound-Dateien an der Endung. Schlimmstenfalls muss man den Typ mit dem Schalter "-t" einstellen. So wandelt beispielsweise der Aufruf sox Musik.mp3 Musik.ogg von einer MP3- in eine OGG-Datei um. Wollen Sie die Eingabedatei rückwärts in die Ausgabe "abspielen", hängen Sie einfach "reverse" an.

Beigelegte Shell-Scripte wie play und record erleichtern unter Linux den Einstieg; zudem greifen viele grafische Programme auf SoX als Backend zurück, da die Programmierer nicht einsehen, warum sie das Rad noch einmal erfinden sollten. Außerdem ist SoX das "Schweizer Taschenmesser" unter den Sound-Bearbeitungsprogrammen. SoX beherrscht auch außergewöhnliche Datei-Formate, mit denen nur wenige Programme zurecht kommen, darunter Apple/SGI AIFF, Mac HCOM oder SoundBlaster VOC. Eine komplette Übersicht erhalten Sie mit dem Aufruf sox -h. Mit dem SoX-Format ".dat" für die Zieldatei werden die Audiodaten sogar als Gleitpunktzahlen in eine Textdatei geschrieben.

Die Homepage von SoX finden Sie unter sox.sourceforge.net. Dort befinden sich neben vielen Infos auch die Programmversionen für Linux, Windows und MacOS zum Herunterladen. Das Programm läuft problemlos unter Linux und anderen Unix-Systemen. Unter Umständen fehlen einige Sound-Formate. Die meisten von ihnen lassen sich durch die Installation von libsox-fmt-all nachträglich in SoX integrieren.

Für den Anfang will ich nur zwei kleine Beispiele geben. Mit der Option "-v" kann beispielsweise die Lautstärke geändert werden. Der Wert bei "-v" ist dabei ein Multiplikationsfaktor. Dabei handelt es sich um eine Eingabeoption, weil der Faktor auf die Eingabedatei angewendet wird, um daraus die Ausgabe zu erzeugen. Um also eine doppelt so laute Kopie zu erzeugen, geben Sie das Kommando:

sox -v 2.0 input.wav output.wav
Zusammen mit der Statistikfunktion kann man die Ausgabedatei auf maximale Lautstärke ohne Verzerrungen trimmen. Das Flag "-n" unterdrückt unerwünschte Ausgaben:
# Lautstarkemaximum ermitteln
VOL=$(sox input.wav -n stat -v 2>&1)
# Datei konvertieren
sox -v $VOL input.wav output.wav
Sie wollen eine Eingabedatei mit zwei Kanälen so auftrennen, dass jeder Kanal in einer separaten Datei gespeichert ist:
sox stereo.wav -c 1 links.wav mixer 1,0
sox stereo.wav -c 1 rechts.wav mixer 0,1
"-c 1" bedeutet "nur ein Kanal". Der "mixer" wird einmal angewiesen, den zweiten Kanal zu unterdrücken und den ersten Kanal beizubehalten (1,0) und dann umgekehrt (0,1). Wollen Sie aus eine Mono-Aufnahme zwei Stereo-Kanäle machen, geht das ebenso leicht:
sox mono.wav -c 2 stereo.wav

Fast so einfach sind Ausschnitte von Dateien anzufertigen. Um eine 10 Sekunden lange Musiksequenz mit Einblenden (fade-in) und Ausblenden (fade-out) zu erstellen, kann man folgendermaßen vorgehen:

sox musik.wav out.wav fade 0:0.5 0:10 0:0.5 
Das Fading dauert jeweils 0,5 Sekunden (Format: "hh:mm:ss.frac", hier: "0:0.5" für 0,5 s). Der Aufruf speichert die ersten 10 Sekunden der Melodie mit Ein- und Ausblendung in out.wav. Will man nicht einblenden, aber ausblenden, setzt man 0 für den ersten Wert ein.

Wenn Sie aber ein Musikstück von beispielsweise 12 Minuten Länge haben, aber gerne die bei 4 m 15 s beginnende Passage verwenden möchten, zerstückeln Sie zunächst die Ausgabedatei. Sie schneiden aus musik.wav ab 4:15 die darauf folgenden 30 Sekunden heraus und wenden darauf dann den obigen Befehl an:

sox musik.wav klein.wav trim 4:15 30
sox klein.wav out.wav fade 0:0.5 0:10 0:0.5 
Mit den Fading-Effekten lassen sich beispielsweise aus längeren Musikstücken ein passendes "Häppchen" als Mobile-Klingelton oder für andere Zwecke heraus schneiden.

SoX eignet sich auch vorzüglich in Kombination mit anderen Programmen, da die Sond-Daten auch über Standardeingabe und Standardausgabe laufen können. Ein typisches Beispiel wäre der Einsatz des MP3-Players mpg123 zusammen mit SoX, um MP3-Dateien ins .wav-Format zu kopieren:

mpg123 -b 10000 -s datei.mp3 |\
 sox -t raw -r 44100 -s -w -c 2 - datei.wav
Sehr beliebt sind Echo-Effekte, die beispielsweise einer trocken klingenden Aufzeichnung etwas "Raum" vermitteln. Auch zarte Stimmchen von an sich unbegabten Interpreten lassen sich so aufhübschen. Dazu einige Beispiele mit dem SoX-Player gleich zum Anhören:
# Scheinbare Verdoppelung der Instrumente, 
# vollerer Sound
play file.xxx echo 0.8 0.88 60.0 0.4
# Sehr kurzes Echo ergibt einen metallischen, 
# maschinellen Klang
play file.xxx echo 0.8 0.88 6.0 0.4
# Ein laengeres Echo macht ein Kammerorchester
# zum Open-Air-Erlebnis
play file.xxx echo 0.8 0.9 1000.0 0.3
Die vier Parameter geben die Input- und Echo-Lautstärke sowie die Verzägerungs- und Abklingzeit [ms] an.

Der Compander-Effekt ermöglicht Kompression oder Expansion des Dynamikbereichs des Signals. Für die meisten Situationen sollte die Attack-Zeit (wenn die Lautstärke schnell ansteigt) kürzer sein als die Abklingzeit, weil unsere Ohren empfindlicher auf plötzliche Lautstärke reagieren als auf plötzlich leiser werdene Musik. Bei Situationen, wo die lauten Stellen eines Musikstücks zu laut, die leisen Stellen aber zu leise sind (etwa wegen Umgebungsgeräuschen), kann man den Dynamikumfang eingrenzen. Oder man macht die Datei insgesamt leiser oder lauter. Das folgende Kommando normalisiert die Eingabedatei um 10 Dezibel:

sox --norm=-10 input.wav output.wav
Man kann eine Aufnahme mit SoX resamplen, z. B. für eine Wideband-Samplingrate von 16 kHz:
sox datei.wav -r 16000 datei-wide.wav resample

Mit "stretch" und "speed" kann man das Abspielen beschleunigen oder bremsen (der Minutenwalzer darf ruhig zwei Minuten dauern). Weitere Filter heissen "Chorus", "Flanger", "Phaser" und "Reverb". Dan gibt es noch "Copy", "Rate" "Stat", "Avg", "Vibro", "Band" und vieles mehr. Alleine die Manpage und die Dokumentation bieten genügend Lesestoff für lange Winterabende.

Bei der Installation von SoX wird das Tool soxmix (wie auch play) automatisch mit installiert. Dieses Programm führt mehrere Dateien zu einer Datei zusammen, wobei die Audiodaten \textit{übereinander gelegt werden. Damit kann man dann z. B. die Gesangsstimme über die Hintergrundmusik mischen oder besondere Geräuscheffekte erzielen, denn alle Effekte von SoX können auch hier angewendet werden:

soxmix <Datei1> <Datei2> ... <Ausgabedatei> 
Bei neueren Versionen ist diese Funktion in SoX integriert (sox -m ...).


SoX, Perl und Bash

Koppelt man SoX mit einer Skriptsprache wie z. B. Perl, kann man aufwendigere Dinge anstellen. Zudem macht das Skript drumrum die Bedienung leichter, fehlerfreier und erspart jedesmal das Nachschlagen von zahllosen Optionen. Das erste Beispiel demonstriert die Vorgehensweise aber mit der ganz normalen Shell. Übrigens liefert der Aufruf

sox sounddatei -n stat stats
alle erdenklichen Informationen über die Sounddatei, wie das folgende Listing zeigt. Man kann diese Infos verwenden, um Sounds automatisch an bestimmte Gegebenheiten anzupassen So könnten man beispielsweise durch Auswerten der maximalen Amplitude mehrere Dateien per Skript auf etwa gleiche Lautstärke bringen.

Neben der Konvertierung und dem Abspielen von Sounddateien beherrscht SoX auch das Synthetisieren von akustischen Signalen. Weil es so schön ist, nehme ich das nervigste Jingle der Fernsehwerbung als Beispiel und erzeuge daraus eine .wav-Datei. Aber schön nacheinander: zuerst werden die Sinustöne im Raw-Format gespeichert (-t raw). Das ist praktisch, weil sich die töne einfach in der Datei aneinander hängen lassen.

Mittels synth xxx sine yyy kann SoX ein Sinussignal von xxx Sekunden Dauer mit der Frequenz yyy erzeugen. gaun legt die Lautstärke fest. Die wegen der Spaltenbreite im Listing umbrochenen Kommandozeilen können Sie natürlich einzeilig schreiben.

#!/bin/bash

# Pfad zum Programm sox
my $SOX = '/usr/local/bin/sox';

# die fuenf Toene des Grauens erzeugen und 
# nacheinander in eine raw-Datei schreiben
$SOX -U -r 8000 -n -t raw - synth 0.2 \
  sine 1244 gain -3 > t.ul
$SOX -U -r 8000 -n -t raw - synth 0.2 \
  sine 1244 gain -3 >> t.ul
$SOX -U -r 8000 -n -t raw - synth 0.2 \
  sine 1244 gain -3 >> t.ul
$SOX -U -r 8000 -n -t raw - synth 0.2 \
  sine 1760 gain -3 >> t.ul
$SOX -U -r 8000 -n -t raw - synth 0.2 \
  sine 1244 gain -3 >> t.ul

# Raw-Sound in eine .wav-Datei konvertieren
$SOX -c 1 -r 8000 t.ul jingle.wav
# Raw-Datei entsorgen
rm t.ul
# das Ergebnis gleich mal abspielen
$SOX jingle.wav -d
Wie Sie bemerkt haben, kann SoX das Erzeugnis auch gleich ausgeben. Das nachgestellte "-d" sorgt für die Ausgabe auf dem Standard-Sounddevice. Das "synth"-Format hat drei Parameter: Zuerst die Länge des gewünschten Sounds (hh:mm:ss.frac), dann der Typ (sine, square, triangle, sawtooth, trapezium, exp, [white]noise, pinknoise, brownnoise). Als drittes folgt die Frequenzangabe in Hz. Bei der Frequenzangabe kann auch ein Bereich aus Anfangs- und Endefrequenz angeben werden (z. B. 300-8000). SoX erzeugt dann ein Sweep.

Das folgende Perl-Programm zeigt, wie Sie mit etwas Rechnerei über das Synthetisieren einzelner Sinustöne hinausgehen können. Es erzeugt für Messzwecke eine .wav-Datei mit verschiedenenen Formen von Rauschsignalen (sogenanntes weißes Rauschen). Es werden zunächst bis zu 32 Dateien mit Rauschsignalen erzeugt, bei denen Dauer, Mittenfrequenz und Bandbreite innerhalb vorgegebenen Grenzen zufällig sind. Per Kommandozeile lassen sich die Anzahl der Dateien und jeweils die Ober- und Untergrenzen von Dauer, Mittenfrequenz und Bandbreite wählen. Auf SoX wird per system()-Aufruf zugegriffen.

use strict;
use warnings;

my $SOX = '/usr/local/bin/sox';

# Temporaerverzeichnis angeben
my $tmp_dir = '/tmp/noise';

# Verzeichnis ggf. anlegen
mkdir($tmp_dir) if(! -e $tmp_dir);

# Dateinamen von der Kommandozeile holen
my $outfile = shift;
unless (defined $outfile)
  {
  print "Keine Ausgabedatei angegeben\n";
  usage();
  }

# Defaultwerte einstellen
# Anzahl Dateien (max. 32)
my $segs = shift || 32; 
# Mindestdauer
my $min_dur = shift || 0.25;
# Maximaldauer
my $max_dur = shift || 1.0;
# Mittenfrequenz Untergrenze
my $min_center = shift || 500;
# Mittenfrequenz Obergrenze
my $max_center = shift || 8000;
# Bandbreite Untergrenze
my $min_bw = shift || 100;
# Bandbreite Obergrenze
my $max_bw = shift || 1000;

# Hilfe ausgeben, falls gewuenscht
usage() if($ARGV[0] =~ /-[h?]/);

# Speicher für die Namen der erzeugten Dateien
my $filelist = '';

# Sound- Segmente erzeugen
for my $i (1..$segs)
  {
  # Zufallswerte erzeugen
  my $dur = rand($max_dur) + $min_dur;
  my $center = int(rand($max_center 
             - $min_center)) + $min_center;
  my $bw = int(rand($max_bw - $min_bw)) 
         + $min_bw;
  # Dateinamen erzeugen ...
  my $segfile = "$tmp_dir/temp$i.wav";
  # ... und in der Liste speichern
  $filelist .= "$segfile ";

  # Sounddatei generieren
  my $params = " -n " . $segfile 
               . " synth " . $dur 
               . " noise bandpass "
               . $center . " " .$bw; 
  system("$SOX $params");
  }

# Alle Segmente zusammenmixen
system("$SOX -m $filelist $outfile");

sub usage
  {
   print "Usage: $0 <outfile> <segs (<=32)> " .
         "<min dur> <max dur> <min cent> " .
         "<max cent> <min bw> <max bw>\n"; 
  exit;
  }
Wenn Ihnen das Rauschen beim Anhören nicht so attraktiv erscheint, gefällt Ihnen vielleicht folgendes Programm, das sich nicht nur für den ursprünglich vorgesehenen Zweck eigent, sondern auch zum Aufwecken der Teilnehmer einer Power-Point-Präsentation (nicht umsonst haben "Power-Point" und "Power-Nap" den gleichen Wortanfang). Diesal wieder als Shell-Skript.


Odysseus und die Sirenen (Vasenbild, ca. 475-450 v. Chr.) (Quelle: Wikimedia Commons).

Beim Seefunk wird einem Notruf eine 30 Sekunden dauernde Alarmsequenz vorangestellt, damit die nachfolgende Meldung auch die nötige Aufmerksamkeit erlangt -- wie schon die Sirenentöne bei Odysseus in Bild \ref{plate-sound-vase. Die neuzeitliche Alarmsequenz besteht aus zwei Tönen von 1300 und 2100 Hz, die sich mit einer Rate von 4 Hz abwechseln. Das folgende Programm erzeugt eine .wav-Datei mit dieser Alarmsequenz. Die Töne werden mit einer Rate von 8 kHz in zwei temporäre Dateien im Raw-Format generiert. Sie dauern jeweils 0,25 Sekunden, was der Wechselfrequenz von 4 Hz entspricht. Diese Töne werden nun insgesamt 60 mal hintereinander in eine weitere Datei kopiert. Da die beiden Töne hintereinander eine halbe Sekunde dauern, ergibt sich so eine Gesamtdauer von 30 Sekunden. Das funktioniert einwandfrei, da die Dateien nur Sound-Samples und keinerlei Verwaltungsinfo enthalten. Zum Schluss generiert das Programm dann eine .wav-Datei aus diesen Daten.

#!/bin/bash
$SOX = '/usr/local/bin/sox';

# die beiden Toene erzeugen
$SOX -U -r 8000 -n -t raw - synth 0.25 \
  sine 1300 gain -3 > t.ul
$SOX -U -r 8000 -n -t raw - synth 0.25 \
  sine 2100 gain -3 >> t.ul

# Datei t.ul 60 mal auf alert.ul kopieren
for i in $(seq 1 60)
  do
  cat t.ul >> alert.ul
  done

# Raw-Sound als .wav-Datei speichern
$SOX -c 1 -r 8000 alert.ul alert.wav
# Raw-Dateien entsorgen
rm t.ul alert.ul

Oder Sie scheren sich gar nicht darum, was für ein Sound entsteht. Dann versuchen Sie doch mal aus Dateien, die überhaupt nicht audiophil sind, Musik herauszuholen. Sie müssen den SoX nur etwas anlügen und behaupten, es kämen Raw-Daten (-t raw):

cat /dev/urandom |\
 sox -s -b -t raw -r 44100 - ausgabe.ogg

ls -lR / |\
 sox -s -b -t raw -r 44100 - ausgabe.ogg

cat masterarbeit.tex |\
 sox -s -b -t raw -r 44100 - ausgabe.ogg
Dass aber jetzt niemand auf die Idee kommt, den Output von Tcpdump zu Musik zu machen, oder alle bisher bekannten Stellen von Pi in den SoX einzufüttern.

Eines Tages hatte ich die Notwendigkeit, fünf Sekunden Stille als Sounddatei zu erzeugen. Das Programm dazu will ich Ihnen nicht vorenthalten -- für den Hausgebrauch quick and dirty geschrieben:

#!/usr/bin/perl
my $seconds = $ARGV[0];
my $file = $ARGV[1];
my ($i, $samples, $cmd);

if ((!$seconds) || ($file eq ""))
  { die "silence secs filename.wav\n"; }

# raw-Datei erzeugen
open(OUT, ">", "/tmp/$$.dat");
print OUT "; SampleRate 8000\n";
$samples = $seconds * 8000;
for ($i = 0; ($i < $samples); $i++)
  { print OUT $i / 8000, "\t0\n"; }
close(OUT);

$cmd = "sox /tmp/$$.dat -b 16 -r44100 -c2 -s $file";
system($cmd);
unlink("/tmp/$$.dat");

Die im SoX-Paket enthaltenen Programme play zum Abspielen und rec zum Aufnehmen sind im Grunde nur sox-Aufrufe mit dem Sounddevice als Eingabe- oder Ausgabedatei. Die beiden folgenden Kommandos zum Aufnehmen von Sounds über den Mikrofoneingang sind gleichwertig:

$ sox -t ossdsp /dev/dsp test.wav

$ rec -r 8000 -c 1 record_voice.wav 

Das folgende SoX-Beispiel ist ein Skript, das in der Datei /etc/crontab alle Viertelstunden gestartet wird. es soll mangels Regulator oder nahe gelegenem Kirchturm den Stunden- und Viertelstundenschlag liefern. Da der im oben erwähnten Shell-Shuffle-Artikel erwähnte Sound-Server allzeit bereit ist, kein Problem. SoX dient wieder als Abspielprogramm. Es gibt dabei eine kleine Neuerung gegenüber den anderen Beispielen: Diesmal werden die Kommandozeilenoptionen für SoX in einer Shell-Variablen gespeichert, was nicht nur die Kommandos kürzer macht, sondern auch Änderungen erleichtet.

Zuerst werden aktuelle Minute und Stunde ermittelt. Weil das date-Kommando führende Nullen liefert, wird der Zahlenstring durch Addieren von 0 zu einer ganzen Zahl normiert. Dann wird entsprechend der Stunden- oder Minutenzahl gebimmelt.

#!/bin/bash
# die Sounddateien fuer Stunden 
# und Viertelstunden
BELL1=/usr/local/big-bell.wav
BELL2=/usr/local/small-bell.wav

# das Abspielprogramm mit Optionen
PLAY=/usr/bin/play
export SOX_OPTS="-v0.5 -V0"

# Stunde und Minute ermitteln und
# auf Ganzzahl normieren
MINUTE=$(expr $(date "+%M") + 0)
HOUR=$(expr $(date "+%I") + 0)

# Stundenschläge zusammenbauen
if [ $MINUTE -eq 0 ]; then
  # 4 x Viertelstundenschlag
  BELLS="$BELL2 $BELL2 $BELL2 $BELL2"
  # $HOUR x Stundenschlag
  while [ $HOUR != 0 ]
    do
    BELLS="$BELLS $BELL1"
    HOUR=$(expr $HOUR - 1)
    done
  $PLAY $BELLS

# Viertelstundenschlaege
elif [ $MINUTE -eq 15 ]
  then  $PLAY $BELL2
elif [ $MINUTE -eq 30 ]
  then  $PLAY $BELL2 $BELL2
elif [ $MINUTE -eq 45 ]
  then  $PLAY $BELL2 $BELL2 $BELL2
fi

Quasselstrippe

SoX alleine ist schon ein steter Quell der Freude. Richtig lustig wird es aber, wenn der Computer vor sich hin quasseln kann, wie z. B. der "hitchBOT", der per Anhalter quer durch Kanada fuhr und sich mit den Mitreisenden unterhalten konnte. azu brauchen Sie das Paket "Festival" mit den Programm text2wave von der University of Edinburgh. Aus das Paket ist bei vielen Linux-Distributionen über die Paketverwaltung abrufbar. Derzeit wird Englisch und Spanisch unterstützt, es lassen sich aber weitere Sprachen integrieren.

Das Festival Speech Synthesis System kennt, wie gesagt, den Befehl text2wave, der, wie Sie zu Recht vermuten, eine Textdatei in eine .wav-Datei "vorlesen" kann. Dazu ein Beispiel:

text2wave /etc/motd -o /tmp/motd.wav
Dieses Kommando liest die Datei /etc/motd (Message of the Day) und wandelt den Text per Phonemsynthese in das WAV-Format um und legt die generierte Sounddatei als /tmp/motd.wav ab. Spielen wir nun diese Datei mit dem SoX-Player ab, liest der Computerbrav den Inhalt der Datei vor. Das Ganze klingt wegen der Phonemsynthese etwas blechern und roboterhaft. Der Vorteil des Verfahrens liegt darin, dass sich aus ca. drei Duzend Phonemen (Lauten) alle denkbaren Wörter zusammensetzen lassen. Beim Quelltext kann man zur Verbesserung der Verständlichkeit gegebenenfalls etwas mogeln und beispielsweise "Kompjuta" statt "Computer" schreiben. Auch bei Worten mit "ü" hat er etwas Probleme. Versuchen Sie hier "u" oder "i".

Das Programm hat per Default eine männliche englischsprachige Stimme. Eine deutsche Stimme gibt es noch nicht, aber mit der oben angedeuteten Mogelei kann man pseudo-englische Texte erzeugen, die dann recht deutsch klingen (halt mit starkem Akzent). Längere Textdateien benötigen auch eine gewisse Zeit zum Konvertieren. Man sollte da Standardtexte vorher erzeugen und durch aktuelle Einschübe ergänzen.

Mit einem kleinen Skript lassen sich Erzeugung und Ausgabe variabler Texte vereinfachen. Alles, was auf der Kommandozeile steht, wird in eine .wav-Datei "vorgelesen" und dann als Sound ausgegeben. Neben wav beherrscht das Programm noch etliche andere Formate (alaw, ulaw, snd, aiff, riff, nist etc.), die sich per "-otype" festlegen lassen. Die Shellvariable $$ (Prozess-Id) sorgt hoffentlich für einen halbwegs eindeutigen Dateinamen.

#!/bin/bash
# Temoraerer Dateiname
WAV=/tmp/talk.$$.wav

# Kommandozeile in die Textdatei schreiben
echo $@ | text2wave -o $WAV
# und abspielen
play -q $WAV
Das Programm hat übrigens auch APIs für C, C++ und Java.

Links



"These are bagpipes. I understand the inventor of the bagpipes was
inspired when he saw a man carrying an indignant, asthmatic pig
under his arm. Unfortunately, the man-made sound never equalled
the purity of the sound achieved by the pig."

-- Alfred Hitchcock


Copyright © Hochschule München, FK 04, Prof. Jürgen Plate
Letzte Aktualisierung: