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

In einem zweiten Projekt werden Sie die Programmierung mit dem NSSpeechRecognizer etwas verfeinern. Ziel wird es sein, eine normale Cocoa Anwendung zu schreiben und diese anschließend um die Spracherkennung zu erweitern. Nennen Sie Ihr Projekt Spracherkennung2 und erzeugen Sie wie immer eine Klasse MyController.

Um die Anwendung überschaubar zu halten, wird sie nicht besonders viel können. Vier Button, die jeweils unterschiedliche Texte in ein NSTextField schreiben, sollten als Aufgabe genügen. In der Headerdatei müssen Sie also vier Action (für die Button) und ein Outlet (für das Textfeld) deklarieren.
#import <Cocoa/Cocoa.h>

@interface MyController : NSObject {

    IBOutlet NSTextField *myText;

}

- (
IBAction)button1Click:(id)sender;
- (
IBAction)button2Click:(id)sender;
- (
IBAction)button3Click:(id)sender;
- (
IBAction)button4Click:(id)sender;

@end
Auch die Implementation der einzelnen Methoden ist sehr einfach und sollte kein Problem mehr darstellen.
#import "MyController.h"

@implementation MyController

- (
IBAction)button1Click:(id)sender
{
    [myText setStringValue:
@"Button 1 geklickt"];
}

- (
IBAction)button2Click:(id)sender
{
    [myText setStringValue:
@"Button 2 geklickt"];
}

- (
IBAction)button3Click:(id)sender
{
    [myText setStringValue:
@"Button 3 geklickt"];
}

- (
IBAction)button4Click:(id)sender
{
    [myText setStringValue:
@"Button 4 geklickt"];
}

@end
Der nächste Schritt ist die Umsetzung der Benutzeroberfläche im Interface Builder. Doppelklicken Sie auf die MainMenu.xib in der Projektübersicht, um den Interface Builder zu starten. Erstellen Sie ein Fenster, das in etwa wie die folgende Abbildung aussieht. Verwenden Sie NSButton und NSTextfield.
stacks_image_BBD8F8D7-AB76-4359-9F51-A0CCF2820924
Erzeugen Sie nun wieder eine Instanz der MyController-Klasse, indem Sie ein NSObject aus der Bibliothek ziehen und die Klassenidentität dieses Objektes ändern.
Verbinden Sie anschließend die Outlet und Action mit den richtigen Steuerelementen. Ist dies getan, ist Ihr Programm in der grundlegenden Funktion fertig und kann getestet werden. Anklicken der Button sollte unterschiedliche Texte ausgeben.

Kommen wir nun zur Erweiterung der Spracherkennung. Statt mit der Maus, sollen die Button auch per Sprachsteuerung ausgeführt werden können. Zusätzlich erweitern wir das Programm um einen Button, mit dem die Spracherkennung ein- und ausgeschaltet werden kann. In der Headerdatei ist dafür eine weitere Action nötig. Außerdem muss noch ein NSSpeechRecognizer definiert werden.

Da MyController selbst auf Benachrichtigungen des NSSpeechRecognizer reagiert, ist es notwendig, für diese Klasse das NSSpeechRecognizerDelegate-Protokoll zu implementieren.
#import <Cocoa/Cocoa.h>

@interface MyController : NSObject {

    IBOutlet NSTextField *myText;
    NSSpeechRecognizer *mySpeechRecog;

}

- (
IBAction)button1Click:(id)sender;
- (
IBAction)button2Click:(id)sender;
- (
IBAction)button3Click:(id)sender;
- (
IBAction)button4Click:(id)sender;

- (
IBAction)buttonOnOffClick:(id)sender;

@end
Im Programmfenster ist für die Action natürlich ein weiterer Button nötig. Setzen Sie die Mode-Eigenschaft des Button auf Toggle, und bei jedem Anklicken wird automatisch zwischen Title und alt. Title gewechselt.
stacks_image_BF6ABD8B-967E-4E7D-A6CC-F08525192DDF
stacks_image_71D62CB7-4CC4-494C-97C8-BDEFC4913FB0
Die Methode, welche den NSSpeechRecognizer an und aus schaltet, wird durch den state des Button gesteuert. Wenn man ihn abfragt, weiss man immer, was man mit dem NSSpeechRecognizer tun soll.
- (IBAction)buttonOnOffClick:(id)sender
{
    if([sender state] == NSOnState)
    {
        [mySpeechRecog startListening];
    }
   
else
    {
        [mySpeechRecog stopListening];
    }
}

Was noch fehlt, ist die awakeFromNib-Methode, welche den NSSpeechRecognizer initialisiert und mit den nötigen Befehlen versorgt.
-(void)awakeFromNib
{
    NSArray *myCommands = [NSArray arrayWithObjects:
@"press button one", @"press
     button two"
, @"press button tree", @"press button four", nil];

    mySpeechRecog = [[NSSpeechRecognizer alloc] init];
    [mySpeechRecog setCommands:myCommands];
    [mySpeechRecog setDelegate:
self];
    [mySpeechRecog stopListening];
}
Und zum Abschluss die delegate-Methode, die dann anstelle eines Mausklicks die verschiedenen Methoden der Button aufruft.
- (void)speechRecognizer:(NSSpeechRecognizer *)sender didRecognizeCommand:(id)command
{
    if([(NSString *)command isEqualToString:@"press button one"])
    {
        [selfbutton1Click:
NULL];
    }
   
else if([(NSString *)command isEqualToString:@"press button two"])
    {
        [selfbutton2Click:
NULL];
    }
   
else if([(NSString *)command isEqualToString:@"press button three"])
    {
        [selfbutton3Click:
NULL];
    }
    else if([(NSString *)command isEqualToString:@"press button four"])
    {
        [selfbutton4Click:
NULL];
    }
}
Sehr schön kann man hier sehen, wie die bereits existierenden Methoden von der didRecognizeCommand-Methode aufgerufen werden. Da Sie für diese Methoden keinen Sender brauchen, wird dieser Wert auf NULL gesetzt.
Sie sehen, es ist gar nicht so schwer, eine bestehende Anwendung um die Möglichkeiten der Sprachsteuerung zu erweitern.