Linux Sprachsynthese für Monitoring
Hallo zusammen,
wir haben hier eine Anforderung für unser neues Monitoring-System bekommen (Check_mk Enterprise 1.2.8p18). Um das besser beschreiben zu können, ein paar Details vorweg.
Check_mk läuft auf einem HP DL380G7-Server (Debian 8, ohne GUI, nicht virtualisiert), unsere Swyx-Telefonanlage (SIP-Client-fähig) auf einem Windows Server 2012 R2 (virtualisiert), als Mailsystem setzen wir Exchange 2016 ein (ebenfalls 2012 R2, virtualisiert).
Die Anforderung lautet nun, dass bei Ausfall bestimmter Hosts oder Services ein Telefonanruf generiert werden soll. Über Sprachsynthese soll dann eine vordefinierte Nachricht (E-Mail, Push, etc.) vorgelesen werden. Dabei soll berücksichtigt werden, dass für die Abarbeitung dieses Vorgangs nach Möglichkeit nur die Swyx-Anlage bemüht werden soll, sprich alles soll sich nur auf dem Check_mk-Server abspielen. Würde auch durchaus Sinn machen, der Check_mk-Server ist ein ehemaliger ESXi-Testhost gewesen und langweilt sich jetzt mit "dem bisschen Linux".
Meine Idee hierbei wäre folgende:
Hat jemand Erfahrung mit solchen Konstrukten und kann mir da weiterhelfen?
Gruß
diemilz
wir haben hier eine Anforderung für unser neues Monitoring-System bekommen (Check_mk Enterprise 1.2.8p18). Um das besser beschreiben zu können, ein paar Details vorweg.
Check_mk läuft auf einem HP DL380G7-Server (Debian 8, ohne GUI, nicht virtualisiert), unsere Swyx-Telefonanlage (SIP-Client-fähig) auf einem Windows Server 2012 R2 (virtualisiert), als Mailsystem setzen wir Exchange 2016 ein (ebenfalls 2012 R2, virtualisiert).
Die Anforderung lautet nun, dass bei Ausfall bestimmter Hosts oder Services ein Telefonanruf generiert werden soll. Über Sprachsynthese soll dann eine vordefinierte Nachricht (E-Mail, Push, etc.) vorgelesen werden. Dabei soll berücksichtigt werden, dass für die Abarbeitung dieses Vorgangs nach Möglichkeit nur die Swyx-Anlage bemüht werden soll, sprich alles soll sich nur auf dem Check_mk-Server abspielen. Würde auch durchaus Sinn machen, der Check_mk-Server ist ein ehemaliger ESXi-Testhost gewesen und langweilt sich jetzt mit "dem bisschen Linux".
Meine Idee hierbei wäre folgende:
- Check_mk generiert eine Nachricht in Form einer reinen Textdatei in einem Verzeichnis auf der Platte.
- Ein Programm/Skript prüft dieses Verzeichnis nach neuen Nachrichten und wandelt diese per Text-to-Speech-Synthese in eine wav-Datei um.
- Ist eine neue Nachricht vorhanden, wird über einen installierten Konsolen-SIP-Client (LinPhone, o.ä.) ein Anruf generiert und nach Abnahme die wav-Datei abgespielt.
Hat jemand Erfahrung mit solchen Konstrukten und kann mir da weiterhelfen?
Gruß
diemilz
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 331401
Url: https://administrator.de/contentid/331401
Ausgedruckt am: 24.11.2024 um 23:11 Uhr
4 Kommentare
Neuester Kommentar
Habe ich so hier laufen mit der Konstellation aus "picotts" und einer Asterisk, die direkt raustelefoniert.
PicoTTS ist der Dienst, der auch unter Android die TTS-Erzeugung übernimmt und kann direkt auf der Konsole per Parameter mit dem zu sprechenden Text gefüttert werden. Dieser Audiostream fällt als Wave-Datei hinten raus und kann von der Asterisk mit wenig Aufwand quasi live abgespielt werden.
PicoTTS ist der Dienst, der auch unter Android die TTS-Erzeugung übernimmt und kann direkt auf der Konsole per Parameter mit dem zu sprechenden Text gefüttert werden. Dieser Audiostream fällt als Wave-Datei hinten raus und kann von der Asterisk mit wenig Aufwand quasi live abgespielt werden.
Die Asterisk arbeitet wie ein Client und ruft per Callfile (oder wenn man mag per ARI) einen Teilnehmer an, der alarmiert werden soll ("B-Teilnehmer").
Sobald der Anruf beantwortet wird, wird der Anruf intern auf ein Macro verbunden, welches per TTS den Text generiert - hier mal ein Beispiel:
"pico2wave" ist die TTS-Engine, mit "sox" wandle ich jedoch das Format in etwas für Asterisk lesbares um und reduziere die Lautstärke, da es sonst massiv übersteuert.
Über das Callfile / ARI kann dem Macro der Parameter mitgegeben werden (${ARG1}) aus welchem der Text für das TTS gelesen wird.
Eventuell muss man ein weiteres Macro bauen, welches mehrfach hintereinander TTS für den Anruf generiert, da in Asterisk Variablen maximal 255 Zeichen lang werden können.
Generell kann es auch sinnvoll sein nicht direct pico2wave aufzurufen sondern das ganze durch einen Wrapper zu schicken der bestimmte Strings ersetzt. Da pico2wave nicht zwischen zwei Sprachen wechseln kann müssen manche Begriffe oder Abkürzungen transliteriert werden damit man versteht was gemeint ist.
So ersetze ich in einem Wrapper z.B. den String "SQL" durch "Esskuhel", damit das am Telefon überhaupt verstanden werden kann.
Sobald der Anruf beantwortet wird, wird der Anruf intern auf ein Macro verbunden, welches per TTS den Text generiert - hier mal ein Beispiel:
[macro-tts]
exten => s,1,Set(TTS_WORDS_TO_SAY=${ARG1})
same => n,System(/bin/mkdir '/tmp/asterisk-tts/')
same => n,System(/usr/bin/pico2wave -l 'de-DE' -w '/tmp/asterisk-tts/tts-tmp-${UNIQUEID}.wav' '${TTS_WORDS_TO_SAY}')
same => n,System(/usr/bin/sox -v 0.65 '/tmp/asterisk-tts/tts-tmp-${UNIQUEID}.wav' -r 8000 -s -c 1 -2 '/tmp/asterisk-tts/tts-playback-${UNIQUEID}.wav')
same => n,Playback(/tmp/asterisk-tts/tts-playback-${UNIQUEID},${ARG2})
same => n,System(/bin/rm '/tmp/asterisk-tts/tts-tmp-${UNIQUEID}.wav' '/tmp/asterisk-tts/tts-playback-${UNIQUEID}.sln')
"pico2wave" ist die TTS-Engine, mit "sox" wandle ich jedoch das Format in etwas für Asterisk lesbares um und reduziere die Lautstärke, da es sonst massiv übersteuert.
Über das Callfile / ARI kann dem Macro der Parameter mitgegeben werden (${ARG1}) aus welchem der Text für das TTS gelesen wird.
Eventuell muss man ein weiteres Macro bauen, welches mehrfach hintereinander TTS für den Anruf generiert, da in Asterisk Variablen maximal 255 Zeichen lang werden können.
Generell kann es auch sinnvoll sein nicht direct pico2wave aufzurufen sondern das ganze durch einen Wrapper zu schicken der bestimmte Strings ersetzt. Da pico2wave nicht zwischen zwei Sprachen wechseln kann müssen manche Begriffe oder Abkürzungen transliteriert werden damit man versteht was gemeint ist.
So ersetze ich in einem Wrapper z.B. den String "SQL" durch "Esskuhel", damit das am Telefon überhaupt verstanden werden kann.