Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. iOS 10
Code

Verwenden der Spracherkennungs-API unter iOS 10

by
Difficulty:IntermediateLength:LongLanguages:

German (Deutsch) translation by Władysław Łucyszyn (you can also view the original English article)

Final product image
What You'll Be Creating

Einführung

Siri ist seit seiner Einführung im Jahr 2011 ein zentrales Feature von iOS. Jetzt bietet iOS 10 neue Features, mit denen Entwickler mit Siri interagieren können. Insbesondere sind jetzt zwei neue Frameworks verfügbar: Speech und SiriKit.

Heute werden wir einen Blick auf das Sprach-Framework werfen, mit dem wir Audio leicht in Text übersetzen können. Sie erfahren, wie Sie eine reale App erstellen, die die Spracherkennungs-API verwendet, um den Status eines Flugs zu überprüfen.

Wenn Sie mehr über SiriKit erfahren möchten, habe ich es in meinem Tutorial SiriKit-Erweiterungen erstellen in iOS 10 behandelt. Weitere Informationen zu den anderen neuen Features für Entwickler in iOS 10 finden Sie im Kurs von Markus Mühlberger, direkt hier bei Envato Tuts+.

Verwendungszweck

Spracherkennung ist der Prozess, bei dem Live- oder aufgezeichnete Audiodaten in transkribierten Text übersetzt werden. Seit Siri in iOS 5 eingeführt wurde, hat die Systemtastatur eine Mikrofontaste, mit der Benutzer leicht diktieren können.  Diese Funktion kann mit jeder UIKit-Texteingabe verwendet werden, und Sie müssen keinen zusätzlichen Code schreiben, der über das hinausgeht, was Sie zur Unterstützung einer Standardtexteingabe schreiben würden. Es ist wirklich schnell und einfach zu bedienen, hat jedoch einige Einschränkungen:

  • Die Tastatur ist beim Diktieren immer vorhanden.
  • Die Sprache kann nicht von der App selbst angepasst werden.
  • Die App kann nicht benachrichtigt werden, wenn das Diktat beginnt und endet.
Dictation in the iOS keyboard

Damit Entwickler besser anpassbare und leistungsstarke Anwendungen mit derselben Diktiertechnologie wie Siri erstellen können, hat Apple das Speech-Framework entwickelt. Damit kann jedes Gerät, auf dem iOS 10 ausgeführt wird, Audio in über 50 Sprachen und Dialekte in Text umwandeln.

Diese neue API ist viel leistungsfähiger, da sie nicht nur einen einfachen Transkriptionsdienst bietet, sondern auch alternative Interpretationen dessen, was der Benutzer gesagt hat. Sie können steuern, wann ein Diktat angehalten werden soll, Sie können Ergebnisse anzeigen, während Ihr Benutzer spricht, und die Spracherkennungs-Engine passt sich automatisch an die Benutzereinstellungen (Sprache, Vokabular, Namen usw.) an.

Eine interessante Funktion ist die Unterstützung für das Transkribieren von aufgezeichnetem Audio. Wenn Sie beispielsweise eine Instant-Messaging-App erstellen, können Sie mit dieser Funktion den Text neuer Audionachrichten transkribieren.

Konfiguration

Zunächst müssen Sie den Benutzer um Erlaubnis bitten, seine Stimme zur Analyse an Apple zu senden.

Abhängig von dem Gerät und der Sprache, die erkannt werden soll, kann iOS die Audioaufzeichnung auf dem Gerät selbst transparent transkribieren. Wenn die Spracherkennung auf dem Gerät nicht verfügbar ist, verwendet iOS die Server von Apple.

Aus diesem Grund ist normalerweise eine aktive Internetverbindung für die Spracherkennung erforderlich. Ich werde Ihnen bald zeigen, wie Sie die Verfügbarkeit des Dienstes überprüfen können.

Es gibt drei Schritte, um die Spracherkennung zu verwenden:

  • Erklären Sie: Erklären Sie Ihrem Benutzer, warum Sie auf seine Stimme zugreifen möchten.
  • Autorisieren: Fordern Sie ausdrücklich die Autorisierung für den Zugriff auf ihre Stimme an.
  • Anforderung: Laden Sie ein aufgezeichnetes Audio mit SFSpeechURLRecognitionRequest von der Festplatte oder streamen Sie Live-Audio mit SFSpeechAudioBufferRecognitionRequest, und verarbeiten Sie die Transkription.

Wenn Sie mehr über das Speech-Framework erfahren möchten, schauen Sie sich die WWDC 2016-Sitzung 509 an. Sie können auch die offizielle Dokumentation lesen.

Beispiel

Jetzt zeige ich Ihnen, wie Sie eine reale App erstellen, die die Spracherkennungs-API nutzt.  Wir werden eine kleine Flugverfolgungs-App erstellen, in der der Benutzer einfach eine Flugnummer sagen kann und die App den aktuellen Status des Flugs anzeigt. Ja, wir werden einen kleinen Assistenten wie Siri bauen, um den Status eines Fluges zu überprüfen!

Im GitHub-Repo des Tutorials habe ich ein Skelettprojekt bereitgestellt, das eine grundlegende Benutzeroberfläche enthält, die uns für dieses Tutorial helfen wird. Laden Sie das Projekt in Xcode 8.2 oder höher herunter und öffnen Sie es. Wenn wir mit einer vorhandenen Benutzeroberfläche beginnen, können wir uns auf die Spracherkennungs-API konzentrieren.

Schauen Sie sich die Klassen im Projekt an. UIViewController+Style.swift enthält den Großteil des Codes, der für die Aktualisierung der Benutzeroberfläche verantwortlich ist. Die in der Tabelle angezeigte Beispieldatenquelle der Flüge wird in FlightsDataSource.swift deklariert.

Wenn Sie das Projekt ausführen, sollte es wie folgt aussehen.

The initial example project

Nachdem der Benutzer die Mikrofontaste gedrückt hat, möchten wir die Spracherkennung starten, um die Flugnummer zu transkribieren. Wenn der Benutzer "LX40" sagt, möchten wir die Informationen zum Gate und zum aktuellen Status des Fluges anzeigen.  Dazu rufen wir eine Funktion auf, die den Flug in einer Datenquelle automatisch nachschlägt und den Status des Flugs anzeigt.

Wir werden zuerst untersuchen, wie Sie von aufgezeichnetem Audio transkribieren können. Später lernen wir, wie Sie die interessantere Live-Spracherkennung implementieren können.

Beginnen wir mit dem Einrichten des Projekts. Öffnen Sie die Info.plist-Datei und fügen Sie eine neue Zeile mit der Erläuterung hinzu, die dem Benutzer angezeigt wird, wenn Sie nach Erlaubnis gefragt werden, auf seine Stimme zuzugreifen. Die neu hinzugefügte Zeile wird im folgenden Bild blau hervorgehoben.

The Infoplist file with the newly added key

Sobald dies erledigt ist, öffnen Sie ViewController.swift. Beachten Sie nicht den Code, der bereits in dieser Klasse enthalten ist. es kümmert sich nur um die Aktualisierung der Benutzeroberfläche für uns.

Der erste Schritt bei einem neuen Framework, das Sie verwenden möchten, besteht darin, es oben in der Datei zu importieren.

Um dem Benutzer den Berechtigungsdialog anzuzeigen, fügen Sie diesen Code in die viewDidLoad(animated:) -Methode ein:

Die status variable sorgt dafür, dass die Benutzeroberfläche geändert wird, um den Benutzer darauf hinzuweisen, dass die Spracherkennung nicht verfügbar ist, falls etwas schief geht. Wir werden der gleichen Variablen jedes Mal einen neuen Status zuweisen, wenn wir die Benutzeroberfläche ändern möchten.

Wenn die App den Benutzer noch nicht um Erlaubnis gefragt hat, wird der Autorisierungsstatus notDetermined, und wir rufen die askSpeechPermission-Methode auf, um sie wie im nächsten Schritt definiert anzufragen.

Sie sollten immer ordnungsgemäß ausfallen, wenn eine bestimmte Funktion nicht verfügbar ist. Es ist auch sehr wichtig, dass Sie immer mit dem Benutzer kommunizieren, wenn Sie ihre Stimme aufnehmen.  Versuchen Sie niemals, ihre Stimme zu erkennen, ohne zuerst die Benutzeroberfläche zu aktualisieren und Ihren Benutzer darauf aufmerksam zu machen.

Hier ist die Implementierung der Funktion, um den Benutzer um Erlaubnis zu bitten.

Wir rufen die requestAuthorization-Methode auf, um die Datenschutzanforderung zur Spracherkennung anzuzeigen, die wir der Info.plist hinzugefügt haben. Wir wechseln dann zum Haupt-Thread, falls die Schließung in einem anderen Thread aufgerufen wurde - wir möchten die Benutzeroberfläche nur vom Haupt-Thread aus aktualisieren.  Wir weisen den neuen status zum Aktualisieren der Mikrofontaste zu, um dem Benutzer die Verfügbarkeit der Spracherkennung (oder nicht) zu signalisieren.

Aufgezeichnete Audioerkennung

Bevor Sie den Code zum Erkennen von aufgezeichnetem Audio schreiben, müssen Sie die URL der Audiodatei ermitteln. Überprüfen Sie im Projektnavigator, ob Sie über eine Datei mit dem Namen LX40.m4a verfügen. Ich habe diese Datei selbst mit der Voice Memos App auf meinem iPhone aufgenommen, indem ich "LX40" sagte. Wir können leicht überprüfen, ob wir eine korrekte Transkription des Audios erhalten.

Speichern Sie die Audiodatei-URL in einer Eigenschaft:

Es ist an der Zeit, endlich die Leistungsfähigkeit und Einfachheit des Sprachrahmens zu erkennen. Dies ist der Code, der alle Spracherkennung für uns erledigt:

Diese Methode macht dies:

  • Initialisieren Sie eine SFSpeechRecognizer-Instanz und prüfen Sie mit einer Guard-Anweisung, ob die Spracherkennung verfügbar ist. Wenn es nicht verfügbar ist, setzen wir den Status einfach auf unavailable und kehren zurück. (Der Standardinitialisierer verwendet das Standardgebietsschema für Benutzer, Sie können jedoch auch das Initialisierungsprogramm SFSpeechRecognizer (locale:)) verwenden, um ein anderes Gebietsschema bereitzustellen.
  • Wenn Spracherkennung verfügbar ist, erstellen Sie eine SFSpeechURLRecognitionRequest-Instanz, indem Sie die zuvor aufgezeichnete Audio-URL übergeben.
  • Starten Sie die Spracherkennung, indem Sie die recognitionTask(with:) -Methode mit der zuvor erstellten Anforderung aufrufen.

Starten Sie die Spracherkennung, indem Sie die recognitionTask (mit :) -Methode mit der zuvor erstellten Anforderung aufrufen.

Der recognizer wird mehrmals mit zwei Parametern aufgerufen: einem Ergebnis und einem Fehlerobjekt. Der Recognizer spielt die Datei tatsächlich ab und versucht, den Text inkrementell zu erkennen.  Aus diesem Grund wird der Abschluss mehrfach aufgerufen. Jedes Mal, wenn ein Buchstabe oder ein Wort erkannt wird oder Korrekturen vorgenommen werden, wird der Abschluss mit aktuellen Objekten aufgerufen.

Das result objekt hat die Eigenschaft isFinal auf true gesetzt, wenn die Audiodatei vollständig analysiert wurde.  In diesem Fall starten wir eine Suche in unserer Flugdatenquelle, um zu sehen, ob wir einen Flug mit der erkannten Flugnummer finden können. Die searchFlight-Funktion sorgt für die Anzeige des Ergebnisses.

Das letzte, was uns noch fehlt, ist das Aufrufen der Funktion recognizeFile(url:), wenn die Mikrofontaste gedrückt wird:

Starten Sie die App auf Ihrem Gerät mit iOS 10 und drücken Sie die Mikrofontaste. Das Ergebnis wird angezeigt. Das Audio "LX40" wird inkrementell erkannt und der Flugstatus wird angezeigt!

Tipp: Die Flugnummer wird in einer UITextView angezeigt. Wie Sie vielleicht bemerkt haben, können Sie, wenn Sie den Flight Number-Datendetektor in UITextView aktivieren, darauf drücken, und der aktuelle Status des Fluges wird angezeigt.

Der vollständige Beispielcode bis zu diesem Punkt kann in GitHub im Bereich für bereits aufgenommene Audiodaten angesehen werden.

Live-Audioerkennung

Lassen Sie uns nun sehen, wie Live-Spracherkennung implementiert wird. Im Vergleich zu dem, was wir gerade gemacht haben, wird es etwas komplizierter. Sie können das gleiche Skelettprojekt erneut herunterladen und mitverfolgen.

Wir benötigen einen neuen Schlüssel in der Info.plist-Datei, um dem Benutzer zu erklären, warum wir auf das Mikrofon zugreifen müssen. Fügen Sie Ihrer Info.plist eine neue Zeile hinzu, wie im Bild gezeigt.

New row explaining why we need to access the microphone

Wir müssen den Benutzer nicht manuell um Erlaubnis bitten, da iOS dies für uns tut, sobald wir versuchen, auf eine mikrofonbezogene API zuzugreifen.

Wir können denselben Code, den wir im vorherigen Abschnitt verwendet haben, wiederverwenden (denken Sie daran, import Speech), um die Autorisierung anzufordern. Die viewDidLoad(animated:) -Methode wird genau wie zuvor implementiert:

Auch die Methode, um den Benutzer um Erlaubnis zu bitten, ist dieselbe.

Die Implementierung von startRecording wird etwas anders sein. Fügen wir zunächst einige neue Instanzvariablen hinzu, die sich beim Verwalten der Audiositzung und der Spracherkennungsaufgabe als nützlich erweisen.

Lassen Sie uns die einzelnen Variablen einzeln betrachten:

  • AVAudioEngine dient zur Verarbeitung eines Audiostroms. Wir werden einen Audioknoten erstellen und an diese Engine anschließen, damit wir aktualisiert werden können, wenn das Mikrofon einige Audiosignale empfängt.
  • SFSpeechRecognizer ist dieselbe Klasse, die wir im vorherigen Teil des Lernprogramms gesehen haben, und sorgt dafür, dass die Sprache erkannt wird. Da der Initialisierer fehlschlagen und nil zurückgeben kann, wird dies als optional deklariert, um einen Absturz zur Laufzeit zu vermeiden.
  • SFSpeechAudioBufferRecognitionRequest ist ein Puffer zum Erkennen der Live-Sprache. Da wir nicht die komplette Audiodatei haben wie zuvor, benötigen wir einen Puffer, um die Sprache zuzuordnen, während der Benutzer spricht.
  • SFSpeechRecognitionTask verwaltet die aktuelle Spracherkennungsaufgabe und kann zum Stoppen oder Abbrechen verwendet werden.

Nachdem wir alle erforderlichen Variablen deklariert haben, implementieren wir startRecording.

Dies ist der Kerncode unserer Funktion. Ich werde es Schritt für Schritt erklären:

  • Zuerst erhalten wir den inputNode der audioEngine. Ein Gerät kann möglicherweise mehrere Audioeingänge haben, und hier wählen wir den ersten aus.
  • Wir teilen dem Eingangsknoten mit, dass wir den Audiostrom überwachen wollen. Der von uns bereitgestellte Block wird bei jedem empfangenen Audiostrom von 1024 Bytes aufgerufen. Der Audiopuffer wird sofort an die request angehängt, damit der Erkennungsprozess gestartet werden kann.
  • Wir bereiten die Audio-Engine vor, um mit der Aufnahme zu beginnen. Wenn die Aufnahme erfolgreich gestartet wird, setzen Sie den Status auf .recognizing, um das Tastensymbol zu aktualisieren, um den Benutzer darüber zu informieren, dass seine Stimme aufgezeichnet wird.
  • Ordnen Sie das zurückgegebene Objekt aus der Datei speechRecognizer.recognitionTask (with:resultHandler:) der recognitionTask-Variablen zu. Wenn die Erkennung erfolgreich ist, durchsuchen wir den Flug in unserer Datenquelle und aktualisieren die Benutzeroberfläche.

Die Funktion zum Abbrechen der Aufzeichnung ist so einfach wie das Stoppen der Audio-Engine, das Entfernen des Abgriffs vom Eingangsknoten und das Abbrechen der Erkennungsaufgabe.

Wir müssen jetzt nur noch die Aufnahme starten und stoppen. Ändern Sie die Methode microphonePressed wie folgt:

Abhängig vom aktuellen status starten oder stoppen wir die Spracherkennung.

Erstellen Sie die App, und führen Sie sie aus, um das Ergebnis anzuzeigen. Versuchen Sie, eine der aufgeführten Flugnummern zu buchstabieren, und der Status sollte angezeigt werden.

Der Beispielcode kann erneut im Live-Audio-Zweig von GitHub angezeigt werden.

Best Practices

Die Spracherkennung ist eine sehr leistungsfähige API, die Apple iOS-Entwicklern für iOS 10 zur Verfügung gestellt hat. Die Verwendung ist völlig kostenlos. Beachten Sie jedoch, dass sie nicht unbegrenzt verwendet werden kann.  Für jede Spracherkennungsaufgabe ist sie auf etwa eine Minute begrenzt. Außerdem kann Ihre App von den Servern von Apple eingeschränkt werden, wenn zu viel Rechenaufwand erforderlich ist. Aus diesen Gründen hat dies einen starken Einfluss auf den Netzwerkverkehr und den Stromverbrauch.

Stellen Sie sicher, dass Ihre Benutzer über die Verwendung der Spracherkennung informiert sind, und sorgen Sie für eine möglichst transparente Aufzeichnung, wenn Sie ihre Stimme aufnehmen.

Rekapitulieren

In diesem Lernprogramm haben Sie erfahren, wie Sie in iOS 10 schnelle, genaue und flexible Spracherkennung verwenden. Nutzen Sie diese Option zu Ihrem eigenen Vorteil, um Ihren Benutzern eine neue Art der Interaktion mit Ihrer App zu ermöglichen und gleichzeitig die Zugänglichkeit zu verbessern.

Wenn Sie mehr über die Integration von Siri in Ihre App erfahren möchten oder Informationen zu anderen coolen Entwicklerfunktionen von iOS 10 erhalten möchten, lesen Sie den Kurs von Markus Mühlberger.

Schauen Sie sich auch einige andere kostenlose Tutorials zu den Funktionen von iOS 10 an.


Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.