Rozpoznawanie mowy na platformie Xamarin.iOS

W tym artykule przedstawiono nowy interfejs API rozpoznawania mowy i pokazano, jak zaimplementować go w aplikacji platformy Xamarin.iOS w celu obsługi ciągłego rozpoznawania mowy i transkrypcji mowy (ze strumieni audio na żywo lub nagranych) do tekstu.

Nowość dla systemu iOS 10, firma Apple wydała interfejs API rozpoznawania mowy, który umożliwia aplikacji systemu iOS obsługę ciągłego rozpoznawania mowy i transkrypcji mowy (ze strumieni audio na żywo lub nagranych) do tekstu.

Zgodnie z firmą Apple interfejs API rozpoznawania mowy ma następujące funkcje i korzyści:

  • Bardzo dokładne
  • Stan sztuki
  • Łatwość użycia
  • Szybkie przetwarzanie
  • Obsługuje wiele języków
  • Szanuje prywatność użytkowników

Jak działa rozpoznawanie mowy

Rozpoznawanie mowy jest implementowane w aplikacji systemu iOS przez uzyskanie dźwięku na żywo lub wstępnie zarejestrowanego (w dowolnym z języków mówionych obsługiwanych przez interfejs API) i przekazanie go do rozpoznawania mowy, który zwraca transkrypcję wyrazów mówionych w postaci zwykłego tekstu.

How Speech Recognition Works

Dyktowanie klawiatury

Kiedy większość użytkowników myśli o rozpoznawaniu mowy na urządzeniu z systemem iOS, myślą o wbudowanym asystentze głosowym Siri, który został wydany wraz z dyktacją klawiatury w systemie iOS 5 z systemem i Telefon 4S.

Funkcja Dyktowania klawiatury jest obsługiwana przez dowolny element interfejsu, który obsługuje bibliotekę TextKit (np UITextField . lub UITextArea) i jest aktywowany przez użytkownika klikając przycisk Dyktowania (bezpośrednio po lewej stronie paska spacji) na klawiaturze wirtualnej systemu iOS.

Firma Apple opublikowała następujące statystyki Dyktowania klawiatury (zebrane od 2011 r.):

  • Funkcja Dyktowania klawiatury jest powszechnie używana od czasu wydania w systemie iOS 5.
  • Dziennie jest używanych około 65 000 aplikacji.
  • Około jednej trzeciej wszystkich funkcji Dyktowania systemu iOS odbywa się w aplikacji innej firmy.

Funkcja Dyktowania klawiatury jest niezwykle łatwa w użyciu, ponieważ nie wymaga wysiłku ze strony dewelopera, poza używaniem elementu interfejsu TextKit w projekcie interfejsu użytkownika aplikacji. Funkcja Dyktowania za pomocą klawiatury ma również zaletę braku konieczności stosowania żadnych specjalnych żądań uprawnień z aplikacji.

Aplikacje korzystające z nowych interfejsów API rozpoznawania mowy będą wymagać od użytkownika specjalnych uprawnień, ponieważ rozpoznawanie mowy wymaga transmisji i tymczasowego przechowywania danych na serwerach firmy Apple. Aby uzyskać szczegółowe informacje, zobacz dokumentację Dotyczącą ulepszeń zabezpieczeń i prywatności.

Chociaż Dyktowanie klawiatury jest łatwe do zaimplementowania, ma kilka ograniczeń i wad:

  • Wymaga użycia pola wprowadzania tekstu i wyświetlania klawiatury.
  • Działa tylko z danymi wejściowymi audio na żywo, a aplikacja nie ma kontroli nad procesem nagrywania dźwięku.
  • Nie zapewnia kontroli nad językiem używanym do interpretowania mowy użytkownika.
  • Nie ma możliwości, aby aplikacja wiedziała, czy przycisk Dyktowanie jest nawet dostępny dla użytkownika.
  • Aplikacja nie może dostosować procesu nagrywania dźwięku.
  • Zapewnia bardzo płytki zestaw wyników, które nie zawierają informacji, takich jak czas i pewność siebie.

Interfejs API rozpoznawania mowy

Nowy dla systemu iOS 10 firma Apple wydała interfejs API rozpoznawania mowy, który zapewnia bardziej zaawansowany sposób implementacji rozpoznawania mowy przez aplikację dla systemu iOS. Ten interfejs API jest taki sam, który firma Apple używa do zasilania Zarówno Siri, jak i Klawiatury Dyktowanie i jest w stanie zapewnić szybką transkrypcję ze stanem dokładności sztuki.

Wyniki udostępniane przez interfejs API rozpoznawania mowy są w sposób niewidoczny dla poszczególnych użytkowników, bez konieczności zbierania i uzyskiwania dostępu do danych użytkowników prywatnych przez aplikację.

Interfejs API rozpoznawania mowy udostępnia wyniki z powrotem do aplikacji wywołującej niemal w czasie rzeczywistym, gdy użytkownik mówi i udostępnia więcej informacji na temat wyników tłumaczenia niż tylko tekstu. Są to:

  • Wiele interpretacji tego, co powiedział użytkownik.
  • Poziomy ufności poszczególnych tłumaczeń.
  • Informacje o chronometrażu.

Jak wspomniano powyżej, dźwięk do tłumaczenia może być dostarczany przez kanał informacyjny na żywo lub ze wstępnie zarejestrowanego źródła i w dowolnym z ponad 50 języków i dialektów obsługiwanych przez system iOS 10.

Interfejs API rozpoznawania mowy może być używany na dowolnym urządzeniu z systemem iOS 10 i w większości przypadków wymaga połączenia z Internetem na żywo, ponieważ większość tłumaczeń odbywa się na serwerach firmy Apple. Oznacza to, że niektóre nowsze urządzenia z systemem iOS obsługują zawsze włączone tłumaczenie określonych języków na urządzeniu.

Firma Apple włączyła interfejs API dostępności, aby określić, czy dany język jest dostępny do tłumaczenia w tej chwili. Aplikacja powinna używać tego interfejsu API zamiast testowania łączności z Internetem bezpośrednio.

Jak wspomniano powyżej w sekcji Dyktowanie klawiatury, rozpoznawanie mowy wymaga transmisji i tymczasowego przechowywania danych na serwerach firmy Apple przez Internet, a w związku z tym aplikacja musi zażądać uprawnień użytkownika do przeprowadzenia rozpoznawania, uwzględniając NSSpeechRecognitionUsageDescription klucz w pliku Info.plist i wywołując metodę SFSpeechRecognizer.RequestAuthorization .

Na podstawie źródła dźwięku używanego do rozpoznawania mowy mogą być wymagane inne zmiany w pliku aplikacji Info.plist . Aby uzyskać szczegółowe informacje, zobacz dokumentację Dotyczącą ulepszeń zabezpieczeń i prywatności.

Wdrażanie rozpoznawania mowy w aplikacji

Istnieją cztery główne kroki, które deweloper musi wykonać, aby wdrożyć rozpoznawanie mowy w aplikacji systemu iOS:

  • Podaj opis użycia w pliku aplikacji Info.plist przy użyciu NSSpeechRecognitionUsageDescription klucza. Na przykład aplikacja aparatu może zawierać następujący opis: "Pozwala to zrobić zdjęcie tylko przez powiedzenie słowa "cheese".
  • Zażądaj autoryzacji przez wywołanie SFSpeechRecognizer.RequestAuthorization metody w celu przedstawienia wyjaśnienia (podanego NSSpeechRecognitionUsageDescription w powyższym kluczu) o tym, dlaczego aplikacja chce uzyskać dostęp do rozpoznawania mowy użytkownikowi w oknie dialogowym i zezwolić im na akceptowanie lub odrzucanie.
  • Utwórz żądanie rozpoznawania mowy:
    • W przypadku wstępnie nagranego dźwięku SFSpeechURLRecognitionRequest na dysku użyj klasy .
    • W przypadku dźwięku na żywo (lub dźwięku SFSPeechAudioBufferRecognitionRequest z pamięci) użyj klasy .
  • Przekaż żądanie rozpoznawania mowy do aparatu rozpoznawania mowy (SFSpeechRecognizer), aby rozpocząć rozpoznawanie. Aplikacja może opcjonalnie trzymać się zwróconego elementu SFSpeechRecognitionTask w celu monitorowania i śledzenia wyników rozpoznawania.

Te kroki zostaną szczegółowo omówione poniżej.

Podawanie opisu użycia

Aby podać wymagany NSSpeechRecognitionUsageDescription klucz w Info.plist pliku, wykonaj następujące czynności:

  1. Kliknij dwukrotnie plik, Info.plist aby otworzyć go do edycji.

  2. Przejdź do widoku Źródła :

    The Source view

  3. Kliknij pozycję Dodaj nowy wpis, wprowadź NSSpeechRecognitionUsageDescription dla właściwości typ Stringi opis użycia jako wartość. Na przykład:

    Adding NSSpeechRecognitionUsageDescription

  4. Jeśli aplikacja będzie obsługiwać transkrypcję audio na żywo, będzie również wymagać opisu użycia mikrofonu. Kliknij pozycję Dodaj nowy wpis, wprowadź NSMicrophoneUsageDescription dla właściwości typ Stringi opis użycia jako wartość. Na przykład:

    Adding NSMicrophoneUsageDescription

  5. Zapisz zmiany w pliku.

Ważne

Nie można podać jednego z powyższych Info.plist kluczy (NSSpeechRecognitionUsageDescription lub NSMicrophoneUsageDescription) może spowodować niepowodzenie aplikacji bez ostrzeżenia podczas próby uzyskania dostępu do funkcji rozpoznawania mowy lub mikrofonu dla dźwięku na żywo.

Żądanie autoryzacji

Aby zażądać wymaganej autoryzacji użytkownika, która umożliwia aplikacji dostęp do rozpoznawania mowy, zmodyfikuj główną klasę Kontrolera widoku i dodaj następujący kod:

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;
                }
            });
        }
    }
}

Metoda RequestAuthorizationSFSpeechRecognizer klasy zażąda uprawnień od użytkownika w celu uzyskania dostępu do rozpoznawania mowy przy użyciu przyczyny, dla którego deweloper podał klucz NSSpeechRecognitionUsageDescriptionInfo.plist pliku.

SFSpeechRecognizerAuthorizationStatus Wynik jest zwracany do RequestAuthorization procedury wywołania zwrotnego metody, która może służyć do wykonywania akcji na podstawie uprawnień użytkownika.

Ważne

Firma Apple sugeruje oczekiwanie na uruchomienie akcji w aplikacji, która wymaga rozpoznawania mowy przed zażądaniem tego uprawnienia.

Rozpoznawanie wstępnie zarejestrowanej mowy

Jeśli aplikacja chce rozpoznawać mowę ze wstępnie zarejestrowanego pliku WAV lub MP3, może użyć następującego kodu:

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);
            }
        }
    });
}

Patrząc na ten kod szczegółowo, najpierw próbuje utworzyć rozpoznawanie mowy (SFSpeechRecognizer). Jeśli język domyślny nie jest obsługiwany w przypadku rozpoznawania mowy, jest zwracany, null a funkcje zakończą działanie.

Jeśli rozpoznawanie mowy jest dostępne dla języka domyślnego, aplikacja sprawdza, czy jest ona obecnie dostępna do rozpoznawania Available przy użyciu właściwości . Na przykład rozpoznawanie może być niedostępne, jeśli urządzenie nie ma aktywnego połączenia internetowego.

Element jest SFSpeechUrlRecognitionRequest tworzony na podstawie NSUrl lokalizacji wstępnie zarejestrowanego pliku na urządzeniu z systemem iOS i jest przekazywany do rozpoznawania mowy w celu przetworzenia procedury wywołania zwrotnego.

Po wywołaniu wywołania zwrotnego, jeśli NSError nie null wystąpił błąd, który musi zostać obsłużony. Ponieważ rozpoznawanie mowy jest wykonywane przyrostowo, procedury wywołania zwrotnego mogą być wywoływane więcej niż raz, aby SFSpeechRecognitionResult.Final właściwość została przetestowana, aby sprawdzić, czy tłumaczenie zostało ukończone, a najlepsza wersja tłumaczenia jest zapisywana (BestTranscription).

Rozpoznawanie mowy na żywo

Jeśli aplikacja chce rozpoznać mowę na żywo, proces jest bardzo podobny do rozpoznawania wstępnie nagranej mowy. Na przykład:

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 ();
}

Patrząc na ten kod szczegółowo, tworzy kilka zmiennych prywatnych do obsługi procesu rozpoznawania:

private AVAudioEngine AudioEngine = new AVAudioEngine ();
private SFSpeechRecognizer SpeechRecognizer = new SFSpeechRecognizer ();
private SFSpeechAudioBufferRecognitionRequest LiveSpeechRequest = new SFSpeechAudioBufferRecognitionRequest ();
private SFSpeechRecognitionTask RecognitionTask;

Używa ona programu AV Foundation do rejestrowania dźwięku, który zostanie przekazany do elementu w SFSpeechAudioBufferRecognitionRequest celu obsługi żądania rozpoznawania:

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);
});

Aplikacja próbuje rozpocząć nagrywanie i wszelkie błędy są obsługiwane, jeśli nie można uruchomić nagrania:

AudioEngine.Prepare ();
NSError error;
AudioEngine.StartAndReturnError (out error);

// Did recording start?
if (error != null) {
    // Handle error and return
    ...
    return;
}

Zadanie rozpoznawania jest uruchamiane, a uchwyt jest przechowywany w zadaniu rozpoznawania (SFSpeechRecognitionTask):

RecognitionTask = SpeechRecognizer.GetRecognitionTask (LiveSpeechRequest, (SFSpeechRecognitionResult result, NSError err) => {
    ...
});

Wywołanie zwrotne jest używane w podobny sposób do powyższego użytego podczas wstępnie nagranej mowy.

Jeśli nagranie zostanie zatrzymane przez użytkownika, zarówno aparat audio, jak i żądanie rozpoznawania mowy są informowane:

AudioEngine.Stop ();
LiveSpeechRequest.EndAudio ();

Jeśli użytkownik anuluje rozpoznawanie, zostanie poinformowane zadanie aparatu audio i rozpoznawania:

AudioEngine.Stop ();
RecognitionTask.Cancel ();

Ważne jest, aby wywołać RecognitionTask.Cancel metodę , jeśli użytkownik anuluje tłumaczenie, aby zwolnić zarówno pamięć, jak i procesor urządzenia.

Ważne

Nie można podać NSSpeechRecognitionUsageDescription kluczy lub NSMicrophoneUsageDescriptionInfo.plist może spowodować niepowodzenie aplikacji bez ostrzeżenia podczas próby uzyskania dostępu do funkcji rozpoznawania mowy lub mikrofonu dla dźwięku na żywo (var node = AudioEngine.InputNode;). Aby uzyskać więcej informacji, zobacz sekcję Dostarczanie opisu użycia powyżej.

Limity rozpoznawania mowy

Firma Apple nakłada następujące ograniczenia podczas pracy z rozpoznawaniem mowy w aplikacji systemu iOS:

  • Rozpoznawanie mowy jest bezpłatne dla wszystkich aplikacji, ale jej użycie nie jest nieograniczone:
    • Poszczególne urządzenia z systemem iOS mają ograniczoną liczbę rozpoznawania, które można wykonywać dziennie.
    • Aplikacje będą ograniczane globalnie na podstawie żądania na dzień.
  • Aplikacja musi być przygotowana do obsługi połączeń sieciowych rozpoznawania mowy i błędów limitu szybkości użycia.
  • Funkcja rozpoznawania mowy może mieć wysoki koszt zarówno w przypadku opróżniania baterii, jak i dużego ruchu sieciowego na urządzeniu z systemem iOS użytkownika, z tego powodu firma Apple nakłada ścisły limit czasu trwania dźwięku w wysokości około jednej minuty.

Jeśli aplikacja rutynowo osiąga limity ograniczania szybkości, firma Apple prosi o skontaktowanie się z nimi.

Zagadnienia dotyczące prywatności i użyteczności

Firma Apple ma następującą sugestię dotyczącą zachowania przejrzystości i poszanowania prywatności użytkownika podczas dołączania funkcji rozpoznawania mowy w aplikacji systemu iOS:

  • Podczas rejestrowania mowy użytkownika pamiętaj, aby wyraźnie wskazać, że nagrywanie odbywa się w interfejsie użytkownika aplikacji. Na przykład aplikacja może odtwarzać dźwięk "nagrywania" i wyświetlać wskaźnik nagrywania.
  • Nie używaj funkcji rozpoznawania mowy do poufnych informacji o użytkowniku, takich jak hasła, dane dotyczące kondycji ani informacje finansowe.
  • Pokaż wyniki rozpoznawania przed wykonaniem na nich działania. Zapewnia to nie tylko opinie dotyczące tego, co robi aplikacja, ale umożliwia użytkownikowi obsługę błędów rozpoznawania podczas ich wykonywania.

Podsumowanie

W tym artykule przedstawiono nowy interfejs API rozpoznawania mowy i pokazano, jak zaimplementować go w aplikacji platformy Xamarin.iOS w celu obsługi ciągłego rozpoznawania mowy i transkrypcji mowy (ze strumieni audio na żywo lub nagranych) do tekstu.