Archiwa tagu: Python

Raspberry pi + python + wit.ai – rozpoznawanie tekstu… i mowy

Jestem wyszukiwaczem/poszukiwaczem/researcherem jak zwał tak zwał.

Szukałem informacji na temat rozpoznawania mowy w raspberry Pi

Pierwsze na co się natknąłem to system rozpoznawania mowy googli (zgrywamy plik na maline wysylamy na serwer googli ktory to przetwarza i zwraca nam tekst który powiedzieliśmy)

Kolejny był offlinowy cmu sphinx który jest przeznaczony na inne rynki niż nasz ojczysty.. walczyłem parę ładnych dni żeby go przystosować do naszej mowy – klęska.

W między czasie trafiłem na ciekawy projekt https://wit.ai ale do końca go nie zrozumiałem i skupiłem się na szukaniu innych, mniej lub bardziej ciekawych programów. Po paru tygodniach przeczytałem że Facebook kupił całego WIT’a więc nie może być tak źle i zacząłem działać.

wit – jest to system rozpoznawania mowy i pisma. Po  zrobieniu małego konfigu na stronie i nauczenie całego systemu tego co mam na myśli i co chce żeby wit robił, system działa i jestem z niego zadowolony.

Opisze szybką instalacje i mniej więcej wykorzystanie mojej aplikacji na malinie albo czym kolwiek z pythonem (skupiam się na raspberry pi 2)

Rejestracji i konfiguracji całości na stronie wit’a nie opisze (może w przyszłości).

W manualu na stronie https://wit.ai/docs/python/1.0.0/quickstart jest dużo przykładów jak co z czym zrobić żeby działało, ja niestety miałem parę problemów (błachych) ale jednak były.

potrzebne będą nam pakiety

 

sudo apt-get install python-dev python-pip libsox-dev libffi-dev
sudo pip install pip --upgrade
sudo pip install 'requests[security]'

Teraz tworzymy plik. WAŻNE !!! Plik nie może nazwywać się wit.py więc u mnie jest to witai.py

a jego zawartość to

import wit
import json
import sys
reload(sys)
sys.setdefaultencoding('UTF8')
wit.init()
response = wit.text_query(sys.argv[1], "ZDHR3SDICNCWG3LRLDV3SPE37L5V7YC5")
z = json.loads(format(response))
wit.close()

wit1

a działa To tak :

wit2

python witai.py „kim był Jan Matejko”

Wysyłamy tekst do wit’a i otrzymujemy odpowiedz w json

[wit] received response: {„_text”:”kim był Jan Matejko”,”msg_id”:”e091c02d-02d1-4502-a7cc-3e69cceb386a”,”outcomes”:[{„_text”:”kim był Jan Matejko”,”confidence”:0.994,”entities”:{},”intent”:”szukaj”}]}

dla nas ważny jest intent – czyli nasz zamiar( nie wiem jak dokładnie to przetłumaczyć)

intent – jest zaprogramowaną opcja dzięki temu możemy zrobić wyszukiwarkę

intent

np:

 

import wit
import json
import sys
import os
import requests
reload(sys)
sys.setdefaultencoding('UTF8')

wit.init()
response = wit.text_query(sys.argv[1], "ZDHR3SDICNCWG3LRLDV3SPE37L5V7YC5")
z = json.loads(format(response))
wit.close()
intent = z["outcomes"][0]["intent"]
dane = z["outcomes"][0]["_text"]
print intent+dane
if intent == "szukaj":
r = requests.get('http://searx.me/?format=json&q=%21go%20' + dane)
z = r.json()
w1 = z["results"][0]["content"]
print w1

wit3

jak widać na powyższym przykładzie. Wit idealnie rozpoznał czy czegoś szukam w połączeniu z searx.me został podany pierwszy wynik z tej wyszukiwarki :-).Rozpoznał że chce usłyszeć kawał – sentencje więc nie wyszukiwał .

Miłej zabawy z IF’ami 🙂

Klucz który jest podany w przykładzie jest publiczny 🙂

i na koniec mała niespodzianka 🙂 jeśli chcecie zobaczyć jak rozpoznaje głos

Wejdźcie na strone

https://labs.wit.ai/speech/index.html

w polu tekstowym wpiszcie klucz

ZDHR3SDICNCWG3LRLDV3SPE37L5V7YC5

Nie zapomnijcie o naciśnięciu save

No i można już naciskać na szary mikrofon, mikrofon zmieni kolor na czerwony w tym czasie należy coś powiedzieć do niego. Jeśli już nie chcemy mówić naciskamy na czerowny mikrofon i czekamy chwile. W okienku powinien nam się pojawić wynik.

Powodzenia!

Twitter i Python

Cały czas zależy mi na zdalnej kontroli

było parę opcji

1. Facebook massanger – niestety FB postanowiło całkowicie zmienić messangera  i praktycznie zablokowało dostęp spod lini komend (w tym pythona itp.)

2. Google talk (hangaut) – sprawa taka sama jak w przypadku FB

3. Pushbullet (pushbullet.com) – niby działa opisze to w jakimś przyszłym wpisie. Ale mało osób to posiada

4. brak pomsyłów

5. od jakiegoś czasu siedzę na twitterze https://twitter.com/xkawakx więc czemu nie 🙂

W CAŁOŚCI OPIERAŁEM SIĘ NA RÓŻNYCH PRZYKŁADACH ZNALEZIONYCH W INTERNECIE!!! ( CZĘŚĆ KODU JEST DLA MNIE NIE ZROZUMIAŁA – ALE DZIAŁA)

instalacja jest banalnie prosta

sprowadza się do 4 komend

sudo apt-get install python-pip sudo python-dev libffi-dev libssl-dev
sudo sudo pip install --upgrade pip
sudo pip install tweepy
sudo pip install 'requests[security]'


isntalacja to jakieś 5 minut na raspberry pi 2

Tweepy chyba najpopularniejszy klient twittera pod pythona. U mnie działa !!!

Skoro instalacja była prosta 🙂 to konfiguracja musi być zakręcona

Ja założyłem nowe konto na twitterze specjalnie dla Alfreda i tej aplikacji

Ty drogi czytelniku zrobisz jak uważasz.

 

1. wchodzimy na strone https://apps.twitter.com/ i klikamy w „Create New App

tw1

2. wypełniamy cały formularz … zgadzamy się na warunki i klikamy na „Create Yout Twitter Application”

tw2

2a. Trzeba pamiętać żeby w twitterze był dodany numer telefonu inaczej nic z tego (sam się męczyłem z tym parę dni)

3. Insteresuje nas Załadka Permissions i opcja „Read, Write and Access direct messages” – bez niej Alfred nie będzie miał dostępu do prywatnych wiadomości a tak chce nim sterować

tw3

4. Po kliknięciu w update settings przechodzimy do zakładki „Keys and Access Tokens

4a. Nie wiem czy to jest wymagane ale na nowo wygenerowałem klucze klikając w „Regenerate Consumer Key and Secret

tw4

5. Klikamy na samemy dole w „Create my access token”

Mamy już wygenerowane wszystkie dane które są nam potrzebne

tw4

czyli

Consumer Key (API Key)

Consumer Secret (API Secret)

Access Token

Access Token Secret

 

Konfig i odpalenie

kod jest prosty szybki i dla mnie nic a nic nie zrozumiały (poza paroma wątkami)

import tweepy
import json
import os
import sys
reload(sys)
sys.setdefaultencoding('UTF8')
consumer_key = 'A4t1'
consumer_secret = 'jgK9A'
access_token = '33407265'
access_token_secret = 't6CegQ5RN8C'
c = '"'
s= ' '
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
api = tweepy.API(auth)
error = tweepy.error.TweepError
class CustomStreamListener(tweepy.StreamListener):
def on_direct_message(self,status):
decoded = json.dumps(status._json)
a = json.loads(decoded)
source = a['direct_message']['sender_id_str']
print a['direct_message']['sender_screen_name'] + "(" + a["direct_message"]["sender_id_str"] + ")" + ": " + a['direct_message']['text']
stream = tweepy.streaming.Stream(auth, CustomStreamListener())
streamuser = stream.userstream()
track_list = None
stream.filter( track_list)


 

Na początku importujemy to co potrzebujemy czyli

biblioteki

tweepy json os i sys

reload(sys)
sys.setdefaultencoding('UTF8')

to zmusza sprawia że polskie snaki są jako tako rozpoznawane

consumer_key = 'A4t1'
consumer_secret = 'jgK9A'
access_token = '33407265'
access_token_secret = 't6CegQ5RN8C'

 

 

uzupełniamy to naszymi danymi z twittera

auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
api = tweepy.API(auth)
error = tweepy.error.TweepError
class CustomStreamListener(tweepy.StreamListener):
def on_direct_message(self,status):

łączenie i ściaganie prywatnej wiadomości

decoded = json.dumps(status._json)
a = json.loads(decoded)

i tu niespodzianka która dla mnie do tej pory jest wielkim zaskoczeiem najpierw, najpierw musze zrzucić do dumpa status a nastepnie załadować go ponownie w json (zakręcone ale działą)

print a['direct_message']['sender_screen_name'] + "(" + a["direct_message"]["sender_id_str"] + ")" + ": " + a['direct_message']['text']

zabawa z wyświetlaniem sender_screen_name – wyświetlana nazwa osoby która do nas pisze , sender_id_str – id osoby i text jako tekst który się nam wyświetla

 

stream = tweepy.streaming.Stream(auth, CustomStreamListener())
streamuser = stream.userstream()
track_list = None
stream.filter( track_list)

pierdoły których nie rozumiem ale działają

Tak wygląda kod

twittwe

odpalamy normalnie

pyton plik.py

po odpaleniu wchodzimy na twittera i wysyłamy nową wiadomość do (bota) Alfreda

alfik

inalfi

To na tyle 🙂 w dalszych wpisach będzie rozwinięcie tematu

ustawienia czyli ConfigParser po ludzku :-)

Zaczynamy z grubej rury 🙂 tworzymy plik konfiguracyjny „.conf”

a to jego zawartość

[live]
Slowo = Alfred
Dzialanie = calyczas
Powiedziano = tak
[lokalizacja]
kraj =  Polska
Woj = Lubuskie
Miasto =  Gorzowwielkospolski
[api]
Pushbullet =
Ivona =
wit.ai =
[Wlasciciel]
Imie = Łukasz
Nick = Kawak
Wiek = 30
[inne]



Oczywiście dane które wpiszecie zależą od was, ja dałem tylko swoje przykłady.

W nawiasach kwadratowych jest nazwa sekcji (tak dla ułatwienia ale musi być)

u mnie to są sekcje

[live]

[lokalizacja]

[api]

[Wlasciciel]

[inne]

A w środku są dane, które mogą być definiowane po : albo = (u mnie jest to  =  )

Aby odczytać dane posłużymy się modułem/biblioteką ConfigParser

import ConfigParser
config = ConfigParser.ConfigParser()
config.readfp(open(r'.conf'))
nazwa = config.get('live', 'Slowo')
kraj = config.get('lokalizacja','kraj')
owner = config.get('Wlasciciel','Nick')
print nazwa
print kraj
print owner


Tłumaczenie

import ConfigParser  – importujemy biblioteke

config = ConfigParser.ConfigParser() – nasza zmienna „config” jest plikiem knfiguracyjnym

config.readfp(open(r'.conf')) – otwieramy i czytamy nasz plik konfigurayjny (r’.conf” to ścieżka do pliku)

nazwa = config.get('live', 'Slowo') – pobieramy dane z konfiga i przypisujemy do zmiennej (z sekcji live opcja Slowo)

kraj = config.get('lokalizacja','kraj') – sekcji lokalizacja opcja kraj i

owner = config.get('Wlasciciel','Nick') – wekcja Wlasciciel opcja nick

no i

print nazwa
print kraj
print owner

na tym kończymy nasz plik 🙂

a oto wynik

odczyt


Modyfikacja danych

 

import ConfigParser
config = ConfigParser.ConfigParser()
config.read(r'.conf')
config.set('api','Ivona',r'kluczapidoivony')
config.set('Wlasciciel','Nick',r'jakisnick')
with open(r'.conf', 'wb') as configfile:
config.write(configfile)

import ConfigParser
config = ConfigParser.ConfigParser()
config.read(r'.conf')

wyjaśniłem wyżej.

config.set('api','Ivona',r'kluczapidoivony') – zapis do nazwy sekcji i opcji ostatnia wartość to to co chcemy zapisać

config.set('Wlasciciel','Nick',r'jakisnick') – zmieniamy nick właściciela z kawak na „jakisnick”

with open(r'.conf', 'wb') as configfile:
(w tym miejscu pare spacji, żeby był odstęp) config.write(configfile)

– zapisujemy nasz config

Działa 🙂

zapis

feedparser + python = wiadomości

Do poprawnego działania skryptu potrzebujemy pakietu feedparser i dobrej strony która daje swoje wpisy w rss’ie

sudo pip install feedparser

i

http://www.tvn24.pl/najnowsze.xml

i

http://feeds.feedburner.com/dobreprogramy/Aktualnosci

Kolejność i wybór są na prawdę losowe.

 

import feedparser
import sys
reload(sys)
sys.setdefaultencoding('UTF8')
feedparser._HTMLSanitizer.acceptable_elements.remove('img')
rss = feedparser.parse('http://www.tvn24.pl/najnowsze.xml')
newsfeed1 = rss.entries[0]['title'] + '. ' + rss.entries[0]['description'] + '. ' + rss.entries[1]['title'] + '. ' + rss.entries[1]['description'] + '. ' + rss.entries[2]['title'] + '. ' + rss.entries[2]['description'] + '. ' + rss.entries[3]['title'] + '. ' + rss.entries[3]['description'] + '. '
newsfeed = newsfeed1.replace('"', '')
print newsfeed

 

import feedparser importujemy feedparsera
import sys
reload(sys)
sys.setdefaultencoding('UTF8')
wymuszamy kodowanie!
feedparser._HTMLSanitizer.acceptable_elements.remove('img') ustawiamy,żeby nie było zdjęć – czyli wycinamy wszystko co będzie w znacznikach <img></img>
rss = feedparser.parse('http://www.tvn24.pl/najnowsze.xml') importujemy naszego rss’a
newsfeed1 = rss.entries[0]['title'] + '. ' + rss.entries[0]['description'] + '. ' + rss.entries[1]['title'] + '. ' + rss.entries[1]['description'] + '. ' + rss.entries[2]['title'] + '. ' + rss.entries[2]['description'] + '. ' + rss.entries[3]['title'] + '. ' + rss.entries[3]['description'] + '. '
jedna długa linijka 🙂 czyli wyciągamy 3 wpisy dokładniej to ich tytuły i zawartość
newsfeed = newsfeed1.replace('"', '') zastępujemy ” niczym czli ”
print newsfeed wyświetlamy to co otrzymaliśmy.

 

wiad

Tak wiem, kolejny skrypt który wyświetla wynik w jednej linijce.

 


Dobre programy

#!/usr/bin/env python
#-*- coding: utf-8 -*-

import feedparser
import sys
reload(sys)
sys.setdefaultencoding(‚UTF8’)
feedparser._HTMLSanitizer.acceptable_elements.remove(‚img’)
rss = feedparser.parse(‚http://feeds.feedburner.com/dobreprogramy/Aktualnosci’)

newsfeeddp = rss.entries[0][‚title’] + ‚. ‚ + rss.entries[0][‚description’] + ‚. ‚ + rss.entries[1][‚title’] + ‚. ‚ + rss.entries[1][‚description’] + ‚. ‚ + rss.entries[2][‚title’] + ‚. $

newsfeeddp1 = newsfeeddp.replace(‚n’, ”)
newsfeeddp2 = newsfeeddp1.replace(‚&hellip;’, ”)

print newsfeeddp2

 

wiad2

 

Pythonowa pogoda :-)

Czas na prognozę pogody w pythonie.

To nie jest mój skrypt i cała chwała należy się użytkownikowi entat z dobrychprogramow – http://www.dobreprogramy.pl/Blog,entat,linux,179044,2.html

Na jego wpisie się oparłem http://www.dobreprogramy.pl/entat/Jezyki-skryptowe-na-co-dzien-cz.-4.-mala-stacja-meteo,52336.html ale to troszkę przerobiłem

Cały skrypt opiera się o stronę

http://www.meteoprog.pl/

Ściąga stronę w której jest wpisana nasza miejscowość, wyciąga z tej strony interesujące nas dane i je ładnie wyświetla.

Więc lecimy ze skrypcikiem

 

#!/usr/bin/python -*- coding: utf-8 -*-

import urllib, re, time
import sys
import os
www = urllib.urlopen('http://www.meteoprog.pl/pl/weather/' + sys.argv[1] )
www_tekst = www.read()
wyrazenie = '<meta property="og:description" content="(.+?)" />'
pogoda = re.findall(wyrazenie, www_tekst)
print pogoda[0]

No i teraz tłumaczenie skryptu 😀

import czyli importujemy biblioteki/moduły

www = urllib.urlopen('http://www.meteoprog.pl/pl/weather/' + sys.argv[1] ) – python otwiera sobie stronę http://www.meteoprog.pl/pl/weather/ z wpisanym argumentem sys.argv[1]

wyrazenie = '<meta property="og:description" content="(.+?)" />' ustawia nam nasze wyrażenie regularne które potrzebujemy.

pogoda = re.findall(wyrazenie, www_tekst)  teraz łączenie otwartej strony z wyrażeniem regularnym

no i wyświetlamy wynik

print pogoda[0]

 

Jeśli wszystko mamy ładnie zapisane w moim przypadku plik nazywa sie pogoda.py

teraz dajemy komende

python pogoda.py nazwa miasta – nazwa miasta musi być bez spacji i znaków specjalnych np:

Gorzów Wielkopolski – gorzowwielkopolski

Poznań – poznan

Suwałki – suwalki

itp

a u mnie tak to wszystko wygląda

pogoda

Prognoza jest w takim formacie(troszkę nie fajnym – jedno linijkowym).

To nam się przyda na przyszłość do tts’u

Zaufajcie mi 🙂

Python – pierwszy skrypt

Pora zacząć małą instrukcje z programowaniem.

Zacznę troszkę z grubej rury.

będziemy się bawić pythonem

python

http://kidfocused.com/wp-content/uploads/2013/01/python.jpg

 

Oczywiście chodzi o język programowania a nie puchowe zwierzątko domowe (jak na obrazku wyżej)

jak podaje wikipedia

Pythonjęzyk programowania wysokiego poziomu ogólnego przeznaczenia[3], o rozbudowanym pakiecie bibliotek standardowych[4], którego ideą przewodnią jest czytelność i klarowność kodu źródłowego. Jego składnia cechuje się przejrzystością i zwięzłością[5][6].

Python wspiera różne paradygmaty programowania: obiektowy, imperatywny oraz w mniejszym stopniu funkcyjny. Posiada w pełnidynamiczny system typów i automatyczne zarządzanie pamięcią, będąc w tym podobnym do języków Perl, Ruby, Scheme czy Tcl. Podobnie jak inne języki dynamiczne jest często używany jako język skryptowy. Interpretery Pythona są dostępne na wiele systemów operacyjnych.

 

http://pl.wikipedia.org/wiki/Python

 

jeśli coś z tego rozumiecie to świetnie 🙂 ja dość mało. A tylko i wyłącznie bawię się pythonem bo.. Jarrod (mój mentor IT) w szybkiej rozmowie wybił mi z głowy node.js i powiedział żebym zajął się pythonem.Więc jeśli coś będzie nie tak albo coś się wam nie będzie podobało 🙂 to niżej jest jego blog 😛 (wszystko to jego wina!)

http://jarrodvs.blogspot.com/

 

Do poprawnego działania pythona(na raspberry pi) praktycznie nic nie potrzebujemy. Posiadamy na pokładzie dwie wersje Pythona

python -V
Python 2.7.3

i

python3.2 -V
Python 3.2.3

 

Osobiście nie mam pojęcia czym się różnią wszystkie wersje od siebie (i jakoś nie chce mi się tego szukać)

python korzysta z bibliotek (tak napisali w wiki, więc tak jest) czasami jednak zestaw bibliotek standardowych nam nie wystarcza. I do tego potrzebujemy programu „pip” aby go zainstalować wystarczy komenda:

sudo apt-get install python-pip -y

Całej instalacji nie będę wklejał – wszystko idzie automatycznie i trwa jakieś 30 sekund.

Do pierwszego skryptu potrzebujemy bibliotekę/modół  requests

http://docs.python-requests.org/pl/latest/ (opis jest genialny 😀 )

więc instalujemy ją poleceniem

sudo pip install requests

I tu chciał bym się na chwile zatrzymać. apt-get jest menadżer pakietów dla całego systemu natomiast pip jest menadżerem pakietów tylko dla pythona.

Zaczniemy od czegoś bardzo prostego.

Tworzymy plik
touch wyszukaj.py

edytujemy go

pico wyszukaj.py

i wklejamy

import requests
import sys
r = requests.get('http://searx.me/?format=json&q=%3Apl%20' + sys.argv[1])
z = r.json()
print z["results"][0]["content"]

teraz skrót klawiszowy ctrl+x i „t” potem enter

gdybyśmy chcieli odpalić ten skrypt taki będzie wynik

python wyszukaj.py "Jan Matejko"

i otrzymamy odpowiedź

Jan Alojzy Matejko (ur. 24 czerwca [a] 1838 r. w Krakowie , zm. 1 listopada 1893 r. w Krakowie) – polski malarz , twórca obrazów historycznych i batalistycznych ...

a teraz krok po kroku
co robimy 🙂 (jak już pisałem nie znam się na programowaniu więc większość robię na czuja 🙂

import requests
import sys

Importujemy moduł

requests jest opisana wyżej, ale służy do obsługi informacji z i do internetu( www)

sys  opis jest tu – ale nam jest potrzebne tylko do tego żeby przekazać informacje z linii komend dokładniej chodzi o fragment sys.argv[1] który pobiera informacje z linii komend.

r = requests.get('http://searx.me/?format=json&q=%3Apl%20' + sys.argv[1])

r = – czyli przypisanie zmiennej

requests.get – żądanie pobrania w naszym przypadku
http://searx.me/?format=json&q=%3Apl%20 – Wykorzystujemy genialna wyszukiwarkę searx.me która wyszukuje w wynikach innych wyszukiwarek ( o tym napisze w innym wpisie)

+ sys.argv[1] – wyciąga z lini komend drugi argument który jest w cudzysłowie „Jan Matejko”.

z = r.json()- pokazuje ze to co odbieramy jest w formacie json (chyba)

https://searx.me/?format=json&q=%3Apl%20jan%20matejko  <– takie coś przechodzi do maliny i trzeba to jakoś przetlumaczyć na nasz język

print z["results"][0]["content"] - tłumaczymy i wyciągamy pierwszy wynik do tego nam to wypisuje na ekranie.