Spracherkennung in Xamarin.iOS
In diesem Artikel wird die neue Sprach-API vorgestellt und gezeigt, wie sie in einer Xamarin.iOS-App implementiert wird, um kontinuierliche Spracherkennung und Transkription von Spracherkennung (von Live- oder aufgezeichneten Audiostreams) in Text zu unterstützen.
Neu bei iOS 10 hat Apple die Spracherkennungs-API veröffentlicht, die es einer iOS-App ermöglicht, kontinuierliche Spracherkennung und Transkription von Spracherkennung (von Live- oder aufgezeichneten Audiostreams) in Text zu unterstützen.
Laut Apple verfügt die Spracherkennungs-API über die folgenden Features und Vorteile:
- Hochgenau
- Stand der Technik
- Benutzerfreundlich
- Schnell
- Unterstützt mehrere Sprachen
- Respektiert den Datenschutz des Benutzers.
Funktionsweise der Spracherkennung
Die Spracherkennung wird in einer iOS-App implementiert, indem sie live oder vorab aufgezeichnete Audiodaten (in einer der gesprochenen Sprachen, die die API unterstützt) abrufen und an eine Spracherkennung übergeben, die eine Nur-Text-Transkription der gesprochenen Wörter zurückgibt.
Tastatur diktieren
Wenn sich die meisten Benutzer die Spracherkennung auf einem iOS-Gerät vorstellen, denken sie an den integrierten Siri-Sprachassistenten, der zusammen mit Tastatur diktierfunktion in iOS 5 mit dem iPhone 4S veröffentlicht wurde.
Die Tastaturdiktation wird von jedem Schnittstellenelement unterstützt, das TextKit (z UITextField
. B. oder UITextArea
) unterstützt und vom Benutzer aktiviert wird, der auf die Diktierschaltfläche (direkt links neben der Leertaste) in der virtuellen iOS-Tastatur klickt.
Apple hat die folgenden Tastaturdictation-Statistiken veröffentlicht (seit 2011 gesammelt):
- Das Diktieren der Tastatur ist seit der Veröffentlichung in iOS 5 weit verbreitet.
- Ungefähr 65.000 Apps verwenden sie pro Tag.
- Ungefähr ein Drittel aller iOS-Diktiervorgänge erfolgt in einer Drittanbieter-App.
Das Diktieren von Tastaturen ist äußerst einfach zu verwenden, da es keinen Aufwand erfordert, außer das Verwenden eines TextKit-Schnittstellenelements im Ui-Design der App. Die Tastaturdiktatur hat auch den Vorteil, dass keine speziellen Berechtigungsanforderungen der App erforderlich sind, bevor sie verwendet werden können.
Apps, die die neuen Spracherkennungs-APIs verwenden, erfordern spezielle Berechtigungen, die dem Benutzer erteilt werden müssen, da die Spracherkennung die Übertragung und temporäre Speicherung von Daten auf Apple-Servern erfordert. Ausführliche Informationen finden Sie in unserer Dokumentation zu Sicherheits- und Datenschutzverbesserungen .
Das Diktieren von Tastaturen ist zwar einfach zu implementieren, hat jedoch mehrere Einschränkungen und Nachteile:
- Sie erfordert die Verwendung eines Texteingabefelds und der Anzeige einer Tastatur.
- Es funktioniert nur mit Live-Audioeingaben, und die App hat keine Kontrolle über den Audioaufzeichnungsprozess.
- Sie bietet keine Kontrolle über die Sprache, die zum Interpretieren der Sprache des Benutzers verwendet wird.
- Es gibt keine Möglichkeit für die App zu wissen, ob die Diktierschaltfläche sogar für den Benutzer verfügbar ist.
- Die App kann den Audioaufzeichnungsprozess nicht anpassen.
- Es bietet einen sehr flachen Satz von Ergebnissen, die keine Informationen wie Timing und Konfidenz enthalten.
Spracherkennungs-API
Neu bei iOS 10 hat Apple die Spracherkennungs-API veröffentlicht, die eine leistungsfähigere Möglichkeit für eine iOS-App zum Implementieren der Spracherkennung bietet. Diese API ist die gleiche, die Apple verwendet, um Siri und Tastatur-Diktierfunktion zu nutzen, und es ist in der Lage, schnelle Transkription mit modernster Genauigkeit bereitzustellen.
Die von der Spracherkennungs-API bereitgestellten Ergebnisse werden transparent an die einzelnen Benutzer angepasst, ohne dass die App private Benutzerdaten sammeln oder darauf zugreifen muss.
Die Spracherkennungs-API bietet Ergebnisse zurück zur aufrufenden App in nahezu Echtzeit, während der Benutzer spricht, und es bietet mehr Informationen über die Ergebnisse der Übersetzung als nur Text. Dazu gehören:
- Mehrere Interpretationen, die der Benutzer sagte.
- Konfidenzniveaus für die einzelnen Übersetzungen.
- Anzeigedauerinformationen.
Wie oben erwähnt, kann Audio für übersetzung entweder von einem Livefeed oder von einer vorab aufgezeichneten Quelle und in einer der über 50 Sprachen und Dialekte bereitgestellt werden, die von iOS 10 unterstützt werden.
Die Spracherkennungs-API kann auf jedem iOS-Gerät mit iOS 10 verwendet werden und erfordert in den meisten Fällen eine Live-Internetverbindung, da der Großteil der Übersetzungen auf Apple-Servern stattfindet. Das heißt, einige neuere iOS-Geräte unterstützen immer eingeschaltete Übersetzungen bestimmter Sprachen.
Apple hat eine Verfügbarkeits-API hinzugefügt, um festzustellen, ob eine bestimmte Sprache zur Übersetzung zurzeit verfügbar ist. Die App sollte diese API anstelle von Tests für die Internetverbindung direkt verwenden.
Wie oben im Abschnitt "Tastatur diktieren" erwähnt, erfordert die Spracherkennung die Übertragung und temporäre Speicherung von Daten auf Apple-Servern über das Internet. Die App muss daher die Berechtigung des Benutzers anfordern, die Erkennung durchzuführen, indem er den Schlüssel in Info.plist
die NSSpeechRecognitionUsageDescription
Datei einbezieht und die SFSpeechRecognizer.RequestAuthorization
Methode aufruft.
Basierend auf der Quelle des Audiosignals Info.plist
, das für die Spracherkennung verwendet wird, sind möglicherweise andere Änderungen an der Datei der App erforderlich. Ausführliche Informationen finden Sie in unserer Dokumentation zu Sicherheits- und Datenschutzverbesserungen .
Übernehmen der Spracherkennung in einer App
Es gibt vier wichtige Schritte, die der Entwickler ausführen muss, um die Spracherkennung in einer iOS-App zu übernehmen:
- Geben Sie mithilfe des
NSSpeechRecognitionUsageDescription
Schlüssels eine VerwendungsbeschreibungInfo.plist
in der Datei der App an. Beispielsweise kann eine Kamera-App die folgende Beschreibung enthalten: "Auf diese Weise können Sie ein Foto aufnehmen, indem Sie nur das Wort "Käse" sagen. - Fordern Sie die Autorisierung an, indem Sie die
SFSpeechRecognizer.RequestAuthorization
Methode aufrufen, um eine Erläuterung (imNSSpeechRecognitionUsageDescription
schlüssel oben angegebenen Schlüssel) zu präsentieren, warum die App spracherkennungszugriff auf den Benutzer in einem Dialogfeld möchte, und erlauben Sie es ihnen, sie anzunehmen oder abzulehnen. - Erstellen einer Spracherkennungsanforderung:
- Verwenden Sie für vorab aufgezeichnete Audiodaten auf dem Datenträger die
SFSpeechURLRecognitionRequest
Klasse. - Verwenden Sie für Liveaudio (oder Audio aus dem Arbeitsspeicher) die
SFSPeechAudioBufferRecognitionRequest
Klasse.
- Verwenden Sie für vorab aufgezeichnete Audiodaten auf dem Datenträger die
- Übergeben Sie die Spracherkennungsanforderung an eine Spracherkennung (
SFSpeechRecognizer
), um mit der Erkennung zu beginnen. Die App kann optional das zurückgegebeneSFSpeechRecognitionTask
Element beibehalten, um die Erkennungsergebnisse zu überwachen und nachzuverfolgen.
Diese Schritte werden im Folgenden ausführlich behandelt.
Bereitstellen einer Verwendungsbeschreibung
Gehen Sie wie folgt vor, um den erforderlichen NSSpeechRecognitionUsageDescription
Schlüssel in der Info.plist
Datei bereitzustellen:
Doppelklicken Sie auf die
Info.plist
Datei, um sie zur Bearbeitung zu öffnen.Wechseln Sie zur Ansicht Quelle:
Klicken Sie auf "Neuen Eintrag hinzufügen",
String
geben SieNSSpeechRecognitionUsageDescription
für die Eigenschaft den Typ und eine Verwendungsbeschreibung als Wert ein. Zum Beispiel:Wenn die App die Live-Audiotranskription verarbeitet, ist auch eine Mikrofonnutzungsbeschreibung erforderlich. Klicken Sie auf "Neuen Eintrag hinzufügen",
String
geben SieNSMicrophoneUsageDescription
für die Eigenschaft den Typ und eine Verwendungsbeschreibung als Wert ein. Zum Beispiel:Speichern Sie die Änderungen in der Datei.
Wichtig
Wenn Keine der oben genannten Info.plist
Tasten (NSSpeechRecognitionUsageDescription
oder NSMicrophoneUsageDescription
) bereitgestellt werden kann, kann die App ohne Warnung fehlschlagen, wenn Sie versuchen, entweder auf die Spracherkennung oder das Mikrofon für Liveaudio zuzugreifen.
Anfordern einer Autorisierung
Um die erforderliche Benutzerautorisierung anzufordern, mit der die App auf die Spracherkennung zugreifen kann, bearbeiten Sie die Hauptklasse "View Controller", und fügen Sie den folgenden Code hinzu:
using System;
using UIKit;
using Speech;
namespace MonkeyTalk
{
public partial class ViewController : UIViewController
{
protected ViewController (IntPtr handle) : base (handle)
{
// Note: this .ctor should not contain any initialization logic.
}
public override void ViewDidLoad ()
{
base.ViewDidLoad ();
// Request user authorization
SFSpeechRecognizer.RequestAuthorization ((SFSpeechRecognizerAuthorizationStatus status) => {
// Take action based on status
switch (status) {
case SFSpeechRecognizerAuthorizationStatus.Authorized:
// User has approved speech recognition
...
break;
case SFSpeechRecognizerAuthorizationStatus.Denied:
// User has declined speech recognition
...
break;
case SFSpeechRecognizerAuthorizationStatus.NotDetermined:
// Waiting on approval
...
break;
case SFSpeechRecognizerAuthorizationStatus.Restricted:
// The device is not permitted
...
break;
}
});
}
}
}
Die RequestAuthorization
Methode der SFSpeechRecognizer
Klasse fordert vom Benutzer die Berechtigung für den Zugriff auf die Spracherkennung mithilfe des Grunds an, den der Entwickler im NSSpeechRecognitionUsageDescription
Schlüssel der Info.plist
Datei bereitgestellt hat.
Ein SFSpeechRecognizerAuthorizationStatus
Ergebnis wird an die Rückrufroutine der RequestAuthorization
Methode zurückgegeben, die verwendet werden kann, um Aktionen basierend auf der Berechtigung des Benutzers auszuführen.
Wichtig
Apple schlägt vor, zu warten, bis der Benutzer eine Aktion in der App gestartet hat, die spracherkennung erfordert, bevor diese Berechtigung angefordert wird.
Erkennen vor aufgezeichneter Spracherkennung
Wenn die App die Sprache aus einer vorab aufgezeichneten WAV- oder MP3-Datei erkennen möchte, kann sie den folgenden Code verwenden:
using System;
using UIKit;
using Speech;
using Foundation;
...
public void RecognizeFile (NSUrl url)
{
// Access new recognizer
var recognizer = new SFSpeechRecognizer ();
// Is the default language supported?
if (recognizer == null) {
// No, return to caller
return;
}
// Is recognition available?
if (!recognizer.Available) {
// No, return to caller
return;
}
// Create recognition task and start recognition
var request = new SFSpeechUrlRecognitionRequest (url);
recognizer.GetRecognitionTask (request, (SFSpeechRecognitionResult result, NSError err) => {
// Was there an error?
if (err != null) {
// Handle error
...
} else {
// Is this the final translation?
if (result.Final) {
Console.WriteLine ("You said, \"{0}\".", result.BestTranscription.FormattedString);
}
}
});
}
In diesem Code wird zunächst ausführlich versucht, eine Spracherkennung (SFSpeechRecognizer
) zu erstellen. Wenn die Standardsprache für die Spracherkennung nicht unterstützt wird, null
wird die Spracherkennung zurückgegeben, und die Funktionen werden beendet.
Wenn die Spracherkennung für die Standardsprache verfügbar ist, überprüft die App, ob sie derzeit für die Erkennung mithilfe der Available
Eigenschaft verfügbar ist. Die Erkennung ist z. B. nicht verfügbar, wenn das Gerät keine aktive Internetverbindung hat.
A SFSpeechUrlRecognitionRequest
wird vom NSUrl
Speicherort der vorab aufgezeichneten Datei auf dem iOS-Gerät erstellt und an die Spracherkennung übergeben, um sie mit einer Rückrufroutine zu verarbeiten.
Wenn der Rückruf aufgerufen wird, ist kein null
Fehler aufgetreten, der NSError
behandelt werden muss. Da die Spracherkennung inkrementell durchgeführt wird, wird die Rückrufroutine möglicherweise mehrmals aufgerufen, sodass die SFSpeechRecognitionResult.Final
Eigenschaft getestet wird, um festzustellen, ob die Übersetzung abgeschlossen ist und die beste Version der Übersetzung geschrieben wird (BestTranscription
).
Erkennen von Live-Spracherkennung
Wenn die App Live-Spracherkennung erkennen möchte, ähnelt der Prozess der Erkennung vorab aufgezeichneter Spracherkennung. Zum Beispiel:
using System;
using UIKit;
using Speech;
using Foundation;
using AVFoundation;
...
#region Private Variables
private AVAudioEngine AudioEngine = new AVAudioEngine ();
private SFSpeechRecognizer SpeechRecognizer = new SFSpeechRecognizer ();
private SFSpeechAudioBufferRecognitionRequest LiveSpeechRequest = new SFSpeechAudioBufferRecognitionRequest ();
private SFSpeechRecognitionTask RecognitionTask;
#endregion
...
public void StartRecording ()
{
// Setup audio session
var node = AudioEngine.InputNode;
var recordingFormat = node.GetBusOutputFormat (0);
node.InstallTapOnBus (0, 1024, recordingFormat, (AVAudioPcmBuffer buffer, AVAudioTime when) => {
// Append buffer to recognition request
LiveSpeechRequest.Append (buffer);
});
// Start recording
AudioEngine.Prepare ();
NSError error;
AudioEngine.StartAndReturnError (out error);
// Did recording start?
if (error != null) {
// Handle error and return
...
return;
}
// Start recognition
RecognitionTask = SpeechRecognizer.GetRecognitionTask (LiveSpeechRequest, (SFSpeechRecognitionResult result, NSError err) => {
// Was there an error?
if (err != null) {
// Handle error
...
} else {
// Is this the final translation?
if (result.Final) {
Console.WriteLine ("You said \"{0}\".", result.BestTranscription.FormattedString);
}
}
});
}
public void StopRecording ()
{
AudioEngine.Stop ();
LiveSpeechRequest.EndAudio ();
}
public void CancelRecording ()
{
AudioEngine.Stop ();
RecognitionTask.Cancel ();
}
In diesem Code werden im Detail mehrere private Variablen erstellt, um den Erkennungsprozess zu verarbeiten:
private AVAudioEngine AudioEngine = new AVAudioEngine ();
private SFSpeechRecognizer SpeechRecognizer = new SFSpeechRecognizer ();
private SFSpeechAudioBufferRecognitionRequest LiveSpeechRequest = new SFSpeechAudioBufferRecognitionRequest ();
private SFSpeechRecognitionTask RecognitionTask;
Es verwendet AV Foundation zum Aufzeichnen von Audio, das an eine SFSpeechAudioBufferRecognitionRequest
übergeben wird, um die Erkennungsanforderung zu verarbeiten:
var node = AudioEngine.InputNode;
var recordingFormat = node.GetBusOutputFormat (0);
node.InstallTapOnBus (0, 1024, recordingFormat, (AVAudioPcmBuffer buffer, AVAudioTime when) => {
// Append buffer to recognition request
LiveSpeechRequest.Append (buffer);
});
Die App versucht, die Aufzeichnung zu starten, und alle Fehler werden behandelt, wenn die Aufzeichnung nicht gestartet werden kann:
AudioEngine.Prepare ();
NSError error;
AudioEngine.StartAndReturnError (out error);
// Did recording start?
if (error != null) {
// Handle error and return
...
return;
}
Die Erkennungsaufgabe wird gestartet, und ein Handle wird an der ErkennungsaufgabeSFSpeechRecognitionTask
():
RecognitionTask = SpeechRecognizer.GetRecognitionTask (LiveSpeechRequest, (SFSpeechRecognitionResult result, NSError err) => {
...
});
Der Rückruf wird auf ähnliche Weise verwendet wie bei der oben bei der vorab aufgezeichneten Spracherkennung verwendeten.
Wenn die Aufzeichnung vom Benutzer beendet wird, werden sowohl das Audiomodul als auch die Spracherkennungsanforderung informiert:
AudioEngine.Stop ();
LiveSpeechRequest.EndAudio ();
Wenn der Benutzer die Erkennung abbricht, werden die Audiomodul- und Erkennungsaufgabe informiert:
AudioEngine.Stop ();
RecognitionTask.Cancel ();
Es ist wichtig, aufzurufen RecognitionTask.Cancel
, wenn der Benutzer die Übersetzung abbricht, um Arbeitsspeicher und Prozessor des Geräts freizugeben.
Wichtig
Wenn die NSSpeechRecognitionUsageDescription
App nicht bereitgestellt wird, NSMicrophoneUsageDescription
Info.plist
kann dies dazu führen, dass die App ohne Warnung fehlschlägt, wenn Sie versuchen, entweder auf die Spracherkennung oder das Mikrofon für Liveaudio zuzugreifen (var node = AudioEngine.InputNode;
). Weitere Informationen finden Sie im Abschnitt "Bereitstellen einer Nutzungsbeschreibung " weiter oben.
Grenzwerte für die Spracherkennung
Apple erzwingt die folgenden Einschränkungen beim Arbeiten mit der Spracherkennung in einer iOS-App:
- Die Spracherkennung ist für alle Apps kostenlos, ihre Nutzung ist jedoch nicht unbegrenzt:
- Einzelne iOS-Geräte verfügen über eine begrenzte Anzahl von Erkennungen, die pro Tag ausgeführt werden können.
- Apps werden global auf Anforderungs-pro-Tag-Basis gedrosselt.
- Die App muss bereit sein, Netzwerkverbindungs- und Nutzungsratesbeschränkungsfehler bei der Spracherkennung zu behandeln.
- Die Spracherkennung kann sowohl beim Akkuabfluss als auch beim hohen Netzwerkdatenverkehr auf dem iOS-Gerät des Benutzers eine hohe Kosten haben, da Apple ein striktes Audiodauerlimit von ca. einer Minute von max.
Wenn eine App routinemäßig auf die Grenzwerte für die Rateneinschränkung trifft, fragt Apple, dass der Entwickler sie kontaktiert.
Überlegungen zu Datenschutz und Benutzerfreundlichkeit
Apple hat den folgenden Vorschlag, transparent zu sein und den Datenschutz des Benutzers zu respektieren, wenn die Spracherkennung in eine iOS-App eingeschlossen wird:
- Achten Sie beim Aufzeichnen der Spracherkennung des Benutzers darauf, dass die Aufzeichnung auf der Benutzeroberfläche der App stattfindet. Beispielsweise kann die App einen "Aufzeichnungssound" wiedergeben und eine Aufzeichnungsanzeige anzeigen.
- Verwenden Sie die Spracherkennung nicht für vertrauliche Benutzerinformationen wie Kennwörter, Integritätsdaten oder Finanzinformationen.
- Zeigen Sie die Erkennungsergebnisse an, bevor Sie darauf wirken. Dies gibt nicht nur Feedback darüber, was die App tut, sondern ermöglicht es dem Benutzer, Erkennungsfehler bei der Ausführung zu behandeln.
Zusammenfassung
In diesem Artikel wurde die neue Sprach-API vorgestellt und gezeigt, wie sie in einer Xamarin.iOS-App implementiert wird, um kontinuierliche Spracherkennung und Transkription von Spracherkennung (von Live- oder aufgezeichneten Audiostreams) in Text zu unterstützen.