LETS DO SOME CODE...
SOCKET PROGRAMMING
Σ'αυτό το παράδειγμα, ο server θα ανταποκρίνεται σε οτιδήποτε δέχεται απο τον client. Θα χρησιμοποιήσω τον argparse module, ώστε να δώσω την συγκεκριμένη TCP θύρα απο κάποια γραμμή εντολών.
Πρώτα θα δημιουργήσω τον server. Θα ξεκινήσουμε δημιουργώντας ένα TCP socket αντικείμενο. Μετά θα χρησιμοποιήσουμε την διεύθυνση ώστε να μπορούμε να τρέξουμε τον server όσες φορές θελήσουμε(reuse address). Δένουμε το socket σε μια θύρα local και στο στάδιο το τελικό πρέπει να είμαστε σίγουροι ότι ακούμε πολλούς clients.
Τέλος περιμένουμε για τον client να στείλει κάποιο data στον server. Όταν το αρχείο ληφθεί. o σέρβερ στέλνει πάλι πίσω το αρχείο στον σέρβερ.
Ο κώδικας είναι:
#!/usr/bin/env python
import socket
import sys
import argparse
host = 'localhost'
data_payload = 2048
backlog = 5
def echo_server(port):
"""A simple echo server """
# Φτιάχνουμε έναν TCP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Enable reuse address/port
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
#Δένουμε το socket μας στην θύρα
server_address = (host, port)
print "Starting up echo server on %s port %s" % server_address
sock.bind(server_address)
# Το maximum των συνδέσεων
sock.listen(backlog)
while True:
print "Waiting to receive message from client"
client, address = sock.accept()
data = client.recv(data_payload)
if data:
print "Data: %s" %data
client.send(data)
print "sent %s bytes back to %s" % (data, address)
# Τέλος σύνδεσης
client.close()
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='Socket Server
Example')
parser.add_argument('--port', action="store", dest="port",
type=int, required=True)
given_args = parser.parse_args()
port = given_args.port
echo_server(port)
Από την πλευρά του client, δημιουργούμε ένα socket το οποίο χρησιμοποιεί την συγκεκριμένη θύρα και συνδέεται με τον σέρβερ. Τότε, ο χρήστης στέλνει μήνυμα πρός τον σέρβερ και εάν τελικά επικοινωνούν μεταξύ τους, υπάρχει ανταπόκριση και στέλνει πίσω το μήνυμα στον client.
Θα δημιουργήσουμε δύο try-except blocks για να πιάσει οποιαδήποτε εξαίρεση, καθόλη την διάρκεια της αλληλεπίδρασης μεταξύ τους.
import socket
import sys
import argparse
host = 'localhost'
def echo_client(port):
""" A simple echo client """
# Δημιουργώ TCP/IP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Συνδέουμε τον socket στον σέρβερ
server_address = (host, port)
print "Connecting to %s port %s" % server_address
sock.connect(server_address)
# Στέλνει data
try:
# Στέλνει data
message = "Test message. This will be echoed"
print "Sending %s" % message
sock.sendall(message)
# Ψάχνει για ανταπόκριση
amount_received = 0
amount_expected = len(message)
while amount_received < amount_expected:
data = sock.recv(16)
amount_received += len(data)
print "Received: %s" % data
except socket.errno, e:
print "Socket error: %s" %str(e)
except Exception, e:
print "Other exception: %s" %str(e)
finally:
print "Closing connection to the server"
sock.close()
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='Socket Server
Example')
parser.add_argument('--port', action="store", dest="port",
type=int, required=True)
given_args = parser.parse_args()
port = given_args.port
echo_client(port)
Τώρα που γράψαμε τον κώδικα μας ανοίγουμε το σερβερ script μας σε μια κονσόλα:
$ python 1_13a_echo_server.py --port=9900
Starting up echo server on localhost port 9900
Waiting to receive message from client
Τρέχουμε τον client σε άλλο terminal και:
$ python 1_13b_echo_client.py --port=9900
Connecting to localhost port 9900
Sending Test message. This will be echoed
Received: Test message. Th
Received: is will be echoe
Received: d
Closing connection to the server
#3 UNDERSTANDING MR.PERCEPTRON
Θα παραθέσω το παρακάτω παράδειγμα που εξηγεί ακόμα καλύτερα τον perceptron.
Ο νευρώνας αυτός είναι πιο απλός και ονομάζεται και γραμμικός ταξινομητής.Αυτό σημαίνει οτι το είδος των προβλημάτων που μπορεί να λύσει πρέπει να είναι γραμμικά διαχωρίσιμα .Φαίνεται τι εννοώ απο τις παρακάτω φωτογραφίες:
Η πράσινη γραμμή απεικονίζει τον διαχωρισμό μεταξύ των δύο κατηγοριών, τις οποίες το δίκτυο προσπαθεί να διαχωρίσει.Σε τρεις διαστάσεις αυτό θα πρέπει να εκπροσωπείται από ένα επίπεδο, και σε τέσσερις διαστάσεις ή περισσότερα από ένα υπερεπίπεδο.
Για να λύσουμε το πρόβλημα χρειαζόμαστε ένα δίκτυο όπως αντιπροσωπεύεται παρακάτω:
Όπως μπορείτε να δείτε, κάθει input συνδέεται άμεσα με το output. Με την αναπροσαρμογή της αξίας των weights, το δίκτυο είναι σε θέση να μάθει.
Στην επίδειξη κάτω καθένα από τα σημεία που παρίστανται γραφικώς στο πρώτο διάγραμμα παραπάνω θα χρησιμοποιηθούν ως δεδομένα εκπαίδευσης. Τα δεδομένα εκπαιδεύσεως θα εφαρμοστούν επανειλημμένα στους κόμβους εισόδου του δικτύου και τα βάρη θα ρυθμίζονται έως ότου το δίκτυο γίνει όπως επιθυμούμε.
Μόλις το δίκτυο εκπαιδευτεί η εφαρμογή θα ενισχύσει το εύρος των δεδομένων εισόδου για να αποδείξει ότι το δίκτυο έχει κάνει σωστό training και είναι σε θέση να εκτελεστει καλά . Ο κώδικας που ακολουθεί δείχνει πώς γίνεται αυτό:
using System;
namespace Perceptron
{
public class Perceptron
{
[STAThread]
static void Main()
{
//Βάζουμε Inputs
double[,] inputs = new double[,] {
{ 0.72, 0.82 }, { 0.91, -0.69 }, { 0.46, 0.80 },
{ 0.03, 0.93 }, { 0.12, 0.25 }, { 0.96, 0.47 },
{ 0.79, -0.75 }, { 0.46, 0.98 }, { 0.66, 0.24 },
{ 0.72, -0.15 }, { 0.35, 0.01 }, { -0.16, 0.84 },
{ -0.04, 0.68 }, { -0.11, 0.10 }, { 0.31, -0.96 },
{ 0.00, -0.26 }, { -0.43, -0.65 }, { 0.57, -0.97 },
{ -0.47, -0.03 }, { -0.72, -0.64 }, { -0.57, 0.15 },
{ -0.25, -0.43 }, { 0.47, -0.88 }, { -0.12, -0.90 },
{ -0.58, 0.62 }, { -0.48, 0.05 }, { -0.79, -0.92 },
{ -0.42, -0.09 }, { -0.76, 0.65 }, { -0.77, -0.76 } };
//φορτώνυμε τα sample output patterns
int[] outputs = new int[] {
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };
int patternCount = inputs.GetUpperBound(0) + 1;
// Κανουμε random τα weights
Random r = new Random();
double[] weights = { r.NextDouble(), r.NextDouble() };
// Tοποθετούμε learning rate
double learningRate = 0.1;
int iteration = 0;
double globalError;
do
{
globalError = 0;
for (int p = 0; p < patternCount; p++)
{
// Υπολογισμός του ouput.
int output = Output(weights, inputs[p, 0], inputs[p, 1]);
//Υπολογισμός του λάθους
double localError = outputs[p] - output;
if (localError != 0)
{
// Update weights.
for (int i = 0; i < 2; i++)
{
weights[i] += learningRate * localError * inputs[p, i];
}
}
// Convert error to absolute value.
globalError += Math.Abs(localError);
}
Console.WriteLine("Iteration {0}\tError {1}", iteration, globalError);
iteration++;
} while (globalError != 0);
// Display network generalisation.
Console.WriteLine();
Console.WriteLine("X, Y, Output");
for (double x = -1; x <= 1; x += .5)
{
for (double y = -1; y <= 1; y += .5)
{
//Τελικός υπολογισμός output.
int output = Output(weights, x, y);
Console.WriteLine("{0}, {1}, {2}", x, y, (output == 1) ? "Blue" : "Red");
}
}
Console.ReadKey();
}
private static int Output(double[] weights, double x, double y)
{
double sum = x * weights[0] + y * weights[1];
return (sum >= 0) ? 1 : -1;
}
}
}
Το αποτέλεσμα θα είναι κάπως έτσι:
Παρακάτω θα παρθέσω έναν πολύ απλό κώδικα χρησιμοποιόντας C# για να σας δώσω να καταλάβετε όσο πιο απλά γίνεται τι συμβαίνει με το πιο απλό νευρικό δίκτυο τον perceptron.
Στο πρόγραμμα αυτό θα βάζεις τρία inputs τρία weights ένα threshold και εαν το isum = (x1 * w1 + x2 * w2 + x3 * w3) + bias; είναι μικρότερο του threshold θα μπαίνει σε μια λούπα η οποία θα σταματάει μέχρι να φτάσει την τιμή του threshold.
Να σημειώσω για όσους ίσως δεν το καταλάβανε απο τα προηγούμενα εαν το isum είναι μικρότερο του threshold δεν έχει αρκετή τροφή ο hidden layer(Threshold) για να οπλίσει και να φτάσει στο Output.
Στον παρακάτω κωδικό θα χρησιμοποιήσουμε τρία inputs(x1,x2,x3) τρια weights(w1,w2,w3) έναν hidden layer(threshold) και φυσικά το αποτέλεσμα μας το output.To μοντέλο του νευρικού δικτύου θα είναι όπως παρακάτω στο σχήμα.
Για να καταλάβετε το αποτέλεσμα θα είναι κάπως έτσι:
Κι αφού πάτησα 2000 για το threshold το isum θα λουπάρει μέχρι να το φτάσει και μετά θα σταματήσει.
Όπως είπα είναι μια πολύ πολύ απλή μορφή του perceptron και της training method του για να καταλάβετε στο πολύ περίπου τι παίζει.
Εδώ και ο κώδικας με τις απαραίτητες σημειώσεις:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{//intialization of inputs and weights for nueral net//
decimal x1, x2, x3, w1, w2, w3;
decimal isum, thresh;
// bias input to neural net//
int bias = 1;
// Provide userdefined inputs and weights//
Console.WriteLine("enter the inputs to be feeded in perceptron");
x1 = Convert.ToDecimal(Console.ReadLine());
x2 = Convert.ToDecimal(Console.ReadLine());
x3 = Convert.ToDecimal(Console.ReadLine());
Console.WriteLine("enter the value of the weights");
w1 = Convert.ToDecimal(Console.ReadLine());
w2 = Convert.ToDecimal(Console.ReadLine());
w3 = Convert.ToDecimal(Console.ReadLine());
// calculation of sum//
Console.WriteLine("calculating");
isum = (x1 * w1 + x2 * w2 + x3 * w3) + bias;
Console.WriteLine("The summed output is:{0} ", isum);
Console.WriteLine("enter the desired threshold value");
thresh = Convert.ToDecimal(Console.ReadLine());
//supervised training method//
do
{
Console.WriteLine(isum++);
} while (isum < thresh);
{ Console.ReadLine();
}
}
}
}
#1 NEURAL NETWORKS AND HANDWRITING RECOGNIZER(OCR:Optical Character Recognition)
Όπως θα έχετε ήδη καταλάβει με το προηγούμενο μου άρθρο για την speech recognition engine έχω μια αγάπη για την τεχνητή νοημοσύνη αλλά και τα neural networks.
Η αλήθεια είναι ότι προς το παρόν υπάρχει ένα χάσμα μεταξύ των προγραμματιστών και της εφαρμογής των neural networks(James McCaffrey).Ακόμα είναι ένα πεδίο το οποίο βρίσκεται σε πειραματικό στάδιο, οι βιβλιοθήκες(API) είναι επίσης σε πειραματικό στάδιο αλλά ήδη κάποιοι έχουν αρχίσει και ασχολούνται σοβαρά με το αντικείμενο.
Tα neural networks θα μπορούσαν να χρησιμοποιηθούν σε εφαρμογές όπως : handwriting recognition, financial prediction, game strategy, mathematical functions, and Internet bots(Jeff Heaton).
Στην συνέχεια θα δούμε α) τι είναι τα neural networks β) πως μετατρέπονται σε κώδικα και γ) πως κάνω ένα handwriting recognition.
α)Θα ξεκινήσω με τον πιο απλό μοντέλο νευρικού δικτύου, το οποίο αναπτύχθηκε από τον Frank Rosenblatt μεταξύ της δεκαετίας 50-60 και ονομάζεται perceptron το οποίο ήταν κάπως έτσι:
Πλέον βέβαια χρησιμοποιούνται άλλα ήδη νευρικών δικτύων πιο εξελιγμένα, όπως το sigmoid(στο οποίο θα πάμε να το δούμε σε λίγο), αλλά πριν πάμε εκεί καλό είναι να εξηγήσουμε τι συμβαίνει σε μια πιο απλή μορφή όπως την παραπάνω.
Στο παράδειγμα που παρουσιάζεται ο perceptron έχει τρεις εισόδους:x1, x2, x3. Σε γενικές γραμμές θα μπορούσε να έχει περισσότερες ή λιγότερες.
Ο Rosenblatt πρότεινε έναν απλό κανόνα για τον υπολογισμό της εξόδου. Εισήγαγε βάρη, W1, W2, ..., πραγματικούς αριθμούς που εκφράζουν την σπουδαιότητα των αντίστοιχων εισόδων στην έξοδο. Η έξοδος του νευρώνα 0 ή 1 προσδιορίζεται από το αν το σταθμισμένο άθροισμα Σjwjxj είναι μικρότερη ή μεγαλύτερη από κάποια τελική. Ακριβώς όπως τα βάρη, το κατώτατο όριο είναι ένας πραγματικός αριθμός που είναι μια παράμετρος του νευρώνα.
'Oπου w είναι ένα διάνυσμα από βάρη με πραγματικές τιμές και w * x είναι το εσωτερικό γινόμενο μεταξύ των διανυσμάτων w και x (Yπολογίζεται δηλαδή ένα βεβαρημένο άθροισμα). To b είναι το 'bias', ένας σταθερός όρος ο οποίος δεν εξαρτάται από καμία τιμή εισόδου.
Η τιμή της f(x) (0 ή 1) χρησιμοποιείται για να ταξινομήσει το x είτε ως θετικό ή αρνητικό στιγμιότυπο, στην περίπτωση ενός δυαδικού προβλήματος ταξινόμησης. Το bias χρησιμοποιείται για την μετατόπιση της συνάρτησης ενεργοποίησης ή για να δώσει στον νευρώνα εξόδου ένα βασικό επίπεδο δραστηριότητας. Αν το b είναι αρνητικό τότε ο βεβαρημένος συνδυασμός των εισόδων πρέπει να παραγάγει μία θετική τιμή μεγαλύτερη του -b έτσι ώστε να αναγκάσει τον νευρώνα που ταξινομεί να έχει τιμή άνω του κατωφλίου 0. Χωρικά, το bias μεταβάλει την θέση (αλλά όχι τον προσανατολισμό) του συνόρου απόφασης.
Εφόσον οι είσοδοι τροφοδοτούνται στο δίκτυο άμεσα μέσω των βεβαρημένων συνδέσεων, ο νευρώνας μπορεί να θεωρηθεί ως ένα απλό είδος νευρωνικού δικτύου εμπρός τροφοδότησης.
Για να το θέσουμε πιο απλά:
Μπορούμε να σκεφτούμε τον νευρώνα σαν μία συσκευή που βγάζει το αποτέλεσμα αφού "ζυγίσει" τα δεδομένα.
Ας υποθέσουμε ότι το Σαββατοκύριακο έρχεται, και έχεις ακούσει ότι εκεί πρόκειται να γίνει ένα φεστιβάλ μπύρας στην πόλη σου. Σου αρέσει η μπύρα και προσπαθείς να αποφασίσεις αν πρέπει ή όχι να πας στο φεστιβάλ. Μπορείς να κάνετε την απόφασή σου βάσει τριών παραγόντων:
α)Είναι ο καιρός καλός;
β)Μήπως ο φίλος ή η φίλη σου θέλει να σε συνοδεύσει;
γ)Έχει η γιορτή κοντά της μέσα μαζικής μεταφοράς; (Δεν έχουν στην ιδιοκτησία τους αυτοκίνητο).
Μπορούν να αντιπροσωπευτούν αυτοί οι τρεις παράγοντες από τις αντίστοιχες δυαδικές μεταβλητές x1, x2, x3 .
Για παράδειγμα, θα είχαμε x1 = 1, αν ο καιρός είναι καλός και x1 = 0, αν ο καιρός είναι κακός.
Ομοίως x2 = 1 αν φίλος ή η φίλη σας θέλει να έρθει και x2 = 0 αν όχι.
Και ομοίως και πάλι x3 για μέσα μαζικής μεταφοράς.
Τώρα, ας υποθέσουμε ότι εσύ θες οπωσδήποτε να πας ακόμη και αν ο φίλος σου ή η φίλη σου είναι αδιάφορος και είναι δύσκολο να πας στο φεστιβάλ.Επίσης μπορεί να απεχθάνονται τις κακές καιρικές συνθήκες και δεν υπάρχει κανένας τρόπος για να πάτε στο φεστιβάλ, αν ο καιρός είναι κακός.Μπορείς να χρησιμοποιήσεις perceptrons για να διαμορφώσει αυτό το είδος της διαδικασίας λήψης αποφάσεων.
Ένας τρόπος για να γίνει αυτό είναι να επιλέξετε ένα βάρος W1 = 6 για τις καιρικές συνθήκες και W2 = 2 ,W3 = 2 για τις άλλες συνθήκες. Η μεγαλύτερη τιμή του W1 δείχνει ότι ο καιρός έχει μεγάλη σημασία για σας, πολύ περισσότερο από το αν έχεις παρέα ή αν θα έχεις μέσα μαζικής μεταφοράς.
Τέλος ας υποθέσουμε ότι επιλέγεις το όριο του 5 για το perceptron. Με αυτές τις επιλογές, το perceptron υλοποιεί το επιθυμητό μοντέλο λήψης αποφάσεων στην έξοδο 1 όταν ο καιρός είναι καλός και 0 όταν ο καιρός είναι κακός. Δεν κάνει καμία διαφορά στην έξοδο αν ο φίλος ή η φίλη σας θέλει να πάει ή αν τα μέσα μαζικής μεταφοράς είναι σε κοντινή απόσταση.
Μεταβάλλοντας τα βάρη και το κατώτατο όριο, μπορούμε να έχουμε διαφορετικά μοντέλα λήψης αποφάσεων.
Για παράδειγμα ας υποθέσουμε ότι αντ'αυτού επέλεξες ένα όριο 3. Στη συνέχεια, το perceptron θα αποφασίσει ότι πρέπει να πας στο φεστιβάλ, όταν ο καιρός είναι καλός ή όταν το φεστιβάλ είναι κοντά στα μέσα μαζικής μεταφοράς και ο φίλος ή η φίλη σας είναι πρόθυμοι να σε συναντήσουν.
Με άλλα λόγια θέλεις ένα διαφορετικό μοντέλο λήψης αποφάσεων. Ρίχνοντας το όριο σημαίνει ότι είσαι πιο πρόθυμος να πας στο φεστιβάλ.
Προφανώς, το perceptron δεν είναι ένα πλήρες μοντέλο της ανθρώπινης λήψης αποφάσεων! Αλλά αυτό το παράδειγμα δείχνει πώς ένα perceptron μπορεί να σταθμίσει διάφορα είδη δεδομένων για τη λήψη αποφάσεων.
Για να μάθει το perceptron χρησιμοποιεί supervised learning: Αυτό σημαίνει ότι, θα πρέπει να παρέχονται πολλαπλές είσοδοι και σωστοί έξοδοι, ώστε τα βάρη να μπορούν να ρυθμιστούν σωστά. Επαναλαμβάνοντας αυτή τη διαδικασία θα μειώνεται συνεχώς το σφάλμα μέχρι το αποτέλεσμα να είναι σχεδόν ίσο με την επιθυμητή έξοδο. Όταν τα βάρη προσαρμόζονται, το perceptron θα είναι σε θέση να «μαντέψει» την έξοδο για νέες εισόδους.
Μπορεί να μάθει βέβαια και μ' άλλες μεθόδους αλλά δεν θα μας απασχολήσει αυτό προς το παρόν.
Ο αλγόριθμος μάθησης (αγγλικά: learning algorithm) είναι ίδιος για όλους τους νευρώνες, έτσι αυτά που ακολουθούν εφαρμόζονται σε έναν νευρώνα σε απομόνωση. Πρώτα όμως παρουσιάζεται ο ορισμός κάποιων μεταβλητών:
x(j) είναι το j-οστό στοιχείο του διανύσματος εισόδου
w(j) είναι το j-οστό στοιχείο του διανύσματος βαρών
y είναι το αποτέλεσμα του νευρώνα
δ είναι το επιθυμητό αποτέλεσμα
α είναι μια σταθερά όπου 0 < α < 1 (ρυθμός μάθησης)
Τα βάρη ενημερώνονται μετά από κάθε είσοδο με βάση τον παρακάτω κανόνα ενημέρωσης:
Με αυτόν τον τρόπο, η εκμάθηση μοντελοποιείται καθώς το διάνυσμα με τα βάρη ενημερώνεται μετά από μία επανάληψη, η οποία θα πραγματοποιηθεί μόνο αν η έξοδος y είναι διαφορετική από το επιθυμητό αποτέλεσμα δ.
SPEECH RECOGNITION
Μια εφαρμογή αναγνώρισης ομιλίας θα εκτελεί τυπικά τις ακόλουθες βασικές λειτουργίες:
Διαμόρφωση του προγράμματος αναγνώρισης ομιλίας
// Δημιουργία κοινού μηχανισμού αναγνώρισης των WINDOWS SpeechRecognizer sr = new SpeechRecognizer();
Δημιουργία γραμματικής αναγνώρισης ομιλίας
Choices colors = new Choices(); colors.Add(new string[] {"red", "green", "blue"}); GrammarBuilder gb = new GrammarBuilder(); gb.Append(colors); //Δημιουργία της γραμματικής Grammar g = new Grammar(gb);
Τοποθέτηση της γραμματικής στο πρόγραμμα αναγνώρισης ομιλίας
sr.LoadGrammar(g);
Δημιουργία χειριστή για την εκδήλωση αναγνώρισης ομιλίας
sr.SpeechRecognized += new EventHandler<SpeechRecognizedEventArgs>(sr_SpeechRecognized
Το κείμενο όταν γίνει η αναγνώριση
void sr_SpeechRecognized(object sender, SpeechRecognizedEventArgs e) { MessageBox.Show(e.Result.Text); }
Παρακάτω είναι ένα παράδειγμα όπως μας το δίνει ή msdn.microsoft.com και όπως θα παρατηρήσετε χρησιμοποιείται η System.Speech.Recognition βιβλιοθήκη.
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Speech.Recognition; namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { // Δημιουργία new Speech Recognizer SpeechRecognizer recognizer = new SpeechRecognizer(); // Δημιουργία απλής γραμματικής βιβλιοθήκης που αναγνωρίζει red,green, blue Choices colors = new Choices(); colors.Add(new string[] { "red", "green", "blue" }); // Δημιουργία GrammarBuilder object και τοποθέτηση στο Choices object GrammarBuilder gb = new GrammarBuilder(); gb.Append(colors); // Δημιουργία γραμματικής και φόρτωσης της στην μηχανή ομιλίας Grammar g = new Grammar(gb); recognizer.LoadGrammar(g); // Καταχώρηση handler για το Speech Recognition Event recognizer.SpeechRecognized += new EventHandler<SpeechRecognizedEventArgs>(sre_SpeechRecognized); } // Δημιουργία απλού handler για το Speech Recognition Event void sre_SpeechRecognized(object sender, SpeechRecognizedEventArgs e) { MessageBox.Show("Speech recognized: " + e.Result.Text); } } }
Παρακάτω παραθέτω το δικό μου παράδειγμα στο οποίο λες την λέξη google και σου ανοίγει την σελίδα www.google.com
Choices cities = new Choices(new string[] { "google" });
Grammar gr = new Grammar(new GrammarBuilder(cities));
SpeechRecognitionEngine recognize = new SpeechRecognitionEngine();
SpeechSynthesizer Synth = new SpeechSynthesizer();
recognize.SetInputToDefaultAudioDevice();
DictationGrammar Voc = new DictationGrammar();
recognize.LoadGrammar(Voc);
recognize.RecognizeAsync(RecognizeMode.Multiple);
recognize.SpeechRecognized += new EventHandler<SpeechRecognizedEventArgs>(recognize_SpeechRecognized);
}
**private void recognize_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)**
{
if (e.Result.Text == "google")
System.Diagnostics.Process.Start("http://www.google.com");
}
Η ενεργοποίηση της ομιλίας γίνεται πατώντας το κουμπί το οποίο έχει τον παρακάτω κωδικό:
private void button1_Click(object sender, EventArgs e) { recognize.RecognizeAsync(RecognizeMode.Multiple); button1.Enabled = false; }
0 σχόλια:
Δημοσίευση σχολίου