Ergebnis 1 bis 13 von 13

Thema: [ERLEDIGT] Dateien abarbeiten und Dateiname als VARIABLE in Asterisk

  1. #1
    IPPF-Tausend-VIP Avatar von HobbyStern
    Registriert seit
    05.12.2005
    Ort
    Ruhrgebiet
    Beiträge
    1.810

    [ERLEDIGT] Dateien abarbeiten und Dateiname als VARIABLE in Asterisk

    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!
    Geändert von HobbyStern (08.10.2010 um 20:35 Uhr)
    Asterisk: 1.4.30 mit Russel-Devstate und PickPatch,MissedCalls - Übersicht mit Nagios, Redundanz durch LoadBalanced-Clusterung
    Nutze zahlreiche Snoms,Ciscos,Patton,Linksys und Grandstream. 24 Fritz!Boxen für VPN und VoIP an Remote-Standorten


    Bitte keine Supportanfragen per PM, Danke.

  2. #2
    Moderator Avatar von rentier-s
    Registriert seit
    19.10.2006
    Ort
    Niederbayern
    Beiträge
    2.093
    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
    Alles schöne im Leben ist entweder verboten, zu teuer oder macht dick!

  3. #3
    IPPF-Tausend-VIP Avatar von HobbyStern
    Registriert seit
    05.12.2005
    Ort
    Ruhrgebiet
    Beiträge
    1.810
    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



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

    Vielen Dank, Forenengel !
    Asterisk: 1.4.30 mit Russel-Devstate und PickPatch,MissedCalls - Übersicht mit Nagios, Redundanz durch LoadBalanced-Clusterung
    Nutze zahlreiche Snoms,Ciscos,Patton,Linksys und Grandstream. 24 Fritz!Boxen für VPN und VoIP an Remote-Standorten


    Bitte keine Supportanfragen per PM, Danke.

  4. #4
    Moderator Avatar von rentier-s
    Registriert seit
    19.10.2006
    Ort
    Niederbayern
    Beiträge
    2.093
    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

    Svenja
    Alles schöne im Leben ist entweder verboten, zu teuer oder macht dick!

  5. #5
    IPPF-Tausend-VIP Avatar von HobbyStern
    Registriert seit
    05.12.2005
    Ort
    Ruhrgebiet
    Beiträge
    1.810
    AGI ?


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

    Bin doch ... (s.o.)
    Asterisk: 1.4.30 mit Russel-Devstate und PickPatch,MissedCalls - Übersicht mit Nagios, Redundanz durch LoadBalanced-Clusterung
    Nutze zahlreiche Snoms,Ciscos,Patton,Linksys und Grandstream. 24 Fritz!Boxen für VPN und VoIP an Remote-Standorten


    Bitte keine Supportanfragen per PM, Danke.

  6. #6
    IPPF-Tausend-VIP Avatar von HobbyStern
    Registriert seit
    05.12.2005
    Ort
    Ruhrgebiet
    Beiträge
    1.810

    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
    Asterisk: 1.4.30 mit Russel-Devstate und PickPatch,MissedCalls - Übersicht mit Nagios, Redundanz durch LoadBalanced-Clusterung
    Nutze zahlreiche Snoms,Ciscos,Patton,Linksys und Grandstream. 24 Fritz!Boxen für VPN und VoIP an Remote-Standorten


    Bitte keine Supportanfragen per PM, Danke.

  7. #7
    Moderator Avatar von rentier-s
    Registriert seit
    19.10.2006
    Ort
    Niederbayern
    Beiträge
    2.093
    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
    Geändert von rentier-s (27.09.2010 um 10:24 Uhr)
    Alles schöne im Leben ist entweder verboten, zu teuer oder macht dick!

  8. #8
    IPPF-Tausend-VIP Avatar von HobbyStern
    Registriert seit
    05.12.2005
    Ort
    Ruhrgebiet
    Beiträge
    1.810
    Mensch Svenja,

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

    zumindest als Denkanstoß
    Ich würde sagen das Du mir die Arbeit abgenommen hast

    (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
    Asterisk: 1.4.30 mit Russel-Devstate und PickPatch,MissedCalls - Übersicht mit Nagios, Redundanz durch LoadBalanced-Clusterung
    Nutze zahlreiche Snoms,Ciscos,Patton,Linksys und Grandstream. 24 Fritz!Boxen für VPN und VoIP an Remote-Standorten


    Bitte keine Supportanfragen per PM, Danke.

  9. #9
    Moderator Avatar von rentier-s
    Registriert seit
    19.10.2006
    Ort
    Niederbayern
    Beiträge
    2.093
    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
    Alles schöne im Leben ist entweder verboten, zu teuer oder macht dick!

  10. #10
    IPPF-Tausend-VIP Avatar von HobbyStern
    Registriert seit
    05.12.2005
    Ort
    Ruhrgebiet
    Beiträge
    1.810
    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
    Asterisk: 1.4.30 mit Russel-Devstate und PickPatch,MissedCalls - Übersicht mit Nagios, Redundanz durch LoadBalanced-Clusterung
    Nutze zahlreiche Snoms,Ciscos,Patton,Linksys und Grandstream. 24 Fritz!Boxen für VPN und VoIP an Remote-Standorten


    Bitte keine Supportanfragen per PM, Danke.

  11. #11
    IPPF-Tausend-VIP Avatar von HobbyStern
    Registriert seit
    05.12.2005
    Ort
    Ruhrgebiet
    Beiträge
    1.810
    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 (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
    Asterisk: 1.4.30 mit Russel-Devstate und PickPatch,MissedCalls - Übersicht mit Nagios, Redundanz durch LoadBalanced-Clusterung
    Nutze zahlreiche Snoms,Ciscos,Patton,Linksys und Grandstream. 24 Fritz!Boxen für VPN und VoIP an Remote-Standorten


    Bitte keine Supportanfragen per PM, Danke.

  12. #12
    IPPF-Zweitausend-VIP Avatar von PsychoMantis
    Registriert seit
    18.12.2005
    Ort
    Ingolstadt
    Beiträge
    2.253
    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?
    Router: Fritz!Box Fon WLAN 7390
    Telefon: 1x MT-D + 1x MT-F
    VoIP-Anbieter: dus.net | sipgate.de | Finarea/Betamax | sipout.net
    Server: Proplay V-Server (1,99¤/Monat) mit Asterisk 1.8.5.0 mit fail2ban
    GSM-Gateway: Asterisk mit chan_dongle
    Anbindung: 1&1
    Drogen: ogame

  13. #13
    IPPF-Tausend-VIP Avatar von HobbyStern
    Registriert seit
    05.12.2005
    Ort
    Ruhrgebiet
    Beiträge
    1.810
    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
    Asterisk: 1.4.30 mit Russel-Devstate und PickPatch,MissedCalls - Übersicht mit Nagios, Redundanz durch LoadBalanced-Clusterung
    Nutze zahlreiche Snoms,Ciscos,Patton,Linksys und Grandstream. 24 Fritz!Boxen für VPN und VoIP an Remote-Standorten


    Bitte keine Supportanfragen per PM, Danke.

Ähnliche Themen

  1. Variable in Asterisk auslesen
    Von IBozkurt im Forum Asterisk Allgemein
    Antworten: 9
    Letzter Beitrag: 21.10.2010, 12:14
  2. Asterisk und AGI mit Bash - Variable übergeben
    Von chris-toph im Forum Asterisk Allgemein
    Antworten: 14
    Letzter Beitrag: 27.07.2010, 12:44
  3. Antworten: 3
    Letzter Beitrag: 16.07.2006, 20:37
  4. [erledigt] Wieso wird die Variable falsch gesetzt?
    Von johnyt11 im Forum Asterisk Rufnummernplan
    Antworten: 2
    Letzter Beitrag: 18.11.2004, 12:39

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •