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
  • Fast
  • 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.

Funktionsweise der Spracherkennung

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 i Telefon 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 Verwendungsbeschreibung Info.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 (im NSSpeechRecognitionUsageDescription 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.
  • Übergeben Sie die Spracherkennungsanforderung an eine Spracherkennung (SFSpeechRecognizer), um mit der Erkennung zu beginnen. Die App kann optional das zurückgegebene SFSpeechRecognitionTask 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:

  1. Doppelklicken Sie auf die Info.plist Datei, um sie zur Bearbeitung zu öffnen.

  2. Wechseln Sie zur Ansicht Quelle:

    Die Quellansicht

  3. Klicken Sie auf "Neuen Eintrag hinzufügen", String geben Sie NSSpeechRecognitionUsageDescription für die Eigenschaft den Typ und eine Verwendungsbeschreibung als Wert ein. Zum Beispiel:

    Hinzufügen von NSSpeechRecognitionUsageDescription

  4. Wenn die App die Live-Audiotranskription verarbeitet, ist auch eine Mikrofonnutzungsbeschreibung erforderlich. Klicken Sie auf "Neuen Eintrag hinzufügen", String geben Sie NSMicrophoneUsageDescription für die Eigenschaft den Typ und eine Verwendungsbeschreibung als Wert ein. Zum Beispiel:

    Hinzufügen von NSMicrophoneUsageDescription

  5. 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 Standard View Controller-Klasse, 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, NSMicrophoneUsageDescriptionInfo.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.