Lottozahlengenerator als AGI-Skript in Python für Asterisk mit Hilfe von ChatGPT erstellt

In English——På svenska——En español——En français

Wichtiger Hinweis: Leider verfälschen die Google-Übersetzungen die Quellcodes. Bitte öffnet den Quellcode in einem anderen Fenster, wie es das nachstehende Bild zeigt. Von dort lassen sich die Quellcodes auch leichter herauskopieren:

9.02.2023

Dieses AGI-Skript ist für den Einsatz in einer Asterisk-Telefonanlage gedacht und dient dazu, Sounddateien und Zahlen abzuspielen. Nach einer Verzögerung von einer Sekunde startet das Skript mit dem Abspielen einer Sounddatei und weiteren Verzögerungen. Anschließend werden per Zufallsgenerator sechs Zahlen zwischen 1 und 49 ausgewählt, sortiert und mit Verzögerungen ausgesprochen. Das Skript endet schließlich mit einer weiteren Sounddatei und Verzögerungen.

Bemerkenswert ist, dass der Code teilweise mit Hilfe der textorientieren KI-Software ChatGPT in einem Dialog erstellt wurde, der wie ein Gespräch von Mensch zu Mensch erscheint. Selbst dieser Artikel wurde teilweise von ChatGBT verfasst. Außerdem kamen für die Sprachhinweise noch Sprachgeneratoren und Übersetzungsprogramme zum Einsatz.

Lottoschein von 1957 aus Schleswig-Holstein ( Bildquelle: https://commons.wikimedia.org/wiki/File:Lottoschein_von_1957_Nordwestlotto_02.jpg )

Es ist ein AGI-Skript in Python und dient als Übung zum Verständnis der Ausgabe von Soundfiles und Zahlen in einer Asterisk-Umgebung. Wichtige Informationen erlangte ich, indem ich einige nützliche Routinen aus der Website http://www.asteriskdocs.org …. /asterisk-CHP-9-SECT-4.html implementierte. Dort stehen weitere Informationen zum Verständnis eines AGI-Scripts mit Python.

Das nachfolgend beschriebene AGI-Skript läuft sehr stabil auf einem Asterisk-Telefonserver und bietet eine hervorragende Möglichkeit, das Verständnis von Soundfiles und Zahlenausgabe in einer Asterisk-Umgebung zu verbessern.

Das Skript:

#!/usr/bin/python

# http://www.asteriskdocs.org/en/2nd_Edition/asterisk-book-html-chunk/asterisk-CHP-9-SECT-4.html

import sys
import re
import time
import random

def checkresult (params):
   params = params.rstrip()
   if re.search('^200',params):
      result = re.search('result=(\d+)',params)
      if (not result):
         sys.stderr.write("FAIL ('%s')\n" % params)
         sys.stderr.flush()
         return -1
      else:
         result = result.group(1)
         #debug("Result:%s Params:%s" % (result, params))
         sys.stderr.write("PASS (%s)\n" % result)
         sys.stderr.flush()
         return result
   else:
      sys.stderr.write("FAIL (unexpected result '%s')\n" % params)
      sys.stderr.flush()
      return -2

def sayit (params):
   sys.stderr.write("STREAM FILE %s \"\"\n" % str(params))
   sys.stderr.flush()
   sys.stdout.write("STREAM FILE %s \"\"\n" % str(params))
   sys.stdout.flush()
   result = sys.stdin.readline().strip()
   checkresult(result)
   
def saynumber (params):
   sys.stderr.write("SAY NUMBER %s \"\"\n" % params)
   sys.stderr.flush()
   sys.stdout.write("SAY NUMBER %s \"\"\n" % params)
   sys.stdout.flush()
   result = sys.stdin.readline().strip()
   checkresult(result)
   
time_duration = 1
time.sleep(time_duration)

sayit("/usr/share/asterisk/sounds/eigene/lotoenglisch")

time_duration = 14
time.sleep(time_duration)

sayit("beep")

time_duration = 1
time.sleep(time_duration)
  
def lotto_numbers():
    numbers = random.sample(range(1, 50), 6)
    numbers.sort()
    return numbers

def speak_number_with_delay(number):
    saynumber(str(number))
    time.sleep(3)

def print_numbers_with_delay(numbers):
    for number in numbers:
        speak_number_with_delay(number)

numbers = lotto_numbers()
print_numbers_with_delay(numbers)


sayit("/usr/share/asterisk/sounds/eigene/lottogoodbye")

time_duration = 6
time.sleep(time_duration)

time_duration = 2
time.sleep(time_duration)

sayit("beep")

time_duration = 2
time.sleep(time_duration)

Das Skript wurde in einer Datei namens lotto.py kopiert. Nachfolgend der Auszug aus der extensions.conf, um das Programm per Anruf aufzurufen. Wählt man die 341, startet das Programm:

exten => 341,1,Answer()
same => n,AGI(lotto.py) 
same => n,Hangup()

Der Einbau von AGI-Skripten, die auf einer Windows-Oberfläche editiert wurden, kann wegen falscher Steuerzeichen dafür sorgen, dass das Programm nicht unter Linux-Systemen funktioniert. Bitte die grundsätzlichen Hinweise hier entnehmen. Dort steht auch in welchen Ordner man das Skript kopieren muss, damit es gefunden wird:

Rotes schwedisches Ericsson Dialog. Die Ziffern sind versetzt angeordnet. Ein kleines Skript für Asterisk löst das Problem.
Schwedische und neuseeländische Wählscheiben: AGI-Skripte für Asterisk in Python oder PHP wandeln die gewählten Nummern um – 1.11.2022: Schwedische Wählscheiben besitzen gegenüber den meisten Wählscheiben auf der Welt eine andere Bedruckung. Die Ziffern sind um eine Stelle entgegen des Uhrzeigersinns verrutscht dargestellt. Wer sich an den aufgedruckten Ziffern eines schwedischen Wählscheibentelefons orientiert, wählt falsch, wenn das Telefon z.B. an einer üblichen Telefonanlage, an einem Asterisk-Server oder an einer FritzBox angeschlossen ist. – weiter

Das Skript verwendet die Bibliotheken „sys“, „re“, „time“ und „random“, um seine Funktionen auszuführen. Die Funktion „checkresult“ überprüft das Ergebnis des Abspielens eines Soundfiles oder Aufsagens einer Zahl. Falls das Ergebnis nicht wie erwartet ist, wird eine Fehlermeldung ausgegeben. Die Funktion „sayit“ streamt ein Soundfile, während die Funktion „saynumber“ eine Zahl aufsagt.

Zunächst schläft das Skript eine Sekunde, bevor es ein Soundfile „lotoenglisch“ abspielt. Nach einer weiteren Pause von 14 Sekunden wird ein „beep“ abgespielt. Anschließend werden zufällig generierte Lottozahlen ausgesprochen. Hierfür wird die Funktion „lotto_numbers“ verwendet, die eine Liste von sechs zufälligen Zahlen zwischen 1 und 49 erzeugt und sortiert. Die Funktion „speak_number_with_delay“ spricht eine Zahl aus und wartet anschließend 3 Sekunden. Die Funktion „print_numbers_with_delay“ wiederholt diesen Prozess für alle Zahlen in der Liste.

Zum Abschluss wird ein weiteres Soundfile „lottogoodbye“ abgespielt, gefolgt von zwei weiteren Pausen, einem „beep“ und einer letzten Pause von 2 Sekunden.

Die verwendeten Sounddateien:

lotoenglisch.wav:

lottogoodbye.wav:

Erzeugt und umgewandelt wurden die Sounddateien wie folgt:

Online lassen sich Audio-Dateien in Formate umwandeln, die für Asterisk geeignet sind. Aber es geht noch viel mehr.
Erzeugen von Telefon-Ansagen in verschiedenen Sprachen – 3.11.2022: Für einen Anrufbeantworter oder meinen Asterisk-Server benötige ich Sprach-Ansagen in verschiedenen Sprachen. Die weiblichen oder männlichen Stimmen sollten professionell und deutlich klingen. Wie mache ich das für private Zwecke ohne einen Cent dafür zu zahlen? Und alles soll möglichst online erstellt werden können. – weiter

Für die Übersetzung von Deutsch nach Englisch kam DeepL zum Einsatz.

Das KI-System ChatGPT konnte mir nicht bei den Routinen für die Soundausgabe helfen. Allerdings hat es mir beim Lottozahlengenerator geholfen. Nachfolgend der Dialog mit der künstlichen Intelligenz, die mir eine Menge Zeit ersparte Meine Schreibfehler habe ich beibehalten:

Ich: Bitte schreibe mir einen lotozahlengenerator für python 2.7. Ausgabe der Zahlen in aufsteigener Reihenfolge.

ChatGPT: Dies ist ein einfacher Zufallszahlengenerator, der 6 Zahlen zwischen 1 und 49 ausgibt, sortiert in aufsteigender Reihenfolge:

import random

def lotto_numbers():
    numbers = random.sample(range(1, 50), 6)
    numbers.sort()
    return numbers

print(lotto_numbers())

Ich: der zufallsgenrator funktioniert. allerdings sollen die zahlen der reihe nach einzeln mit einer pause von einer sekunde dazwischen ausgegeben werden

ChatGPT: Hier ist eine Anpassung des oben genannten Codes, bei dem die Zahlen der Reihe nach einzeln mit einer Pause von einer Sekunde zwischen jeder Ausgabe ausgegeben werden:

import random
import time

def lotto_numbers():
    numbers = random.sample(range(1, 50), 6)
    numbers.sort()
    return numbers

def print_numbers_with_delay(numbers):
    for number in numbers:
        print(number)
        time.sleep(1)

numbers = lotto_numbers()
print_numbers_with_delay(numbers)

Ich: was macht die zeile print(number)?

ChatGPT: Die print-Anweisung wird verwendet, um eine Zeichenkette oder einen Wert auf dem Bildschirm auszugeben. In diesem Fall wird jede Zahl, die in der Schleife ausgewählt wird, einzeln ausgegeben.

print(number)

In dieser Zeile wird das number-Element, das in jedem Durchlauf der Schleife ausgewählt wird, übergeben und angezeigt.

Ich : kann ich statt print auch etwas anderes verwenden, zum Beispiel eine funktion für die sprachausgabe?

ChatGPT: Ja, Sie können stattdessen eine andere Funktion verwenden, um die Zahlen auszugeben, z.B. eine Funktion für die Sprachausgabe. Hier ist ein Beispiel mit einer hypothetischen Funktion speak:

import random
import time

def lotto_numbers():
    numbers = random.sample(range(1, 50), 6)
    numbers.sort()
    return numbers

def speak_number_with_delay(number):
    speak(str(number))
    time.sleep(1)

def print_numbers_with_delay(numbers):
    for number in numbers:
        speak_number_with_delay(number)

numbers = lotto_numbers()
print_numbers_with_delay(numbers)

In diesem Codebeispiel wird jede Zahl, die in der Schleife ausgewählt wird, an die Funktion speak_number_with_delay übergeben, die die Zahl in eine Sprache ausgibt und dann 1 Sekunde wartet, bevor sie zur nächsten Zahl weitergeht.

Ich: Es funktioniert! Darf ich dir das ganze AGI-Skript für einen Lottozahlengenerator vorstellen, wenn es ein Hilfe für dich wäre?

ChatGPT: Ja, das wäre sehr hilfreich! Ich bin immer bereit, neues Wissen zu erwerben. Bitte teilen Sie mir Ihr Skript mit.

****

Videos zu ChatGPT als Hilfe zum Erlernen von Programmiersprachen:


Dieses Video zeigt wie ChatGBT als geduldiger Lehrer beim Erlernen der Programmiersprache interaktiv unterstützen kann.


Tipps, wie man Python mit Hilfe von ChatGPT schneller erlernen kann.


Wie man mit ChatGPT seine Produktivität vervielfacht.

Fazit: Ein schönes Beispiel wie man mit Hilfe von textbasierten KI-Systemen wie ChatGPT, Text-to-Speech-Generatoren für  Spracherzeugung und Übersetzungsprogrammen eine komplette Anwendung schreiben kann. Der Text dieses Aufsatzes wurde übrigens teilweise auch von ChatGPT verfasst.

Der Programmier-Code ist fehlerfrei. Trotzdem läuft das AGI-Skript nicht. Warum verflixt noch einmal?
AGI-Skripte für Asterisk unter Windows editieren – Was ist zu beachten? – 9. März 2023: Windows ist weit verbreitet. Deshalb schreiben nicht wenige ihre AGI-Skripte auf Windows, um sie dann in ihren Raspberry Pi zu kopieren. Wer einige Dinge nicht beachtet, wird die Skripte nicht zum Laufen bekommen. Hier sind die Fallstricke beschrieben, die mich viel Zeit gekostet haben. Die Beispiele beziehen sich auf Python. Sie haben für andere Programmiersprachen die entsprechende Gültigkeit. – weiter

Auf einem Raspberry Pi lässt sich ein kompletter Telefonserver betreiben, der seinen Teilnehmern über Landesgrenzen hinweg kostenloses Telefonieren von unterwegs oder daheim ermöglicht.
Asterisk-Telefonserver auf einem Raspberry Pi – Installation, Konfiguration, Programmierung, SIP, IAX2, AGI-Skripte, Sicherheit und Tipps zum praktischen Betrieb – 2.11.2022: Diese Seite richtet sich an jene, welche einen Asterisk-Telefon-Server auf einem Raspberry Pi betreiben möchten und später ein kleines Netzwerk aus Asterisk-Servern planen, um ein eigenständiges Telefonnetz aufzubauen. Los geht es mit der Installation von Raspbian und Asterisk auf einem Raspberry Pi und dann nach Lust und Laune immer tiefer in die Programmierung von Asterisk. Die Themen werden laufend erweitert.

Selbstverständlich muss es nicht unbedingt ein Raspberry Pi sein. Andere Linux-Rechner gehen auch. – weiter