Open Source im professionellen Einsatz
Linux-Magazin 12/2008
© luxuz::., Photocase.com

© luxuz::., Photocase.com

Workshop: Programmieren mit dem Asterisk Gateway Interface

Sympathischer Vorleser

Dank des Asterisk Gateway Interface entwickeln Sie eigene Telefonie-Anwendungen mit ihrer Lieblings-Programmiersprache. Der Workshop erklärt die Grundlagen von AGI anhand einer putzigen Anwendung, die Anrufern zu per Telefontastatur eingegebenen Begriffen die zugehörigen Wikipedia-Artikel vorliest.

796

Mit Hilfe des Dialplan-Befehls »AGI« übergibt Asterisk die Kontrolle über einen Channel weitgehend an ein externes Programm, das Sie in vielen gängigen Sprachen schreiben dürfen. Der Artikel beschreibt Prinzip, Syntax und die Fallstricke von AGI bei Asterisk 1.4 anhand einer Text-to-Speech-Anwendung für Wikipedia, deren Ablauf Abbildung 1 darstellt. Die blauen Ziffern im Callflow geben die Nummer des Sprachbausteins an, die roten Textfragmente spielt das AGI-Programm dem Benutzer vor.

Nachdem der Anrufer seine Sprache ausgewählt hat, wird er gebeten, mit Hilfe der Tabelle auf [http://www.readwikipedia.net], siehe auch [1], einen Begriff per Touchtone einzutippen. Ein PHP-Skript schlägt den Begriff bei Wikipedia nach. Lässt sich ein Wiki-Eintrag finden, konvertiert das Skript den Text mit einem Text-to-Speech-System in Audiodaten.

Abbildung 1: Der Ablaufplan der Telefonie-Anwendung von Readwikipedia.net. Der Benutzer tippt sich auf seinem Telefon durch ein Menü und bekommt dann einen Wikipedia-Eintrag vorgelesen.

Wikipedia am Telefon: So funktioniert's

Das AGI-Programm spielt dem Anrufer die Audiodatei für den Benutzer vor. Anschließend kann er einen neuen Begriff eingeben. Hat sich kein Wikipedia-Artikel gefunden oder tritt ein Problem bei der Wiedergabe auf, informiert das Programm den Benutzer und gibt ihm die Möglichkeit, es mit einem anderen Begriff erneut zu versuchen. Das Ganze können Sie mit einem Anruf unter der Nummer +49 41 06 61 87 18 des Autors ausprobieren.

Das Skript »wikipedia2speech.php« von [2] konvertiert Artikel sowohl von der deutschen als auch von der englischen Wikipedia. Dazu bedient es sich zweier Text-to-Speech-Systeme. Eine Installationsanleitung sowie Anwendungsbeispiele finden Sie auf [2]. Das gleich vorgestellte AGI-Programm ruft »wikipedia2speech.php« mit Parametern auf. Das PHP-Skript erzeugt die angeforderte Audiodatei, die das AGI-Programm dann dem Anrufer vorspielt. Das installierte PHP-Skript ist also Voraussetzung für das Funktionieren des AGI-Programms.

Thema Umlaute: Man spricht Deutsch

Damit der AGI-Code (Fragment in Listing 1, alle Listings vollständig unter [3]) funktioniert, muss Asterisk von dem AGI-Befehl »SAY ALPHA« Umlaute und das ß annehmen und ein passendes Soundfile abspielen. Ein Standard-Asterisk ist dazu nicht in der Lage. Um dies zu korrigieren, fügen Sie in der Datei »main/say.c« der »switch case«-Anweisung in der Funktion »say_character_str_full()« die Zeilen in Listing 2 hinzu. »auml«, »ouml«, »uuml« und »szlig« sind die Sprachbausteine für Ä, Ö, Ü sowie ß, die Sie ebenfalls aufnehmen und zum Beispiel als »auml.gsm« im Verzeichnis »/var/lib/asterisk/sounds/de« speichern.

Listing 1:
»readwikipedia-agi.c« (Auszug)

[...]
 21 int agiNow_setlanguage(const char *lang)
 22 {
 23     char res_line[MAXLINE];
 24
 25     printf("EXEC SET CHANNEL(language)=%sn", lang);
 26     fgets(res_line, (int)sizeof(res_line), stdin);
 27     return 0;
 28 }
 29
 30 int agiNow_getoption(long *endpos, const char *filename, const char *escdigits, const char *format, ...)
 [...]
 59
 60 int agiNow_sayalpha(char *word, const char *escdigits)
 [...]
 75
 76 int agiNow_waitfordigit(int timeout)
[...]
 86
 87 int agiNow_streamfile(long *endpos, const char *filename, const char *escdigits, const char *format, ...)
[...]
116
117 int agiNow_verbose(char *msg, const char *format, ...)
[...]
130
131 int agiNow_get_word_from_user(char search_this[], int array_length)
[...]
208
209 int read_initial_agi_vars()
210 {
211     char c, line[256];
212     int line_pos, var_pos, struct_count = 0;
213
214     while (strcmp(fgets(line, (int)sizeof(line), stdin), "n")) {
215         // Save the variable name in agi_vars[struct_count].name.
216         for (line_pos = var_pos = 0; (c = line[line_pos]) != ':'; line_pos++, var_pos++) {
217             agi_vars[struct_count].name[var_pos] = c;
218             if ((AGI_STDIN_LENGTH-1) == var_pos) break;
219         }
220         var_pos++;
221         agi_vars[struct_count].name[var_pos] = '

Listing 2: Änderungen in
»say.c«

01 case ('xE4'):
02         fn = "auml";
03         break;
04 case ('xC4'):
05         fn = "auml";
06         break;
07 case ('xF6'):
08         fn = "ouml";
09         break;
10 case ('xD6'):
11         fn = "ouml";
12         break;
13 case ('xFC'):
14         fn = "uuml";
15         break;
16 case ('xDC'):
17         fn = "uuml";
18         break;
19 case ('xDF'):
20         fn = "szlig";
21         break;

Mit »make && make install« aktivieren Sie die Änderung, sofern Ihnen schon ein konfigurierter Verzeichnisbaum vorliegt. Nun müsste es Ihnen möglich sein, mit dem AGI-Befehl »SAY ALPHA« Umlaute versuchsweise wiederzugeben, sofern diese ISO-8859-1-kodiert sind.

Eine Übersicht über die Sprachbausteine, die das AGI-Programm in Listing 1 zusätzlich benötigt, finden Sie in Tabelle 1.Die beiden Bausteine »01.gsm« und »02.gsm« sind zweisprachig, da an der entsprechenden Stelle im Callflow die Benutzersprache noch unbekannt ist. Per se nimmt Asterisk Englisch an und erwartet die Sprachbausteine in »/var/lib/asterisk/sounds«. Wenn dann ein AGI-Befehl innerhalb des AGI-Programms die Sprache auf Deutsch setzt, konzentriert sich Asterisk auf das Verzeichnis »/var/lib/asterisk/sounds/de«.

Tabelle 1: Eigene
Sprachbausteine

Außerdem benötigt das AGI-Programm einige deutsche Sprachbausteine, um das deutsche Alphabet abspielen zu können. Die passenden Dateien laden Sie von [4] herunter, an gleicher Stelle liegt auch eine Anleitung, anhand derer Sie die Dateien installieren. Beachten Sie, dass Asterisk die neuen Sprachbausteine nur finden kann, wenn Sie der Konfigurationsdatei »asterisk.conf« die Zeilen

[options]
languageprefix=yes

hinzugefügt haben. (Existiert »[options]« bereits, natürlich nur die zweite Zeile.)

Linux-Magazin kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

  • Zeit für was Neues

    Der eine braucht sowieso gerade eine neue, den anderen nervt, dass sich der Vermieter seiner Telefonanlage jedes Komfortmerkmal extra bezahlen lässt. Zeit zu wechseln, Zeit eine VoIP-fähige Anlage selbst zu bauen, Zeit für einen Asterisk-Workshop im Linux-Magazin.

  • Erweiterte Gesprächskultur

    Im zweiten Teil des großen Telefonanlagen-Workshops erfahren Sie, wie Sie komplexe Komfortfunktionen programmieren, beispielsweise interaktive Sprachmenüs, und welche Mechanismen Asterisk im Einzelnen dafür in seinem Ärmel hat.

  • Deutsche Sprachbausteine für Asterisk-Anlagen

    Der VoIP-Spezialist Amooma bietet Sprachbausteine für die freie Asterisk-Telefonanlage (Version 1.4 und 1.6) zum kostenfreien Download und uneingeschränkter Nutzung an.

  • Ruf mich an!

    Alles, was über Telefonie hinausgeht, macht den wirklichen Mehrwert von Asterisk aus: Sprachportale beispielsweise, die Fluggäste identifizieren und informieren, bei einer frostigen Wohnung warnen oder den Admin mimen, wenn die User ihre Passwörter verschusselt haben.

  • Gemeinschaft an der Strippe

    Asterisk-Toolkits wie das auf deutsche Verhältnisse angepasste Projekt mit dem schönen Namen Gemeinschaft helfen den Admins und Systemintegratoren, eine Telefonanlage ab mittlerer Größe mit überschaubarem Aufwand zu migrieren und zu betreiben.

comments powered by Disqus

Ausgabe 07/2017

Digitale Ausgabe: Preis € 6,40
(inkl. 19% MwSt.)

Artikelserien und interessante Workshops aus dem Magazin können Sie hier als Bundle erwerben.