Hi,
ich habe das Script mal umgeschrieben:
PHP:
#! /usr/bin/env python
# -*- coding: utf-8 -*-
import wave
import logging
HINZTRILLER = r"Hinztriller.wav"
TRAFFIC_NEWS = r"verkehrsansage_balabolka.wav"
OUTPUT = r"stau.wav"
LOG = "log.txt" # Logausgabe
LOG_LEVEL = logging.INFO # logging.CRITICAL
LOG_FORMAT = "%(asctime)s %(levelname)s: %(filename)s %(lineno)d: %(message)s"
DATE_FORMAT = "%d.%m.%Y %H:%M:%S"
logging.basicConfig(filename=LOG, format=LOG_FORMAT, datefmt=DATE_FORMAT,
level = LOG_LEVEL)
def wave_read(name):
try:
logging.info("Oeffne %s" % name)
inp_wave = wave.open(name, 'rb')
logging.info("Lese Waveheader von <%s>" % name)
params = inp_wave.getparams()
logging.info("Eingelesene Daten: <%s>" % str(params))
frame_number = inp_wave.getnframes()
logging.info("Anzahl der Frames laut Header: %d" % frame_number)
frames = inp_wave.readframes(frame_number)
return params, frames
except (IOError, wave.Error) as err:
logging.critical("Fehler beim Einlesen von <%s>\n" % name + str(err))
finally:
try:
inp_wave.close()
except IOError as err:
logging.critical("Fehler beim Schliessen von <%s>\n" % name + str(err))
except (NameError, UnboundLocalError):
pass
def main():
try:
traffic_header, traffic_frames = wave_read(TRAFFIC_NEWS)
whistle_header, whistle_frames = wave_read(HINZTRILLER)
# header = tuple (nchannels, sampwidth, framerate,
# nframes, comptype, compname)
# compare: nchannels, sample width, framerate, compression
NAMES = ("number of channels", "sample width", "framerate", "compression")
for i,name in zip([0, 1, 2, 4, 5], NAMES) :
if traffic_header[i] != whistle_header[i]:
logging.warning("Unterschiedliche Werte für %s!\n"
"<%s>:%s | <%s>:%s" % (name, TRAFFIC_NEWS,
traffic_header[i], HINZTRILLER, whistle_header[i]))
if None in (traffic_header, traffic_frames,
whistle_header, whistle_frames):
logging.critical("Nicht alle noetigen Daten wurden eingelesen!")
return
logging.info("Erstelle Ausgabedatei <%s>" % OUTPUT)
out_wav = wave.open(OUTPUT, 'wb')
logging.info("Schreibe Headerdaten in <%s>" % OUTPUT)
out_wav.setparams(traffic_header)
logging.info("Schreibe Audioframes von <%s> in <%s>" % (HINZTRILLER, OUTPUT))
out_wav.writeframes(whistle_frames)
logging.info("Schreibe Audioframes von <%s> in <%s>" % (TRAFFIC_NEWS, OUTPUT))
out_wav.writeframes(traffic_frames)
except Exception as err:
logging.critical("Fehler beim Verbinden der <%s> und <%s>" %
(TRAFFIC_NEWS, HINZTRILLER) + str(err))
finally:
try:
out_wav.close()
except NameError:
pass
except Exception as err:
logging.critical("Fehler beim Schliessen der <%s>" % OUTPUT + str(err))
main()
Das dürfte jetzt eine deutlich detailliertere und lesbare Fehlerausgabe in der Datei "log.txt" produzieren - mit Einzelschritten, was nun wo gemacht wird.
ich habe das mit der Balabolka.wav auch nicht so richtig verstanden daher das umbenennen in Verkehrsansage wav.
Ich meinte nur die Ausgabedatei von Balabolka:
Zum Testen habe ich nämlich einfach die WAV Datei von
http://eichenwetter.homelinux.net/linuxhd/Stau/Stau.wav genommen.
Deswegen bin ich auch ausgegangen, dass Balabolka als Ausgabe die "Stau.wav" produziert.
Also: Du brauchst einmal die Ausgabedatei von Balabolka: "Stau.wav" (?)
Das ist im Script als
TRAFFIC_NEWS = r"verkehrsansage_balabolka.wav"
eingestellt, darf natürlich auch geändert werden.
------------
Der Wert kann (und muss eigentlich, falls das Script und die Wavedateien in unterschiedlichen Orndern liegen) ein Pfad zu der WAV-Datei sein:
Absoluter Pfad (also mit Laufwerk und dem gesamten Ordnerpfad)
TRAFFIC_NEWS = r"C:\XYZordner\linuxhd\Stau\stau.wav"
oder ein relativer Pfad:
z.B wenn das Script in "C:\...<viele Ornder>...\linuxhd\python\pywave.py" Unterordner ist und die Wavedateien in "C:\<..viele Ordner>..\linxhd\Stau\stau.wav" :
TRAFFIC_NEWS = r"../Stau/stau.wav"
Dabei sagt "../" in Pfadangaben (egal ob windows, linux usw, es ist übergreifend):
"nehme den aktuellen Ordner als "Anker" und gehe einen Ebene höher"
z.B wenn das Script nun in "C:\<vieleOrdner>\linuxhd\python\waveproducer\" liegt und die Wavedateien in "C:\<vieleOrdner>\linuxhd\Stau\":
TRAFFIC_NEWS = r"../../Stau/stau.wav"
"nehme den aktuellen Ordner als "Anker" und gehe zwei Ebenen höher"
----------
Die normalisierte "Hinztrliller.wav" (aus dem letzten Posting, sonst wie gesagt, wird das verzerrt abgespielt).
HINZTRILLER = r"Hinztriller.wav"
oder absolut: r"C:\linuxhd\Stau\Hinztriller.wav"
oder relativ: r"../Stau/Hinztriller.wav"
Und eine Ausgabe:
OUTPUT = r"stau.wav"
Absolut: r"C:\linuxhd\Stau\stau.wav"
relativ: r"../Stau/stau.wav"
In dieser Version des Scripts kann man auch direkt die "stau.wav" als Ein und Ausgabe nehmen. Das Script kann allerdings nicht unterscheiden, ob ein Hinztriller schon hinzugefügt wurde (also läuft man der Gefahr, dass es doppelt und dreifach hinzugefügt wird, sofern das Script mehrfach aufgerufen wird) - deswegen wäre es vielleicht besser, Balabolka die Ausgabe unter einem anderen Namen produzieren zu lassen (z.B "stau_meldungen.wav") und das Script dann "Hinztriller.wav" und "stau_meldungen.wav" zu einer "stau.wav" verbinden zu lassen.
Wie sollman das denn über Funk realisieren, die Gatewaynutzer rufen per DTMF mit der Eingabe BAB* die Staumeldungen ab,
k.A

. Ich dachte nur, dass man in der verwendeten Software einstellen kann, dass mehrere Dateien nacheinander abgespielt werden.
PS: bei Fehlern einfach dann die "log.txt" posten.