[ERLEDIGT] Dateien abarbeiten und Dateiname als VARIABLE in Asterisk

HobbyStern

Aktives Mitglied
Mitglied seit
5 Dez 2005
Beiträge
1,844
Punkte für Reaktionen
0
Punkte
36
Hallo Gemeinde,

ich kam nunmehr bereits zum zweiten Mal in die Not einen haufen von Sprachdateien abzuarbeiten (auszusprechen) und dann die Eingabe des Anrufers entsprechend abzuspeichern - bei meinem letzten Einsatz vor ca. 2 Jahren habe ich das ganze nachher auf eine fixierte Zahlenreihe festgelegt (1,2,3,..)

Dieses mal wird das nicht funktionieren.

Problemstellung :

Ich habe Sprachdateien (BEISPIEL) :

2.wav
876.wav
2467.wav

Diese muss ich (ohne zu wissen wie sie heissen) aus Asterisk abspielen - ich benötige jedoch noch den Dateinamen als VARIABLE (ich schneide nachher die Endung schlichtweg ab)

Hat jemand eine gute Idee wie ich das realisieren kann ohne auf AGI zugreifen zu müssen?

Eine Möglichkeit könnte sein :

Per SYSTEM Befehl ein SH Skript zu starten, dieses greift sich die nächste Datei , benennt sie in ABSPIEL.WAV um und gibt Asterisk eine Variable zBsp. ${NR} = 12345. Das ganze wird abgespielt und die Eingabe übernommen, dann wieder von vorne.

Es gibt aber sicherlich noch bessere Wege (sauberere) :)

Würd mich freuen von Euch zu hören!
 
Zuletzt bearbeitet:
Hallo Stefan,

ich hoffe ich hab das richtig verstanden was Du willst: Du hast ein Verzeichnis in dem Soundfiles liegen und möchtest nach einem bestimmten Muster das erste davon abspielen.

Ab 1.6 gibts dafür Shell(), bei 1.4 könntest Du app_backstick installieren und dann so etwas machen:
exten => s,1,Set(filename=${BACKTICKS(ls *.wav | head -n 1)})

Svenja
 
Hi Svenja,

treue Antworterin bei schwierigen Dingen :) [DankSag]

Du siehst es schon recht richtig - allerdings muss jedes Soundfile abgespielt werden, nach jedem einmal auf Digits gewartet werden (Mini IVR) und danach das Nächste abgespielt werden.

Nebenbei muss beim Abspielen noch der Name des Soundfiles rausspringen können, als Beispiel :

1234.wav
-> abspielen und "1234" als VAR an Asterisk übergeben

Die Funktion SHELL beobachte ich schon etwas länger (freu mich schon drauf) - möchte aber ungerne 1.6 einspielen...Backticks kannte ich seltsamerweise noch gar nicht

:verdaech:

Das hört sich aber mehr als deutlich nach dem Ende meiner Suche an (!)

Vielen Dank, Forenengel ! :D
 
:schleime: aber trotzdem danke für die netten Worte.

Wenn das eine Schleife werden soll, könntest Du die bereits abgespielten Dateien sammeln und ausschließen.

Code:
exten => s,1(losgehts),Set(filename=${BACKTICKS(ls *.wav | grep -v "(${bereitsabgespielt:1}).wav$" | head -n 1)})
exten => s,n,Set(bereitsabgespielt=${bereitsabgespielt}|${filename})
exten => s,n,Read(eingabe,$filename)
exten => s,n,WasAuchImmerAnstellenMit(${filename} und ${eingabe})
exten => s,n,GotoIf($["${filename"!=""}]?losgehts)
exten => s,n(fertig),HangUp

Wahrscheinlich musst Du in der zweiten Zeile die Pipe escapen oder so, damit Asterisk die wirklich in den String aufnimmt.

Oder Du zählst mit, wie viel Dateien Du schon hast und machst
ls *.wav | head -n ${sovielhattenwirschon} | tail -n 1

Warum willst Du eigentlich kein AGI machen? Das wäre ein glob und ein foreach (oder while) und fertig. Gibt's da echt nix vergleichbares in Asterisk :gruebel:

Svenja
 
AGI ?
:alt:

Ich habe bisher alles ohne AGI machen können - AGI wäre nun eine Neue Lektion "mal eben so"...

Bin doch ... (s.o.) :)
 
Nochmals von Vorne..

Hallo Svenja, Hallo Forum :)

ich greife das ganze nochmals auf, nachdem ich nun alle anderen Abhängigkeiten erzeugt bzw. erstellt habe bin ich nun am eigentlichen Herz der Angelegenheit.

=> Asterisk soll bei Anruf in einem IVR dynamisch eine WAV Datei abspielen
(Wav beinhaltet einen Artikelnamen)
Dann ist es möglich eine Menge per IVR einzugeben
Diese Menge wird mit der ARtNr in eine CSV eingespeichert und weiterverarbeitet

=> Dann soll die nächste WAV abgespielt werden (Loop until EOF)

Das hört sich einfach an. Was ich bekomme ist eine Liste mit ArtNr - täglich. Diese verarbeite ich sobald sie existiert zeilenweise und hole mir den Artikelnamen, Preis und Packungseinheit.

Das sieht dann zBsp. so aus :

IN => "1" => Hole ArtName "Schrauben" => Preis "0.01" => PE "1000"

Womit ich nun kämpfe ist eher der Gedankengang wie ich es aufbaue - denn - es soll möglich sein 1 x zurückzugehen um Fehler zu korrigieren

In der Praxis würde sich das IVR für den Nutzer so anhören :

"ArtNr 1 in 1000 Einheiten. Wieviele Schrauben möchten Sie?"
Nutzer gibt seine Bestellmenge ein, zBsp. 10000.
Nun muss Asterisk kurz die Variable demontieren und den Gesamtpreis holen, im Beispiel wären es "10 ¤uro" und das vorlesen.

Speichern.

Nächster Artikel und Hinweis auf "*" für zurück.

Puhh..

Ich habe mir das so vorgestellt - ich lege je Artikel eine Datei an, numerisch und doch nach listenformat, also 1.wav und 1.pe udn 1.eur -- 2.wav und 2.pe und 2.eur

Die .pe Datei enthält nur die PE Zahl, so kann ich sie schnell in Asterisk als Variable holen, die eur Zahl enthält - oha - den Preis.

Wenn eine Datei verarbeitet wurde, würde ich sie nach 0. verschieben, so kann ich immer noch mal zum letzten artikel springen, das verschieben des listenformats - zbsp. :

0. (abgearbeitet)
1. (nächster in der reihe)
2. (übernächster)
3. (usw)
4.

hat den Vorteil das ich auch das Listenende erhalten kann und nicht immer wieder auf die einzelnen artikelnummern eingehen muss...

Mir schwirrt zu viel im Kopf rum, für jetzt ist es erstmal Ende.

LG Stefan
 
Hallo Stefan,

ich hab das hier mal aus dem Kopf zusammengebastelt.
Es gibt für jeden Artikel ein Sound-File mit dem Aufbau artikelnr_packeinheit_euro-cent.wav,
also wäre zB. 12345_100_99-50.wav der Artikel 12345 mit 100 St zu 99,50.

Code:
exten => s,1,Set(bestellung=${CALLERID(number)}_${STRFTIME(${EPOCH},Europe/Berlin,%Y-%m-%d_%H-%M-%S)})
exten => s,n,System(touch /var/tmp/${bestellung})

exten => s,n(losgehts),Set(dateiname=${BACKTICKS(ls *.wav | head -n ${zeilennummer} | tail -n 1)})
exten => s,n,GotoIf($["${dateiname"=""}]?fertig)

exten => s,n,Set(dateiname=${CUT(dateiname,.,1)})
exten => s,n,Set(artikelnr=${CUT(dateiname,_,1)})
exten => s,n,Set(packeinheit=${CUT(dateiname,_,2)})
exten => s,n,Set(preis=${CUT(dateiname,_,3)})

exten => s,n,Playback(${dateiname}.wav)
exten => s,n,Playback(verpackungseinheit)
exten => s,n,SayNumber(${packeinheit})
exten => s,n,Playback(stueck)
exten => s,n,SayNumber(${CUT(preis),-,1})
exten => s,n,Playback(komma)
exten => s,n,SayNumber(${CUT(preis),-,2})
exten => s,n,Playback(euro)
exten => s,n,Playback(mit-stern-zurueck)

exten => s,n,Read(eingabe)

exten => s,n,Set(zeilennummer=${If($["${eingabe}"="*"]?${zeilennummer-1}:${zeilennummer}+1)})
exten => s,n,GotoIf($["${eingabe"="*"}]?losgehts)

exten => s,n,System(echo "$artikelnr;$eingabe" > /var/tmp/${bestellung})

exten => s,n,Goto(losgehts)

exten => s,n(fertig),Playback(mit-eins-bestellen)
exten => s,n,Playback(mit-stern-zurueck)
exten => s,n,Read(eingabe)
exten => s,n,Set(zeilennummer=${zeilennummer}-1)
exten => s,n,GotoIf($["${eingabe"="*"}]?losgehts)
exten => s,n,GotoIf($["${eingabe"!="1"}]?abgebrochen)

exten => s,n,System(mv /var/tmp/${bestellung} /home/bestellungen/)

exten => s,n,Playback(danke)
exten => s,n,HangUp

exten => s,n(abgebrochen),System(rm /var/tmp/${bestellung})
exten => s,n,HangUp

Vielleicht kannst Du das so oder zumindest als Denkanstoß gebrauchen.

Svenja
 
Zuletzt bearbeitet von einem Moderator:
Mensch Svenja,

heute ist doch Montag - da wird höchstens mal Arbeit zum Kollegen abgeschoben :rolleyes:

zumindest als Denkanstoß

Ich würde sagen das Du mir die Arbeit abgenommen hast

:groesste: (die)

Was soll ich sagen? Das ist schon echt genial. Danke! Danke! Selten so nett geholfen worden :!:

Ich stell meine Lösung als Ganzes nachher mal hier ein, ich denke nur es wird noch > eine Nacht kosten das ganze in einem Zusammenhang zu bringen....Nochmals und sehr deutlich DANKE SCHÖN (!)

Lg Stefan
 
Was, schon Montag?! Mist, wieder ein Wochenende verschlafen. ;)

Ich würde sagen das Du mir die Arbeit abgenommen hast

Na da wollen wir erst mal abwarten, ob das Ding auch wirklich das macht, was Du möchtest.

Svenja
 
Seien wir ehrlich - ein "bisschen" fehlt noch :) Aber es ist auf jeden Fall superlieb von Dir. Schein heute meinen "superliebgehabtwerden"-Tag zu haben, meine Frau kam gerade mit einem Navi fürs Motorrad rein..heute mag ich Euch Frauen :)

LG Stefan
 
Hi Svenja,

nach reichlich Arbeit ist das ganze abgearbeitet und läuft.

Ich habe es nicht ganz so professionell gemacht wie Du - da backticks bei mir nicht wirklich gut integriert werden wollte - also habe ich es wie folgt aufgestellt :

- IVR wie gehabt
- Datenaustausch (ArtNr etc) über Timestamp Asterisk Database
* Externes Skript (Rotate) schreibt seine Daten in die AstDB und den Familykey erhebe ich aus den Kundendaten - er ist also einzigartig in der Session
- Ein externes Skript wird angestoßen und erhält lediglich die Kundennummer als Variable
* Nach Deiner Vorlage nehme ich schlichtweg die erste Datei (allerdings nach Alpha) und lege sie als "abspiel.wav" ab
- Asterisk liest vor und wartet auf eine Menge
- Speichert das ganze sauber ab
- Ist irgendwann die Liste leer schiebt er eine StandardDatei ein und ändert den DB Status auf ende - dann bekommt man ein AUf Wiedersehen, fertig.

Das ganze ist sehr umfangreich - allerdings in einer conf Datei für Asterisk und 3 Skripten auf BASH verpackt. Alle Dateien die vorgelesen werden, erstellt die Bash einen Abend vorher, so sind sie sofort verfügbar, ebenfalls werden alle Datenbank Abfragen am SQL Server vorgefertigt, so gibt es keine Wartezeiten mehr.

Es ist wirklich ein rundum-Paket mit mördermäßig viel Arbeit geworden - gestern war Testlauf mit echten (internen) Kunden - ging voll in die Hose :eek: (ein date --today war falsch gesetzt)

:-Ö

Heute war der zweite Testlauf, alles lief sauber und zufriedenstellend. Ich denke es ist reif für den EInsatz - ab Montag soll es produktiv gehen.

Nochmals Danke für deinen Ansatz.

Wenn jemand Interesse an diesem Rotations-Bestell-Skript hat, so melde er sich - ABER er erwarte ganz sicher keine sofort einsatzfertige Lösung! ! ! Es ist zwar alles mit Variablen und per Konfigdateien gelöst, so dass es rel. leicht zu portieren ist, aber wenn der Wurm drin ist, dann....

Nun gut. Ich bin also in der Lage einige Kunden die sehr viel papierkram produziert haben und eine Vollzeitkraft komplett gebunden haben nunmehr so auf ein papierlosen Warengang zu stellen.

1 Artikel zu bestellen, dauert 12 Sekunden. Ist man einmal drin und versteht wie es läuft, kommt man mit 8 aus - weniger ist nicht, da das IVR immer noch auf eine maximale Stellenanzahl von 4 Digits warten muss, also auch bei der Eingabe von 3 Stellen muss gewartet werden bis 4 Stellen voll sind, das kostet Zeit und nervt. mhmm...sehe da aktuell keine Verbesserung..

Danke und LG Stefan
 
Kann man
Code:
exten => s,n,SayNumber(${CUT(preis),-,1})
exten => s,n,Playback(komma)
exten => s,n,SayNumber(${CUT(preis),-,2})
irgendwie in einer Zeile schreiben? SayNumber kann nur ganze Zahlen abspielen. Oder kann man dieser App irgendwie auch das Komma beibringen?
 
Wenn Du es nicht mit Asterisk Bordmitteln machst - sondern zBsp. mit Cepstral ist das gar kein Thema.

Dann einfach nur den Text als ganzes durch die TTS Engine laufen lassen...

Wo ich gerade hier mal schreibe :

UPDATE

Das ganze ist nunmehr PRODUKTIV und täglich für alle Kunden im Einsatz, es gibt noch welche die wirklich unbedingt über Ihre eigene WaWi bestellen müssen udn wir bekommen es dann digital als Internetaustausch - aber selbst viele dieser Kunden gehen mittlerweile auf die telefonische Bestellung über. Einarbeitszeit bis man das ganze versteht ist mit einem Telefonat abgegolten!

Erfolg!

LG Stefan
 

Statistik des Forums

Themen
246,308
Beiträge
2,249,814
Mitglieder
373,915
Neuestes Mitglied
sunburstc
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.