CFD Voice Input/ Routing

Ist es möglich, dass ich im Voice Input die ganzen Hints und Dictionary Prompts in einen C# Code auslagere, damit ich quasi den ganzen Duden hochladen könnte?
Theoretisch ja, praktisch wird es irgendwo an mir unbekannte Grenzen bzgl. der Größe stoßen.

Ich benutze diese Funktion praktisch nie. Aber ja, ein C# Schnipsel kann das realisieren. Da passen sicher auch mehr Daten rein und das sieht evtl. geschmeidiger aus.
 
  • Like
Reaktionen: ciscoX
Ist das für V18 Update 9 noch aktuell?
ja

Nachtrag: ich mache das so nicht.

Ich schreibe einfach drauf los. Das reicht i.d.R.. Ich schreibe in der 3CX Verwaltungskonsole bei den Callflow-Apps oft auch direkt im Code rum, das geht immer und geht schneller. Ich nutze halt oft den Logger und rudimentäre Log Funktionen im C# Code (siehe hier, vorletzte Zeile mit File.AppendAllText ...).

Notfalls starte ich mein lokal installiertes VS C# und teste komplexere Sachverhalte kurz an. Sonst habe noch eine Windows VM mit einer 3CX, installiertem und angebundenem VS C# in der richtigen Version um komplexere Sachverhalte zu bauen (hooks, callback usw.), aber das spielt hier alles keine Rolle. Ich habe noch eine Bastel VM mit einer Debian 3CX mit dem kompletten SDK und teste dort, sowohl mit Powershell unter Linux als auch C# (inkl. kompilieren) auf der Shell.
 
Zuletzt bearbeitet:
  • Like
Reaktionen: ciscoX
Ich weiss nicht, ob dieser C# Code richtig wäre:

Code:
List<string> words = new List<string> { "hallo", "guten", "tag", "a", "e", "i", "o", "u" };
return words;

Jedoch kann ich im Voice Input nur bei Dictionary eine Verknüpfung zum C# Code erstellen, jedoch für die Werte "Hints" nicht - siehe:

Foto2.png

Da ist nur ein String möglich. Wo ist da nochmal der Unterschied zwischen Hints und Dictionary? Vielleicht weisst du das zufällig, auch wenn du das nicht nutzt.
Dadurch will ich sicherstellen, dass jedes Wort von Google Speech to Text erkannt wird.
 
Jedoch kann ich im Voice Input nur bei Dictionary eine Verknüpfung zum C# Code erstellen, jedoch für die Werte "Hints" nicht
Dafür muss der gesamte Aufruf der CFD Funktion per C# mit einem passenden Parametersatz erfolgen. Die Funktion der 3CX DLL heisst VoiceInputComponent und erfordert so einiges an Parametern in der richtigen Anordnung, ein kleines Minenfeld.
 
  • Like
Reaktionen: ciscoX
Ok, dann lasse ich das besser so stehen, wie es ist, denn wenn der Voice Input Block durch einen kompletten C# Code ersetzt wird, sofern ich das richtig verstehe, wird es dann im Endeffekt doch zu unübersichtlich, wenn mal kurz etwas geändert werden muss. Das der Callflow komplett aus C# Codes besteht, ist dann doch nicht unbedingt das Ziel.

Eine Frage, kann man 3CX Call Flows etwa studieren oder woher hast du das umfangreiche Wissen? XD
 
Das sind schon zwei Fragen.
Eine Frage, kann man 3CX Call Flows etwa studieren
Ja. Klick in der Verwaltungskonsole auf einen Callflow und der Code wird angezeigt. Da kann man auch wunderbar reinschreiben. Das ist mein Ding.
woher hast du das umfangreiche Wissen?
Das ist nach und nach gewachsen. Die Schnittstelle wird (glaub seit 03/2022) nicht mehr öffentlich seitens 3CX publiziert und erklärt. Da haben sich einfach zu viele unbedarft daran versucht. Aber man findet die 3CXCallControlAPI auch für die _v18 im Netz und Links dazu sogar hier im Forum wenn man mit dem richtigen Begriff danach sucht.
 
Zuletzt bearbeitet:
  • Like
Reaktionen: ciscoX
Also dann ist dieses Projekt vorerst abgehakt. Der CFD läuft soweit gut. Wenn dir vielleicht doch irgendwie eine Möglichkeit einfällt, wie ich den Audio Stream auslesen könnte für "Background Detection" lass es mich gerne wissen, ich bin ebenfalls auf der Suche. Das wäre sehr hilfreich innerhalb des Callflows, da die Audio Prompts den Teilnehmer unterbrechen, wenn das Keyword erkannt wurde, obwohl der Teilnehmer noch am Sprechen ist.
 
Zuletzt bearbeitet:
Guten Morgen @fxbastler,

soeben gab es bei Vod@fone temporär eine IVR, die genau mein Vorhaben umsetzen kann. Es spielt eine Hintergrundmusik, währendem eine Prompt Playback angespielt wird. An sich ist es wohl also technisch möglich. Wie die das machen, wüsste ich gerne.

Im Englischen Forum kann ich nichts mehr posten und @edossantos fragen, weil meine FQDN wohl nicht mehr verknüpft sei.
 
Es wurde eine Möglichkeit gefunden, wie das Prompt Playback erst abgespielt wird, nachdem der Anrufer nicht mehr spricht. Dazu müssen alle Einträge „Dictionary“ in der Komponente „Voice Input“ gelöscht werden. Dadurch erfolgt Valid Input erst, wenn der Anrufer nicht mehr spricht. Also wird da doch etwas erkannt, was einem Background Detection nahekommt. Leider führt das aber dazu, dass das Prompt Playback, bzw. Valid Input mit einer Verzögerung von 3-4 Sekunden erfolgt, da wahrscheinlich erst auf die Verarbeitung von Google STT gewartet wird.

Theoretisch müsste es doch möglich sein die Bytes des Voice Inputs zu analysieren und sobald sich diese nicht mehr verändern, das Prompt Playback, bzw. eine Condition ausserhalb der Komponente Voice Input sofort zu „aktivieren“? Wie ich so einen C Code aber bastel weiss ich nicht.

Es muss doch irgendeine Möglichkeit geben die Dateigrösse innerhalb des Callflows zu erkennen, denn diese verlässt ja die PBX zu Google Cloud oder sehe ich das falsch? Google erkennt ja immerhin auch das Ende der Spracheingabe und schildert das dem Callflow, denn dieser fährt erst fort, wenn der Anrufer nicht mehr spricht mit den oben genannten Settings.

Wenn Einträge im Dictionary enthalten sind, fällt das Valid Input dem Anrufen mit seinem Prompt Playback ins Wort und lässt ihn nicht aussprechen. Beispiel: Im Voice Input wird „Hallo“ im Dictionary eingetragen, der Anrufer sagt Hallo und weitere Worte, wird auf das Wort Hallo gelauscht und der Anrufer wird trotz nachfolgendem Text unterbrochen - der Callflow fährt somit fort. Der Anrufer darf aber nicht unterbrochen werden…
 
Zuletzt bearbeitet:
Theoretisch müsste es doch möglich sein die Bytes des Voice Inputs zu analysieren und sobald sich diese nicht mehr verändern, das Prompt Playback, bzw. eine Condition ausserhalb der Komponente Voice Input sofort zu „aktivieren“?
nein, mir nicht bekannt, nicht mit einer CFA, nicht mit normalen Mitteln einer 3CX

Nachtrag:
Asterisk hat dafür z.B. die spezielle Funktion BackgroundDetect. So ein Äquivalent bekommt man mit dem CFD nicht hin, auch nicht mit C# Code.
 
  • Like
Reaktionen: ciscoX
Das fällt also auch darunter. Schade.
 
Hallo @fxbastler

Ich habe mich dazu entschieden, für mein Vorhaben Asterisk laufen zu lassen.

Ich bin schon mal so weit, dass meine 3CX Extension (1111) als Trunk in Asterisk hinterlegt ist. Nun kann ich über Asterisk CLI einen Anruf starten oder einen Anruf von extern empfangen.

Versucht habe ich bisher:

Asterisk -> 3CX Extension 1000 = Congratulations Message wird abgespielt.
3CX Extension 1000 -> Asterisk PBX = "Hello World" Playback.

Nun werde ich versuchen, dass die Asterisk PBX das 3CX CFA ersetzt und auf das Voice Input wartet. Sobald Stille erkannt wurde, soll das Input direkt an Google gesendet werden und dann den Anrufer an meine 3CX PBX weiterleiten. Ich bin überrascht, dass das überhaupt möglich ist, eine PBX mit der anderen zu verbinden, aber es funktioniert. Ich kann sogar die 3CX Master Bridge in Asterisk verwenden, nur ob das dafür nötig ist, weiss ich noch nicht. Das war jedenfalls mein erster Schritt, bevor ich die 3CX Extension in Asterisk hinzugefügt habe. Kannst du mir sagen, wofür das realm in der Authentifizierung benötigt wird? Ich musste lange rausfinden, dass das überhaupt benötigt wird und das dafür "3CXPhoneSystem" verwendet werden muss, sonst schlägt die Authentifizierung fehl. Das versuche ich auch gleich mal bei meinem Cisco Telefon, da sich dieses nur über den 3CX SBC verbinden lässt.
 
Ich bin überrascht, dass das überhaupt möglich ist, eine PBX mit der anderen zu verbinden, aber es funktioniert.
Das sollte immer funktionieren. Man kann prinzipiell beliebig kaskadieren. Letztendlich benutzen alle Telefonieanbieter auch nur Telefonanlagen die vermitteln. Das sind nur andere Anlagen, andere Endpunkte und andere Regeln. Nicht wenige benutzen Asterisk.
Kannst du mir sagen, wofür das realm in der Authentifizierung benötigt wird?
Nein, kann ich in diesem Fall nicht. Die Angabe von realm taucht in den von mir verwendeten pjsip.conf auch nicht auf.
 
  • Like
Reaktionen: ciscoX
Nein, kann ich in diesem Fall nicht. Die Angabe von realm taucht in den von mir verwendeten pjsip.conf auch nicht auf.

Interessant, denn ohne realm kann sich Asterisk bei 3CX nicht authentifizieren.

Ich habe nun einen eigenen VOSK Server am laufen, um den Audiostream zu analysieren. Funktioniert bisher gut, muss aber noch weiter ausgebaut werden. Warum VOSK? Das Google Cloud Speech To Text habe ich irgendwie nicht zum Laufen bekommen, ausserdem denke ich, dass der VOSK Server genau so gut funktionieren wird.

Ich muss auch noch rausfinden, wie es möglich ist, dass 3CX jede Asterisk Extension erreichen kann ohne, dass ich jede einzelne Extension in Asterisk Extension in 3CX als SIP Trunk hinterlegen muss.

Die Bridge ist bei mir nicht in Gebrauch, ich glaube die benötige ich gar nicht, sondern nur die Asterisk Extension als SIP Trunk in 3CX.
 
Wir haben für jede Asterisk Nummer eine NSt. in der 3CX angelegt und diese auch in der Asterisk. Damit behält die 3CX die Kontrolle über den Anruf, es telefonieren nur 3CX Nebenstellen miteinander.

Wenn du die Asterisk als SIP Trunk an die 3CX anbindest, kannst du alle Asterisk NSt. dort erreichen, sofern deren Nummern länger als die der 3CX sind und es eine entspr. ausgehende Regel gibt. Aber die 3CX verliert die Kontrolle über den Anruf, der geht raus und ist weg.
 
Ja, du hast Recht. Es funktioniert nur, wenn ich jede Asterisk Extension in pjsip anlege, dann in 3CX als Trunk hinterlege, mit dem entsprechenden Asterisk Dial Plan für externe Anrufe.
 

Statistik des Forums

Themen
44.414
Beiträge
232.716
Mitglieder
78.330
Neuestes Mitglied
uvitas