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 Fluges 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+.
Spracherkennung ist der Prozess, bei dem Live- oder aufgezeichnete Audiodaten in transkribierten Text übersetzt werden. Seit Siri in iOS 5 eingeführt wurde, gibt es eine Mikrofontaste in der Systemtastatur, 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:
Damit Entwickler besser anpassbare und leistungsfähigere 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, weil 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 an (Sprache, Vokabular, Namen usw.)..
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.
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:
SFSpeechURLRecognitionRequest
, oder Live-Audio mit streamen 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.
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 zeigt den aktuellen Status des Fluges an. 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 Skeleton-Projekt 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 ist in angegeben FlightsDataSource.swift
.
Wenn Sie das Projekt ausführen, sollte es wie folgt aussehen.
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. Öffne das Info.plist
Datei und fügen Sie eine neue Zeile mit der Erklärung hinzu, die dem Benutzer angezeigt wird, wenn er um Erlaubnis zum Zugriff auf seine Stimme gebeten wird. Die neu hinzugefügte Zeile wird im folgenden Bild blau hervorgehoben.
Sobald dies geschehen ist, öffnen Sie sich 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.
Sprache importieren
Um dem Benutzer das Berechtigungsdialogfeld anzuzeigen, fügen Sie diesen Code in das ein viewDidLoad (animiert :)
Methode:
switch SFSpeechRecognizer.authorizationStatus () case .notDESTEST: askSpeechPermission () case .authorized: self.status = .ready case .denied, .restricted: self.status = .unavailable
Das 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 Berechtigungsstatus angezeigt unentschlossen
, und wir nennen das askSpeechPermission
Methode, um es wie im nächsten Schritt definiert zu fragen.
Du solltest scheitern Sie immer, wenn eine bestimmte Funktion nicht verfügbar ist. Es ist auch immer sehr wichtig Kommunizieren Sie mit dem Benutzer, wenn Sie seine 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.
func askSpeechPermission () SFSpeechRecognizer.requestAuthorization Status in OperationQueue.main.addOperation Schalterstatus Fall .authorized: self.status = .ready default: self.status = .unavailable
Wir rufen das an requestAuthorization
Methode, um die Datenschutzanforderung zur Spracherkennung anzuzeigen, die wir dem hinzugefügt haben Info.plist
. Wir wechseln dann zum Haupt-Thread, falls der Abschluss in einem anderen Thread aufgerufen wurde. Wir möchten die Benutzeroberfläche nur vom Haupt-Thread aus aktualisieren. Wir vergeben das Neue Status
Aktualisieren der Mikrofontaste, um dem Benutzer die Verfügbarkeit der Spracherkennung zu signalisieren (oder nicht).
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 eine Datei mit dem Namen haben LX40.m4a
. 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:
var preRecordedAudioURL: URL = return Bundle.main.url (forResource: "LX40", withExtension: "m4a")! ()
Es ist an der Zeit, endlich die Leistungsfähigkeit und Einfachheit des Speech-Frameworks zu erkennen. Dies ist der Code, der die gesamte Spracherkennung für uns erledigt:
func recognitionFile (url: URL) guard let Erkenner = SFSpeechRecognizer (), detectizer.isAvailable else return let request = SFSpeechURLRecognitionRequest (url: url) detectizer.recognitionTask (mit: request) Ergebnis, Fehler im Guard-Erkenner = SFSpeechRecognizer (), detectizer.isAvailable else return self.status = .unavailable, wenn result result = result self.flightTextView.text = result.bestTranscription.formattedString wenn result.isFinal self.searchFlight (number: result.bestTranscription.formattedString) else if let error = Fehler print (error)
Diese Methode macht dies:
SFSpeechRecognizer
Instanz und prüfen Sie, ob die Spracherkennung mit einer Guard-Anweisung verfügbar ist. Wenn es nicht verfügbar ist, setzen wir den Status einfach auf nicht verfügbar
und zurück. (Der Standardinitialisierer verwendet das Standardgebietsschema, Sie können jedoch auch das verwenden SFSpeechRecognizer (Gebietsschema :)
Initialisierung, um ein anderes Gebietsschema bereitzustellen.)SFSpeechURLRecognitionRequest
Instanz durch Übergeben der aufgezeichneten Audio-URL.RecognitionTask (mit :)
Methode mit der zuvor erstellten Anfrage.Der Abschluss wird mehrmals mit zwei Parametern aufgerufen: einem Ergebnis und einem Fehlerobjekt.
Das Erkenner
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 Buchstaben oder ein Wort erkannt wird oder Korrekturen vorgenommen werden, wird der Abschluss mit aktuellen Objekten aufgerufen.
Das Ergebnis
Objekt hat die isFinal
Eigenschaft 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. Das searchFlight
Die Funktion sorgt für die Anzeige des Ergebnisses.
Das letzte, was uns fehlt, ist das Erkennungsdatei (URL :)
Funktion, wenn die Mikrofontaste gedrückt wird:
@IBAction FunkmikrofonPressed (_ sender: Any) detectFile (url: preRecordedAudioURL)
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 tatsächlich angezeigt!
Der vollständige Beispielcode bis zu diesem Punkt kann in GitHub im Bereich für bereits aufgenommene Audiodaten angesehen werden.
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 brauchen einen neuen Schlüssel im Info.plist
Datei, um dem Benutzer zu erklären, warum wir auf das Mikrofon zugreifen müssen. Fügen Sie Ihrem eine neue Zeile hinzu Info.plist
wie im Bild gezeigt.
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 wiederverwenden, den wir im vorherigen Abschnitt verwendet haben (denken Sie daran Sprache importieren
) um die Genehmigung zu bitten. Das viewDidLoad (animiert :)
Methode wird genau wie zuvor implementiert:
switch SFSpeechRecognizer.authorizationStatus () case .notDESTEST: askSpeechPermission () case .authorized: self.status = .ready case .denied, .restricted: self.status = .unavailable
Auch die Methode, um den Benutzer um Erlaubnis zu bitten, ist dieselbe.
func askSpeechPermission () SFSpeechRecognizer.requestAuthorization Status in OperationQueue.main.addOperation Schalterstatus Fall .authorized: self.status = .ready default: self.status = .unavailable
Die Implementierung von Starte die Aufnahme
wird ein wenig anders sein. Fügen wir zunächst einige neue Instanzvariablen hinzu, die sich beim Verwalten der Audiositzung und der Spracherkennungsaufgabe als nützlich erweisen werden.
let audioEngine = AVAudioEngine () let speechRecognizer: SFSpeechRecognizer? = SFSpeechRecognizer () let request = SFSpeechAudioBufferRecognitionRequest () var recognitionTask: SFSpeechRecognitionTask?
Lassen Sie uns die einzelnen Variablen einzeln betrachten:
AVAudioEngine
wird verwendet, um einen Audiostrom zu verarbeiten. Wir werden einen Audio-Knoten erstellen und an diese Engine anhängen, damit wir aktualisiert werden können, wenn das Mikrofon einige Audiosignale empfängt.SFSpeechRecognizer
ist die gleiche Klasse, die wir im vorherigen Teil des Tutorials 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, 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.Sobald wir alle erforderlichen Variablen deklariert haben, lassen Sie uns implementieren Starte die Aufnahme
.
func startRecording () // Einrichten der Audio-Engine und des Spracherkennungs-Managers Lassen Sie node = audioEngine.inputNode else return let recordingFormat = node.outputFormat (forBus: 0) node.installTap (onBus: 0, bufferSize: 1024, Format: recordingFormat.) Puffer, _ in self.request.append (buffer) // Bereiten Sie die Aufnahme vor und starten Sie die Aufnahme. audioEngine.prepare () do try audioEngine.start () self.status = .recognizing catch return print (error) / / Spracherkennungstask = speechRecognizer analysieren? .RecognitionTask (mit: request, resultHandler: Ergebnis, Fehler in, wenn Ergebnis = Ergebnis self.flightTextView.text = result.bestTranscription.formattedString) self.searchFlight (Nummer: result.bestTranscription.formattedString) ) Sonst wenn Fehler = Fehler print (Fehler))
Dies ist der Kerncode unserer Funktion. Ich werde es Schritt für Schritt erklären:
inputNode
des AudioEngine
. Ein Gerät kann möglicherweise mehrere Audioeingänge haben, und hier wählen wir den ersten aus.anfordern
damit es den Erkennungsprozess starten kann..erkennen
So aktualisieren wir das Tastensymbol, um den Benutzer darüber zu informieren, dass seine Stimme aufgenommen wird.speechRecognizer.recognitionTask (mit: resultHandler :)
zum RecognitionTask
Variable. 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.
func cancelRecording () audioEngine.stop () wenn let node = audioEngine.inputNode node.removeTap (onBus: 0) recognitionTask? .cancel ()
Wir müssen jetzt nur noch die Aufnahme starten und stoppen. Modifiziere den mikrofongedrückt
Methode wie folgt:
@IBAction Funkmikrofon () Status wechseln case .ready: startRecording () status = .erkennender Fall .recognizing: cancelRecording () status = .ready default: break
Abhängig von der Stromstärke Status
, Wir starten oder stoppen 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.
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 Apple-Servern gedrosselt 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.
In diesem Lernprogramm haben Sie gesehen, wie Sie in iOS 10 schnelle, genaue und flexible Spracherkennung verwenden können. Nutzen Sie es 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 darüber erfahren möchten, wie Sie Siri in Ihre App integrieren können, oder wenn Sie andere coole Entwicklerfunktionen von iOS 10 kennen lernen möchten, besuchen Sie den Kurs von Markus Mühlberger.
Schauen Sie sich auch einige andere kostenlose Tutorials zu den Funktionen von iOS 10 an.