Programmieren mit Swift - Für macOS und iOS
Programmieren mit Swift - Für macOS und iOS
NSSpeechRecognizer, Teil 1

Erzeugen Sie auch für diese Lektion wieder eine Cocoa Anwendung und erweitern Sie das Projekt wie gewohnt um eine MyController-Klasse. Sie können das Projekt Spracherkennung nennen.

Am einfachsten an der ganzen Anwendung ist die MyController.h Datei. Hier definieren Sie nur einen NSSpeechRecognizer, damit dieses Objekt später in der kompletten Klasse bekannt ist.
#import <Cocoa/Cocoa.h>

@interface MyController : NSObject {

    NSSpeechRecognizer *mySpeechRecog;
}

@end
Ein NSSpeechRecognizer-Objekt reagiert auf Befehle, die ihm in Form von Text beigebracht werden. In diesem Beispiel ist es ein NSArray, das mit der setCommands-Methode an die Instanz des NSSpeechRecognizer gesendet wird.

Der NSSpeechRecognizer selbst verwendet ein delegate, um mit dem Rest der Anwendung zu kommunizieren. Setzt man den delegate auf self, werden die Nachrichten des NSSpeechRecognizer in der gleichen Klasse, also im MyController bearbeitet. Deshalb wurde dieser Klasse auch das NSSpeechRecognizerDelegate-Protokoll hinzugefügt. Die Anwendung würde zwar auch ohne diese Protokoll funktionieren, Xcode würde aber eine Warnung ausgeben. Erst durch Verwendung des Protokolls wird sichergestellt, dass diese Klasse korrekt auf Nachrichten eines NSSpeechRecognizer reagiert.

Wahrscheinlich von selbst erklärend ist der Befehl startListening, welcher die Spracherkennung aktiviert. Das Gegenstück dazu ist stopListening, das sie wieder deaktiviert.

Jetzt haben Sie schon alle nötigen Informationen, um einen NSSpeechRecognizer zu konfigurieren.
-(void)awakeFromNib
{
    NSArray *myCommands = [NSArray arrayWithObjects:
@"play music", @"stop music",
     @"up", @"down", nil];

    mySpeechRecog = [[NSSpeechRecognizer alloc] init];
    [mySpeechRecog setCommands:myCommands];
    [mySpeechRecog setDelegate:
self];

    [mySpeechRecog startListening];
}
Die delegate-Methode (speechRecognizer didRecognizeCommand), die bei erfolgreich erkannter Sprache ausgeführt wird, sehen Sie im folgenden Code. Das ist nicht besonders viel, nur ein NSBeep und eine Ausgabe des erkannten Kommandos. Zusätzlich wird ein erkannter Befehl automatisch vom System wiederholt, also gesprochen.
- (void)speechRecognizer:(NSSpeechRecognizer *)sender didRecognizeCommand:(id)command
{
    NSBeep();
    NSLog((NSString *)command);
}
stacks_image_B2058125-D280-4DB4-8848-80008510A0B4
Wenn Sie nun noch im Interface Builder eine Instanz von MyController erzeugen, können Sie die Spracherkennung testen.

Man sollte es nicht verschweigen, teilweise ist die Spracherkennung recht eigensinnig und tut sich schwer, manche Worte zu erkennen. Im Test weigerte sich das System ein einfaches „stop“ zu akzeptieren, hatte aber keine Probleme mit einem komplexen Befehl wie „stop all engines“. Experimentieren Sie ruhig ein wenig mit dem Programm und fügen Sie Ihre eigenen Befehle hinzu. Außerdem sollten Sie umbedingt die Sprachkalibrierung in den Systemeinstellungen durchführen.
stacks_image_1BA47EDE-72C6-46E9-BC9D-205A3311B793