diemilz
Goto Top

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". face-smile

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

Content-ID: 331401

Url: https://administrator.de/contentid/331401

Ausgedruckt am: 24.11.2024 um 23:11 Uhr

LordGurke
LordGurke 09.03.2017 um 22:49:11 Uhr
Goto Top
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.
diemilz
diemilz 13.03.2017 aktualisiert um 14:20:05 Uhr
Goto Top
Ist Asterisk hier als VoIP-Client eingerichtet? Wie erfolgt denn die Anwahl und das Einspielen der Wave-Datei? Darf ich die Config der einzelnen Komponenten sehen, damit ich eine Vorstellung davon habe?
LordGurke
Lösung LordGurke 13.03.2017 um 21:49:13 Uhr
Goto Top
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:

[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.
diemilz
diemilz 27.03.2017, aktualisiert am 28.03.2017 um 15:10:32 Uhr
Goto Top
So, ich habe mir jetzt mal eine Lösung von unserem Systemhaus geben lassen, die das Ganze übernimmt. Wo es jedoch noch klemmt ist die Verbindung zwischen unserer Swyx-Anlage und dem Asterisk auf dem Linux-Server. Wir setzen unseren internen DNS-Domänennamen auch als SIP-Domain ein, jedoch wählt Asterisk als SIP-URI als Domain immer die IP-Adresse der Telefonanlage an. Ist das normal?

Update: Vergesst mein Post hier, habe den Fehler selbst beheben können. Habe zwar noch ein weiteres Problem, aber dazu mache ich einen neuen Thread auf.