Sprachsteuerung

Die fertige Lösung Jasper übernimmt die Sprachsteuerung aus dem Raspberry Pi bzw. Linux Betriebssystemen. Der „Artikel“ im folgenden sind Aufzeichnungen mit einigen Versuchen die ich selber ausprobiert haben und dient nur als Referenz!

UPDATE: Nach einigen Versuchen bin ich der Meinung, dass die Sprachqualität dem Aufwand der Einrichtung in keiner Weise gerecht wird. Bessere Lösungen sind Systeme wie Watson und Co.

Sound testen

Sound testen (http://www.aonsquared.co.uk/raspi_voice_control)

arecord -d 10 -D plughw:1,0 test.wav
aplay test.wav

Möglichkeiten der Sprachsteuerung

Google API

Das Problem besteht darin, dass Google immer alle gesprochenen Informationen bekommt. Das möchte man nicht wirklich.

Julius

CMUSphinx / pocketsphinx

http://www.moop.org.uk/index.php/2013/08/10/voice-controlled-lights/

http://stackoverflow.com/questions/17778532/raspberrypi-pocketsphinx-ps3eye-error-failed-to-open-audio-device

    sudo apt-get install autoconf libtool automake bison
    sudo apt-get install gstreamer0.10-pulseaudio libao4 libasound2-plugins libgconfmm-2.6-1c2 libglademm-2.4-1c2a libpulse-dev libpulse-mainloop-glib0 libpulse-mainloop-glib0-dbg libpulse0 libpulse0-dbg libsox-fmt-pulse paman paprefs pavucontrol pavumeter pulseaudio pulseaudio-dbg pulseaudio-esound-compat pulseaudio-esound-compat-dbg pulseaudio-module-bluetooth pulseaudio-module-gconf pulseaudio-module-jack pulseaudio-module-lirc pulseaudio-module-lirc-dbg pulseaudio-module-x11 pulseaudio-module-zeroconf pulseaudio-module-zeroconf-dbg pulseaudio-utils oss-compat
    sudo cp -pf /etc/asound.conf /etc/asound.conf.ORIG 
    echo 'pcm.pulse {
        type pulse
    }
    
    ctl.pulse {
        type pulse
    }
    
    pcm.!default {
        type pulse
    }
    
    ctl.!default {
        type pulse
    }' | sudo tee /etc/asound.conf
    
    
    #Change default sound driver from alsa to pulseaudio
    #######################################################
    sudo cp -fvp /etc/libao.conf /etc/libao.conf.ORIG
    sudo sed -i "s,default_driver=alsa,default_driver=pulse,g" /etc/libao.conf 
    
    # daemon settings according to Pi-Musicbox ( https://github.com/woutervanwijk/Pi-MusicBox )
    sudo cp -fvp /etc/pulse/daemon.conf /etc/pulse/daemon.conf.ORIG
    
    echo "
    # ScarlettPi added this
    high-priority = yes
    nice-level = 5
    exit-idle-time = -1
    resample-method = src-sinc-medium-quality
    default-sample-format = s16le
    default-sample-rate = 48000
    default-sample-channels = 2" | sudo tee -a /etc/pulse/daemon.conf
    
    # Add pi user to the pulse access group
    #######################################################
    sudo adduser pi pulse-access
    sudo shutdown -r now

    mkdir cmusphinx
    cd cmusphinx
    wget sphinxbase-0.8 und pocketsphinx-0.8 (<a href="http://cmusphinx.sourceforge.net/wiki/download" target="_blank" rel="noopener noreferrer">CMUSphinx Download Seite</a>)
    tar -xvzf pocketsphinx-0.8.tar.gz
    tar -xvzf sphinxbase-0.8.tar.gz
    
    cd sphinxbase-0.8
    ./autogen.sh
    ./configure
    make
    sudo make install
    cd -
    
    cd pocketsphinx-0.8
    export LD_LIBRARY_PATH=/usr/local/lib
    export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
    ./configure
    make
    sudo make install

Test

pocketsphinx_continuous

http://www.speech.cs.cmu.edu/tools/lmtool.html

    $ cat voice.txt
    ALFRED LIGHT ONE ON
    ALFRED TV ON
    ALFRED TV OFF
    ALFRED SLEEP
    JAMES HELLO
    ALFRED HELLO
    $ wget YOUR FILE
    $ tar -xvzf TAR1354.tar.gz
    1354.corpus
    1354.dic
    1354.lm
    1354.sent
    1354.sent.arpabo
    1354.token
    1354.vocab
    $ pocketsphinx_continuous -lm 1354.lm -dict 1354.dic  -silprob  0.1 -wip 1e-4 -bestpath 0
    READY....
    Listening...
    Stopped listening, please wait...
    000000000: ALFRED LIGHT ONE ON
    READY....

## pocketsphinx_continous zu alfred

    mkdir alfred
    cd alfred
    cp ./pocketsphinx-0.8/src/programs/continuous.c alfred.c
    gcc -g -O2 -Wall -I/usr/local/include/sphinxbase -I/usr/local/include/pocketsphinx -lsphinxad -lsphinxbase -lpocketsphinx alfred.c -o alfred
    
    ./alfred -lm ../1354.lm -dict ../1354.dic -silprob 0.1 -wip 1e-4 -bestpath 0
    
    static void
    sayfestival(const char* text)
    {
    	// No command processor
    	if (system(NULL) == 0)
    		return;
    	
    	printf("%sn", text);
    	
    	const char* festivalcmdstart = "echo '";
    	const char* festivalcmdend = "' | festival -b --tts";
    	char* command = malloc(strlen(festivalcmdstart) + strlen(text) + strlen(festivalcmdend) + 2);
    	if (command)
        {	
    		if (sprintf(command, "%s %s %s", festivalcmdstart, text, festivalcmdend) > 0)
            {
    			system(command);
    		}
    		free(command);
    	}
    }
    	
    static void
    fhemparse(const char* hyp)
    {	
    	if (!hyp)
    		return;
    
    	char word[256];
    	
    	sscanf(hyp, "%s", word);
    	if (strcmp(word, "ALFRED") != 0) {
    		printf("Not for alfred :(n");
    		return;
    	}
    	
    	if (strcmp(hyp, "ALFRED TV ON") == 0) {
    		sayfestival("Turning TV on!");
    	}
    }

    READY....
    Listening...
    Stopped listening, please wait...
    TEXT:000000000:HUGO HELLO
    Not for alfred :(
    READY....
    Listening...
    Stopped listening, please wait...
    TEXT:000000001:ALFRED TV ON
    Turning TV on!

Julius

http://julius.sourceforge.jp/en_index.php?q=index-en.html

http://www.raspiprojects.com/raspberry-pi-voice-recognition-julius.html

    sudo apt-get install alsa-tools alsa-oss flex zlib1g-dev libc-bin libc-dev-bin python-pexpect libasound2 libasound2-dev cvs
    cvs -z3 -d:pserver:anonymous@cvs.sourceforge.jp:/cvsroot/julius co julius4
    export CFLAGS="-O2 -mcpu=arm1176jzf-s -mfpu=vfp -mfloat-abi=hard -pipe -fomit-frame-pointer"
    cd julius4
    ./configure --with-mictype=alsa
    make
    sudo make install

    export ALSADEV="plughw:1,0"

    julius --help

http://bloc.eurion.net/archives/2008/writing-a-command-and-control-application-with-voice-recognition/ VOCA UND GRAMMAR FILES http://www.voxforge.org/home/dev/acousticmodels/linux/adapt/htkjulius/live-testing

    mkdfa.pl alfred
    alfred.grammar has 1 rules
    alfred.voca    has 4 categories and 11 words
    ---
    Now parsing grammar file
    Now modifying grammar to minimize states[-1]
    Now parsing vocabulary file
    Now making nondeterministic finite automaton[5/5]
    Now making deterministic finite automaton[5/5]
    Now making triplet list[5/5]
    4 categories, 5 nodes, 4 arcs
    -> minimized: 5 nodes, 4 arcs
    ---
    generated: alfred.dfa alfred.term alfred.dict

    julius -quiet -input mic -C julian.jconf 2>/dev/null | ./command.py
Raspberry Pi Dashboard mit Dashing

Dashing bietet ein Framework um Raspberry Pi Dashboards einfach zu erstellen. Wenige Handgriffe reichen zum Anzeigen des Dashboards im Kioskmodus. Dadurch lassen sich wichtige Daten im Büro oder zuhause in seiner gesamten Größe darstellen.

Smashing Dashing installieren

_Mit einem aktuellen Ruby kann mittels gem direkt aufgerufen werden um Dashing zu installieren._

$ sudo apt-get install ruby-dev
$ sudo apt-get install nodejs
$ sudo /usr/bin/gem install dashing
$ sudo /usr/bin/gem install bundler
$ dashing new sweet_dashboard_project
$ cd sweet_dashboard_project
$ bundle
$ dashing start

Das Dashboard ist nun erreichbar unter der Adresse localhost:3030.

UPDATE 20.09.2017: Dashing ist eingestellt und der Nachfolger heißt Smashing. Die Installation ist aber ähnlich wie folgt.

$ sudo apt-get install ruby-dev
$ sudo apt-get install nodejs
$ sudo gem install bundler
$ sudo gem install smashing
$ smashing new dashboard_project
$ cd dashboard_project
$ bundle
$ smashing start

Falls Fehler aufgrund einer zu kleinen Ruby Version auftreten gibt es hier ein Skript für die Installation von Ruby 2.4. Danach die folgenden Kommandos ausführen und wieder mit der Installation von oben weitermachen.

$ gem install rubygems-update
$ sudo update_rubygems
$ sudo gem install rack-test -v 0.7.0

Chromium und Mauszeiger verstecken

Durch unclutter kann der Mauszeiger versteckt werden. Chromium bietet einen einfachen Webbrowser mit Kioskmodus und X11VNC ist ein schlanker XServer. Ist der Raspberry Pi mit einer grafischen Oberfläche installiert kann auch der dort vorhandene XServer genutzt werden.

$ sudo apt-get install unclutter x11vnc chromium-browser

Erster Test

Jetzt ist es an der Zeit für den Test des Raspberry Pi Dashboards.

$ startx &
$ export DISPLAY=:0.0
$ chromium-browser --kiosk --ignore-certificate-errors --disable-sync
--disable-restore-session-state http://localhost:3030

Der Fehler „Failed to load NSS libraries“ wird durch den folgenden Aufruf behoben.

$ sudo ln -s /usr/lib/arm-linux-gnueabihf/nss/ /usr/lib/nss

Autostart

Damit das Raspberry Pi Dashboard immer beim Start erscheint ist eine Anpassung der Konfiguration notwendig (Referenz).

$ cd ~/.config
$ mkdir autostart
$ cd autostart

Im Anschluss wird der Autostart für Chromium angelegt.

$ vi chromium.desktop
[Desktop Entry]
Type=Application
Name=chromium
Exec=chromium --kiosk  localhost:3030
StartupNotify=false
Terminal=false
Hidden=false

Danach erfolgt der Autostart für X11VNC.

$ vi x11vnc.desktop
[Desktop Entry]
Encoding=UTF-8
Type=Application
Name=X11VNC
Exec=x11vnc -forever -shared -usepw -display :0 -ultrafilexfer
StartupNotify=false
Terminal=false
Hidden=false

Powersave verhindern

Möglichkeit 1: Konfiguration

Eine Konfigurationsänderung verhindert das Abschalten des Monitors (Referenz).

$ sudo vi /etc/lightdm/lightdm.conf
xserver-command=X -s 0 –dpms

Möglichkeit 2: Bewegungserkennung

Mittels Bewegung lässt sich der Monitor aktivieren. (Bewegungserkennung einrichtenReferenz)

$ sudo chmod u+s /bin/chvt
motion.conf
# Den Monitor für 1 Minute aktiv schalten
gap 60
# Monitor bei Bewegung einschalten
on_event_start /opt/vc/bin/tvservice -p ; chvt 6; chvt 7
# Nach der gap Zeit wieder ausschalten
on_event_end /opt/vc/bin/tvservice -p; /opt/vc/bin/tvservice -o

# OPTIONAL: speichern von Bildern deaktivieren
ffmpeg_cap_new off
ffmpeg_cap_motion off
output_normal off
output_motion off

Weitere Widgets

Eine Liste von Widgets gibt es auf dem Smashing Wiki der Github Webseite. Hier ist eine Auswahl der Plugins die ich ausprobiert habe. Die Installation ist leider bei jedem Add-On individuell außer es sind GIST Datien, dann hilftsmashing install GIST_ID.

Bestimmte Plugins benötigen weitere Gems. Diese sind in die Gemfile Datei einzubinden!

Nicht funktionierende Widgets.

  • Daily Dilbert – Dilbert Comics (benötigt gem ‚chronic‘ ) – Verzögert den Start erheblich?!
  • RSS – Zeigt nur von wenigen Webseiten die RSS/Atom Feeds an.

Nicht getestet.

Raspberry Pi Bewegungserkennung

Neben der Sprachsteuerung lässt sich der Raspberry Pi auch für die Bewegungserkennung und Raumüberwachung nutzen. Mit dem „motion“ Paket lässt sich der Pi in ein Motion Detection Device verwandeln.

Motion

Die PS3 EyeToy Kamera besitzt neben dem Mikrofon auch eine brauchbare Kamera. Mitels lsusb kann die korrekte Erkennung der Kamera ermittelt werden.

$ lsusb
Bus 001 Device 005: ID 1415:2000 Nam Tai E&E Products Ltd. or OmniVision Technologies, Inc. Sony Playstation Eye

Das motion Paket wird benötigt.

$ sudo apt-get install motion

Nach der Installation muss die Konfiguration angepasst werden. Die Datei motion.conf enthält die notwendingen Informationen.

$ sudo vi /etc/motion/motion.conf
daemon on
width 640
height 480

Damit ist der Hintergrunddienst aktiv und die Auflösung angepasst. Um die Kamera testen zu können, kann motion per Kommandozeile aufgerufen werden. Ein normales Starten, im Hintergrund, ist ohne den -n Parameter möglich.

$ sudo motion -n

Events

Die Events On_motion_detected, on_event_start und on_event_end können mit Skripten belegt werden. Bilder können beispielsweise auch mittels FTP hochgeladen werden (Referenz).

on_picture_save wput –B ftp://username:password@yourftpserver %f
Spracherkennung mit Google Speech API

Mit dem Raspberry Pi sprechen ist eine spannende Sache. Die Google Speech API v2 ist eine einfache Möglichkeit dafür.

In einem älteren Artikel hatte ich bereits die API erwähnt. Dort hatte ich die Nutzung aber aufgrund der Situation, Daten an Google zu schicken, ausgeschlossen. Mittlerweile kamen jedoch ein paar Anfragen zu dem Thema, so dass ich dies hier noch einmal aufgreifen möchte. Viele Artikel im Internet sind leider veraltet und greifen auf Version 1 zurück. Daher gibt es hier eine vollständige Beschreibung für V2 inklusive Key Generierung.

UPDATE Juni 2018: Leider ist auch die v2 API mittlerweile veraltet. Grundsätzlich funktioniert der Ansatz hier noch. Lediglich das Ziel ist etwas anders. Siehe die Kommentare unten oder die Beispiele auf der Google Speech API Webseite.

ALSA und co

Die Einrichtung der Soundkarte funktioniert wie im anderen Artikel beschrieben.

Zusätzliche Module

$ sudo apt-get install flac
$ sudo apt-get install python-pycurl

API Key generieren

Zuerst muss die chromium-dev@chromium.org subscribed werden. Dies ist nötig, damit in der Google Clound Console die Option für die Speech API erscheint. Bei dem subscriben ist es aber möglich das Benachrichtigen per E-Mail zu deaktivieren! Anschließend auf der Developer Console ein Projekt erstellen und unter API die „Speech API“ aktivieren. Danach im Bereich „public key access“ den „Key for browser applications“ erstellen.

Das Skript

Den folgenden Inhalt in eine Datei „text2speech.sh“ kopieren und mittels „$ chmod +x text2speech.sh“ ausführbar machen.

#!/bin/bash

KEY="DEN_KEY_HIER_EINTRAGEN"
URL="https://www.google.com/speech-api/v2/recognize?output=json&lang=en-us&key=$KEY"

echo "Recording... Press Ctrl+C once to Stop and WAIT."
arecord -D plughw:0,0 -f cd -t wav -d 0 -q -r 16000 | flac - -s -f --best --sample-rate 16000 -o file.flac;

echo "Processing..."
wget -q -U "Mozilla/5.0" --post-file file.flac --header "Content-Type: audio/x-flac; rate=16000" -O - "$URL" >stt.txt

echo -n "Google reply: "
cat stt.txt

rm file.flac  > /dev/null 2>&1

Output

Die Ausgabe erfolgt im JSON Format. Dieser kann weiter verarbeitet werden. Das Projekt Pi Translate bietet ein Python Skript mit Textoutput an. Hier muss aber in der Datei „text-to-translate.py“ die letzte Zeile auskommentiert werden, andernfalls werden noch Übersetzungsprogramme durchgeführt. Am Anfang der Datei ist ein Feld für den Key.

Update: Zum parsen der JSON Datei in dem Skripte die Zeile „cat stt.txt“ mit dem folgenden Aufruf ersetzen:

cat stt.txt  | sed -e 's/[{}]/''/g' | awk -F":" '{print $4}' | awk -F"," '{print $1}' | tr -d 'n'

Referenzen: Raspberry Pi Voice Recognition Works Like Siri

Shodan – Security Suchmaschine oder Traum der Hacker

Shodan - das Google für Hacker? Ein Eishockeystadien, ISPs, IP Kameras und tausende offene Router im Internet, auffindbar mit einer Suchmaschine? Hier geht es um die Möglichkeiten für Unternehmen, die eigene Sicherheit zu erhöhen und eine Kurzanleitung zur Benutzung.

Die Suchmaschine Shodan ermöglicht die Suche nach Servern/Routern/PCs/Smartphones (also allem, was im Internet erreichbar ist – inklusive SCADA Systeme), Ländern, IP-Adressen, Ports, Bannern und vielem mehr.

Bereits auf der Defcon 18 (2010 SHODAN for Penetration Testers Michael Schearer Part – YouTube) und Defcon 20 (Dan Tentler – Drinking from the caffeine firehose we know as shodan – YouTube) gab es Fachvorträge zu der Suchmaschine. Dort wurde gezeigt, dass auch Krematorien, Eishockeystadien, ISPs, Überwachungskamera, Ampelanlagen, Waschstraßen und viele andere Geräte öffentlich erreichbar waren. Viele der Geräte wurden nie korrekt konfiguriert, so dass die Default Passwörter noch immer funktionieren.

Allein die Tatsache, dass die Suchmaschine solche Geräte einfach auffinden lässt hat in der Presse ein schlechtes Licht auf die Webseite geworden. Allerdings bietet Shodan für Sicherheitsforscher und Administratoren eine einfache Möglichkeit die eigene Serverfarm zu prüfen (sofern die Server bereits indiziert wurden). Alle Systeme die aus Gründen der Bequemlichkeit, ungesichert erreichbar sind, würden auch durch andere Wege auffindbar sein.

Häufige Suchen

Shodan bietet eine Seite für die häufigsten Suchanfragen. Die Liste gibt einen guten Einblick in das Potential der Suchmaschine.

Auf Platz eins steht die Suche nach Webcams, Netcam, Cameras und ähnlichen Schreibweisen. Oft sind Überwachungskameras ungesichert im Netz erreichbar. Bei einigen Kameras funktioniert sogar die Steuerung über ein Webinterface. So kann die Kamera bewegt und gezommt werden. Damit lassen sich viele Informationen, wie Firmennamen und Anwesenheitszeiten, ermitteln.

Ebenfalls in der Top10 ist die Suche nach „default password“, also Zugängen mit voreingestellten Benutzernamen und Passwortkombinationen. Die Ergebnisse sind potentiell erreichbare Seiten. In vielen Fällen steht das ursprüngliche Passwort nur in einem Infotext. Andere Systeme sind aber direkt erreichbar.

Die Suche zu „Anonymous access granted“ zeigt frei nutzbare FTP Server.

Sehr beliebt ist die Suche nach „scada“. Hinter den Ergebnissen finden sich viele Steuerungsgeräte für Infrastrukturkomponenten. Aus Gründen der Bequemlichkeit oder zum Einsparen von Mitarbeitern sind viele Systeme online erreichbar, um eine Fernwartung zu ermöglichen. Allerdings wird die Absicherung der Systeme oft nur unzureichend oder schlimmstenfalls überhaupt nicht durchgeführt. Das ermöglicht interessante Szenearien, wie das ausschalten der Kühlung eines Eishockeystadions (warum zur Hölle ist das im Internet erreichbar?!).

Eigene Suche

Ähnliche wie Google können bei Shodan die Suchergebnisse mit Filtern verfeinert werden. Als Operatoren sind +-| zugelassen. Also das ein- und ausschließen von Worten und das Oder. Filter werden mit einem Doppelpunkt (: ohne Leerzeichen) angegeben. Die folgenden Beispiele sind teilweise der Hilfe von Shodan entnommen.

city/country erlauben die Suche nach Städten und Ländern.

Bsp.: nginx city:"San Diego"; country:US (Ngix Server in San Diego, USA)

geo nimmt GPS Koordinaten und Entfernungen an.

Bsp.: apache geo:32.8,-117,50 (Apaches im Umkreis von 50km um 32.8,-117)

hostname filtert nach Domains oder Hostnamen.

Bsp.: iis hostname:.de (Microsoft IIS Server in Deutschland)

net schränkt die Ergebnisse auf IPs und Subnetze ein.

Bsp.: net:216.219.0.0/16 (Daten im Subnetz 216.219.*)

os ist der Filter für Betriebssysteme (windows, linux, cisco, …).

Bsp.: microsoft-iis os:"windows 2003" (Microsoft IIS auf Windows 2003)

port bietet eine Filterung auf Ports.

Bsp.: proftpd port:21 (ProFTPd auf Port 21)

before/ after sucht Daten die in dem Zeitraum gesammelt wurden.

Bsp.: apache after:22/03/2010 before:4/6/2010 (Apaches aus der Zeit von 22.03.2010 bis 4.6.2010)

Nutzen für Unternehmen

Wie kann nun das eigene Unternehmen von diesen Daten profitieren? Zum einen ist eine allgemeine Suche nach dem Firmennamen möglich. In den Ergebnissen werden alle Geräte auftauchen die in irgendeiner Art mit den Namen im Zusammenhang stehen. Bei Webservern beispielsweise die gesicherten Webserver über die Angaben in den SSL Zertifikaten oder die Banner von FTP Server mit einem Begrüßungstext.

Zusätzlich kann mittels net: oder hostname: Filter eine Suche auf die eigenen Domains erfolgen oder mittels ip eine Suche auf die Subnetze der Firma. Sofern Shodan bereits die Server im Index hat, gibt es möglicherweise interessante Ergebnisse.

Maltego und Shodan

Wie in dem Artikel Securitysoftware und Scanner erwähnt ist Maltego eine Software zum Erstellen von Topologien. Shodan bietet ein Add-On für Maltego an, um die Suchergebnisse einbinden zu können. Damit lassen sich Abhängigkeiten zwischen bekannten Systemen grafisch aufbereiten.